|
ややこしい話をする前に、とにかくMIDIファイルを再生してみましょう。例では、ファイルの指定ダイアログで指定した指定したMIDIファイルを演奏します。なお、ファイルの指定ダイアログボックスについては、エクセルマクロTipsの8.3 ファイル選択ダイアログを使うを参照してください。
それと、APIのFindWindowを準備する必要があります。FindWindowについては3.2 ウィンドウハンドル番号を取得するをどうぞ。
なお、MIDIファイルはC:\windows\mediaあたりを探すとゴッソリ出てくることでしょう。それと、ボリュームに注意してください(笑)
◆DirectX 7の場合
Sub prcDirectMusic7()
Dim objDrX As New DirectX7
Dim objDMPerf As DirectMusicPerformance
Dim objDMLdr As DirectMusicLoader
Dim objDMSgmnt As DirectMusicSegment
Dim objDMSgtSt As DirectMusicSegmentState
Dim lngWindow As Long
Dim vntFileName As Variant
'ファイルを開くダイアログを開きます
vntFileName = _
Application.GetOpenFilename( _
FileFilter:="MIDIファイル(*.mid),*.mid" _
, FilterIndex:=1 _
, Title:="開けゴマ" _
, MultiSelect:=False _
)
'MIDIファイルを選択しなかったときは終了します
If vntFileName = False Then
Exit Sub
End If
'ウィンドウハンドルの取得
lngWindow = FindWindow("XLMAIN", Application.Caption)
'DirectMusicLoaderオブジェクト作成
Set objDMLdr = objDrX.DirectMusicLoaderCreate()
'DirectMusicPerformanceオブジェクト作成
Set objDMPerf = objDrX.DirectMusicPerformanceCreate()
'ミュージックデータ送受信ポートの設定(デフォルト値)
objDMPerf.Init DirectSound:=Nothing, hwnd:=lngWindow
'MicrosoftSynthesizerを使う
objDMPerf.SetPort Index:=-1 _
, numGroups:=16
'SoundFontは自動読み込み
objDMPerf.SetMasterAutoDownload b:=True
'演奏するファイルをロード
Set objDMSgmnt = objDMLdr.LoadSegment(vntFileName)
'再生開始位置を先頭に設定
objDMSgmnt.SetStartPoint mtStart:=0
'繰り返し数は「演奏回数-1」を指定 永久に演奏するときは「-1」を指定
objDMSgmnt.SetRepeats lRepeats:=0
'再生
Set objDMSgtSt = objDMPerf.PlaySegment(objDMSgmnt, 0, 0)
'演奏が開始されるまで待つ
Do Until objDMPerf.IsPlaying(objDMSgmnt, objDMSgtSt) = True
DoEvents
Loop
'演奏が終了するまで待つ
Do Until objDMPerf.IsPlaying(objDMSgmnt, objDMSgtSt) = False
DoEvents
Loop
'演奏を停止
objDMPerf.Stop segment:=objDMSgmnt _
, segmentState:=objDMSgtSt _
, mtTime:=0 _
, lFlags:=0
'DirectMusicPerformanceをリセット
objDMPerf.Reset resetflags:=0
'DirectMusicPerformanceを終了
objDMPerf.CloseDown
End Sub
|
※標準モジュールへFindWindow関数を定義する必要があります。
また、DirectX 7を参照設定に追加する必要があります。
◆DirectX 8の場合
Sub prcDirectMusic8()
Dim objDrX As New DirectX8
Dim objDMPerf As DirectMusicPerformance8
Dim objDMLdr As DirectMusicLoader8
Dim objDMSgmnt As DirectMusicSegment8
Dim objDMSgtSt As DirectMusicSegmentState8
Dim sctParams As DMUS_AUDIOPARAMS
Dim lngWindow As Long
Dim vntFileName As Variant
'ファイルを開くダイアログを開きます
vntFileName = _
Application.GetOpenFilename( _
FileFilter:="MIDIファイル(*.mid),*.mid" _
, FilterIndex:=1 _
, Title:="開けゴマ" _
, MultiSelect:=False _
)
'MIDIファイルを選択しなかったときは終了します
If vntFileName = False Then
Exit Sub
End If
'ウィンドウハンドルの取得
lngWindow = FindWindow("XLMAIN", Application.Caption)
'DirectMusicLoaderオブジェクト作成
Set objDMLdr = objDrX.DirectMusicLoaderCreate()
'DirectMusicPerformanceオブジェクト作成
Set objDMPerf = objDrX.DirectMusicPerformanceCreate()
'DirectMusicPerformanceの初期化
objDMPerf.InitAudio hwnd:=lngWindow _
, lFlags:=DMUS_AUDIOF_ALL _
, audioparams:=sctParams _
, directsound:=Nothing _
, lDefaultPathType:=DMUS_APATH_DYNAMIC_3D _
, lPChannelCount:=16
'SoundFontは自動読み込み
objDMPerf.SetMasterAutoDownload b:=True
'演奏するファイルをロード
Set objDMSgmnt = objDMLdr.LoadSegment(vntFileName)
'再生開始位置を先頭に設定
objDMSgmnt.SetStartPoint mtStart:=0
'繰り返し数は「演奏回数-1」を指定 永久に演奏するときは「-1」を指定
objDMSgmnt.SetRepeats lRepeats:=0
'再生
Set objDMSgtSt = objDMPerf.PlaySegmentEx(objDMSgmnt, 0, 0)
'演奏が開始されるまで待つ
Do Until objDMPerf.IsPlaying(objDMSgmnt, objDMSgtSt) = True
DoEvents
Loop
'演奏が終了するまで待つ
Do Until objDMPerf.IsPlaying(objDMSgmnt, objDMSgtSt) = False
DoEvents
Loop
'演奏を停止
objDMPerf.StopEx ObjectToStop:=objDMSgtSt _
, lStopTime:=0 _
, lFlags:=0
'DirectMusicPerformanceをリセット
objDMPerf.Reset resetflags:=0
'DirectMusicPerformanceを終了
objDMPerf.CloseDown
End Sub
|
※標準モジュールへFindWindow関数を定義する必要があります。
また、DirectX 8を参照設定に追加する必要があります。
|
|
|