Plus : un piano avec la webcam

Ce code permet de jouer des notes en fonction de la luminosité dans des portions d’images provenant de la webcam. Les sons sont déclenché par un passage du noir au blanc. Le seuil est paramétrable avec les touches haut et bas du clavier. Ce script utilise processing 2.0.

Précédent | 19/27 | Suivant

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;
   }
 }
}