SINFONÍAS DEL FUTURO: CREANDO MELODÍAS CON TECNOLOGÍA IA
SYMPHONIES OF THE FUTURE: CREATING MELODIES WITH IA TECHNOLOGY
Bryan Eduardo Alarcon Bazurto
Universidad Estatal Península de Santa Elena. Facultad de Sistemas y Telecomunicaciones, Santa Elena-Santa Elena. Ecuador.
ORCID: https://orcid.org/0000-0002-8396-378X
Correo: alarconbazurtobryan@gmail.com
Andres Joseph Pinargote Quintero
Universidad Estatal Península de Santa Elena. Facultad de Sistemas y Telecomunicaciones, Santa Elena-Santa Elena. Ecuador.
ORCID: https://orcid.org/0000-0002-6122-9824
Correo: andrespinargote7@gmail.com
Vasconez Alava Laura Lorena
Universidad Estatal Península de Santa Elena. Facultad de Sistemas y Telecomunicaciones, Santa Elena-Santa Elena. Ecuador.
ORCID: https://orcid.org/0000-0002-1576-2097
Correo: lauravasconez98@gmail.com
Sánchez Cabrera Bryan Bolívar
Universidad Estatal Península de Santa Elena. Facultad de Sistemas y Telecomunicaciones, Santa Elena-Santa Elena. Ecuador.
ORCID: https://orcid.org/0000- 0002-8263-1966
Correo: bryansanchezcabrera06@outlook.com
Resumen
En la actualidad, nos encontramos inmersos en una era de avances tecnológicos sin precedentes que están transformando nuestra percepción y producción musical. La inteligencia artificial (IA) ha emergido como una herramienta revolucionaria que está redefiniendo la música. La generación de melodías sinfónicas mediante IA es un emocionante desarrollo que atrae a artistas, científicos y amantes de la música.
A través de algoritmos de aprendizaje automático, las máquinas están aprendiendo a componer música de manera autónoma, abriendo nuevas posibilidades creativas.
Este artículo se centra en la generación de melodías sinfónicas utilizando una Red Neuronal Recurrente (RNN) basada en LSTM. El proceso implica la obtención de notas de archivos MIDI, la preparación de secuencias de entrada y salida, la construcción y entrenamiento del modelo, la generación de notas y la creación de un archivo MIDI. Para esto se utiliza Google Colab y Python con diversas bibliotecas para programar el entorno de desarrollo. El proceso se estructura en etapas, desde la obtención de notas hasta la creación del archivo MIDI final. Se discute la importancia de la monofonía y la polifonía en la música.
Además, se explora el Protocolo de Comunicación MIDI, que es fundamental en la transmisión de información musical entre dispositivos.
Palabras claves: Inteligencia artificial (IA), Aprendizaje automático, Red Neuronal. Recurrente (RNN), Archivos MIDI.
Abstract
Today, we are immersed in an era of unprecedented technological advances that are transforming our perception and production of music. Artificial intelligence (AI) has emerged as a revolutionary tool that is redefining music. The generation of symphonic melodies through AI is an exciting development that appeals to artists, scientists, and music lovers.
Through machine learning algorithms, machines are learning to compose music autonomously, opening up new creative possibilities.
This paper focuses on the generation of symphonic melodies using a Recurrent Neural Network (RNN) based on LSTM. The process involves obtaining notes from MIDI files, preparing input and output sequences, building and training the model, generating notes, and creating a MIDI file. For this, Google Colab and Python with various libraries are used to program the development environment. The process is structured in stages, from note fetching to the creation of the final MIDI file. The importance of monophony and polyphony in music is discussed.
In addition, the MIDI Communication Protocol, which is fundamental in the transmission of musical information between devices, is explored.
Keywords: Artificial Intelligence (AI), Machine Learning, Neural Network. Recurrent Neural Network (RNN), MIDI files.
Introducción
A lo largo de la historia de la humanidad, la música ha sido una forma de arte que se ha adaptado a las cambiantes sensibilidades culturales y avances tecnológicos. En la actualidad, estamos inmersos en una era de avances tecnológicos sin precedentes que están remodelando nuestra percepción y producción de la música.
En los últimos años, ha habido un notable aumento en la proliferación de modelos de Inteligencia Artificial (IA) utilizados para producir información artificial. Entre los más reconocidos se encuentran las redes GAN (redes generativas adversariales), las cuales han estado en uso desde 2014.
La inteligencia artificial (IA) ha surgido como una herramienta revolucionaria que está alterando la manera en que creamos y experimentamos la música. Específicamente, la generación de melodías sinfónicas mediante IA representa un emocionante progreso en la convergencia de la tecnología y la creatividad musical. Este enfoque está atrayendo la atención de artistas, científicos y amantes de la música por igual.
Es innegable que los avances en el campo de la inteligencia artificial están experimentando un asombroso crecimiento. Hemos sido testigos de su capacidad para mantener conversaciones, pilotar aviones de combate, replicar nuestra escritura a mano e incluso redactar noticias durante los Juegos Olímpicos pasados. Sin embargo, ahora está incursionando en una nueva profesión, ya que recientemente ha sido capaz de crear melodías con diferentes tiempos y ritmos.
A través de algoritmos de aprendizaje automático, las máquinas están adquiriendo la capacidad de componer música de forma autónoma. Esta intersección entre la música y la IA promete desencadenar nuevas posibilidades creativas y redefine la forma en que entendemos y creamos música..
Este artículo explorará los enfoques en la generación de melodías sinfónicas mediante el uso de la inteligencia artificial. utilizando el aprendizaje automático y específicamente la generación de notas monofónicas. Para lograrlo, se ha utilizado un modelo de Red Neuronal Recurrente (RNN) basado en la arquitectura LSTM (Long Short-Term Memory). El código implementado en Python se encarga de procesar archivos MIDI, extraer las notas y acordes, preparar las secuencias de entrada y salida, entrenar el modelo de aprendizaje automático y finalmente generar nuevas notas musicales.
Materiales y métodos
El desarrollo de la música mediante la inteligencia artificial (IA) usará herramientas para programar el entorno de desarrollo, como lo es Google Colab, ya que es un entorno virtual el cual se trabaja en la nube. Su principal y notoria ventaja es su rendimiento. Además del software de programación Python con diversas librerías.
Para poder generar música mediante la inteligencia artificial (IA), se usará una base de datos de archivos MIDI los cuales la IA los aprenderá, y esta generará un archivo nuevo el cual ya contará con las debidas notas, acorde con un determinado tiempo.
Las principales etapas de desarrollo de música mediante la inteligencia artificial están estructuradas de la siguiente forma:
Obtención de notas:
Se implementa la función “get_notes()” para analizar los archivos MIDI presentes en el directorio “/midi_songs”. Se extraen las notas, acordes, tiempos y sostenidos de los archivos MIDI y se almacenan en una lista.
Preparación de secuencias:
Se utilizan las funciones “prepare_sequences()” y “prepare_sequences_test()” para preparar las secuencias de entrada y salida para el modelo. Las secuencias se crean a partir de las notas extraídas, y se realiza un mapeo de las notas a valores enteros para su procesamiento en el modelo.
Construcción y entrenamiento del modelo:
Se crea un modelo de red neuronal recurrente utilizando la arquitectura LSTM (Long Short-Term Memory) con capas de dropout para evitar el sobreajuste. El modelo se compila con la función de pérdida de entropía cruzada categórica y el optimizador Adam. Se realiza el entrenamiento del modelo utilizando las secuencias preparadas anteriormente.
Generación de notas:
Se utiliza el modelo entrenado para generar nuevas secuencias de notas musicales mediante la función “generate_notes_test()”. Se selecciona aleatoriamente una secuencia inicial y se generan notas basadas en las predicciones del modelo.
Creación del archivo MIDI:
Las notas generadas se convierten en un archivo MIDI utilizando la función “create_midi()”. Se asigna un instrumento de piano a las notas y se crea un archivo MIDI que representa la secuencia generada.
Librerías y configuración
En esta sección se importan las librerías necesarias para el proyecto, como “Keras”, “NumPy”, “Pandas”, “matplotlib”, “seaborn”, “music21”, entre otras. Además, se monta el directorio de Google Drive para acceder a los archivos necesarios.
Monofonía
La monofonía en la música se caracteriza por tener una sola línea melódica, similar a la monodia, que es la interpretación solitaria de una persona sin acompañamiento armónico. Cuando dos o más voces cantan la misma melodía al mismo tiempo, también se considera monofonía, ya sea en unísono o dentro de una octava de diferencia.
Es importante señalar que la textura musical se refiere a cómo se combinan los elementos en una composición. En la música contemporánea, muchas obras alternan entre monofonía, homofonía, polifonía y heterofonía, creando así una variedad de momentos y estilos.
Polifonía
La polifonía, en resumen, se refiere a un tipo específico de textura musical. Esta noción abarca las armonías, los ritmos y las melodías que entran en juego al crear una composición, otorgándole diversas características. La textura musical se forma a partir de las interacciones entre estos elementos: en el caso de la polifonía, la presencia de múltiples melodías no impide que la obra sea percibida como un conjunto cohesivo.
En una composición polifónica, se encuentran diversas melodías fundamentales, y la capacidad de cada individuo para identificar melodías independientes en el contexto de la música polifónica puede variar según sus habilidades y sensibilidades personales.
Protocolo de Comunicación MIDI
MIDI, que es una abreviatura de Interfaz Digital de Instrumentos Musicales, representa un estándar tecnológico que define un conjunto de reglas, una interfaz digital y conectores que posibilitan la interconexión y comunicación entre diversos instrumentos musicales electrónicos, computadoras y otros dispositivos relacionados. El sistema MIDI transmite mensajes de eventos que especifican elementos como la notación musical, el tono y la velocidad, así como señales de control que pueden aplicarse a una amplia gama de parámetros, incluyendo la dinámica, el vibrato y el paneo, junto con señales de reloj que sirven para establecer y sincronizar el tiempo entre varios dispositivos. Estos mensajes se transmiten a través de un cable MIDI hacia otros dispositivos que se encargan de generar sonidos u otras funciones. Además, estos datos pueden ser grabados en hardware o software, lo que permite la edición de la información y su posterior reproducción.
Para la exploración de la información se utiliza el archivo “MoonlightSonata.mid” ya digitalizado en formato MIDI obtenido de “freemidi”.
Librerias: “py_midicsv”, “mido” , “numpy”, “pandas”.
Librerías para la exploración
# Librerías
import mido
import numpy as np
import pandas as pd
from mido import MidiFile
# carga de archivo y visualización de la estructura
archivo_midi = MidiFile('MoonlightSonata.mid')
print('info',archivo_midi)
print('length',archivo_midi.length)
print('charset',archivo_midi.charset)
print('ticks_per_beat',archivo_midi.ticks_per_beat
info <midi file 'MoonlightSonata.mid' type 1, 2 tracks, 2642 messages>
length 306.4472479999999
charset latin1
ticks_per_beat 120
La información relevante nos dice que el archivo posee 2 canales que empiezan en el mismo tiempo con “ticks_per_beat” de 120 y posee 2642 mensajes almacenados.
Tipos de mensajes
tipo 0 (pista única): todos los mensajes se guardan en una pista.
tipo 1 (síncrono): todas las pistas comienzan al mismo tiempo.
tipo 2 (asincrónico): cada pista es independiente de las demás.
Mensajes Almacenados
Sabiendo que nuestro archivo tiene 2 “track´s” podemos acceder a la información directamente.
print(archivo_midi.tracks[0])# Track 1
print(archivo_midi.tracks[1])# Track 2
<midi track '' 7 messages>
<midi track '1st' 2635 messages>
Pista 0
#Primer pista
for msg in archivo_midi.tracks[0]:
print(msg)
<meta message time_signature numerator=4 denominator=4 clocks_per_click=24 notated_32nd_notes_per_beat=8 time=0>
<meta message key_signature key='E' time=0>
<meta message set_tempo tempo=1090909 time=0>
<meta message marker text='1st mvmt' time=0>
<meta message marker text='Transcribed by Edward Grant' time=0>
<meta message set_tempo tempo=2400000 time=32640>
<meta message end_of_track time=0>
La información que podemos visualizar en esta pista es con respecto a metadatos sobre el tiempo de la pista el autor, notas por beat, tiempo, etc. con un total de 7 mensajes en esta pista.
# Código opcional: Para recorrer todo el archivo
for i, track in enumerate(archivo_midi.tracks):
print('Track {}: {}'.format(i, track.name))
for msg in track:
print(msg)
Con este código podremos visualizar el archivo completo en ambos track´s.
Convirtiendo “archivo_midi” a una lista
# Transformando a una lista para observar
# las 15 primeras filas.
lista = list(archivo_midi)
lista[0:15]
[<meta message time_signature numerator=4 denominator=4 clocks_per_click=24 notated_32nd_notes_per_beat=8 time=0>,
<meta message key_signature key='E' time=0>,
<meta message set_tempo tempo=1090909 time=0>,
<meta message marker text='1st mvmt' time=0>,
<meta message marker text='Transcribed by Edward Grant' time=0>,
<meta message midi_port port=0 time=0>,
<meta message track_name name='1st' time=0>,
<message program_change channel=0 program=0 time=0>,
<meta message text text='\r' time=0>,
<message control_change channel=0 control=67 value=127 time=0>,
<message control_change channel=0 control=64 value=127 time=0>,
<message note_on channel=0 note=56 velocity=35 time=0.054545449999999995>,
<message note_on channel=0 note=49 velocity=42 time=0>,
<message note_on channel=0 note=37 velocity=42 time=0>,
<message note_on channel=0 note=56 velocity=0 time=0.38181814999999997>]
Almacenamiento
Copia de información en archivo .txt
archivomid = 'MoonlightSonata.mid'
archivotxt = 'MoonlightSonata.txt'
info_mid = MidiFile(archivomid)
# SALIDA
pistas = info_mid.tracks
n = len(pistas)
for i in range(0,n,1):
print(i, pistas[i])
# ARCHIVO DE TEXTO
archivo = open(archivotxt,'w')
for dato in partitura:
archivo.write(str(dato) + '\n')
archivo.close()
0 <midi track '' 7 messages>
1 <midi track '1st' 2635 messages>
De esta forma puedo obtener toda la información cruda volcada en un archivo txt.
Conversiones
Transformando los datos de MIDI a CSV
Transformando los datos de CSV a MIDI
import py_midicsv as pm
# Cargar archivo midi y lo convierte a csv
csv_string = pm.midi_to_csv("MoonlightSonata.mid")
# Parsea el archivo csv a midi
midi_object = pm.csv_to_midi(csv_string)
# guardando el archivo modificado a la ruta raiz
with open("example_converted.mid", "wb") as output_file:
midi_writer = pm.FileWriter(output_file)
midi_writer.write(midi_object)
# El archivo generado example_converted.mid
# debería funcionar perfectamente si se reproduce
Creando un Data Frame con datos filtrados
df_csv_string = pd.DataFrame(csv_string,columns=['Data'])
df_csv_string
Afuera
index | Data
-------------------------------------|
00, 0, Header, 1, 2, 120\n
11, 0, Start_track\n
21, 0, Time_signature, 4, 2, 24, 8\n
31, 0, Key_signature, 4, "major"\n
41, 0, Tempo, 1090909\n
26412, 33126, Note_on_c, 0, 61, 0\n
26422, 33126, Note_on_c, 0, 37, 0\n
26432, 33126, Note_on_c, 0, 44, 0\n
26442, 33126, End_track\n
26450, 0, End_of_file
2646 rows × 1 columns
De esta manera filtramos los datos por fila de un mensaje entero en una sola columna a modo de ejemplo.
Para poder desarrollar exploraciones más avanzadas o realizar gráficos con datos que sean de interés, deberemos realizar una limpieza de los datos con el fin de ordenar cada información separada por la coma en una columna independiente. Este trabajo quedará pendiente para otro cuaderno.
Librería “Music21”
Music21 es un conjunto de herramientas para ayudar a los académicos y otros oyentes activos a responder preguntas sobre música de forma rápida y sencilla. Si alguna vez te has hecho una pregunta como "Me pregunto con qué frecuencia Bach hace eso " o "Me gustaría saber qué banda fue la primera en usar estos acordes en este orden, si pudiera escribir un programa para escribir automáticamente más de ellos”, entonces music21 puede ayudarlo con su trabajo.
Librería “Numpy”
NumPy es una biblioteca especializada en Python que se enfoca en el procesamiento numérico y el análisis de datos, especialmente adecuada para manejar grandes volúmenes de información. Introduce una novedosa categoría de objetos llamados "arrays", los cuales permiten representar conjuntos de datos con elementos del mismo tipo en múltiples dimensiones y proporciona funciones altamente eficientes para su manipulación. Un "array" es una estructura de datos organizada en forma de tabla o matriz con diferentes dimensiones, que también se conocen como ejes. Para crear uno de estos "arrays", se emplea la siguiente función de NumPy:
“np.empty”(dimensiones) : Crea y devuelve una referencia a un “array” vacío con las dimensiones especificadas en la tupla dimensiones.
“np.zeros”(dimensiones) : Crea y devuelve una referencia a un “array” con las dimensiones especificadas en la tupla dimensiones cuyos elementos son todos ceros.
“np.ones”(dimensiones) : Crea y devuelve una referencia a un “array” con las dimensiones especificadas en la tupla dimensiones cuyos elementos son todos unos.
“np.full”(dimensiones, valor) : Crea y devuelve una referencia a un “array” con las dimensiones especificadas en la tupla dimensiones cuyos elementos son todos valor.
“np.identity”(n) : Crea y devuelve una referencia a la matriz identidad de dimensión n.
“np.arange”(inicio, fin, salto) : Crea y devuelve una referencia a un “array” de una dimensión cuyos elementos son la secuencia desde inicio hasta fin tomando valores cada salto.
“np.linspace”(inicio, fin, n) : Crea y devuelve una referencia a un “array” de una dimensión cuyos elementos son la secuencia de n valores equidistantes desde inicio hasta fin.
“np.random.random”(dimensiones) : Crea y devuelve una referencia a un “array” con las dimensiones especificadas en la tupla dimensiones cuyos elementos son aleatorios.
Resultados y discusión
Este artículo examina la aplicación de la inteligencia artificial (IA) en la generación de melodías sinfónicas. La capacidad de las máquinas para producir música de forma autónoma se ha demostrado utilizando técnicas basadas en algoritmos de aprendizaje automático, concretamente Redes Neuronales Recurrentes (RNNs) con arquitectura LSTM.
Los resultados de este estudio muestran que la inteligencia artificial puede producir secuencias de notas coherentes y creativas. Recuperar notas de un archivo MIDI, procesarlas y generar nuevas notas utilizando un modelo entrenado son pasos que se han implementado con éxito.
Abre nuevas posibilidades creativas para la creación musical y puede convertirse en una herramienta valiosa para compositores e intérpretes.
Elegir utilizar perfiles MIDI como biblioteca es una elección inteligente, ya que estos perfiles contienen información detallada sobre notas, acordes y tiempos, lo que permite a la IA aprender patrones musicales de manera efectiva. Además, el protocolo de comunicación MIDI se ha utilizado eficazmente para generar sonido y crear archivos de música.
Es importante enfatizar que la monofonía y la polifonía son conceptos claves en la música, y el enfoque de este proyecto es la generación de tonos monofónicos. Sin embargo, en la música moderna es común una combinación de diferentes texturas musicales como el unísono y la polifonía. Se podrían explorar desarrollos futuros utilizando técnicas similares para crear música polifónica.
En cuanto a las limitaciones de este enfoque, cabe mencionar que la generación musical de IA todavía enfrenta desafíos a la hora de crear composiciones verdaderamente originales y emocionales.
Además, las evaluaciones de la calidad de la música generada por IA son subjetivas y pueden variar según las preferencias personales.
Conclusiones
Este artículo destaca la evolución continua de la música a lo largo de la historia para adaptarse a las cambiantes sensibilidades culturales y los avances tecnológicos. Hoy, gracias al auge de la inteligencia artificial (IA), somos testigos de una revolución en la creación y la experiencia musical.
Como demuestra esta investigación, el uso de inteligencia artificial para crear melodías sinfónicas es un avance apasionante en la convergencia de la tecnología y la creatividad musical.
El método utilizado en este proyecto se basa en algoritmos de aprendizaje automático y genera notas individuales utilizando una red neuronal recurrente (RNN) con arquitectura LSTM, que ha demostrado ser eficaz en la generación autónoma de música a partir de archivos MIDI. El protocolo de comunicación MIDI se ha utilizado eficazmente para generar sonido y crear archivos de música.