試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

NSFファイル作成に用いるWAVE-DMC変換ツールDMC(DPCM)コンバータをWineの開発パッケージでビルドしてインストールするスクリプト

GNU/Linux上におけるppmckについてのその後(2010/2/2現在)」のppmckを用いたNSFファイル作成においてサンプリングされた音を鳴らすのには「E」チャンネル(デルタPCM用)を用いるが、音声データファイルは
www.geocities.co.jp/Playtown-Denei/9628/
にリンクがあるDMC(DPCM)コンバータ(DMCconv.exe)というWindows向けツールを用いてWAVE形式ファイルからDMC形式に変換する必要がある。
これはWineで動作するが、ソースが公開されているため、Wineの開発パッケージを用いてGNU/Linux向けにビルドすることはできる。残念ながら、WindowsAPI/ライブラリに依存しているため、そのままではWineのライブラリに依存しない完全GNU/Linuxネイティブなプログラムとしてビルドして使うことはできない。
下はソースをダウンロード後それを修正し、ビルドを行って専用のWine環境(既定では[ホームディレクトリ]/.wine-dmcconv/)以下にインストールする作業を自動化するスクリプト
動作にはWineの開発パッケージが必要なのはもちろん、wgetもしくはcurlに加えunzipも必要。
アンインストールするには[ホームディレクトリ]/.wine-dmcconv/以下と[ホームディレクトリ]/bin/dmcconvを削除する。
[任意]ファイル名: wine-dmccomv-install.sh ライセンス: LGPL-2 (or lator)

#! /bin/sh

# download/patch/build/install script for DMCconv 0.05
# version 20100224
# (C) 2010 kakurasan
# Licensed under LGPLv2+

URL=www.geocities.co.jp/Playtown-Denei/9628/mck/dmcconv005.zip

TEMPDIR=$(mktemp --tmpdir -d dmcconv.XXXXXXXX)
if [ ${?} -ne 0 ]; then
  echo "cannot create tempdir"
  exit 1
fi
cd ${TEMPDIR}

export WINEPREFIX="${WINEPREFIX:-${HOME}/.wine-dmcconv}"
APPDIR="${WINEPREFIX}"/dosdevices/c:/"Program Files"/dmcconv
APPDIR_DOS="$(winepath -w "${APPDIR}" | sed 's:\\:\\\\:g')"

# fetch
if ! wget ${URL}; then
  if ! curl ${URL}; then
    exit 1
  fi
fi
echo "593320cdd4fde8a61dbe75edd9f9774d  dmcconv005.zip" | md5sum -c || exit 1

# extract
unzip $(basename ${URL}) || exit 1

# build fix
cat <<EOF | base64 -d | zcat | patch -p1
H4sIAPPff0sCA7VUzW7aQBA+L1LeYUouEGNjCJQotBHhL0Ei0BJoVaVV5PgHViW2u9ikP8khcKhy
i9Sfh6jUY3trz730DfoQfYTurrExEEhVqVLiYb+Z8Xzf7Hg0bBggugS0U1W1zKEoS3JWsgjuJssH
JYZIqm3PeMOOtYgoiqtz1yKCIKx4QaEA4lZiCwT2KBTWIrCOTbXvajrcGzgatqTezjzYxyceSusH
jqjzytY13ZB60Rn4VFGJxUFhCrZDsSH4IIidFoyeKUPdwH3dw+lfrdFGVINz0j96BvfhjScilUvk
QOBPLgPJL7NVOQHUyNxkcp7xTptZbtK7nslwkyrKCZp6kfe0DS2soVMFmzFWExTSVRNQ2t9tbbDf
Q1o9Tulj07k1iJGEaq1e2UBnhk1JNzr1ej7ArDDGxGS4mMxUDEI2oYWMGERBPAGAomI+hwF+rYOt
aBo2u7Gybihu39luWD4Uf2pGIZ5fyB/Q/EOWqlqE6KoTpJa88zSPNoGmEt1xiUnPQnAA2XvthXcl
CCWTMK6Nh+NH47fjd1e/r39ORktOpFJ0uLjhUng0pkTu2DWzSu8V4rw7YYqVVqvZ2gaiv3Ax0QGb
tusAnwGf2TJaqSktv0rTdf6ujOU6/1InKEVnkigO/URAhvPz4LhDB0uusilgDUnn+NV6ZnK31Val
EoO+XXQNQyf+jVVL9eYhxdnAzEHWBBJnyYW5rWPDpF8YOi5Xip09ln0BquKovRhIkhQ0Y74XHwYf
v49+jPfGV5dHo0/vP19/HX0Z/aL/3y6Lfk+4jK0sl8HN/5Shmxo2OH32Ya5FtOUbM1gqs+sugJdt
y1DAwq4M+fiSSSdSabpluPHHebL4kGsOcNfUNVB7CkHFJ+1K/ibvoGcRBz1utspM+oK7b5ldVJ64
hWRydcDi64+P6Y3ezcBDP2Ipw84tFDurOXbqzcbeKo5+ACxx366hExLB2r8ps6HjT958P3GSxjYx
3cE3vpL5OnPOGbWH+81WO6w2zHVR6g3ecKdZaxHaqD+Y7zETxB0TZX8A2OKPNwIIAAA=
EOF

# encoding (japanese text)
mv DMCconv.cpp{,.cp932}
iconv -f cp932 -t utf8 DMCconv.cpp.cp932 > DMCconv.cpp

# build
wineg++ ${CXXFLAGS} -m32 wavefile.cpp DMCconv.cpp -o DMCconv.exe.so -lwinmm

# set PATH / create wine prefix
cat <<EOF > path.reg || exit 1
REGEDIT4

[HKEY_CURRENT_USER\Environment]
"PATH"="${APPDIR_DOS}"
EOF
regedit path.reg || exit 1

# install
mkdir -p "${APPDIR}" || exit 1
strip DMCconv.exe.so || exit 1
cp DMCconv.exe.so "${APPDIR}" || exit 1
mkdir -p ~/bin
cat <<EOF > ~/bin/dmcconv
#! /bin/sh
IFS="\\0"
env WINEPREFIX=${WINEPREFIX} wine DMCconv.exe.so \${@}
EOF
chmod +x ~/bin/dmcconv

# cleanup
cd ..
rm ${TEMPDIR} -fr

(2010/2/24)スペースを含むファイル名があるとうまく動作しない問題を修正
これで[ホームディレクトリ]/bin/にPATHが通っていればdmcconvというコマンドとしてこのツールが使えるようになる。

使用したバージョン:

  • Wine 1.1.38
  • GCC 4.4.1
  • DMC(DPCM)コンバータ 0.05