音楽を鳴らしたいわけです。
Dim dm7 As DirectMusic dm7.Play "music.mid"
これでは鳴りませんが。
実際はもっと複雑です。
DirectSound(省略可)
準備はとりあえず終わっているものとして、そろそろ本題に入ります。
まず、音楽であるからには、音の楽であるわけで、DirectMusicより先に、DirectSoundが出てくるわけです。
今回のメインはDirectMusicであるというわけで、あまり深いことは考えずにDirectSoundを使うコードでも書くことにします。
'標準モジュールに Public ds7 As DirectSound
'最初に実行される場所で Set ds7 = dx7.DirectSoundCreate("") ds7.SetCooperativeLevel Me.hWnd, DSSCL_PRIORITY
'終了の際に Set ds7 = Nothing
DirectMusicPerformance
音がDirectSoundなら、それを使って音楽を鳴らすのがDirectMusicです・・・・ってわかってますよね。(汗
その中枢、というより、実際に演奏してるのがDirectMusicPerformanceです。
では、まず初期化からいきましょう。
'同じく標準モジュールに Public dmPerformance As DirectMusicPerformance
'DirectSoundの初期化のあとに Set dmPerformance = dx7.DirectMusicPerformanceCreate() dmPerformance.Init ds7, Me.hWnd dmPerformance.SetPort -1, 1 dmPerformance.SetMasterAutoDownload True
dmPerformance.Initのds7は、DirectMusicを単体で使ってDirectSoundを使わない場合にはNothingにしておけば勝手にDirectMusicがDirectSoundオブジェクトを作ってくれるのでDirectSound関連の処理が省略できます。
SetPortでは、第一引数を-1か0にしておけばとりあえず鳴るようにはなるはずです。
SetMasterAutoDownloadは、Trueにすればややこしいことは抜きにできる、と思います。
'終了処理(DirectSoundの前に) Set dmPerformance = Nothing
DirectMusicLoader
なんか、これがないとデータが読み込めないそうです。
App.Pathの部分は適宜変えるとよいでしょう。
'例によって宣言 Public dmLoader As DirectMusicLoader
'初期化処理中の適当なところに Set dmLoader = dx7.DirectMusicLoaderCreate() dmLoader.SetSearchDirectory App.Path
'終了処理(適当なところに) Set dmLoader = Nothing
DirectMusicSegment
Loaderで読まれたデータはここに入るそうです。
DirectMusicを使うからには読み込んだデータをプログラム側でいろいろ加工してみたいのでこれを使うことにします(普通は使わないと鳴らせませんが)。
Public dmSegment As DirectMusicSegment
'全部の初期化処理のあとに Set dmSegment = dmLoader.LoadSegment("music.mid") dmSegment.SetStandardMidiFile
dmSegment.Loadじゃなかったんですね・・・一曲につき一個のセグメントが必要みたいです。
その次の一文は、念のため読み込むのがSMFであるということをはっきりさせているだけで、大抵はなくても動作します。
MP3とかはDirectMusicでは使いません。
ここまできてやっと演奏開始のコードが書けるようになりました。
dmSegment.Playじゃありませんよ。
dmPerformance.PlaySegment dmSegment, 0, 0
ふー。これでとりあえず音楽が鳴るようになりました。
一応鳴らすことができたので今回はこれで終了。
と、その前に…
'終了処理 Set dmSegment = Nothing
参照カウントがあるのでいちいち解放しなくても大丈夫そうな気がしますが念のため。