keypad piano project
Dependencies: 4DGL-uLCD-SE SDFileSystem Speaker mbed wave_player
Fork of Beat_Demo_full_full by
Revision 1:90c01826cdb8, committed 2015-12-08
- Comitter:
- UnitedHolmes
- Date:
- Tue Dec 08 00:45:23 2015 +0000
- Parent:
- 0:81b352a233ca
- Commit message:
- no
Changed in this revision
diff -r 81b352a233ca -r 90c01826cdb8 Speaker.lib --- a/Speaker.lib Wed Oct 22 01:17:25 2014 +0000 +++ b/Speaker.lib Tue Dec 08 00:45:23 2015 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/users/zchen311/code/Speaker/#41292907c9cb +https://developer.mbed.org/users/UnitedHolmes/code/Speaker/#bd28eb0ec6f8
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; + + } + } + } +} +
diff -r 81b352a233ca -r 90c01826cdb8 wave_player.lib --- a/wave_player.lib Wed Oct 22 01:17:25 2014 +0000 +++ b/wave_player.lib Tue Dec 08 00:45:23 2015 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/users/jhawkins38/code/wave_player/#e9f07a617057 +https://developer.mbed.org/users/UnitedHolmes/code/wave_player/#9b0c9c1e365a
diff -r 81b352a233ca -r 90c01826cdb8 wavfile.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wavfile.c Tue Dec 08 00:45:23 2015 +0000 @@ -0,0 +1,83 @@ +/* +A simple sound library for CSE 20211 by Douglas Thain +For course assignments, you should not change this file. +For complete documentation, see: +http://www.nd.edu/~dthain/courses/cse20211/fall2013/wavfile +*/ + +#include "wavfile.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +struct wavfile_header { + char riff_tag[4]; + int riff_length; + char wave_tag[4]; + char fmt_tag[4]; + int fmt_length; + short audio_format; + short num_channels; + int sample_rate; + int byte_rate; + short block_align; + short bits_per_sample; + char data_tag[4]; + int data_length; +}; + +FILE * wavfile_open( const char *filename ) +{ + + struct wavfile_header header; + + int samples_per_second = WAVFILE_SAMPLES_PER_SECOND; + int bits_per_sample = 16; + + strncpy(header.riff_tag,"RIFF",4); + strncpy(header.wave_tag,"WAVE",4); + strncpy(header.fmt_tag,"fmt ",4); + strncpy(header.data_tag,"data",4); + + header.riff_length = 0; + header.fmt_length = 16; + header.audio_format = 1; + header.num_channels = 1; + header.sample_rate = samples_per_second; + header.byte_rate = samples_per_second*(bits_per_sample/8); + header.block_align = bits_per_sample/8; + header.bits_per_sample = bits_per_sample; + header.data_length = 0; + + + FILE * file = fopen(filename,"w"); + if(!file) return 0; + + fwrite(&header,sizeof(header),1,file); + + fflush(file); + + return file; + +} + +void wavfile_write( FILE *file, short data[], int length ) +{ + fwrite(data,sizeof(short),length,file); +} + +void wavfile_close( FILE *file ) +{ + int file_length = ftell(file); + + int data_length = file_length - sizeof(struct wavfile_header); + fseek(file,sizeof(struct wavfile_header) - sizeof(int),SEEK_SET); + fwrite(&data_length,sizeof(data_length),1,file); + + int riff_length = file_length - 8; + fseek(file,4,SEEK_SET); + fwrite(&riff_length,sizeof(riff_length),1,file); + + fclose(file); +}
diff -r 81b352a233ca -r 90c01826cdb8 wavfile.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wavfile.h Tue Dec 08 00:45:23 2015 +0000 @@ -0,0 +1,13 @@ +#ifndef WAVFILE_H +#define WAVFILE_H + +#include <stdio.h> +#include <inttypes.h> + +FILE * wavfile_open( const char *filename ); +void wavfile_write( FILE *file, short data[], int length ); +void wavfile_close( FILE * file ); + +#define WAVFILE_SAMPLES_PER_SECOND 4410//44100 + +#endif \ No newline at end of file