keypad piano project
Dependencies: 4DGL-uLCD-SE SDFileSystem Speaker mbed wave_player
Fork of Beat_Demo_full_full by
wavfile.c@1:90c01826cdb8, 2015-12-08 (annotated)
- Committer:
- UnitedHolmes
- Date:
- Tue Dec 08 00:45:23 2015 +0000
- Revision:
- 1:90c01826cdb8
no
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
UnitedHolmes | 1:90c01826cdb8 | 1 | /* |
UnitedHolmes | 1:90c01826cdb8 | 2 | A simple sound library for CSE 20211 by Douglas Thain |
UnitedHolmes | 1:90c01826cdb8 | 3 | For course assignments, you should not change this file. |
UnitedHolmes | 1:90c01826cdb8 | 4 | For complete documentation, see: |
UnitedHolmes | 1:90c01826cdb8 | 5 | http://www.nd.edu/~dthain/courses/cse20211/fall2013/wavfile |
UnitedHolmes | 1:90c01826cdb8 | 6 | */ |
UnitedHolmes | 1:90c01826cdb8 | 7 | |
UnitedHolmes | 1:90c01826cdb8 | 8 | #include "wavfile.h" |
UnitedHolmes | 1:90c01826cdb8 | 9 | |
UnitedHolmes | 1:90c01826cdb8 | 10 | #include <stdio.h> |
UnitedHolmes | 1:90c01826cdb8 | 11 | #include <stdlib.h> |
UnitedHolmes | 1:90c01826cdb8 | 12 | #include <string.h> |
UnitedHolmes | 1:90c01826cdb8 | 13 | |
UnitedHolmes | 1:90c01826cdb8 | 14 | struct wavfile_header { |
UnitedHolmes | 1:90c01826cdb8 | 15 | char riff_tag[4]; |
UnitedHolmes | 1:90c01826cdb8 | 16 | int riff_length; |
UnitedHolmes | 1:90c01826cdb8 | 17 | char wave_tag[4]; |
UnitedHolmes | 1:90c01826cdb8 | 18 | char fmt_tag[4]; |
UnitedHolmes | 1:90c01826cdb8 | 19 | int fmt_length; |
UnitedHolmes | 1:90c01826cdb8 | 20 | short audio_format; |
UnitedHolmes | 1:90c01826cdb8 | 21 | short num_channels; |
UnitedHolmes | 1:90c01826cdb8 | 22 | int sample_rate; |
UnitedHolmes | 1:90c01826cdb8 | 23 | int byte_rate; |
UnitedHolmes | 1:90c01826cdb8 | 24 | short block_align; |
UnitedHolmes | 1:90c01826cdb8 | 25 | short bits_per_sample; |
UnitedHolmes | 1:90c01826cdb8 | 26 | char data_tag[4]; |
UnitedHolmes | 1:90c01826cdb8 | 27 | int data_length; |
UnitedHolmes | 1:90c01826cdb8 | 28 | }; |
UnitedHolmes | 1:90c01826cdb8 | 29 | |
UnitedHolmes | 1:90c01826cdb8 | 30 | FILE * wavfile_open( const char *filename ) |
UnitedHolmes | 1:90c01826cdb8 | 31 | { |
UnitedHolmes | 1:90c01826cdb8 | 32 | |
UnitedHolmes | 1:90c01826cdb8 | 33 | struct wavfile_header header; |
UnitedHolmes | 1:90c01826cdb8 | 34 | |
UnitedHolmes | 1:90c01826cdb8 | 35 | int samples_per_second = WAVFILE_SAMPLES_PER_SECOND; |
UnitedHolmes | 1:90c01826cdb8 | 36 | int bits_per_sample = 16; |
UnitedHolmes | 1:90c01826cdb8 | 37 | |
UnitedHolmes | 1:90c01826cdb8 | 38 | strncpy(header.riff_tag,"RIFF",4); |
UnitedHolmes | 1:90c01826cdb8 | 39 | strncpy(header.wave_tag,"WAVE",4); |
UnitedHolmes | 1:90c01826cdb8 | 40 | strncpy(header.fmt_tag,"fmt ",4); |
UnitedHolmes | 1:90c01826cdb8 | 41 | strncpy(header.data_tag,"data",4); |
UnitedHolmes | 1:90c01826cdb8 | 42 | |
UnitedHolmes | 1:90c01826cdb8 | 43 | header.riff_length = 0; |
UnitedHolmes | 1:90c01826cdb8 | 44 | header.fmt_length = 16; |
UnitedHolmes | 1:90c01826cdb8 | 45 | header.audio_format = 1; |
UnitedHolmes | 1:90c01826cdb8 | 46 | header.num_channels = 1; |
UnitedHolmes | 1:90c01826cdb8 | 47 | header.sample_rate = samples_per_second; |
UnitedHolmes | 1:90c01826cdb8 | 48 | header.byte_rate = samples_per_second*(bits_per_sample/8); |
UnitedHolmes | 1:90c01826cdb8 | 49 | header.block_align = bits_per_sample/8; |
UnitedHolmes | 1:90c01826cdb8 | 50 | header.bits_per_sample = bits_per_sample; |
UnitedHolmes | 1:90c01826cdb8 | 51 | header.data_length = 0; |
UnitedHolmes | 1:90c01826cdb8 | 52 | |
UnitedHolmes | 1:90c01826cdb8 | 53 | |
UnitedHolmes | 1:90c01826cdb8 | 54 | FILE * file = fopen(filename,"w"); |
UnitedHolmes | 1:90c01826cdb8 | 55 | if(!file) return 0; |
UnitedHolmes | 1:90c01826cdb8 | 56 | |
UnitedHolmes | 1:90c01826cdb8 | 57 | fwrite(&header,sizeof(header),1,file); |
UnitedHolmes | 1:90c01826cdb8 | 58 | |
UnitedHolmes | 1:90c01826cdb8 | 59 | fflush(file); |
UnitedHolmes | 1:90c01826cdb8 | 60 | |
UnitedHolmes | 1:90c01826cdb8 | 61 | return file; |
UnitedHolmes | 1:90c01826cdb8 | 62 | |
UnitedHolmes | 1:90c01826cdb8 | 63 | } |
UnitedHolmes | 1:90c01826cdb8 | 64 | |
UnitedHolmes | 1:90c01826cdb8 | 65 | void wavfile_write( FILE *file, short data[], int length ) |
UnitedHolmes | 1:90c01826cdb8 | 66 | { |
UnitedHolmes | 1:90c01826cdb8 | 67 | fwrite(data,sizeof(short),length,file); |
UnitedHolmes | 1:90c01826cdb8 | 68 | } |
UnitedHolmes | 1:90c01826cdb8 | 69 | |
UnitedHolmes | 1:90c01826cdb8 | 70 | void wavfile_close( FILE *file ) |
UnitedHolmes | 1:90c01826cdb8 | 71 | { |
UnitedHolmes | 1:90c01826cdb8 | 72 | int file_length = ftell(file); |
UnitedHolmes | 1:90c01826cdb8 | 73 | |
UnitedHolmes | 1:90c01826cdb8 | 74 | int data_length = file_length - sizeof(struct wavfile_header); |
UnitedHolmes | 1:90c01826cdb8 | 75 | fseek(file,sizeof(struct wavfile_header) - sizeof(int),SEEK_SET); |
UnitedHolmes | 1:90c01826cdb8 | 76 | fwrite(&data_length,sizeof(data_length),1,file); |
UnitedHolmes | 1:90c01826cdb8 | 77 | |
UnitedHolmes | 1:90c01826cdb8 | 78 | int riff_length = file_length - 8; |
UnitedHolmes | 1:90c01826cdb8 | 79 | fseek(file,4,SEEK_SET); |
UnitedHolmes | 1:90c01826cdb8 | 80 | fwrite(&riff_length,sizeof(riff_length),1,file); |
UnitedHolmes | 1:90c01826cdb8 | 81 | |
UnitedHolmes | 1:90c01826cdb8 | 82 | fclose(file); |
UnitedHolmes | 1:90c01826cdb8 | 83 | } |