Pregunta

Estoy pensando en crear algún software que haga que el teclado funcione como un piano (por ejemplo, el usuario presiona la tecla 'W' y los parlantes tocan una nota D).Probablemente usaré OpenAL.Entiendo los conceptos básicos del audio digital, pero reproducir audio en tiempo real en respuesta a la pulsación de teclas plantea algunos problemas que me cuesta resolver.

Aquí está el problema: Digamos que tengo 10 buffers de audio y cada buffer contiene un segundo de datos de audio.Si tengo que llenar los buffers antes de que se reproduzcan a través de los parlantes, entonces estaría llenando los buffers uno o dos segundos antes de que se reproduzcan.Eso significa que cada vez que el usuario intenta tocar una nota, habrá un retraso de uno o dos segundos entre presionar la tecla y la nota que se toca.

¿Cómo se soluciona este problema?¿Haces los buffers lo más pequeños posible y los llenas lo más tarde posible?¿Hay algún truco que me falta?

¿Fue útil?

Solución

La mayoría de los sintetizadores de software no utilizan múltiples buffers.

Sólo utilizan un único y pequeño ringbuffer que se reproduce constantemente.

Un hilo de alta prioridad comprobará con la mayor frecuencia posible la posición de juego actual y llenará la parte libre (p. ej.la parte que se ha reproducido desde la última vez que se ejecutó el hilo) del ringbuffer con datos de sonido.

Esto le dará una latencia constante que sólo está limitada por el tamaño de su ring-buffer y la latencia de salida de su tarjeta de sonido (normalmente no tanta).

Puedes reducir tu latencia aún más:

En caso de que se toque una nueva nota (p. ej.el usuario acaba de presionar una tecla), verifica la posición de reproducción actual dentro del búfer circular, agrega algunas muestras por seguridad y luego vuelve a renderizar los datos de sonido con la nueva configuración de sonido aplicada.

Esto se vuelve complicado si tienes efectos basados ​​en el tiempo en ejecución (líneas de retardo, reverberación, etc.), pero es factible.Simplemente realice un seguimiento de los últimos 10 estados de sus efectos basados ​​en el tiempo cada milisegundo aproximadamente.Eso permitirá retroceder 10 milisegundos en el tiempo.

Otros consejos

Con la API de Windows, sólo se puede llegar tan lejos en términos de latencia. Por lo general, no se puede obtener a continuación 40-50ms que es bastante desagradable. La solución es implementar soporte ASIO en su aplicación, y hacer que el usuario ejecuta algo así como ASIO4ALL en el fondo. Esto hace que la latencia de hasta 5 ms, pero a un costo:. Otras aplicaciones no pueden reproducir sonido al mismo tiempo

Lo sé porque yo soy un usuario de FL Studio.

La solución es pequeños tampones, llenos con frecuencia por un hilo en tiempo real. Lo pequeño que hace los tampones (o lo lleno que deja que el búfer convertido con una memoria intermedia) se ve limitada por la programación de latencia de su sistema operativo. Es probable que encuentres 10ms para ser aceptable.

Hay algunas trampas desagradables en aquí para los no iniciados - en particular con respecto a la arquitectura de software y de hilo de seguridad.

Usted podría tratar de echar un vistazo a Juce - que es un marco multi-plataforma para la escritura de software de audio y, en particular - plugins de audio tales como softsynths y efectos. Incluye software para ambas muestras plug-ins y anfitriones. Es en el huésped que los problemas con el roscado se tratan sobre todo con.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top