Síntesis Modular con Processing

Introducción.

Buscando una herramienta para programar y experimentar con audio, efectos y síntesis, decidí probar la biblioteca Minim de Processing. Existen muchos entornos informáticos interesantes para diseñar sonido, algunos son gráficos, otros son de escribir código, algunos son libres, otros son pagos; cito algunos ejemplos: Reaktor, Max-MSP, PureData, SynthEdit, SynthMaker, JSyn, Csound, SuperCollider, ChucK.

Dentro de Processing, existen varias bibliotecas para manejar sonido, entre ellas: Ess, Sonia y Minim, siendo esta última la que viene con la distribución oficial del producto. Rápidamente, repasemos las principales ventajas e inconvenientes -a mi modesto entender- de Minim:

  • Ventajas: es simple, transparente, bastante bien documentada y Open Source.
  • Inconvenientes: utiliza Java Sound para comunicarse con el hardware de audio.

Muchas de las bibliotecas de Processing son justamente “wrappers” de las funcionalidades de Java. Minim utiliza Java Sound para el audio I/O, partes de otras bibliotecas para otras tareas -como reproducir mp3, por ejemplo- pero también agrega cosas propias e interesantes, en materia de análisis, procesamiento y generación de sonido. A su vez, uno de los principales inconvenientes del sistema de audio de Java es que no soporta ASIO, que como todos sabemos, es la única manera de obtener baja latencia, al menos bajo Windows XP.

¿Cómo funciona la generación de sonido a nivel de software?

El audio digital, a nivel del software, se maneja en buffers. Un buffer es un conjunto de muestras -por ejemplo, 1024 muestras- que se envían o se reciben en bloque hacia o desde el hardware. Mientras la tarjeta de audio reproduce esas 1024 muestras (lo que le llevará 23ms, si el muestreo es de 44,1KHz), el programa tiene tiempo de calcular el bloque siguiente. Cuanto más grande sea el buffer, o sea cuantas más muestras contenga, mayor será la latencia de la que hablábamos en el párrafo anterior (más información sobre buffers y latencia aqui).

En Minim, la clase Oscillator es la base de los generadores de sonido. Cuando se llama al método “generate”, este “llena” un buffer con una forma de onda calculada de alguna manera, por ejemplo con la función trigonométrica seno.

Una consecuencia interesante de esta naturaleza de Minim, es que si nosotros intentamos modificar un parámetro de la onda que se está generando -por ejemplo su amplitud o su frecuencia- desde el módulo principal (la Draw() de Processing) ya sea a partir de un control externo o de una función prefijada, los cambios se van a manifestar de a “saltos” equivalentes a la duración del buffer (23ms, en el ejemplo que veíamos). Esto nos impide hacer un cambio gradual y continuo de cierto parámetro, por ejemplo una envolvente de amplitud. Para lograr este tipo de control, necesitamos implementar otro “Oscillator” que genere la señal de control, y que el primer “Oscillator” consulte a esa señal al calcular cada muestra que pone en el buffer.

Aplicando esta idea a diversos módulos de la biblioteca, e implementando algunos módulos nuevos, surgió la Minim 2.02 PE (palmer edition), con la cual podemos hacer una modesta síntesis modular, que paso a describir y ejemplificar en la página a continuación.

 

Siguiente sección –> Minim 2.02 Palmer Edition

 

Compártelo:
  • Print this article!
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

No hay Comentarios »

No hay comentarios aún.

RSS alimentación de los comentarios de esta entrada. TrackBack URL

Dejar un comentario