Latencia del sintetizador
Otra consideración en el tiempo del sintetizador es la latencia, que es la diferencia entre la hora actual y la primera vez que se puede reproducir una nota. No se puede enviar un mensaje MIDI al sintetizador y representarse en el búfer de salida en la hora de ejemplo actual. Se debe asignar para los datos que ya se han colocado en el búfer, pero que aún no se han transmitido al dispositivo de salida de onda.
Por lo tanto, el receptor de ondas debe implementar un reloj de latencia, que es un objeto IReferenceClock (descrito en la documentación de Microsoft Windows SDK). El método IReferenceClock::GetTime del reloj de latencia recupera la hora de ejemplo hasta la que ya se han escrito los datos en el búfer y lo convierte en hora de referencia en relación con el reloj maestro. El receptor de ondas realiza conversiones entre la hora de referencia y la muestra con IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample, por lo que, en este caso, la síntesis llama a IDirectMusicSynthSink::RefTimeToSample para realizar la conversión.
El receptor de onda administra todo el tiempo de latencia. La implementación del método IDirectMusicSynthSink::GetLatencyClock debe generar un puntero al reloj de latencia y este puntero debe recuperarse a su vez por IDirectMusicSynth::GetLatencyClock. La aplicación usa el reloj de latencia para determinar el primer momento en el que se puede poner en cola un mensaje MIDI para reproducir cuando se pasa al sintetizador llamando al método IDirectMusicSynth::P layBuffer .
En la ilustración siguiente se muestra un ejemplo de la latencia de un mensaje MIDI.
En la ilustración anterior, el reloj de latencia apunta al primer lugar del bucle de búfer de PCM donde se puede reproducir una nota. Tenga en cuenta que el reloj maestro está en 22 unidades de tiempo, que es el punto desde el que el sonido está reproduciendo actualmente, pero el espacio entre 22 y 30 unidades de tiempo ya se ha rellenado con datos de onda y ya no se puede escribir en. Por lo tanto, el primer lugar donde se puede programar un nuevo evento MIDI con marca de tiempo es en el momento 30. Por lo tanto, el reloj de latencia lee 30 unidades de tiempo.
Los mensajes se pueden programar para reproducirse en, o en cualquier momento posterior, este tiempo de latencia. Por lo tanto, los mensajes que se van a representar inmediatamente se marcan con el tiempo de latencia (no la hora actual) antes de colocarse en el búfer de entrada del sintetizador.