martes, 1 de marzo de 2011

AIR GUITAR PD: Códigos fuente

Para la realización de AIR GUITAR PD, un proyecto que simula una guitarra aérea con sonido, se programó comunicación UDP en localHost entre los programas processing y pureData, aprovechando las ventajas de los mensajes OSC, se hizo un tracking de tres colores en processing, y las variables de posición de estos track fueron enviadas a pureData, en donde modifican una serie de parámetros que crean distintas melodías y tonos. El proyecto de PD puede descargarlo haciendo clic en este enlace.

A continuación, la parte correspondiente al código programado en processing:

/*tracking de color creado originalmente por Golan Levin
modificado en primera instancia por Allesandro Valli para mejorar captura
modificafo por Enrique Copete para que pueda capturar más de un color a la vez
Tracking de Color para capturar tres colores, para el proyecto Air GuitarPD
JUAN MANUEL ANDRADE 2011
captura tres colores diferentes desde la camara, toma sus posiciones y evalúa su
presencia, estos datos son enviados a PureData a através de las librerías
oscP5 y netP5
*/


import processing.video.*;
import oscP5.*;
import netP5.*;

color black = color(0);
color white = color(255);

//HSB del primer color 1 rojo
float t1 = 320; //hue
float t2 = 44; //saturation
float t3 = 98; //brightness

//HSB del segundo color 2 naranja/verde
float tt1 = 135; //hue
float tt2 = 39; //saturation
float tt3 = 79; //brightness

//HSB del tercer color 3 azul/naranja
///***********************
float ttt1 = 219; //hue
float ttt2 = 58; //saturation
float ttt3 = 96; //brightness

///***********************

float w1=10; //10 cual es mas importante de los representantes de arriba( hue, saturation, brightness)
float w2=10;
float w3=10;
//variables del reconocimiento de color rojo,
//las que se usan para determinar la escala y el nivel del wah wah
int posX;
int posY;

//variables de la posición horizontal de cada identificador
//para saber si está ausente o no
//la posicion del segundo es la misma posX
int posUno;
int posTres;

//variable que se enviara a PD, dependiendo de la presencia de los colores
int melodia;

boolean tag1;
boolean tag2;
boolean tag3;

float radius = 80;
float colorUno (float c1, float c2, float c3) //sacando la distancia del color 1
{
return sqrt(w1*pow(c1-t1,2)+w2*pow(c2-t2,2)+w3*pow(c3-t3,2));
}

float colorDos (float c1, float c2, float c3) //sacando la distancia del color 2
{
return sqrt(w1*pow(c1-tt1,2)+w2*pow(c2-tt2,2)+w3*pow(c3-tt3,2));
}

///***********************
float colorTres (float c1, float c2, float c3) //sacando la distancia del color 3
{
return sqrt(w1*pow(c1-ttt1,2)+w2*pow(c2-ttt2,2)+w3*pow(c3-ttt3,2));
}
///***********************
//variables globales
int numPixels;
Capture video;
OscP5 oscP5;
NetAddress conexion;
////////////////////////////////////////////////////////////////////////////////////////

void setup() {
size(320, 240,P2D);
oscP5 = new OscP5(this, 5000);
//creación del puerto para enviar mensajes
conexion = new NetAddress("localHost", 5001);
colorMode(HSB, 360, 100, 100);
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;
smooth();
noStroke ();
}


///////////////////////////////////////////////////////////////////////////////

void draw() {

if (video.available()) {
video.read();
image (video, 0, 0);
video.loadPixels();
//si se desea hacer track de menos de tres, alguno de estos se puede deshabilitar
//color 1
track (0);
//color 2
track (1);
///***********************
//color 3
track (2);
///***********************
video.updatePixels ();
//no es necesario que se vea el video, aunque se se desea:
// image (video, 0, 0);
}

}

//método que divide el track en los 3 colores, referenciados arriba
void track (int cualColor) {
float sumx=0;
float sumy=0;
float sumn=0;
float colorr = 0;
for (int y = 0; y <>
for (int x = 0; x <>

int i = x+y*width;
//track de cada uno de los colores
switch (cualColor) {
//color 1
case 0:
colorr = colorUno (hue(video.pixels[i]),saturation(video.pixels[i]),brightness(video.pixels[i]));
break;
//color 2
case 1:
colorr = colorDos (hue(video.pixels[i]),saturation(video.pixels[i]),brightness(video.pixels[i]));
break;
///***********************
//color 3
case 2:
colorr = colorTres (hue(video.pixels[i]),saturation(video.pixels[i]),brightness(video.pixels[i]));
///***********************
}
if (colorr
sumx+=x;
sumy+=y;
sumn+=1.0;
}

} //cierra el for de x
}
if(sumn>0)
{
//tracking para cada color
//para cada caso se comparten las variables de cálculo
//pero cada una captura un color diferente
int tracking_x = (int)(sumx/sumn);
int tracking_y = (int)(sumy/sumn);
colorMode (RGB, 255, 255, 255);
switch (cualColor) {
//color 1
case 0:
fill (255, 0, 0);
ellipse (tracking_x, tracking_y,10,10);
posUno = tracking_x;
break;
//color 2
case 1:
fill (0,255,0);
ellipse (tracking_x, tracking_y,10,10);
posX = tracking_x;
posY = tracking_y;
///***********************
//color 3
case 2:
fill (0,0,255);
ellipse (tracking_x, tracking_y,10, 10);
posTres = tracking_x;
///***********************
break;
}
colorMode(HSB, 360, 100, 100);
//valores a enviar
}
sendM();
//println("posicion en X "+posX);
}

//método para determinar qué valor enviar a PD, de acuerdo
//a la asusencia o presencia de los colores
void notas(){
if(posUno == 0){
melodia = 1;
}
if(posX == 0){
melodia = 2;
}
if(posTres == 0){
melodia = 3;
}
if(posUno == 0 && posX == 0){
melodia = 4;
}
if(posUno == 0 && posTres == 0){
melodia = 5;
}
if(posX == 0 && posTres == 0){
melodia = 6;
}
if(posX == 0 && posUno == 0 && posTres == 0){
melodia = 7;
}
if(posX != 0 && posUno != 0 && posTres != 0){
melodia = 8;
}
}

//método para enviar los mensajes a PureData
void sendM(){
notas();
//crear un nuevo mensaje Osc con un identificador
OscMessage mensaje1 = new OscMessage("/posX");
//adicionar valores enteros al mensaje
mensaje1.add((int)posX);
mensaje1.add((int)posY);
mensaje1.add((int)melodia);
//enviarlo a una direccion remota
oscP5.send(mensaje1, conexion);
//println("enviando "+posUno);
}

No hay comentarios:

Publicar un comentario