<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Nightly build</title>
	<atom:link href="http://slack.codemaniacs.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://slack.codemaniacs.com/blog</link>
	<description>¡Oh, cielos! Ha vuelto a pasar...</description>
	<pubDate>Fri, 06 Jun 2008 18:40:58 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>ctypes</title>
		<link>http://slack.codemaniacs.com/blog/2008/06/06/ctypes/</link>
		<comments>http://slack.codemaniacs.com/blog/2008/06/06/ctypes/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 18:40:58 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/?p=24</guid>
		<description><![CDATA[El otro día me encontré con un módulo interesante de python que no conocía: ctypes. Sirve para comunicarse con librerías en C: permite cargar librerías dinámicas y llamar a sus funciones, definir tipos equivalentes a los de C para pasarlos de un lado a otro e incluso especificar funciones python como callbacks de C. Vamos, [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día me encontré con un módulo interesante de python que no conocía: ctypes. Sirve para comunicarse con librerías en C: permite cargar librerías dinámicas y llamar a sus funciones, definir tipos equivalentes a los de C para pasarlos de un lado a otro e incluso especificar funciones python como callbacks de C. Vamos, que se pueden crear <i>bindings</i> a librerías externas escribiendo únicamente código python.</p>
<p>Ahi va un ejemplillo tonto usando la libavformat:</p>
<pre>
#!/usr/bin/python
import sys
from ctypes import *
import ctypes.util

av = CDLL(ctypes.util.find_library("avformat"))
filename = sys.argv[1]
# pFormatCtx deberia ser un puntero a AVFormatContext,
# pero esto es solo un ejemplo simple :)
pFormatCtx = c_void_p() 

av.av_register_all()
av.av_open_input_file(byref(pFormatCtx), filename, None, 0, None)
av.dump_format(pFormatCtx, 0, filename, 0)
</pre>
<p>Por supuesto para hacer algo más serio habría que declarar en python las estructuras como AVFormatContext que se definen en las cabeceras correspondientes y cosas así, pero entonces el programa de ejemplo sería demasiado engorroso como para leerlo en un blog ;). El ejemplo muestra una salida como esta:</p>
<pre>
$ ./av.py test.avi
Input #0, avi, from 'test.avi':
  Duration: N/A, bitrate: N/A
  Stream #0.0: Video: mpeg4, 512x420,   inf fps(c)
  Stream #0.1: Audio: vorbis, 22050 Hz, stereo, 24 kb/s
</pre>
<p>Referencias:</p>
<ul>
<li><a href="http://docs.python.org/lib/ctypes-ctypes-tutorial.html">Tutorial de ctypes</a></li>
<li><a href="http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html">Using libavformat and libavcodec</a></li>
<li><a href="http://www.inb.uni-luebeck.de/~boehme/libavcodec_update.html">Using libavformat and libavcodec: An Update</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2008/06/06/ctypes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Trazas con gdb</title>
		<link>http://slack.codemaniacs.com/blog/2008/02/10/trazas-con-gdb/</link>
		<comments>http://slack.codemaniacs.com/blog/2008/02/10/trazas-con-gdb/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 21:03:06 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2008/02/10/trazas-con-gdb/</guid>
		<description><![CDATA[Todo programador ha pasado alguna vez por la experiencia de depurar un programa a golpe de printf(), con los inconvenientes que ello supone, sobre todo recompilar cada vez que se quiere cambiar la información que se imprime en la traza.
Pues resulta que es posible hacer las cosas &#8220;bien&#8221; :)
Con gdb podemos imprimir los valores de [...]]]></description>
			<content:encoded><![CDATA[<p>Todo programador ha pasado alguna vez por la experiencia de depurar un programa a golpe de printf(), con los inconvenientes que ello supone, sobre todo recompilar cada vez que se quiere cambiar la información que se imprime en la traza.</p>
<p>Pues resulta que es posible hacer las cosas &#8220;bien&#8221; :)</p>
<p>Con gdb podemos imprimir los valores de variables de nuestro programa, eso es algo que todos sabemos PERO tambien podemos darle una serie de órdenes a ejecutar al pasar por un breakpoint.</p>
<p>Veamos un ejemplo. Sea el siguiente programa en C:</p>
<pre>
#include &lt;stdio.h&gt;

int main()
{
        int i;
        double x=2.0f;
        for (i=0; i&lt;64; i++)
                x*=2;
        return 0;
}
</pre>
<p>Si compilamos con -g (para debug) y lo lanzamos en gdb podemos visualizar los valores de x así:</p>
<p><code><br />
(gdb) break 8<br />
Breakpoint 1 at 0x400463: file a.c, line 8.<br />
(gdb) commands 1<br />
Type commands for when breakpoint 1 is hit, one per line.<br />
End with a line saying just "end".<br />
&gt;silent<br />
&gt;printf "x=%g\n",x<br />
&gt;cont<br />
&gt;end<br />
(gdb) r<br />
Starting program: /home/slack/a.out<br />
x=2<br />
x=4<br />
x=8<br />
x=16<br />
x=32<br />
x=64<br />
[...]<br />
</code></p>
<p>El &#8220;silent&#8221; del principio es para que gdb no imprima la información que suele mostrar al pararse en un breakpoint (fichero, número de línea, contador de programa, etc) y la traza salga más limpia.</p>
<p>Por supuesto se pueden hacer mas cosas. gdb permite definir variables externas al programa y ejecución condicional, así que podemos contar las veces que pasamos por algun sitio y lanzar órdenes en momentos concretos y tonterías similares :D</p>
<p>Happy coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2008/02/10/trazas-con-gdb/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Querido diario&#8230;</title>
		<link>http://slack.codemaniacs.com/blog/2007/12/06/querido-diario/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/12/06/querido-diario/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 20:53:43 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Music]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/12/06/querido-diario/</guid>
		<description><![CDATA[Querido diario:

Confusion
Tiempo
Lluvia
Disonancias
Fin

(advertencia: casi todo es improvisado, y hay muchos fallos).
]]></description>
			<content:encoded><![CDATA[<p>Querido diario:</p>
<ul>
<li><a href="http://slack.codemaniacs.com/misc/musica_blog/confusion.mp3">Confusion</a></li>
<li><a href="http://slack.codemaniacs.com/misc/musica_blog/tiempo.mp3">Tiempo</a></li>
<li><a href="http://slack.codemaniacs.com/misc/musica_blog/lluvia.mp3">Lluvia</a></li>
<li><a href="http://slack.codemaniacs.com/misc/musica_blog/disonancias.mp3">Disonancias</a></li>
<li><a href="http://slack.codemaniacs.com/misc/musica_blog/fin.mp3">Fin</a></li>
</ul>
<p>(advertencia: casi todo es improvisado, y hay muchos fallos).</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/12/06/querido-diario/feed/</wfw:commentRss>
<enclosure url="http://slack.codemaniacs.com/misc/musica_blog/tiempo.mp3" length="1634304" type="audio/mpeg" />
<enclosure url="http://slack.codemaniacs.com/misc/musica_blog/confusion.mp3" length="2543616" type="audio/mpeg" />
<enclosure url="http://slack.codemaniacs.com/misc/musica_blog/lluvia.mp3" length="6199296" type="audio/mpeg" />
<enclosure url="http://slack.codemaniacs.com/misc/musica_blog/disonancias.mp3" length="2873344" type="audio/mpeg" />
<enclosure url="http://slack.codemaniacs.com/misc/musica_blog/fin.mp3" length="2539588" type="audio/mpeg" />
		</item>
		<item>
		<title>Review: Hiromi Uehara - Valencia - 29/6/2007</title>
		<link>http://slack.codemaniacs.com/blog/2007/07/02/review-hiromi-uehara-valencia-2962007/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/07/02/review-hiromi-uehara-valencia-2962007/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 02:13:22 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/07/02/review-hiromi-uehara-valencia-2962007/</guid>
		<description><![CDATA[El viernes pasado estuve en el concierto de Hiromi en los jardines del Palau de la Música de Valencia. Ya  había leido algunas cosas sobre ella, pero ha superado mis expectativas más optimistas.
Me lo pasé en grande. La música genial, estuve todo el concierto sonriendo embobado escuchándoles tocar (y aún me dura). Aparte de [...]]]></description>
			<content:encoded><![CDATA[<p>El viernes pasado estuve en el concierto de <a href="http://www.hiromimusic.com/">Hiromi</a> en los jardines del Palau de la Música de Valencia. Ya <a href="http://sergeeo.scenesp.org/blog/?p=83"> había leido algunas cosas sobre ella</a>, pero ha superado mis expectativas más optimistas.</p>
<p>Me lo pasé en grande. La música genial, estuve todo el concierto sonriendo embobado escuchándoles tocar (y aún me dura). Aparte de eso, siempre me ha gustado ver a músicos pasándoselo bien y verla sobre el escenario con esa sonrisa juguetona mientras toca el piano no tiene precio. Ains, creo que me he enamorado&#8230;</p>
<p>Al final del concierto me quedé con ganas de gastarme el dinero y busqué el clásico tenderete con discos, pero solo había unos pocos de <a href="http://www.martinvalihora.com/">Martin Valihora</a>, el batería, y no lo conozco lo suficiente. Pero bueno, hoy he salido de compras y me he vuelto con un <a href="http://www.telarc.com/gscripts/title.asp?gsku=3655">Time Control</a> bajo el brazo :)</p>
<p>Esperemos que vuelva a tocar pronto por aquí cerca.</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/07/02/review-hiromi-uehara-valencia-2962007/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Vámonos de congreso</title>
		<link>http://slack.codemaniacs.com/blog/2007/06/10/vamonos-de-congreso/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/06/10/vamonos-de-congreso/#comments</comments>
		<pubDate>Sun, 10 Jun 2007 02:13:15 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Stories]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/06/10/vamonos-de-congreso/</guid>
		<description><![CDATA[Esta semana he pasado unos dias en Gerona, asistiendo al IbPRIA 2007. La primera vez que iba a un congreso con un paper bajo el brazo (antes habia estado  de party en el Games2006).
Cosas buenas:

 Pasarse 3 dias fuera y que (esperemos) el hotel y la inscripcion al congreso corran a cargo de la [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana he pasado unos dias en Gerona, asistiendo al <a href="http://ibpria2007.udg.cat/">IbPRIA 2007</a>. La primera vez que iba a un congreso con un <em>paper</em> bajo el brazo (antes habia estado <a href="http://slack.codemaniacs.com/blog/2006/10/01/inercia-demoparty-2006-segunda-parte/"> de party en el Games2006</a>).</p>
<p>Cosas buenas:</p>
<ul>
<li> Pasarse 3 dias fuera y que (esperemos) el hotel y la inscripcion al congreso corran a cargo de la beca.</li>
<li> Asistir a la cena del congreso, no incluida en la inscripción de estudiante. Muchas gracias a las dos personas que nos cedieron amablemente los tickets que no iban a usar :D</li>
<li> Encontrarse con <a href="http://www.yero.org">yero^Sector Omega</a> nada más llegar al Auditorio. Siempre es bonito encontrarse con sceners <em>in the wild</em> :)</li>
<li> Al igual que en las parties, ver lo que han hecho los demás da ganas de ponerse a hacer cosas a la vuelta.</li>
</ul>
<p>Cosas no tan buenas:</p>
<ul>
<li> No haber hecho ni una sola foto: me olvidé la cámara en el hotel los 3 días. </li>
<li> El catering: comer de pie con el plato en la mano no mola. </li>
<li> No encontrar nada abierto el miércoles por la noche para tomarnos algo después de cenar. </li>
</ul>
<p>En líneas generales una grata experiencia. Viajar mola :)</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/06/10/vamonos-de-congreso/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Síntesis musical para mí (o para torpes en general :) III</title>
		<link>http://slack.codemaniacs.com/blog/2007/05/24/sintesis-musical-para-mi-o-para-torpes-en-general-iii/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/05/24/sintesis-musical-para-mi-o-para-torpes-en-general-iii/#comments</comments>
		<pubDate>Thu, 24 May 2007 14:30:22 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<category><![CDATA[Demoscene]]></category>

		<category><![CDATA[Hacks]]></category>

		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/05/24/sintesis-musical-para-mi-o-para-torpes-en-general-iii/</guid>
		<description><![CDATA[3) Más ondas básicas
No solo de senos vive el hombre (salvo que nos pongamos a hacer síntesis aditiva), así que vamos a ver unas cuantas ondas más que podemos utilizar como base para construir sonidos.

Onda cuadrada:

Get the Flash Player to see this player.

  var FO = { movie:"https://media.dreamhost.com/mediaplayer.swf",width:"200",height:"20",majorversion:"7",build:"0",bgcolor:"#FFFFFF",
flashvars:"file=http://slack.codemaniacs.com/misc/tutorial_sintesis/square.mp3&#38;showdigits=true&#38;autostart=false" };
UFO.create(FO,"square.mp3");

Se obtiene alternando dos valores (en [...]]]></description>
			<content:encoded><![CDATA[<p><strong>3) Más ondas básicas</strong></p>
<p>No solo de senos vive el hombre (salvo que nos pongamos a hacer síntesis aditiva), así que vamos a ver unas cuantas ondas más que podemos utilizar como base para construir sonidos.</p>
<ul>
<li><b><a href="http://en.wikipedia.org/wiki/Square_wave">Onda cuadrada</a>:</b>
<p><script type="text/javascript" src="https://media.dreamhost.com/ufo.js"></script></p>
<p id="square.mp3"><a href="http://www.macromedia.com/go/getflashplayer">Get the Flash Player</a> to see this player.</p>
<p><script type="text/javascript">
  var FO = { movie:"https://media.dreamhost.com/mediaplayer.swf",width:"200",height:"20",majorversion:"7",build:"0",bgcolor:"#FFFFFF",
flashvars:"file=http://slack.codemaniacs.com/misc/tutorial_sintesis/square.mp3&amp;showdigits=true&amp;autostart=false" };
UFO.create(FO,"square.mp3");
</script></p>
<p>Se obtiene alternando dos valores (en nuestro caso +1 y -1) con la frecuencia deseada. Expresado en código, podría ser algo como esto:</p>
<blockquote><pre>
// Generacion del i-esimo sample de una onda cuadrada
// de frecuencia f
float t = i/sampling_rate; // instante i en segundos
float periodo = 1.0f / f; // periodo de la onda en segundos
if (fmodf(t,periodo) &lt; periodo/2.0f)
    y[i] = 1.0f;
else
    y[i] = -1.0f;
</pre>
</blockquote>
<p><img src="http://slack.codemaniacs.com/images/tutorial_sintesis/square.png" alt="Onda cuadrada." /></p>
<p>Otra posibilidad es hacer que las zonas a +1 y -1 no tengan la misma longitud (<a href="http://en.wikipedia.org/wiki/Pulse_width_modulation">pulse width modulation</a>)
</li>
<li><b><a href="http://en.wikipedia.org/wiki/Sawtooth_wave">Onda de diente de sierra</a>:</b>
<p id="sawtooth.mp3"><a href="http://www.macromedia.com/go/getflashplayer">Get the Flash Player</a> to see this player.</p>
<p><script type="text/javascript">
  var FO = { movie:"https://media.dreamhost.com/mediaplayer.swf",width:"200",height:"20",majorversion:"7",build:"0",bgcolor:"#FFFFFF",
flashvars:"file=http://slack.codemaniacs.com/misc/tutorial_sintesis/sawtooth.mp3&amp;showdigits=true&amp;autostart=false" };
UFO.create(FO,"sawtooth.mp3");
</script></p>
<p>En cada periodo, aumenta linealmente desde -1 a 1, cayendo bruscamente a -1 en el comienzo del siguiente periodo. Dicho en C viene a ser:</p>
<blockquote><pre>
// Sample i-esimo, frecuencia f
float t = i/sampling_rate;
float periodo = 1.0f / f;
y[i] = 2.0f*(fmodf(t, periodo)/periodo)-1.0f;
</pre>
</blockquote>
<p><img src="http://slack.codemaniacs.com/images/tutorial_sintesis/sawtooth.png" alt="Onda de diente de sierra." /></p>
</li>
<li><b><a href="http://en.wikipedia.org/wiki/Triangle_wave">Onda triangular</a>:</b>
<p id="triangle.mp3"><a href="http://www.macromedia.com/go/getflashplayer">Get the Flash Player</a> to see this player.</p>
<p><script type="text/javascript">
  var FO = { movie:"https://media.dreamhost.com/mediaplayer.swf",width:"200",height:"20",majorversion:"7",build:"0",bgcolor:"#FFFFFF",
flashvars:"file=http://slack.codemaniacs.com/misc/tutorial_sintesis/triangle.mp3&amp;showdigits=true&amp;autostart=false" };
UFO.create(FO,"triangle.mp3");
</script></p>
<p>Es parecida a la anterior, pero durante la mitad del periodo crece linealmente de -1 a 1, y durante la otra mitad decrece linealmente volviendo a -1, sin discontinuidad.</p>
<blockquote><pre>
// Sample i-esimo, frecuencia f
float t = i/sampling_rate;
float periodo = 1.0 / f;
float semiperiodo = periodo/2.0f;
if (fmodf(t,periodo) &lt; periodo/2.0f)
    y[i] = 2.0f*(fmodf(t,semiperiodo)/semiperiodo)-1.0f;
else
    y[i] = 1.0f-2.0f*fmod(t,semiperiodo)/semiperiodo;
</pre>
</blockquote>
<p><img src="http://slack.codemaniacs.com/images/tutorial_sintesis/triangle.png" alt="Onda triangular." />
</li>
</ul>
<p>En el <a href="http://slack.codemaniacs.com/misc/tutorial_sintesis/sintesis03_ondas.zip"> programa de ejemplo</a> de este capítulo (ahora con un 100% más de Makefile) está todo esto en forma compilable para poder probarlo fácilmente. Por cierto, ninguno de los ejemplos está optimizado porque pretenden ser lo más claros posible, si alguien tiene sugerencias sobre como implementar mejor cualquier cosa nos lo podemos pasar muy bien comentándolas :)</p>
<p>En fin, esto es todo por hoy. En el próximo post, cosillas sobre espectros de frecuencias y aliasing (supongo que la pereza me obligará a dejarme los filtros para dentro de dos posts :)</p>
<p><strong>EDIT:</strong> A peticion de pplux, ahi van los enlaces a los posts anteriores:</p>
<ul>
<li><a href="http://slack.codemaniacs.com/blog/2007/04/22/sintesis-musical-para-mi-o-para-torpes-en-general-ii/">Parte II: Senos!!!</a></li>
<li><a href="http://slack.codemaniacs.com/blog/2007/04/17/sintesis-de-audio-para-mi-o-para-torpes-en-general/">Parte I: Haciendo ruido</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/05/24/sintesis-musical-para-mi-o-para-torpes-en-general-iii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Síntesis musical para mí (o para torpes en general :) II</title>
		<link>http://slack.codemaniacs.com/blog/2007/04/22/sintesis-musical-para-mi-o-para-torpes-en-general-ii/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/04/22/sintesis-musical-para-mi-o-para-torpes-en-general-ii/#comments</comments>
		<pubDate>Sun, 22 Apr 2007 01:41:40 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<category><![CDATA[Demoscene]]></category>

		<category><![CDATA[Hacks]]></category>

		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/04/22/sintesis-musical-para-mi-o-para-torpes-en-general-ii/</guid>
		<description><![CDATA[2) Senos!!! 
Después del ruido del capitulo anterior, vamos a pasar a algo ligeramente más interesante: la onda senoidal. Como podéis ver si seguís el enlace a la pagina sobre la onda senoidal en la wikipedia, junto con dibujitos y explicaciones interesantes, la formula es:
 y = A·sin(w·t + fase) 
donde A es la amplitud [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2) Senos!!! </strong></p>
<p>Después del ruido del capitulo anterior, vamos a pasar a algo ligeramente más interesante: la <a href="http://en.wikipedia.org/wiki/Sine_wave">onda senoidal</a>. Como podéis ver si seguís el enlace a la pagina sobre la onda senoidal en la wikipedia, junto con dibujitos y explicaciones interesantes, la formula es:</p>
<blockquote><p> <em>y</em> = <em>A</em>·sin(<em>w·t</em> + <em>fase</em>) </p></blockquote>
<p>donde <em>A</em> es la amplitud de la onda (la distancia entre una cresta y un valle), <em>w</em> es la frecuencia en radianes/segundo y <em>t</em> es el tiempo. Vamos a ignorar la fase porque no nos hace falta :)</p>
<p>Como nos gusta trabajar con frecuencias en hercios, multiplicamos por 2·pi. Además, tenemos que t = samples generados / frecuencia de muestreo. Por lo tanto en el código tendremos algo como:</p>
<blockquote><p> y[i] = A*sin(2*pi*frecuencia*(i/sampling_rate))</p></blockquote>
<p>para el sample i-ésimo desde el inicio del sonido. Vamos a ver el trozo de código correspondiente (lo que falta es, básicamente, la inicialización del capítulo anterior):</p>
<pre>
void play(void *userdata, Uint8 *stream, int len)
{
    int num_samples = len / 2;
    Sint16 *dst_buf = (Sint16*) stream;
    for (int i=0; i&lt;num_samples ; ++i)
        buffer[i] = sin(2.0*M_PI*440.0f*(i+pos)/(float)SAMPLING_RATE);

    // Clipping y conversion a Sint16
    for (int i=0; i&lt;num_samples; ++i)
    {
        float v = buffer[i];
        if (v &gt; 1.0f)
            v = 1.0f;
        else if (v&lt; -1.0f)
            v = -1.0f;

        dst_buf[i] = (Sint16)(32767.0f*v);
    }
    pos += num_samples;

}
</pre>
<p>Detalles destacables de esta función:</p>
<ul>
<li>se trabaja con un buffer de floats y se convierte a entero al final. No mola ir perdiendo precisión por el camino, sobre todo cuando hagamos cosas mas complejas</li>
<li>hay clipping a [-1.0, 1.0]. Ahora mismo es completamente innecesario porque sin() devuelve valores en ese intervalo, pero cuando empecemos a mezclar varios sonidos vendrá bien :) </li>
<li>en la llamada a sin(), el 440.0f es la <a href="http://en.wikipedia.org/wiki/Piano_key_frequencies">frecuencia</a> de la nota que suena (un <a href="http://en.wikipedia.org/wiki/A440">La4</a>), y pos es una variable global que guarda el índice del ultimo sample generado entre llamadas a play(). Es feo, pero para un ejemplo pequeño va bien.
</li>
</ul>
<p>En el próximo episodio (ahora es tarde y tengo sueño), veremos otros osciladores típicos y cosas interesantes que se pueden hacer con ellos.</p>
<p><b>EDIT:</b> <a href="http://herotyc.com/">herotyc</a> me ha enviado una <a href="http://slack.codemaniacs.com/misc/tutorial_sintesis/sintesis02_senos.c">versión stand-alone del ejemplo</a> de este capítulo. ¡Muchas gracias! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/04/22/sintesis-musical-para-mi-o-para-torpes-en-general-ii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Síntesis musical para mí (o para torpes en general :)</title>
		<link>http://slack.codemaniacs.com/blog/2007/04/17/sintesis-de-audio-para-mi-o-para-torpes-en-general/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/04/17/sintesis-de-audio-para-mi-o-para-torpes-en-general/#comments</comments>
		<pubDate>Tue, 17 Apr 2007 17:34:37 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<category><![CDATA[Demoscene]]></category>

		<category><![CDATA[Hacks]]></category>

		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/04/17/sintesis-de-audio-para-mi-o-para-torpes-en-general/</guid>
		<description><![CDATA[Por petición popular (hola pplux) voy a hacer una pequeña introducción a la síntesis 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á ejemplos de código. C99 y SDL for teh win.
0) Disclaimer
Esto no tiene por [...]]]></description>
			<content:encoded><![CDATA[<p>Por petición popular (hola pplux) voy a hacer una pequeña introducción a la síntesis 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á ejemplos de código. C99 y SDL for teh win.</p>
<p><strong>0) Disclaimer</strong><br />
Esto no tiene por qué ser la forma correcta de hacer las cosas. Hasta donde yo sé 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ódigo rompe algo o deja sordo a alguien yo no me hago responsable.</p>
<p><strong>1) Haciendo ruido</strong></p>
<p>En primer lugar, el clásico trozo de codigo de inicialización que todo el mundo copia y pega y nadie lee:</p>
<p><code></p>
<pre>
#include "SDL.h"

#define BUFFER_SIZE 1024    // Longitud del buffer, en samples

// Este comentario esta extraido de SDL_audio.h, porque me ha molado
/* This function is called when the audio device needs more data.
 * 'stream' is a pointer to the audio data buffer
 * 'len' is the length of that buffer in bytes.
 * Once the callback returns, the buffer will no longer be valid.
 * Stereo samples are stored in a LRLRLR ordering.
 */
void play(void *userdata, Uint8 *stream, int len)
{
    int num_samples = len / 2;
    Sint16 *buf = (Sint16*) stream;
    for (int i = 0; i&lt;num_samples ; ++i)
        buf[i] = rand()%65535-32768;

}

int main(int argc, char **argv)
{
    SDL_AudioSpec desired;
    desired.freq     = 44100;        // Frecuencia de muestreo
    desired.format   = AUDIO_S16SYS; // Formato de las muestras
    desired.channels = 1;            // Numero de canales
    desired.samples  = BUFFER_SIZE;  // Tamaño del buffer en samples
                                     // (potencia de 2)
    desired.callback = play;         // Callback
    desired.userdata = NULL;         // Puntero a datos

    SDL_Init(SDL_INIT_AUDIO);
    SDL_OpenAudio(&#038;desired, NULL);
    SDL_PauseAudio(0);
    getchar();
    SDL_PauseAudio(1);
    SDL_CloseAudio();
    SDL_Quit();
}
</pre>
<p></code></p>
<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á 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>
<p>No se pierdan el proximo episodio.</p>
<p><strong>EDIT:</strong> He cambiado el titulo, de &#8220;sintesis de audio&#8221; a &#8220;sintesis musical&#8221; porque lo primero era demasiado general :)</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/04/17/sintesis-de-audio-para-mi-o-para-torpes-en-general/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Night of the proms + Breakpoint</title>
		<link>http://slack.codemaniacs.com/blog/2007/04/07/night-of-the-proms-breakpoint/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/04/07/night-of-the-proms-breakpoint/#comments</comments>
		<pubDate>Sat, 07 Apr 2007 12:23:51 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Demoscene]]></category>

		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/04/07/night-of-the-proms-breakpoint/</guid>
		<description><![CDATA[Por fin llegó el dia de volver a ver a Mike Oldfield en España. Habia que aprovechar la ocasión y estuve en los conciertos de Valencia y Madrid.
El primer dia en Valencia estuve en la primera fila (fotos proximamente :D), y en el concierto de Madrid me vi relegado a la grada por comprar la [...]]]></description>
			<content:encoded><![CDATA[<p>Por fin llegó el dia de volver a ver a Mike Oldfield en España. Habia que aprovechar la ocasión y estuve en los conciertos de Valencia y Madrid.</p>
<p>El primer dia en Valencia estuve en la primera fila (fotos proximamente :D), y en el concierto de Madrid me vi relegado a la grada por comprar la entrada a ultima hora. Ambos estuvieron geniales, y me parece que el año que viene iré al NOTP toque quien toque.</p>
<p>Ahora solo falta que sea verdad lo que dijo el señor Oldfield de venir proximamente a dar algun concierto mas largo.</p>
<p>En otras noticias, estoy en la breakpoint. Shash y yo hemos presentado 4k, y la compo es dentro de 1:40h. Ahora que el partycoding ya ha pasado&#8230; FIESTA! \o/</p>
<p>Seguiremos informando.</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/04/07/night-of-the-proms-breakpoint/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Una de cal y otra de arena</title>
		<link>http://slack.codemaniacs.com/blog/2007/03/03/una-de-cal-y-otra-de-arena/</link>
		<comments>http://slack.codemaniacs.com/blog/2007/03/03/una-de-cal-y-otra-de-arena/#comments</comments>
		<pubDate>Sat, 03 Mar 2007 02:27:32 +0000</pubDate>
		<dc:creator>slack</dc:creator>
		
		<category><![CDATA[Rants]]></category>

		<guid isPermaLink="false">http://slack.codemaniacs.com/blog/2007/03/03/una-de-cal-y-otra-de-arena/</guid>
		<description><![CDATA[Nunca he sabido si la de cal es la buena o la mala, así que lo contaré por orden cronológico.
Ayer, como ya comenté por aquí, estuve en el concierto de Yann Tiersen en Valencia. Fue algo un poco más trallero de lo que yo me esperaba, y eché en falta más temas con acordeón (sólo [...]]]></description>
			<content:encoded><![CDATA[<p>Nunca he sabido si la de cal es la buena o la mala, así que lo contaré por orden cronológico.</p>
<p>Ayer, como ya comenté por aquí, estuve en el concierto de Yann Tiersen en Valencia. Fue algo un poco más trallero de lo que yo me esperaba, y eché en falta más temas con acordeón (sólo lo utilizó en una de las canciones). Aun así, estuvo muy bien y salí feliz del lugar. A fin de cuentas, ver tocar en directo a buenos músicos suele estar bien. Thumbs up. \o/</p>
<p>Hoy, sin embargo, he ido a ver <a href="http://imdb.com/title/tt0460829/">Inland Empire</a> de <a href="http://en.wikipedia.org/wiki/David_Lynch">David Lynch</a>. La impresión de conjunto que me he llevado al terminar la película es que Lynch es un cabrón malvado que filma un montón de secuencias inconexas en torno a algunas ideas recurrentes para crear una ilusión de coherencia interna con la intención de hacer que uno caiga en la trampa de intentar encontrarle sentido a la película. Como punto positivo, a mitad de película he dejado de intentar buscar la trama y la secuencia de imágenes y sonido era lo suficientemente interesante como para mantenerme en la butaca a pesar del tremendo calor en la sala (eso sí, casi me duermo). Valoración final: thumbs down.</p>
]]></content:encoded>
			<wfw:commentRss>http://slack.codemaniacs.com/blog/2007/03/03/una-de-cal-y-otra-de-arena/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.277 seconds -->
