lunes, 22 de junio de 2009

Poniendo barreras a la creatividad

Estos días de atrás os he estado poniendo ejemplos de scripts realizados en MATLAB para la generación de melodías improvisadas por el propio ordenador.

La última versión dejaba que el ordenador eligiese una nota de entre las pertenecientes a una escala que definiéramos al principio, y además le dejábamos que decidiera cuánto debía durar esa nota (en múltiplos enteros de 1/8 parte la nota de mayor tiempo).

Personalmente creo que esa versión estaba muy bien, y que acotar más el script es "hacer trampas" :p! (también podríamos decirle directamente que toque las notas que queramos cuando queramos, pero eso no es dejar que el ordenador "componga"). Sin embargo, nuestro oido está acostumbrado, por lo general, a estructuras rítmicas simples y periódicas... así que he realizado una versión del script mucho más restringida, de tal manera que la primera melodía que genere sean negras graves, y que según vayan añadiéndose melodías aumenten cada vez una octava y la velocidad al doble (corcheas, semicorcheas, fusas...). En otras palabras, el ritmo viene definido de antemano (pudiéndose modificar con el tercer argumento del script, que recordemos que era, y sigue siendo, la velocidad que marca el metrónomo), y el ordenador sólo elige qué nota tocar de entre las que le demos nosotros, estando la octava también determinada por el número de melodía monofónica que sea.

No toda va a ser malo (si no, no estaría colgando una entrada sobre este script :p), el resultado es quizá algo más agradable al oido inexperto, puesto que es mucho más simple rítmicamente, dando la sensación de ser una melodía más "compacta", y no un montón de notas al azar.

Aquí os dejo un ejemplo de varias salidas del script restringido, con distintas escalas:



El código, que podéis descargar pinchando aquí, es el siguiente:


function [Y]=musicgenRR(n,m,Time)
%
% Script creado por Astaroth (O.R.G.) para generar melodías polifónicas
%a través de números aleatorios (método de MonteCarlo).
%
% Dados "n" (el número de notas que contendrá cada melodía monofónica), y
%"m" (el número de melodías que conformarán la melodía polofónica), este
%script elegirá en cada momento qué nota desea tocar (de la escala a la
%que hayamos definido). La prmera melodía generará notas lentas y graves,
%a partir de ella, las siguientes serán cada vez más rápidas (el doble) y
%más agudas (una octava por vez).
%
% Por defecto se considerará un tiempo de metrónomo de 60 (60 golpes por
%minuto). Esto podrá cambiarse especificando el tiempo de metrónomo en el
%tercer argumento de este script.
%
% Si m=1 (melodía monofónica), la salida será un archivo ".wav" mono. En
%caso de ser m>1, entonces la salida será un archivo *.wav estéreo,
%grabándose una vez en cada canal (izquierdo/derecho) cada melodía monofónica
%generada.
%
% Para más información, visitar:
%
% http://astarothsworld.blogspot.com/2009/06/oh-no-pronto-las-maquinas-dominaran-el.html#arriba
%
% Escalas:
%
% Ahora se pueden modificar las escalas. Simplemente añade la tuya:
%
% Escala=[números asociados a los tonos]
%
% Y comenta las que no utilices poniéndo el sómbolo "%" delante. No
%importa cuántos tonos tenga la escala, el programa se encarga de
%redimensionar los índices que haga falta automáticamente.
%
Escala=[-2,1,3,5,8,10,13,15,17,20,22]; % Pentatonica de Lam
%Escala=[-7,-4,-2,0,3,5,8,10,12,15,17]; % Pentatonica de Mim
%Escala=[-2,-1,2,3,5,6,9,10,11,14,15]; % Árabe
%Escala=[1,4,5,7,8,10,11,13]; % Húngara Mayor
%Escala=[1,3,4,7,8,9,11,13]; % Gitana Húngara
%Escala=[1,2,5,7,9,11,12,13]; % Enigmática
%Escala=[1,2,5,6,8,9,11,13]; % Española
%Escala=[1,3,5,6,8,9,11,13]; % Hindú
%Escala=[1,3,6,8,11,13]; % Egipcia
%Escala=[1,2,6,8,9,13]; % Japonesa
%Escala=[-2,1,5,10,13,17,22]; % Acorde de Lam
Escala=[1,5,8,13,17,20,25]; % Acorde de DoM
e=max(size(Escala));
if nargin<2
    disp(' ')
    disp('Tienes que introducir como argumentos de entrada, al menos, el número de notas que quieras')
    disp('que tenga cada melodía y el número de melodías que quieras que haya. Opcionalmente, puedes')
    disp('especificar el valor de la negra dado por el metrónomo (por ejemplo: 60 => 1 negra dura 1 segundo).')
    disp(' ')
    else if (nargin==2)|(nargin==3)
        if nargin==2
          disp(' ')
          disp('**********************************************************************************')
          disp('Al no introducir el tercer argumento de entrada suponemos que 1 negra = 1 segundo.')
          disp('**********************************************************************************')
          disp(' ')
          Time=60;

        end
        Y=0;
        k=0;
        for i=1:m
          y=0;
          T0=0;
          o=8000;
          for j=1:(n*2^(i-1))
            nota=Escala(round(rand*(e-1))+1);
            alex=2^(2-i);
            freq=440*(2).^[((nota-10)./12)];
            ale=60/Time*alex;
            tm=round(o*ale);
            t=linspace(0,1,tm);
            Ond=sin(2*pi*freq*ale*(t+T0));
            T0=tm;
            y=[y,Ond];

          end
          if Y==0
            Y=zeros(2,max(size(y)));

          end
          MY=size(Y);
          MY=MY(2);
          my=size(y);
          my=my(2);
          if MY
            Y(:,MY+1:my)=0;

          else if MY>my
            y(my+1:MY)=0;

          end

        end
        if (-1)^k==1
          fila=1;

        else
          fila=2;

        end
        Y(fila,:)=1/2*(Y(fila,:)+y);
        k=k+1;

      end
      if m==1
        wavwrite(Y(1,:),'AudioTotal.wav');

      else
        wavwrite(Y','AudioTotal.wav');

      end
      disp(' ')
      disp('****************************************')
      disp('Ya tienes tu archivo de audio creado ;)!')
      disp('****************************************')
      disp(' ')

    end

end



CompartirGrupo

3 comentarios:

  1. esto cada vez suena mejor eh! me gusta!

    ya sé que la voz del diablo fumado es tuya, jaja, estoy haciendo un análisis de ambas, y estoy descubriendo cosas muy interesantes de tu personalidad, jaja, pero no temas, no lo haré público a no ser que me hagas un regalo, que tú ya sabes! pensabas que me había rendido? jaja

    los poderes de una guerrera son infinitos querido duque del indierno, el oráculo del guerrero dice:
    "Persigue al Demonio, acósalo, enfréntalo. Desciende hasta el fondo del infierno a buscarlo"

    jaja, te encontraré!

    ResponderEliminar
  2. indierno no , infierno, jaja, sorry, es el demonio que empieza a ponerme nerviosa ¬¬

    ResponderEliminar
  3. jajaja, qué si iré a verte? claro, tengo que ir por la espada, recuerdas? jajaja

    vale vale, me compraré una espada para el juicio final, pero porque no sé jugar a las damas que si no te ibas a enterar, ja!

    el diablo gobierna en el reino de la tierra? eso tendrás que demostrarlo! jajaja, es que no sabías que el bien siemppre vence al mal?

    osado duque, mis saludos, :)

    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+.