Collin Rusch / Mbed 2 deprecated 4180_Tuner

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE FFT PinDetect MAX4466

Files at this revision

API Documentation at this revision

Comitter:
collinrusch
Date:
Sun Apr 28 20:46:45 2019 +0000
Parent:
1:c5772cef09bc
Commit message:
1.0

Changed in this revision

4DGL-uLCD-SE.lib Show annotated file Show diff for this revision Revisions of this file
FFT.lib Show annotated file Show diff for this revision Revisions of this file
MAX4466.lib Show annotated file Show diff for this revision Revisions of this file
PinDetect.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/4DGL-uLCD-SE.lib	Sun Apr 28 20:46:45 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/4180_1/code/4DGL-uLCD-SE/#2cb1845d7681
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FFT.lib	Sun Apr 28 20:46:45 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/zchen78/code/FFT/#e7e724e172dc
--- a/MAX4466.lib	Fri Oct 23 18:39:14 2015 +0000
+++ b/MAX4466.lib	Sun Apr 28 20:46:45 2019 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/mgolino/code/MAX4466/#712373b300a2
+https://os.mbed.com/users/collinrusch/code/MAX4466/#0090c008b13e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PinDetect.lib	Sun Apr 28 20:46:45 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/AjK/code/PinDetect/#cb3afc45028b
--- a/main.cpp	Fri Oct 23 18:39:14 2015 +0000
+++ b/main.cpp	Sun Apr 28 20:46:45 2019 +0000
@@ -1,14 +1,188 @@
 #include "mbed.h"
 #include "MAX4466.h"
-Serial pc (USBTX, USBRX);
+#include "FFT.h"
+#include "rtos.h"
+#include "uLCD_4DGL.h"
+#include "PinDetect.h"
+#include <string>
+#include <math.h>
 
 
-MAX4466 mic(p20);
+PinDetect pb1(p6);
+PinDetect pb2(p7);
+PinDetect pb3(p8);
+PinDetect pb4(p9);
+DigitalIn pb5 (p10);
+MAX4466 mic(p15);
+PwmOut speaker(p21);
+uLCD_4DGL uLCD(p28,p27,p30);
+Timer tim;
+
+#define MAX_NOTE 11
+#define MAX_OCT 8
+std::string notes[] = {"C","C#/Db","D","D#/Eb","E","F","F#/Gb","G","G#/Ab","A","A#/Bb","B"};
+float notefreqs[] = {16.35,17.32,18.35,19.45,20.60,21.93,23.12,24.50,25.96,27.50,29.14,30.87};
+
+volatile float readfreq = 0.00;
+volatile int octave = 0;
+volatile int indx = 0;
+
+void pb1_note_down(void) {
+    if(!pb1) {
+        indx -= 1;
+        if (indx < 0) {
+            indx = MAX_NOTE; 
+        }
+    }
+}
+
+void pb2_note_up (void) {
+    if(!pb2) {
+        indx += 1;
+        if (indx > MAX_NOTE) {
+            indx = 0; 
+        }
+    }
+}
+
+void pb3_oct_down (void) {
+   if(!pb3) {
+        octave -= 1;
+        if (octave < 0) {
+            octave = MAX_OCT; 
+        }
+    }
+}
 
-int main()
-{
-    while (1) {
-        mic.volume_indicator();
-        pc.printf("\n\r Level is %f", mic.sound_level());
+void pb4_oct_up (void) {
+   if(!pb4) {
+        octave += 1;
+        if (octave > MAX_OCT) {
+            octave = 0; 
+        }
+    }
+}
+//Plays speaker at desired frequency selected by user
+void playspeaker(void const *arguments) {
+   while (1) {
+        speaker.period(1.0/(notefreqs[indx] * pow(2.0f,octave)));
+        speaker = 0.0;
+        while(!pb5) {
+            speaker = 0.5;
+        }
+        speaker = 0.0;
+        Thread::wait(100);
+    }
+}
+//Print frequencies of notes, detected freq, and circle display graphic to LCD
+void ulcd(void const *arguments) {
+    int cx;
+    int old_i = 0;
+    int old_oct= 0;
+    int i;
+    int oct;
+    while(1) {
+        i = indx;
+        oct = octave;
+        if (old_oct != oct) {
+            old_oct = oct;
+            uLCD.locate(1,7);
+            uLCD.printf("           ");
+        }
+        if (old_i != i) {
+            old_i = i;
+            uLCD.locate(1,7);
+            uLCD.printf("           ");
+            uLCD.locate(1,3);
+            uLCD.printf("           ");
+        }
+        uLCD.locate(1,3);
+        uLCD.printf("%s%D", notes[i], oct);
+        uLCD.locate(1,7);
+        uLCD.printf("%.2f Hz.", notefreqs[i] * pow(2.0f,oct));
+        uLCD.locate(1,14);
+        uLCD.printf("%.2f Hz.", readfreq);
+        uLCD.filled_circle(108, cx, 5, BLACK);
+        if (readfreq <= (notefreqs[i] * pow(2.0f,oct))+ 5 && readfreq >= (notefreqs[i] * pow(2.0f,oct)) - 5) {
+            cx = 64;
+            uLCD.line(88, 64, 128, 64, GREEN);
+            uLCD.filled_circle(108, cx, 5, GREEN);
+        } else {
+            cx = 64 + (notefreqs[i] * pow(2.0f,oct)) - readfreq;
+            if (cx < 0) {
+                cx = 0; 
+            } else if (cx > 128) {
+                cx = 128;    
+            }
+            uLCD.line(88, 64, 128, 64, RED);
+            uLCD.filled_circle(108, cx, 5, RED);
+        }
+        Thread::wait(10);
     }
+}
+
+int main() {
+    //set up pindetect
+    pb1.mode(PullUp);
+    pb2.mode(PullUp);
+    pb3.mode(PullUp);
+    pb4.mode(PullUp);
+    pb5.mode(PullUp);
+    wait(0.01);
+    pb1.attach_deasserted(&pb1_note_down);
+    pb2.attach_deasserted(&pb2_note_up);
+    pb3.attach_deasserted(&pb3_oct_down);
+    pb4.attach_deasserted(&pb4_oct_up);
+    pb1.setSampleFrequency();
+    pb2.setSampleFrequency();
+    pb3.setSampleFrequency();
+    pb4.setSampleFrequency();
+    //set intial lcd values
+    uLCD.background_color(BLACK);
+    uLCD.baudrate(3000000);
+    uLCD.line(88, 0, 88, 128, WHITE);
+    uLCD.color(WHITE);
+    uLCD.locate(1,1);
+    uLCD.printf("Note:");
+    uLCD.locate(1,5);
+    uLCD.printf("Note Freq:");
+    uLCD.locate(1,12);
+    uLCD.printf("Read Freq:");
+    //launch threads
+    Thread ulcd_thread(&ulcd);
+    Thread speaker_thread(&playspeaker);
+    //set up main thread
+    int samples = 1024;
+    float arr [samples+1];
+    arr[0] = 0;
+    float max = 0;
+    float loc = 0;
+    float freq;
+    osThreadSetPriority(osThreadGetId(), osPriorityHigh);
+    //Loop and constantly be finding frequency of signal
+    while (1) { 
+        tim.reset();
+        tim.start();
+        for (int i = 1; i<=samples; i++){
+            arr[i] = mic.instantlevel(); //Sample microphone at ~4 Khz
+            wait(.00025);
+            }
+        tim.stop();
+        freq = samples/tim.read(); 
+        //Turn sampled array into its fourier transform
+        vRealFFT(arr,samples); 
+        
+        //Loop through and find most apparent frequency of sampled signal 
+        for(int i = 2; i<=samples; i++){ 
+            arr[i] *= arr[i];
+            if(max<arr[i]){
+                loc = freq/samples * i/2; //determine frequency by using sample rate,index in array
+                max = arr[i];
+                }
+            }
+        readfreq = loc; 
+        max=0;
+        wait(0.25);
+        Thread::wait(100);
+    }  
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Sun Apr 28 20:46:45 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/ST/code/mbed-rtos/#83895f30f8f2