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.

1.1 Sonido

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.

1.2 Sistemas y Ruidos

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.

1.2.1 Sistemas Determinísticos y Ruido Browniano

1.2.1.1 Sistemas Determinísticos o Tradicionales

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.

1.2.1 2 Sistemas Probabilísticos

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();

}

 

 
Cuadro de texto: Prog. 2: Psudocódigo para la generación de ruido browniano desarrollado por nosotros.

 



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.


1.2.2 Sistemas Desordenados y Ruido Blanco

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

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

1.2.3 Sistemas Caóticos, Fractales y Ruido 1/f

1.2.3.1 Sistemas Caóticos

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

1.2.3.2 Fractales

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.

Cuadro de texto: Fig. 6: Primeros 5 niveles del fractal clásico, 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.

1.2.3.3 Ruido 1/f

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 );

               avienta_dado[nn] = random(7);

           Nota += avienta_dado[nn];

       }

       sound( notas[Nota]);

       delay(200);                          //en milisegundos

       numero_binario2 = numero_binario;

       numero_binario ++;

   }

   nosound();

}

 

 
Cuadro de texto: Prog. 4: Psudocódigo para la generación de ruido 1/f.

 


 



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.

2.2 Sistema Compositor

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

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,