Full text
UNIVERSIDAD COMPLUTENSE DE MADRID FACULTAD DE INFORMÁTICA TRABAJO FIN DE GRADO CURSO 2021-2022 UNA APROXIMACIÓN ALGORÍTMICA A LA MÚSICA DE ARVO PÄRT AN ALGORITHMIC APPROACH TO THE MUSIC OF ARVO PÄRT DANIEL VILLALBA GARCÍA GRADO EN INGENIERÍA DEL SOFTWARE TUTOR PROF. JAIME SÁNCHEZ HERNÁNDEZ CONVOCATORIA ORDINARIA JUNIO DE 2022
A Jaime por descubrirme a Arvo Pärt y el extenso mundo de la programación musical. A mis padres y mi hermana. “I have discovered that it is enough when a single note is beautifully played.“ - Arvo Part 2
Resumen Arvo Pärt es un compositor de música sacra de origen estonio nacionalizado austriaco. Desde 2011 y durante 8 años seguidos fue el compositor contemporáneo más interpretado y algunas de sus piezas se han utilizado en la banda sonora de películas como “La Gran Belleza”, “Gravity” o la española “Soldados de Salamina”. Es conocido por ser uno de los precursores de la música minimalista y más concretamente del Minimalismo Sacro junto a John Tavener y Henryk Górecki entre otros. Buena parte de su obra está impregnada de reglas y procesos algorítmicos como el Tintinnabuli, su técnica más icónica. Sin embargo, su obra no suele catalogarse como música algorítmica ni es creada para ser interpretada por ordenadores. En este trabajo analizaremos algunas de esas obras desde un punto de vista algorítmico, extraeremos las reglas y procesos que las generan y le daremos ese carácter procedural a sus piezas. Para ello utilizaremos el entorno FoxDot que nos permite utilizar Python como lenguaje para escribir y generar algorítmicamente las composiciones. Palabras clave Minimalismo Sacro, Python, FoxDot, SuperCollider, Tintinnabuli, MIDI, música procedural, música algorítmica. 3
ABSTRACT Arvo Pärt is a composer of sacred music of Estonian origin naturalized Austrian. Since 2011 and for 8 years in a row he was the most performed contemporary composer and some of his pieces have been used in the soundtrack of films such as "The Great Beauty" or the Spanish "Soldiers of Salamis". He is known for being one of the precursors of minimalist music and more specifically of Sacred Minimalism along with John Tavener and Henryk Górecki among others. Much of his work is impregnated with algorithmic rules and processes such as Tintinnabuli, his most iconic technique. However, his work is not usually categorized as algorithmic music, nor is it created to be performed by computers. In this work we will analyze some of those works from an algorithmic point of view, we will extract the rules and processes that generate them and we will give that procedural character to his pieces. For this we will use the FoxDot environment that allows us to use Python as a language to write and algorithmically generate the compositions. KEYWORDS: Holy Minimalism, Python, FoxDot, SuperCollider, Tintinnabuli, procedural music, MIDI, algorithmic music. 4
Índice de Contenidos Abstract.........................................................................................................................4 Keywords:.....................................................................................................................4 1 Introducción...............................................................................................................7 Música Procedural y Generativa..............................................................................8 Objetivos.................................................................................................................10 Estado del arte.......................................................................................................10 Estructura de la memoria........................................................................................11 Código de generación y demos de las piezas........................................................11 2 Arvo Pärt y el Tintinnabuli........................................................................................12 Tintinnabuli.............................................................................................................13 Für Alina..................................................................................................................15 Cantus in Memoriam Benjamin Britten...................................................................17 Fratres....................................................................................................................19 Spiegel im Spiegel..................................................................................................22 3 Herramientas de Síntesis Musical...........................................................................23 FoxDot....................................................................................................................23 Players................................................................................................................24 Escalas, Tonalidades y Tempos.........................................................................25 Reloj...................................................................................................................25 SuperCollider..........................................................................................................26 MIDI en Reaper......................................................................................................27 4 Implementación........................................................................................................29 La matriz del Tintinnabuli........................................................................................29 La esencia del Tintinnabuli en Für Alina.................................................................31 5
“Cantus” en una instrucción...................................................................................34 La algoritmia de Fratres.........................................................................................38 5 Conclusiones y Trabajo Futuro................................................................................40 Anexos........................................................................................................................45 6
1 Introducción La motivación de este trabajo surge de las posibilidades de crear música generativa usando los algoritmos y técnicas compositivas que Arvo Pärt utiliza en algunas de sus piezas más reconocidas y elogiadas. La música minimalista alcanzó una gran popularidad en las décadas de los 60 y 70, donde compositores como Terry Riley o Steve Reich empezaron a separarse del serialismo y la música aleatoria para empezar a trabajar con armonías más sencillas y melodías repetitivas [1]. Continuando en los años 80 y 90 varios compositores comienzan a fijarse en estos ideales estéticos e inspirados por la música medieval y renacentista definen lo que hoy se conoce como Minimalismo Sacro. Arvo Pärt es uno de los precursores del Minimalismo Sacro en el que se enmarcan las obras de un grupo de compositores de música clásica a finales del siglo XX como John Tavener, Henryk Górecki, Alan Hobhaness y Sofía Gobaidulina entre otros1. Todos ellos representan este estilo compositivo muy marcado por el minimalismo y un aura espiritual. El reconocimiento de Arvo Pärt viene avalado por una larga trayectoria en la cual ha compuesto más de 80 obras [3]. Su música ha aparecido en la banda sonora de más de 50 películas [4] como “La Gran Belleza”, “Gravity”, la española “Soldados de Salamina” o la más reciente “Vengadores: la era de Ultrón”. Durante ocho años seguidos (entre 2011 y 2019) y hasta ser superado por John Williams, fue el compositor contemporáneo más interpretado. En esta época, en 2016, es nombrado doctor honoris causa por la Universidad de Oxford [5]. Al año siguiente recibe el premio Ratzinger, siendo el primer no teólogo en recibir este reconocimiento [6] y en 2020 es galardonado con el Premio Fundación BBVA Fronteras del Conocimiento en la categoría de Música y Ópera [7]. 1 A pesar de que muchos musicólogos los agrupan juntos dentro del Minimalismo Sacro, debido a sus distintas nacionalidades y creencias religiosas, los compositores suelen rechazar este término y de ninguna manera forman “escuela”, pero su uso está extendido debido, principalmente, a la ausencia de un término mejor [2] 7
Arvo Pärt, venía de un primer periodo donde trabajó el dodecafonismo y la música neoclásica. Las obras enmarcadas en estos estilos, destacan por ser complejas y requerir una escucha exigente y un extenso conocimiento musical para llegar a comprenderlas. Durante este periodo, Pärt entró en una crisis creativa y quiso apartarse de toda esa sofisticación, volviendo a las raíces de la música occidental y de las obras del renacimiento, con armonías y acordes más sencillos y sin excesivos adornos, creando una atmósfera espiritual y religiosa [8]. En palabras del propio Pärt: “Lo complejo y lo multifacético solo me confunde, y debo buscar la unidad”. En este trabajo analizaremos algunas de las técnicas que Arvo Pärt idea para conseguir esta atmósfera, donde la más emblemática y la que ha servido de inspiración para este trabajo es el Tintinnabuli [9], introducido en su obra Für Alina (1976) [10], que analizaremos para codificarla algorítmicamente [11]. El Tintinnabuli es una técnica de contrapunto que se compone de dos voces, una voz principal que, por lo general, es una melodía sencilla y la voz tintinnabular, que la acompaña de forma paralela moviéndose únicamente entre las 3 notas de un acorde, que normalmente corresponde con el acorde de tónica de la pieza. Música Procedural y Generativa En la música han existido algoritmos desde hace siglos, mucho antes de la existencia de las computadoras. Estos algoritmos pueden encontrarse en algunas técnicas de contrapunto e incluso en composiciones antiguas, como puede ser el “juego musical de dados” (conocido en alemán como Musikalisches Würfelspiel) muy popular en el siglo XVIII en Europa [12], donde se componían una serie de motivos que después eran interpretados en el orden que aleatoriamente decidiese una tirada de dados. Fue con la llegada de las computadoras cuando los algoritmos comenzaron a usarse con más profundidad en la música y comenzaron a aparecer términos como música procedural o música generativa. 8
Karen Collins define la música procedural como “una composición que evoluciona en tiempo real, de acuerdo con un conjunto específico de reglas lógicas de control” [13]. Esto es música generada basándose en algoritmos y comportamientos iniciales. Por lo tanto, el compositor no escribe una composición tradicional en forma de partitura, sino que define reglas que ejecutará el sistema para generar dicha música. De manera similar, Brian Eno introduce el término Música Generativa en su álbum homónimo Generative Music 1, un álbum musical con 12 composiciones escritas en software y presentadas en un Floppy Disk [14] El término "música generativa" suele utilizarse indistintamente con el de "música algorítmica", ya que gran parte de la música generativa contemporánea se crea con la ayuda de algoritmos generados por ordenador (Collins, 2008) [15]. La diferencia entre música generativa y música procedural es algo difusa, ambos estilos están relacionados con la “Música algorítmica”. La diferencia principal es que en la música generativa suele hablarse de composiciones interpretadas por un sistema o una computadora; en el álbum de Eno, Generative Music 1, las piezas eran presentadas como programas de ordenador. Mientras que en la música procedural hablamos también de reglas de control, pero no necesariamente entra en juego el computador. No podemos decir que Arvo Pärt componga música procedural o generativa pues sus obras siguen una estructura convencional y son escritas para ser interpretadas por músicos de orquesta, pero como veremos, en muchas de ellas utiliza patrones y algoritmos para escribirlas, empezando por su Tintinnabuli, una técnica de contrapunto puramente algorítmica. 9
Si Do# Re Mi Fa# Sol La Fa# Si Si Re Re Fa# Fa# Si nos fijamos en las líneas o compases de la pieza, vemos que hay únicamente 15, cada una con un número de notas distinto2, la sucesión de estas es de la siguiente manera: la primera empieza con una 16va baja que se alarga durante toda la obra, la segunda tiene una nota de libre duración seguida de una redonda, la siguiente dos notas de libre duración y una redonda y así sucesivamente aumentando el número de notas de libre duración, de manera que siempre acabamos la línea con una redonda. Esta secuencia se repite hasta que llegamos a las 8 notas, donde la secuencia se invierte y empiezan a reducirse el número de estas, 7, 6, 5… siendo la penúltima línea de dos notas (una nota de libre duración y una redonda) para volver a aumentar. La serie, en cuanto al número de notas es entonces: 1 2 3 4 5 6 7 8 7 6 5 4 3 2 3… Esta simetría hace que la pieza sea cíclica y pueda interpretarse un número ilimitado de veces. Es interesante recalcar como, en un primer vistazo de la partitura, podemos pensar que es una composición caótica, no tenemos compases ni un tempo definido y, además, la mayoría de notas son de duración arbitraria, pero si profundizamos en su análisis, vemos como Pärt sigue una estructura muy firme, con una sucesión muy sencilla pero que la propia notación musical no le permite expresar de una manera clara de comprender a simple vista. 2 Ver Anexo A con la partitura original de Für Alina 16
Cantus in Memoriam Benjamin Britten Esta pieza es un canon escrito en La menor con un compás de 6/4. Es un Treno3 al compositor Benjamin Britten compuesto para orquesta de cuerda y campana [23]. La pieza es en forma de canon proporcional (Prolation Canon). Este tipo de canon se caracteriza por tener una melodía principal acompañada por una o varias imitaciones que no interpretan la melodía idénticamente a la principal, sino que lo hacen a diferentes velocidades o proporciones. La melodía principal del “Cantus” consiste en un descenso por la escala de La menor alternando notas largas y cortas, comenzando por la nota más alta y formando la secuencia de manera que, cada vez que se llega al final de esta, se añade la nota siguiente de la escala. La pieza comienza con el sonido de una campana tubular afinada en La (la nota fundamental de la composición), con 12 pulsos entre cada golpe y una separación de 18 pulsos en cada agrupación de tres. Después de 3 pulsos del séptimo compás, entran los primeros violines reproduciendo la secuencia descrita, comenzando en la nota más alta de su registro, alternando blancas y negras. Para todas las secciones de la orquesta (excepto las violas), tenemos la mitad de ella tocando la secuencia en la escala de La menor y a la otra mitad acompañándola con un Tintinnabuli de T-1. La tabla de correspondencia es la siguiente: La Si Do Re Mi Fa Sol Mi La La Do Do Mi Mi Los segundos violines repiten exactamente lo mismo pero una octava por debajo y a la mitad de velocidad, por lo tanto, entran 6 pulsos más tarde del inicio del compás número 7 (justo al inicio del compás 8) y alternan redondas y blancas. 3 Canto fúnebre o lamentación por alguna calamidad o desgracia. (definición de la RAE) 17
La siguiente sección en entrar son las violas a la mitad de velocidad que los Violines II (a un cuarto de los Violines I) una octava por debajo, siendo el centro del registro de la pieza. Es la única voz que no que no es doblada por el Tintinnabuli. Después entra la sección de violoncelos, a la mitad de las violas y por último los contrabajos, de nuevo a la mitad de los violoncelos. Tabla 2: Línea temporal de Instrumentos. "Cantus". Violins I Violins II Violas Cellos Basses ■Notas Largas ■Notas Cortas 18 Figura 2: Cantus in Memoriam Benjamin Britten. Extracto de la partitura original.
En el compás 65, los violines primeros alcanzan el Do central, en ese momento dejan de reproducir la secuencia y se mantienen en esa nota por el resto de la pieza. Lo mismo hacen los segundos violines con el La bajo. Cuando ambas voces han alcanzado su objetivo, en ese punto de la obra toda la orquesta está interpretando un La menor, la tónica de la pieza, que se alarga durante 5 compases más hasta que para, momento en el que puede percibirse de nuevo la campana del principio. En las siguientes dos composiciones, veremos como Pärt varía ligeramente su Tintinnabuli. Fratres Esta es una de las piezas más ricas en cuanto al uso del Tintinnabuli de Arvo Pärt [24]. En ella, tenemos un motivo principal de 6 compases que se repite con variaciones a lo largo de los 11 minutos que dura la pieza, en el cual la melodía principal repite una secuencia de notas de la escala de La Mayor frigia y por debajo de ella tenemos otra melodía que sigue de manera exactamente paralela a la principal, pero una décima por debajo. Entre medias de ellas tenemos la voz Tintinnabular, que sería un T-2, pero en el segundo grado de la escala (Sib) al que le correspondería un Mi, Pärt le asigna un Do. La Sib Do# Re Mi Fa Sol Do Do Mi La La Do Do 19
Vamos a ver como se construye el motivo que se va a repetir durante la pieza. Empezamos con estas 4 notas: Las notas altas representan la melodía principal y las de abajo el Tintinnabuli4. Como vemos esta melodía empieza y termina en Do# y está compuesta de dos descensos. Para el siguiente compás añadimos 1 nota de la escala a cada uno de los descensos, al primero una nota por debajo y al siguiente por arriba quedando así: Y para el siguiente hacemos lo análogo aplicando la misma lógica: 4 A esto habría que añadirle la décima por debajo que no incluimos para hacer más clara la explicación. 20
Con esto ya tendríamos los tres primeros compases del motivo principal. Para los tres siguientes, lo que Pärt hace es invertir cada uno de los anteriores, es decir, tocar sus notas de manera inversa: Este es el motivo que va a acompañar toda la obra repitiéndose 9 veces, en cada repetición se desciende una tercera. A las repeticiones las separa lo que en música habitualmente se llama “refugio”, esto es un motivo (en este caso de percusión) que es idéntico en todas las repeticiones y que marca el final de una parte y comienzo de la siguiente. Pärt ha escrito 17 versiones de Fratres [25] tanto para conjuntos, como para solo y acompañamiento, con distintas variaciones, pero el motivo principal que hemos analizado es idéntico en todas ellas. Dependiendo de la versión este motivo formará parte de la base armónica. Normalmente por encima hay un instrumento solo. 21
Spiegel im Spiegel Aunque esta composición no vamos a implementarla en el capítulo 4, ya que no es tan representable algorítmicamente como el resto, merece que la analicemos musicalmente ya que es una de las piezas más reconocidas de Arvo Pärt y es una de las más utilizadas tanto en películas como en televisión [26] y el uso que hace Pärt del Tintinnabuli en ella puede ser inspirador [27]. Spiegel mi Spiegel, es una pieza escrita originalmente para piano y violín, aunque a veces es reemplazado por cello o viola. Es una composición en un compás de 6/4 en Fa mayor. La línea del violín es la voz principal, se basa en una línea melódica ascendente de notas largas, que comienza con una escala de dos notas de Sol y La, que asciende alternativamente y luego desciende a La por pasos. Con cada ascenso y descenso posterior, se añade una nota a la línea, un proceso que podría continuar indefinidamente, algo a lo que, como hemos visto, Pärt recurre mucho en su minimalismo. El piano hace la voz tintinnabular, aunque en este caso, no acompaña a la voz principal nota por nota, si no que cada nota tiene asignado una inversión del acorde de Fa mayor, y arpegia de manera ascendente en negras sobre esa inversión hasta que el violín cambia de nota [28]. 22 Figura 3: Extracto de la partitura original de Spiegel im Spiegel
3 Herramientas de Síntesis Musical En las últimas décadas, la infórmatica y la música han estado muy unidas. Hoy en día, son pocas las piezas musicales que no son producidas digitalmente, parcial o totalmente y tenemos infinidad de software dedicado tanto a producción como a análisis y escritura musical [29]. El software de síntesis musical puede ser clasificado en software de notación musical para escribir partituras: MuseScore (usado en este trabajo para la generación de las imágenes explicativas de Fratres en el capítulo anterior) o Sibelius. Software de producción musical: los llamados DAWs como Ableton, Pro Tools o Reaper (que exploraremos mínimamente) y los entornos de programación musical: Csound, Chuck, MAX/MSP o Pure Data, donde las composiciones son escritas en forma de código o instrucciones para interpretadas por la computadora. Es esta última categoría en la que más nos vamos a centrar para este trabajo y en sus posibilidades para generar música a partir de algoritmos. FoxDot De entre todos los lenguajes orientados a la programación musical, como puede ser SuperCollider o TidalCycles y SonicPi, más orientados a el Live Coding, nos hemos decantado por FoxDot por estar basado en Python. Esto nos interesa especialmente porque es un lenguaje muy eficaz para prototipado, flexible y que al ser interpretado facilita el live coding, además de que hace que cualquier composición sea muy visual y comprensible incluso para las personas que no lo conocen. FoxDot es un entorno de código abierto de programación en vivo o Live Coding que nos permite crear música de manera muy directa sin, necesariamente, tener un conocimiento extenso en programación ni en música, lo cual no nos impide que podamos utilizar funciones e implementaciones complejas en Python. Corre por encima de SuperCollider, un conocido entorno de programación musical, que le aporta un potente motor de síntesis para producir el sonido final. 23
Sobre SuperCollider, FoxDot nos da una facilidad extrema para sincronizar instrumentos gracias a su scheduler del tempo, donde mantiene un beat con el compás y tempo que definamos y cualquier instrumento que definamos va seguir ese latido interno. Existe además una extensa documentación oficial sobre todas sus funcionalidades, un tutorial de instalación [30], así como un foro para consultas de los usuarios [31]. Procedemos a detallar algunas de las funciones principales que nos van a interesar para el desarrollo de este trabajo. Players FoxDot nos permite definir players que tienen asignados sintetizadores donde proporcionaremos una secuencia de números en forma de lista que serán las notas que queremos que suenen en bucle. Estos instrumentos tienen una serie de atributos que podremos modificar dependiendo de cómo queremos que interpreten esas notas. Veamos un ejemplo. p1 >> pluck([0, 2, 4], dur=[1, 1/2, 1/2], amp=0.75) Se define el player p1 que utiliza un sintetizador que simula una cuerda (pluck) tocando las notas Do (0), Mi (2) y Sol (4) en bucle, con una duración de negra y dos corcheas respectivamente con una amplitud (o volumen) de 0.75. Por supuesto, podemos definir tantos players como queramos y estos se sincronizarán entre ellos, pudiendo alterar además esta sincronización. 24
Escalas, Tonalidades y Tempos Si hablamos de características de la composición, podemos modificar varios de sus parámetros. Con Root.default podemos definir la tónica de la escala en la que se va a interpretar la composición. Antes hemos visto como la nota Do se corresponde con el número 0, esto es porque FoxDot, por defecto, establece la tonalidad en Do mayor, si nosotros quisiéramos establecer una tonalidad de, por ejemplo, Mi menor tendríamos que ejecutar: Root.default = “E” Scale.default = “minor” De esta manera ahora el 0 sería un Mi, el 2 un Sol y el 4 un Si. Esto nos permite poder modificar en tiempo real la armonía de lo que esté sonando dando muchísima flexibilidad a todo lo que queramos tocar, pudiendo interpretar una misma composición en cualquier tonalidad y escala que queramos. Reloj El reloj controla el pulso interno de FoxDot, aunque no estemos ejecutando nada, el pulso se mantiene en el número que le hayamos asignado. Podemos modificar el tempo con: Clock.bpm = 90 Además de modificar el tempo, podemos usar el Clock para sincronizar instrumentos, por ejemplo, para indicarles el pulso en el que queremos que entren con Clock.schedule: 25
El método stutter se aplica sobre una lista de valores, en nuestro caso P[1,4]6, que van a ser las duraciones de las notas sobre las que vamos a trabajar (negras [1] y redondas [4]) y recibe una lista por cada uno de estos valores con las veces que queremos que se repita cada uno de esos valores, por eso tenemos una lista con varios valores del 1 al 7 y otra con un único valor, porque la redonda solo queremos que se repita una vez por compás. Esto nos devuelve lo siguiente: P[1, 4, 1, 1, 4, 1, 1, 1, ..., 1, 1, 4, 1, 1, 4] Con esto ya podemos definir las 2 voces de la pieza, la principal y la tintinnabular: p1 >> MidiOut(mVoice, dur = furAlina, channel = 1, oct = 6, sus = p1.dur-0.1, amp = PWhite(0.3, 0.5) ) p2 >> MidiOut(getTvoiceFromMelody(mVoice, 0), dur = furAlina, channel = 2, oct = 6, sus = p2.dur-0.1, amp = PWhite(0.3, 0.5) ) Para estas voces no estamos utilizando directamente un sintetizador de los predeterminados, si no que utilizamos MidiOut. Con esto hacemos que el player envíe señales MIDI a través de SuperCollider a cualquier secuenciador, en nuestro caso Reaper. Como queremos enviar cada uno de ellos por canales diferentes, con channel indicamos el número de canal que queremos utilizar. 6 P[1,4] es lo que en FoxDot llaman patterns, son similares a las listas pero con funciones propias, como es stutter en este caso. 32
Vamos a hacer un inciso sobre el parámetro “sus = p1.dur-0.1”. Esto es debido a un conocido bug de FoxDot, documentado oficialmente: "Note: Be careful when repeating the same note with the same duration; if a MIDI note-on event is triggered slightly before the MIDI note-off for the previous event, it will be stopped by the noteoff. This is a known bug and being looked into" [37]. Esto hace que las notas iguales de la misma duración enviadas por MIDI puedan “solaparse”. Definiendo así el “sustain”, hacemos que la nota se corte un instante antes de empezar la siguiente y evitemos este bug sin que se note el corte7. Mvoice es una lista con las notas que queremos interpretar. En nuestro caso hemos definido una lista con las notas originales de la pieza, pero podrían ser cualquier otras o incluso aleatorizarse. La amplitud (o intensidad) de la nota la hemos aleatorizado entre 0.3 y 0.5 para tratar de darle una dinámica más natural. Para la voz tintinnabular (p2), hemos usado el método getTvoiceFromMelody con la misma melodía que usamos en p1 y aplicándole el Tintinnabuli 0 del relativo menor. Esta pieza, como está escrita únicamente para piano, vamos a usar solo un plugin vst, el Keyzone Classic de Bitsonic, que es completamente gratuito. Lo desplegaremos independientemente en 2 pistas, una para la voz principal en el canal 1 y otra en el canal 2 para la voz tintinnabular. Por último y saliéndonos un poco de la composición original, como base armónica, hemos usado kontakt para generar una rueda de acordes que ambiente la composición. Esta rueda está compuesta por La menor, Mi menor, Do mayor y Re menor. 33
“Cantus” en una instrucción notes = [comp for i in range(19) for comp in list(range(14,14-i,-1))] Con esta única instrucción generamos la lista de notas que vamos a tocar con todos los instrumentos a diferentes velocidades. Partiendo del 14, que es la nota más alta de la pieza, vamos añadiendo el siguiente número descendente en cada vuelta, así 19 veces, llegando hasta el -3. Hemos querido extender la pieza más allá del final original de Pärt para hacer de ella una composición cíclica y con un carácter procedural Si hacemos un print(notes) en FoxDot obtenemos lo siguiente: [14, 14, 13, 14, 13, 12, 14, 13, 12, 11, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 14, 13, 12, 11, 10, 9, 8, 14, 13, 12, 11, 10, 9, 8, 7, 14, 13, 12, 11, 10, 9, 8, 7, 6, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3] 34
35 Figura 5: Primera página de partitura original de Cantus in Memoriam Benjamin Britten
De esta manera plantearíamos los instrumentos. En primer lugar, con Clock.schedule(), hacemos que cada uno de ellos entre en su pulso correspondiente, como en la obra original. Es importante remarcar que a cada uno de los instrumentos le hemos asignado una letra, esto es porque si definimos todos los instrumentos como “p”, al haber varios, crean conflicto entre ellos y hay solapamientos. El número 2 siempre corresponderá a la voz Tintinnabular de cada uno de ellos. Las duraciones, según vamos bajando de registro, se van doblando como en la composición original. De esta manera creamos una composición cíclica de muy larga duración, ya que cada instrumento interpreta las mismas notas, pero a distintas duraciones y ha de pasar mucho tiempo hasta que coincidan en el inicio. En cuanto a la parte MIDI de esta pieza, hemos utilizado un único plugin VST que tenemos desplegado en varias pistas, una para cada voz de la composición. 36
El plugin es BB Symphonic Orquesta, un plugin gratuito que emula una orquesta sinfónica en la que podemos elegir por separado la sección que queremos utilizar, lo cual es perfecto para esta pieza. 37 Figura 7: Interfaz del BBC Symphonic Orquestra Figura 6: Representación de las pistas del Cantus en Reaper
La algoritmia de Fratres Esta obra no vamos a tratar de replicarla lo más fiel a la realidad, sino, que con la técnica que propone Pärt, vamos a introducir una componente aleatoria. Además acercarnos a la interpretación real es complicado, ya que hay múltiples versiones, y en cada una de ellas un instrumento solo hace una melodía diferente encima del motivo que implementaremos y que ya hemos analizado. Esta aleatoriedad va a estar en el Tintinnabuli de la pieza, donde, en vez de elegir uno de los niveles fijos como hemos hecho con otras, vamos a generar una voz tintinnabular que seleccionará la fila de la matriz aleatoriamente entre +1, +2 y +3 para cada una de las notas de la siguiente manera: def tint(mot): mt = [] inc = 0 for n in mot: if random.random()<0.5: inc=1 elif random.random()<0.8: inc=2 else: inc=3 mt.append(getTvoice(n,inc)) return mt Donde al t+1 le damos una probabilidad de 0.5, al t+2 de 0.3 y al t+3 de 0.2. Lo siguiente es generar las notas con sus duraciones, vamos a explicar esto paso por paso. Lo primero que vamos a hacer es definir una primera función que recibe dos parámetros, el primero es la nota raíz sobre la que queremos generar la línea (como vimos, en la pieza original es un Do#) y el segundo es el número de notas que queremos añadir a esa nota inicial, tanto en descenso como en ascenso: # expansion descendente por grados contiguos + ascendente def expand(root,ext): return [root-i for i in range(ext)] + #descendentes [root+ext-i-1 for i in range(ext)] #ascendentes 38
A continuación, vamos a llamar a esta función, dentro de un bucle, las 3 veces que necesitamos para generar los 3 primeros compases de la pieza. Una vez generados esos tres primeros compases, los recorremos en orden inverso para generar los 3 siguientes: ini = [expand(3,i) for i in range(2,5)]#primeras 3 expansiones, 3 compases fratres = ini + [m[::-1] for m in ini]# añadimos los compases invertidos Estas dos instrucciones podemos meterlas dentro de un for de 9 iteraciones que en cada vuelta reste 3 a la nota raíz. Así generaríamos las 9 repeticiones de la pieza orinal bajando una tercera cada una de ellas: fratres = [] root_note = 3 for j in range(0,9): ini = [expand(4-3*j,i) for i in range(2,5)] fratres.extend(ini + [m[::-1] for m in ini]) Después de esto, lo único que nos falta son las duraciones de las notas, que como hemos visto, son todo negras exceptuando la nota inicial y final de cada compás, que son 2 blancas. De manera que lo que haremos será generar una lista de valores enteros que, para cada compás, su primer valor sea un 2 (el valor de una blanca) seguido de n-2 negras (valor entero 1), donde n es el número de notas del compás y como último valor, nuevamente un 2: durs = [[2] + [1]*(len(c)-2) +[2] for c in fratres] 39
Como con todas estas instrucciones lo que hemos hecho es generar una lista por cada compás, como resultado tenemos una estructura de matriz, es decir, una lista de listas y los players de FoxDot solo admiten como parámetro listas simples, por lo tanto, necesitamos convertirlas a ese formato y por último generar la voz tintinnabular llamando a la función tint con el resultado y crear los dos players para las dos voces: f = [x for sublist in fratres for x in sublist] d = [x for sublist in durs for x in sublist] t = tint(f) p1 >> MidiOut(f, dur=d, channel = 0) p2 >> MidiOut(t, dur=d, channel = 1) 40
5 Conclusiones y Trabajo Futuro Este trabajo, impulsado por una idea básica como lo es el Tintinnabuli, una técnica de contrapunto, ha supuesto un descubrimiento de la obra de Arvo Pärt y un extenso aprendizaje sobre técnicas de composición algorítmica que abren un camino distinto al planteado tradicionalmente en la música clásica y demuestra como la música no siempre necesita excesivos adornos y complejidad para impresionar, a veces, solo es necesario encontrar una buena idea y ejecutarla. Arvo Pärt elabora un estilo compositivo en el que, a partir de una idea que puede ser una secuencia de notas o un patrón rítmico, es capaz de componer piezas enteras de una riqueza asombrosa. Este es uno de los pilares fundamentales de su minimalismo y ha sido la motivación principal de este trabajo, pudiendo analizar y explicar algunas de sus obras desde un enfoque algorítmico, siendo muy fáciles de entender para un programador no músico. Históricamente se han aplicado multitud de técnicas algorítmicas o pseudoalgorítmicas en composición musical, aunque los autores no siempre lo hayan hecho de modo deliberado. Otros compositores más recientes sí han aplicado algoritmos para componer música con mejores o peores resultados. El caso de Arvo Pärt es paradigmático porque la algoritmia es muy evidente y la calidad de su obra es indiscutible a pesar de que su intención no parece ser la de componer obras de esta manera para ser generadas o interpretadas con ordenador. Esta es la razón principal por la que elegimos a Pärt para este trabajo, porque si eramos capaces de identificar estos algoritmos y replicarlos en código, podíamos ser capaces de recrear proceduralmente estas obras en su totalidad. Después de haber analizado algunas de sus obras más icónicas y reconocidas, hemos visto como con Cantus in Memoriam Benjamin Britten o Fratres, hemos sido capaces de generar las obras a partir de una idea algorítmica cumpliendo así el objetivo que nos marcábamos al comienzo de interpretar las piezas de Pärt con el ordenador. Otro de los objetivos que nos habíamos planteado, era la posibilidad de aplicar las técnicas de Pärt para crear música ambiental que pueda ser utilizada en entornos 41
Anexo A Aquí incluimos la partitura original de Für Alina. 48
49