次の方法で共有


MIDI のキャプチャ

キーボードなどのデバイスから MIDI メッセージをキャプチャするには、キャプチャ デバイス用のポートを作成し、その IDirectMusicPort8::SetReadNotificationHandle メソッドを使って、読み込むメッセージがあるときに常にイベントを通知させる。イベントに対しては、IDirectMusicPort8::Read メソッドの呼び出しを S_FALSE が返されるまで繰り返し、未処理のイベントをバッファに格納する。Read が呼び出されるたびに、利用可能なすべてのイベント、またはバッファに収まるすべてのイベントが、バッファに格納される。少なくとも 1 つのイベントがバッファに格納されると、S_OK が返される。

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

次のサンプル コードは、この処理を示している。CreateEvent によって hEvent が 作成され、SetReadNotificationHandle の呼び出しによってキャプチャ ポート pPort に渡されたものとする。また、IDirectMusic8::CreateMusicBuffer によって pBuffer が初期化されたものと仮定する。

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 はメッセージのデータ構造体を指し、
      // 構造体に対して必要な処理は何でも行うことができる。
      // pb[0] はステータス バイトである。
      // pb[1] と pb[2] はデータ バイトである。
    }
    else if (hr == S_FALSE)
    {
      break;  // バッファにはこれ以上データはない。
    }
  }  // バッファの処理を終了する。
}  // 保留されているイベントの読み込みを終了する。

途中でメッセージを処理せずに、単にメッセージをポートからポートに送信する場合は、IDirectMusicThru8 インターフェイスを使う。詳細については、「IDirectMusicThru8::ThruChannel」を参照すること。