keypad piano project
Dependencies: 4DGL-uLCD-SE SDFileSystem Speaker mbed wave_player
Fork of Beat_Demo_full_full by
Diff: main.cpp
- Revision:
- 1:90c01826cdb8
- Parent:
- 0:81b352a233ca
diff -r 81b352a233ca -r 90c01826cdb8 main.cpp --- a/main.cpp Wed Oct 22 01:17:25 2014 +0000 +++ b/main.cpp Tue Dec 08 00:45:23 2015 +0000 @@ -4,270 +4,612 @@ #include "Speaker.h" #include "SDFileSystem.h" #include "wave_player.h" +#include "wavfile.c" +#include "wavfile.h" -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "wave_player.h" SDFileSystem sd(p5, p6, p7, p8,"sd"); //SD card uLCD_4DGL uLCD(p13,p14,p11); -AnalogOut DACout(p18); -wave_player waver(&DACout); - - // Create the interrupt receiver object on pin 26 -InterruptIn interrupt(p26); -InterruptIn pardon(p25); +InterruptIn interrupt1(p26); +InterruptIn interrupt2(p25); // Setup the i2c bus on pins 9 and 10 -I2C i2c(p9, p10); +I2C i2c1(p9, p10); I2C i2c2(p28, p27); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) -Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); -Mpr121 pad(&i2c2, Mpr121::ADD_VSS); +Mpr121 tones1pad(&i2c1, Mpr121::ADD_VSS); +Mpr121 tones2pad(&i2c2, Mpr121::ADD_VSS); -//Speaker mySpeaker(p21); +Speaker mySpeaker(p21); +InterruptIn pb1(p12); +InterruptIn pb2(p29); + +AnalogOut DACout(p18); +wave_player waver(&DACout); -int key_code; -int Past_code; -int Past_code2; -bool PlayPtr; +int key_code [2] = {88,88}; +int touches; +int music [1000] = { }; +int music2 [1000] = { }; + +const int NUM_SAMPLES = (WAVFILE_SAMPLES_PER_SECOND*0.2); +int flagPb; +bool flagPb2; +bool flagInterrupt; // Key hit/release interrupt routine for 1st touchpad -void fallInterrupt() { - key_code=77; - Past_code=77; - int value=mpr121.read(0x00); - value +=mpr121.read(0x01)<<8; +void fallInterrupt1() +{ + key_code[0]=88; + key_code[1]=88; + flagInterrupt = true; + int value=tones1pad.read(0x00); + value +=tones1pad.read(0x01)<<8; - // puts key number out to LEDs for demo + int k = 0; for(int i=0; i<12; i++) - { - + { if(((value>>i)&0x01) == 1) { - key_code = i; - } - + key_code[k] = i; + if (k < 1){ + k=k+1; + } + } } - - uLCD.locate(1,2); - uLCD.printf("%2D",key_code); - uLCD.cls(); - uLCD.printf("\n%2D\n", key_code); - uLCD.printf("\n%2D\n", Past_code); - if(key_code != Past_code) - { - PlayPtr = false; - } - else - { - PlayPtr = true; - } - Past_code = key_code; - - + uLCD.locate(1,2); + //uLCD.printf("%2D%2D",key_code[0],key_code[1]); + touches = touches + 1; } //sets up interrupts for 2nd toucpad void fallInterrupt2() { - key_code=77; - Past_code2=77; - int value2=pad.read(0x00); - value2 +=pad.read(0x01)<<8; + key_code[0]=88; + key_code[1]=88; + flagInterrupt = true; + + int value2=tones2pad.read(0x00); + value2 +=tones2pad.read(0x01)<<8; // puts key number out to LEDs for demo + int k = 0; for(int j=0; j<12; j++) - { - + { if(((value2>>j)&0x01) == 1) { - key_code= j +12; - + key_code [k] = j +12; + if (k < 1){ + k=k+1; + } } } - if(key_code != Past_code2) - { - PlayPtr = false; - } - else - { - PlayPtr = true; - } - Past_code2 = key_code; - - uLCD.locate(1,3); - uLCD.printf("%2D",key_code); - - + //uLCD.printf("%2D%2D",key_code[0],key_code[1]); + touches = touches + 1; } - -int main() { - pardon.fall(&fallInterrupt2); - pardon.mode(PullUp); - interrupt.fall(&fallInterrupt); - interrupt.mode(PullUp); - - FILE *wave_file; - - while(1) - { - switch(key_code) //uses a case for each individual touch sensor - { - case 0: - //mySpeaker.PlayNote(969.0, 0.5, 0.5); - wave_file = fopen("/sd/piano_G.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 1: - //mySpeaker.PlayNote(200.0, 0.1, 0.1); - wave_file = fopen("/sd/piano_F_sharp.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - led1 = 1; - break; - case 2: - //mySpeaker.PlayNote(300.0, 0.1, 0.1); - wave_file = fopen("/sd/piano_B.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 3: - //mySpeaker.PlayNote(500.0, 0.15, 0.1); - wave_file = fopen("/sd/piano_A_sharp.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 4: - //mySpeaker.PlayNote(700.0, 0.15, 0.1); - wave_file = fopen("/sd/Gb3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 5: - //mySpeaker.PlayNote(600.0, 0.15, 0.1); - wave_file = fopen("/sd/G3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 6: - //mySpeaker.PlayNote(969.0, 0.5, 0.5); - wave_file = fopen("/sd/F3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 7: - //mySpeaker.PlayNote(161.0, 0.25, 0.01); - wave_file = fopen("/sd/Eb4.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 8: - //mySpeaker.PlayNote(869.0, 0.5, 0.5); - wave_file = fopen("/sd/Eb3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 9: - //mySpeaker.PlayNote(769.0, 0.5, 0.5); - wave_file = fopen("/sd/E3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 10: - //mySpeaker.PlayNote(669.0, 0.5, 0.5); - wave_file = fopen("/sd/Db4.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 11: - //mySpeaker.PlayNote(469.0, 0.5, 0.5); - wave_file = fopen("/sd/Db3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 12: - //mySpeaker.PlayNote(969.0, 0.5, 0.5); - wave_file = fopen("/sd/D4.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 13: - //mySpeaker.PlayNote(200.0, 0.1, 0.1); - wave_file = fopen("/sd/Db3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - led1 = 1; - uLCD.printf("Hey"); - break; - case 14: - //mySpeaker.PlayNote(300.0, 0.1, 0.1); - wave_file = fopen("/sd/C4.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 15: - //mySpeaker.PlayNote(500.0, 0.15, 0.1); - wave_file = fopen("/sd/C3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 16: - //mySpeaker.PlayNote(700.0, 0.15, 0.1); - wave_file = fopen("/sd/Bb3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 17: - //mySpeaker.PlayNote(600.0, 0.15, 0.1); - wave_file = fopen("/sd/Bb2.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 18: - //mySpeaker.PlayNote(969.0, 0.5, 0.5); - wave_file = fopen("/sd/B3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 19: - //mySpeaker.PlayNote(161.0, 0.25, 0.01); - wave_file = fopen("/sd/B2.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 20: - //mySpeaker.PlayNote(869.0, 0.5, 0.5); - wave_file = fopen("/sd/Ab3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 21: - //mySpeaker.PlayNote(769.0, 0.5, 0.5); - wave_file = fopen("/sd/A3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 22: - //mySpeaker.PlayNote(669.0, 0.5, 0.5); - wave_file = fopen("/sd/C3.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - case 23: - //mySpeaker.PlayNote(469.0, 0.5, 0.5); - wave_file = fopen("/sd/C4.wav","r"); - waver.play(wave_file, &PlayPtr); - fclose(wave_file); - break; - } - } + +void pb1_hit_interrupt (void) +{ + if (flagPb == 0) + { + touches = 0; + + uLCD.locate(1,1); + uLCD.printf("Start Recording"); + uLCD.locate(1,5); + uLCD.printf("Waiting"); + flagPb = 1; + + } + else if (flagPb == 1) + { + FILE * f = wavfile_open("/sd/Example14.wav"); + uLCD.locate(1,1); + uLCD.printf("Recording ended"); + uLCD.locate(1,4); + uLCD.printf("touches = %d",touches); + uLCD.locate(1,6); + /* + for (int k = 0; k<=touches; k++) + { + uLCD.printf("%d",music[k]); + } + */ + for (int k = 0; k<=touches; k++){ + short waveform[NUM_SAMPLES]; + double frequency = music[k]; //880.0; + double frequency2 = music2[k]; + int volume = 32000; + int length = NUM_SAMPLES; + int i; + for(i=0;i<length;i++) { + double t = (double) i / WAVFILE_SAMPLES_PER_SECOND; + if (frequency2 == 0) + { + waveform[i] = volume*sin(frequency*t*2*3.1415926); + } + else if (frequency2 != 0) + { + waveform[i] = volume*(sin(frequency*t*2*3.1415926)+sin(frequency2*t*2*3.1415926))/2; + } + } + if (music[k] == 0) + { + int length_short = length*2/9; + fwrite(waveform,sizeof(short),length_short,f); + } + else if (music[k] != 0) + { + fwrite(waveform,sizeof(short),length,f); + } + } + wavfile_close(f); + + uLCD.locate(1,5); + uLCD.printf("Done "); + flagPb = 0; + } +} + +void pb2_hit_interrupt (void) +{ + flagPb2 = true; + uLCD.cls(); + uLCD.locate(1,1); + uLCD.printf("Let the fun begin\n"); } +int main() +{ + touches = -1; + flagPb = 0; + flagInterrupt = false; + + key_code[0] = 88; + key_code[1] = 88; + + pb1.fall(&pb1_hit_interrupt); + wait(.2); + pb1.mode(PullUp); + wait(.2); + + pb2.mode(PullUp); + wait(.2); + pb2.fall(&pb2_hit_interrupt); + wait(.2); + + interrupt2.fall(&fallInterrupt2); + interrupt2.mode(PullUp); + interrupt1.fall(&fallInterrupt1); + interrupt1.mode(PullUp); + + while(1) + { + + if ( (flagPb == 1) && (flagInterrupt == false )) + { + + touches = touches + 1; + music[touches] = 0; + music2[touches] = 0; + wait(0.05); + //flagInterrupt = false; + } + + if (flagPb2 == true) + { + FILE *wave_file; + uLCD.locate(1,6); + uLCD.printf("Playing"); + wave_file=fopen("/sd/Example14.wav","r"); + waver.play(wave_file); + fclose(wave_file); + flagPb2 = false; + uLCD.locate(1,7); + uLCD.printf("Playing Ended"); + } + + if (key_code[1] == 88) + { + music2[touches] = 0; + switch(key_code[0]) //uses a case for each individual touch sensor + { + case 0: + mySpeaker.PlayNote(262,0,0.2,1); + music[touches] = 262; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 1: + mySpeaker.PlayNote(277,0,0.2,1); + music[touches] = 277; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 2: + mySpeaker.PlayNote(294,0,0.2,1); + music[touches] = 294; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 3: + mySpeaker.PlayNote(311,0,0.2,1); + music[touches] = 311; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 4: + mySpeaker.PlayNote(330,0,0.2,1); + music[touches] = 330; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 5: + mySpeaker.PlayNote(349,0,0.2,1); + music[touches] = 349; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 6: + mySpeaker.PlayNote(370,0,0.2,1); + music[touches] = 370; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 7: + mySpeaker.PlayNote(392,0,0.2,1); + music[touches] = 392; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 8: + mySpeaker.PlayNote(415,0,0.2,1); + music[touches] = 415; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 9: + mySpeaker.PlayNote(440,0,0.2,1); + music[touches] = 440; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 10: + mySpeaker.PlayNote(466,0,0.2,1); + music[touches] = 466; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 11: + mySpeaker.PlayNote(494,0,0.2,1); + music[touches] = 494; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 12: + mySpeaker.PlayNote(523,0,0.2,1); + music[touches] = 523; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 13: + mySpeaker.PlayNote(554,0,0.2,1); + music[touches] = 554; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 14: + mySpeaker.PlayNote(587,0,0.2,1); + music[touches] = 587; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 15: + mySpeaker.PlayNote(622,0,0.2,1); + music[touches] = 622; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 16: + mySpeaker.PlayNote(659,0,0.2,1); + music[touches] = 659; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 17: + mySpeaker.PlayNote(698,0,0.2,1); + music[touches] = 698; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 18: + mySpeaker.PlayNote(740,0,0.2,1); + music[touches] = 740; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 19: + mySpeaker.PlayNote(784,0,0.2,1); + music[touches] = 784; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 20: + mySpeaker.PlayNote(830,0,0.2,1); + music[touches] = 830; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 21: + mySpeaker.PlayNote(880,0,0.2,1); + music[touches] = 830; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 22: + mySpeaker.PlayNote(932,0,0.2,1); + music[touches] = 932; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 23: + mySpeaker.PlayNote(988,0,0.2,1); + music[touches] = 988; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + + default: + music[touches] = 0; + flagInterrupt = false; + + } + } + + if (key_code[1] != 88) //Overtunes + { + switch(key_code[0]) //uses a case for each individual touch sensor + { + case 0: + music[touches] = 262; + break; + case 1: + music[touches] = 277; + break; + case 2: + music[touches] = 294; + break; + case 3: + music[touches] = 311; + break; + case 4: + music[touches] = 330; + break; + case 5: + music[touches] = 349; + break; + case 6: + music[touches] = 370; + break; + case 7: + music[touches] = 392; + break; + case 8: + music[touches] = 415; + break; + case 9: + music[touches] = 440; + break; + case 10: + music[touches] = 466; + break; + case 11: + music[touches] = 494; + break; + case 12: + music[touches] = 523; + break; + case 13: + music[touches] = 554; + break; + case 14: + music[touches] = 587; + break; + case 15: + music[touches] = 622; + break; + case 16: + music[touches] = 659; + break; + case 17: + music[touches] = 698; + break; + case 18: + music[touches] = 740; + break; + case 19: + music[touches] = 784; + break; + case 20: + music[touches] = 830; + break; + case 21: + music[touches] = 830; + break; + case 22: + music[touches] = 932; + break; + case 23: + music[touches] = 988; + break; + + default: + music[touches] = 0; + + } + + switch(key_code[1]) //uses a case for each individual touch sensor + { + case 0: + mySpeaker.PlayNote(music[touches],262,0.2,1); + music2[touches] = 262; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 1: + mySpeaker.PlayNote(music[touches],277,0.2,1); + music2[touches] = 277; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 2: + mySpeaker.PlayNote(music[touches],294,0.2,1); + music2[touches] = 294; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 3: + mySpeaker.PlayNote(music[touches],311,0.2,1); + music2[touches] = 311; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 4: + mySpeaker.PlayNote(music[touches],330,0.2,1); + music2[touches] = 330; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 5: + mySpeaker.PlayNote(music[touches],349,0.2,1); + music2[touches] = 349; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 6: + mySpeaker.PlayNote(music[touches],370,0.2,1); + music2[touches] = 370; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 7: + mySpeaker.PlayNote(music[touches],392,0.2,1); + music2[touches] = 392; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 8: + mySpeaker.PlayNote(music[touches],415,0.2,1); + music2[touches] = 415; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 9: + mySpeaker.PlayNote(music[touches],440,0.2,1); + music2[touches] = 440; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 10: + mySpeaker.PlayNote(music[touches],466,0.2,1); + music2[touches] = 466; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 11: + mySpeaker.PlayNote(music[touches],494,0.2,1); + music2[touches] = 494; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 12: + mySpeaker.PlayNote(music[touches],523,0.2,1); + music2[touches] = 523; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 13: + mySpeaker.PlayNote(music[touches],554,0.2,1); + music2[touches] = 554; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 14: + mySpeaker.PlayNote(music[touches],587,0.2,1); + music2[touches] = 587; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 15: + mySpeaker.PlayNote(music[touches],622,0.2,1); + music2[touches] = 622; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 16: + mySpeaker.PlayNote(music[touches],659,0.2,1); + music2[touches] = 659; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 17: + mySpeaker.PlayNote(music[touches],698,0.2,1); + music2[touches] = 698; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 18: + mySpeaker.PlayNote(music[touches],740,0.2,1); + music2[touches] = 740; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 19: + mySpeaker.PlayNote(music[touches],784,0.2,1); + music2[touches] = 784; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 20: + mySpeaker.PlayNote(music[touches],830,0.2,1); + music2[touches] = 830; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 21: + mySpeaker.PlayNote(music[touches],880,0.2,1); + music2[touches] = 830; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 22: + mySpeaker.PlayNote(music[touches],932,0.2,1); + music2[touches] = 932; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + case 23: + mySpeaker.PlayNote(music[touches],988,0.2,1); + music2[touches] = 988; + flagInterrupt = false; + mySpeaker.StopPlaying(); + break; + + default: + music2[touches] = 0; + flagInterrupt = false; + + } + } + } +} +