¿Cuál es el tiempo de latencia (o retraso) para las devoluciones de llamada desde el método de la API waveOutWrite?

Estoy teniendo un debate con algunos desarrolladores en otro foro sobre cómo generar eventos MIDI con precisión (mensajes de Note On, etc.). El oído humano es bastante sensible a las pequeñas inexactitudes de sincronización, y creo que su principal problema proviene del uso de temporizadores de resolución relativamente baja que cuantifican sus eventos en intervalos de 15 milisegundos (que es lo suficientemente grande como para causar imprecisiones perceptibles).

Hace unos 10 años, escribí una aplicación de muestra (Visual Basic 5 en Windows 95) que era un sintetizador de software y un reproductor MIDI combinados. La premisa básica era un sistema de reproducción de búfer de salto con cada búfer con la duración de una décimo sexta nota (ejemplo: con 120 notas de un cuarto por minuto, cada nota de un cuarto fue de 500 ms y, por lo tanto, cada nota de la décimo sexta nota fue de 125 ms, por lo que cada tampón es de 5513 muestras). Cada búfer se jugó a través del método waveOutWrite, y la función de devolución de llamada de este método se utilizó para poner en cola el siguiente búfer y también para enviar mensajes MIDI. Esto mantuvo sincronizados el audio basado en WAV y el audio MIDI.

En mi opinión, este método funcionó perfectamente: las notas MIDI no sonaron ni un poco fuera de lugar (mientras que si utiliza un temporizador normal con una precisión de 15 ms para tocar notas MIDI, sonarán notablemente fuera de lugar).

En teoría, este método produciría una sincronización MIDI precisa para la muestra, o 0.0227 milisegundos (ya que hay 44.1 muestras por milisegundo). Dudo que esta sea la verdadera latencia de este enfoque, ya que presumiblemente hay un ligero retraso entre cuando finaliza un búfer y cuando se notifica la devolución de llamada de waveOutWrite. ¿Alguien sabe qué tan grande sería este retraso?

Respuestas a la pregunta(3)

Su respuesta a la pregunta