/* * Escribe un archivo de audio WAV con las notas musicales DO-RE-MI-FA-SOL-LA=440HZ-SI-DO * compila * gcc -lsndfile notas.c -o notas * Te generara un archivo escala.wav * beck@math.co.ro */ #include #include #include #include #include #define HZ_SEGUNDO 44100 #define MUESTRAS (HZ_SEGUNDO * 8) /* 8 segundos, 1 segundo por nota */ #define AMPLITUD (1.0 * 0x7F000000) int main (void) { SNDFILE *audiofile; SF_INFO audioinfo; int k, m = 0; int *buffer; double z, notas_hz[8] = { 261.63, 293.66, 329.63, 349.23, 392.0, 440.0, 493.88, 523.25 }; char *nombre[8] = {"DO","RE","MI","FA","SOL","LA","SI","DO"}; if (!(buffer = malloc (2 * MUESTRAS * sizeof (int)))) { perror ("malloc"); exit (EXIT_FAILURE); } memset (&audioinfo, 0, sizeof (audioinfo)); audioinfo.samplerate = HZ_SEGUNDO; audioinfo.frames = MUESTRAS; audioinfo.channels = 1; audioinfo.format = (SF_FORMAT_WAV | SF_FORMAT_PCM_24); if (!(audiofile = sf_open ("escala.wav", SFM_WRITE, &audioinfo))) { perror ("sf_open"); exit (EXIT_FAILURE); } for (k = 0; k < MUESTRAS; k++) { if ((k % HZ_SEGUNDO) == 0) { z = notas_hz[m % 8]; printf ("Freq diferencia %s = %f hertz \n",nombre[m], fabs (notas_hz[m % 8] )); m++; } buffer[k] = AMPLITUD * sin (((z) / HZ_SEGUNDO) * 2 * k * M_PI); } if (sf_write_int (audiofile, buffer, audioinfo.channels * MUESTRAS) != audioinfo.channels * MUESTRAS) puts (sf_strerror (audiofile)); sf_close (audiofile); return 0; }