/** * Projet NSY 116 * */ //Import de la librairie minim pour le son import ddf.minim.analysis.*; import ddf.minim.*; //Declaration des variables minim Minim minim; AudioInput in; FFT fft; //Définitions des variables int centerX, centerY; float coef; int mode = 1; int modeMax = 4; //Definitions des constantes static int MAX_COEF = 4000; static int SCR_WIDTH = 512; static int SCR_HEIGHT= 512; static int BUFFER_SIZE = 128; void setup() { //Creation de la fenêtre size(SCR_WIDTH, SCR_HEIGHT, P2D); //Definition du poitn central et du coefficient initial centerX = width/2; centerY = height/2; coef = (min(width, height)) * 2.1; //Creation de Minim pour l'analyste audio minim = new Minim(this); //Recuperation du flux entrant in = minim.getLineIn(Minim.STEREO, BUFFER_SIZE); fft = new FFT(in.bufferSize(), in.sampleRate()); //fft.window(FFT.HAMMING); //Definition du framerate frameRate(25); } //Dessin de carre void carre(int value) { rect(centerX - value/2, centerY - value /2, value, value); } //Dessin de cercle void cercle(int value) { ellipse(centerX, centerY, value, value); } //Dessin de triangles dans les deux sens void triangles(int value) { //triangle(centerX - value / 2, centerY, centerX + value / 2, centerY, centerX, centerY - value); triangle(centerX - value / 2, height, centerX + value / 2, height, centerX, centerY - value); triangle(centerX - value / 2, 0, centerX + value / 2, 0, centerX, centerY + value); } void valuelines(int value, int i) { float coef = SCR_WIDTH / BUFFER_SIZE; if(coef < 1.0) { coef = 1.0; } fill(color(value%255, value%255, value%255)); //stroke(color(value%255, value%255, value%255)); rect(i*coef, 0, (i+1)*coef, SCR_HEIGHT); } void draw() { background(0); noFill(); smooth(); //Le centre de l'effet est modifié par clic de la souris //On s'assure que la position reste à l'interieur de la fenêtre if(mousePressed) { centerX = mouseX; centerY = mouseY; if(centerX > width) { centerX = width; } if(centerX < 0) { centerX = 0; } if(centerY > width) { centerY = width; } if(centerY < 0) { centerY = 0; } } fft.forward(in.mix); //on parcours le buffer et l'on dessine les formes voulues //selon le mode actif //for(int i = 0; i < in.bufferSize() - 1; i++) for(int i = 0; i < fft.specSize(); i++) { //On change la couleur aléatoirement stroke(color(random(255), random(255), random(255), random(255))); //on recupere la valeur a utilisé multipliée par le coefficient //int val = (int)(in.mix.get(i)*coef); int val = (int)(fft.getBand(i)*coef); //selon le mode actif on dessine la forme voulue switch(mode) { case 1: carre(val); break; case 2: cercle(val); break; case 3: triangles(val); break; case 4: valuelines(val, i); break; } } } //Gestion de l'appui sur une touche void keyPressed() { //si la touche + ou - est touchée on ajuste la valeurs du coefficient //appliqué pour afficher les formes géométriques //La touche espace recentre l'effet //si c'est une autre touche on bascule entre les modes switch(key) { case '+': coef = coef + 50; if (coef > MAX_COEF) coef = MAX_COEF; break; case '-': coef = coef - 50; if (coef < 100) coef = 0; break; case ' ': centerX = width /2; centerY = height /2; break; default: mode++; if(mode > modeMax) mode = 1; break; } } void stop() { //on ferme minim en sortie de proramme in.close(); minim.stop(); //On ferme globalement l'application super.stop(); }