1. INTRODUCCIÓN A LA
MÚSICA POR COMPUTADORA
La Música es un arte que ha evolucionado de manera sorprendente, al extremo de que ya se puede plantear la posibilidad de “enseñarles” a las computadoras a componer música, para lo cual, por medio de la Informática, que es la ciencia que se encarga de estudiar la información, se puede buscar la manera de modelar los fenómenos musicales en términos de información.
Ahora bien, para esto es muy importante tener una clara imagen de la información que se está manejando y como hablar de música es hablar de sonido, es bueno empezar a platicar del mundo sonoro: algunos ruidos y algunos procesos matemáticos con los que se pueden describir a estos ruidos.
Uno de los sentidos con los que estamos dotados,
es el oído. Gracias a él, podemos formar una imagen de lo que es el mundo
sonoro. El oído percibe lo que llamamos sonido, que es la energía de movimiento
vibratorio y estímulo adecuado para el oír. Los sonidos se clasifican en tonos
y ruidos. Los tonos son vibraciones periódicas regulares que al ser oídas
pueden descomponerse en sus armónicas. Los ruidos son vibraciones irregulares,
al azar, que al ser oídas no se pueden descomponer[1]. Cuando se habla de
música, no existe un límite en el que se pueda distinguir claramente la
diferencia entre un ruido y un tono, pues, en algunos casos, esta diferencia es
un tanto cuanto subjetiva y prueba de ello es que existen diferentes tipos de
música que para ciertas personas son, sin duda alguna tonos y para otras no son
más que ruidos, es el caso de la música oriental, que para ciertos occidentales
es sólo ruido, otro ejemplo, es el rock, que para muchas personas es sólo
gritos y tamborazos.
El sonido es de relevante importancia en las
relaciones humanas, ya que permite llevar cabo la conversación. Los sonidos que
producimos al hablar, se generan por medio de un sistema muy ingenioso. Las
cuerdas vocales se hacen vibrar, produciendo ciertos tonos que se pueden variar
al modificar la tensión de las cuerdas, dichos tonos se amplifican en la boca y
en las cavidades nasales, permitiendo que se escuchen, no tonos puros como los que genera un diapasón, pero lo
suficientemente claros como para permitir la conversación. De hecho, hay
personas que a través de la práctica han ido “educando la voz” y tienen tanto
control sobre los sonidos que producen, que realmente se les considera como
instrumentos musicales dentro de una orquesta[1].
Por otro lado,
cuando se habla de ruido, es importante comentar que existen diferentes tipos
de ruidos: Ruido 1/f, ruido de fotón o de radiación, ruido de temperatura,
ruido de amplificador, ruido térmico, ruido atmosférico, ruido cósmico, etc.
Modelar algunos de ellos resulta un excelente ejercicio como introducción a la
música por computadora.
Por lo que a
continuación y a partir de los conceptos de sistema
y correlación se verán algunos tipos
de ruidos y se mostrará como generarlos.
Un sistema, es un conjunto de elementos interrelacionados. Esto quiere decir, que prácticamente todo lo que conocemos es o pertenece a un sistema.
Es tal la
cantidad de sistemas que se pueden encontrar en el Universo, que nos hace
pensar que la Naturaleza tiene por gusto crear sistemas, un caso particular es
nuestro propio planeta Tierra, que forma parte de lo que denominamos sistema
solar, que está formado por una estrella llamada Sol y sus planetas. Este
sistema forma parte de un conjunto que contiene miles de millones de estrellas,
que muy probablemente tienen sistemas planetarios propios. Este conjunto,
llamado Vía Láctea, es una galaxia en espiral, de dimensiones fuera de los
limites de la comprensión humana, su diámetro es de aproximadamente 100,000
años luz. Ésta pertenece a un cúmulo de aproximadamente 20 galaxias y existe
una gran cantidad de estos sistemas formando parte de este Universo
esplendoroso.
Sin embargo, no sólo los cuerpos macroscópicos forman sistemas y subsistemas, pues de hecho, los grandes sistemas están compuestos por otros. Esto se ve en el caso de nuestra casa, la Tierra, en donde habitamos infinidad de seres animados e inanimados, todos formados por sistemas y subsistemas con propósitos específicos: por ejemplo el circulatorio, el respiratorio, el óseo, etc; tales sistemas y subsistemas contienen elementos que escalonadamente llegan a ser formados por células que son a su vez de gran variedad y funcionamiento: como las neuronas del cerebro humano, por medio de las cuales se transmite información, que a su vez están formadas por moléculas y átomos, al igual que los seres inanimados. Las moléculas están constituidas por átomos con neutrones, electrones, protones, y una amplia gama de subpartículas.
Como existe tal cantidad de sistemas y la realidad que viven esos sistemas va cambiando a través del tiempo, también la forma de visualizar la realidad, así como la manera de representar los distintos fenómenos que suceden día con día van evolucionando.
Por tal motivo si se quiere hacer que un sistema “artificial” se comporte como algún sistema real, decimos que estamos modelando y siempre que se hace un modelo es bueno saber de que tipo de sistema se trata, por tal motivo comenzaremos por describir algunos tipos de sistemas con la finalidad de introducirnos a la música informática.
Se denominan sistemas determinísticos a todos aquellos en donde se pueden encontrar ecuaciones que describen de manera general al sistema, con la característica de que siempre que las variables del sistema adquieran valores similares, se obtendrán resultados similares.
Por ejemplo: supóngase que se trata de saber la distancia que recorre un vehículo que viaja a velocidad constante de 3 m/seg en 2 segundos, hacer un modelo de este sistema es, prácticamente, directo.
d = (v)( t) (distancia igual a velocidad por tiempo)
si v=3 m/seg. y t=2 seg d = (3m/seg) (2 seg) = 6 m
supongamos que hubiera una pequeña variación en la velocidad y que en lugar de 3 m/seg. ahora recorra 4 m/seg. entonces
d = (4m/seg) (2 seg) = 8 m.
que es un resultado que cambia de manera directamente proporcional a la variación de velocidad.
Una característica de los sistemas determinísticos es que son bastante ordenados, lo que facilita su comprensión, el problema real es que no todos los sucesos de la naturaleza se pueden representar fácilmente en forma determinística. ¿Cómo modelar el crecimiento de un árbol, el comportamiento de las olas del mar, la formación de galaxias o el tránsito de una avenida? Por lo que como siguiente paso, veremos sistemas en los cuales los fenómenos analizados tienen un comportamiento probabilístico.
Cuando se habla
de sistemas probabilísticos, se está
hablando de sistemas que están formados por eventos que tienen mayor o menor
posibilidad de ocurrir. En general, siempre que se habla de probabilidades se
piensa en los ejemplos clásicos de los juegos de azar, pero las probabilidades
se pueden aplicar a diferentes áreas.
Por ejemplo, las personas que se dedican al estudio del clima, se encuentran, frecuentemente, en medio de procesos probabilísticos. Cuando se espera la formación de un huracán, es muy importante saber que probabilidad existe de que esto ocurra, ya que muchas veces las vidas de personas dependen de ello. Por otro lado, debido al carácter caótico del desplazamiento de los huracanes, se tiene que recurrir a los procesos probabilísticos para encontrar una posible ruta de desplazamiento del huracán. De esta forma, se intenta predecir si puede tocar tierra o no y si lo hace, que pueblos evacuar. De una buena información, obtenida a partir de un modelo probabilístico, se puede tomar una certera decisión de evacuar o no un pueblo, en caso de que el huracán se comporte según las predicciones permite que se salven las vidas de las personas, de lo contrario, se ponen en riesgo pueblos enteros o en el más benigno de los casos se evacuan pueblos que no lo necesitan, acción que cuesta mucho dinero.
Así como este ejemplo, podemos encontrar miles de aplicaciones de los procesos probabilísticos. En ciertos sistemas probabilísticos, los elementos se relacionan de tal forma, que la probabilidad de que el sistema se encuentre en cierto estado, depende de los estados o situaciones previas, el grado de relación o el grado de dependecia que guarden los estados entre sí, se mide basándose en la correlación.
Por definición, correlación es la analogía o relación recíproca entre dos o más casos. Desde luego podemos encontrar valores autocorrelacionados, en cuyo caso, significa que depende de sí mismo.

Por ejemplo, tomemos un tablero de ajedrez y un Rey, recuérdese que el Rey sólo
puede avanzar un cuadro en cualquier dirección, esto implica que su posición
depende, en gran medida, de su posición anterior, lo cual quiere decir que su
posición es altamente autocorrelacionada. Supongamos que el Rey se encuentra en
una esquina, en el siguiente movimiento se pueden escoger sólo 3 posibles casillas,
así es que podemos predecir que después de la siguiente tirada, el Rey estará
en cualquiera de estas 3 casillas.
Ahora utilicemos a la Reina en lugar del Rey y ubiquémosla en la misma esquina, la Reina se puede mover en cualquier dirección y el número de cuadros que quiera dentro del tablero. Predecir la posición de la Reina en el siguiente movimiento no es tan fácil, ya que pude escoger entre 7 cuadros en dirección vertical, 7 en dirección horizontal y otros 7 cuadros diagonalmente, por lo tanto la posición de la Reina es menos autocorrelacionada que la del Rey, pues aunque la posición de la Reina también depende de su posición anterior, esta dependencia o autocorrelación es mucho menor que en el caso del Rey.

De esta manera, los sistemas
que tienen mayor correlación, son más determinísticos o por decirlo de otra
forma, son más ordenados y aquellos en los que el grado de correlación es
menor, tienden más al desorden.
Como ejemplo de un proceso probabilístico altamente correlacionado tenemos lo que se conoce como ruido browniano.
1.2.1.3
Ruido Browniano o Pardo
El botánico escocés Robert Brown (1773-1858) descubrió lo que ahora conocemos como movimiento browniano de las partículas, que es el movimiento oscilatorio de éstas, en suspensión en un líquido. Dicho movimiento, prueba la existencia de actividad al nivel molecular. El movimiento browniano, tiene la característica de ser altamente correlacionado.
El llamado ruido browniano, al igual que el movimiento con mismo nombre, presenta un comportamiento similar, también es altamente correlacionado. Hacer un modelo de este tipo de ruido es muy sencillo y se puede utilizar, por ejemplo, para generar música browniana o parda.
Una composición parda se puede generar de diferentes maneras, una sugerida por R. F. Voss [2] es la siguiente: Se escoge la primer nota al azar, supongamos la nota La (6, sobre el eje de las ordenadas en la gráfica de la fig. 1); a partir de esta nota se suman o se restan aleatoriamente 0, 1 ó 2 números: ejemplo (6 + 2) y se obtiene Do, ya se tiene la segunda nota de la melodía, la nota Do; se repite el procedimiento de la suma o resta de un número aleatorio entre 0, 1 y 2. A partir de Do se encuentra la tercer nota: ejemplo, (8 + 1) = 9 = Re y así sucesivamente, ejemplo, (9 - 2) = 7 = Si, es la cuarta nota, hasta obtener una melodía de la duración que se quiera.
|
|
La figura 1, muestra una gráfica donde se ve el inicio de una melodía
parda, el valor de las ordenadas se obtiene al sumar o restar de manera
aleatoria 0,1,ó 2 unidades (notas). El tiempo en este ejemplo se puede
considerar constante.
|
|
Escuchar la música compuesta de esta forma es bastante agradable, en algunos fragmentos es muy parecida a la la música del vuelo del abejorro de Nikolai Rimsky Korsakov (1844-1908). Enseguida se presenta el pseudocódigo que desarrollamos basándonos en la teoría sugerida por R.F. Voss para generar música parda.
La figura 2, muestra la gráfica tomada de la
pantalla de la computadora que se genera al ejecutar este algoritmo: En donde
la longitud y ángulo de las líneas se
determina dependiendo de la nota.
|
|
Otra manera de producir música parda o browniana, es mediante el siguiente algoritmo:
Tomemos siete dados de juego y lancémoslos. Súmense los valores de cada una de las caras superiores de los dados. Como se ve a continuación.
|
|
El valor que resulte de dicha suma representa el número de la primer Nota de la melodía. Para saber que Nota es, basta con echar un vistazo al siguiente teclado.
|
|
Para obtener la segunda Nota, hay que escoger uno de los dados al azar y lanzarlo, el valor de la cara superior que resulte, deberá de sumarse junto con los valores que tienen los dados restantes de la tirada anterior y el resultado representa la segunda Nota de la melodía. Supóngase que es el dado que está en la cuarta posición de izquierda a derecha el que escogemos.
|
Nota
= 5 + 6 + 1 + 4 + 2 +1 + 3 = 22 |
||||||||||||||||
De los dados anteriores, sabemos ahora que la segunda Nota es la número 22(La). La siguiente Nota se determina de igual manera; se toma uno de los siete dados al azar, se lanza y nuevamente se suman los valores de las caras superiores de todos los dados, habiendo cambiado tan sólo el valor de uno de ellos. Supóngase que en esta ocasión es el dado de la posición seis de izquierda a derecha el que se escoge.
|
Nota
= 5 + 6 + 1 + 4 + 2 +5 + 3 = 26 |
A continuación se presenta el pseudocódigo de este algoritmo para generar ruido browniano, con la peculiar característica de que, además de los valores que comúnmente se encuentran en cada una de las diferentes caras de los dados (1, 2, 3, 4, 5, 6), también se puede obtener el valor de cero, es decir, como si se utilizaran dados de siete caras (0, 1, 2, 3, 4, 5, 6).
|
1 2 .... ... 60 notas
{do, re, mi, fa, sol, la, si, do, re, mi,....,la,si} main() {
While( no ESC) { r=random(7); dado[r]=random(7);
Nota=dado[0]+dado[1]+dado[2]+dado[3]+dado[4]+dado[5]+dado[6]; sound( notas[Nota] ) ; delay(200); //en milisegundos } nosound(); } |
La figura 3, es la gráfica tomada de la pantalla de la computadora, que se genera al ejecutar este algoritmo.
|
|
Un hecho que permitió darnos cuenta que los modelos que estabamos diseñando iban por buen camino, fue el descubrimiento de una fotografía del movimiento browniano
de una partícula de humo, que se encontró en un libro muy interesante llamado Materia Tierra y Cielo del renombrado científico, George Gamow(1904-1968)[3].
|
|
La figura 4 es una copia de dicha fotografía. El objetivo es que la compare con las gráficas obtenidas en la ejecución de los algoritmos para generar ruido browniano.
El ruido browniano es un ejemplo de sistemas donde a partir de eventos erráticos se obtienen resultados ordenados con un alto grado de correlación, cuando la correlación es muy baja o no existe, se pueden obtener sistemas desordenados.
Cuando la correlación del sistema es muy baja o no
existe, los sistemas tienden al desorden y en general no se pueden encontrar
modelos para describirlos debido a que parecen no respetar ningún tipo de
orden; son sistemas que por el número de variables en juego se complican tanto,
que es verdaderamente imposible representarlos mediante modelos matemáticos.
Tal es el caso del movimiento de las partículas de un fluido al aumentar la
temperatura de éste. Al ir aumentando la temperatura llega un momento en que el
movimiento de las partículas es tal, que resulta imposible predecir su
posición.
Un ejemplo de procesos con un grado de correlación muy bajo es aquel que se obtiene al generar el que se denomina ruido blanco.
El ruido blanco, es una sucesión de sonidos que no guardan ninguna correlación entre sí, cuando menos en teoría. Lo que esto significa es que todos los sonidos son completamente aleatorios, cada frecuencia de los sonidos emitidos es tomada al azar y además todas las frecuencias tienen la misma probabilidad de ser escogidas.
El ruido blanco se presenta frecuentemente en la radio y en la televisión, y se le denomina interferencia, de hecho se presenta prácticamente en todos los dispositivos de comunicación, por lo que existen múltiples investigaciones para tratar de evitar que este tipo de ruido ocasione problemas en las comunicaciones, como los filtros que se utilizan en la comunicación mediante modems.
Si se quiere hacer un modelo que produzca ruido blanco, las variables que se utilicen para generarlo tienen que ser completamente independientes, es decir, que ninguno de los valores de las variables debe de guardar relación con los otros, sus valores tienen que ser completamente aleatorios, entonces, podemos decir que se habrá generado un ruido blanco, que desafortunadamente no es puro, ya que este sólo se puede crear de un modo teórico, en la realidad no existe el ruido blanco puro.
En la figura 5, se muestra un ejemplo de ruido blanco en dos dimensiones: Se utilizan dos variables notas y tiempo, en donde notas representa las ordenadas y tiempo las abscisas. Se obtuvo escogiendo al azar entre las notas presentadas, el tiempo se ha considerado constante.
|
|
Generar música blanca (ruido blanco) es muy sencillo, basta con tocar notas al azar[2].
|
|
Enseguida se
establece el pseudocódigo para generar ruido blanco.
El producto de una composición blanca es una secuencia acústica que no es muy agradable al oído humano, ya que carece de ritmo, color, melodía, etc, pues ninguna nota tiene relación con las otras y si los tiempos de duración de las notas también son totalmente aleatorios, es ruido que desagrada bastante.
Ya que se mencionó aquello de color, sería conveniente aclarar el porqué del nombre de ruido blanco. Todo lo que percibimos de este mundo, es debido a que está formado por ondas con diferentes frecuencias; dependiendo del rango de frecuencias, es el sentido que utilizamos para percibirlo, el oído es capaz de escuchar las frecuencias entre 20 y 20000 Hz [5] y el ojo humano percibe frecuencias entre 7.5 * 1014 Hz (violeta) y 4.2 * 1014 Hz (rojo) [10].
El mal llamado color negro, que realmente representa la ausencia de colores no origina ninguna frecuencia, el negro, no lo podemos ver. Vemos la diferencia de colores, debido a que cada uno de ellos se origina, transmite, refleja o refracta, con una frecuencia determinada, o en un momento dado, una mezcla de frecuencias.
A dicha mezcla de frecuencias o para
llamarla propiamente, distribución de frecuencias, se le denomina dimensión espectral, y se representa
mediante una función que muestra como la potencia total de la señal se
distribuye entre las distintas frecuencias[6]. El color blanco, está formado
por la suma de todos los colores, es decir por todas las frecuencias que
podemos ver, esto significa que todas las frecuencias están presentes en el color
blanco. Lo mismo ocurre en el caso del sonido, se denomina blanco porque está
formado por todas las frecuencias sonoras y se le representa con una dimensión
espectral = 1/f0 = 1, mientras que la dimensión espectral del
ruido pardo o browniano es igual a 1/f2.
Los modelos del ruido blanco, así como el del
browniano, son ejemplos que se encuentran en los extremos, en cuanto a
correlación se trata, si los comparamos, podemos darnos cuenta de que son
opuestos, el ruido blanco representa la ausencia de correlación y se
caracteriza por ser desordenado y el ruido pardo es altamente correlacionado.
Sin embargo, desde hace varios años, se han encontrado que existe otro tipo de
sistemas que juegan de forma maravillosa con el orden, pues no son tan
ordenados como el movimiento browniano, pero tampoco se puede decir que son
desordenados. Para diferenciarlos de los unos y los otros, se les ha llamado sistemas caóticos y se ha descubierto
que una gran cantidad de sistemas de la Naturaleza presentan un comportamiento
caótico.
La manera que la física y la matemática nos han venido explicando los fenómenos naturales, es tratando de buscar su orden, su patrón de conducta y en general, se les ha tratado de dar explicaciones deterministas, tratándose de describir mediante ecuaciones, que aunque algunas veces son complicadas, están perfectamente definidas, cada vez que se encontraban eventos impredecibles, se les hacía a un lado y se marcaban como la excepción a la regla.
Hoy día, se descubre que son los eventos poco determinísticos, los que rigen el comportamiento de la Naturaleza y ahora que han dejado de ser la excepción para convertirse en la regla, se les ha llamado “caóticos”.
Se denomina caos al área encargada de estudiar a los sistemas que no respetan las reglas determinísticas, pero que tampoco se vuelven desordenados.
Los sistemas caóticos respetan un orden que a diferencia de los sistemas determinísticos no es tan evidente, un ejemplo de ello es el mezclado de pinturas; cuando se mezclan dos pinturas de diferente color, da por resultado un tercer color, este color no se podrá volver a obtener mezclando nuevamente las dos pinturas iniciales, a menos que la forma de revolverlas: el agitado, la temperatura, el tiempo, y muchas otras variables fueran exactamente iguales a las de la primera vez; como es prácticamente imposible tener las mismas condiciones, los resultados no se pueden predecir, convirtiéndose éste en un sistema caótico y, realmente, es de admirarse el trabajo de los pintores cuando igualan colores, ya que les quedan bastante parecidos.
En los sistemas caóticos basta una pequeña variación en las condiciones iniciales para obtener resultados completamente distintos, por ejemplo, dos árboles creciendo en la misma tierra, teniendo la misma cantidad de agua y teniendo en general los mismos cuidados, pueden ser completamente diferentes si uno de ellos recibe un poco más de sol al día. Esa pequeña diferencia basta para que mientras uno esté dando frutos, el otro apenas tenga la mitad de su tamaño, sin hablar de cuestiones subjetivas como la alegría que emana de uno comparada con la tristeza del otro.
Para modelar sistemas caóticos, regularmente se utilizan ecuaciones en las que intervienen factores de probabilidad, convirtiendo a los procesos del sistema en procesos probabilísticos, interactuando dichos procesos dan por resultado que el comportamiento del modelo sea como el del sistema real, impredecible.
Por esta razón se piensa que modelar utilizando caos permite crear sistemas con la característica de comportarse como los sistemas Naturales.
La revolución conceptual que ha provocado el descubrimiento de los sistemas caóticos, empezó a finales del siglo pasado, con científicos como Hadamard Poincaré(1854-1912), pero no es hasta la llegada de las computadoras, cuando personas como Edward Lorenz pudieron plasmar sus ideas y llegar a conclusiones que desencadenaron una gran cantidad de investigaciones en múltiples áreas como la física, matemáticas, química, biología, economía, etc. dando por resultado la aparición de más caos en donde se creía que no existía[7][9].
Por otro lado, Benoit Mandelbrot se enfocó al desarrollo de una teoría geométrica a la que denominó fractales, aplicando sus descubrimientos a la generación de hermosos paisajes y vaya que fueron sorprendentes, pues realmente reflejaban el caos inherente a los sistemas diseñados[8].
Entiéndese por fractales, los objetos que gozan de una propiedad llamada autosimilaridad, además de tener dimensiones que no responden exclusivamente al universo de los números naturales, sino que pueden ser dimensiones fraccionarias, de ahí su nombre fractal (fracción).
El que los fractales sean autosimilares indica que las partes que forman el fractal son similares al fractal en su conjunto; por ejemplo, si se parte una piedra dura y rasposa, sus fragmentos conservan las mismas propiedades, son rasposos y duros; lo mismo ocurre si volvemos a partir los trozos de piedra, las propiedades de piedra las van a conservar, incluso, si los fragmentos llegan a ser microscópicos, seguirán siendo piedras. Lo mismo ocurre en el sentido contrario, si juntamos dos piedras, vamos a tener una piedra más grande, si continuamos juntando piedras, obtendremos, un peñasco, un pequeño cerro, una montaña, luego una cordillera; de cualquier forma, el fractal piedra va a conservar propiedades similares independientemente de su tamaño.
Así como este ejemplo, podemos pensar en sistemas solares formando galaxias, pequeñas gotas de agua creando nubes, singulares casas construyendo ciudades o miles de otros ejemplos que podemos encontrar en la Naturaleza, ya que prácticamente todo tiene propiedades fractales.
Hablar de la dimensión fractal es hablar de cambiar, incluso, la manera en como conceptualizamos la realidad. La matemática clásica nos ha enseñado, durante mucho tiempo, que el mundo en el que vivimos posee ciertas dimensiones y hay objetos que pertenecen al mundo de una sola dimensión como es el caso de las líneas; también existen otros que viven en un mundo de dos dimensiones, tal es el caso de los cuadrados, los triángulos, rectángulos y muchas otras figuras bidimensionales. En el mundo de tres dimensiones, se encuentran objetos como esferas, cubos, poliedros, árboles, perros, leones y una lista que difícilmente acabaríamos de escribir. Hay demostraciones matemáticas que establecen la existencia de universos de n dimensiones, en donde pueden existir objetos de cuarta, quinta y un número infinito de dimensiones, e incluso puntos sin dimensión.
Sin embargo, a todos estos objetos se les ha considerado sólo de dimensiones enteras. No es hasta la aparición de los fractales que se muestra en forma normal o cotidiana objetos que poseen dimensiones fraccionarias. Los fractales poseen dimensiones fraccionarias y entonces se puede hablar de figuras con dimensiones de 1.75 o 2.34; un clásico ejemplo es la famosa figura fractal denominada copo de nieve.
|
|
Aunque es cierto que estamos acostumbrados a vivir entre los fractales y realmente los percibimos de forma natural cuando vemos los árboles, las nubes o las olas del mar, no estamos acostumbrados a modelar la realidad en términos de fractales, ya que entender la propiedad fractal del Universo implica cambiar nuestra forma de pensar y la manera en la que describimos al mundo que nos rodea.
Por ejemplo, al observar los ruidos blanco y browniano desde el punto de vista fractal, nos damos cuenta que tienen un comportamiento fractal ya que si tomamos un fragmento de ruido blanco o browniano, seguiremos teniendo ruido blanco y browniano respectivamente, como se ve en las figuras 1, 2, 3, 4 y 5.
Existe otro tipo de ruido muy común en la Naturaleza que se conoce como ruido 1/f, que también tiene la característica de presentar un comportamiento fractal.
El ruido 1/f es una clase muy especial de ruido, para el cual no se tiene una definición concreta. Aunque no se sabe con precisión que lo produce o que representa, si es bien sabido que se encuentra en una gran cantidad de eventos del Universo.
Se caracteriza porque su densidad espectral o manera en la que se distribuyen sus frecuencias es igual a 1/f [6]. Haciendo una comparación de densidades espectrales, el ruido blanco tiene densidad espectral igual a 1/f0 y la del ruido pardo es igual a 1/f2, con estos valores, podemos pensar que el valor de la densidad espectral del ruido 1/f queda “en medio” de los valores del ruido blanco y pardo, esto también se puede interpretar como que el grado de correlación del ruido 1/f no es ni muy bajo ni muy alto, sino término medio, es decir, no es totalmente aleatorio, pero tampoco es altamente correlacionado.
Densidad Espectral
1/f0 1/f 1/f2
Blanco Pardo
Casualmente, de acuerdo a estudios realizados por Richard F. Voss[2], algunos tipos de música, como la clásica, el jazz y el rock presentan una densidad espectral alrededor de 1/f y un hecho, relativamente curioso, es que al observar el flujo del tránsito, el crecimiento de las ciudades, el crecimiento de los árboles, la aparición de las manchas solares, el crecimiento de las montañas, el movimiento de las olas del mar, la formación de galaxias, de nubes y prácticamente todo a nuestro alrededor, presenta un comportamiento con densidad espectral alrededor de 1/f. Parece entonces, que en vez de ser un suceso intrascendente, el ruido 1/f es más bien una propiedad del Universo, una propiedad de los fractales, pero además nos explica la belleza de los fractales, esa armonía con la que han sido creados los habitantes de este Universo. Se puede decir que todo lo que sucede no es ni muy correlacionado, ni completamente aleatorio sino 1/f.
Es, sin duda alguna, el ruido 1/f un tema muy interesante. Se cree, que siendo una característica del Universo, quizá es a esta propiedad a la que imita la música, ya que hay que recordar que las bellas artes, en general imitan, ya sea al colorido mundo de la naturaleza como en el caso de la pintura o al quehacer humano como lo hace el teatro, porqué no pensar que la música imita la propiedad 1/f de la Naturaleza.
En caso de que esto no sea cierto, entonces la música sería, simplemente, un fenómeno más que presenta la propiedad 1/f. De cualquier forma, al generar ruido con una densidad espectral 1/f, es posible que sea agradable al oído humano, que sea música.
Existe una manera muy sencilla, para generar música 1/f, sugerida por el científico Richard F. Voss[2], que consiste básicamente en lo siguiente:
Supóngase que se tienen 60 notas, numeradas en forma ascendente en un teclado, como en el que a continuación se presenta.
|
|
Se toma un número binario de 10 dígitos y se iguala a cero, a cada dígito se le asigna un dado. Se avientan los 10 dados, se suman y el resultado nos indica el número de la nota con la que empieza la melodía. Se incrementa el valor del número binario en la unidad. Será lanzado el dado de cada dígito que haya experimentado algún cambio de valor. Para obtener la siguiente nota de la melodía, basta sumar el valor de los dados, aquellos que fueron lanzados probablemente cambiaron su valor, los que no, sumarán el valor que tenían a partir de la tirada anterior. Como se puede ver en el siguiente ejemplo:
|
|
Se tienen 10 dados de juego, un contador con incremento igual a 1, dicho contador será un número binario de 10 dígitos y deberá de ser inicializado a cero. Supóngase que los dados han sido lanzados, que cayeron y quedaron en la posición que se muestra a continuación, una variable, a la cual denominaremos Nota, irá tomando los valores de la suma de los puntos que muestran las caras superiores de cada dado.
Haciendo coincidir cada dado con cada una de las posiciones de los dígitos del contador. En este caso, se obtiene el valor de Nota = 39, que corresponde al #Re (re sostenido) que se toma como la primer nota de la melodía.
El siguiente paso, es obtener la siguiente Nota de la melodía, primeramente se incrementa el contador, pasando de 0 a 1, con lo que el 0 del bit menos significativo, cambia de estado a 1, siendo, en este paso, el único componente del contador que cambia de estado, es decir, el único de los 10 dígitos del contador, que manifestó un cambio, entonces el dado correspondiente al bit menos significativo, se lanza, mientras los dados restantes permanecen en reposo; se calcula el valor de nota, sumando el número de puntos que indique la cara superior de cada uno de los dados. Si por ejemplo, el número de puntos de la cara superior del dado lanzado fue igual a 6, entonces nota = 41 (Fa), siendo ésta la siguiente nota de la melodía.
|
|
El siguiente incremento del contador, hará que sus dígitos pasen de 0000000001 a 0000000010. Los dos bits menos significativos cambian de estado, el bit menos significativo pasa de 1 a 0 y el segundo bit menos significativo de 0 pasa a 1, luego los dados correspondientes a estos bits se toman y se lanzan, mientras los dados restantes permanecen sin cambio, supongamos que los puntos que muestran los dados ahora son 3 y 1, se repite el procedimiento para calcular el valor de nota que ahora es igual a 34, que será la tercer nota de la melodía.
|
|
Para obtener la siguiente nota hay que seguir el mismo procedimiento:
- Se incrementa en uno el contador, para que pase de 2 a 3, es decir, de 0000000010 a 0000000011 ( en este caso, el valor del primer bit pasa de 0 a 1 siendo el único dado que se lanzará ).
- Se lanzan todos los dados cuyo dígito haya experimentado un cambio de estado.
- Se suman los valores de los 10 dados, y se obtiene la nueva Nota.
Y el proceso se repite indefinidamente. La figura 7 muestra algunas notas generadas de esta manera.
|
|
Y enseguida se lista el pseudocódigo para generar música 1/f que desarrollamos basándonos en el algorítmo de Voss.
|
1 2 ....
... 60 notas {do, re, mi, fa, sol, la, si,
do, re, mi,....,la,si} avienta_dado [10] numero_binario = 0000000000 numero_binario2 = 1111111111 main() {
While( No Esc )
{
for( nn=0; nn<=9; nn++ ) { if( bit nn de numero_binario != bit nn de
numero_binario2 ); Nota +=
avienta_dado[nn];
}
sound( notas[Nota]);
delay(200); //en milisegundos
numero_binario2 = numero_binario;
numero_binario ++;
}
nosound(); } |
2.0 SISTEMA EVOLUTIVO GENERADOR DE MÚSICA
2.1 Introducción a los Sistemas Evolutivos
En las páginas anteriores, se ha descrito como generar música parda, blanca y 1/f. La música obtenida a partir de estos ruidos, es ya agradable, sobre todo la música 1/f, sin embargo, no basta con utilizar estas técnicas para desarrollar un verdadero sistema compositor. Supongamos que se desarrollan diferentes algoritmos que hagan composición musical, es posible, que en un momento dado, se encuentre alguno que genere música agradable, sin duda alguna, dicho algoritmo presentaría una densidad espectral alrededor de 1/f. Pero, un primer problema es que existen una cantidad enorme de algoritmos para generar música, de esta manera, encontrar uno que genere música “humana”, puede tomar algo de tiempo. Por otro lado, se van a tener que encontrar tantos algoritmos como diferentes géneros de música existen y ¿qué tal si quisiéramos que el sistema compusiera música parecida a las composiciones hechas por algún autor en especial?, esto, implica que cada autor debe de tener su propio algoritmo, lo cual, vuelve a ésta, una tarea titánica.
¿Porqué no permitir
que sea el mismo sistema el que encuentre
las reglas de composición, el algoritmo a seguir?
Con
lo cual ha llegado el momento, para hablar de un poco de magia, para hablar de
los Sistemas Evolutivos.
Resulta
que uno de los problemas que comúnmente se encuentran en el desarrollo de
sistemas, es encontrar las reglas de operación, muchas veces, esta búsqueda no
es tan trivial, por ejemplo ¿cómo encontrar las reglas de composición del
maestro Nicolo Paganini? Los sistemas evolutivos están diseñados para encontrar
las reglas del medio que los rodea y aplicarlas para resolver los problemas. Un sistema evolutivo tiene la capacidad de
aprender cotidianamente; a un sistema tal se le pueden dar ejemplos de música
de Paganini y encontrará las reglas con las cuales compuso dicho autor, una vez
que se hayan encontrado, el sistema podrá componer música basándose en ellas,
como el mismo Paganini lo haría.
La característica principal de un sistema evolutivo está en que es un sistema capaz de aprender permanentemente de su medio ambiente, por ejemplo, los seres humanos somos sistemas evolutivos de lo más sofisticados que hay, un niño desde que nace empieza a conocer y a aprender del medio que lo rodea. Uno de los primeros elementos que aprende, es a reconocer quien es su madre y dado que la madre se viste cada día diferente, usa peinados distintos, se pinta de diferente manera y toda una serie de factores que cambian día con día, el niño va evolucionando; encuentra un valor medio de quien es su madre y aprende a reconocerla, se vista como se vista o se peine como se peine. Lo mismo ocurre cuando aprende a hablar, primero reconoce los diferentes tonos de voz y pese a que no sabe “Lenguaje Natural” reconoce perfectamente cuando su madre habla con tono de enojo y cuando está contenta; ya cuando domina ciertas palabras entonces todo lo que no conoce: lo inquiere, pregunta qué significa, permitiendo que la base de conocimientos aumente y entonces se encuentra en el camino en el que todos estamos, aprender a hablar, unos saben más y unos menos pero el proceso de aprendizaje es el mismo y permanente.
Esa es la forma en la que los sistemas evolutivos trabajan, aprenden continuamente las reglas del medio que los rodea y las aplican para resolver problemas.
Para ver como se aplican los sistemas evolutivos en el desarrollo de un sistema compositor, primero presentaremos el algoritmo base que usaremos para generar música y luego veremos la componente evolutiva.
Primero: Utilizaremos
sólo siete notas ordenadas, Do, Re, Mi, Fa, Sol, La, Si; no implica esto que se
limite a siete notas, ya que pueden ser n
escalas y sólo es con el fin de hacer más sencilla la explicación.
Segundo: Con estas
siete notas, construiremos una matriz cuadrada, de columnas Do, Re, Mi, Fa,
Sol, La, Si e igualmente renglones Do, Re, Mi, Fa, Sol, La, Si.
Tercero: Llenamos
algunas casillas de la matriz con números generados en forma aleatoria, por lo
que la llamamos matriz evolutiva
aleatoria. Por ejemplo, los números diferentes de cero que tiene la
siguiente matriz, han sido escogidos aleatoriamente.
Matriz Evolutiva Aleatoria
|
|
Do |
Re |
Mi |
Fa |
Sol |
La |
Si |
|
Do |
0 |
0 |
90 |
0 |
30 |
40 |
0 |
|
Re |
10 |
0 |
15 |
45 |
20 |
70 |
80 |
|
Mi |
5 |
25 |
0 |
60 |
0 |
30 |
90 |
|
Fa |
0 |
80 |
10 |
40 |
15 |
95 |
30 |
|
Sol |
25 |
15 |
0 |
40 |
65 |
70 |
0 |
|
La |
0 |
35 |
5 |
10 |
0 |
0 |
0 |
|
Si |
20 |
30 |
0 |
0 |
60 |
0 |
70 |
Nota: Si en cada renglón de la matriz se divide el
valor de cada casilla entre el Total del renglón, entonces lo que obtenemos es
una matriz de probabilidades y lo que representa es la probabilidad de pasar de
una nota a otra.
Por ejemplo, si
tomamos el renglón del Do
|
|
Do |
Re |
Mi |
Fa |
Sol |
La |
Si |
|
Do |
0 |
0 |
90 |
0 |
30 |
40 |
0 |
El total vale 90+30+40 = 160. Si dividimos el renglón entre 160, queda:
|
|
Do |
Re |
Mi |
Fa |
Sol |
La |
Si |
|
Do |
0 |
0 |
9/16 |
0 |
3/16 |
4/16 |
0 |
La probabilidad de pasar de Do a Fa es
cero y de Do a Mi es 9/16. O sea que, este algoritmo se basa en una matriz de
probabilidad, aunque para propósitos prácticos, seguiremos trabajando con los
valores enteros.
Cuarto: Agregamos
una columna llamada Total, que originalmente está llena de ceros, a la derecha
en la matriz evolutiva aleatoria.
Quinto: En cada
renglón vamos a hacer un recorrido de izquierda a derecha ignorando las
casillas con valor cero.
El primer número (más a
la izquierda) diferente de cero, se suma a Total y el resultado sustituye al
primer número.
El segundo número
diferente de cero se suma a Total y el resultado se sustituye en el segundo
número.
Así sucesivamente con
todos los valores diferentes de cero, el i-ésimo número diferente de cero se
suma al Total y el resultado sustituye al i-ésimo número. Agotados estos, la
suma debe quedar almacenada en la columna Total del renglón. Por ejemplo, el
renglón original es
|
|
Do |
Re |
Mi |
Fa |
Sol |
La |
Si |
Total |
|
Do |
0 |
0 |
90 |
0 |
30 |
40 |
0 |
0 |
Y al aplicar el
algoritmo queda:
|
|
|
|
|
|
90 +30 |
120+40 |
|
90+30+40 |
|
|
|
Do |
Re |
Mi |
Fa |
Sol |
La |
Si |
Total |
|
|
Do |
0 |
0 |
90 |
0 |
120 |
160 |
0 |
160 |
|
En esta forma se obtiene
la que llamaremos matriz evolutiva de
frecuencias acumuladas
|
|
Do |
Re |
Mi |
Fa |
Sol |
La |
Si |
Total |
|
Do |
0 |
0 |
90 |
0 |
120 |
160 |
0 |
160 |
|
Re |
10 |
0 |
25 |
70 |
90 |
160 |
240 |
240 |
|
Mi |
5 |
30 |
0 |
90 |
0 |
120 |
210 |
210 |
|
Fa |
0 |
80 |
90 |
130 |
145 |
240 |
270 |
270 |
|
Sol |
25 |
40 |
0 |
80 |
145 |
215 |
0 |
215 |
|
La |
0 |
35 |
40 |
50 |
0 |
0 |
0 |
50 |
|
Si |
20 |
50 |
0 |
0 |
110 |
0 |
180 |
180 |
Sexto: Empecemos a componer la primer melodía; tómese al azar una nota, Fa por ejemplo, será la primer nota de la melodía; se toma el valor de la columna Total del renglón Fa, en este caso 270 (véase la matriz de frecuencias acumuladas) y se genera un número aleatorio entre cero y este número. El número aleatorio así obtenido, se compara en orden de izquierda a derecha, con los valores del renglón Fa; al llegar a un valor que sea mayor o igual al número aleatorio, se toma la nota de la columna como la nota segunda de la melodía. Por ejemplo, si se obtiene el número 157, como este es mayor que 145 (nota Sol) y menor que 240 (nota La), se toma la nota La como la segunda nota de la melodía, llevando Fa, La,...
Séptimo: Repetimos el procedimiento anterior: sólo que ahora, se toma el renglón de la nota anterior La, que tiene Total = 50, por lo tanto, se genera un número aleatorio entre 0 y 50; por ejemplo el 18, 35 es mayor que 18, luego Re es la tercer nota de la melodía y así va Fa, La, Re,…. Para obtener la 5ª, 6ª y n-ésima nota, basta repetir el mismo procedimiento:
- Se genera un número aleatorio entre cero y el valor de la columna Total del renglón de la última nota obtenida.
- Se compara el número así obtenido con los valores de ese renglón, hasta que alguno sea mayor o igual. La columna en la que se encuentre este valor, representa la siguiente nota de la melodía.
En este ejemplo, se han utilizado matrices de sólo 7 notas, basta ampliarlas hasta el número de notas sobre las que se desee componer y efectuar el mismo procedimiento. Ésta, es una forma muy interesante de generar música, además de muy sencilla. Como se puede ver, el sistema compone basándose en ciertos valores que en el ejemplo, se generaron aleatoriamente, pero si queremos que refleje el estilo de algún compositor, el problema es encontrar los valores apropiados de la matriz evolutiva aleatoria, de manera tal que las melodías suenen agradables.
Encontrar dichos valores podría ser una tarea no muy sencilla, por lo tanto es conveniente que sea el mismo sistema el que averigüe las probabilidades apropiadas, aquí es donde interviene la magia de los Sistemas Evolutivos. Por esta razón, a la matriz que se obtuvo mediante el proceso anteriormente descrito se le denomina Matriz Evolutiva y representa el corazón del Sistema Evolutivo.
2.3 Funcionamiento del Corazón del
Sistema Evolutivo
Hasta el momento, sólo hemos descrito como interpretar una melodía, compuesta con una matriz que fue llenada con números aleatorios y el resultado es una composición de ruido.
Supongamos que quisiéramos
que el sistema componga música de un cierto tipo, más aún, que componga como
algún autor en específico, digamos el maestro Niccoló Paganini (1782-1840).
Para lograr componer música como Niccoló Paganini, un ser humano tiene que dedicar “largas horas” estudiando la música de este autor, interpretando una y otra vez cada melodía. El momento llegará, en que el músico “sienta” la música y sea capaz de componer con influencia de Paganini. De igual manera podemos enseñar al sistema a componer. Démosle ejemplos de música de Niccoló Paganini, que analice las melodías y que encuentre las reglas con las que compuso, es decir que conozca su música para que después sea capaz de componer como el mismo Paganini lo haría.
Cada compositor, tiene un estilo muy personal de componer, esto lo refleja en la forma que acomoda las notas de las melodías, esto quiere decir, que a gusto propio uno encuentra agradable o no cierta sucesión de notas y mientras que a alguien le puede gustar escuchar Do, Mi, Sol, La, a alguien más le puede gustar Do, Sol, Mi, La. Esta característica, nos permite escuchar la diferencia de estilos y nos permite reconocer a tal o cual autor.
Si analizamos nota por nota las diferentes composiciones de cada autor, encontraremos que ciertas notas son tocadas de manera más o menos regular, por mejor decir, la probabilidad de que Mi aparezca después de Do varía entre un autor y otro, de esta manera, podemos hacer la lectura de diferentes melodías de algún autor y podemos contar cuantas veces utiliza Mi después de Do, Fa después de Re, Si después de Do y en fin, analizar todas las notas de manera que tengamos una lista en la que se encuentren todas las notas que han sido utilizadas, además de saber que notas aparecen, con mayor regularidad, después de otras.
Para que el sistema pueda componer una melodía basándose en las reglas de Niccoló Paganini, significa que hay que encontrar los valores de la matriz evolutiva aleatoria adecuados, de manera que las composiciones hechas por el sistema reflejen características propias de dicho autor, en otras palabras, que se genere música similar a la que el mismo Paganini componía.
|
|
Por lo que a continuación le daremos al sistema el primer ejemplo de la música que quisiéramos que componga y que empiece a contar, sea en esta ocasión un breve ejercicio del maestro Niccoló Paganini.
Basándonos en el siguiente teclado,