/** Hacked together from the minim tutorial examples **/ import ddf.minim.analysis.*; import ddf.minim.*; 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"); } 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 + " "); } } println(); }