martes, 5 de enero de 2010

E-Code Lección 2 – Uso de variables – Faders I


El uso de variables es imprescindible en el Environment al igual que con cualquier lenguaje de programación. Pero a diferencia de los otros, nosotros no contamos con una entidad real, es decir, no existen objetos “variables” sino que debemos tomar uno o varios objetos del Environment y usarlos a modo de variables. Por supuesto tampoco tenemos distintos tipos de variables: nuestras variables sólo admiten valores enteros de 0 a 127, con lo que la precisión de los cálculos es paupérrima. Lo cierto es que no vamos a usar el Environment para crear programas de matemática avanzada, sino aplicaciones musicales, con lo que las capacidades de cálculo (operadores) son más que suficientes.

Los objetos que nos servirán como variables son:

  • Objetos tipo Faders (que a continuación expongo en esta primera parte)
  • Objetos tipo Transformadores

Contenedores de variables

Considerar estos objetos como variables implica abordar otro concepto adicional: el contenedor de la variable. No puede existir un valor o variable de forma autónoma, sino que hay objetos tipo fader que pueden enviar y recibir valores, y objetos tipo transformadores también con las mismas capacidades además de poder procesar esos valores con operadores.

Aunque no existen distintos tipos de variable, si hay distintos tipos de representaciones de esos datos, por ejemplo como números (fader numérico), como controles gráficos (faders en general), o como cadenas de texto (fader de texto). Y también hay distintos tipos de contenedores, y esta es quizás la cuestión más importante. Me refiero a “contenedor” a la definición de los eventos de salida del objeto gráfico que nos permite alterar el valor de la variable, por ejemplo un fader vertical. En un fader definido para que envíe control MIDI número 7, la variable será el valor de control MIDI número 7 enviado / recibido. El contenedor sería el tipo de valor, en este caso, eventos de control MIDI número 7, y el artefacto que nos permite cambiar el valor de la variable es el propio fader gráfico (de tipo que sea, vertical, numérico, etc…)

Definición de un objeto tipo fader. Las definiciones "Fader" y "Meta" no son eventos MIDI sino eventos internos de Logic. "Fader" es el evento interno de Logic que maneja las automatizaciones de plug-ins y canales en el mezclador virtual y "Meta" son eventos internos genéricos de Logic.

Si deseo enviar más de 20 valores simultáneos a través de un objeto para que los procese (por ejemplo un transformador que añada una constante a la variable), deberé usar 20 contenedores distintos, ya que de lo contrario esas 20 señales se mezclarán en la salida y no podré recuperarlas de forma individual. Aquí la solución será definir cada uno de los 20 faders con un evento MIDI distinto, por ejemplo, 20 cambios de programa distintos (del 0 al 19), o 20 valores distintos de un mismo controlador MIDI (por ejemplo el número 7, volumen)

También hay que tener en cuenta que disponemos de 16 canales MIDI, y que podemos usarlos para individualizar las variables, por ejemplo envíar 16 cambios de programa simultáneamente (cada uno en un canal MIDI distinto) en vez de usar 16 controles MIDI en un mismo canal MIDI.

Objeto fader definido para el envío de eventos de control número 7 (tanto de entrada como de salida, observa los campos "In" y "Out" en el canal MIDI número 1.

La decisión de qué tipo de contenedor debemos usar depende de varios factores:

¿Cuántas variables distintas se procesarán en ese instante?

Si vas a procesar un bando de variables grande lo mejor es usar a los controladores MIDI como contenedor, pues tienes 128 tipos y cada uno de ellos puede enviar / recibir 128 valores. Otro evento MIDI que nos da esa facilidad es la post-pulsación polifónica (P-Press en Logic, aftertouch polifónico), que nos ofrece 128 números de nota con 128 valores cada uno. Así pues estos tipos de eventos nos ofrecen 128 variables con 128 valores en cada una (control 0 de 0 a 128, control 1 de 0 a 128, control 2 de 0 a 128… control 127 de 0 a 127) Los eventos de notas también permiten ser usados como 128 variables distintas (números de nota) con 128 valores cada una (velocidades de pulsación). Existe otro tipo de eventos que nos podrían servir: los Meta-Eventos, que requieren de un post especial pero que tienen una limitación que desvelaré en la respuesta a la siguiente pregunta.

El caso contrario serían los cambios de programa: con ellos solo tenemos una misma variable con 128 valores, ya que no hay 128 tipos de cambios de programa sino sólo 1. Lo mismo es válido para la post-pulsación de canal (C-Press en Logic, aftertouch de canal): es decir, una única variable con 128 valores.

¿Esos valores deben poder ser disparados?

La gran mayoría de variables necesitan ser disparadas en algún momento. Los disparadores en E-Code son los llamados Meta-Eventos (hay 128 distintos cuya funcionalidad ha sido prefijada por Emagic). El Meta-Evento 99 con valor 0 actúa como disparador. Este objeto tiene apariencia de botón, pero puede ser enviado también desde un transformador. El problema es que un Meta-Evento no puede disparar el valor de una variable cuyo contenedor sea otro Meta-Evento. Al crear un botón tipo “Disparar al segundo fader” (es el nombre horrible con el que aparece en Logic en español), no se envía ningún valor si el fader al que disparamos envía Meta-Eventos, en cambio si enviará cualquier otro tipo de evento si el fader no es definido para que envíe Meta-Eventos.

Disparo de una variable con un contenedor definido como control número 7

Visualización de la definición del botón: Meta-Evento 99 con valor 0. El resultado es el evento de disparo ("M 99 0") y el valor del fader en ese instante ("1 7 101", dónde "1" es el canal, "7" el contenedor y "101" el valor de la variable)

Ahora la variable tiene un contenedor definido como Meta-Evento número 7. El disparador falla, ya que un Meta-Evento no puede disparar a otro. El resultado es el evento de disparo ("M 99 0") y no el valor del fader en ese instante ("M 7 101")

¿Cómo se representarán esos valores en pantalla?

También podrías decidir el contenedor a usar para tus variables teniendo en cuenta cómo se representarán los datos en pantalla. Por ejemplo, si vas a usar un teclado virtual para “visualizar” las notas almacenadas lo mejor sería operar con eventos de nota como contenedores de variables, ya que el teclado virtual únicamente representa gráficamente ese tipo de eventos.


Variables Locales y Globales

En programación existen variables que se definen y “mueren” al final de un proceso o variables que permanecen operando todo el tiempo en el que usamos la aplicación. Las locales pues dejan de operar, aunque a diferencia de otros lenguajes de programación en E-Code siguen definidas, siguen existiendo. Esto es porque el objeto sigue insertado en el Environment, y aunque ya no disparemos más esa variable, su fader y contenedor sigue ahí.

En REQUIEM hay muchas variables locales, por ejemplo las notas grabadas. Estos datos son leídos y enviados al motor de reproducción, y esos valores ya no vuelven a circular por los objetos hasta que sean reclamados de nuevo.

En cambio, el selector de qué dispositivo virtual de REQUIEM estamos viendo y editando es una variable global, siempre está activa y operando, definiendo qué memorias se visualizarán y qué eventos podrían verse y editarse.

Como ves es todo conceptual, tú decides qué variables son globales o locales, y tener claro qué es cada objeto insertado a modo de variable facilitará mucho el desarrollo de la programación.

Tenemos a dos variables con contenedores control número 7 y control número 10, que son procesadas por un objeto transformador añadiendo 10 a los valores entrantes. Observa que sólo procesará contenedores definidos como controles MIDI 7, 8, 9 y 10 (condición "Dentro de") y que además eliminará cualquier otro evento que no sean esos (condición definida en el menú superior. El resultado es el valor de cada contenedor sumado al operador. Si cada fader tuviera el mismo contenedor, el resultado sería "1 7 110" y "1 7 60", se perdería la individualidad de cada variable.

Nos vemos…

No hay comentarios:

Publicar un comentario