int main() { const double V=127; FILE * wav_file; unsigned int sample_rate = 8000; unsigned int num_channels = 1; unsigned int bytes_per_sample; unsigned int byte_rate; unsigned int num_samples = 76000; wav_file = fopen("out.wav", "w"); num_channels = 1; /* monoaural */ bytes_per_sample = 2; byte_rate = sample_rate*num_channels*bytes_per_sample; // https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ /* write RIFF header */ fwrite("RIFF", 1, 4, wav_file); write_little_endian(36 + bytes_per_sample* num_samples*num_channels, 4, wav_file); fwrite("WAVE", 1, 4, wav_file); /* write fmt subchunk */ fwrite("fmt ", 1, 4, wav_file); write_little_endian(16, 4, wav_file); /* SubChunk1Size is 16 */ write_little_endian(1, 2, wav_file); /* PCM is format 1 */ write_little_endian(num_channels, 2, wav_file); write_little_endian(sample_rate, 4, wav_file); write_little_endian(byte_rate, 4, wav_file); write_little_endian(num_channels*bytes_per_sample, 2, wav_file); /* block align */ write_little_endian(8*bytes_per_sample, 2, wav_file); /* bits/sample */ /* write data subchunk */ fwrite("data", 1, 4, wav_file); write_little_endian(bytes_per_sample* num_samples*num_channels, 4, wav_file); //////////////////////////////////////////////////////////////// write_sound(wav_file, sample_rate, V, 8000, piano_note_to_frequency(C_4)); write_sound(wav_file, sample_rate, V, 8000, piano_note_to_frequency(E_4)); write_sound(wav_file, sample_rate, V, 4000, 0); write_sound(wav_file, sample_rate, V, 8000, piano_note_to_frequency(G_4)); write_sound(wav_file, sample_rate, V, 4000, 0); write_sound(wav_file, sample_rate, V, 4000, piano_note_to_frequency(G_4)); write_sound(wav_file, sample_rate, V, 4000, 0); write_sound(wav_file, sample_rate, V, 4000, piano_note_to_frequency(G_4)); write_sound(wav_file, sample_rate, V, 4000, 0); write_sound(wav_file, sample_rate, V, 4000, piano_note_to_frequency(G_4)); write_sound(wav_file, sample_rate, V, 24000, 0); fclose(wav_file); printf("done.\n"); return 0; }
/* * 1) Parses arguments * 2) Opens each sound file given (or reads from stdin) * 3) Concatenates sounds in order * 4) Writes out sound */ int main(int argc, char* argv[]) { sndtype out_type = CS229; int i; char c; char* outfile = NULL; snd_t* info = 0; snd_t* current; FILE* out; while((c = getopt(argc, argv, "ho:w")) != -1) { switch(c) { case 'h': print_usage(0); break; case 'o': outfile = optarg; break; case 'w': out_type = WAVE; break; case '?': fprintf(stderr, "sndcat: Error: Try 'sndcat -h' for more information.\n"); exit(1); break; default: print_usage(1); } } /* Get from stdin */ if(optind == argc) { info = read_sound(stdin, "Standard Input"); } for(i = optind; i < argc; ++i) { if(!info) { info = open_sound(argv[i]); if(!info) { fprintf(stderr, "sndcat: Error: %s could not be opened. Exiting.\n", argv[i]); exit(1); } continue; } current = open_sound(argv[i]); if(!current) { fprintf(stderr, "sndcat: Error: %s could not be opened. Exiting.\n", argv[i]); exit(1); } concatenate(info, current); free(current); } if(out_type != info->type) { convert(info); } if(!outfile) { out = stdout; } else { out = fopen(outfile, "wb"); } write_sound(out, info); close_sound(info); if(out != stdout) { fclose(out); } return 0; }