Microsoft DirectX 8.0 (C++) |
キーボードなどのデバイスから MIDI メッセージをキャプチャするには、キャプチャ デバイスのポートを作成し、IDirectMusicPort8::SetReadNotificationHandle メソッドを使って、読み込むメッセージがあるときに常にイベントを通知させる。イベントに応答して、IDirectMusicPort8::Read メソッドの呼び出しを S_FALSE が返されるまで繰り返し、未処理のイベントをバッファに置く。Read が呼び出されるたびに、利用可能なだけのイベント、またはバッファに収まるだけのイベントがバッファに置かれる。少なくとも 1 つのイベントがバッファに置かれると、S_OK が返される。
バッファからイベントを取得するには、IDirectMusicBuffer8::GetNextEvent メソッドを呼び出す。S_FALSE が返されて利用可能なイベントがなくなるまで、呼び出しごとに 1 つのイベントを取得する。
次のサンプル コードは、この処理を示している。hEvent が CreateEvent によって作成され、SetReadNotificationHandle の呼び出しによってキャプチャ ポート pPort に与えられたと仮定する。また、pBuffer が IDirectMusic8::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; // バッファにはメッセージが残っていない。 } } // バッファの操作が終了。 } // 未処理のイベントの読み込みが終了。
途中でメッセージを処理せずに、単にメッセージをポートからポートに送信する場合は、IDirectMusicThru8 インターフェイスを使用する。詳細については、「IDirectMusicThru8::ThruChannel」を参照すること。