Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(WindowsネイティブDirectXのDLLを使用)
(2014/10/3)この記事の内容は古いので、まとめドキュメントを参照。
WindowsにはMicrosoft GS Wavetable SW Synth*1というソフトウェアシンセサイザーが搭載されていて、標準では、MIDIデータはこの音源データを使用して再生される。
Wineでこれを使用してMIDIデータの再生を行うことに成功したのだが、Wineには音源ファイルはなく、別途入手する必要がある。また、バージョン0.9.58の時点では音源ファイルを配置しても音が鳴らないため、Windowsネイティブ版DirectXのDLLを一部使用する必要がある。
(2009/2/19)この記事では直接設定やインストールの作業を行っているが、winetricksを用いて「directx9」を選択することにより、最新のDirectXを簡単にインストールすることができる(後述するDLLの優先設定も行ってくれる)。インストールするWine環境も環境変数WINEPREFIXをスクリプト実行前に指定することで変更可能。
(2009/6/4)補足として、本記事から始まる一連の記事における作業を行ってもWine上でMIDIデバイスとして「Microsoft GS Wavetable SW Synth」が使用できるわけではなく、これと同じ音源を別の方法でMicrosoft Synthesizer経由で鳴らしているに過ぎない。
(2010/3/19)winetricksについては「winetricksの概要と使い方 (2010/2/19現在)」を参照。
(2014/10/3)その後のwinetricksでは「directx9」ではなく「directmusic」で該当DLLをネイティブ版使用にできるようになっている。
Windowsネイティブ版DirectXをインストール
Microsoft GS Wavetable SW Synthの音を鳴らすだけなら、全てのWindowsネイティブ版DirectXのDLLを使用することはなく、DirectMusic関係のDLL(後述)をコピー後「native」指定することで(音源データがあれば)鳴らせるようになるのだが、一度どこかにWindowsネイティブ版DirectXをインストールすると簡単にコピーでき、DirectXのテストもできるため、ここでは新しいWine環境にインストールすることにする。*2ダウンロードするのはDirectX 9.0cの再頒布可能パッケージ。「redist」と西暦年で検索するとすぐ見つかる(google:directx redist 2008)。
DLLの優先指定
DirectXのインストールや動作の上で、幾つかのDLL優先*3の指定が必要。www.wine-reviews.net/microsoft/directx-90c-march-2008-redistributable-on-linux-with-wine.html
の記事を参考にすると、
[任意]ファイル名: nativedx9.inf
[Version] signature="$CHICAGO$" [DefaultInstall] AddReg=DllOverrides [Strings] DllOverrides="Software\Wine\DllOverrides" [DllOverrides] HKCU,%DllOverrides%,"d3d8",,"builtin" HKCU,%DllOverrides%,"d3d9",,"builtin" HKCU,%DllOverrides%,"d3dim",,"native" HKCU,%DllOverrides%,"d3drm",,"native" HKCU,%DllOverrides%,"d3dx8",,"native" HKCU,%DllOverrides%,"d3dx9_24",,"native" HKCU,%DllOverrides%,"d3dx9_25",,"native" HKCU,%DllOverrides%,"d3dx9_26",,"native" HKCU,%DllOverrides%,"d3dx9_27",,"native" HKCU,%DllOverrides%,"d3dx9_28",,"native" HKCU,%DllOverrides%,"d3dx9_29",,"native" HKCU,%DllOverrides%,"d3dx9_30",,"native" HKCU,%DllOverrides%,"d3dx9_31",,"native" HKCU,%DllOverrides%,"d3dx9_32",,"native" HKCU,%DllOverrides%,"d3dx9_33",,"native" HKCU,%DllOverrides%,"d3dx9_34",,"native" HKCU,%DllOverrides%,"d3dx9_35",,"native" HKCU,%DllOverrides%,"d3dx9_36",,"native" HKCU,%DllOverrides%,"d3dxof",,"native" HKCU,%DllOverrides%,"dciman32",,"native" HKCU,%DllOverrides%,"ddrawex",,"native" HKCU,%DllOverrides%,"devenum",,"native" HKCU,%DllOverrides%,"dinput",,"builtin" HKCU,%DllOverrides%,"dinput8",,"builtin" HKCU,%DllOverrides%,"dmband",,"native" HKCU,%DllOverrides%,"dmcompos",,"native" HKCU,%DllOverrides%,"dmime",,"native" HKCU,%DllOverrides%,"dmloader",,"native" HKCU,%DllOverrides%,"dmscript",,"native" HKCU,%DllOverrides%,"dmstyle",,"native" HKCU,%DllOverrides%,"dmsynth",,"native" HKCU,%DllOverrides%,"dmusic",,"native" HKCU,%DllOverrides%,"dmusic32",,"native" HKCU,%DllOverrides%,"dnsapi",,"native" HKCU,%DllOverrides%,"dplay",,"native" HKCU,%DllOverrides%,"dplayx",,"native" HKCU,%DllOverrides%,"dpnaddr",,"native" HKCU,%DllOverrides%,"dpnet",,"native" HKCU,%DllOverrides%,"dpnhpast",,"native" HKCU,%DllOverrides%,"dpnlobby",,"native" HKCU,%DllOverrides%,"dsound",,"builtin" HKCU,%DllOverrides%,"dswave",,"native" HKCU,%DllOverrides%,"dxdiagn",,"native" HKCU,%DllOverrides%,"mscoree",,"native" HKCU,%DllOverrides%,"msdmo",,"native" HKCU,%DllOverrides%,"qcap",,"native" HKCU,%DllOverrides%,"quartz",,"native" HKCU,%DllOverrides%,"streamci",,"native"
のようなinfファイルを処理すればよいことになる。この場合、mscoreeなどもnative指定されている。
(2008/7/14)infファイルでは面倒なので、後述するレジストリファイルを作成して作業を行うと楽。
以下の例では、通常のWINEPREFIXとは別に[ホームディレクトリ]/.wine-dx9/というディレクトリを使用する。この環境を使用する場合は、実行時に環境変数WINEPREFIXをこの場所に指定する必要がある。
(2008/7/14)レジストリファイルを使用するように、これ以下の作業内容を大幅に書き換えた。なお、DirectXのバージョンは「June 2008」が出ているが、ここでは「March 2008」の名前のまま書いている。
まず、下のレジストリファイルを用意する。
[任意]ファイル名: nativedx9.reg
REGEDIT4 [HKEY_CURRENT_USER\Software\Wine\DllOverrides] "d3d8"="builtin" "d3d9"="builtin" "d3dim"="native" "d3drm"="native" "d3dx8"="native" "d3dx9_24"="native" "d3dx9_25"="native" "d3dx9_26"="native" "d3dx9_27"="native" "d3dx9_28"="native" "d3dx9_29"="native" "d3dx9_30"="native" "d3dx9_31"="native" "d3dx9_32"="native" "d3dx9_33"="native" "d3dx9_34"="native" "d3dx9_35"="native" "d3dx9_36"="native" "d3dxof"="native" "dciman32"="native" "ddrawex"="native" "devenum"="native" "dinput"="builtin" "dinput8"="builtin" "dmband"="native" "dmcompos"="native" "dmime"="native" "dmloader"="native" "dmscript"="native" "dmstyle"="native" "dmsynth"="native" "dmusic"="native" "dmusic32"="native" "dnsapi"="native" "dplay"="native" "dplayx"="native" "dpnaddr"="native" "dpnet"="native" "dpnhpast"="native" "dpnlobby"="native" "dsound"="builtin" "dswave"="native" "dxdiagn"="native" "mscoree"="native" "msdmo"="native" "qcap"="native" "quartz"="native" "streamci"="native" [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion] "CSDVersion"="Service Pack 4" "CurrentBuildNumber"="2195" "CurrentVersion"="5.0"
次に、下のように作業を行う。
$ export WINEPREFIX=~/.wine-dx9 $ regedit [win32dx9-mar2008.regの場所] wine: created the configuration directory '/home/[ユーザ名]/.wine-dx9' wine: configuration in '/home/[ユーザ名]/.wine-dx9' has been updated. $ mkdir work; cd work/ $ cabextract [directx_mar2008_redist.exeの場所] Extracting cabinet: [directx_mar2008_redist.exeの場所] extracting Apr2005_d3dx9_25_x64.cab extracting Apr2005_d3dx9_25_x86.cab (中略) extracting OCT2006_XACT_x64.cab extracting OCT2006_XACT_x86.cab All done, no errors. $ wine DXSETUP.exe $ cd - $ rm work -fr
DirectXのインストーラでは、ライセンスに同意する前提で「wine DXSETUP.exe /silent」という非対話モードでインストールすることもできる。
以下、infファイルを使用した作業例(非推奨)。
$ export WINEPREFIX=~/.wine-dx9 $ wineprefixcreate $ wine rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 [上のinfファイルの場所] (好みに応じて、その他のinfファイルを読み込む)
この後は「mkdir work」から同様に作業するのだが、その前にwinecfg設定ツールで一旦Windowsのバージョンを「Windows 2000」にしておく。既定のバージョンはWineの0.9.58からWinXPになっているが、XPにしていると一部ファイルがコピーされない?
インストール後は、WindowsのバージョンをXPにしてもOK。
なお、MSGSと関係ないが、ここで
$ wine explorer /desktop=dxdiag,1024x768 dxdiag
のようにするとDirectX診断ツールが起動する。もし
ファイル名: ${WINEPREFIX}/user.reg
[Software\\Wine\\Direct3D] "DirectDrawRenderer"="opengl"
が指定されている場合、DirectDrawのテストが正常に動作しないため、値を「gdi」にするか、この項目自体を作らないようにする。
別のWine環境へのコピーとレジストリ設定
C:\windows\system32\以下の- dmband
- dmcompos
- dmime
- dmloader
- dmstyle
- dmsynth
- dmusic
のDLLを通常の(もしくはMSGS用に作成した)Wine環境(WINEPREFIX)の同ディレクトリへコピーし、上記DLLをネイティブ指定するためのレジストリ項目を自動で指定するinfファイルを
[Version] signature="$CHICAGO$" [DefaultInstall] AddReg=DllOverrides [Strings] DllOverrides="Software\Wine\DllOverrides" [DllOverrides] HKCU,%DllOverrides%,"dmband",,"native" HKCU,%DllOverrides%,"dmcompos",,"native" HKCU,%DllOverrides%,"dmime",,"native" HKCU,%DllOverrides%,"dmloader",,"native" HKCU,%DllOverrides%,"dmstyle",,"native" HKCU,%DllOverrides%,"dmsynth",,"native" HKCU,%DllOverrides%,"dmusic",,"native"
このような内容で作成し、
$ wine rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 [infファイル]
インストールする。しかし、まだ音源ファイルがないため、作業は不十分。
使用したバージョン:
- Wine 0.9.58
- DirectX 9.0c(March 2008 Redistributable)