4.2 DirectXでMIDIファイルを鳴らす
DirectXを使うとMIDIファイルを再生することもできます。ゲームのオープニングやエンディング、ゲーム中など様々な場面にカッコイイBGMを付けて、さらに雰囲気をアップしましょう!

ちなみに、ここで取り扱うDirectXのバージョンは7と8です。9はどこへ行った・・・そのうち作るので、ちょいとお待ちを…(汗)
DirectXを使えるようにする
DirectXを使う場合は参照設定という設定を行う必要があります。また、お使いの環境によってDirectX7とDirectX8のように2つのバージョンが入っていることがあり、それぞれ使い方が微妙に違います。が、7と8両方のケースを準備したので、お好きな方でどうぞ。なお、設定はココをクリックして開いたウィンドウを参考にしてください。
まずは全体像を確認
ややこしい話をする前に、とにかくMIDIファイルを再生してみましょう。例では、ファイルの指定ダイアログで指定した指定したMIDIファイルを演奏します。なお、ファイルの指定ダイアログボックスについては、エクセルマクロTips8.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を参照設定に追加する必要があります。
Copyright(C) 1999-2006 結城圭介。 All rights reserved