152 lines
4.2 KiB
Text
152 lines
4.2 KiB
Text
|
|
/**
|
||
|
|
Hacked together from the minim tutorial examples
|
||
|
|
**/
|
||
|
|
|
||
|
|
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);
|
||
|
|
|
||
|
|
}
|