Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(gm.dlsの入手とDirectMusic対応プレーヤによる再生)
「Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(WindowsネイティブDirectXのDLLを使用)」の続き。
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を保存できるスクリプトも作成した(実行にはzenity、unzip、cabextractが必要)。
(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における既定値としてこのサンプリング周波数が用いられていることと関係していそう