Universitat Oberta de Catalunya

Audio en Processing

Introducción

Es bien conocido que Johann Sebastian Bach, además de haber sido uno de los compositores más importantes de la historia de la música y un brillante organista y clavecinista, era también un experto conocedor del arte de la construcción de órganos. Trabajó con Johann Scheibe, Gottfried Silbermann, Zacharias Hildebrandt, Tobias Heinrich Gottfried Trost… con todos y cada uno de los constructores de órganos más destacados de la Alemania (del Sacro Imperio Romano Germánico para ser más exactos) de la época, y fue invitado a probar y evaluarlos nuevos órganos que se construían o reparaban en cada rincón del país asiduamente.

Y no fue sólo Bach quien mostró un gran interés en la construcción de algún tipo de instrumento. Haynd, Mozart, Beethoven, Wagner… la lista de compositores que se relacionaron con los constructores de instrumentos más prestigiosos de sus respectivas épocas o que siguieron con atención los avances técnicos que se producían en el arte de su fabricación sería realmente extensa.

De hecho, lo extraño hubiera sido que no hubieran mostrado interés. El compositor, el músico en general, a lo largo de la historia de la música, no ha sido un mero espectador, no ha vivido al margen de las innovaciones materiales en el campo de la música. Vemos en las películas a Mozart decirle a Salieri que ya ha compuesto la obra que le encargó, que la tiene en la cabeza y que sólo necesita pasarla a papel, o a Beethoven componiendo completamente sordo. Y, aunque es cierto que el proceso de creación musical puede ser un acto mental casi independiente de factores externos, la verdad es que, de todas formas, todos ellos estuvieron muy condicionados -cómo es muy lógico por otra parte- por las posibilidades materiales (instrumentos e instrumentistas) que tuvieron a su disposición.

Sólo por poner un ejemplo, Beethoven, figura clave del romanticismo musical, revolucionario tanto musical como socialmente, paradigma de creador libre y enérgico, sólo escribió para piano más agudo de Fa6 en 4 ocasiones antes de 1803 . La razón fue muy sencilla: entre 1770 y 1880 el teclado estándar de un piano tenía un ámbito de 5 octavas (Fa1-Fa6). Es a partir de 1880 cuando casi todos los pianos tienen ya 6 octavas y sobre el 1820, 6 octavas más una cuarta. Por muy revolucionario que fuera y barreras que derribara, sus partituras para piano estuvieron durante toda su vida condicionadas al desarrollo del mismo.

Sin embargo, no han llegado a nosotros documentos que testimonien la participación directa de Bach en la construcción de ningún órgano (aunque con dos mujeres, 20 hijos y más de 1.000 obras compuestas es posible que no tuviera mucho tiempo libre) o que Beethoven (cansado de las limitaciones a las que estaba sujeto en la escritura para piano) intentara personalmente añadirle teclas a su limitado instrumento. Como mucho, algunos compositores de éxito como Richard Wagner, tuvieron el suficiente reconocimiento y poder económico como para ordenar la construcción de instrumentos a medida – es el caso, por ejemplo, de la tuba wagneriana para su tetralogía “El anillo del nibelungo”.

La revolucionaria aparición de la música electrónica en el siglo XX

Sería complicado explicar en un artículo todos los cambios que se produjeron en el mundo de la música, y en el del arte en general, en el siglo XX. Incluso es posible que nadie los entienda aún por completo y que todavía sea necesario que pasen algunos años antes de que se puedan analizar correctamente.

Lo que sí se puede afirmar con rotundidad, y sin miedo a equivocarse, es que la aparición de la música electrónica fue un hecho revolucionario que, entre otras muchas cosas, supuso el final de la sumisión del compositor (¡aunque ya en el siglo XX deberíamos hablar de artista sonoro!) al yugo del timbre de los instrumentos o de las escalas diatónica o cromáticas.

En su conocido “La estética musical desde la Antigüedad hasta el siglo XX”, Enrico Fubini afirma que “[…] la música electrónica se presenta como el acto revolucionario más radical que se acomete en el seno de la tradición de la música occidental. La novedad técnica que comporta esta música concierne, ante todo, a la posibilidad que brinda al compositor de plasmar el sonido a su antojo.  […] La música electrónica se podría interpretar, de la manera más simplista, como una ampliación de las posibilidades materiales a disposición del compositor.”

Una de las nuevas “posibilidades materiales” de las que habla Fubini surgió a finales de la década de los 50. Max Mathews, trabajando en los laboratorios Bell, desarrolló MUSIC I (o simplemente MUSIC), el primer programa para la síntesis y procesamiento digital de sonido por computadora. Y, como veremos más adelante, la forma en que se programaba con MUSIC (utilizando unit generators) y, más tarde, toda la familia de programas y lenguajes de programación MUSIC-N tuvo tanto éxito que ha sido adoptada por los modernos programas Max, Csound, Pure Data, Super Collider, Nyquist, Reaktor,  Tassman….

Este tipo de programas son una de las posibilidades materiales más sobresalientes a disposición del compositor y artista sonoro actualmente y, como defenderemos en este artículo, Processing (más la biblioteca de audio Beads) ya forma parte de este selecto listado de programas.

Introducción a Processing

Para una introducción a Processing más detallada, extensa y con enlaces a todo tipo de recursos, remitimos al lector al artículo de Quelic Berga publicado también en Mosaic “Introducción a Processing”.

Aquí nos limitaremos a presentar las características más sobresalientes de Processing y las que nos permitan continuar con agilidad y claridad hacia el objetivo del artículo.

Processing es un lenguaje de programación de código abierto y un entorno de desarrollo integrado (lo que se viene a conocer como IDE, del inglés integrated development environment), orientado a la creación de imágenes, animaciones, interactivos y aplicaciones de audio.

Fue iniciado en el año 2001 por Casey Reas y Ben Fry, siendo aun estudiantes de la MIT Media Lab., con la idea de crear una nueva aplicación que les permitiera  enseñar a personas no programadoras los fundamentos de la programación ayudándose de un contexto visual.

Esta idea es de fácil comprensión con la ayuda de la siguiente imagen:

En la ventana de la izquierda (el entorno de desarrollo integrado o IDE) hemos creamos un programa escrito en lenguaje Processing. Este lenguaje de programación está basado en Java y trabaja con clases, funciones, objetos, datos, operaciones matemáticas,… Por tanto, podemos afirmar que es un lenguaje muy válido para enseñar fundamentos de programación en general y programación orientada a objetos en particular. La diferencia con otros lenguajes reside en que el resultado de este código es un “resultado visual”. Por ejemplo, el estudiante define una función “line”, ejecuta el programa y observa que una línea aparece en el display. Los valores de las variables o las funciones dejan de ser inescrutables entes para pasar a determinar el grosor, la posición o la forma de los objetos en la pantalla. Cualquier línea de código que se programa se convierte en algo que el alumno puede ver representado en la pantalla de ordenador.

Paralelamente a este objetivo, otra de las finalidades iniciales de Processing fue la de hacer que además sirviera de software de pruebas, prototipos o bocetos de ideas a desarrollar (software sketchbook). Sin embargo, su potencia e infinitas posibilidades hicieron que rápidamente superara los objetivos iniciales definidos por sus creadores y se convirtiera también en una herramienta de trabajo profesional.

Como ya hemos indicado al inicio de este apartado, no entraremos en detalle en explicar todas las características de Processing, ni a listarlas, pero sí que, antes de seguir,  nombraremos algunas de las más destacadas o a las que necesitemos hacer referencia más adelante al hablar de audio.

Así pues, no está de más subrayar que

•    Processing es un programa gratuito y de código libre.
•    Processing (como lenguaje de programación) está basado en Java.
•    Actualmente es desarrollado y mantenido por una pequeña comunidad de voluntarios (http://www.processing.org/about/people/).
•    Se distribuye bajo las licencia GNU GPL y GNU LGPL.
•    Puede ser utilizado tanto para aplicaciones locales como para aplicaciones para la web (Applets).
•    Processing dispone de una gran cantidad de bibliotecas que extienden su ámbito de trabajo inicial.

Processing y audio

Si leemos con atención la definición de Processing publicada en la home de processing.org, observamos que el desarrollo de aplicaciones de audio no está incluido entre sus características fundamentales:

“Processing is an open source programming language and environment for people who want to create images, animations, and interactions.”

Image, animation and interactions… Nada sobre audio.

Es más adelante cuando se indica que son sus bibliotecas (del inglés libraries) las que permiten extender las posibilidades del software con audio, video, 3D, visión por ordenador,  etc. Para los no introducidos en el mundo de la programación, una biblioteca (en un contexto informático) es un conjunto de subprogramas que pueden integrarse en una aplicación, simplificando así su desarrollo. En otras palabras, es código ya escrito, muy útil y fácil de insertar en el programa que se esté desarrollando, facilitando mucho la tarea de programación (como algunos dicen, hace el “trabajo sucio” de la tarea de programar).

Processing viene con algunas bibliotecas incluidas. Es decir, se instalan automáticamente junto con el programa. Pero también es posible aumentar las posibilidades de la aplicación instalando otras bibliotecas desarrolladas, documentadas y mantenidas por miembros de la comunidad de Processing.

En el ámbito del audio, dentro de las bibliotecas incluidas en Processing contamos con Minim.

•    Minim
•    Minim es la biblioteca de audio que viene incluida por defecto en Processing, Utiliza la API JavaSound y, en menor medida, algunos componentes de Tritonus y MP3SPI de Javazoom. Esta biblioteca permite integrar audio en proyectos de Processing de forma sencilla, pero sin renunciar a la flexibilidad que necesitan los usuarios más avanzados. Aun así, como veremos más adelante, no es una biblioteca fácil de utilizar ni muy apreciada por los creadores de aplicaciones de audio y artistas sonoros.

Como ya queda dicho, estas contributed audio libraries no vienen incorporadas en el programa Processing y deben ser instaladas manualmente. Aunque igual la palabra “instalar” no sea la adecuada, ya que simplemente hay que copiar estas bibliotecas en la carpeta “libraries” de Processing para que éste las pueda utilizar.

Entre las contributed libraries encontramos bibliotecas MIDI para permitir a Processing interactuar con los dispositivos MIDI que se tengan instalados en el equipo, bibliotecas para la ayuda a la composición musical, varias bibliotecas para la reproducción, síntesis, análisis, manipulación y grabación de audio, etc.

Como veremos más adelante, también existen varias bibliotecas de tipo “envoltorio” (traducción un poco confusa del término inglés wrapper). Todo y que Processing esté basado en Java, no es JAVA, y en él no pueden utilizarse directamente bibliotecas escritas en este lenguaje. Para poder utilizar una biblioteca JAVA en Processing hay que crear un programa que controle el acceso, es decir, hay que crear una biblioteca wrapper que permita utilizar una biblioteca de JAVA en el entorno Processing.

A continuación listaremos estas bibliotecas de audio, junto a una sucinta explicación de cada una de ellas:

•    p5_sc 
Esta librería permite a Processing utilizar algunos elementos del potente motor de síntesis de SuperCollider, como por ejemplo, crear y manipular objetos de tipo Synth, Buffer y Bus.
•    Tactu5
 La librería Tactu5 está enfocada a la creación de música algorítmica en tiempo real. No incorpora ningún generador de audio (aunque puede integrarse fácilmente con Csound, PureData, SuperCollider, etc.) y sus clases están orientadas a definir elementos musicales como notas, clusters o secuencias, operar sobre ellos utilizando operaciones algorítmicas e insertarlos en una partitura musical.
•    jm-Etude 
jm- Etude es un envoltorio (wrapper) de jMusic para Processing. Es decir, esta librería permite a Processing comunicarse con jMusic, una potente biblioteca de análisis y composición musical, procesamiento de audio y actuaciones musicales interactivas.
•    Ess r2 
Ess r2 es una biblioteca que permite al usuario reproducir, manipular, analizar y guardar archivos de audio existentes o generados en tiempo real (formas de onda sinusoidales, cuadrada, triángulo, diente de sierra, ruido blanco y rosa).
•    ttslib 
ttslib es un wrapper de FreeTTS para Processing. FreeTTS es un sintetizador de voz escrito en JAVA.
•    Sonia
 Sonia en una biblioteca de audio para la reproducción, grabación, síntesis y análisis de audio que utiliza el plugin JSyn de Phil Burk.
•    SoundCipher
 La librería SoundCipher proporciona a Processing una sencilla interfaz para “tocar notas” con el sintetizador JavaSound,  reproducir ficheros de audio y comunicarse vía MIDI.
•    Echonestp5
 La librería echonestp5 es una librería también de tipo wrapper que tiene como función simplificar el uso de la API Echo Nest para el análisis y recomendaciones de canciones.
•    themidibus
 The MidiBus es una biblioteca MIDI que permite a Processing  interactuar de forma sencilla con los dispositivos MIDI que se tengan instalados en el equipo.
•    proMidi
 Al igual que The MidiBus, proMIDI es una biblioteca que permite a Processing enviar y recibir mensajes MIDI.

Biblioteca Beads para Processing

El usuario que esté efectuando su primera aproximación al tema del audio en Processing a través de este artículo podría deducir, sobretodo en base al apartado anterior, que este programa siempre ha sido una potente herramienta para la creación de aplicaciones de audio. Sin embargo, esto no siempre ha sido así.

Aunque la librería que incorpora por defecto Processing para trabajar con audio, Minim, teóricamente ya proporciona todas las herramientas necesarias para la creación sonora y musical, la verdad es que nunca ha llegado a gustar a los desarrolladores y artistas sonoros.

En processing.org, sobre Minim, podemos leer:

“A simple API while still providing a reasonable amount of flexibility for more advanced users”.

Esta simple presentación ya nos tendría que hacer sospechar. ¿Razonable? ¿Cuál es la cantidad razonable de flexibilidad que necesita un usuario avanzado? ¿No volveremos a estar trabajando con “teclados de 5 octavas” como Beethoven?

Y las demás bibliotecas de audio presentadas en el anterior apartado, si bien aportan algunas herramientas muy interesantes, ninguna de ellas ha sido nunca considerada como la biblioteca de audio con mayúsculas para Processing.

Pero la biblioteca de audio con mayúsculas para Processing existe. Y se llama Beads.

¿Qué es Beads?

Beads es una biblioteca escrita en Java (también hay una versión para Processing) para trabajar con audio en tiempo real. Se trata de un proyecto de código abierto iniciado por Ollie Bown en el año 2008. La potencia de esta magnifica herramienta para la creación de aplicaciones de audio o arte sonoro reside en que aúna con acierto las  mejores cualidades del lenguaje de programación Java y los conceptos de programación de aplicaciones como Max, Pure Data, Reaktor… Cualquier usuario familiarizado con alguno de estos programas encontrará en Beads una sencilla y potente herramienta de trabajo.

La biblioteca Beads no está incluida con el programa Processing, por tanto, lo primero que debemos hacer es instalarla. En su página web www.beadsproject.net podemos encontrar la Beads Library for Processing, la descargamos e instalamos en la carpeta “library” de Processing.

Conceptos básicos de Beads: unidades generadoras

Anteriormente ya nombramos las unidades generadoras (unit generator) de Max Mathews y su programa MUSIC. Una Ugen o unit generator (unidad generadora) es un pequeño bloque atómico y predefinido de audio con alguna (no es obligatorio) entrada de audio y salidas. Ejemplos de UGen serían los osciladores, filtros, amplificadores, generadores de envolvente, etc. Una UGen puede ser inicializada y conectada a otras UGens creando lo que acostumbra a llamar Patch o instrumento.

Esta forma de programar ha sido adoptada por Max, Pure Data, Super Collider, Nyquist, Reaktor o Tassman.. y Beads.

En mis clases sobre Reaktor, después de haber explicado el funcionamiento de algunos sintetizadores (Absynth, Massive,..), samplers (Kontakt, MOTU MachFive,…), procesadores de efectos (plugins de Waves, SONY,..), etc. siempre empezaba preguntando si Reaktor era un sintetizador, un sampler, un procesador de efectos o, tal vez, una caja de ritmos. Y la respuesta era que no era nada de eso, pero que podía crear todas esas cosas. Siempre presentaba a Reaktor como una enorme caja de cables, botones, piezas,.. todo tipo de sencillos artilugios que combinados con conocimiento se convierten en aplicaciones de audio. Este concepto, esta forma de entender Reaktor puede extrapolarse a Beads.

Así pues, todo en la biblioteca Beads está encapsulado en lo que se llama una unidad generadora (unit generator). Es muy sencillo de visualizar. Al igual que con el ejemplo de Reaktor, podemos pensar que disponemos de una gran caja de herramientas (que llamaremos Beads), con un montón de pequeñas piezas pequeñas dentro (los unit generator) que pueden ser conectadas entre sí. Entre estas piezas encontramos un oscilador (WavePlayer), un control de volumen (Gain), un deslizador (Glide), una envolvente (Envelope), filtros (OnePoleFilter, LPRezFilter, …), Efectos (Reverb, Panner, …),… Cualquier pieza que necesitemos para construir un “instrumento” se encuentra en esa caja de herramientas. Todas tienen una única y clara función. No existe una pieza que sea un sintetizador con filtros y efectos, esto sería el producto de conectar diferentes piezas. Evidentemente, las piezas por sí solas carecen de utilidad, debemos conectarlas -¡y correctamente!- entre sí para obtener algo útil.

Hay una pequeña diferencia que tal vez algún conocedor de Reaktor ya haya detectado. En Reaktor, en la caja de herramientas, están todas las herramientas (objetos matemáticos, objetos de diseño, etc.), mientras que en la biblioteca Beads sólo están los objectos de audio, que se complementarán con otros objectos de otras bibliotecas de Processing.

Entrando ya en detalles, entre estas piezas de Beads, hay una especial que recibe el nombre de AudioContext. Siguiendo con el símil de la caja de herramientas y las piezas atómicas, el AudioContext sería la carcasa, el recipiente donde vamos a poner las demás piezas conectándolas unas a otras.

Pero dejémonos de complicada teoría y vamos a ver un pequeño ejemplo de código. En este sencillo ejemplo vamos a utilizar sólo dos objetos de Beads: el AudioContext y el WavePlayer.
Como ya hemos dicho. el objeto AudioContext se trata de la “carcasa” y el objeto WavePlayer es usado para generar una forma de onda básica, como puede ser una onda sinusoidal.
Aquí hemos utilizado la palabra objeto. Podemos llamarlo indistintamente objeto o unidad generadora, ya que ésta es simplemente un tipo de objeto.

El código es el siguiente:


// Ejemplo01.pde
// hay que importar la biblioteca Beads

import beads.*;
// creamos el objeto AudioContext 
AudioContext ac;
void setup() {
// indica la dimension de la ventana Display de Processing

     size(400, 300);
// inicializamos el objeto AudioContext
     ac = new AudioContext();
// creamos un objeto de tipo WavePlayer
// vamos a asignarle una frecuencia de 440 Hz

// y una forma de onda senoidal
     WavePlayer wp;

     wp = new WavePlayer(ac, 440, Buffer.SINE);
     // conectamos el WavePlayer al AudioContext
     ac.out.addInput(wp);
     // iniciamos el audio
     ac.start();
}

Con este sencillo código, hemos construido un simple sintetizador que emite a volumen constante e ininterrumpidamente un sonido puro (sinusoide) a una frecuencia de 440 Hz.

Ahora vamos a implementar el mismo programa, pero añadiendo un objeto Gain, lo que permitirá controlar el volumen del objeto WavePlayer.


// Ejemplo02.pde
// importamos la biblioteca beads
 import beads.*;
// creamos el objeto AudioContext
 AudioContext ac;
void setup() {
     size(400, 300);
     // inicializamos el objeto AudioContext
     ac = new AudioContext();
     // creamos un objeto de tipo WavePlayer
     // vamos a asignarle una frecuencia de 440 Hz

     //  y una forma de onda sinusoidal
     WavePlayer wp;

     wp = new WavePlayer(ac, 440, Buffer.SINE);
     // creamos el objecto Gain
     // le asignamos 1 input y output
     // con un volumen fijo de 0.2 (50%)
     Gain g;
g = new Gain(ac, 1, 0.2);
     // conectamos la salida del WavePlayer output al Gain input
     g.addInput(wp);
     // conectamos el Gain output al AudioContext
     ac.out.addInput(g);
     // iniciamos el audio
     ac.start();
     }

Por ejemplo, este último código, en Reaktor equivaldría a:

Otro objeto básico a añadir a los ya vistos, es el objecto Glide. El objeto Glide (deslizador) se utiliza para enviar datos numéricos a otros objectos de la biblioteca Beads. Con este objecto podemos, por ejemplo, controlar la frecuencia de un WavePlayer o el valor del volumen de un objeto Gain.

Con sólo estos 4 objetos (AudioContext, WavePlayer, Gain y  Glide) y las operaciones matemáticas necesarias, ya estamos en disposición de crear sintetizadores aditivos, FM o de modulación en anillo.

Síntesis con Beads

En este apartado veremos algunos sencillos ejemplos de sintetizadores desarrollados con Beads.

Ya no mostraremos todo el código de cada uno de ellos, si no que hemos insertado un applet de Java para cada uno de los ejemplos. Como ya se indicó en el apartado “Introducción a Processing”, un proyecto de Processing puede exportarse como applet e incrustarse y ejecutarse en un navegador web.

Síntesis aditiva

El primer ejemplo que vamos a ver es un típico sintetizador de síntesis aditiva en el que vamos a sumar a  una onda sinusoidal sus primeros 9 armónicos. En este tipo de síntesis, la frecuencia más baja recibe el nombre de frecuencia fundamental y, en el ejemplo, es controlada con la posición del puntero del ratón a lo largo del eje de coordenadas X.

Síntesis por modulación de frecuencia

El siguiente ejemplo es un sintetizador de síntesis por modulación de frecuencia. Ahora, la posición del puntero del ratón a lo largo del eje de coordenadas Y controlará la portador y la posición del puntero a lo largo del eje X determinará la frecuencia de la moduladora.

Síntesis por modulación en anillo

La síntesis por modulación en anillo es tan sencilla como multiplicar dos ondas sinusoidales. Una popular modificación de este tipo de síntesis recibe el nombre de síntesis por modulación de amplitud (AM).

En nuestro ejemplo, la posición del puntero a lo largo de los ejes X e Y controlarán la moduladora y la portadora respectivamente.

Uso de envolventes en la síntesis por modulación de frecuencia

Aprovecharemos este último ejemplo para introducir un nuevo objeto de Processing: Envelope (envolvente). En audio digital, una envolvente es una función que permite controlar variables como la amplitud y la frecuencia a lo largo del tiempo.

En este ejemplo utilizamos una envolvente para controlar la amplitud del sintetizador, evitando que ahora suene indefinidamente y que pase a tocar “notas” cada vez que clicamos sobre el display.

Nota: Este ejemplo no funciona si se usa después de los ejemplos anteriores. Puede cargarse la página de nuevo (F5) para usarlo.

Más clases de Beads

Está fuera del objetivo del presente artículo hacer un listado exhaustivo de todos las clases de Beads y explicar su funcionamiento (para ello aconsejamos al lector que consulte el “Beads Quick Reference”, donde podrá encontrar un listado y documentación de los clases más útiles de Beads).  Lo que sí puede afirmarse es que resulta difícil imaginar una clase que falte.

Citaremos algunos de las más importantes para que el lector pueda hacerse una idea de las posibilidades de esta biblioteca.

Sampling

•    Sampler: el objecto SamplePlayer es el objeto de Beads que permite cargar y reproducir un archivo de audio existente.
•    Síntesis granular: el objecto GranularSamplePlayer está diseñado para realizar síntesis granular con Beads.

Efectos

•    Retardos: Beads utiliza la combinación de los objectos TapIn y TapOut para diseñar efectos de tipo delay.
•    Filtros: Beads dispone de varios objetos construidos de tipo filtro. Entre ellos el OnePoleFilter, LPRezFilter ( filtro resonante pasa bajos), AllpassFilter
•    (un simple all-pass filtro con retardo variable), BiquadFilter (este objeto permite implementar diferentes diseños de filtros), CombFilter (implementa un filtro de tipo comb filter), etc.
•    Otros efectos: el objecto Panner implementa el efecto de panoramización, el Reverb permite crear efectos de reverberación, Compressor como efecto de dinámica, WaveShaper (para producir efectos de distorsión, por ejemplo), etc.

Grabación

•    El objecto RecordToSample permite guardar audio en un buffer (otro objeto) que recibe el nombre de Sample.

Audio Input

•    Beads puede capturar el audio entrante (la entrada de la tarjeta de sonido) y aplicarle grabarlo, aplicarles síntesis granular o efectos en tiempo real.

Análisis

•    FFT: el objecto FFT  nos permite obtener el espectro de un sonido
•    Frecuencia: los objectos Frequency y SpectralPeaks sirven para determinar la frecuencia o frecuencias predominantes de un sonido
•    Detector de peaks: el objeto PeakDetector es muy útil para detectar las pulsaciones de un sonido.

Otros

•    Reloj: el objeto Clock permite generar eventos a un ritmo especificado y puede utilizarse para hacer sincronizaciones a un determinado tiempo.

Implementación y modificación de objetos. Flexibilidad.

Los programadores con conocimientos de JAVA y procesado de señal encontrarán en Beads un entorno de trabajo ideal, ya que los límites los pondrá él. Beads proporciona diferentes herramientas para que el programador pueda ampliar o modificar las funcionalidad de un unit generator o, directamente, crear uno nuevo.

Veamos un sencillo ejemplo para ilustrar cómo funciona. En el código del applet del ejemplo “Síntesis por modulación de frecuencia” se ha tenido que definir un oscilador con forma de onda sinusoidal y frecuencia 40 Hz.


// declare our unit generators
WavePlayer modulator;
modulator = new WavePlayer(ac, 40, Buffer.SINE);

El problema con el que nos encontramos es que la función “sine”, por defecto, tiene valores de salida entre -1.0 y 1.0, y nosotros necesitaríamos valores más grandes. Una de las herramientas a las que nos referíamos antes es la clase Function de Beads, que permite sobrescribir cualquier función definida en la unit generator. De forma más coloquial, Beads nos permite “abrir” un objecto y modificarle sus características o definir alguna nueva. En el ejemplo que nos ocupa, el de modificar el rango de valores de la función “sine” el código que realizaría esta acción sería:


// vamos a sobrescribir la función calculate
// del objeto modulator
Function frequencyModulation = new Function(modulator) { 
     public float calculate() {
         // y sustituimos el original return x[0]
         // por la siguiente operación matemática
         // que provoca que ahora el rango de valores
         // de la sinusoide esté entre 150 y 250
         return (x[0] * 50.0) + 200.0;
     }
};

Beads y otras bibliotecas

Para finalizar con las características de Beads, en realidad es una característica de Processing o de cualquier lenguaje de programación que trabaje con bibliotecas, no está de más subrayar que los objetos de Beads pueden combinarse -interactuar- con cualquier objecto de otra biblioteca. Esto que es una obviedad para cualquier programador principiante, puede no serlo tanto para los que nunca se han iniciado en el mundo de la programación.

Ilustraremos la afirmación anterior presentando un último applet de Processing: plo. Este applet ha sido desarrollado por Geoffroy Tremblay utilizando las bibliotecas de Processing Beads y controlP5. ControlP5 es una librería que nos permite crear fácilmente objetos gráficos tales como botones, deslizadores, pulsadores, campos de texto, etc. Y estos objetos pueden programarse de forma que controlen valores de objectos Beads, con lo que ya tenemos un ejemplo de objectos de librerías diferentes interactuando.

Plo tiene dos secuenciadores asociados cada uno a un sintetizador. Para introducir “notas” en los suenciadores, simplemente hemos de clicar en ellos con el ratón. Los knobs más grandes controlan el volumen de los sintetizadores y los más pequeños valores como la frecuencia del secuenciador.

Ir a la página del ejemplo (ventana nueva)

Conclusión

Con este artículo se ha intentado demostrar que la biblioteca Beads ha convertido a Processing en un software más que notable para el desarrollo de aplicaciones de audio y arte sonoro. Ya podemos contrarrestar cualquier argumento que vaya en la dirección de afirmar que Processing es un software magnifico para imagen, pero limitado para audio. Como ya hemos visto, la biblioteca Beads es una excelente herramienta para trabajar con audio en tiempo real que aúna las virtudes del lenguaje de programación JAVA y la estructura de los programa más conocidos para el desarrollo de aplicaciones de audio como Max, Csound, Pure Data, SuperCollider, Nyquist, Reaktor,  Tassman….

Bibliografía y webgrafía

  • www.processing.org/
  • Quelic Berga. “Introducción a Processing”
  • Casey Reas, Ben Fry (2007), “Processing: a programming handbook for visual designers and artists”. The MIT Press.
  • http://www.beadsproject.net/
  • Evan X. Merz (2011). “Sonifying Processing: The Beads Tutorial”
  • Enrico Fubini (1988). “La estética musical desde la Antigüedad hasta el siglo XX”. Alianza Música.
  • Curtis Road (1996). “The Computer Music Tutorial“.The MIT Press.