#3670
Crear envolventes complejas en base a juntar varias más sencillas de forma secuencial no es complicado en los sistemas modulares. Simplemente necesitamos encontrar una forma de disparar varios módulos que generen funciones (recorridos de voltaje) de forma secuencial: Disparo -> Envolvente 1 -> Envolvente 2 y así. Luego sumaremos todas esas señales para tener nuestra envolvente compleja.
En el caso de DX7, leyendo el manual veo que la envolvente compleja es una especie de ARADSR. Podemos, pues, deconstruirla en AR+ADSR.
Este proceso resulta mucho más sencillo usando módulos de generación de funciones tipo Buchla/Serge (Rampage, Maths...) porque nos ofrecen una señal de final de ciclo (EOC), esto es, tienen una salida de voltaje que genera un TRIG cada vez que el ciclo termina. Si esto estuviera disponible en el módulo básico ADSR significaría que el final del recorrido podría disparar otra cosa, por ejemplo otra envolvente, al terminar. Esta función interna EOC la genera un subsistema que usa comparadores de señal: cuando A es mayor/menor que B, haz esto. Nosotros podemos usar módulos externos de comparación para implementar esta función a ADSR.
En cualquier caso, he montado dos patches diferentes para poder estudiar el proceso y ver los problemas que se presentan y las soluciones que proponemos. AVISO: hay que instalar la colección de Count Modula, ya que vamos a usar un detector de Slope como comparador. Es una colección llena de módulos de utilidades y lógica, muy muy muy útiles todos. También usaremos RAMPAGE, de Befaco.
En el primer patch empezamos a aproximarnos a la idea de secuenciar dos envolventes una tras otra para generar una más compleja. En este caso tenemos ASR+AR. Un módulo Switch nos permite elegir entre ASR o AR en el primer tramo: A1 es controlada por Rise1, Sustain depende de longitud de GATE (En modo IN, en modo TRIG es AR), R1 es Fall1, A2 es Rise2 y R2 es Fall2.
GATE de teclado dispara el primer tramo. Cuando el primer tramo termina, genera un TRIG (salida EOC) que usamos para disparar el segundo tramo (AR) en Rampage2.
Las salidas de ambas funciones de Rampage se suman en Unity y se envian al VCA que controla el VCO.
Este patch es sencillo de entender, pero no nos permite conseguir el tipo de envelope del DX7. Querríamos que la duración de GATE controlara el segundo ciclo, no el primero como ahora. Dar la vuelta a esta implementación no serviría: la señal EOC es un TRIG, por lo que sólo nos permite disparar, no controlar durante cuánto tiempo: usando EOC para disparar el segundo tramo nos impide, sí o sí que ese segundo tramo sea un ADSR operable: necesitamos que al segundo tramo le llegue la señal GATE.
Esto lo conseguimos en el segundo patch, que es un poco más complicado, pero efectivamente nos permite tener AS+ADSR. La explicación está en las notas del propio patch, pero la idea es la siguiente:
Usaremos un canal de Rampage para el primer tramo AR y un módulo ADSR para el segundo tramo. Tenemos que enviar GATE de teclado, esta vez, a ambos módulos, y además de forma secuencial. Usaremos un módulo SS-1 a dos pasos con una entrada (GATE), salida 1 a Rampage y salida 2 a ADSR. Para pasar de un paso a otro tenemos la muy útil señal EOC de Rampage: al terminar el primer ciclo AR, el SS-1 mandará GATE a ADSR, que es justo lo que queremos.
El problema viene a la hora de resetear SS-1 para que cada nota que toquemos empiece en el paso uno. Podemos pensar que usando la propia salida GATE funcionaría pero no: al llegar a la vez a reset y a la entrada se manda una pequeña parte del GATE a salida 2 a la vez que resetea, suficiente para disparar ADSR de forma indeseada. Lo que querríamos sería invertir el proceso: que en lugar de resetear con señal Alta de GATE, resetée con señal baja.
Hay varias formas de conseguir esto (es para estas cosas que los módulos de lógica y tal vienen genial), pero he querido usar el módulo de detección de slope porque no supone lío de entrar en lógica (aunque está realizando una operación de inversión en el fondo) y porque quizá os resulte útil para otros usos concretos en el marco este de recrear sintes clásicos / arquitecturas clásicas.
El módulo Slope Detector recibe una señal y analiza cuándo esta señal tiene voltaje contínuo, cuando tiene voltaje en cambio, cuándo el voltaje está aumentando y cuándo está disminuyendo: emite una señal contínua en cada uno de esos estados por salidas específicas.
La idea es usar Slope Detector para obtener una señal en el momento en que termine GATE para poder enviar al reseteo de SS-1. Por lo tanto, mandaremos una copia de GATE a Slope Detector, y mandaremos la salida Falling de Slope Detector al reset de SS-1. Cada vez que Gate TERMINA (su voltaje disminuye), Slope Detector manda un reset a SS-1, por lo que, aunque nuestra envolvente compleja aún esté activa en su última fase Release, nuestro sistema de secuenciación de envolventes está ya apuntando a Rampage, de tal forma que el siguiente pulso irá, como deseamos, primero a Rampage (actuando como un trig) y luego a ADSR (actuando, ya sí, como un GATE con duración variable).
Parece un lío, pero no es más que hacer aquello en lo que insisto siempre: pensar en señal y en qué queremos hacer con ella. El hecho de que algunas señales, como los Gates o los Trigs, sean de naturaleza binaria nos abre las puertas a la aplicación de lógica booleana a cascoporro. En este caso lo estamos haciendo sin darnos cuenta, y con un método que implica intentar primero analizar qué queremos hacer y qué significa eso en base a señal; luego, investigar si existen módulos que nos permitan hacer eso.
A ver si esto ayuda y abre puertas! De momento al menos permite trastear un poco con el tema, y además el segundo patch deja sin usar el segundo canal de Rampage: creo que sería buen ejercicio, una vez comprendida la mecánica del patch, usar ese segundo canal para añadir otro segmento AR a nuestro envelope complejo para así ir más allá del DX7 y sentirnos diosas del voltaje.