{"id":16,"date":"2007-04-17T18:34:37","date_gmt":"2007-04-17T17:34:37","guid":{"rendered":"http:\/\/slack.codemaniacs.com\/blog\/2007\/04\/17\/sintesis-de-audio-para-mi-o-para-torpes-en-general\/"},"modified":"2023-05-07T06:47:13","modified_gmt":"2023-05-07T05:47:13","slug":"sintesis-de-audio-para-mi-o-para-torpes-en-general","status":"publish","type":"post","link":"https:\/\/slack.codemaniacs.com\/blog\/2007\/04\/17\/sintesis-de-audio-para-mi-o-para-torpes-en-general\/","title":{"rendered":"S\u00ed\u00adntesis musical para m\u00ed\u00ad (o para torpes en general :)"},"content":{"rendered":"<p>Por petici\u00f3n popular (hola pplux) voy a hacer una peque\u00f1a introducci\u00f3n a la s\u00ed\u00adntesis de audio desde el punto de vista de un coder sin experiencia previa en DSP que pretende hacer un sintetizador para intros de 4k (yo). Por supuesto, incluir\u00e1 ejemplos de c\u00f3digo. C99 y SDL for teh win.<\/p>\n<p><strong>0) Disclaimer<\/strong><br \/>\nEsto no tiene por qu\u00e9 ser la forma correcta de hacer las cosas. Hasta donde yo s\u00e9 funciona, pero seguro que hay muchos fallos en muchos sitios. Son bienvenidos los comentarios, tanto para corregirme los fallos como para comentar cualquier otra cosa al respecto :). Y como se suele decir en estos casos, si alguno de los ejemplos de c\u00f3digo rompe algo o deja sordo a alguien yo no me hago responsable.<\/p>\n<p><strong>1) Haciendo ruido<\/strong><\/p>\n<p>En primer lugar, el cl\u00e1sico trozo de codigo de inicializaci\u00f3n que todo el mundo copia y pega y nadie lee:<\/p>\n<pre>#include \"SDL.h\"\n\n#define BUFFER_SIZE 1024    \/\/ Longitud del buffer, en samples\n\n\/\/ Este comentario esta extraido de SDL_audio.h, porque me ha molado\n\/* This function is called when the audio device needs more data.\n * 'stream' is a pointer to the audio data buffer\n * 'len' is the length of that buffer in bytes.\n * Once the callback returns, the buffer will no longer be valid.\n * Stereo samples are stored in a LRLRLR ordering.\n *\/\nvoid play(void *userdata, Uint8 *stream, int len)\n{\n    int num_samples = len \/ 2;\n    Sint16 *buf = (Sint16*) stream;\n    for (int i = 0; i&lt;num_samples ; ++i)\n        buf[i] = rand()%65535-32768;\n}\n\nint main(int argc, char **argv)\n{\n    SDL_AudioSpec desired;\n    desired.freq     = 44100;        \/\/ Frecuencia de muestreo                             \n    desired.format   = AUDIO_S16SYS; \/\/ Formato de las muestras\n    desired.channels = 1;            \/\/ Numero de canales\n    desired.samples  = BUFFER_SIZE;  \/\/ Tama\u00c3\u00b1o del buffer en samples\n                                     \/\/ (potencia de 2)\n    desired.callback = play;         \/\/ Callback\n    desired.userdata = NULL;         \/\/ Puntero a datos\n    \n    SDL_Init(SDL_INIT_AUDIO);        \n    SDL_OpenAudio(&amp;desired, NULL);\n    SDL_PauseAudio(0);\n    getchar();\n    SDL_PauseAudio(1);\n    SDL_CloseAudio();\n    SDL_Quit();\n}<code><\/code><code><\/code><code><\/code><code><\/code><\/pre>\n<p>La parte importante esta en buf[i] = rand()%65535-32768; Como hemos elegido AUDIO_S16SYS significa que utilizamos muestras de 16 bits con signo [-32768, 32767], con endianismo dependiente del sistema (como accedemos al buffer con punteros a entero de 16 bits, el endianismo no ser\u00e1 problema). Generamos numeros aleatorios en ese rango y ya tenemos <a href=\"http:\/\/en.wikipedia.org\/wiki\/White_noise\">ruido blanco<\/a> saliendo de nuestros altavoces.<\/p>\n<p>No se pierdan el proximo episodio.<\/p>\n<p><strong>EDIT:<\/strong> He cambiado el titulo, de &#8220;s\u00edntesis de audio&#8221; a &#8220;s\u00edntesis musical&#8221; porque lo primero era demasiado general :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Por petici\u00f3n popular (hola pplux) voy a hacer una peque\u00f1a introducci\u00f3n a la s\u00ed\u00adntesis de audio desde el punto de vista de un coder sin experiencia previa en DSP que pretende hacer un sintetizador para intros de 4k (yo). Por supuesto, incluir\u00e1 ejemplos de c\u00f3digo. C99 y SDL for teh win. 0) Disclaimer Esto no [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,4,6,3],"tags":[],"_links":{"self":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/16"}],"collection":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/comments?post=16"}],"version-history":[{"count":2,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/16\/revisions"}],"predecessor-version":[{"id":101,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/16\/revisions\/101"}],"wp:attachment":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/media?parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/categories?post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/tags?post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}