4.1 DirectXでWAVファイルを鳴らす
音を鳴らす方法その2です。PlaySoundはWAVファイルしか扱えない同時に複数の音を鳴らすことが出来ないという大問題がありましたが、DirectXというものを使うと同時にいくつもの音を鳴らしたりmidiファイルを鳴らしたりも出来るので、BGMを鳴らしながら効果音をバリバリ鳴らしたりなんてことも余裕です。

ちなみに、ここで取り扱うDirectXのバージョンは7と8です。9はどこへ行った・・・そのうち作るので、ちょいとお待ちを…(汗)
DirectXを使えるようにする
DirectXを使う場合は参照設定という設定を行う必要があります。また、お使いの環境によってDirectX7とDirectX8のように2つのバージョンが入っていることがあり、それぞれ使い方が微妙に違います。が、7と8両方のケースを準備したので、お好きな方でどうぞ。なお、設定はココをクリックして開いたウィンドウを参考にしてください。
まずは全体像を確認
ややこしい話をする前に、とにかく音を鳴らしてみましょう。例では、ファイルの指定ダイアログで指定したWAVファイルを鳴らします。なお、ファイルの指定ダイアログボックスについては、エクセルマクロTips8.3 ファイル選択ダイアログを使うを参照してください。

それと、APIのFindWindowを準備する必要があります。FindWindowについては3.2 ウィンドウハンドル番号を取得するをどうぞ。

なお、WAVファイルはC:\windows\mediaあたりを探すとゴッソリ出てくることでしょう。それと、ボリュームに注意してください(笑)

 ◆DirectX 7の場合
Sub prcDirectSound7()

    Dim objDrX     As New DirectX7
    Dim objDrSD    As DirectSound
    Dim objDrSB    As DirectSoundBuffer
    Dim sctDesc    As DSBUFFERDESC
    Dim sctFormat  As WAVEFORMATEX
    Dim lngWindow  As Long
    Dim vntFileName As Variant

    'DirectSoundオブジェクト作成
    Set objDrSD = objDrX.DirectSoundCreate("")

    'ウィンドウハンドルの取得
    lngWindow = FindWindow("XLMAIN", Application.Caption)

    'このウィンドウが優先的にDirectXを使う設定
    objDrSD.SetCooperativeLevel hwnd:=lngWindow, level:=DSSCL_PRIORITY

    'ファイルを開くダイアログを開きます
    vntFileName = _
        Application.GetOpenFilename( _
             FileFilter:="WAVファイル(*.wav),*.wav" _
           , FilterIndex:=1 _
           , Title:="開けゴマ" _
           , MultiSelect:=False _
            )

    'WAVファイルを選択しなかったときは終了します
    If vntFileName = False Then
       Exit Sub
    End If

    'サウンドバッファへWAVファイルを設定
    Set objDrSB = objDrSD.CreateSoundBufferFromFile _
                      (Filename:=vntFileName _
                     , bufferdesc:=sctDesc _
                     , Format:=sctFormat)

    '演奏します
    objDrSB.Play DSBPLAY_DEFAULT

    'プロシジャが終了すると音が止まってしまうため
    '音が鳴り終わるまで待機します
    Do Until objDrSB.GetStatus = 0
       DoEvents
    Loop

End Sub
 ※標準モジュールへFindWindow関数を定義する必要があります。
  また、DirectX 7を参照設定に追加する必要があります。


 ◆DirectX 8の場合
Sub prcDirectSound8()

    Dim objDrX      As New DirectX8
    Dim objDrSD     As DirectSound8
    Dim objDrSB     As DirectSoundSecondaryBuffer8
    Dim sctDesc     As DSBUFFERDESC
    Dim lngWindow   As Long
    Dim vntFileName As Variant

    'DirectSoundオブジェクト作成
    Set objDrSD = objDrX.DirectSoundCreate("")

    'ウィンドウハンドルの取得
    lngWindow = FindWindow("XLMAIN", Application.Caption)

    'このウィンドウが優先的にDirectXを使う設定
    objDrSD.SetCooperativeLevel hwnd:=lngWindow, Level:=DSSCL_PRIORITY

    'ファイルを開くダイアログを開きます
    vntFileName = _
        Application.GetOpenFilename( _
             FileFilter:="WAVファイル(*.wav),*.wav" _
           , FilterIndex:=1 _
           , Title:="開けゴマ" _
           , MultiSelect:=False _
            )

    'WAVファイルを選択しなかったときは終了します
    If vntFileName = False Then
       Exit Sub
    End If

    'サウンドバッファへWAVファイルを設定
    Set objDrSB = objDrSD.CreateSoundBufferFromFile _                       (Filename:=vntFileName _
                     , bufferdesc:=sctDesc)

    '演奏します
    objDrSB.Play DSBPLAY_DEFAULT

    'プロシジャが終了すると音が止まってしまうため
    '音が鳴り終わるまで待機します
    Do Until objDrSB.GetStatus = 0
       DoEvents
    Loop

End Sub
 ※標準モジュールへFindWindow関数を定義する必要があります。
  また、DirectX 8を参照設定に追加する必要があります。
Copyright(C) 1999-2011 結城圭介。 All rights reserved