martes, enero 23, 2007

¿Cómo calcular la frecuencia de una nota musical y hacer música con Matlab / Gnu-Octave?

Bueno como más abajo dice como hacer un sonido, ahora podemos hacer música, pues la música no es más que un conjunto ordenado de sonidos. Veamos como ordenarlos...

Si disponemos de un lenguaje de programación, que pueda actuar sobre algún dispositivo de sonido, o de cualquier cosa que pueda vibrar o producir sonidos a una frecuencia audible, sólo falta saber a que nota musical corresponde cierta frecuencia en la variación de presión del aire.

Los sonidos que se usan son los que corresponden a las notas musicales. A cada nota musical le corresponde una frecuencia. (Ver Características del Sonido)

Introducción al Tema

(Si quieres ver la fórmula para el cálculo sáltate esta parte)


Muy grosso modo la música posee, entre otras características importantes:
  • Altura, las distintas notas que se representan en los espacios y líneas en el pentagrama

  • Duración que se representa con las figuras, redonda, blanca, negra, corchea , etc.

  • Timbre el tipo de sonido si es de un piano, un motor sonando o de una soprano cantando
Para hacer música, del tipo occidental, (Otras culturas ocupan distintas escalas) disponemos de un número discreto de sonidos limitados por el rango audible de un ser humano, por las frecuencias 20[Hz] como cota inferior y por arriba de 20.000[Hz], lo que varía según la persona. Pues para algunas personas da lo mismo escuchar Reguetón por los altavoces de un teléfono móvil o escuchar una grabación del deutsche grammophon en formato alta fidelidad, y para otras no da lo mismo, pero eso es para otro tema.

Los sonidos usados por los músicos, las notas musicales, do re mi fa sol la si y sus respectivos bemoles y sostenidos, tienen frecuencias conocidas que se pueden calcular, y se pueden hacer en algún lenguaje de programación -como C, C++, Java, Matlab, Pascal, Basic, etc - para que suenen. La historia de las distintas escalas utilizadas -tipos de frecuencias y sus cálculos para las notas- es un poco larga y tiene que ver con criterios matemáticos (Véase acá), es muy interesante.


Brevemente, la historia empieza con Pitágoras, que inventó la escala que lleva su nombre, pero la parte que ahora interesa ver habla sobre el periodo barroco y Johann Sebastian Bach. Cuando se usaba la escala Pitagórica y uno quería cambiar de tono las canciones (frecuentemente pasa cuando a un cantante no le alcanza el registro), se producía una no correspondencia, es decir, no sonaba correctamente ( sonaba mal o en palabras simples, sonaba feo).

Y ahí es donde aparece la escala cromática, que el famoso J.S. Bach popularizó con su obra "El clave bien temperado" o "Das wohltemperierte Klavier" , el nombre lo dice, el instrumento clave estaba bien temperado, es decir, afinado con la escala cromática. ¿Cómo se populariza un estilo de afinación? Componiendo un preludio y una fuga en todos los tonos posibles, es decir un preludio y fuga en Do mayor y menor, en Do sostenido mayor y menor en Re mayor ... y así. Hasta hace poco había leído que Bach había inventado esta afinación, lo que no es cierto, pero esto no quita mérito a semejante obra.

"El clave bien temperado" se puede ver y escuchar en esta página, ahí explican hasta las partes. Es bastante interesante verlo y sobretodo escucharlo.

¿Como se construye la escala cromática?
La respuesta es "La distancia entre semitonos debe ser la misma". Eso desde el punto de vista musical. Porque esas palabras traducidas a la práctica son así :

Para armar la escala temperada necesitamos una frecuencia de una nota conocida, llamada de referencia, en nuestro caso y por norma ISO-16 el LA de la octava central del piano tiene 440 [Hz]. (Para afinar los músicos usan los diapasones). En tiempos de Bach cada cual elegía su frecuencia de referencia, lo que no causaba problemas si se toca solo un instrumento.

¿Cual es la relación entre frecuencias-notas en la escala cromática?

Fórmula para calcular la frecuencia de una nota.

Dada una frecuencia conocida, la que llamaremos fRef, la nota distante a i semitonos sobre la frecuencia de referencia fRef tendrá la frecuencia:

Fórmula para determinar la frecuencia de una nota a partir de una frecuencia conocida

La norma ISO 16:1975 dice que la frecuencia de referencia para el La de la octava central del piano es:

Frecuencia de Referencia para el La de la octava central del piano

La norma agrega también que debe ser generado con una precisión de 0.5 [Hz].

Entonces, siguiendo la norma, la frecuencia del i-ésimo semitono a partir del La de la octava central del piano es:

Fórmula para de terminar la frecuencia de una nota a partir del La 440 [Hz]

Ejemplo

Calculemos la frecuencia del Do que sigue del La-440, el de la octava a la derecha de la octava central:
número de semitonos del Do al La
  • Veamos a que semitono corresponde. Para ello vemos en la figura y contamos:

    • 0 La

    • 1 La#

    • 2 Si

    • 3 Do

    El Do corresponde al semitono 3 a partir del La.

  • Reemplazamos en la fórmula
    La frecuencia del do es:

    • Frecuencia del Do

Hacemos música en Matlab

Como se tienen las notas, basta con darles duración para crear música, usando como guía la parte vista más abajo, Como hacer sonido, escribimos la siguiente sintaxis, creando primero con la forma vista arriba, las notas musicales, y luego creando sonidos.

%==Frecuencia de Muestreo==
fm=8120;

% ==Elaboracion de las notas musicales==
r=2^(1/12);

% ==frecuencia de referencia LA==
fr=440;

% Tomamos la frecuencia del do para definir las octavas de mejor manera
fr=r^-9*fr;
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];

%El Silencio, su frecuencia es cero
s=0;

%==Parte para Duracion==
% Definimos la duracion en segundos de la negra.
% tomada como 1 tiempo
n=.5;

%Hacemos un vector N = [ nota , duracion ]
NOTAS=[g(3),e(3),s,e(3),f(3),g(3),e(4),e(4),c(4)];
DURACION=[n/2,n/2,3*n/2,n/2,n/2,n/2,n,n,2*n];
N=[NOTAS',DURACION'];
y=[];

%==Armamos la señal==
for i=1:length(N)
fr=N(i,1);
t=N(i,2);
x=(0:(1/fm):t);
y=[y sin(fr*2*pi.*x)];
end

% Hacemos el sonido
% en este comando
% esta toda la magia

sound(y)


Puse en los vectores NOTAS y DURACION la canción de la película "The Bridge on the River Kwai" , la marcha del coronel Bogey.
El método para ingresar notas se puede mejorar y también se pueden añadir armónicos a la onda. Por ejemplo to hice un método para que introducir 3 instrumentos, percusión a través de notas parecidas al celular NOKIA
El programa está acá

Francisco Roco

5 comentarios:

Anónimo dijo...

Muy práctico. Me has salvado el cuello con la fórmula para un examen de acústica. Muchas gracias.

Anónimo dijo...

Muy bueno tu ejemplo, la verdad es que quisiera tener más canciones en formato celular donde las puedo buscar

Anónimo dijo...

La verdad que está muy bueno tu artículo, quisiera tener más canciones en formato celular, como por ejemplo la 9na sinfonía, donde puedo encontrar sus notas como las pusiste en el programa que hiciste para reproducir música

Benjamin Pinaya Gutierrez dijo...

Buenisimo! Como se aplicaria en C++? Muy bueno amigo! Felicidades!

Anónimo dijo...

imprecionante, yo solo e saciado mi curiosidad, ahora mi duda es si el modelo matematico lo puedo adaptar pasa obtener los microtonos derivados de sonido 13 de julian carrillo, e observado la formula y supongo que se puede faccionando la variable de los semitonos de distancia o la de los 12 sonidos tengo que analizarla mas, pero si nos muestras como seria mejor, gracias