Slight modifications to original for different LCD and mbed pin outs

Dependencies:   mbed

Fork of GT_Tuner by Andrew Durand

Revision:
0:490e67fb09c2
Child:
1:ae7d0cf78b3e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Oct 24 23:03:27 2011 +0000
@@ -0,0 +1,177 @@
+    //////////////////////////////////////////
+  //                                          //
+//    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;
+
+    }
+
+
+
+}
\ No newline at end of file