Une classe a été crée pour l’occasion, qui permet de délimiter une zone et lui associer un son généré par minim.
Dans cet exemple, 20 zones sont disposées sur une ligne.
import processing.video.*;
import ddf.minim.*;
import ddf.minim.ugens.*;
Capture cam;
Minim minim;
AudioOutput out;
zone_son[] lazone=new zone_son[20];
float seuil=1.5;
boolean p=false;
void setup() {
size(640, 480);
cam = new Capture(this);
cam.start();
minim = new Minim(this);
out = minim.getLineOut();
// les zones et notes associées
lazone[0]=new zone_son(0, 200, 20, 20, "G2");
lazone[1]=new zone_son(20, 200, 20, 20, "A2");
lazone[2]=new zone_son(40, 200, 20, 20, "B2");
lazone[3]=new zone_son(60, 200, 20, 20, "C3");
lazone[4]=new zone_son(80, 200, 20, 20, "D3");
lazone[5]=new zone_son(100, 200, 20, 20, "E3");
lazone[6]=new zone_son(120, 200, 20, 20, "F3");
lazone[7]=new zone_son(140, 200, 20, 20, "G3");
lazone[8]=new zone_son(160, 200, 20, 20, "A3");
lazone[9]=new zone_son(180, 200, 20, 20, "B3");
lazone[10]=new zone_son(200, 200, 20, 20, "C4");
lazone[11]=new zone_son(220, 200, 20, 20, "D4");
lazone[12]=new zone_son(240, 200, 20, 20, "E4");
lazone[13]=new zone_son(260, 200, 20, 20, "F4");
lazone[14]=new zone_son(280, 200, 20, 20, "G4");
lazone[15]=new zone_son(300, 200, 20, 20, "A4");
lazone[16]=new zone_son(320, 200, 20, 20, "B4");
lazone[17]=new zone_son(340, 200, 20, 20, "C5");
lazone[18]=new zone_son(360, 200, 20, 20, "D5");
lazone[19]=new zone_son(380, 200, 20, 20, "E5");
}
void draw() {
if (cam.available()) {
// Reads the new frame
cam.read();
image(cam, 0, 0);
for (int i=0; i< lazone.length;i++) {
lazone[i].teste();
lazone[i].dessine();
lazone[i].joue();
}
}
fill(255);
text("Seuil : "+seuil,10,20);
}
// modifier le seuil avec les touches haut et bas
void keyPressed(){
if(key==CODED){
if(keyCode==UP){
seuil+=0.1;
}
if(keyCode==DOWN){
seuil-=0.1;
}
seuil=constrain(seuil,0.1,3);
}
}La classe zone_son est définie comme suit :
class zone_son {
int px, py, lx, ly;
String note;
boolean survol, joue;
zone_son(int px, int py, int lx, int ly, String note) {
this.px=px;
this.py=py;
this.lx=lx;
this.ly=ly;
this.note=note;
survol=false;
joue=false;
}
void dessine() {
stroke(255, 0, 0);
if (survol==true){
fill(255, 0, 0);
}
else {
noFill();
}
rect(px,py,lx,ly);
}
void joue(){
if (survol==true && joue==false){
out.playNote( note );
joue=true;
} else if (survol==false && joue==true){
joue=false;
}
}
void teste() {
int presenceSum = 0;
for (int x=px; x < px+lx; x++) {
for (int y=py;y < py+ly;y++) {
color currColor = cam.pixels[(y*width)+x];
// Extract the red, green, and blue components of the current pixel’s color
int cR = (currColor >> 16) & 0xFF;
int cG = (currColor >> 8) & 0xFF;
int cB = currColor & 0xFF;
presenceSum += cR + cG + cB;
}
}
if (presenceSum/100000.0 > seuil) {
survol=true;
}
else {
survol=false;
}
}
}