Skip to content

Instantly share code, notes, and snippets.

@vigonotion
Created January 3, 2018 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vigonotion/21957abcf1aa7cbb3cb9f6d562e4a8da to your computer and use it in GitHub Desktop.
Save vigonotion/21957abcf1aa7cbb3cb9f6d562e4a8da to your computer and use it in GitHub Desktop.
import processing.sound.*;
AudioIn input;
LowPass lowPass;
FFT fft;
int bands = 2048;
int samplerate = 44100;
float[] spectrum = new float[samplerate];
void setup() {
size(600, 600);
fft = new FFT(this, bands);
// Start listening to the microphone
// Create an Audio input and grab the 1st channel
input = new AudioIn(this, 1);
// start the Audio Input
input.start();
lowPass = new LowPass(this);
lowPass.process(input);
delay(100);
println("Starting FFT...");
fft.input(input);
println("FFT loaded.");
}
void draw() {
background(255);
fft.analyze(spectrum);
int biggest = 7;
for(int i = 0; i < samplerate; i++){
// The result of the FFT is normalized
// draw the line for frequency band i scaling it up by 5 to get more amplitude.
line( i, height, i, height - spectrum[i]*height*5 );
if(spectrum[i] > spectrum[biggest]) biggest = i;
}
println(spectrum[biggest]);
float maxFreq = max(spectrum);
int midi= int(69+12*(log((biggest-6)/440)));
float frequency = bandToFrequency(biggest);
textSize(24);
text(frequency, 0,20);
text((int)frequencyToMidi(frequency), 0,40);
text((normalizeMidi(frequencyToMidi(frequency))), 0, 60);
text(midiToNote(normalizeMidi(frequencyToMidi(frequency))), 0, 100);
}
float bandToFrequency(int band) {
return band * samplerate / bands / 2;
}
private float frequencyToMidi(float frequency) {
return 69+12*( log(frequency/440)/log(2) );
}
private float normalizeMidi(float midi) {
if(midi > 127) midi = 127;
else if(midi < 0) midi = 0;
int nearest = (int) midi;
float offset = midi - nearest;
nearest %= 12;
return nearest + offset;
}
String[] midiTable = {"c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "b", "c"};
private String midiToNote(float midi) {
return midiTable[round(midi)];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment