logo linux

Haciendo que Linux componga música

Existen multitud de programas para Linux destinados a la composición musical. Para que funcionen hay un requisito: que haya alguien al otro lado del ordenador componiendo. Pero ¿qué ocurre si dejamos a Linux el lado creativo?

Una compañía de software llamada Robert Elder ha creado un sencillo script para Linux que, al ejecutarlo, dejaremos al sistema componer una sintonía en base a la información obtenida de urandom.

El script ocupa tan solo una linea y se puede ejecutar directamente en consola, pero está compuesto de múltiples comandos unidos mediante ‘pipes’. Para hacer que Linux componga, lo primero que hay que hacer es obtener el contenido del dispositivo que ofrece datos aleatorios en ‘/dev/urandom’ a través del comando ‘cat’.

cat /dev/urandom

Con esto se obtienen bytes compuestos a base de bits aleatorios, lo que da toda clase de caracteres sin sentido. El siguiente paso es convertir esos bytes en valores de 0-255 para que resulte más sencillo tratar la información. Para eso se puede usar la herramienta ‘hexdump’:

hexdump -v -e '/1 "%u\n"

Tal y como explican en su página, el modificador -v evita que hexdump reemplace las lineas repetidos por asteriscos, ya que ese es su comportamiento habitual. El modificador -e usa ‘/1 «%u\n»‘ para mostrar el byte binario en formato de número decimal.

Más adelante se ejecuta la parte más compleja que será la encargada que crear las notas musicales con cierta lógica en base a los datos aleatorios obtenidos. Para eso se ejecuta:

awk '{ split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }'

Awk es un formato que busca patrones en un archivo (en este caso el resultado de ejecutar un pequeño programa) con un formato determinado. ‘Split’ crea un vector llamado ‘a’ con los valores de los semitonos de una escala mayor. Después se ejecuta un ‘printf’ de una fórmula creada con distintas funciones matemáticas que representa la amplitud de la señal en un momento determinado en función del vector de semitonos ‘a’.

El último paso antes de la reproducción es volver a convertir a binario el resultado que hemos obtenido con:

xxd -r -p

Y para terminar, llega el momento de reproducir todo lo ejecutado anteriormente con el comando ‘aplay’:

aplay -c 2 -f S32_LE -r 16000

De esa forma, usando pipes, lo que hay que ejecutar para escuchar la música creada por el sistema es la siguiente linea:

cat /dev/urandom | hexdump -v -e '/1 "%u\n"' | awk '{ split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | xxd -r -p | aplay -c 2 -f S32_LE -r 16000

La ejecución de esta linea debería funcionar en cualquier distribución actual. Para terminar, el autor de este pequeño programa presenta una alternativa que crear música triste cambiando el vector de semitonos a una escala menor:

cat /dev/urandom | hexdump -v -e '/1 "%u\n"' | awk '{ split("0,2,3,5,7,8,10,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | xxd -r -p | aplay -c 2 -f S32_LE -r 16000

Esto, a parte de ser una curiosidad, resulta interesante para comprender el funcionamiento de ciertas herramientas y comprobar la potencia de los pipes en Linux.

Si quieres obtener información más detalladas de cada parte, puedes visitar el blog de Robert Elder.