4.2.3 演奏と停止、後処理
眠気を誘うような前置きが続きましたが、これでやっとMIDIファイルを演奏する準備ができました。今度は、MIDIファイルを演奏する方法と停止する方法、それと演奏中かを調べる方法です。
演奏する
MIDIファイルを再生する場合は、MusicPerformanceオブジェクト(例ではobjDMPerf)のPlaySegment(DirectX8の場合はPlaySegmentEx)を使います。以下は再生する例で、PlaySegmentPlaySegmentEx)メソッドを使い、MusicSegmentStateオブジェクト(例ではobjDMSgtSt)を作ることで再生が始まります。

PlaySegmentPlaySegmentEx)メソッドの引数は3つで、1つめの引数に読み込んだMIDIファイルの情報(MusicSegmentオブジェクト)を指定、あとの2つは0でOKです。

'再生(DirectX 7のとき)
Set objDMSgtSt = objDMPerf.PlaySegment(objDMSgmnt, 0, 0)

または

'再生(DirectX 8のとき)
Set objDMSgtSt = objDMPerf.PlaySegmentEx(objDMSgmnt, 0, 0)
演奏を停止する
演奏を停止する場合は、MusicPerformanceオブジェクト(例では)のStop(DirectX8の場合はStopEx)メソッドを使います。

引数はDirectX 7とDirectX 8で多少違っています。

'演奏を停止(DirectX 8のとき)
objDMPerf.Stop segment:=objDMSgmnt _
             , segmentState:=objDMSgtSt _
             , mtTime:=0 _
             , lFlags:=0

または

'演奏を停止(DirectX 8のとき)
objDMPerf.StopEx ObjectToStop:=objDMSgtSt _
               , lStopTime:=0 _
               , lFlags:=0


 ◆DirectX 7のときのオプション
segment:= 演奏中のDirectMusicSegmentオブジェクト(例ではobjDMSgmnt
segmentState:= 演奏中のDirectMusicSegmentStateオブジェクト(例ではobjDMSgtSt
mtTime:= 何秒後に演奏を停止するかを指定します。単位は知りません(汗)。すぐに停止する場合は0です。(例では0
lFlags:= 停止する位置を指定します。すぐに停止する場合は0です。(例では0
なお、一部ですが次の物があり、これらはDirectX 8でも同じです。

DMUS_SEGF_MEASURE:mtTime:=で指定した時間経過後の次の小節の終わり
DMUS_SEGF_BEAT:mtTime:=で指定した時間経過後の次の拍子


 ◆DirectX 8のときのオプション
ObjectToStop:= 演奏中のDirectMusicSegmentState8オブジェクト(例ではobjDMSgtSt
lStopTime:= 何秒後に演奏を停止するかを指定します。単位は知りません(汗)。すぐに停止する場合は0です。(例では0
lFlags:= 停止する位置を指定します。すぐに停止する場合は0です。(例では0
なお、一部ですが次の物があり、これらはDirectX 7でも同じです。

DMUS_SEGF_MEASURE:lStopTime:=で指定した時間経過後の次の小節の終わり
DMUS_SEGF_BEAT:lStopTime:=で指定した時間経過後の次の拍子
演奏中かを調べる方法
演奏中かを知りたいときは、DirectMusicPerformanceオブジェクト(例ではobjDMPerf)のIsPlayingメソッドの結果から知ることができます。Trueなら演奏中、Falseなら止まっています。

引数には、演奏中のDirectMusicSegment(DirectMusicSegment8)オブジェクト(例ではobjDMSgmnt)と、DirectMusicSegmentStateDirectMusicSegmentState8)オブジェクト(例ではobjDMSgtSt)を指定します。

'演奏が終了するまで待つ
Do Until objDMPerf.IsPlaying(objDMSgmnt, objDMSgtSt) = False
   DoEvents
Loop
後処理
DirectMusicの終了処理、早い話が後片づけです。MusicPerformanceMusicPerformance8)オブジェクト(例ではobjDMPerf)のResetメソッドで設定をリセットし、最後にCloseDownメソッドで全てを終わらせます。プログラムの終了処理などで念のためやっておきましょう。なお、この記述はDirectX7と8で同じです。

'DirectMusicPerformanceをリセット
objDMPerf.Reset resetflags:=0

'DirectMusicPerformanceを終了
objDMPerf.CloseDown
Copyright(C) 1999-2006 結城圭介。 All rights reserved