Armando algunos módulos (Examen Final)

Como parte del examen final del curso de Pure Data en la ASAB, vamos a programar varios módulos que quedarán listos para interconectarse con otros procesos o modificarse y procesar señal en tiempo real.

Primero vamos a pensar en la funcionalidad que van a tener. Como deseamos que las abstracciones que vamos a crear hoy sean versátiles y que puedan ser modificadas con el mouse o que reciban parámetros desde una fuente externa o que puedan ser controlados con otras programaciones adicionales vamos a incorporar todos los elementos que nos permitan hacer esto.

Primero vamos a programar un módulo que nos permita integrar todas las posibilidades de uso para los delays descritas en el post anterior. Lo primero es abrir una nueva ventana de Pure Data, dar clic derecho (clic secundario para usuarios de OS-X) y seleccionar properties.

En esta ventana vamos a pulsar la casilla de verificación a la izquierda de graph on parent como se señala en el ejemplo. Adicionalmente, vamos a cambiar los tamaños para para las dimensiones en X y Y. Una vez completados los cambios pulsamos ok y estaremos de regreso en nuestra ventana en blanco. Vamos a poner una caja numérica y notaremos un rectángulo de color rojo, el cual servirá para que al invocar la abstracción en cualquier otro patch tengamos una interfaz de modificación de parámetros con el mouse o con el teclado del computador, sin tener que abrir la abstracción y cambiar lo que deba ser cambiado.


Ahora sí vamos a programar todo lo necesario para que funcione nuestro módulo de delay. Necesitamos de diversos mecanismos que nos permitan las siguientes opciones:

1- Vamos a controlar el tiempo de retrazo para el delay, si queremos retroalimentación, el factor de retroalimentación, si queremos que repita como loop, si queremos regresar al estado anterior, la mezcla de intensidad entre la señal original y la señal modificada.

2-  Queremos que al llamar la abstracción no tengamos problemas de duplicación.

3- Vamos a tener la posibilidad de control desde otro patch o subpatch.

Comencemos simplemente por colocar todos los objetos que nos permitan controlar con el mouse o el teclado.

Luego vamos a usar lo necesario para crear los delays, en este caso el nombre que vamos a dar al delay en delwrite~ debe comenzar con $0- seguido del nombre que usemos. Esto implica que como parte de invocar el objeto debemos asignarle un nombre como parámetro de inicialización, permitiendonos tener muchos módulos sin problemas de duplicación.
 
Notemos que en este caso antes de enviar cada parámetro directamente a las multiplicaciones, como lo hicimos en el post anterior, vamos a anteponer un mensaje con $1 10 y un line~, estos dos objetos cumpliran con la función de suavizar cualquer cambio al enviar datos a una entrada de audio convirtiéndolos en audio.

Ahora vamos a implementar el control de intensidad entre señal limpia y modificada. Lo haremos a través de un crossfade, es decir que el comportamiento de intensidad es contrario para uno de los dos. Como obtenemos la información de una sola fuente (el slider que ubicamos al final de los objetos de control con mouse) y los números que genera ese objeto son linealmente de 0 a 1 debemos buscar una forma de invertir el comportamiento para uno de los dos. En este caso lo haremos para la señal original.

Pensemos un poco respecto a la operación necesaria. Si cuando el slider está totalmente a la izquierda vamos a tener toda la intensidad de la señal original y cuando esté totalmente a la derecha no vamos a tener señal original, es decir, su intensidad es cero, entonces debemos efectuar una resta: 1 - x. Funciona para este caso, si el slider envía un valor cero el resultado de la operación es: 1- 0 = 1; si el slider envía 1 entonces la operación es: 1 - 1 = 0.  Para complementar esto, usaremos nuevamente los dos objetos que usamos anteriormente para suavizar el cambio de datos a audio.


Una vez solucionado esto, procederemos a determinar la cantidad de inlets que usaremos para permitir el control externo. Los cuales deben ser tantos como parámetros tenemos en el recuadro rojo en que ubicamos objetos al principio de esta implementación. En ese caso, necesitamos uno para activar la retroalimentación, uno para el tiempo, uno para el factor, uno para el control de intensidad, uno para activar el loop y otro para desactivar el loop y recuperar los parámetros que estaban antes de activarlo. Adicionalmente, usaremos dos inlet~, uno para permitir la entrada de audio y otro para permitir una entrada de control externo, como un LFO.

Para implementar la recuperación de los parámetros anteriores a la activación del loop vamos a programar un subpatch, el cual tiene una entrada para cada uno de los parámetros que queremos recuperar (activación de retroalimentación, factor de retroalimentación e intensidad) y dos entradas para los bang que controlan la activación y desactivación del loop. También es necesario tener 3 salidas de ese sub-patch, que se conectarán a la entrada de los objetos que permiten la entrada de los valores que mencioné anteriormente.


Dentro del patch principal las conexiones son las que se ven en el gráfico, que he separado de la apariencia final con el propósito de visualizar fácilmente las conexiones.

Al interior del sub-patch vamos a usar dos objetos que posiblemente no hemos usado antes, así que doy una breve explicación de su función:

pipe: este objeto es un delay de datos, permite retrazar un dato según el tiempo que se indique en milisegundos.

lbang: también conocido como loadbang, el cual permite enviar un bang al cargar el patch.

En este subpatch usaremos lbang para inicializar los toggle asociados a los spigot que a su vez van conectados a la derecha de float. Si queremos almacenar los valores en float y no cambiarlos con la activación de loop (que cambiará momentaneamente los valores de retroalimentación, factor e intensidad) debemos retrazar un tiempo corto la llegada al spigot mientras desactivamos su toggle para que no cambie la información que se almacena en float.


Una vez terminado el subpatch vamos a programar el comportamiento del bang loop en el patch principal. Este bang debe enviar un valor 1 a el slider de intensidad, un 1 a el valor de retroalimentación y un 1 al toggle de retroalimentación. Adicionalmente debe cerrar la entrada de audio una vez que se capture, es decir, una vez que se cumpla el tiempo que tenemos para el delay.

Para finalizar sólo debemos conectar un mensaje que reestablezca la entrada de audio al pulsar el apagado del loop, conectar los inlets a sus respectivas casillas numéricas, toggles, bangs y slider.

Esta es la apariencia de la abstracción. Externamente se verá de otra forma al ser invocada como objeto:


Para finalizar vamos a implementar una abstracción que nos permita controlar un oscilador (con dos formas de onda distinta) que usaremos como control externo del tiempo en el delay.

Lo primero que haremos será implementar el mecanismo de selección del tipo de onda que vamos a usar. Para ese propósito se usará un Hradio al cual en las propiedades le cambiaremos el parámetro number a 2. Luego usaremos un select para determinar que si el valor es 0 entonces permita la salida de una onda sinusoidal y cierre la salida de la onda diente de sierra. Si el valor es uno el comportamiento será el contrario al anteriormente descrito. Usaremos las dos primeras salidas de select para enviar mensajes de 1 o 0 a dos line~ diferentes que van a conectarse a una multiplicación que permite restringir o permitir el paso de las ondas mencionadas.


El resto de los procedimientos no necesitan mayor explicación. Luego de Ajustar el rango y amplitud del oscilados sinusoidal bastaría con multiplicarlo por un número para definir un rango y sumarle un número para definir su límite inferior. Aplica de la misma forma para la onda diente de sierra y como sólo va a salir una de las dos podemos enviar todo al mismo outlet.


Finalizamos entonces con una vista del patch principal, en el cual invocamos las dos abstracciones creadas y listas para ser usadas en tiempo real.


Para el día de presentación cada estudiante deberá llevar las abstracciones en una memoria extraible, se invocarán las abstracciones y se usará un subpatch que permita revisar el funcionamiento correcto de ambas abstracciones.




Comentarios

Entradas populares de este blog

Conociendo lo básico de Pure Data

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

Síntesis aditiva