Cuando vemos un intérprete tocando su instrumento, el flujo de información suele ser como sigue: El intérprete (debidamente entrenado e instruido en su instrumento) ejerce una acción (por ejemplo, presionar el espacio entre dos trastes de una guitarra eléctrica y hacer vibrar una cuerda por medio del movimiento de una uñeta) y esta acción es transmitida por el instrumento, el cual, con ayuda de las cápsulas generará un voltaje proporcional a la oscilación de la cuerda y lo transmitirá a través de un cable, traspasando esta información al amplificador, el cual “procesará” dicha entrada de información y hará audible dicho voltaje al aumentar su amplitud y hacer vibrar el o los altavoces a los cuales se encuentra conectado.
De la misma forma, en muchas performances interactivas que ocurren en tiempo real (como Emovere) tenemos uno o varios intérpretes reproduciendo un flujo similar de información, donde la guitarra eléctrica es reemplazada por uno o varios sensores y el amplificador es reemplazado por uno o varios computadores y un sistema de sonido que puede ir desde una interfaz de audio y pequeños altavoces hasta un sistema multicanal de una sala.
Ambos ejemplos expuestos anteriormente tienen en común el hecho de tener una entrada, una etapa de procesamiento y una salida, los cuales nombraremos de ahora en adelante como sistemas IPO (input, processing and output por sus siglas en inglés).
En el caso de Emovere, la entrada del sistema corresponde a 16 sensores entregando datos de parámetros fisiológicos (pulso cardiaco y tensión muscular en distintas partes del cuerpo) de 4 intérpretes, lo cual significa finalmente recibir 4000 datos por segundo (cada sensor opera a 250Hz) que deben ser pre-procesados para extraer la información relevante y eliminar el ruido inherente a los circuitos involucrados. Una vez pre-procesados, los datos debían estar correctamente conectados a las unidades de procesamiento adecuadas dentro de la plataforma de interacción diseñada específicamente para la obra, pero que perfectamente podría ser utilizadas en otras obras que sigan el modelo IPO.
Plataforma de Interacción
La plataforma de interacción en sí, puede a su vez ser considerada un sistema IPO: Recibe los datos ya pre-procesados y limpios (input), los procesa a través de múltiples patches de Max/MSP (sistema en que está programada la plataforma) que conoceremos de ahora en adelante como Objetos Sonoros (SOs por sus siglas en inglés, la unidad de procesamiento del sistema) y arroja una o varias salidas las cuales producen sonidos y en algunas oportunidades también datos (output).
La plataforma de interacción, además de ser un IPO en sí misma, provee las funciones necesarias para administrar los distintos SO: Crear un SO, eliminar un SO, guardar la configuración actual del sistema para llamarla posteriormente y evitar hacer el procedimiento paso a paso cada vez que se use. Además, es posible administrar las salidas de audio a través de la plataforma y guardar configuraciones que pueden ir desde la clásica configuración estereofónica hasta configuraciones de un mayor número de parlantes, como cuadrafónicas y sistemas surround que involucren más altavoces.
En cuanto a la administración de la mezcla de audio de los SOs, es posible llevarla a cabo en tiempo real utilizando un controlador MIDI y también es posible guardar las asignaciones de CC (Control Change) del controlador.
El Objeto Sonoro (SO)
Como fue señalado anteriormente, el Objeto Sonoro (SO) es la unidad de procesamiento existente dentro de la plataforma de interacción. Cada Objeto Sonoro está compuesto de múltiples algoritmos desarrollados en Max/MSP, los cuales están destinados a procesar los datos de entrada y arrojar sonido a través de uno o múltiples canales como salida y en algunos casos también arrojar algún dato.
Cada Objeto Sonoro está desligado de la plataforma de interacción excepto por una cantidad mínima de parámetros que necesitan ser leídos por ésta para poder administrar el conjunto de SOs de forma adecuada. Lo mencionado anteriormente otorga un significativo grado de libertad a la hora de programar los SOs, y así poder desarrollar el procesamiento deseado para los datos de entrada sin estar atado a reglas o limitaciones más allá que el poder de procesamiento del computador que alberga la plataforma de interacción.
Para Emovere se desarrollaron variados SOs agrupados en distintos Modos de Interacción, los cuales están enfocados a las distintas partes de la obra y tipos de sensores. A continuación se explican algunos ejemplos:
– En la obertura de la obra, los intérpretes graban textos frente a un micrófono y dichos textos son reproducidos posteriormente de forma granulada (desordenada y en fracciones de longitud generalmente mucho menor comparada con la longitud total de la grabación). Los parámetros que controlan el cómo es desordenada la reproducción del archivo están mediados por la tensión muscular de las extremidades de los bailarines.
– En el acto que continúa luego de la obertura, existe una parte dedicada a la emoción de la rabia. En dicha sección, los intérpretes reproducen sonidos de previamente grabados y editados que retratan dicha emoción. La reproducción de dichos sonidos solo responde a movimientos bruscos y la distribución espacial de dichos sonidos en la sala está mediada por los mismos movimientos.
– En el tercer y último acto de la obra existen diversos bancos de sonidos que son reproducidos de forma polifónica y la frecuencia de la reproducción es siempre un múltiplo del pulso cardiaco de uno o más intérpretes. Para reforzar el sonido que se escucha, también existen recursos visuales mediados por el mismo tipo de datos. La construcción total de ambos recursos resulta ser una amplificación del corazón de los bailarines, pero con la mediación artística inherente a la propuesta de Emovere.
Administrando los recursos del computador
A medida que aumenta la cantidad de entradas, unidades de procesamiento y salidas de un sistema, la tarea de obtener un buen resultado sonoro y de administrar la mezcla durante toda la obra se torna cada vez más compleja. Para Emovere se utilizó un total de 58 canales de audio y 37 SO durante los casi 60 minutos de duración de la obra.
Para poder sostener todo el procesamiento que eso involucra hay que tener ciertas precauciones que serán explicadas a continuación:
1. Administración de CPU
Si bien durante la obra se utilizaron 58 canales y 37 SO, dichos canales y objetos no estaban procesando información en cada uno de los 60 minutos que dura Emovere. Debido a la cantidad de datos por unidad de tiempo que estaban siendo procesados, no resultaba adecuado crear los objetos justo antes de utilizarlos, ya que las funciones asociadas a la creación de objetos interrumpirían la generación de los 4 canales de audio de salida que se utilizaron en la mayoría de las presentaciones, lo cual significa finalmente la generación de 176.400 muestras de audio en cada segundo y 88.200 si la configuración es estereofónica en lugar de cuadrafónica. Si la generación de audio se ve interrumpida solo por una pequeña fracción de tiempo, el público oirá un corte en el audio.
Por este motivo es que para administrar el uso de CPU de forma adecuada resulta más conveniente montar la obra completa en la plataforma de interacción, pero habilitar una función manual que permita declarar un objeto como ocioso y deshabilite la generación de señal de dicho objeto. En el entorno de Max/MSP esto puede realizarse fácilmente incluyendo cada SO dentro de un objeto poly~ y utilizando el mensaje de mute para habilitar y deshabilitar a voluntad el procesamiento de señal de dicho objeto. Este método fue utilizado en Emovere, habilitando un botón con dicho propósito en la consola virtual existente dentro de la plataforma de interacción.
2. Peso y resolución de datos
Otro aspecto importante a tener en cuenta para lograr un buen rendimiento de un sistema de esta naturaleza, es el tamaño de los datos que se están enviando y el impacto que estos tienen en el producto sonoro final. En algunos casos en que una pequeña diferencia en la entrada causará una gran diferencia en la salida, se hace necesario utilizar datos de gran resolución como números de coma flotante, pero otras veces (probablemente la mayor parte del tiempo) no es necesario, ya que basta con una limitada resolución para obtener el resultado sonoro deseado. Resulta un poco complejo ejemplificar este aspecto ya que la variación sonora a la salida de cada objeto puede depender de una o muchas entradas y cada una de ellas puede tener rangos distintos y únicos en cada SO, pero es posible relacionar el aspecto tratado con el nivel de salida de una consola: Probablemente una diferencia de 0.1dBFS no sea significativa al lado de una de 1dBFS. En general, hay que tener en cuenta el compromiso que existe entre la frecuencia a la que llegan los datos y el peso individual de cada dato. En 10 o en 100 datos, que estos sean enteros o de coma flotante podría no ser demasiado significativo, pero cuando estamos hablando de miles de datos por segundo, la diferencia es realmente importante y crucial a la hora de diseñar un sistema como el utilizado en Emovere.
3. Prioridad de datos
Junto con el punto anterior, también es necesario tener en consideración la prioridad de los datos. Max/MSP hace una diferencia entre los datos que son parte de una señal de audio y los que no, así como también en la manera en que operan los objetos dentro del programa asociados a este tipo de datos. Los objetos que generan señal son operados por el DSP de Max/MSP mientras que los que no, se distribuyen en eventos de alta y baja prioridad, siendo cualquiera de estos dos últimos, menos prioritarios que las señales, al menos que se altere intencionadamente la configuración de Max/MSP. Nuevamente este punto es bastante complejo, ya que no existe una regla que siempre funcione para el tipo de interacciones como las que utilizamos en Emovere y por lo tanto la prioridad de los datos debe ser analizada caso a caso. A modo general, los cuatro parámetros cuyo manejo fue clave para diseñar la plataforma de interacción son: El modo Overdrive, SIAI (Schedule in Audio Interrupt) y los objetos defer y deferlow.
4. Enrutamiento de datos y apertura de puertos
De la misma forma que cuando uno escoge el camino más corto para llegar a destino, es necesario proveer el camino más corto posible a cada mensaje ya sea MIDI u OSC. Para la plataforma de interacción se programó una sección exclusiva dedicada a manejar los mensajes. Existen mensajes que llegan a secciones de procesamientos complejos que no se utilizarían normalmente en una función de la obra y que ejecutan funciones de forma remota tales como crear un SO y otros que deben ser entregados con rapidez y rigurosidad temporal tales como el control de nivel de salida de un SO que es modulado por alguna extremidad de los intérpretes. La sección dedicada a la administración de mensajes dentro de la plataforma de interacción abrirá un puerto exclusivo para mensajes de alta prioridad y otro para mensajes de baja prioridad. A su vez, los mensajes de alta prioridad son distribuidos al respectivo SO sin ninguna mediación adicional de algún script o líneas de código adicionales, haciéndola lo más rápida posible.
5. Frecuencia de muestreo y vector de audio
Además de todo lo ya mencionado, existen parámetros que son de vital importancia y que están relacionados con la manera en cómo son procesadas las señales dentro de la plataforma de interacción y en última instancia, dentro de Max/MSP. Como ya fue mencionado, la frecuencia de muestreo hará la diferencia en la cantidad de datos que deben ser procesados por el sistema y también deben coincidir con la frecuencia de muestreo a la cual son almacenados los archivos en los objetos buffer~, de otra forma podrían haber problemas de afinación. En cuanto al vector de audio, existe el I/O Vector y el Signal Vector. El primer parámetro tiene relación con la cantidad de datos que empaquetará por vez Max/MSP para realizar las operaciones de entrada y salida, mientras que el segundo tiene que ver con la cantidad de datos que empaquetará Max/MSP para realizar las operaciones que ocurren luego de la entrada y antes de la salida. Existe un compromiso por lo tanto entre precisión y uso de procesamiento, ya que mientras mayor sean los vectores, el procesamiento usado será menor pero existirá un retardo más evidente entre la entrada y la salida a que si por el contrario los valores de los parámetros son pequeños y en dicho caso habrá un retardo menor pero un procesamiento más intenso.