2011-05-12 11 views
6

He creado una versión de aplicación independiente de un proyecto que hasta ahora solo era una VST/unidad de audio. Estoy proporcionando soporte de audio a través de rtaudio.entrada midi en tiempo real y sincronización con audio

Me gustaría agregar soporte MIDI usando rtmidi pero no me queda claro cómo sincronizar las partes de audio y MIDI.

En VST/audiounit land, estoy acostumbrado a eventos MIDI que tienen una marca de tiempo que indica su desplazamiento en muestras desde el inicio del bloque de audio.

rtmidi proporciona un tiempo delta en segundos desde el evento anterior, pero no estoy seguro de cómo debo tomar esos eventos y cómo puedo calcular su tiempo en relación con la muestra actual en el hilo de audio.

¿Cómo hacen los hosts de complementos esto?

Entiendo cómo los eventos se pueden muestrear con precisión en la reproducción, pero no está claro cómo podrían ser precisos para la muestra al usar la entrada en tiempo real.

rtaudio me da una función de devolución de llamada. Me ejecutaré en un tamaño de bloque bajo (32 muestras). Supongo que pasaré un puntero a una instancia rtmidi como la parte de datos de usuario de la devolución de llamada y luego llamaré a midiin-> getMessage (mensaje &); dentro de la devolución de llamada de audio, pero no estoy seguro de si esto es sensible a los subprocesos.

Muchas gracias por cualquier consejo que me puedan dar

+0

MIDI nunca será preciso con la muestra, ni debe serlo. La información MIDI es relativamente lenta. – Brad

Respuesta

5

En su caso, usted no tiene que preocuparse por ello. Su programa debe enviar los eventos MIDI al plugin con una marca de tiempo cero tan pronto como lleguen. Creo que tal vez hayas malinterpretado la idea detrás de lo que significa ser "preciso para la muestra".

Como @Brad señaló en su comentario a su pregunta, MIDI es de hecho muy lento. Pero eso es solo una parte del problema ... cuando trabajas en un entorno basado en bloques, los eventos MIDI entrantes no pueden ser procesados ​​por el complemento hasta el comienzo de un bloque. Cuando las computadoras eran más lentas y los tamaños de bloque de 512 (o dios no lo permita,> 1024) eran comunes, esto introdujo una cantidad de latencia no trivial que hace que el arreglo no suene como "apretado". Por lo tanto, los secuenciadores idearon una forma inteligente de evitar este problema. Dado que los eventos MIDI ya se conocen con anticipación, estos eventos se pueden enviar al instrumento un bloque temprano con un desplazamiento en marcos de muestra. El complemento recibe estos eventos al comienzo del bloque y sabe que no debe comenzar a procesarlos realmente hasta que hayan pasado las muestras N. Esto es lo que significa "muestra precisa" en secuenciadores.

Sin embargo, si se trata de entradas en vivo desde un teclado u otro tipo de dispositivo MIDI, no hay forma de "programar" estos eventos. De hecho, para cuando los recibas, ¡el reloj ya está corriendo! Por lo tanto, estos eventos solo deben enviarse al complemento al inicio del siguiente bloque con un desplazamiento de 0. Secuenciadores como Ableton Live, que permiten que un complemento reciba simultáneamente eventos pre-secuenciados y en vivo, simplemente envían cualquier evento en vivo con un desplazamiento de 0 cuadros.

Dado que está utilizando un tamaño de bloque muy pequeño, el peor de los casos es una latencia de .7ms, que no está nada mal. En el caso de rtmidi, la marca de tiempo no representa un desplazamiento que necesita programar, sino el tiempo en que se capturó el evento. Pero como solo tiene la intención de recibir eventos en vivo (no es escribiendo un secuenciador, ¿verdad?), Puede simplemente pasar cualquier MIDI entrante al complemento de inmediato.

+0

gracias nik, eso lo hace más claro. Lo tengo funcionando – olilarkin

Cuestiones relacionadas