Esempio n. 1
0
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;
}
Esempio n. 2
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;
}