신시사이저 대기 시간
신시사이저 타이밍의 또 다른 고려 사항은 대기 시간이며, 이는 현재 시간과 노트가 재생할 수 있는 첫 번째 시간 간의 차이입니다. MIDI 메시지를 신시사이저에 제출하여 현재 샘플 시간에 출력 버퍼로 렌더링할 수 없습니다. 버퍼에 이미 배치되었지만 아직 웨이브 출력 디바이스로 스트리밍되지 않은 데이터에 대해 허용량을 만들어야 합니다.
따라서 웨이브 싱크는 IReferenceClock 개체(Microsoft Windows SDK 설명서에 설명됨)인 대기 시간 클록을 구현해야 합니다. 대기 시간 클록의 IReferenceClock::GetTime 메서드는 데이터가 버퍼에 이미 기록된 샘플 시간을 검색하고 이를 master 클록을 기준으로 참조 시간으로 변환합니다. 웨이브 싱크는 IDirectMusicSynthSink::SampleToRefTime 및 IDirectMusicSynthSink::RefTimeToSample을 사용하여 참조와 샘플 시간 간의 변환을 수행하므로 이 경우 synth는 IDirectMusicSynthSink::RefTimeToSample 을 호출하여 변환을 수행합니다.
대기 시간 시간은 모두 웨이브 싱크에서 관리됩니다. IDirectMusicSynthSink::GetLatencyClock 메서드의 구현은 대기 시간 클록에 대한 포인터를 출력해야 하며, 이 포인터는 IDirectMusicSynth::GetLatencyClock에 의해 검색되어야 합니다. 애플리케이션은 대기 시간 클록을 사용하여 IDirectMusicSynth::P layBuffer 메서드를 호출하여 MIDI 메시지가 신시사이저에 전달될 때 재생 대기할 수 있는 가장 빠른 시점을 결정합니다.
MIDI 메시지의 대기 시간의 예는 다음 그림에 나와 있습니다.
앞의 그림에서 대기 시간 클록은 노트를 재생할 수 있는 PCM 버퍼 루프의 첫 번째 위치를 가리킵니다. master 시계는 현재 소리가 재생되는 지점인 22시간 단위이지만 22~30시간 단위 사이의 공간은 이미 웨이브 데이터로 채워져 더 이상 쓸 수 없습니다. 따라서 새로운 타임스탬프를 받은 MIDI 이벤트가 재생되도록 예약할 수 있는 첫 번째 장소는 30시입니다. 따라서 대기 시간 클록은 30개의 시간 단위를 읽습니다.
메시지는 이 대기 시간 이후 언제든지 재생되도록 예약할 수 있습니다. 따라서 즉시 렌더링할 메시지는 신시사이저의 입력 버퍼에 배치되기 전에 대기 시간(현재 시간이 아님)으로 스탬프됩니다.