For MAX32630FTHR microcontroller: Plays piano notes in Nokia composer format text file placed in the SD card
Dependencies: USBMSD_BD SDFileSystem max32630fthr USBDevice
Diff: main.cpp
- 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"); } -}; +}