Latenza del sintetizzatore

Un'altra considerazione nella tempistica del sintetizzatore è la latenza, ovvero la differenza tra l'ora corrente e la prima volta che una nota può riprodurre. Non è possibile inviare un messaggio MIDI al sintetizzatore ed eseguire il rendering nel buffer di output al momento corrente del campione. È consigliabile effettuare un'indennità per i dati già inseriti nel buffer, ma che non sono ancora stati trasmessi al dispositivo di output dell'onda.

Il sink d'onda deve quindi implementare un clock di latenza, ovvero un oggetto IReferenceClock (descritto nella documentazione di Microsoft Windows SDK). Il metodo IReferenceClock::GetTime del clock di latenza recupera l'ora di esempio fino a cui i dati sono già stati scritti nel buffer e lo converte in ora di riferimento rispetto all'orologio master. Il sink wave esegue conversioni tra riferimento e ora di esempio con IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample, quindi in questo caso il synth chiama IDirectMusicSynthSink::RefTimeToSample per eseguire la conversione.

Il tempo di latenza è tutto gestito dal sink d'onda. L'implementazione del metodo IDirectMusicSynthSink::GetLatencyClock deve restituire un puntatore al clock di latenza e questo puntatore deve a sua volta essere recuperato da IDirectMusicSynth::GetLatencyClock. L'applicazione usa l'orologio di latenza per determinare il primo punto nel tempo in cui un messaggio MIDI può essere accodato per la riproduzione quando viene passato al sintetizzatore chiamando il metodo IDirectMusicSynth::P layBuffer .

Un esempio di latenza di un messaggio MIDI è illustrato nella figura seguente.

Diagramma che illustra la latenza di un messaggio MIDI in un ciclo di buffer PCM.

Nella figura precedente, l'orologio di latenza punta al primo posto nel ciclo del buffer PCM in cui è possibile riprodurre una nota. Si noti che l'orologio master è a 22 unità di tempo, ovvero il punto in cui il suono è attualmente riprodotto, ma lo spazio tra 22 e 30 unità di tempo è già stato riempito con dati di onda e non può più essere scritto in. Pertanto, il primo posto in cui è possibile programmare un nuovo evento MIDI con timestamp è al momento 30. Di conseguenza, l'orologio di latenza legge 30 unità di tempo.

I messaggi possono essere pianificati per essere riprodotti o in qualsiasi momento dopo, questo tempo di latenza. Di conseguenza, i messaggi di cui eseguire il rendering vengono contrassegnati immediatamente con il tempo di latenza (non l'ora corrente) prima di essere inseriti nel buffer di input del sintetizzatore.