DirectMusic DirectMusic 의 사용법 MIDI 의 캡춰   [목차열람] [주소복사] [슬롯비우기]
MIDI 의 캡춰
 
Microsoft DirectX 9.0

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;  // 버퍼에는 더 이상 데이터는 없다.
    }
  }  // 버퍼의 처리를 종료한다.
}  // 보류되고 있는 이벤트의 read를 종료한다.

도중에 메시지를 처리하지 않고 , 단지 메시지를 포트로부터 포트에 송신하는 경우는,IDirectMusicThru8 인터페이스를 사용한다. 더 자세한 정보는, 「IDirectMusicThru8::ThruChannel 」를 참조할것.

↑TOP