For MAX32630FTHR microcontroller: Plays piano notes in Nokia composer format text file placed in the SD card

Dependencies:   USBMSD_BD SDFileSystem max32630fthr USBDevice

Revision:
3:fcf745cd4f6d
Parent:
2:93da96b41127
Child:
4:24086b80928e
--- a/main.cpp	Tue Jul 16 09:37:41 2019 +0000
+++ b/main.cpp	Wed Jul 17 06:11:33 2019 +0000
@@ -7,6 +7,8 @@
 //still needs BITS PER SAMPLE PARSING.
 //do this like so: PWM.write(WavValue/2^BPS)
 
+//MAPPING IS WRONG. P = 440 PLZ. Y = MIDDLE D.
+
 #define BUFFER_SIZE 128
 #define HALF_BUFFER 64
 
@@ -49,7 +51,7 @@
     WavFile Track;
     Ticker SampleTime;
     
-    daplink.printf("\f---DAPLINK SERIAL PORT---\r\n\r\nMINI PIANO ver 1 \r\nMAKE SURE YOUR PUTTY IS SET TO NOT WAIT FOR [ENTER] \r\nMIDDLE A (A4) (440Hz) IS Y, [WHITE] KEYS VALID FROM 1 to L. \r\nPRESS SHIFT FOR SHARP\r\n\r\n");
+    daplink.printf("\f---DAPLINK SERIAL PORT---\r\n\r\nMINI PIANO PLAYER ver 1 \r\n\r\n\r\n");
     microUSB.printf("micro USB serial port\r\n");
     rLED = LED_ON;
     wait_ms(500);
@@ -59,6 +61,25 @@
     bLED = LED_ON;
     gLED = LED_OFF;
     
+    typedef enum {
+        C2,Cs2,D2,Ds2,E2,F2,Fs2,G2,Gs2,A2,As2,B2,   //C2:0
+        C3,Cs3,D3,Ds3,E3,F3,Fs3,G3,Gs3,A3,As3,B3,   //C3:12
+        C4,Cs4,D4,Ds4,E4,F4,Fs4,G4,Gs4,A4,As4,B4,   //C4:24
+        C5,Cs5,D5,Ds5,E5,F5,Fs5,G5,Gs5,A5,As5,B5,   //C5:36
+        C6,Cs6,D6,Ds6,E6,F6,Fs6,G6,Gs6,             //C6:48
+        rest,
+        END
+    }pitchname;
+    
+    typedef struct {
+        float length;
+        pitchname pitch;
+    } note;
+    
+    //open file
+    
+    //parse file into song in heap(remove sharps, put into enums.)
+    
     printf("Generating sine...\r\n");
     int i;
     for(i=0; i<128;i++)
@@ -66,198 +87,231 @@
         audioDataBuffer[i] =((1.0 + sin((double(i)/16.0*6.28318530717959)))/2.0); //formula copied from mbed example
     }
     
-    printf("Playing tone...\r\n");
+    /* HERE'S WHERE THE MUSIC STARTS */
+    /* LITERALLY. */
     
-    int PlayingFreq = 440, attached = 0;
+    //FORMAT:  { NUM_BEATS, PITCH }
+    char c;
+    char bpminp[5];
+    int PlayingFreq;
     
-    while(1)
-    {
+    restart:
+    
+    printf("Please enter desired BPM:\r\n");
     
-        Track.sampleRate = PlayingFreq * 16; //TONE FREQ = SAMPLE RATE / SAMPLES PER CYCLE
-        
-        PWM.period_us(1); //1MHz
-        
-        float ticker_period = (float) 1/(Track.sampleRate);
-        
-        printf("\r\nTicker Period: %f\tTicker Freq: %f\r\nTarget Freq: %i\r\n\r\n",ticker_period, 1/ticker_period, PlayingFreq);
-
-        if(attached)
+    for(i=0;i<5 && c!='\r';i++)
+    {
+           c = daplink.getc();
+           bpminp[i] = c;
+    }
+    int BPM = strtol(bpminp,NULL,0);
+    float SPB = 60/(float)BPM;
+    note song[] = {
+        //batch 1
+        {4,(pitchname)38},{4,E5},{4,Fs5},{4,D5},{4,Fs5},{4,G5},{4,A5},{4,Fs5},{4,D5},
+        {4,A5},{4,B5},{4,A5},{4,G5},{4,B5},{4,A5},
+        {4,rest},
+        //batch 2
+        {4,D5},{4,E5},{4,Fs5},{4,D5},{4,Fs5},{4,G5},{4,A5},{4,Fs5},{4,D5},
+        {4,A5},{4,G5},{4,D5},{4,Fs5},{4,D5},{4,E5},
+        {4,rest},
+        //batch 1
+        {4,D5},{4,E5},{4,Fs5},{4,D5},{4,Fs5},{4,G5},{4,A5},{4,Fs5},{4,D5},
+        {4,A5},{4,B5},{4,A5},{4,G5},{4,B5},{4,A5},
+        {4,rest},
+        //batch 3
+        {2,G5},{4,G5},{4,E5},{4,Fs5},{4,E5},{4,D5},{4,Cs5},{4,D5},
+        //END
+        {1,END}
+    };
+    
+    for(i = 0;1;i++)
+    {           
+        switch(song[i].pitch)
         {
-            SampleTime.attach(&placeNewSample,ticker_period);
-        }
-        
-        bLED = LED_OFF;
-        
-        char c;
-        c = daplink.getc();
-        
-        gLED = LED_ON;
-        
-        switch(c)
-        {
-            case '1':
+            case rest:
+                wait(song[i].length*SPB);
+                continue;
+            case D2:
+                PlayingFreq = 73;
+                break;
+            case Ds2:
+                PlayingFreq = 78;
+                break;
+            case E2:
+                PlayingFreq = 82;
+                break;
+            case F2:
+                PlayingFreq = 87;
+                break;
+            case Fs2:
+                PlayingFreq = 92;
+                break;
+            case G2:
                 PlayingFreq = 98;
                 break;
-            case '!':
-                PlayingFreq = 404;
+            case Gs2:
+                PlayingFreq = 104;
                 break;
-            case '2':
+            case A2:
                 PlayingFreq = 110;
                 break;
-            case '@':
+            case As2:
                 PlayingFreq = 117;
                 break;
-            case '3':
+            case B2:
                 PlayingFreq = 123;
                 break;
-            case '4':
+            case C3:
                 PlayingFreq = 131;
                 break;
-            case '$':
+            case Cs3:
                 PlayingFreq = 139;
                 break;
-            case '5':
+            case D3:
                 PlayingFreq = 147;
                 break;
-            case '%':
+            case Ds3:
                 PlayingFreq = 156;
                 break;
-            case '6':
+            case E3:
                 PlayingFreq = 165;
                 break;
-            case '7':
+            case F3:
                 PlayingFreq = 175;
                 break;
-            case '&':
+            case Fs3:
                 PlayingFreq = 185;
                 break;
-            case '8':
+            case G3:
                 PlayingFreq = 196;
                 break;
-            case '*':
+            case Gs3:
                 PlayingFreq = 208;
                 break;
-            case '9':
+            case A3:
                 PlayingFreq = 220;
                 break;
-            case '(':
+            case As3:
                 PlayingFreq = 233;
                 break;
-            case '0':
+            case B3:
                 PlayingFreq = 247;
                 break;
-            case 'q':
+            case C4:
                 PlayingFreq = 262;
                 break;
-            case 'Q':
+            case Cs4:
                 PlayingFreq = 277;
                 break;
-            case 'w':
+            case D4:
                 PlayingFreq = 294;
                 break;
-            case 'W':
+            case Ds4:
                 PlayingFreq = 311;
                 break;
-            case 'e':
+            case E4:
                 PlayingFreq = 330;
                 break;
-            case 'r':
+            case F4:
                 PlayingFreq = 349;
                 break;
-            case 'R':
+            case Fs4:
                 PlayingFreq = 370;
                 break;
-            case 't':
+            case G4:
                 PlayingFreq = 392;
                 break;
-            case 'T':
+            case Gs4:
                 PlayingFreq = 415;
                 break;
-            case 'y':
+            case A4:
                 PlayingFreq = 440;
                 break;
-            case 'Y':
+            case As4:
                 PlayingFreq = 466;
                 break;
-            case 'u':
+            case B4:
                 PlayingFreq = 494;
                 break;
-            case 'i':
+            case C5:
                 PlayingFreq = 523;
                 break;
-            case 'I':
+            case Cs5:
                 PlayingFreq = 554;
                 break;
-            case 'o':
+            case D5:
                 PlayingFreq = 587;
                 break;
-            case 'O':
+            case Ds5:
                 PlayingFreq = 622;
                 break;
-            case 'p':
+            case E5:
                 PlayingFreq = 659;
                 break;
-            case 'a':
+            case F5:
                 PlayingFreq = 698;
                 break;
-            case 'A':
+            case Fs5:
                 PlayingFreq = 740;
                 break;
-            case 's':
+            case G5:
                 PlayingFreq = 784;
                 break;
-            case 'S':
+            case Gs5:
                 PlayingFreq = 831;
                 break;
-            case 'd':
+            case A5:
                 PlayingFreq = 880;
                 break;
-            case 'D':
+            case As5:
                 PlayingFreq = 932;
                 break;
-            case 'f':
+            case B5:
                 PlayingFreq = 988;
                 break;
-            case 'g':
+            case C6:
                 PlayingFreq = 1047;
                 break;
-            case 'G':
+            case Cs6:
                 PlayingFreq = 1109;
                 break;
-            case 'h':
+            case D6:
                 PlayingFreq = 1175;
                 break;
-            case 'H':
+            case Ds6:
                 PlayingFreq = 1245;
                 break;
-            case 'j':
+            case E6:
                 PlayingFreq = 1319;
                 break;
-            case 'k':
+            case F6:
                 PlayingFreq = 1397;
                 break;
-            case 'K':
+            case Fs6:
                 PlayingFreq = 1480;
                 break;
-            case 'l':
+            case G6:
                 PlayingFreq = 1568;
                 break;
-            case 'L':
+            case Gs6:
                 PlayingFreq = 1661;
                 break;
-            case '\r':
-                attached = !attached;
-                break;
+            case END:
+                i = 0;
+                goto restart;
         }
+    
+        Track.sampleRate = PlayingFreq * 16; //TONE FREQ = SAMPLE RATE / SAMPLES PER CYCLE
+        PWM.period_us(1); //1MHz
+        float ticker_period = (float) 1/(Track.sampleRate);
+        printf("\r\nTicker Period: %f\tTicker Freq: %f\r\nTarget Freq: %i \r\n\r\n",ticker_period, 1/ticker_period, PlayingFreq);
 
-        gLED = LED_OFF;
-        rLED = !rLED;
-        if(attached)
-        {
-            SampleTime.detach();
-        }
+        SampleTime.attach(&placeNewSample,ticker_period);
+        wait(song[i].length*SPB);
+        SampleTime.detach();
         
         printf("\033[A\033[A\033[A\033[A");
     }
-};
+}