合成器計時的另一個考慮因素是延遲,這是當前時間與音符首次播放時間之間的差異。 MIDI 訊息無法在目前的取樣時間提交至合成器並渲染至輸出緩衝區。 應該允許已放置在緩衝區中但尚未流式傳輸到波輸出設備的數據。
因此,波浪接收應該實作延遲時鐘,這是 IReferenceClock 物件 (在 Microsoft Windows SDK 檔中所述) 。 延遲時鐘的 IReferenceClock::GetTime 方法會擷取數據已寫入緩衝區的取樣時間,並將此轉換成相對於主要時鐘的參考時間。 波形接收會使用 IDirectMusicSynthSink::SampleToRefTime 和 IDirectMusicSynthSink::RefTimeToSample 在參考和取樣時間之間進行轉換,因此在此情況下,合成器會呼叫 IDirectMusicSynthSink::RefTimeToSample 來完成轉換。
延遲時間全部由波浪匯管理。 IDirectMusicSynthSink::GetLatencyClock 方法的實作應該輸出延遲時鐘的指標,而此指標必須由 IDirectMusicSynth::GetLatencyClock 擷取。 應用程式會使用延遲時鐘來判斷 MIDI 訊息在呼叫 IDirectMusicSynth::PlayBuffer 方法傳遞至合成器時,可以排入佇列進行播放的最早時間點。
MIDI 訊息延遲的範例如下圖所示。
在上圖中,延遲時鐘指向 PCM 緩衝區迴圈中可以播放音符的第一個位置。 請注意,主時鐘位於 22 個時間單位,這是當前播放聲音的點,但 22 到 30 個時間單位之間的空間已經被波數據填滿,無法再寫入。 因此,可以安排播放新的帶有時間戳記的 MIDI 事件的第一個位置是時間 30。 因此,延遲時鐘讀取 30 個時間單位。
訊息可以排程在此延遲時間播放,或在此延遲時間之後的任何時間播放。 因此,要立即轉譯的訊息會在放置在合成器的輸入緩衝區之前,先戳上延遲時間 (而不是目前時間) 。