sábado, 20 de junio de 2009

Oh no!, pronto las máquinas dominarán el mundo!!!

Hace tiempo fue a unas tediosas conferencias en el Museo Nacional de Ciencia y Tecnología de Madrid a cambio de un puñado de créditos... Nos hablaron durante varios cuatrimestres de infinidad de cosas que no le interesaban ni al que las había descubierto xD, pero hubo una conferencia que estuvo (a mi parecer) especialmente interesante, y es aquella en la que se habló sobre Inteligencia Artificial y cosas por el estilo.

Hay cosas fascinantes dentro de ese campo que no entiendo ni aspiro por el momento a entender, como ordenadores que aprenden un lenguaje completamente desconocido "escuchándose" unos a otros, o máquinas que eran capaces de componer una canción, pero se me ha ocurrido un pequeño "experimento" relacionado con esta última faceta.

Respecto a la música, recuerdo que por aquel entonces yo ya alucinaba con programas de edición de vídeo (como el Pinnacle Studio) que permitían poner música a lo que hubieras grabado, pero esta música era capaz de adaptarse a la duración de la película a la perfección, terminando cuando llegase el momento, no de golpe, sino con el final que hubiera planeado un músico de verdad. En la conferencia nos hablaron de ordenadores programados con ciertas pautas para que compusieran melodías, dando cierta apariencia "humana" a las actividades que estas máquinas desempeñaban.

Relacionado con eso, se me ha ocurrido pensar que si nos restringimos a lo más básico, no debería ser difícil implementar un méodo para que tu ordenador componga.

Consideraremos, para intentar que suene bien, que el ordenador no se salga de las notas La, Do, Re, Mi y Sol, que conforman la escala pentatónica de La, una de las más utilizadas en la historia por todas la civilizaciones (desde la música tradicional china, hasta el Heavy Metal actual). Otra restricción que haremos será que los tiempos que duren cada una de las notas tendrán que ser como mínimo la cuarta parte del tiempo máximo, es decir, si consideramos que el tiempo máximo son negras, el ritmo de la canción sólo podrá usar figuras comprendidas entre las semicorcheas (1/4 de negra) y las negras.

Sin meternos mucho en la física del sonido, una nota musical es una vibración en la que predomina una frecuencia, que es la frecuencia de la nota. Realizando la transformada de Fourier, se pueden ver los picos de frecuencias, y comprobar que, en general, tienen un aspecto como este:


(Análisis en frecuencias del resultado de este "experimento". Nótese que los picos corresponden a la escala pentatónica de La, como habíamos impuesto.)

Cuando a la frecuencia principal le acompañan frecuencias parásitas de menor intensidad, el sonido no es tan limpio, y genera el timbre característico de cada instrumento (debido a su forma de generar esas vibraciones). En nuestro caso, vamos a utilizar funciones "seno" para modelizar la vibración sonora. Las funciones "seno" tienen frecuencias bien definidas (son casi "notas puras"), por lo que los picos en un espectro de Fourier se pueden ver con claridad. Sin embargo, las funciones "seno", estrictamente hablando, son infinitas, y como no vamos a hacer una canción eterna, vamos a tener que utilizar funciones "seno" truncadas, desfigurando un poco el diagrama en frecuencias.

Con las restricciones que hemos puesto en frecuencia (sólo permitimos 6 valores de frecuencia), y en duración de cada nota, podemos modelizar la creatividad del compositor con un par de números aleatorios (función "rand" en MATLAB).

Resumiendo, el programilla que lo hace es este:


function [Y]=musica(n)
%
% Script realizado por Astaroth (O.R.G.) para generar un archivo de audio
%("Composicion.wav") a partir de procedimientos aleatorios y restricciones
%basadas en argumentos musicales para evitar, en la medida de lo posible,
%cacofonías.
%
% El argumento de entrada, "n", es el número de veces que se toca una nota,
%y el de salida, "Y", es la onda de audio expresada matemáticamente.
%
% Frecuencias Permitidas:
Pentatonica=[440,523,588,660,784,880];
% Valores iniciales:
Y=0;
T0=0;
o=8000; % Frecuencia de muestreo
% Composición:
for i=1:n
    freq=Pentatonica(fix(rand*6)+1); % Frecuencia de la nota.
    ale=(rand*3+1)/4; % Parámetro de duración de la nota.
    tm=o*ale; % Duración de la nota.
    t=linspace(0,1,tm); % Espacio de tiempos.
    y=sin(2*pi*freq*ale*(t+T0)); % Vibración armónica.
    T0=tm; % Fin del intervalo temporal.
    Y=[Y,y] % Creación de la onda.

end
% Representación Gráfica:
long=max(size(Y));
x=(0:long-1)
plot(x,Y)
% Creación del archivo de sonido:
wavwrite(Y,'Composicion.wav');



Podéis descargaros el script de aquí, aunque lo mismo preferiríais escuchar primero el desagradable sonido que produce xD!



Evidentemente, esto era un experimento no demasiado ambicioso, los estudios serios sobre este tema no se hacen en una tarde con un script de un par de líneas... pero vale para ilustrar cómo no es tan difícil hacer que un ordenador componga al azar. Hay que destacar que cada vez que se ejecute nos dará una melodía nueva, y que es el propio ordenador "el que elige" qué nota tocar, y durante cuánto tiempo.


Actualización:

La cosa mejora si lo retocamos un poco. En primer lugar le he metido una batería programada, con unas voces haciendo acordes que "peguen" con la pentatónica de La. Después, para darle cierta estabilidad a la canción, he generado una primera melodía más grave en la que todas las notas duran el mismo tiempo (1 segundo). La batería está programada a 120 (120 golpes por minuto, es decir, 2 golpes por segundo), de tal manera que el tiempo de las notas de la melodía de base es exactamente el doble del tiempo de la negra (la base está hecha, por tanto, con blancas que tocan una melodía al azar). Por último le he añadido una melodía sin retocar el script anterior, de manera que tanto el tono como el tiempo de cada nota son azarosos.

El resultado final es este, que si bien no es una maravilla, mejora el ejemplo anterior.



CompartirGrupo

3 comentarios:

  1. hola!
    no sé lo que pasa que no se escucha el sonido del 2º video, no sé si te has dado cuenta.
    espero que lo arregles para poder escucharlo :))
    un beso.

    ResponderEliminar
  2. ahora si que se escucha ;)
    es sorprendente lo que puede hacer un ordenador eh!
    caramba :))
    saludos!

    p.d: ah y gracias por la página para comprar la espada, no tenías porque molestarte, ya estoy a punto de conseguir una gratis cuando alguien entre en un profundo sueño, jajaja.

    ResponderEliminar
  3. p.d.2: oh qué pena, en mi filosofía no conozco nada que diga "no robarás la espada del guerrero aliado"
    pero conozco una que dice:
    "si tu guerrero aliado duerme, llévate su espada!"

    ResponderEliminar

Querido astarothista!,

Si te ha gustado la entrada y quieres dejar constancia de ello, tienes alguna sugerencia para completarla o corregirla, quieres mostrar tu opinión respecto a algo de lo que se haya hablado en esta entrada (con respeto) o simplemente quieres dejarme un mensaje a mi o a la comunidad, no dudes en comentar ;)!

Recuerda que también estamos en Facebook y en Google+.