/** Hacked together from the minim tutorial examples runs with simple analogue firmata on arduino **/ import ddf.minim.analysis.*; import ddf.minim.*; import cc.arduino.*; import processing.serial.*; Arduino arduino; int ledPinOne = 9; // LED connected to digital pin 9 int ledPinTwo = 10; int ledPinThree = 11; int ledPinFour = 6; int ledPinFive = 5; int ledPinSix = 3; Minim minim; //AudioPlayer jingle; FFT fftLin; FFT fftLog; AudioInput jingle; float height3; float height23; float spectrumScale = 4; PFont font; void setup() { size(512, 480); height3 = height/3; height23 = 2*height/3; minim = new Minim(this); jingle = minim.getLineIn(); //minim.loadFile("jingle.mp3", 1024); // loop the file //jingle.loop(); // create an FFT object that has a time-domain buffer the same size as jingle's sample buffer // note that this needs to be a power of two // and that it means the size of the spectrum will be 1024. // see the online tutorial for more info. fftLin = new FFT( jingle.bufferSize(), 1024);//jingle.sampleRate() ); // calculate the averages by grouping frequency bands linearly. use 30 averages. fftLin.linAverages(12 ); // create an FFT object for calculating logarithmically spaced averages fftLog = new FFT( jingle.bufferSize(), jingle.sampleRate() ); // calculate averages based on a miminum octave width of 22 Hz // split each octave into three bands // this should result in 30 averages fftLog.logAverages( 22, 3 ); rectMode(CORNERS); font = loadFont("ArialMT-12.vlw"); arduino = new Arduino(this, Arduino.list()[1]); arduino.pinMode(ledPinOne, Arduino.OUTPUT); arduino.pinMode(ledPinTwo, Arduino.OUTPUT); arduino.pinMode(ledPinThree, Arduino.OUTPUT); arduino.pinMode(ledPinFour, Arduino.OUTPUT); arduino.pinMode(ledPinFive, Arduino.OUTPUT); arduino.pinMode(ledPinSix, Arduino.OUTPUT); } void draw() { background(0); textFont(font); textSize( 18 ); float centerFrequency = 0; // perform a forward FFT on the samples in jingle's mix buffer // note that if jingle were a MONO file, this would be the same as using jingle.left or jingle.right fftLin.forward( jingle.mix ); fftLog.forward( jingle.mix ); // draw the full spectrum { noFill(); } // no more outline, we'll be doing filled rectangles from now noStroke(); // draw the linear averages { // since linear averages group equal numbers of adjacent frequency bands // we can simply precalculate how many pixel wide each average's // rectangle should be. int w = int( width/fftLin.avgSize() ); for(int i = 0; i < fftLin.avgSize(); i++) { // if the mouse is inside the bounds of this average, // print the center frequency and fill in the rectangle with red //if ( mouseX >= i*w && mouseX < i*w + w ) //{ // centerFrequency = fftLin.getAverageCenterFrequency(i); // fill(255, 128); //text("Linear Average Center Frequency: " + centerFrequency, 5, height23 - 25); // fill(255, 0, 0); //} //else { fill(128); } // draw a rectangle for each average, multiply the value by spectrumScale so we can see it better fill(0, 0,int(fftLin.getAvg(i)*20*spectrumScale)); rect(i*w, height, i*w + w, height - int(fftLin.getAvg(i)*20*spectrumScale));//these things draw the wrong way up... //rect(i*w, height, i*w + w, int(fftLin.getAvg(i)*10*spectrumScale)); stroke(255); line(i*w, height, i*w, height - 10) ; noStroke(); print(i + " " + fftLin.getAvg(i)*20*spectrumScale + " "); if (i==0) { arduino.analogWrite(ledPinOne, int(fftLin.getAvg(i)*10*spectrumScale)); } if (i==1) { arduino.analogWrite(ledPinTwo, int(fftLin.getAvg(i)*10*spectrumScale)); } if (i==2) { arduino.analogWrite(ledPinThree, int(fftLin.getAvg(i)*10*spectrumScale)); } if (i==3) { arduino.analogWrite(ledPinFour, int(fftLin.getAvg(i)*10*spectrumScale)); } if (i==4) { arduino.analogWrite(ledPinFive, int(fftLin.getAvg(i)*10*spectrumScale)); } if (i==5){ arduino.analogWrite(ledPinSix, int(fftLin.getAvg(i)*10*spectrumScale)); } } } println(); delay(30); }