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

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

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をネイティブ版使用にできるようになっている。

  1. Windowsネイティブ版DirectXをインストール
    1. DLLの優先指定
  2. 別のWine環境へのコピーとレジストリ設定

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の指定が必要。
wine-review.blogspot.com/2008/03/directx-90c-march-2008-redistributable.html
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)

*1:MSGSやゲイツシンセとも呼ばれる

*2:該当ファイルだけをコピーするのであれば、後ろに書いている再頒布可能パッケージのexeファイルを展開後dxnt.cabというファイルを展開すれば取り出せる

*3:同名のDLLについてWine組み込み版(builtin)とWindows版(native)のどちらを使用する/しないかの設定・幾つかは必ずbuiltinにしなくてはならない