Veo el siguiente código en el blog de Robert Elder:
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
Introducido en una terminal de un sistema Linux con los programas necesarios, genera una melodía aleatoria. En el primer enlace hay una explicación detallada de lo que hace exactamente, aunque se resumir con cada orden entubada:
-
cat /dev/urandom
Vuelca los contenidos de /dev/urandom a stdout.
-
hexdump -v -e '/1 "%u\n"'
Convierte bytes binarios en enteros (opción
-e '/1 "%u\n"'
) incluyendo las repeticiones (opción-v
). -
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)) }'
Procesa la información con AWK de modo que:
-
split("0,2,4,5,7,9,11,12",a,",");
Crea un array
a
con los número de semitonos relativos a la nota base en una escala mayor. Este array se usa para calcular la frecuencia en hercios de una nota de temperamento igual con esta fórmula: 440 × 2^(número de semitonos / 12) 440Hz representa la frecuencia de un La 440. -
for (i = 0; i < 1; i+= 0.0001)
Un contador para generar los tonos. Variar el incremento de cada iteración altera el tempo y la frecuencia percibida de la melodía.
-
printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i))
Imprime números hexadecimales de 4 octetos representando la amplitud de la onda sonora en un momento determinado. La fórmula
100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i))
se puede descomponer en varias partes:-
a[$1 % 8] / 12
A partir del valor aleatorio de la entrada (
$1
) elige el semitono de la escala y lo divide por doce. -
exp(… * log(2))
AWK no tiene una función para calcular potencias de una base cualquiera pero sí calcula potencias del número e y logaritmos naturales, así que para obtener 2x hay que calcular e(x × ln(2)).
-
1382
Es un valor aproximado de 440 × π.
-
100
Un factor de escala para la amplitud de la onda y, por consiguiente, el volumen.
-
-
-
xxd -r -p
Convierte los 8 bytes de valores hexadecimales en binario.
-
aplay -c 2 -f S32_LE -r 16000
Reproduce el sonido equivalente.