Skip to content

Instantly share code, notes, and snippets.

@pingud98
Created October 9, 2013 22:53
Show Gist options
  • Save pingud98/6909910 to your computer and use it in GitHub Desktop.
Save pingud98/6909910 to your computer and use it in GitHub Desktop.
Graphic equaliser in processing (equalizer)
/**
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();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment