AI, curso prático. Transformação da Música Baseada na Emoção



Este é outro artigo de uma série de artigos de treinamento para desenvolvedores no campo da inteligência artificial. Em artigos anteriores, examinamos a coleta e a preparação de dados com imagens; neste artigo, continuaremos a discussão sobre a coleta e o estudo de dados musicais.

O objetivo deste projeto é:

  • Crie um aplicativo que aceite um conjunto de imagens como entrada.
  • Enfatizando a coloração emocional das imagens.
  • Receber a saída de uma peça musical que reflete a emoção correspondente.


Este projeto utiliza para gerar música modulada com a ajuda de emoções, um algoritmo (Transformação musical baseada em emoções), que realiza uma mudança na melodia básica de acordo com uma emoção específica e a subsequente harmonização e conclusão da melodia usando o modelo de aprendizado profundo. Para concluir esta tarefa, os seguintes conjuntos de dados de música são necessários:
  • Um conjunto de dados para aprender o algoritmo de conclusão de melodia (corais de Bach).
  • Um conjunto de músicas populares que servem como modelos para modular emoções.

Coleta e estudo de um conjunto de dados musicais


Bach Chorales - projeto Music21


Music21 é um kit de ferramentas baseado em Python para ciência da música usando um computador. Ele contém uma coleção completa dos coros de Bach como parte de suas obras coletadas. Portanto, o procedimento de coleta de dados é muito simples - você só precisa instalar o pacote music21 (os manuais estão disponíveis para o macOS *, Windows * e Linux *).
Após a instalação, o acesso às corais de Bach pode ser obtido usando o seguinte código:

from music21 import corpus for score in corpus.chorales.Iterator(numberingSystem='bwv', returnType='stream'): pass # do stuff with scores here 

Iteração sobre todos os coros de Bach

Como alternativa, você pode usar o seguinte código: ele retorna uma lista de nomes de arquivos para todas as corais de Bach, que podem ser processados ​​posteriormente usando a função de análise:

 from music21 import corpus chorales = corpus.getBachChorales() score = corpus.parse(chorales[0]) # do stuff with score 

Recuperando uma lista de todos os corais de Bach

Exploração de dados


Depois de concluir a coleta de dados (neste caso, após obter acesso a ela), o próximo passo é verificar e estudar os sinais desses dados.

O código a seguir exibe a representação de texto de um arquivo 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>

Representação de texto do coral

Acima está uma exibição da representação textual do coral como um objeto music21.stream .Score. É interessante aprender como a música21 representa a música no código, mas não é muito útil em termos de estudo de atributos importantes de dados. Portanto, precisamos de um software que possa exibir a pontuação.

Conforme mencionado anteriormente no artigo Configurando o modelo e os hiperparâmetros para reconhecer emoções nas imagens , a partitura na música21 é armazenada nos arquivos MusicXML * (com extensões .xml ou .mxl). Para visualizar esses arquivos em notação musical, é usado o aplicativo Finale NotePad * 2 gratuito (versão de avaliação do pacote profissional Finale * para trabalhar com notação musical). O Finale NotePad está disponível para Mac e Windows. Depois de baixar o Finale Notepad, execute o seguinte código para configurar o music21 para funcionar com o Finale Notepad:

>>> import music21
>>> music21.configure.run()


Agora podemos executar o código acima, mas use o fragmento score.show () em vez de score.show ('text') . Nesse caso, o arquivo MusicXML será aberto no aplicativo Finale, mais ou menos assim:


Primeira página de Bach em notação musical

Este formato fornece uma apresentação visual mais clara para corais. Ao examinar vários corais, garantimos que os dados atendam às nossas expectativas: são pequenas peças musicais contendo pelo menos quatro partes (soprano, viola, tenor e baixo), divididas em frases separadas por meio de fazendas.

Normalmente, certas estatísticas descritivas são computadas como parte do procedimento de estudo de dados. Nesse caso, podemos determinar quantas vezes cada chave aparece nos trabalhos coletados. A seguir, é apresentado um exemplo de código que permite calcular e visualizar a classificação de utilização de cada chave em um conjunto de dados.

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


Frequência de uso de cada chave nos trabalhos coletados. As teclas secundárias são representadas por letras minúsculas e as principais são representadas por letras minúsculas. Os apartamentos são indicados por um "-"

Abaixo estão algumas estatísticas relacionadas aos trabalhos coletados.


A distribuição de chaves usadas em um conjunto de composições


Localização das notas, calculadas como o deslocamento desde o início da medida em semínimas

As estatísticas descritivas de interesse para o cálculo variarão para cada projeto. No entanto, na maioria dos casos, pode ajudá-lo a descobrir com que tipo de dados você está trabalhando e até gerenciar certas ações durante o pré-processamento de dados. Essas estatísticas também podem servir como ponto de partida para examinar os resultados do pré-processamento de dados.

Transformação Musical - Informação Teórica


Existem duas principais transportadoras de expressão na música - tom e ritmo. Usamos esses meios de expressão como parâmetros para reescrever nossa melodia no clima escolhido.

Na teoria musical, quando se trata da afinação de sons em uma melodia, está implícita a relação das alturas entre as notas. Um sistema de notas musicais baseado em uma sequência de sons de um determinado tom é chamado de escala. Os intervalos ou medidas da largura de cada etapa da sequência podem diferir entre si. Tal diferença ou sua ausência cria uma relação entre tons e tendências melódicas, nas quais combinações e gravitações estáveis ​​criam uma expressão de humor. Na tradição musical ocidental, quando se trata de uma escala diatônica simples, a posição da nota em relação à primeira nota da escala é chamada de estágio da escala (I-II-III-IV-V-VI-VII). De acordo com combinações e gravitações estáveis, a escala da escala fornece um tom musical que executa sua função no sistema. Isso torna a noção de um estágio de escala muito útil para analisar um padrão melódico simples e codificá-lo com a possibilidade de atribuir valores diferentes.

No nível inicial, precisamos escolher as escalas que são adequadas do ponto de vista artístico para criar qualquer humor específico. Portanto, se precisarmos alterar o humor da melodia, devemos estudar sua estrutura funcional usando a noção descrita da escala e, em seguida, atribuir novos valores ao modelo existente a partir das etapas da escala. Como o mapa, este modelo também contém informações sobre as direções e períodos da melodia.

Para cada humor específico, usamos alguns parâmetros adicionais para tornar nossas novas melodias mais expressivas, harmoniosas e expressivas.

O ritmo é uma maneira de organizar os sons no tempo. Inclui informações como: a ordem de aparecimento dos tons na melodia, seu comprimento relativo, pausas entre eles e vários sotaques. Assim, períodos de tempo são criados para estruturar o tamanho da música. Se precisarmos preservar o padrão melódico original, devemos preservar sua estrutura rítmica. Para atingir esse objetivo, é necessário alterar apenas alguns parâmetros de ritmo - a duração das notas e pausas - e isso deve ser suficiente do ponto de vista artístico. Além disso, para tornar nossa melodia modificada mais expressiva, podemos usar alguns métodos adicionais para enfatizar seu humor.

Por exemplo, ANSIEDADE pode ser expressa com uma tecla menor e um ritmo mais energético. O modelo para nossa escala original é o seguinte: VV-VI-VI-VII VV-VI-V-II-I VVV (transição uma oitava acima) -III-I-VII-VI IV-IV-III-I-II-I .


Modelo de origem

A melodia original é escrita em uma tecla principal, que difere de uma menor em três notas - na chave principal dos estágios III, VI e VII são principais (meio tom acima) e em uma chave menor - um menor (meio tom abaixo). Portanto, se precisarmos alterar a tonalidade usada, basta substituir os passos mais altos pelos mais baixos (ou vice-versa). No entanto, para criar um efeito ainda mais proeminente da ansiedade, é necessário deixar o VII estágio de um maior (aumentado) - isso aumentará a instabilidade desse tom e enfatizará nossa escala de maneira especial.

Para tornar o ritmo mais enérgico, podemos adicionar uma síncope ou interrupção sincronizada do movimento regular do ritmo, alterando a posição de algumas notas. Nesse caso, moveremos algumas notas semelhantes uma batida para frente.


Ansiedade de conversão

A tristeza também pode ser expressa com uma simples tecla menor, mas seu ritmo deve ser calmo. Assim, substituímos as etapas principais por secundárias, incluindo a etapa VII. Para tornar o ritmo mais relaxado, é necessário preencher as pausas aumentando o comprimento das notas na frente delas.


DAU de conversão

Para expressar a BÊNÇÃO, devemos evitar entonações decisivas e estritas - este será o princípio da transformação correspondente. Como você pode ver, de acordo com as diferenças na sequência de sons utilizados, os passos da escala têm significados diferentes e a distância do primeiro (I) passo. Assim, seu significado é criado no quadro geral. Portanto, o movimento do estágio IV para o estágio I é muito direto devido à sua função. A entonação ao passar do estágio V para o estágio I também parece muito direta. Evitaremos essas duas entonações para criar uma impressão de espaço e incerteza.

Portanto, em cada elemento do modelo, no qual o estágio I segue o estágio V ou o estágio IV segue o estágio IV, e também na ordem inversa dessas etapas, substituiremos uma dessas notas (ou ambas as notas) pelas etapas mais próximas a elas. Você pode alterar o ritmo de maneira semelhante à criação do efeito do GRUSH - simplesmente reduzindo o ritmo.


Convertendo o BLESS

DECISÃO está associada a um movimento poderoso, portanto, a maneira mais simples de mostrá-lo é alterar o ritmo de maneira semelhante à mudança para o efeito ANSIEDADE. Também é necessário reduzir a duração de todas as notas, exceto a última nota de cada período, VV-VI-VI-VII VV-VI-V-II-I.


Transformação DECISÃO

A chave principal em si mesma parece positiva e alegre, no entanto, para enfatizar e expressar FELICIDADE / ALEGRIA, usamos a chave pentatônica principal. Consiste nas mesmas etapas, com exceção de duas delas - a quarta e a sétima, I-II-III-V-VI.

Portanto, sempre que encontramos essas duas etapas em nosso modelo, as substituímos pelas etapas mais próximas a elas. Para enfatizar a simplicidade proporcionada por nossa tonalidade, usamos um fragmento melódico descendente que consiste em cinco ou mais notas como uma demonstração passo a passo de nossa escala.


Convertendo ALEGRIA

Tranquilidade / Tranquilidade pode ser expressa não apenas mudando a tonalidade, mas também requer a transformação do movimento melódico. Para fazer isso, você precisa analisar o modelo de origem e selecionar segmentos semelhantes. A primeira nota de cada segmento determina o contexto harmônico de toda a frase, de modo que essas notas são de maior valor para nós: V - V -VI-VI-VII-VII-VII V -V-VI-V-II-I V -VV-III-I-VII-VI IV-IV-III-I-II-I.

Para o primeiro segmento, apenas as seguintes etapas devem ser usadas: IV-VI-VII; para o segundo: V-VII-II-I; para o terceiro: VI-VII-III-II; para a quarta: VII-IV-I-VII.

Esses conjuntos de etapas possíveis são na verdade outro tipo de estrutura musical, acordes. No entanto, ainda podemos usá-los como um sistema para converter melodias. As etapas da escala podem ser substituídas pelas etapas mais próximas a partir dos padrões de acordes indicados. Se o segmento inteiro começar com um tom mais baixo que o original, será necessário substituir todas as etapas nele pelas mais baixas disponíveis no modelo especificado. Para criar um efeito de atraso, também é necessário dividir a duração de cada nota em colcheias e reduzir gradualmente a velocidade dessas novas colcheias.


Tranquilidade de Conversão / Tranquilidade

Para enfatizar a GRATIDÃO, é necessário usar sua exibição estilística no ritmo, criando o efeito arpejo: retornamos à primeira nota no final de cada segmento (frase). É necessário reduzir pela metade a duração de cada última nota em um segmento e colocar a primeira nota nesse segmento.


Conversão GRATITUDE

Parte prática


Kit de ferramentas Python e music21


O script de transformação foi implementado usando a linguagem Python e o kit de ferramentas music21.

Music21 é uma classe muito versátil e de alto nível para manipular conceitos musicais como notas, tamanho, acordes, tonalidade etc. Permite executar operações diretamente na área de assunto, em vez de manipulações de baixo nível com dados brutos de um arquivo Interface de instrumento musical digital (MIDI). No entanto, o trabalho direto com arquivos MIDI na música21 nem sempre é conveniente, especialmente quando se trata de visualizar a partitura. Portanto, para visualização e implementação do algoritmo, uma maneira mais conveniente é converter os arquivos MIDI de origem no formato musicXML. Além disso, o formato musicXML é o formato de entrada para o BachBot, que representa o próximo passo na nossa sequência de processamento.
A conversão pode ser feita usando o Musescore:
para obter a saída do arquivo musicXML:

musescore input.mid -o output.xml
para obter a saída de um arquivo MIDI:

musescore input.mid -o output.mid

Jupyter


O kit de ferramentas music21 está bem integrado ao aplicativo Jupyter. Além disso, a integração com o Musescore permite exibir a pontuação diretamente no documento do notebook Jupyter e ouvir os resultados através do player incorporado durante o desenvolvimento e a experimentação.


Documento de caderno Jupyter com código, pontuação e jogador

A função Score Show é especialmente útil para o trabalho em equipe de um programador e um músico-teórico. A combinação da natureza interativa de Jupyter, domínio específico da música21, e a simplicidade do Python tornam esse fluxo de trabalho particularmente promissor para esse tipo de pesquisa interdisciplinar.

Implementação


O script de transformação foi implementado como um módulo Python, portanto, permite uma chamada direta:

python3 emotransform.py --emotion JOY input.mid
Ou você pode chamá-lo através de um script externo (ou Jupyter):

from emotransform import transform transform('input.mid','JOY')
Nos dois casos, o resultado do trabalho será um arquivo modulado com uma certa emoção.

As transformações associadas às mudanças nos passos musicais - ANSIEDADE, TRISTEZA, BÊNÇÃO e ALEGRIA - baseiam-se no uso da função music21.Note.transpose em combinação com uma análise da posição atual e requerida dos passos musicais. Aqui, usamos o módulo music21.scale e suas funções para criar a escala necessária a partir de qualquer tônico. Para obter o tônico de uma melodia específica, você pode usar a função de análise ('tecla') do módulo music21.Stream7.

Para conversões baseadas em frases - DECISÃO, GRATIDÃO, Tranquilidade / Tranquilidade - são necessárias pesquisas adicionais. Este estudo nos permitirá detectar com precisão o início e o fim das frases musicais.

Conclusão


Neste artigo, apresentamos a ideia principal subjacente à transformação musical baseada nas emoções - alterando a posição de uma única nota na escala relativa ao tônico (passo musical), o andamento da peça e a frase musical. Essa ideia foi implementada como um script em Python. No entanto, a implementação de idéias teóricas no mundo real nem sempre é fácil, então encontramos algumas dificuldades e identificamos possíveis direções para pesquisas futuras. Este estudo está relacionado principalmente à detecção de frases musicais e suas transformações. A escolha certa de instrumentos (música21) e a pesquisa no campo da informação musical são fatores-chave para resolver esses problemas.

A transformação musical baseada nas emoções representa o primeiro estágio de nossa sequência de processamento de dados musicais; o estágio seguinte é a submissão da melodia convertida e preparada à entrada do BachBot.

Source: https://habr.com/ru/post/pt423303/


All Articles