commit 94fd7a2a8d9b3d81f4e9d9172772caef5d625e59 Author: James Devine Date: Sat Oct 12 15:32:22 2013 -0700 diff --git a/SpectrumArdunio b/SpectrumArdunio new file mode 100644 index 0000000..b6449c4 --- /dev/null +++ b/SpectrumArdunio @@ -0,0 +1,152 @@ +/** +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); + +} \ No newline at end of file