martes, 4 de mayo de 2010

E-Code: Módulos Copy / Paste


El Environment en Logic 5.5 presenta un límite de poco más de 8000 objetos. Actualmente estoy bastante cerca de ese límite: sólo podré usar algo más de 1000 objetos adicionales. Una de las soluciones es “empaquetar” conjuntos de objetos creando Macros. Un objeto Macro puede contener casi un centenar de objetos pero sólo puede tener una entrada y una salida (y no puede contener objetos Alias, aunque aquí no representa problema alguno). Esto significa que todo lo que esa Macro debe procesar sólo puede hacerse en los objetos de la Macro. Soy consciente que la expresión “una Macro sólo puede tener una entrada y una salida” es confusa. No te preocupes, lo comprenderás al ver los gráficos inferiores. En el post E-Code Lección 1 – Área de trabajo encontrarás más detalles de las Macros.

El caso es que una de las funciones que más se repite en REQUIEM es el mecanismo de las funciones “Copy” y “Paste”. En REQUIEM podemos copiar y pegar Presets de sonidos, Presets de modulación, Phrases, Patterns, Pasos de canción, las llamadas “Scenes”, Presets de Edición, Kits de batería, parámetros de los LFOs y alguna cosa más. Todo eso son funciones que pueden empaquetarse como Macros y liberar más de 600 objetos que podré usar de nuevo, incrementando el cómputo de objetos disponibles.


El ejercicio de hoy es un buen ejemplo de la filosofía del E-Code: traducir una función esquematizada con flujos de datos a objetos Environment. En nuestro caso la función a “Environear” es un buffer de copia de datos, es decir, la parte mecánica de las funciones “Copy” y “Paste”.

Un buffer de copia es una función compuesta de una puerta de entrada, un almacén que guarda los datos capturados y una puerta de salida que permite enviar esos datos capturados al receptor. Cuando señalamos una frase en un procesador de textos y procedemos a la función “Copy”, todos los datos señalados son capturados y enviados a una memoria temporal en la que se guardan. Al proceder con la función “Paste” estos datos son disparados en la posición de pegado.

Imaginemos que queremos copiar un paquete de 8 parámetros (por ejemplo los parámetros de un LFO):
  1. Pulso “Copy”.
  2. Se abre la puerta del buffer de copia (la puerta de salida está cerrada)
  3. Se envía un disparo a los datos originales a copiar
  4. Los datos reciben el disparo y se introducen en el buffer de copia.
  5. Se cierra la puerta del buffer al recibir el último dato almacenado.
Ahora procedemos con la función “Paste”:
  1. Pulso “Paste”.
  2. Se abre la puerta de salida del buffer.
  3. Se cierra la puerta de entrada (reiterativo, por seguridad)
  4. Se disparan los datos almacenados.
  5. La puerta de salida se cierra al pasar por ella el último dato almacenado.
Expresado como flujo de datos el esquema es el siguiente:


Y convertido a código E-Code el resultado es este:

 


En verde puedes ver el cable que transfiere los datos a copiar al buffer “Copy / Paste”. Este cable sale de una Macro que almacena 128 memorias cada una con 6 parámetros distintos. Es un módulo de 128 Presets.

En azul puedes ver el recorrido de la señal al realizar la copia y en amarillo, lo mismo aplicado para la punción “Paste”. En rojo se representa la salida de datos. Soy consciente que viéndolo todo simultáneamente es imposible comprenderlo. Así que lo mejor es tratarlo por partes.


Función “Copy”

En primer lugar el usuario debería seleccionar el “Preset” del cual queremos copiar los datos.

Al pulsar el botón “Copy” se introduce un “program change” valor “1” en el Transformador “IN”. Este Transformador divide la señal en dos rutas dependiendo del evento recibido. Si el evento es un cambio de programa (como el que hemos enviado) envía dicho evento por el cable superior. El evento de “program change” sigue la ruta hasta llegar a un “Ornament”, un objeto gráfico que multiplica los eventos entrantes en tantas rutas como cables usemos en su salida. En este caso salen dos cables portando el “program change” inicial. Uno se introduce en el Transformador “copy” y el otro en el Transformador “paste”. En cada uno de estos se comprueba que la función sea la de copiar o pegar. Recuerda que el “program change” tiene un valor de "1" (es la definición de salida del objeto botón “copy”), así que la ruta de señal buena será la que continua desde el Transformador “copy”. El Transformador “paste” cortará la señal ya que únicamente dejará pasar los eventos de “program change” con valor “0” (enviados desde el botón “Paste”)

A partir de este punto las tareas se dividen en dos ya que el Transformador “copy” tiene dos cables de salida:

1- Por el cable superior sale el evento “program change” valor “1” que es retardado 2 ticks de señal, convirtiéndose en una señal de disparo en el Transformador etiquetado como “bang”. La señal de disparo pasa por el Transformador “OUT” hasta alcanzar el Transformador “bang Preset”. Este envía una señal al módulo de memorias “128 Preset Memory” para que dispare los 6 parámetros del “Preset” actual (el que el usuario vería en pantalla).

2- Un segundo evento “program change” valor “1” parte del Transformador “copy” por el segundo cable de forma simultánea al primer cable. Este segundo evento es introducido en un Transformador llamado “open” que abre la puerta de entrada “In” (conmutador de cables), permitiendo el paso de los parámetros a copiar. En este instante, cuando la puerta se abre, el proceso de este cable termina, ya no ocurre nada más en esa ruta de señal.



En el paso 1 he retardado la señal 2 ticks, ¿recuerdas? (justo después del Transformador “copy” que divide la señal inicial en dos rutas de señales). Bien, cuando el módulo de memoria “128 Preset Memory” envía sus 6 parámetros gracias a la señal de disparo recibida por “bang Preset”, éstos valores se introducen por el Transformador inicial “In”, y son enviados por su segundo cable ya que no son eventos tipo “program change”. Los 6 eventos siguen el cable encontrándose una puerta “In” abierta. Precisamente hemos retardado el disparo de estos 6 eventos con un retardo para que diera tiempo a que la puerta se abriese sin arriesgarnos a perder uno de los eventos copiados (posiblemente el primero).

Los eventos cruzan un filtro de entrada que se asegura que sólo se introduzcan 6 eventos y no más. Estos eventos se reparten según su definición en 6 faders que los almacenan. Estos 6 faders están cableados a una puerta de salida “Out” que está cerrada. El último fader, llamado “Mod 6” envía dos señales a los transformadores “close” inferiores que cierran tanto la puerta de entrada “In” (que se abrió al inicio del proceso) y la puerta “Out” que aunque ya esta cerrada, recibe el evento igualmente.

Fin del proceso, los datos han sido capturados y son almacenados en 6 faders. Pero no salen, sólo se enviarán al pulsar el botón “Paste”.

La función "Copy" en funcionamiento. Los datos capturados coinciden con los que se ven en el "Monitor" superior. El "Monitor" inferior no muestra datos pues la puerta de salida "Out" está cerrada


Función “Paste”

Ahora el usuario debería seleccionar el “Preset” en el que realizaremos la función de pegar.

Al pulsar el botón “Paste” se introduce un “program change” valor “0” en el Transformador “IN”. Este Transformador vuelve a dividir la señal en dos rutas dependiendo del evento recibido. Si el evento es un cambio de programa (como el que hemos enviado) envía dicho evento por el cable superior. El evento de “program change” sigue la ruta hasta llegar al objeto “Ornament” que multiplica la señal en dos rutas portando el “program change” valor “0” inicial. Como el Transformador “copy” espera recibir un “program change” valor “1” envía el evento por el segundo cable, yendo al Transformador “paste”. El Transformador “copy” cortará la señal ya que únicamente dejará pasar los eventos de “program change” con valor “1” (enviados desde el botón “Copy")

A partir de este punto las tareas se dividen en dos ya que el Transformador “paste” tiene dos cables de salida.

1- Por el cable superior sale el evento “program change” valor “0” que es retardado 2 ticks de señal, convirtiéndose en una señal de disparo en el Transformador etiquetado como “bang”. Este Transformador multiplica la señal por 6 y la envía a sendos objetos fader que contienen los datos almacenados. Los 6 eventos almacenados son enviados hacia la puerta de salida que debería estar abierta en al paso 2. Al enviar el último evento almacenado, llamado “Mod 6”, se envía un evento que cierra las puertas “In” y “Out”. El retardo de 2 ticks se impone para que el disparo se haga después de abrir la puerta de salida “Out”.

 
2- El segundo cable del Transformador “paste” abre la puerta “Out”. Los datos se envían de vuelta al Módulo de Memoria y se almacenan en el Preset actualmente seleccionado.

 La función "Paste" en funcionamiento. Los datos capturados son enviados (ver "Monitor" inferior). El "Monitor" superior muestra los nuevos datos introducidos en la memoria


Creando la Macro

Como el proceso funciona, quizás sea el momento de empaquetar todo el buffer de copia en forma de Macro. De esta forma, todos esos objetos contarán como uno sólo. Para ello es necesario comprobar la entrada de lo que será la Macro. El Transformador “IN” será usado como Macro mientras que el Transformador “OUT” será la salida.

Objetos usados como entrada (gráfico superior) y salida (inferior)

Al seleccionar todos los objetos que compondrán la Macro comprobamos que NO HAY NINGÚN CABLE que salga de esos objetos, todos nacen y mueren dentro de la Macro. La Macro sólo tendrá una única salida: el Transformador “OUT”.

 
Listo, ¡podemos crear la Macro!


NOTA: Este buffer de copia es ideal para copiar y pegar hasta 10 parámetros. En el caso de las “Phrases” (16 notas + 16 velocidades de pulsación + 16 duraciones de nota), es necesario otro mecanismo cuya conversión a Macro es mucho más sofisticada.

No hay comentarios:

Publicar un comentario