![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Simple guitar tuner
main.cpp
- Committer:
- adurand
- Date:
- 2011-10-24
- Revision:
- 0:490e67fb09c2
- Child:
- 1:ae7d0cf78b3e
File content as of revision 0:490e67fb09c2:
////////////////////////////////////////// // // // Guitar Tuner via Goertzel's Algorithm // // Created by: Andrew Durand // // // ////////////////////////////////////////// #include "mbed.h" #include "adc.h" #include "NokiaLCD.h" #define PI 3.1415 #define SAMPLE_RATE 24000 DigitalOut led_low(LED1); DigitalOut led_ok(LED2); DigitalOut led_high(LED4); InterruptIn button1(p12); //LCD and Other Random Variables NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type int string_select = 0; float high, high1, high2, high3, high4, high5, high6, high7, high8, in_tune, in_tune1, in_tune2, in_tune3, low, low1, low2, low3, low4, low5, low6, low7, low8, note; char* key; int Counter = 0; int Buffer[6000]; float goertzelFilter(int samples[], float freq, int N) { float s_prev = 0.0; float s_prev2 = 0.0; float coeff,normalizedfreq,power,s,k; int i; normalizedfreq = freq / SAMPLE_RATE; coeff = 2*cos(2*PI*normalizedfreq); for (i=0; i<N; i++) { s = samples[i] + coeff * s_prev - s_prev2; s_prev2 = s_prev; s_prev = s; } power = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2; return power; } ADC adc(SAMPLE_RATE, 1); void sample_audio(int chan, uint32_t value) { Buffer[Counter] = adc.read(p20); Counter += 1; } void button1_pressed() { string_select++; if (string_select > 5) string_select = 0; } int main() { //Interupt for Switching Strings button1.mode(PullDown); button1.rise(&button1_pressed); //Setup LCD lcd.background(0xF0000F); lcd.cls(); while (1) { switch (string_select) { case 0: note = 82; key= "E2"; break; case 1: note = 110; key= "A2"; break; case 2: note = 147; key= "D3"; break; case 3: note = 196; key= "G3"; break; case 4: note = 247; key= "B3"; break; case 5: note = 330; key= "E4"; break; } //Prepare for burst mode on all ADC pins and set up interrupt handler (using ADC library from Simon Blandford adc.append(sample_audio); adc.startmode(0,0); adc.burst(1); adc.setup(p20,1); //start the interrupt and wait for about 4096 samples adc.interrupt_state(p20,1); wait(.2); //Finsh up - Unset pin 20 adc.interrupt_state(p20,0); adc.setup(p20,0); int actual_rate = adc.actual_sample_rate(); //for debugging tell the terminal sample rate and how many samples we took printf("Requested max sample rate is %u, actual max sample rate is %u.\n", SAMPLE_RATE, actual_rate); printf("We did %i samples\n",Counter); high1 = goertzelFilter(Buffer, (note+18), Counter); high2 = goertzelFilter(Buffer, (note+16), Counter); high3 = goertzelFilter(Buffer, (note+14), Counter); high4 = goertzelFilter(Buffer, (note+12), Counter); high5 = goertzelFilter(Buffer, (note+10), Counter); high6 = goertzelFilter(Buffer, (note+8), Counter); high7 = goertzelFilter(Buffer, (note+6), Counter); high8 = goertzelFilter(Buffer, (note+4), Counter); in_tune1 = goertzelFilter(Buffer, (note+0.5), Counter); in_tune2 = goertzelFilter(Buffer, note, Counter); in_tune3 = goertzelFilter(Buffer, (note-0.5), Counter); low1 = goertzelFilter(Buffer, (note-4), Counter); low2 = goertzelFilter(Buffer, (note-6), Counter); low3 = goertzelFilter(Buffer, (note-8), Counter); low4 = goertzelFilter(Buffer, (note-10), Counter); low5 = goertzelFilter(Buffer, (note-12), Counter); low6 = goertzelFilter(Buffer, (note-14), Counter); low7 = goertzelFilter(Buffer, (note-16), Counter); low8 = goertzelFilter(Buffer, (note-18), Counter); in_tune = (in_tune1 + in_tune2 + in_tune3)/3; high = (high1 + high2 + high3 + high4 + high5 + high6 + high7 + high8)/8; low = (low1 + low2 + low3 + low4 + low5 + low6 + low7 + low8)/8; if ((in_tune > high) && (in_tune > low)) { led_high = 0; led_ok = 1; led_low = 0; } else if (high > in_tune) { led_high = 1; led_ok = 0; led_low = 0; } else if (low > in_tune) { led_high = 0; led_ok = 0; led_low = 1; } else { led_high = 0; led_ok = 0; led_low = 0; } // Display on the LCD lcd.locate(0,1); lcd.printf("::Guitar Tuner::"); lcd.locate(0,3); lcd.printf("Tuning String: %i", (6-string_select)); lcd.locate(0,5); lcd.printf("%s at %i Hz",key, (int) note); lcd.locate(5,7); if (led_ok) lcd.printf("In Tune!"); else if (led_low) lcd.printf("Too Low "); else if (led_high) lcd.printf("Too High"); else lcd.printf("~~~~~"); Counter = 0; } }