viernes, 4 de marzo de 2011

Codigo en PD y codigo en PROCESSING

Proyecto Maestro de Orquesta

http://www.megaupload.com/?d=L2BOL2XR

jueves, 3 de marzo de 2011

Maestro Musical


“Maestro de Orquesta”

Instrumento basado en el movimiento de las manos.


Introducción:

Tomando como referencia al maestro de orquesta, el encargado de crear composiciones sonoras a través de la comunicación gestual. Este proyecto se basó en aquellos gestos, que dependiendo de la posición de las manos en el espacio, el sonido creado varea en diferentes valores. De una forma similar esos mismos movimientos se replantearon para crear la distorsión de otros sonidos generados por filtros.


PROCESO

Se empezó por hacer una lista de ideas posibles a desarrollar, ver que gestos se adecuaban a ellas, y cuales eran las herramientas tecnológicas para su creación. Se escogio una sola, en este caso el “Maestro de Orquesta”.

Idea

Gestos

Sensores

Maestro de OrquestaInstrumento basado en el movimiento de las manos y la filtración de la voz. Las opciones con las manos constan en elevación, descender, rapidez y apertura.

-Cámara web
-Micrófono
Baile Sonoro

Movimiento corporal al encogerse, expandirse, saltar y mover cualquier articulación estando de pie o sentado.

-15 sensores de movimiento.
-15 acelerómetros.
-15 salidas de audio.
Bloqueando Luz

Movimiento enfocado en las piernas al saltar y sostenerse en diferentes posiciones estando de pie.

-9 sensores de luz.
Sombras Sonoras

Movimiento de las manos al juntarse creando figuras de sombras en una superficie. Reconocimiento de figuras creadas con dedos.

-Cámara web
-Cámara infrarrojo
-Proyector de luz
Simon Rubrick

Movimiento corporal alrededor de un eje. Fusión entre la memoria y el movimiento aleatorio.

-24 pulsadores
-24 leds RGB
Gesto con Ojos

Caras solo con el movimiento de los ojos, movimiento de pupila, el cierre de los párpados, el apretarlos y abrirlos.

-Cámara web
-Cámara Infrarrojo.



Modelo Conceptual:

¿Qué debería hacer el producto?
  • Incentivar al usuario a querer usar el dispositivo musical.
  • Crear una nueva experiencia al generar sonidos sin sujetar algún objeto.
  • Permitir al usuario crear composiciones sonoras a su gusto.
  • Generar el sentimiento de manipular el sonido siendo un maestro de orquesta.
  • Permitir que el usuario cree el sonido base de la composición partiendo de su voz.
  • Permitir el mezclar sonidos a través de filtros de acuerdo a la ubicación de las manos.


¿Cómo se debería comportar?
  • Rápida y efectivamente el cambio de sonido escuchado.
  • Rápida y claramente el feedback sonoro creado al mover las manos.


¿Cómo se debería ver el producto?
  • Con un computador y un sistema de sonido.
  • Con una cámara web enfrente del usuario.
  • En un espacio amplio para poder mover los brazos.



Requerimientos funcionales:
  • Permitir que el sistema reconozca los movimientos del usuario.

  • Mostrar en tiempo real los cambios generados por el usuario al ingresar datos de posición.

  • Permitir que los movimientos gestuales se conviertan en un ambiente de juego y diversión.


Requerimientos no funcionales:

Nombre
Dato
Tipo TamañoPersistenciaObligatorioEditable
por el
usuario
Ejemplo
(opciones)
Estado de
Encendido
Numero
entero
1 digito Si Si Si 1 (ON)
0 (OF)
Categoría
Sonido
De audioHasta 10
MB
TemporalSiSiMicrófono
Reproducción
De Sonido
De audioInfinitoSiSiSiSonido.wav




Requerimientos de contexto:

Físico:
Ambiente de interacción público en un espacio cerrado, poco ruido, con iluminación artificial. En un espacio donde pase gente de varias edades.

Social:
No requiere trabajo colaborativo pero se puede compartir experiencias sonoras con otros usuarios.

Técnico:
Requiere un computador dado a que se ejecutará desde processing y el sonido provendrá desde pure data. Se debe tener una salida de audio. Igualmente se
debe tener una cámara web que reconozca los movimientos del usuario.

Requerimientos de usuario:
Los usuarios puede ser cualquier persona. No debe tener previa experiencia en composiciones musicales. Se enfoca en jóvenes adultos que por su altura alcancen el objetivo de la cámara.

Requerimiento de usabilidad:
Los sonidos generados por el movimiento de las manos serán agradables al oído del humano. El sistema se activará de inmediato cuando el usuario mueva las manos.



Muestra de medición sensor -> variable humana
Hertz entrantes de sonido –Exhalación de aire, expresión vocal.
Ondas de luz rebotan el cuerpo que detectan la velocidad -> Movimiento con las manos gestuales.







Mapping:



Codigos:

//Codigo Processing:

/*
//Codigo Brightness Thresholding por: Golan Levin.
//Modificado por: Allesandro Valli.
//Editado por: Enrique Copete


//Instrucciones:
// Enfocar un espacio donde no exista movimiento.
// Esperar 5 segundos antes de entrar a pantalla, para que solo
// detecte movimiento, y no cree un area sensible activa todo el
// tiempo.
*/

//libreria para conectar en red con puredata
import oscP5.*;
import netP5.*;
import processing.video.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

color black = color(0,200,10,10); //Variable del color que se torna la pantalla.

//variables R,G,B en el ancho y alto de la pantalla.
float memoryR[] = new float[160*120];
float memoryG[] = new float[160*120];
float memoryB[] = new float[160*120];

int wait = 90;

float w1=3; // cual es mas importante de los representantes de arriba( hue, saturation, brightness)
float w2=3;
float w3=1;

//temporal smoothing
final float ALFA=0.4;
float smooth_x;
float smooth_y;
boolean present = false;

float radius = 60;


float distanceBS (float c1, float c2, float c3, float m1, float m2, float m3)//background subsrtaction
{
return sqrt(w1*pow(c1-m1,2)+w2*pow(c2-m2,2)+w3*pow(c3-m3,2));
}



int numPixels;
Capture video;


void setup() {

size(160, 120);

//puerto de conexcion en red con el codigo de pd.
oscP5 = new OscP5(this,12000);
myRemoteLocation = new NetAddress("localhost",12001); //localhost detecta el ip del computador en el momento.
oscP5.plug(this,"test","/test");

strokeWeight(5);
// Uses the default video input, see the reference if this causes an error
video = new Capture(this, width, height, 30);
numPixels = video.width * video.height;
noCursor();
smooth();
}

void test(int theR, int theG, int theB) {
fill(theR,theG,theB);
}


void draw() {
//Detecta el video.
if (video.available()) {
video.read();
image(video,0,0);
video.loadPixels();

loadPixels();

if(wait==0) {
for (int i=0; i<160*120;i++)
{
memoryR[i] = red(video.pixels[i]);
memoryG[i] = green(video.pixels[i]);
memoryB[i] = blue(video.pixels[i]);
}

}


wait--;

float sumx=0;
float sumy=0;
float sumn=0;

for (int y = 0; y <>
for (int x = 0; x <>

int i = x+y*width;

// Identificar si el pixel es mas luminoso que lo detectado.
if (distanceBS(red(video.pixels[i]),green(video.pixels[i]),blue(video.pixels[i]), memoryR[i], memoryG[i], memoryB[i])>radius) {
sumx+=x;
sumy+=y;
sumn+=1.0;
}
else { // Si no es mas luminoso entonces

if (wait<10)>
pixels[i] = black; // make it black = color green
}
}
} //cierra el for de x

updatePixels();

if(sumn>500) {//a veces con unos colores para quitarle el ruido se le puede subir este valor

//variables tracking de la esfera que se mueve hacia el movimiento detectado.
int tracking_x = (int) (sumx/sumn);
int tracking_y = (int)(sumy/sumn);
println(tracking_x + " " + tracking_y);

smooth_x =(1.0-ALFA)*smooth_x + ALFA*tracking_x;
smooth_y =(1.0-ALFA)*smooth_y + ALFA*tracking_y;

if (!present) {
smooth_x = tracking_x;
smooth_y = tracking_y;
}
present = true;

//ellipse para ver donde se encuentra el tracking.
//fill(5,100,100,255);
noFill();
noStroke();

//parametros del tracking para que sea exacto la posicion, en ves de smooth, poner tracking
if (wait<0)>
ellipse ((int)smooth_x, (int)smooth_y,10,10);
}
}

else {
present = false;
}

//conector con pd, datos a enviar
OscMessage myOscMessage = new OscMessage("/test");
myOscMessage.add((int)smooth_x);
myOscMessage.add((int)smooth_y);

//areas sensibles a enviar a pd para diferenciar los sonidos.
if (smooth_x <>
myOscMessage.add (0);
println ("IZQ");
}
else if (smooth_x > 110) {
myOscMessage.add (2);
println ("DER");
}
else {
myOscMessage.add (1);
println ("CEN");
}

oscP5.send(myOscMessage, myRemoteLocation);

}

}

// incoming osc message are forwarded to the oscEvent method.
void oscEvent(OscMessage theOscMessage) {
// get and print the address pattern and the typetag of the received OscMessage
//println("### received an osc message with addrpattern "+theOscMessage.addrpattern()+" and typetag "+theOscMessage.typetag());
theOscMessage.print();
}






Referencias:




1.
http://www.youtube.com/user/jeffreystolet#p/a/f/0/AUaK9-qiJ6M
http://music.uoregon.edu/people/faculty/stolet.htm

En el año 2004, Jeffrey Stoler desarrollo “Tokyo Lick”. Este proyecto consiste en el movimiento de las manos en dos esferas infrarojas no visibles para el ojo humano el cual crea el sonido. La relación con este proyecto es el movimiento de las manos pero difiere en que este proyecto las manos se mueven en el eje X y Y, mienstras ese se genera a través de la distancia.


2.
http://interactive-sound.blogspot.com/

Un proyecto desarrollado por Rhys Griffiths,Serger Viranian y Rong Ma, llamado “virtual dj”. Este proyecto consiste en crear, distorsionar, scratch, entre otros sonidos creados por el cuadrante donde se encuentra las manos. La relación con este proyecto es su funcionamiento y su contexto para ser creado, pero difiere en la forma de manejarlo.


3.
http://www.tammen.org/pro_solo.html

En el año 2001, Hans Tammen desarrollo el proyecto de la “Endangered Guitar”. Este proyecto consiste en tocar una guitarra con las manos a través de sensores de proximidad el cual le permite recrear hasta tres sonidos a la vez. La relación con este proyecto es el crear sonidos con el movimiento de las manos, pero difiere en que el sonido es detectado por los sensores, en cambio este se detecta a través de una cámara web.


4.

http://thebeamz.com/

En el año 2010, una compañia de productos de sonidos interactivos desarrollo un instrumento musical llamado “Beamz”. Este poryecto consiste en detectar el movimiento de las manos a través de la luz de un laser. La relación con este es el movimiento de las manos solo que difiere en la forma de aplicación.


5.
http://www.openprocessing.org/visuals/?visualID=10435

En Junio 16 del año 2010, Hidetoshi Shimodaira, desarrollo un código en processing el cual consiste en, a través de la captura de video, poder mover un circulo en pantalla con el movimiento de las manos y que dependiendo de su posición, un sonido es recreado. La relación con este proyecto es que el movimiento es detectado a través de la cámara web y se recrean sonidos predeterminados. Pero el nuestro difiere en que el circulo no intenta alejarse del movimiento de las manos, sino que tiende a dirigirse hacia aquel. Igualmente el sonido creado no varea tanto en la posición del círculo, sino en la posición de las manos.