Síntesis aditiva

En esta entrada voy a hacer un resumen de lo que se ha tratado en la electiva Síntesis de sonido con Pure Data, de la cual soy profesor en la Universidad Distrital Francisco José de Caldas. Antes un poco de contexto. Usualmente ofrezco dos asignaturas relacionadas con Pure Data: Síntesis de sonido y Electrónica en vivo. La idea con ambas materias es que los estudiantes tengan un acercamiento a la música electroacústica, ya sea sintetizando sonidos o modificando sonidos existentes. Por último, ambos cursos se diseñaron para no que no fuesen secuenciales, por lo cual, siempre se arranca desde lo básico de Pure Data. Hasta el momento de escribir esta entrada, hemos visto los elementos básicos de Pure Data y conceptos relacionados a la síntesis aditiva, siendo esto último lo que cubrirá esta entrada. Sobre lo básico de Pure Data puede ser consultado acá y sobre condicionales acá.

Síntesis Aditiva

Se puede afirmar que este tipo de síntesis es básico, puede crear timbres simples y que en apariencia se necesita de muchos generadores de sonido para tener un timbre robusto. Lo bueno es que es muy fácil crear muchos generadores en Pure Data y dotar a todos los generadores de un comportamiento si se quiere. Comencemos desde el elemento básico que nos permite escuchar una onda sinusoidal.

Imagen 1. Generador sinusoidal
El objeto osc~ nos permite generar señales sinusoidales a través de la función coseno, que podemos pensarla como seno corrido π/2.  Tal como muestra la imagen 1, la forma de onda se va a generar con valores de intensidad entre 1 y -1. La frecuencia de un sonido va a ser constituida por la cantidad de veces en un segundo que se produzca la forma de onda que se ha marcado entre 0 y 2π (periodo de la función). También en la imagen 1 a la izquierda se puede observar a qué corresponden las entradas en el objeto y lo que produce su salida. En ese sentido, osc~ es igual a cos(x), una función sobre la cual podemos explicar las modificaciones básicas que luego se van a programar.

La función cos(x) puede ser alterada de las siguientes maneras:
a) Si se quiere cambiar su amplitud, se debe multiplicar la función por un valor constante o una función que le dé forma en el tiempo, lo cual vamos a llamar en este caso envolvente.

Imagen 2. g(x) cos(x)
La imagen 2 muestra un generador sinusoidal conectado a un objeto de multiplicación de señal de audio (siempre se ven más gruesas las líneas al ser de audio). Al multiplicarse podemos pensar que hay una segunda función a la que llamaremos g(x), que en este caso se representa por el objeto envgen (aparece en gris en la imagen 2) que nos permite dibujar el comportamiento de la intensidad en el tiempo.

El funcionamiento de envgen es sencillo, en modo de ejecución podemos agregar puntos con el mouse haciendo clic en donde deseamos un nuevo punto. También podemos mover los puntos haciendo clic sobre un punto existente, mantenemos el clic y desplazamos a donde queremos. Si se quiere eliminar un punto se selecciona con un clic y luego con la tecla backspace. Para definir la duración de la envolvente, que se convertirá en la del sonido, debemos enviar un mensaje a su entrada izquierda con la palabra "duration" y la duración en milisegundos. En la imagen se ha cambiado el valor específico en el mensaje que contiene a "duration"  por $1, lo que implica que el valor que se escriba en la caja numérica que está conectada al mensaje, será el valor de duración, pues $1 actúa como variable.

Para activar la función se debe presionar el bang que está conectado a la entrada izquierda de envgen. También se han incluido unos objetos conectados a la salida derecha, los cuales sirven para guardar los valores de una envolvente que nos guste, lo que se logra pulsando el mensaje dump y luego conectando dicho mensaje a la entrada izquierda del envgen. Al pulsar bang el objeto envgen empieza a generar instrucciones que son interpretadas por un generador de líneas, el objeto line~, que traduce dichas instrucciones a los valores de la función g(x) que controla la intensidad de la señal sinusoidal.

b) La frecuencia del generador sinusoidal es la cantidad de veces que se repetirá la forma cosinosoidal en un segundo, como se mencionó previamente. En la imagen 2 la caja numérica conectada a la entrada izquierda del objeto osc~ representa esa cantidad. Podemos a su vez pensar que la ecuación que representa osc~ es cos(x) donde x es la frecuencia que asignamos, la que a la vez puede ser multiplicada por algún factor (b), lo que más adelante nos permitirá hacer depender de un valor la creación de componentes en un timbre. En ese sentido nuestra función hasta este momento es: g(x)cos(bx).

c) La fase puede ser alterada también. La fase es una constante o una función que se añade a la frecuencia con el propósito de alterar el punto de inicio de la función. Esto va a resultar útil para que la situación inicial de fase en un timbre siempre se perciba igual.

Imagen 3. Creando un subpatch

En esencia, lo que haremos a continuación para construir con éxito un modelo simple de síntesis aditiva es convertir el generador de ondas y envolventes en un generador de componentes a través del uso del subpatch. En el patch principal en un objeto se puede escribir "pd" y luego un nombre para crear un subpatch (un patch dentro del patch). En este caso vamos a escribir pd componente como muestra la imagen 3. Al hacerlo y pinchar en la pantalla aparece una nueva ventana en blanco, la cual nos sirve para crear lo que queremos. En este caso vamos a cortar lo que se ha creado en la imagen 2 y lo vamos a pegar en la nueva ventana blanca que se ha creado. Luego vamos a pulsar click derecho en dicha ventana en alguna parte blanca del subpatch, lo cual nos deja ver un menú en el que debemos seleccionar propiedades.


Imagen 4. Subpatch componente en detalle.
En las propiedades del lienzo se debe seleccionar "Dibujar contenido", lo que nos permitirá mostrar elementos gráficos en el patch principal. Al seleccionar esta opción aparece un recuadro rojo en el subpatch, que es donde se deben ubicar los objetos de interfaz gráfica (GUI). También se deben ajustar los tamaños en los ejes x y y para que tengan el tamaño apropiado para los objetos que queremos incluir. En la parte izquierda de la imagen 4 se pueden observar las modificaciones a las propiedades para lograr el resultado requerido. En la parte derecha de la misma imagen, se muestra como el subpatch ha sido dispuesto para que aparezcan los objetos de interfaz gráfica en el patch principal como se muestra en la imagen 5. Se añadió además una modificación después de line~, lo que equivale a elevar al cuadrado lo que se genera en las líneas para que se perciba mucho mejor el manejo de la intensidad.

Por otro lado, también se añadieron objetos inlet que nos van a permitir la entrada de datos al subpatch desde el patch principal y de salida, con el objeto outlet~, que en este caso es de audio. Las entradas y salidas pueden ser de datos, que actúan por demanda, es decir, que reciben datos cada vez que cambie lo que esté conectados a ellos, o de audio, que siempre van a estar enviando información a la tasa de muestreo que funcione el DSP (siempre y cuando esté encendido éste).


Imagen 5. Patch principal.
En la imagen 5 se puede observar el patch principal con duplicaciones del subpatch componente siendo sumadas para nuestro conformar el sintetizador aditivo, en este caso con sólo 4 componentes, pero que fácilmente se puede expandir a tantos como se necesite. En Windows el objeto envgen al interior de un subpatch o abstracción genera un fallo de vista que desaparece minimizando la ventana y restaurándola a su estado inicial.

Adicionalmente, se puede observar en la parte superior del patch, los objetos s y r (send y receive respectivamente), los cuales actúan como conexiones inalámbricas que nos ayudan a mantener en orden nuestro patch. Obsérvese también que la entrada de frecuencia a partir del segundo componente se ha multiplicado. A esto hace referencia la b en la ecuación g(x)cos(bx) y en este caso nos permite entender que nuestra forma de onda es la suma de cosenos con sus funciones de envolvente y normalizadas con la división /~ 4 que hay antes de enviar al output~. Sin el último paso pueden producirse saturaciones.

Es buena idea probar con factores diferentes y con números con decimales. Explorar cómo los timbres generados tienen cualidades que se asemejan a algunos instrumentos o crean comportamientos que tal vez no sean fáciles de obtener o imposibles en un instrumento acústico. Vale la pena explorar con más componentes, con diferentes envolventes, tiempos e intensidades también. Explorar los diferentes sonidos que puede producir ésta síntesis es esencial para entender mucho del sonido.En la siguiente entrada hablaré de temperamentos o sistemas de afinación que podemos usar con diferentes tipos de síntesis. Recomiendo visitar este enlace y descargar la abstracción que permite tener un teclado en pantalla.


Comentarios

Entradas populares de este blog

Conociendo lo básico de Pure Data

Pure data - Vanilla, lo básico, añadir externos