Performance inacabada para fachada digital y coreografía
El proyecto que hoy les cuento es uno de esos que se va construyendo poco a poco. Recientemente conocí Jaime de Arteklab impulsor convencido de esta aventura y facilitador de los primeros pasos gracias a su residencia en etopia_ durante este mes.
Hace tiempo que le tenía ganas a la fachada digital de etopia_ pero en estos casos ya se sabe, si hacemos algo hagámoslo bien. Para hacer algo "normal" no nos ponemos. Y eso que hemos hecho pero no hemos terminado. Este proyecto aún está en curso.
Hablé con Nestor y me dijo un poco lo mismo. Intercambiamos ideas pero coincidiamos en que la primera obra con que uno se enfrenta a la fachada tenía que ser algo diferente.
Y hete aquí que las ideas de Jaime encendieron la chispa. Enseguida en mi cabeza todo empezó a encajar.
La propuesta era hacer un espectáculo de danza interactivo. Coincidía que Sylvie está también estos días en etopia_ y si le apeteciera sería la primera en probar. Por lo que conozco está entusiasmada con la idea.
Vayamos por partes.
Enseguida diseñé tres escenas para la fachada.
Una basada en triánculos,
otra con curvas de Bezier
y una última con partículas.
El reto era controlarlas, crear la interacción y conseguir que esta fuera en la pasarela. Así el intérprete de la coreografía danzaría con los gráficos en tiempo real.
Al haber una distancia considerable entre el control y la pasarela, programé en processing un sketch de visualización y otro de transmisión de datos. El primero recibiría los datos mediante TCP/IP para producir la representación de las escenas que había ideado. Y el segundo conectado a un Arduino leería los datos de dos acelerómetros colocados en las muñecas del performer y los envíaría hacia el que realiza la presentación.
Para ello configuré un router wifi que viera un equipo situado en el control de la pantalla y otro cerca del punto en el que se fuera a desarrollar la performance. Para las pruebas usé un Arduino conectado vía USB con el ordenador que estaba en la pasarela. Tanto Jaime como yo no eramos performers excesivamente exigentes y por lo tanto no nos importaba que hubiera un cable colgando. Para la versión definitiva como mínimo conectaremos el arduino con el pc mediante RF, Bluetooth o ANT ya veremos.
Las pruebas que hicimos nos avisan de que el punto de acceso tiene que tener un alcance largo para facilitar el que se cubra toda la pasarela y así conseguir un resultado más espectacular.
Aún hay alguna cuestion pendiente de como controlar el desarrollo del espectáculo y hay otras que están avanzadas como es que los algoritmos que se incluyen más abajo se adaptan al performer.
El sketch de Arduino escala los resultados produciendo una salida escalando el valor obtenido en cada momento conrespecto al valor máximo y mínimo que se haya obtenido en la performance. Sería parecido a los principios de los compresores de audio.
int lmax[6];
int lmin[6];
int lectura[6];
void setup()
{
Serial.begin(38400);
for (int i=0; i<6;i++)
{
lmax[i]=1;
lmin[i]=127;
}
}
void loop()
{
for (int i=0; i<6;i++)
{
lectura[i] = analogRead(i)/4;
if (lectura[i] > lmax[i])
{ lmax[i] = lectura[i]; }
if (lectura[i] < lmin[i])
{ lmin[i] = lectura[i]; }
Serial.write(int(map(lectura[i], lmin[i], lmax[i], 1, 127)));
}
delay(100);
}
El primer sketch de processing es muy simple ya que lo único que hace es leer los datos del arduino y enviarlos por red al otro ordenador.
import processing.net.*;
import processing.serial.*;
Serial myPort;
Server s;
Client c;
int dato = 0;
void setup()
{
size(45, 25);
background(204);
stroke(0);
frameRate(30);
s = new Server(this, 12345);
myPort = new Serial(this, "/dev/ttyACM0", 57600); // poner el puerto serie en el entrecomillado según SO.
}
void draw()
{
if ( myPort.available() > 6)
{
for(int i=0; i<6;i++)
{
dato = c.read();
s.write(dato);
}
}
}
El segundo skech es el que se encarga de la visualización, se basa en el ejemplo Demo->Graphics->Particles de processing y para hacerlo funcionar basta abrir el ejemplo y sustituir el programa demo por este.
int ancho = 270;
int alto = 63;
import processing.net.*;
ParticleSystem ps;
ParticleSystem2 ps2;
PImage sprite;
import processing.serial.*;
import processing.net.*;
Serial myPort;
int val;
int dato[] = new int[6];
int dato_max[] = new int[6];
int dato_min[] = new int[6];
Client c;
void setup()
{
size(1024, 768, P2D);
orientation(LANDSCAPE);
sprite = loadImage("sprite.png");
ps = new ParticleSystem(1024);
ps2 = new ParticleSystem2(1024);
hint(DISABLE_DEPTH_MASK);
dato[0] = ancho / 10;
dato[1] = alto / 15;
dato[2] = 0;
dato[3] = ancho - (ancho / 10);
dato[4] = alto - (alto / 10);
dato[5] = 0;
dato_min[0] = ancho;
dato_min[1] = alto;
dato_min[2] = ancho;
dato_min[3] = alto;
dato_min[4] = ancho;
dato_min[5] = alto;
for(int i=0; i<6;i++)
{
dato_max[i] = 0;
}
noStroke();
background(55);
// c = new Client(this, "xxx.xxx.xxx.xxx", xxxxx);
c = new Client(this, "127.0.0.1", 12345);
}
void draw ()
{
fill(255, 35);
rect(0, 0, ancho, alto);
fill(0,254,254);
if (c.available() > 6)
{
for(int i=0; i<6;i++)
{
dato[i] = c.read();
}
stroke(255);
}
ps.update();
ps.display();
ps.setEmitter(dato[0],dato[1]);
ps2.update();
ps2.display();
ps2.setEmitter(dato[3], dato[4]);
}
Como conclusión comentar que el proyecto está en un 90% acabado. Faltaría poner fecha y contar con una infraestructura potente y adecuada. No descartamos triunfar en pocos días con esta nueva propuesta. ¿Alguien se anima?