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

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

Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(gm.dlsの入手とDirectMusic対応プレーヤによる再生)

Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(WindowsネイティブDirectXのDLLを使用)」の続き。

  1. gm.dlsの入手
  2. DirectMusic対応プレーヤによる再生
  3. サンプリング周波数についての追記

gm.dlsの入手

DirectX 9.0cの再頒布可能パッケージではgm.dlsはインストールされないが、DirectX 8.1の再頒布可能パッケージには含まれている。
google:directx 8.1 redistributable
からダウンロードしたファイルDX81Redist.exe*1を使用する。

$ unzip DX81Redist.exe
$ cd Redist/DirectX81/
$ cabextract DirectX.cab
$ cp gm16.dls ${WINEPREFIX:-~/.wine}/dosdevices/c:/windows/system32/drivers/gm.dls
$ cd ../../
$ rm Redist/ -fr

ZIPとCabinetを展開するだけなので、GUIでは7-Zip File Managerで「開く インサイド」で一度exeファイルからDirectX.cabを展開後、同様にこれを開いてgm16.dlsを取り出すという方法もある。また、上の作業を自動化して、exeファイルをファイル選択ダイアログから開く*2操作だけでgm.dlsを保存できるスクリプトも作成した(実行にはzenityunzipcabextractが必要)。
(2010/7/17)DirectX 8.1や8.1bの再頒布可能パッケージのページはなくなっているが、直接サーバからダウンロードすることはできるようだ。しかし、DirectX 9.0cの再頒布可能パッケージ(directx_9c_Aug05sdk_redist.exe)の中から取り出すことはできるため、バージョン9.0cのものから取り出すようにしたスクリプトまとめドキュメントに貼り付けた。
以下は以前のバージョン8.1向けのファイルから取り出すスクリプトとなる。
[任意]ファイル名: extract-gmdls-from-dx81redist.sh

#! /bin/sh

# DirectX 8.1 再頒布可能パッケージからgm.dlsを取り出して保存

MD5="b74260623ee5023a7d1cbb47e4e881ff"
WORKDIR=/tmp/extract-gmdls
FILE_BEGINTAG="<span size='larger' weight='bold'>"
FILE_ENDTAG="</span>"

# ツールのチェック
if [ ! -x /usr/bin/zenity ]; then
  echo "zenityがインストールされていません"
  exit 1
fi
if [ ! -x /usr/bin/unzip ]; then
  zenity --error --text "unzipがインストールされていません"
  exit 1
fi
if [ ! -x /usr/bin/cabextract ]; then
  zenity --error --text "cabextractがインストールされていません"
  exit 1
fi

# 開くファイルを決定
if [ $# -ge 1 ]; then  # 実行ファイル名の後ろの引数の数が1以上
  # 引数にファイルが指定されたらこれを直接開く
  EXEFILE=$(cd $(dirname $1) && pwd)/$(basename $1)  # 相対パス指定された場合に絶対パスへ
else
  EXEFILE=$(zenity --file-selection --title "DirectX 8.1 再頒布可能パッケージの場所")
  if [ $? -ne 0 ]; then exit 1; fi  # キャンセル
fi

# ファイルチェック
if [ ! -f ${EXEFILE} ]; then
  zenity --error --text "${EXEFILE}は存在しません"
  exit 1
fi
if [ "$(md5sum ${EXEFILE} | cut -d ' ' -f 1)" != "${MD5}" ]; then
  zenity --error --title "ファイルが違います" --text "このファイルは
DirectX 8.1 再頒布可能パッケージではありません"
  exit 1
fi

# 展開とコピー
rm ${WORKDIR} -fr
mkdir ${WORKDIR}; cd ${WORKDIR}
unzip ${EXEFILE}
cd Redist/DirectX81/
cabextract DirectX.cab
OUTFILE=$(zenity --file-selection --title "gm.dlsの保存" --save --confirm-overwrite --filename=${HOME}/gm.dls)
if [ $? -ne 0 ]; then
  zenity --info --title "キャンセル" --text "保存がキャンセルされました。
${FILE_BEGINTAG}${WORKDIR}/Redist/DirectX81/gm16.dls${FILE_ENDTAG}
手動で${FILE_BEGINTAG}gm.dls${FILE_ENDTAG}としてコピー後、
一時ディレクトリ${FILE_BEGINTAG}${WORKDIR}${FILE_ENDTAG}を削除してください。"
  exit 1
fi
cp gm16.dls ${OUTFILE} || zenity --error --text "${OUTFILE}の保存に失敗しました"
if zenity --question --title "Wine環境へのコピー" --text "Wine環境にもコピーしますか?"; then
  cp gm16.dls ${WINEPREFIX:-~/.wine}/dosdevices/c:/windows/system32/drivers/gm.dls || zenity --error --text "Wine環境へのコピーに失敗しました"
fi
rm ${WORKDIR} -fr
zenity --info --title "完了" --text "処理が完了しました"

exit 0

これで音源ファイルが配置され、音が出るようになった。画像はdxdiagでの表示の変化。

gm.dlsなし


DirectMusicのテスト中(デモ曲がMSGSの音で再生される)
(2008/9/22)別のテストを兼ねて音声付きスクリーンキャストを追加

バージョンなどの各種情報

DirectMusic対応プレーヤによる再生

残念ながら、Windows上と違い、gm.dlsの音をMicrosoft GS Wavetable SW Synth」として通常のMIDIバイス(出力ポート)として使用することはできない。しかし、DirectMusic対応プレーヤではMicrosoft Synthesizer経由で鳴らすことができる。
今回はEasy MIDI Music Playerというプレーヤで動作を確認した。*3読み込んだMIDIファイルをMSGSの音で再生できる。

サンプリング周波数についての追記

(2009/6/5)DMRPlayerというプレーヤを使用するとサンプリング周波数が44100Hzに設定できる。他の(サンプリング周波数が変更できない)プレーヤでは22050Hz*4となっている場合が多い。この違いは高い音の鳴り方として表れる。

使用したバージョン:

  • Wine 0.9.58
  • DirectX 9.0c(March 2008 Redistributable)

*1:WineでRPGツクールXP製の作品を動かすのは厳しい?」のときに入手したものと内容は同一

*2:引数によるファイル指定にも対応した

*3:他のDirectMusic対応プレーヤでも同様に再生できる

*4:http://msdn.microsoft.com/ja-jp/library/cc354017.aspx にあるようにDirectMusicにおける既定値としてこのサンプリング周波数が用いられていることと関係していそう