Platform SDK: DirectX

音楽のキャプチャ

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。DirectX for Visual Basic では、音楽のキャプチャはサポートされない。

[C++]

キーボードなどのデバイスから MIDI メッセージをキャプチャすることは、DirectMusic では非常に簡単である。

通常は、キャプチャ デバイスのポートを作成し、IDirectMusicPort::SetReadNotificationHandle メソッドを使って、メッセージを読み込めるときに常にイベントに通知させる。イベントに応答して、IDirectMusicPort::Read メソッドの呼び出しを S_FALSE が返されるまで繰り返し、未処理のイベントをバッファに置く。Read が呼び出されるたびに、利用可能なだけのイベント、またはバッファに収まるだけのイベントがバッファに置かれる。少なくとも 1 つのイベントがバッファに置かれると、S_OK が返される。

バッファからイベントを取り出すには、IDirectMusicBuffer::GetNextEvent メソッドを呼び出す。S_FALSE が返されて利用可能なイベントがなくなるまで、呼び出しごとに 1 つのイベントを受け取る。

次のコード例は、この処理を示している。

/* hEvent は CreateEvent で作成され、SetReadNotificationHandle の
呼び出しにより、キャプチャ ポートの pPort に
与えられる。また、pBuffer は IDirectMusic::CreateMusicBuffer に
よって初期化されているとする。*/
 
REFERENCE_TIME rt;
DWORD          dwGroup;
DWORD          cb;
BYTE          *pb;
 
DWORD dw = WaitForMultipleObjects(1, hEvent, FALSE, INFINITE);
for (;;)
{
hr = pPort->Read(pBuffer);
if (hr == S_FALSE)
      {
break;  // これ以上バッファに読み込むメッセージがない。
      }
pBuffer->ResetReadPtr();
for (;;)
    {
hr = pBuffer->GetNextEvent(&rt, &dwGroup, &cb, &pb);
if (hr == S_OK)
        {
// pb はメッセージのデータ構造体を指す。
// ポインタを使って、必要な操作を実行できる。
        }
else if (hr == S_FALSE)
        {
break;  // バッファにはメッセージが残っていない。
        }
}  // バッファの操作が終了。
}  // 未処理のイベントの読み込みが終了。

途中でメッセージを処理せずに、単にメッセージをポートからポートに送信する場合は、IDirectMusicThru インターフェイスを使用する。