2010-11-15 7 views
7

Actualmente estoy trabajando en un proyecto personal: crear una biblioteca para la síntesis de audio en tiempo real en Flash. En resumen: herramientas para conectar wavegenerators, filtros, mezcladores, etc. entre sí y suministrar la tarjeta de sonido con datos brutos (en tiempo real). Algo como max/msp o Reaktor.¿Alguien tiene algún consejo sobre la programación de síntesis de audio en tiempo real?

Ya tengo algunas cosas útiles, pero me pregunto si la configuración básica que escribí es correcta. No quiero tener problemas después que me obliguen a cambiar el núcleo de mi aplicación (aunque eso siempre puede suceder).

Básicamente, lo que hago ahora es comenzar al final de la cadena, en el lugar donde los datos de sonido (en bruto) salen '(a la tarjeta de sonido). Para hacer eso, necesito escribir trozos de bytes (ByteArrays) en un objeto, y para obtener ese fragmento pido cualquier módulo que esté conectado a mi módulo 'Sound Out' para darme su parte. Ese módulo hace la misma solicitud al módulo que está conectado a su entrada, y eso sigue sucediendo hasta que se alcanza el inicio de la cadena.

¿Es este el enfoque correcto? Puedo imaginarme encontrándome con problemas si hay un feedbackloop, o si hay otro módulo sin salida: si tuviera que conectar un espectrumanalyzer en algún lugar, sería un callejón sin salida en la cadena (un módulo sin salidas, solo una entrada). En mi configuración actual, dicho módulo no funcionaría porque solo comencé a calcular desde el módulo de salida de sonido.

¿Alguien tiene experiencia con la programación de algo como esto? Estaría muy interesado en algunas ideas sobre el enfoque correcto. (Para mayor claridad: no estoy buscando implementaciones Flash específicas, y es por eso que no etiqueté esta pregunta en flash o actionscript)

Respuesta

1

Hice algo similar hace un tiempo, y utilicé el mismo enfoque que tú - Comience en la línea virtual y trace la señal de vuelta a la parte superior. Sin embargo, hice esto por muestra, no por buffer; si tuviera que escribir la misma aplicación hoy, podría elegir por buffer en su lugar, porque sospecho que funcionaría mejor.

El espectrómetro se diseñó como un módulo de inserción, es decir, solo funcionaría si tanto su entrada como su salida estuvieran conectadas, y pasaría su entrada a la salida sin cambios.

Para manejar la retroalimentación, tenía un módulo de ayuda especial que presentaba un retraso de 1 muestra y solo obtenía su entrada una vez por ciclo.

Además, creo que hacer todo tu procesamiento interno con flotadores, y por lo tanto matrices de flotadores como los buffers, sería mucho más fácil que los arrays de bytes, y te ahorraría el esfuerzo extra de convertir entre enteros y flotantes todo el hora.

0

En versiones posteriores, puede tener diferentes tasas de paquetes en diferentes partes de su red.

Un ejemplo sería si lo extiende para transferir datos hacia o desde el disco. Otro ejemplo sería que variables de control de baja velocidad de datos, tales como un eco-delay de control, pueden, más adelante, convertirse en parte de su red. Probablemente no desee procesar las variables de control con la misma frecuencia que procesa los paquetes de audio, pero todavía son 'en tiempo real' y parte de la red de funciones. Por ejemplo, pueden necesitar suavizado para evitar transiciones repentinas.

Mientras llames a todas tus funciones con la misma frecuencia y todas las funciones estén ocupando esencialmente tiempo constante, tu enfoque de extracción de datos funcionará bien. Habrá poco para elegir entre tirar datos y empujar. Tirar es algo más natural para reproducir audio, presionar es algo más natural para la grabación, pero cualquiera de los dos funciona y termina haciendo las mismas llamadas a las funciones de procesamiento de audio subyacentes.

  • Para el espectrómetro tienes el tema de varios sumideros para de datos, pero no es un problema. Introduzca un enlace ficticio desde el fregadero real. El enlace ficticio puede provocar una solicitud de datos que no es honrado. Siempre que el enlace simulado sepa es un maniquí y no le importa la falta de datos, todo será OK. Esta es una técnica estándar para reducir múltiples sumideros o fuentes a una sola.

  • Con este tipo de red, no desea hacer el mismo cálculo dos veces en una actualización completa. Por ejemplo, si mezcla una versión de alto y bajo paso de una señal, no quiere evaluar la señal original dos veces. Debe hacer algo como grabar un valor de marcación de temporizador con cada búfer y detener la propagación de tiradas cuando vea que el valor de tilde actual ya está presente. Este mismo mecanismo también lo protegerá contra bucles de retroalimentación en evaluación.

Entonces, esas dos cuestiones que le preocupan se abordan fácilmente dentro de su marco actual.

tarifa según los, donde hay diferentes tipos de paquetes en diferentes partes de la red es donde los problemas con el enfoque actual se iniciará. Si está grabando audio en un disco, para mayor eficiencia, querrá escribir fragmentos grandes con poca frecuencia. No desea bloquear el servicio de los pequeños paquetes de procesamiento de entrada y salida de audio más frecuentes durante esas escrituras. Una sola estrategia de tirar o empujar por sí sola no será suficiente.

Simplemente acepte que en algún momento puede necesitar una forma más sofisticada de actualización que una red de tarifa única. Cuando eso suceda necesitarás hilos para las diferentes tasas que se están ejecutando, o escribirás tu propio planificador simple, posiblemente tan simple como llamar funciones menos frecuentemente evaluadas una vez en n, para hacer que las tasas coincidan. No es necesario planificar con anticipación para esto. Es casi seguro que sus funciones de audio ya están delegando la responsabilidad de garantizar que sus búferes de entrada estén listos para otras funciones, y solo serán esas otras funciones las que deban cambiar, no las funciones de audio en sí mismas.

La única cosa que aconsejaría en esta etapa es que tener cuidado para centralizar búfer de audio asignación, notando que los tampones son como postes de cerca. No pertenecen a una función de audio , se encuentran entre las funciones de audio. La centralización de la asignación del buffer facilitará la modificación retrospectiva de la estrategia de actualización para diferentes tasas en diferentes partes de la red.

Cuestiones relacionadas