top of page

Nodos Synth

NODOS es un sintetizador virtual, programado en Max/MSP, un entorno de desarrollo gráfico para música y multimedia. Consta de los siguientes dispositivos:

 

  • Tres osciladores con siete formas de onda y opción de afinación ajustable por centésimos de octava.

  • Dos osciladores de baja frecuencia (LFO), con siete formas de onda, aplicables a cinco tipos de modulaciones más control de delay.

  • Una reverb y un delay, con tiempo de retardo controlado por un LFO.

  • Un filtro, con opción de hasta cinco tipos de filro y controles de resonancia y corte.

  • Un módulo de waveshaping, con opción de hasta cinco tipos de distorsiones.

  • Un sintetizador por FM.

  • Un sintetizador por Ring Modulation.

  • Tres envolventes de filtro, modulación y amplitud. 

En la figura 2 vemos una de las ventanas ("patches") de programación del sintetizador en el entorno de Max. Las pequeñas cajas de color verde ("patchers"), contienen internamente la información de cada proceso aplicado al audio. Las cajas de color azul representan objetos que reciben o transmiten mensajes a otros patches dentro del sintetizador. Los osciladores y otros procesos aplicados al audio se encuentran alojados ("encapsulados") dentro del objeto poly~ (arriba y al centro de la imagen), en un subprograma ("subpatch") llamado "voces". Dicho objeto crea 16 copias (o instancias) de este subpatch, que corresponden a las voces del sintetizador (en total 16). Por esa razón el objeto poly~ tiene escritos los argumentos "voces" seguido de "16". 

 

Desde poly~ las señales procesadas de los tres osciladores viajan a través de cables hacia tres multiplicadores de audio (objetos *~). Estos objetos modifican el nivel de las señales, al multiplicar las muestras de audio por un coeficiente de ganancia. Posteriormente, el audio de cada señal es procesado por un multitap delay, una reverb, un limitador de ganancia y un control de balance, cuya programación se encuentra encapsulada dentro de las pequeñas cajas "p Multitap Delay", "p Reverb", "omx.peak.lim~" y "p Paneo", respectivamente. Por último, la señal es convertida a formato analógico por el objeto dac~, para su posterior escucha.

El subpatch "voces"

En la figura 3 se muestra el subpatch voces. El mismo es alimentado por tres señales de baja frecuencia (LFO) que aplican una cantidad de vibrato a la frecuencia de los osciladores (encapsulados dentro de los patchers "p osc 1, 2 y 3"). Para ello se suma la amplitud de los LFO a la frecuencia de los osciladores (arriba de la imagen, objetos +~). El dato de frecuencia es entregado al objeto +~ por los patchers " p transpositor 1, 2 y 3", que reciben a su vez ese dato desde el teclado y lo procesan. La amplitud de los LFO determinará la profundidad del vibrato (depth), mientras que su frecuencia determinará la velocidad del mismo (rate). 

El valor de frecuencia calculado por los objetos +~ viaja en formato de señal hasta el patcher "p modenvs", y es procesado por envolventes encapsuladas dentro del patcher.  Las mismas  modifican la señal, haciendola variar linealmente entre dos números cada vez que se presiona una tecla, lo que genera un efecto de glisando en las notas. Posteriormente dicha señal es conducida a la entrada de frecuencia de los osciladores. Asimismo, se les aplica síntesis por FM y AM, utilizando la ganancia de los osciladores 2 y 3, respectivamente. 

Luego las señales de los osciladores 1 y 2 son balanceadas mediante una serie de procesos alojados en el patcher "mixmodswitch", y por último procesadas por un waveshaper (patcher "waveshaping") y una envolvente de amplitud (patcher "ampenv"), antes de ser enviadas a la salida (objetos out~, en azul). 

Osciladores: controles y programación

 Los controles principales de cada uno de los tres osciladores son: 

  • Afinación: ajustable a centésimo de octava, semitono y octava.

  • Filtro: perilla de encendido y apagado.

  • Forma de onda (wave): ajustable a siete tipos.

  • Control de modulación de fase (phase modulation).

Los osciladores están programados con el objeto cycle~ (figura 5, margen inferior) , que lee repetidamente una tabla que almacena un ciclo de una función cosenoidal, representada por 512 valores de amplitud. Posee dos entradas: frecuencia en Hz. y tabla de lectura más fase.  En este caso hemos utilizado siete buffers o memorias de lectura, que almacenan los distintos tipos de tablas de formas de onda utilizadas por cycle~ (forma senoidal, triangular, cuadrada, sierra negativa, sierra positiva, pulso y ruido).  
Los objetos "r" (receive abreviado) y route, que aparecen en azul (margen superior derecho de la imagen), son los encargados de comunicar al objeto cycle~ con las distintas memorias de lectura. Esto ocurre de la siguiente manera: cada vez que el usuario modifica un parámetro del sintetizador, el objeto receive recibe un mensaje por cada parámetro, haya sido modificado o no. Supongamos que cambiamos la forma de onda del oscilador 1 a "square", es decir, a onda cuadrada. En este caso, el objeto route selecciona el mensaje "osc1_wave square" y se lo entrega al objeto prepend set, que lo renombrará como "set square", indicándole al objeto cycle~ que debe leer la memoria de lectura "square". Dicho buffer contiene un ciclo de una forma de onda cuadrada. 

 

Hacia la derecha, vemos otros objetos cuya función es modular dinámicamente la fase del oscilador. Para ello se ha utilizado un fasor que oscila a 660 hz. (objeto phasor~), y cuya amplitud varía entre 0 y 1. La señal pasa por un amplificador de ganancia (*~), antes de ingresar por la entrada de fase del oscilador.

LFO: programación

La figura de la derecha muestra la programación interna del subpatch LFO, ubicado en el patch principal NODOS SYNTH (Figura 2)

Los objetos gate~ que vemos en el centro de la figura 6 se encargan de redirigir la señal de los LFO a los distintos parámetros que le asignemos. Los objetos send~ marcados en azul en la imagen, envían la señal remotamente a los subpatches que contienen la programación de cada parámetro. Por ejemplo, el objeto send~ "mixlfo", envía señal del LFO 1, al subpatch "mixmodswitch" (figura 3, centro), que contiene la programación del control de balance entre los osciladores 1 y 2. En ese caso, dicho balance se verá afectado por la señal del LFO, variando dinámicamente según varíe la amplitud y frecuencia de esa señal. 

En la figura 7 vemos la programación interna del subpatch "LFO1" (figura 7, centro). En la parte superior y al centro de la imagen aparece el oscilador (objeto cycle~), y más arriba, remarcados en azul, los objetos que controlan su forma de onda (izquierda) y su frecuencia (derecha). Esta programación es similar a la del oscilador 1, explicada antes (Ver Osciladores). La amplitud del oscilador es controlada por una envolvente, que se encuentra encapsulada en el patcher "p Envolvente" de color verde, al costado del objeto cycle~. La misma se aplica a la señal, multiplicándo ambas entre sí (objeto *~). La profundidad de modulación del LFO es nivelada con un control de ganancia que se aplica luego de la envolvente. Por último, dicha señal pasa por una línea de retardo (objeto delay~), que le aplica un delay antes de salir al exterior del patch.

FM: Programación

La frecuencia modulada o FM consiste en la variación periódica de la frecuencia de una onda a velocidad de audio (por encima de los 15 Hz.) El resultado dependerá de la relación entre la amplitud y frecuencia de la onda moduladora y portadora. En NODOS, la FM ha sido programada de manera tal que el oscilador 2 module la frecuencia del oscilador 1. A continuación vemos la aplicación de esta técnica en un patch de max del sintetizador NODOS.

Al patch ingresan dos señales por los inlets 1 y 2 (frec mod in). La amplitud de la primera, oscilando entre valores normales de -1 y 1, es re-escalada por la amplitud de la segunda, que oscila en rango de audio. Su amplitud equivale al valor de frecuencia de la nota ejecutada, multiplicada por un valor entre 0 y 25. Dicho valor equivale al índice de modulación, cuyo incremento profundiza el efecto de modulación. Por último, la onda resultante es modulada por una envolvente (Env. Mod.) y un oscilador de baja frecuencia (LFO Mod.). 
En el patch principal de este subpatch (voces), se añade a la frecuencia de la onda portadora (oscilador 1) la señal obtenida en el subpatch de FM.

Waveshaper

El waveshaping es un proceso de audio que permite resintetizar una onda mediante una tabla que almacena una cantidad de muestras de una función específica. En audio digital, dicha función se denomina función de transferencia. Las muestras de entrada (la señal a resintetizar), son utilizadas para indexar la tabla y calcular el valor de salida de cada muestra. En Max, el objeto que realiza esta operación se llama lookup~. En la imagen de la figura siguiente vemos una implementación de waveshaping en el sintetizador NODOS.

Las señales de entrada (osciladores 1, 2 y 3 In) pasan por un objeto gate~ que las desvía al proceso si el mismo está activado. Luego, la señal es procesada por una envolvente y un control de ganancia wet/dry (objeto expr), antes de ingresar al objeto lookup~. Este objeto utiliza las muestras de la señal de entrada para escanear la función que almacena la tabla contenida en una memoria de lectura externa (o buffer, como comúnmente se denomina en informática) Los argumentos escritos en el objeto lookup~ corresponden a: nombre del buffer de lectura (en este caso "distorted") y porción de la tabla a leer, en muestras (0 a 512 en este caso).

Multitap Delay

El delay (en español, retardo), es un tipo de proceso aplicado al audio, que simula el efecto acústico de reflexión de ondas sonoras conocido como eco. En recintos cerrados, las reflexiones son múltiples debido a los distintos puntos donde se refleja la onda (paredes, techo, y suelo). Para reproducir tales características en los medios digitales, es posible incrementar la cantidad de retardos de una señal, efecto popularmente conocido como multitap delay. La imagen siguiente muestra la implementación en Max de dicho proceso. 

Como vemos en la imagen, la entrada se conecta a un objeto tapin~, que almacena 5 segundos (5000 milisegundos) de audio en forma continua. A dicho objeto, se conectan cuatro objetos tapout~ (objetos de color morado), que  leen el audio almacenado por el objeto tapin~ aplicando distintos tiempos de retardo. Estos tiempos no son valores fijos sino que son modificados en tiempo real utilzando cuatro osciladores (objetos cycle~). La amplitud y frecuencia de cada oscilador determinarán la profundidad (depth) y velocidad (rate) de la variación de cada retardo, respectivamente. Para aplicar dicha variación, se ha sumado a cada retardo fijo (objetos +~, al centro de la imagen) la variable de amplitud producida por cada oscilador (objetos cycle~). 

Como paso previo, dicha ganancia es limitada a 1 (objetos +~ y /~) e incrementada hasta 4, mediante una variable de control proveniente del panel central (profundidad de modulación).  Las señales retrasadas (salidas de los objetos tapout~) alimentan un objeto *~ que las suma, y el resultado vuelve a ingresar a la línea de retardo, previo control de su ganancia (feedback). A la salida se suma la señal realimentada y el directo. 

bottom of page