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

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

Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(Wine内蔵のDirectMusicでの動作について)

Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(gm.dlsの入手とDirectMusic対応プレーヤによる再生)」で演奏ができたのは「Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(WindowsネイティブDirectXのDLLを使用)」でWindowsネイティブ版DLLを一部に使用しているためで、Wine組み込み版DirectX(のDirectMusic)ではうまく動作しなかった。その際の詳細な情報をここに貼り付ける。

  1. Wine内蔵DirectMusicの詳細なメッセージ
    1. 起動時のメッセージ
    2. 再生開始時のメッセージ
  2. 関連: gm.dlsの場所などの初期値の定義場所

Wine内蔵DirectMusicの詳細なメッセージ

使用したのは「Wine上でMicrosoft GS Wavetable SW Synth(MSGS・ゲイツシンセ)の音を鳴らす(gm.dlsの入手とDirectMusic対応プレーヤによる再生)」で使用したEasy MIDI Music Player。「WineでRPGツクールXP製の作品を動かすのは厳しい?」のときと違い、DirectMusic関係の全てのDLLに関するメッセージを表示するようにした。

起動時のメッセージ

$ WINEDEBUG=+dmband,+dmcompos,+dmime,+dmloader,+dmstyle,+dmsynth,+dmusic wine [EMPlayer.exeの場所]
trace:dmloader:DllGetClassObject (CLSID_DirectMusicLoader, IID_IClassFactory, 0x33fe18)
trace:dmloader:DMUSIC_CreateDirectMusicLoaderCF (IID_IClassFactory, 0x33fe18, (nil))
trace:dmloader:IDirectMusicLoaderCF_QueryInterface (0x1344d8, IID_IClassFactory, 0x33fe18)
trace:dmloader:IDirectMusicLoaderCF_AddRef (0x1344d8): AddRef from 0
trace:dmloader:IDirectMusicLoaderCF_CreateInstance (0x1344d8, (nil), IID_IDirectMusicLoader, 0x4285e4)
trace:dmloader:DMUSIC_CreateDirectMusicLoaderImpl (IID_IDirectMusicLoader, 0x4285e4, (nil))
trace:dmloader:DMUSIC_InitLoaderSettings : (0x1344f0)
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_SetObject (0x1344f0, 0x33fa28): pDesc:
DMUS_OBJECTDESC (0x33fa28):
 - dwSize = 0x00000350
 - dwValidData = 0x00000033 (DMUS_OBJ_OBJECT DMUS_OBJ_CLASS DMUS_OBJ_FILENAME DMUS_OBJ_FULLPATH )
 - guidClass = CLSID_DirectMusicCollection
 - guid
trace:dmloader:DMUSIC_CreateDirectMusicLoaderFileStream (0x33f9d4)
trace:dmloader:IDirectMusicLoaderFileStream_IStream_QueryInterface (0x135e68, IID_IStream, 0x33f9d4)
trace:dmloader:IDirectMusicLoaderFileStream_IStream_AddRef (0x135e68): AddRef from 0
trace:dmloader:IDirectMusicLoaderFileStream_Attach (0x135e68, L"C:\\windows\\system32\\drivers\\gm.dls", 0x1344f0)
trace:dmloader:IDirectMusicLoaderFileStream_Detach (0x135e68)
trace:dmloader:IDirectMusicLoaderFileStream_Attach : succeeded
trace:dmusic:DllGetClassObject (CLSID_DirectMusicCollection, IID_IClassFactory, 0x33f218)
trace:dmusic:CollectionCF_CreateInstance ((nil), IID_IDirectMusicObject, 0x33f9d0)
trace:dmusic:IDirectMusicCollectionImpl_IUnknown_QueryInterface (0x1360b8, IID_IDirectMusicObject, 0x33f9d0)
trace:dmusic:IDirectMusicCollectionImpl_IUnknown_AddRef (0x1360b8)->(ref before=0)
trace:dmusic:IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescriptor (0x1360b8, 0x135e68, 0x33f270)
trace:dmusic:IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescriptor : returning descriptor:
DMUS_OBJECTDESC (0x33f270):
 - dwSize = 848
 - dwValidData = DMUS_OBJ_CLASS DMUS_OBJ_NAME DMUS_OBJ_VERSION
 - guidClass = CLSID_DirectMusicCollection
 - vVersion = '256,0,4096,2'
 - wszName = L"GS s
trace:dmloader:DMUSIC_CopyDescriptor : copy
DMUS_OBJECTDESC (0x33f270):
 - dwSize = 0x00000350
 - dwValidData = 0x00000086 (DMUS_OBJ_CLASS DMUS_OBJ_NAME DMUS_OBJ_VERSION )
 - guidClass = CLSID_DirectMusicCollection - vVersion = '1,0,16,2'
 - w(0x1360b8)->(ref before=1)
trace:dmloader:IDirectMusicLoaderFileStream_IStream_Release (0x135e68): ReleaseRef to 0
trace:dmloader:IDirectMusicLoaderFileStream_Detach (0x135e68)
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_SetObject : adding alias entry with following info:
DMUS_OBJECTDESC (0x33fa28):
 - dwSize = 0x00000350
 - dwValidData = 0x000000B7 (DMUS_OBJ_OBJECT DMUS_OBJ_CLASS DMUS_OBJ_NAME DMUS_OBJ_FILENAME DMUS_OBJ_FULLPATH DMUS_OBJ_VERSION )
 - guidClass = CLSI
trace:dmloader:DMUSIC_CopyDescriptor : copy
DMUS_OBJECTDESC (0x33fa28):
 - dwSize = 0x00000350
 - dwValidData = 0x000000B7 (DMUS_OBJ_OBJECT DMUS_OBJ_CLASS DMUS_OBJ_NAME DMUS_OBJ_FILENAME DMUS_OBJ_FULLPATH DMUS_OBJ_VERSION )
 - guidClass = CLSI(0x1344f0, IID_IDirectMusicLoader, 0x4285e4)
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_AddRef (0x1344f0): AddRef from 0
trace:dmloader:IDirectMusicLoaderCF_Release (0x1344d8): ReleaseRef to 0
trace:dmime:DllGetClassObject (CLSID_DirectMusicPerformance, IID_IClassFactory, 0x33f0c4)
trace:dmime:PerformanceCF_CreateInstance ((nil), IID_IDirectMusicPerformance, 0x651690)
trace:dmime:DMUSIC_CreateDirectMusicPerformanceImpl (0x422c9c,0x651690,(nil))
trace:dmime:IDirectMusicPerformance8Impl_QueryInterface (0x1432b8, IID_IDirectMusicPerformance,0x651690)
trace:dmime:IDirectMusicPerformance8Impl_AddRef (0x1432b8): AddRef from 0
trace:dmime:IDirectMusicPerformance8Impl_QueryInterface (0x1432b8, IID_IDirectMusicPerformance8,0x33f100)
trace:dmime:IDirectMusicPerformance8Impl_AddRef (0x1432b8): AddRef from 1
fixme:dmime:IDirectMusicPerformance8Impl_InitAudio (0x1432b8, 0x33f138, 0x65168c, 0x10028, 1, 32, 3f, (nil)): to check
fixme:dmime:IDirectMusicPerformance8Impl_Init (iface = 0x1432b8, dmusic = 0x33f138, dsound = 0x143900, hwnd = 0x10028)
trace:dmusic:DllGetClassObject (CLSID_DirectMusic, IID_IClassFactory, 0x33f028)
trace:dmusic:DirectMusicCF_CreateInstance ((nil), IID_IDirectMusic8, 0x1432c0)
trace:dmusic:DMUSIC_CreateDirectMusicImpl (0x7da70260,0x1432c0,(nil))
trace:dmusic:IReferenceClockImpl_QueryInterface (0x15be20, {56a86897-0ad4-11ce-b03a-0020af0ba770}, 0x143148)
trace:dmusic:IReferenceClockImpl_AddRef (0x15be20)->(ref before=0)
trace:dmusic:IDirectMusic8Impl_QueryInterface (0x143140, IID_IDirectMusic8, 0x1432c0)
trace:dmusic:IDirectMusic8Impl_AddRef (0x143140)->(ref before=0)
trace:dmusic:IDirectMusic8Impl_AddRef (0x143140)->(ref before=1)
fixme:dmime:IDirectMusicPerformance8Impl_CreateStandardAudioPath (0x1432b8)->(1, 32, 0, 0x143484): semi-stub
trace:dmime:IDirectMusicAudioPathImpl_IUnknown_QueryInterface (0x143160, IID_IDirectMusicAudioPath, 0x33f058)
trace:dmime:IDirectMusicAudioPathImpl_IUnknown_AddRef (0x143160): AddRef from 0
trace:dmime:IDirectMusicPerformance8Impl_CreateStandardAudioPath  returning IDirectMusicPerformance interface at 0x143164.
fixme:dmime:IDirectMusicAudioPathImpl_IDirectMusicAudioPath_Activate (0x143160, 0): stub
trace:dmime:IDirectMusicPerformance8Impl_Release (0x1432b8): ReleaseRef to 1
trace:dmusic:IDirectMusic8Impl_CreatePort (0x143140, CLSID_DirectMusicSynth, 0x33f0c4, 0x651698, (nil))
trace:dmusic:IDirectMusic8Impl_EnumPort (0x143140, 0, 0x33ef5c)
trace:dmusic:IDirectMusic8Impl_EnumPort enumerating 'Microsoft Software Synthesizer' port
trace:dmsynth:DllGetClassObject (CLSID_DirectMusicSynth, IID_IClassFactory, 0x33eec0)
trace:dmsynth:SynthCF_CreateInstance ((nil), IID_IDirectMusicSynth8, 0x33ef00)
trace:dmsynth:DMUSIC_CreateDirectMusicSynthImpl (0x7dc02aa8,0x33ef00,(nil))
trace:dmsynth:IDirectMusicSynth8Impl_QueryInterface (0x15c578, IID_IDirectMusicSynth8, 0x33ef00)
trace:dmsynth:IDirectMusicSynth8Impl_AddRef (0x15c578)->(ref before=0)
trace:dmsynth:IDirectMusicSynth8Impl_GetPortCaps (0x15c578, 0x33ef5c)
trace:dmsynth:IDirectMusicSynth8Impl_Release (0x15c578)->(ref before=1)
trace:dmusic:DMUSIC_CreateDirectMusicPortImpl (0x7dc02198,0x33f090,0x143140)
trace:dmusic:IReferenceClockImpl_QueryInterface (0x15c730, {56a86897-0ad4-11ce-b03a-0020af0ba770}, 0x15c584)
trace:dmusic:IReferenceClockImpl_AddRef (0x15c730)->(ref before=0)
trace:dmusic:IDirectMusicPortImpl_QueryInterface (0x15c578, IID_IDirectMusicPort, 0x33f090)
trace:dmusic:IDirectMusicPortImpl_AddRef (0x15c578)->(ref before=0)
trace:dmusic:IDirectMusicPortImpl_Activate (0x15c578, 1)
fixme:dmime:IDirectMusicPerformance8Impl_AddPort (0x1432b8, 0x15c578): stub
trace:dmusic:IDirectMusicPortImpl_AddRef (0x15c578)->(ref before=1)
fixme:dmime:IDirectMusicPerformance8Impl_AssignPChannelBlock (0x1432b8, 0, 0x15c578, 0): semi-stub
trace:dmime:DllGetClassObject (CLSID_DirectMusicGraph, IID_IClassFactory, 0x33f0c4)
trace:dmime:GraphCF_CreateInstance ((nil), IID_IDirectMusicGraph, 0x33f134)
trace:dmime:IDirectMusicGraphImpl_IUnknown_QueryInterface (0x15c450, {2befc277-5497-11d2-bccb-00a0c922e6eb}, 0x33f134)
trace:dmime:IDirectMusicGraphImpl_IUnknown_AddRef (0x15c450): AddRef from 0
trace:dmime:IDirectMusicPerformance8Impl_AddRef (0x1432b8): AddRef from 1
fixme:dmime:IDirectMusicGraphImpl_IDirectMusicGraph_InsertTool (0x15c450, 0x651368, (nil), 0, 0): use of pdwPChannels
fixme:dmime:IDirectMusicGraphImpl_IDirectMusicGraph_InsertTool (0x15c450, 0x651aa8, (nil), 0, 0): use of pdwPChannels
fixme:dmime:IDirectMusicPerformance8Impl_SetGraph (0x1432b8, 0x15c454): to check
trace:dmime:IDirectMusicGraphImpl_IUnknown_AddRef (0x15c450): AddRef from 1
trace:dmime:IDirectMusicGraphImpl_IUnknown_Release (0x15c450): ReleaseRef to 1
trace:dmime:IDirectMusicPerformance8Impl_SetGlobalParam (0x1432b8, GUID_PerfMasterVolume, 0x33f0ec, 4)
trace:dmime:IDirectMusicPerformance8Impl_SetGlobalParam => MasterVolume set to 0

gm.dls自体は読み込めていて、そのバージョン*1までは取れているようだ。
この後、ファイルを選択して読み込み、タイトルなどの情報が表示されるまではメッセージは出力されない。

再生開始時のメッセージ
再生ボタンを押すと以下のメッセージが出るが、「開く」ボタン左の数字がずっと0のままで、止まっている。

trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_SetObject (0x1344f0, 0x33e9f8): pDesc:
DMUS_OBJECTDESC (0x33e9f8):
 - dwSize = 0x00000350
 - dwValidData = 0x00000003 (DMUS_OBJ_OBJECT DMUS_OBJ_CLASS )
 - guidClass = CLSID_DirectMusicSegment
 - guidObject = {96179152-c000-11dd-2a9c-00161
err:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_SetObject : no way to get additional info
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_SetObject (0x1344f0, 0x33e9f8): pDesc:
DMUS_OBJECTDESC (0x33e9f8):
 - dwSize = 0x00000350
 - dwValidData = 0x00000583 (DMUS_OBJ_OBJECT DMUS_OBJ_CLASS DMUS_OBJ_VERSION DMUS_OBJ_DATE DMUS_OBJ_MEMORY )
 - guidClass = CLSID_DirectMusicSegment
trace:dmloader:DMUSIC_CreateDirectMusicLoaderResourceStream (0x33e96c)
trace:dmloader:IDirectMusicLoaderResourceStream_IStream_QueryInterface (0x13f6f8, IID_IStream, 0x33e96c)
trace:dmloader:IDirectMusicLoaderResourceStream_IStream_AddRef (0x13f6f8): AddRef from 0
trace:dmloader:IDirectMusicLoaderResourceStream_Attach (0x13f6f8, 0x340000, 0x0000F1BC, 0x00000000, 0x1344f0)
trace:dmloader:IDirectMusicLoaderResourceStream_Detach (0x13f6f8)
trace:dmime:DllGetClassObject (CLSID_DirectMusicSegment, IID_IClassFactory, 0x33e1b0)
trace:dmime:SegmentCF_CreateInstance ((nil), IID_IDirectMusicObject, 0x33e968)
trace:dmime:IDirectMusicSegment8Impl_IUnknown_QueryInterface (0x137188, IID_IDirectMusicObject, 0x33e968)
trace:dmime:IDirectMusicSegment8Impl_IUnknown_AddRef (0x137188): AddRef from 0
trace:dmime:IDirectMusicSegment8Impl_IDirectMusicObject_ParseDescriptor (0x137188,0x13f6f8, 0x33e208)
err:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_SetObject : couldn't parse descriptor
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_GetObject (0x1344f0, 0x33e9f8, IID_IDirectMusicSegment, 0x33e9b4): pDesc:
DMUS_OBJECTDESC (0x33e9f8):
 - dwSize = 0x00000350
 - dwValidData = 0x00000003 (DMUS_OBJ_OBJECT DMUS_OBJ_CLASS )
 - guidClass = CLSID_DirectMusicSegment
 - guidObject = {96179152-c000-11dd-2a9c-00161
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_GetObject : looking if we have object in the cache or if it can be found via alias
trace:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_GetObject : no cache/alias entry found for requested object
fixme:dmloader:IDirectMusicLoaderImpl_IDirectMusicLoader_GetObject : unknown/unsupported way of loading

繰り返し「再生」ボタンを押しても上記部分が繰り返し出力されるだけで、再生状態になることはない。

関連: gm.dlsの場所などの初期値の定義場所

gm.dlsの場所がどこで定義されているのかが気になったので調べたところ
[引用]ファイル名: ${WINEPREFIX}/system.reg より

[Software\\Microsoft\\DirectMusic]
"GMFilePath"="C:\\windows\\system32\\drivers\\gm.dls"

[Software\\Microsoft\\DirectMusic\\Defaults]
"DefaultOutputPort"="{58C2B4D0-46E7-11D1-89AC-00A0C9054129}"

[Software\\Microsoft\\DirectMusic\\SoftwareSynths\\{58C2B4D0-46E7-11D1-89AC-00A0C9054129}]
"Description"="Microsoft Software Synthesizer"

上記レジストリ項目が存在し、これらは/usr/share/wine/wine.infで定義されていて、Wine環境(WINEPREFIX)作成時に自動的に設定されているということが分かった。
(2009/7/30)${WINEPREFIX}/system.regWine上のHKEY_LOCAL_MACHINE以下のレジストリが書かれているファイルなので、この設定をレジストリエディタで取り込みたい場合は「[Software\\...」の部分を「[HKEY_LOCAL_MACHINE\\Software\\...」とする。

使用したバージョン:

  • Wine 0.9.58

*1:「1,0,16,2」の部分。dxdiag上では「1.00.0016.0002」と表示される