
Este es otro artículo de una serie de artículos de capacitación para desarrolladores en el campo de la inteligencia artificial. En artículos anteriores, examinamos la recopilación y preparación de datos con imágenes, en este artículo continuaremos la discusión sobre la recopilación y el estudio de datos musicales.
El propósito de este proyecto es:
- Cree una aplicación que acepte un conjunto de imágenes como entrada.
- Enfatizando el colorido emocional de las imágenes.
- Recibir la salida de una pieza musical que refleja la emoción correspondiente.
Este proyecto utiliza para generar música modulada con la ayuda de las emociones, un algoritmo (transformación musical basada en las emociones), que realiza un cambio en la melodía básica de acuerdo con una emoción específica y la posterior armonización y finalización de la melodía utilizando el modelo de aprendizaje profundo. Para completar esta tarea, se requieren los siguientes conjuntos de datos de música:
- Un conjunto de datos para aprender el algoritmo de finalización de la melodía (corales de Bach).
- Un conjunto de canciones populares que sirven como plantillas para modular las emociones.
Recopilación y estudio de un conjunto de datos musicales.
Bach Chorales - Proyecto Music21
Music21 es un kit de herramientas basado en Python para la ciencia de la música que usa una computadora. Contiene una colección completa de coros de Bach como parte de sus obras recopiladas. Por lo tanto, el procedimiento de recopilación de datos es muy simple: solo necesita instalar el paquete
music21 (los manuales están disponibles para macOS *, Windows * y Linux *).
Después de la instalación, se puede obtener acceso a los corales de Bach utilizando el siguiente código:
from music21 import corpus for score in corpus.chorales.Iterator(numberingSystem='bwv', returnType='stream'): pass
Iteración sobre todos los coros de BachComo alternativa, puede usar el siguiente código: devuelve una lista de nombres de archivo para todos los corales de Bach, que pueden procesarse aún más utilizando la función de análisis:
from music21 import corpus chorales = corpus.getBachChorales() score = corpus.parse(chorales[0])
Recuperando una lista de todos los corales de BachExploración de datos.
Después de completar la recopilación de datos (en este caso, después de obtener acceso a ella), el siguiente paso es verificar y estudiar los signos de estos datos.
El siguiente código muestra la representación de texto de un archivo de música:
>>> from music21 import corpus
>>> chorales = corpus.getBachChorales()
>>> score = corpus.parse(chorales[0])
>>> score.show('text')
{0.0} <music21.text.TextBox "BWV 1.6 W...">
{0.0} <music21.text.TextBox "Harmonized...">
{0.0} <music21.text.TextBox "PDF 2004 ...">
{0.0} <music21.metadata.Metadata object at 0x117b78f60>
{0.0} <music21.stream.Part Horn 2>
{0.0} <music21.instrument.Instrument P1: Horn 2: Instrument 7>
{0.0} <music21.stream.Measure 0 offset=0.0>
{0.0} <music21.layout.PageLayout>
{0.0} <music21.clef.TrebleClef>
{0.0} <music21.key.Key of F major>
{0.0} <music21.meter.TimeSignature 4/4>
{0.0} <music21.note.Note F>
{1.0} <music21.stream.Measure 1 offset=1.0>
{0.0} <music21.note.Note G>
{0.5} <music21.note.Note C>
{1.0} <music21.note.Note F>
{1.5} <music21.note.Note F>
{2.0} <music21.note.Note A>
{2.5} <music21.note.Note F>
{3.0} <music21.note.Note A>
{3.5} <music21.note.Note C>
{5.0} <music21.stream.Measure 2 offset=5.0>
{0.0} <music21.note.Note F>
{0.25} <music21.note.Note B->
{0.5} <music21.note.Note A>
{0.75} <music21.note.Note G>
{1.0} <music21.note.Note F>
{1.5} <music21.note.Note G>
{2.0} <music21.note.Note A>
{3.0} <music21.note.Note A>
{9.0} <music21.stream.Measure 3 offset=9.0>
{0.0} <music21.note.Note F>
{0.5} <music21.note.Note G>
.
.
.
>>> print(score)
<music21.stream.Score 0x10bf4d828>
Representación textual del coralArriba se muestra la representación textual del coral como un objeto
music21.stream .Score. Es interesante aprender cómo music21 representa la música en código, pero no es muy útil en términos de estudiar atributos de datos importantes. Por lo tanto, necesitamos un software que pueda mostrar la puntuación.
Como se indicó anteriormente en el artículo
Configuración del modelo y los hiperparámetros para reconocer las emociones en las imágenes , la puntuación en music21 se almacena en archivos MusicXML * (con extensiones .xml o .mxl). Para ver estos archivos en notación musical, se utiliza la aplicación gratuita Finale NotePad * 2 (versión de prueba del paquete profesional Finale * para trabajar con notación musical).
Finale NotePad está disponible para Mac y Windows. Después de descargar Finale Notepad, ejecute el siguiente código para configurar music21 para que funcione con Finale Notepad:
>>> import music21
>>> music21.configure.run()
Ahora podemos ejecutar el código anterior, pero use el fragmento
score.show () en lugar de
score.show ('text') . En este caso, el archivo MusicXML se abrirá en la aplicación Finale, que se ve así:
La primera página de Bach en notación musicalEste formato proporciona una presentación visual más clara para los corales. Al examinar varios corales, nos aseguramos de que los datos cumplan nuestras expectativas: son piezas musicales cortas que contienen al menos cuatro partes (soprano, viola, tenor y bajo), divididas en frases separadas por medio de granjas.
Típicamente, ciertas estadísticas descriptivas se calculan como parte del procedimiento de estudio de datos. En este caso, podemos determinar cuántas veces aparece cada clave en los trabajos recopilados. El siguiente es un ejemplo de un código que le permite calcular y visualizar la calificación de utilización de cada clave en un conjunto de datos.
from music21 import* import matplotlib.pyplot as plt chorales = corpus.getBachChorales() dict = {} for chorale in chorales: score = corpus.parse(chorale) key = score.analyze('key').tonicPitchNameWithCase dict[key] = dict[key] + 1 if key in dict.keys() else 1 ind = [i for i in range(len(dict))] fig, ax = plt.subplots() ax.bar(ind, dict.values()) ax.set_title('Frequency of Each Key') ax.set_ylabel('Frequency') plt.xticks(ind, dict.keys(), rotation='vertical') plt.show()
Frecuencia de uso de cada clave en trabajos recopilados. Las teclas menores se representan con letras minúsculas, y las teclas principales se representan con letras minúsculas. Los pisos se indican con un "-"A continuación se presentan algunas estadísticas relacionadas con los trabajos recopilados.
La distribución de claves usadas en un conjunto de composiciones.
Ubicación de las notas, calculadas como la compensación desde el comienzo de la medida en las notas negrasLas estadísticas descriptivas de interés para el cálculo variarán para cada proyecto. Sin embargo, en la mayoría de los casos, puede ayudarlo a determinar con qué tipo de datos está trabajando e incluso administrar ciertas acciones durante el preprocesamiento de datos. Estas estadísticas también pueden servir como punto de partida para examinar los resultados del preprocesamiento de datos.
Transformación musical - Información teórica
Hay dos portadores principales de expresión en la música: tono y ritmo. Utilizamos estos medios de expresión como parámetros para reescribir nuestra melodía en el estado de ánimo elegido.
En teoría musical, cuando se trata del tono de los sonidos en una melodía, la relación de las alturas entre las notas está implícita. Un sistema de notas musicales basado en una secuencia de sonidos de cierto tono se llama escala. Los intervalos o la medida del ancho de cada paso de la secuencia pueden diferir entre sí. Tal diferencia o su ausencia crea una relación entre tonos y tendencias melódicas en las que las combinaciones estables y las gravitaciones crean una expresión de humor. En la tradición musical occidental, cuando se trata de una escala diatónica simple, la posición de la nota con respecto a la primera nota de la escala se llama
etapa de la escala (I-II-III-IV-V-VI-VII). De acuerdo con combinaciones estables y gravitaciones, la escala de la escala proporciona un tono musical que realiza su función en el sistema. Esto hace que la noción de una etapa de escala sea muy útil para analizar un patrón melódico simple y codificarlo con la posibilidad de asignar diferentes valores.
En el nivel inicial, debemos elegir las escalas adecuadas desde un punto de vista artístico para crear un estado de ánimo específico. Por lo tanto, si necesitamos cambiar el estado de ánimo de la melodía, debemos estudiar su estructura funcional utilizando la noción descrita de la escala, y luego asignar nuevos valores a la plantilla existente a partir de los pasos de la escala. Al igual que el mapa, esta plantilla también contiene información sobre las direcciones y los períodos en la melodía.
Para cada estado de ánimo específico, utilizamos algunos parámetros adicionales para hacer que nuestras nuevas melodías sean más expresivas, armoniosas y expresivas.
El ritmo es una forma de organizar los sonidos a tiempo. Incluye información como: el orden de aparición de los tonos en la melodía, su longitud relativa, pausas entre ellos y varios acentos. Por lo tanto, se crean períodos de tiempo para estructurar el tamaño musical. Si necesitamos preservar el patrón melódico original, entonces debemos preservar su estructura rítmica. Para lograr este objetivo solo es necesario cambiar algunos parámetros de ritmo, la duración de las notas y las pausas, y esto debería ser suficiente desde un punto de vista artístico. Además, para hacer que nuestra melodía modificada sea más expresiva, podemos usar algunos métodos adicionales para enfatizar su estado de ánimo.
Por ejemplo, ANSIEDAD se puede expresar con una clave menor y un ritmo más enérgico. La plantilla para nuestra escala original es la siguiente: VV-VI-VI-VII VV-VI-V-II-I VVV (transición una octava más alta) -III-I-VII-VI IV-IV-III-I-II-I .
Plantilla fuenteLa melodía original está escrita en una clave mayor, que difiere de una menor en tres notas: en la clave principal de las etapas III, VI y VII son mayores (medio tono arriba), y en una clave menor, un menor (medio tono abajo). Por lo tanto, si necesitamos cambiar la tonalidad utilizada, solo necesitamos reemplazar los pasos superiores por los inferiores (o viceversa). Sin embargo, para crear un efecto aún más prominente de ansiedad, es necesario abandonar la etapa VII de una mayor (mayor); esto aumentará la inestabilidad de este tono y enfatizará nuestra escala de una manera especial.
Para hacer que el ritmo sea más enérgico, podemos agregarle un síncope o una interrupción sincópica del movimiento del ritmo regular, cambiando la posición de algunas notas. En este caso, avanzaremos algunas notas similares un latido hacia adelante.
Ansiedad de conversiónLa tristeza también se puede expresar con una simple tecla menor, pero su ritmo debe ser tranquilo. Por lo tanto, reemplazamos los pasos principales con los menores, incluido el paso VII. Para hacer que el ritmo sea más relajado, debe completar las pausas aumentando la longitud de las notas delante de ellas.
Conversión SADPara expresar BENDICIÓN, debemos evitar entonaciones decisivas y estrictas: este será el principio de la transformación correspondiente. Como puede ver, de acuerdo con las diferencias en la secuencia de sonidos utilizados, los pasos de la escala tienen diferentes significados y la distancia desde el primer paso (I). Por lo tanto, su importancia se crea en la imagen general. Por lo tanto, el movimiento desde la etapa IV a la etapa I es muy sencillo debido a su función. La entonación al pasar de la etapa V a la etapa I también suena muy sencilla. Evitaremos estas dos entonaciones para crear una impresión de espacio e incertidumbre.
Por lo tanto, en cada elemento de la plantilla, en la que la etapa I sigue a la etapa V, o la etapa IV sigue a la etapa IV, y también en el orden inverso de estos pasos, reemplazaremos una de estas notas (o ambas notas) con los pasos más cercanos a ellos. Puede cambiar el ritmo de forma similar a crear el efecto de GRUSH, simplemente reduciendo el ritmo.
Convertir BENDICIONLa DECISIÓN está asociada con un movimiento poderoso, por lo que la forma más sencilla de mostrarlo es cambiar el ritmo de forma similar al cambio para el efecto ANSIEDAD. También es necesario reducir la duración de todas las notas, excepto para cada última nota de cada período, VV-VI-VI-VII VV-VI-V-II-I.
DECISIÓN DE TRANSFORMACIÓNLa clave principal en sí misma suena positiva y alegre, sin embargo, para enfatizar y expresar FELICIDAD / ALEGRÍA, utilizamos la clave pentatónica principal. Consiste en los mismos pasos, con la excepción de dos de ellos: el cuarto y el séptimo, I-II-III-V-VI.
Por lo tanto, cada vez que encontramos estos dos pasos en nuestra plantilla, los reemplazamos con los pasos más cercanos a ellos. Para enfatizar la simplicidad proporcionada por nuestra tonalidad, utilizamos un fragmento melódico descendente que consta de cinco o más notas como una demostración paso a paso de nuestra escala.
Convirtiendo ALEGRÍATranquilidad / Tranquilidad se puede expresar no solo cambiando la tonalidad, sino que también requiere la transformación del movimiento melódico. Para hacer esto, debe analizar la plantilla de origen y seleccionar segmentos similares en ella. La primera nota de cada segmento determina el contexto armónico de toda la frase, por lo que estas notas son de gran valor para nosotros:
V -
V -VI-VI-VII-VII
V -V-VI-V-II-I
V -VV-III-I-VII-VI IV-IV-III-I-II-I.
Para el primer segmento, solo se deben utilizar los siguientes pasos: IV-VI-VII; para el segundo: V-VII-II-I; para el tercero: VI-VII-III-II; para el cuarto: VII-IV-I-VII.
Estos conjuntos de pasos posibles son en realidad otro tipo de estructura musical, los acordes. Sin embargo, aún podemos usarlos como un sistema para convertir melodías. Los pasos de la escala se pueden reemplazar por los pasos más cercanos a ellos desde los patrones de acordes indicados. Si todo el segmento comienza con un tono que es más bajo que el original, entonces es necesario reemplazar todos los pasos en él con los pasos más bajos que están disponibles en la plantilla especificada. Para crear un efecto de retraso, también es necesario dividir la duración de cada nota en corcheas y reducir gradualmente la velocidad de estas nuevas corcheas.
Conversión Tranquilidad / TranquilidadPara enfatizar GRATITUD, es necesario usar su despliegue estilístico en ritmo, creando el efecto de arpegio: volvemos a la primera nota al final de cada segmento (frase). Es necesario reducir a la mitad la duración de cada última nota en un segmento y colocar allí la primera nota de este segmento.
Conversión GRATITUDParte práctica
Python y music21 toolkit
El script de transformación se implementó utilizando el lenguaje Python y el kit de herramientas music21.
Music21 es una clase muy versátil y de alto nivel para manipular conceptos musicales tales como: notas, tamaño, acordes, tonalidad, etc. Le permite realizar operaciones directamente en el área temática, en lugar de manipulaciones de bajo nivel con datos sin procesar de un archivo Interfaz digital de instrumentos musicales (MIDI). Sin embargo, el trabajo directo con archivos MIDI en music21 no siempre es conveniente, especialmente cuando se trata de visualizar la partitura. Por lo tanto, para la visualización e implementación del algoritmo, una forma más conveniente es convertir los archivos MIDI de origen al formato musicXML. Además, el formato musicXML es el formato de entrada para BachBot, que representa el siguiente paso en nuestra secuencia de procesamiento.
La conversión se puede hacer usando Musescore:
para obtener la salida del archivo musicXML:
musescore input.mid -o output.xml
para obtener la salida de un archivo MIDI:
musescore input.mid -o output.mid
Jupyter
El kit de herramientas music21 está bien integrado con la aplicación Jupyter. Además, la integración con Musescore le permite visualizar la partitura directamente en el documento del cuaderno Jupyter y escuchar los resultados a través del reproductor incorporado durante el desarrollo y la experimentación.
Documento de cuaderno Jupyter con código, puntaje y jugadorLa función Score Show es especialmente útil para el trabajo en equipo de un programador y un músico-teórico. La combinación de la naturaleza interactiva de Jupyter, el dominio específico de la música21 y la simplicidad de Python hacen que este flujo de trabajo sea particularmente prometedor para este tipo de investigación interdisciplinaria.
Implementación
El script de transformación se implementó como un módulo de Python, por lo que permite una llamada directa:
python3 emotransform.py --emotion JOY input.mid
O puede llamarlo a través de un script externo (o Jupyter):
from emotransform import transform transform('input.mid','JOY')
En ambos casos, el resultado del trabajo será un archivo modulado con cierta emoción.
Las transformaciones asociadas con los cambios en los pasos musicales (ANSIEDAD, TRISTE, BENDICIÓN y ALEGRÍA) se basan en el uso de la función music21.Note.transpose en combinación con un análisis de la posición actual y requerida de los pasos musicales. Aquí usamos el módulo music21.scale y sus funciones para construir la escala requerida de cualquier tónico. Para obtener el tónico de una melodía específica, puede usar
la función de análisis ('clave') del módulo music21.Stream7.
Para las conversiones basadas en frases (DECISIÓN, GRATITUD, Tranquilidad / Tranquilidad), se requiere investigación adicional. Este estudio nos permitirá detectar con precisión el comienzo y el final de las frases musicales.
Conclusión
En este artículo, presentamos la idea principal que subyace a la transformación musical basada en las emociones: cambiar la posición de una sola nota en la escala en relación con el tónico (paso musical), el tempo de la pieza, así como la frase musical. Esta idea fue implementada como un script en Python. Sin embargo, la implementación de ideas teóricas en el mundo real no siempre es fácil, por lo que encontramos algunas dificultades e identificamos posibles direcciones para futuras investigaciones. Este estudio está relacionado principalmente con la detección de frases musicales y sus transformaciones. La elección correcta de instrumentos (música21) y la investigación en el campo de la información musical son factores clave para resolver tales problemas.
La transformación musical basada en las emociones representa la primera etapa en nuestra secuencia de procesamiento de datos musicales, la siguiente etapa es la presentación de la melodía convertida y preparada a la entrada de BachBot.