Created
October 9, 2013 22:53
-
-
Save pingud98/6909910 to your computer and use it in GitHub Desktop.
Graphic equaliser in processing (equalizer)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
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