sábado, mayo 12, 2007

Música en Matlab (Como hacer musica en matlab)

Imagínese usted la versión de famosas canciones interpretadas por un Nintendo.
Eso es lo que he intentado hacer con Matlab/GNU-Octave . El resultado a continuación:

Escuche:

Versión de la introducción de la "Reina del Tamarugal", Tirana



Versión de la cortina del Tetris, se llama Korobushka, Tetris


Este es una humilde propuesta, pues hay maneras mas eficientes de hacer música con otros programas, como Noteworthy Composer o el Guitar Pro, o simplemente su merced puede tocar música con instrumento. Recomiendo no tocar armónica porque pone nerviosa a la gente, sobre todo a tus compañeros de Universidad cuando hay certámenes.

La ventaja de la propuesta de hacer música en MATLAB es que acá empiezas de cero, y puedes crear tus propios tipos de sonidos, además de entender como funciona la música. Antes he escrito un poco sobre estos temas. Más abajo se hace referencia al sonido y a sus características, además de el cálculo de una frecuencia para una nota en particular.

Para explicar mejor el programa veamos las partes.
El programa lee música escrita en formato parecido al de los celulares NOKIA, arma las señales de sonido , las reproduce, y las guarda.

Para ello se ocupan 3 funciones, aca se incluye el vínculo a las sintaxis:


  • a) música , Programa principal que una vez que tiene las señales las suma las reproduce y las guarda como .wav

  • b) notas Función que con las notas ingresadas en formato de escritura parecido al del celular NOKIA, crea señales en un vector con una frecuencia de muestreo dada.

  • c) perc Crea la percusión variando el tiempo de sonido de un sonido parecido a un ruido de interferencia electríca, o ruido blanco.


Los detalles y observaciones importantes se discuten a continuación:

1) Ingreso de notas, lectura de notas, creación de la señalSe introducen como en los celulares NOKIA de la forma

[Duración][Nota en clave americana][Octava del piano]

-La duración de la redonda será 1, y las figuras siguientes serán nombradas por el inverso del múltiplo que le corresponden. Así:
redonda 1, blanca 2, negra 3, corchea 8, semicorchea 16.
- La nota en clave americana A hasta la G, si es sostenido sera acompañada por una s, los bemoles se hacen con los sostenidos.
-Las octavas son 5 , la central del piano es la 3.

Ejemplo: La 440, corchea de la octava central del piano ..................4a3
Ejemplo: Do# blanca de la "cuarta octava" (la del co central se toma como la tercera) ..................2cs4

Hice una misma función que leyera la nota y guardara en una matriz, la duración y la nota
asi [duración , notas], si tenemos n notas con sus respectivas duraciones será una matriz de n x 2 filas.

La creación de la señal se hace con la matriz anterior, se lee la frecuencia y la nota, y luego se arma una señal con la frecuencia y duración dada.

Para armar el sonido se hace la sinusoide y se le suman los armónicos que queremos que tengan. Yo personalmente intentaba imitar el sonido de un Nintendo, así que le puse unos armónicos que encontré por ahí en Internet, la señal me queda como una suma de esta manera:

sin(fr*2*pi.*x)+1/4*sin(3*fr*2*pi.*x)+1/6*sin(5*fr*2*pi.*x)+1/8*sin(7*fr*2*pi.*x)


Para armar el trozo de sonido para el par frecuencia/duración dejo un espacio libre con silencio , para que no suenen pegadas:
for i=1:A
fr=N1(i,1);
t=N1(i,2);
x=(0:(1/fm):t*8/10);
y1=[y1  sin(fr*2*pi.*x)+1/4*sin(3*fr*2*pi.*x)+1/6*sin(5*fr*2*pi.*x)+1/8*sin(7*fr*2*pi.*x) zeros(size((0:(1/fm):t*2/10)))];
end


Las notas/frecuencias las armamos asi

% ==FRECUENCIAS==
r=2^(1/12);
fr=440;%frecuencia del LA
fr=r^-9*fr;%el Do
c=r^0*fr*[1/4 1/2 1 2 4];
cs=r^1*fr*[1/4 1/2 1 2 4];
d=r^2*fr*[1/4 1/2 1 2 4];
ds=r^3*fr*[1/4 1/2 1 2 4];
e=r^4*fr*[1/4 1/2 1 2 4];
f=r^5*fr*[1/4 1/2 1 2 4];
fs=r^6*fr*[1/4 1/2 1 2 4];
g=r^7*fr*[1/4 1/2 1 2 4];
gs=r^8*fr*[1/4 1/2 1 2 4];
a=r^9*fr*[1/4 1/2 1 2 4];
as=r^10*fr*[1/4 1/2 1 2 4];
b=r^11*fr*[1/4 1/2 1 2 4];
s=0;
i=1;
ii=1;


2)LA PERCUSIÓN
Se hace de forma similar a la anterior pero solo se ingresa la duración. 1 2 5 8 16 . La señal que se crea es algo parecido ala interferencia , que suena como ch chc chhhhhchchchchch (asi).
Es absolutamente igal , lo que varía es como armamos la señal.
y1=[y1,o*sin(100000*2*pi.*x.*100000000000000.*sin(x)) zeros(size((0:(1/fm):t*6/10)))];

ese seno es la interferencia que suena cchhchchchchhchcchchc.

3)LOS INSTRUMENTOS
Ahora que se tienen las señales hay que hacerlas sonar.
Como ya creamos las señales de sonido, en el programa hay 3 de melodía más la percusión, lo que hay que hacer , es sumarlas
y=1/4*(y1+y2+y3+y4);

y reproducirlas, vamos, que suene...
sound(y,fm)


Como tenemos almacenada la señal en el vector y y tenemos su frecuencia de muestreo, con el comando
wavwrite(y,fm,8,Nom)
guardamos en un archivo formato wav la canción.
Al inicio de la sintaxis están los códigos de algunas canciones. Están los 3 instrumentos más la percusión.
Cualquier comentario duda o sugerencia, sólo hazlo :D