IA Aplicada À Transcrição de Acordes de Violão
IA Aplicada À Transcrição de Acordes de Violão
IA Aplicada À Transcrição de Acordes de Violão
SÃO PAULO
2021
ALAN BELEM SANTOS
SÃO PAULO
2021
Agradecimentos
Agradecemos também aos nossos professores do IFSP: Ricardo Pires por ter nos
passados ótimas aulas, o que nos levou ao tema do nosso trabalho de conclusão de curso,
Miguel Angelo, por além de nos proporcionar aulas brilhantes e sempre ter nos
incentivado a pensar fora da caixa, também nos orientando durante esse trabalho, nos
motivando sempre a não desistir e deixando claro que alguns imprevistos são previsíveis
e que a consistência no trabalho é o que importa. Sara Dereste, por todos os esforços para
nos ensinar além do que escopo das aulas e nos tornar engenheiros críticos e conscientes.
Alexandre Brincalepe por todo incentivo e pela didática excelente e a todo o corpo
docente do IFSP que contribuíram para que possamos nos tornar os profissionais que
somos e ainda iremos ser.
In this work, we present the development of an application that uses Artificial Intelligence
tools to transcribe automatically the chords of songs that contain voice and guitar. The
songs are processed by an Artificial Neural Network that removes the vocal part, so that
the guitar can have the chords recognized by a second Neural Network. This chord
recognition network receives, as input, audio vectors processed by the Pitch Class Profile
algorithm, a signal-processing tool that extracts the relative intensity of each of the
musical notes that make up the audio. Other tools were used to convert the sample rate of
the audios, and the other processes that proved to be necessary throughout the work. The
user interface is made with a web application developed in Flask, a Python framework,
and receives as input the URL of a video from the YouTube platform that you want to
transcribe. The article also presents the results of the tests carried out and possible
solutions that could be implemented in the future to increase system performance.
Figura 1 - Análise Espectral de diferentes instrumentos tocando a nota C4 (262 Hz): (a)
Flauta Doce, (b) Piano e (c) Trompete. .......................................................................... 19
Figura 2 - Lá central puro (sem harmónicos somados) .................................................. 19
Figura 3 - Representação da topologia 4-8-4-1 de uma rede neural artificial (4 entradas, 8
e 4 neurônios nas camadas intermediárias e 1 saída). .................................................... 23
Figura 4 - Representação da função sigmoide com intervalo de [0,1]. A principal
utilização da função sigmoide é em problemas de classificação, devido ao ser fator
diferenciável. Quando a função está próxima de 0, a inclinação é máxima, e, portanto, o
resultado de sua derivada também, logo, para valores próximos de zero, o resultado será
deslocado para as extremidades do intervalo escolhido, no caso [0,1], que podem
representar duas classes diferentes. ................................................................................ 25
Figura 5 - Características (linhas verticais) desejadas sendo obtidas através da convolução
da primeira imagem com o filtro. ................................................................................... 27
Figura 6 - Características (linhas horizontais) desejadas sendo obtidas através da
convolução da primeira imagem com o filtro. ................................................................ 27
Figura 7 - Exemplo da diminuição de uma matriz do mapa de características através do
Pooling Máximo. ............................................................................................................ 28
Figura 8 - Representação de uma típica rede neural convolucional, contendo a matriz de
dados de entrada, conectadas a uma camada de convolução. O resultado da convolução é
aplicado na camada de Pooling, que servirá de entrada para a rede neural artificial. O
resultado final será a determinação de uma das classes do problema. Pode haver adição
de mais camadas de convolução e Pooling. .................................................................... 29
Figura 9 - Representação do acorde C (Dó Maior) para Violão e Piano pelo vetor PCP31
Figura 10 - Conversão dos parâmetros de um áudio .wav.............................................. 34
Figura 11 - Fluxograma do sistema desenvolvido .......................................................... 35
Figura 12 - Fluxograma de etapas do Processamento Interno do sistema ...................... 36
Figura 13 - Diagrama de funcionamento da RNA para remoção de vocais em uma música
genérica. O sinal contendo a voz e os instrumentos é separado em dois arquivos diferentes.
........................................................................................................................................ 38
Figura 14 - Etapas do pré-processamento dos dados na etapa de treinamento............... 41
Figura 15 - Layout da Página Inicial da Aplicação Web ................................................ 43
Figura 16 - Página de Exibição dos Resultados ............................................................. 44
Figura 17 - Exemplo de matriz para o cálculo do LCS de 4 elementos para as sequencias
A = abcdbb e B = cbacbaaba .......................................................................................... 45
Figura 18 - Gráfico de um acorde de Lá maior (A)por intensidade, gerado pelo PCP. . 48
Figura 19 - Matriz de confusão da topologia escolhida.................................................. 49
Figura 20 - Gráfico do Sinal de Áudio Completo x Tempo. .......................................... 50
Figura 21 - Gráfico do Sinal Instrumental x Tempo. ..................................................... 51
Figura 22 - Gráfico do Sinal Vocal x Tempo. ................................................................ 51
LISTA DE TABELAS
CD – Compact Disc
Hz – Hertz
s – Segundos
1 Introdução ..............................................................................................................14
2 Objetivo ..................................................................................................................17
3.4.2 Flask.......................................................................................................... 32
4 Metodologia ............................................................................................................35
5 Resultados ..............................................................................................................47
5.3 Resultados dos Testes com a RNA para Remoção dos Vocais ....................... 50
6 Conclusão ...............................................................................................................55
7 Referências .............................................................................................................57
1 INTRODUÇÃO
O fascínio do ser humano pela música é algo inato, tendo se demonstrado essencial em
praticamente todas as culturas (CRUZ, 2008). Neste contexto, o violão se consolidou como um
dos instrumentos mais populares na música ocidental, sendo portátil, acessível e permitindo
uma vasta gama de interpretações musicais, dispondo de notações como a tablatura, para
sequências melódicas e as cifras para sequências de acordes (BARBANCHO et al., 2011).
Contudo, o processo de se registrar músicas em uma linguagem simbólica, de forma a
possibilitar sua posterior reprodução, chamado de transcrição musical, se mostra um problema
complexo, mesmo para especialistas, por exigir a extração de informações como acordes e tom
apenas ouvindo a música (RAMOS, 2015).
Assim como vem ocorrendo em outras áreas do conhecimento, é natural que se busque
a aplicação de ferramentas computacionais integradas a processos musicais. Essas aplicações
deram origem a uma área de pesquisa conhecida como Recuperação de Informações Musicais,
do inglês, Music Information Retrieval (MIR), que vem evoluindo desde a década de 1960,
tendo se tornado uma área multidisciplinar que faz uso de modelos computacionais para extrair
informações de músicas de maneira automática (HAAS, 2012).
Entre as técnicas mais populares para a execução de músicas no violão, está a de utiliza-
lo para o acompanhamento das músicas, ao tocar uma sequência de acordes que acompanha
uma melodia principal, executada na voz, por exemplo (BARBANCHO et al., 2011). O
reconhecimento automático de acordes também está entre os principais focos de estudo para a
área de MIR (HAAS, 2012).
Um acorde pode ser definido como um conjunto de notas musicais executadas
simultaneamente (MED, 1996). Essa definição pode ser apropriada na musicologia, mas se
torna vaga para uma perspectiva de classificação automática por não levar em consideração
fatores como tipo de instrumento, intensidade do som, nível de ruído, entre outros
(OSMALSKY et al., 2012).
O chamado Perfil de Classes de Altura, do inglês, Pitch Class Profile (PCP), é uma das
técnicas para a descrição automática de acordes musicais mais utilizadas, sendo uma
representação da contribuição relativa de cada nota musical em um determinado sinal de áudio
(FUJISHIMA, 1999). Apesar de se mostrar uma boa ferramenta de descrição dos acordes,
muitos estudos têm demostrado que a acurácia do algoritmo PCP oscila em função de variáveis
como instrumento musical utilizado, intensidade sonora e dinâmica musical do áudio a ser
classificado. Por esse motivo, algumas abordagens mais recentes têm utilizado combinações do
algoritmo PCP com técnicas de Inteligência Artificial (OSMALSKY et al., 2012).
As Redes Neurais Artificiais, ou RNAs compões um dos principais campos de pesquisa
da Inteligência Artificial. Baseadas nos neurônios biológicos, sendo um conjunto de modelos
matemáticos para resolução na classificação e reconhecimento de padrões (KOVACS, 1996),
as RNAs podem ser descritas como aproximadores universais de funções [CYBENKO, 1989].
Para tanto, as RNAs necessitam de um conjunto de dados rotulados para poderem ser utilizadas
em determinada tarefa, também chamado de base de dados de treinamento. Desta forma, as
técnicas que utilizam o algoritmo PCP em conjunto com Redes Neurais Artificiais necessitam
de uma base de dados contendo amostras dos acordes que se pretende reconhecer (OSMALSKY
et al., 2012).
Este trabalho tem como principal objetivo o desenvolvimento de um sistema de
reconhecimento automático de acordes musicais de violão utilizando RNAs em conjunto com
a ferramenta PCP.
Aplicar uma rede neural convolucional para filtrar e decompor a música em um arquivo
com voz separado de um arquivo com os instrumentos musicais.
Criar um modelo de transcrição automática de acordes de violão por meio de uma
abordagem que utiliza Aprendizado de Máquina.
Gerar um conjunto de dados de treinamento composto por 50 gravações por acorde de
um conjunto de 10 acordes em 4 violões diferentes, totalizando um conjunto de 2000 amostras
para uso no processo de treinamento do modelo criado.
Treinar o modelo de aprendizado de máquina com o conjunto de dados produzido e
comparar seu resultado com os resultados de outros trabalhos.
Desenvolver uma plataforma interativa capaz de receber a música a ser reconhecida por
meio de uma URL de vídeo da plataforma Youtube e exibir os acordes da transcrição de maneira
síncrona a esse vídeo, de acordo com o processamento dos dois modelo neurais (remoção de
vocais e reconhecimento de acordes).
3 FUNDAMENTAÇÃO TEÓRICA
Este capítulo irá apresentar as bases teóricas dos conceitos aplicados no
desenvolvimento deste trabalho, não tendo a finalidade de abordar os conceitos de maneira
aprofundada, mas fornecendo uma noção fundamental da teoria utilizada.
A duração é tida como o tempo de emissão das ondas sonoras ou a extensão do som
(MED, 1996).
Por fim, o timbre, também referido como cor ou textura do som, é a característica que
gera a diferenciação entre os sons produzidos por instrumentos diferentes. Diferentemente dos
outros atributos, o timbre não pode ser associado a apenas uma característica física da onda
sonora, apesar de existir uma correlação entre o timbre e o espectro da onda sonora
(SCALVENZI, 2018). A Figura 1 exemplifica as diferenças no domínio da frequência para os
instrumentos musicais flauta doce, piano e trompete executando a mesma nota.
Figura 1 - Análise Espectral de diferentes instrumentos tocando a nota C4 (262 Hz): (a) Flauta Doce, (b)
Piano e (c) Trompete.
respectivamente a sequência C, C# (ou D♭), D, D# (ou E♭), E, F, F # (ou G♭), G, G# (ou A♭),
A, A# (ou B♭) e B. Este conjunto é denominado de Oitava (MED, 1996). A Tabela 1 sumariza
a correlação entre as 12 notas musicais com suas letras alfabéticas correspondentes.
As notas que possuem o mesmo nome, mesmo estando em oitavas diferentes, soam de
forma similar, sendo essa similaridade ocasionada pela percepção logarítmica natural do ouvido
humano (PURVES et al., 2004). A relação entre as frequências de duas notas de mesmo nome
em oitavas consecutivas é de 1:2. Com isso, o intervalo de frequência entre as notas é definido
por uma progressão geométrica de forma que a frequência seja dobrada a cada sequência de 12
notas consecutivas. A razão entre os graus da Escala Igualmente Temperada é dada pela
constante r descrita na Equação (1) (VAN PROOIJEN, 1978).
12
𝑟 = √2 (1)
Pode-se definir a frequência de qualquer nota da escala musical a partir da Equação (1)
e da frequência padrão estabelecida pela norma ISO 16:1975 de 440Hz para a nota Lá 4 (A4).
A fórmula geral para o cálculo da frequência de uma nota da Escala Igualmente Temperada é
dada pela Equação (2) (VAN PROOIJEN, 1978).
𝑓𝑛 = 440 ∙ 𝑟 𝑖 (2)
Onde i é a quantidade de semitons entre a nota padrão A4 e a nota que se deseja calcular
(i será negativo caso a nota escolhida possua altura menor que A4) (VAN PROOIJEN, 1978).
C#/Db 17.32 34.65 69.3 138.59 277.18 554.37 1108.73 2217.46 4434.92
D#/Eb 19.45 38.89 77.78 155.56 311.13 622.25 1244.51 2489.02 4978.03
F#/Gb 23.12 46.25 92.5 185 369.99 739.99 1479.98 2959.96 5919.91
G#/Ab 25.96 51.91 103.83 207.65 415.3 830.61 1661.22 3322.44 6644.88
A#/Bb 29.14 58.27 116.54 233.08 466.16 932.33 1864.66 3729.31 7458.62
Nas tríades, a nota tônica, também chamada de nota fundamental, é aquela que dá o
nome ao acorde, as demais notas que compõe a tríade recebem seus nomes de acordo com o
intervalo em relação a nota tônica. Dessa forma, para acordes maiores, a distância entre tônica
e terça é de 4 semitons (terça maior), enquanto para acordes Menores, a distância entre tônica
e terça é de 3 semitons (terça menor) e para ambos os casos, a distância entre tônica e quinta é
de 7 semitons (quinta justa) (SANTANA NETO, 2015).
É frequentemente comum representar as redes diretas por camadas. Neste caso são
chamadas redes de camadas. Na camada de entrada os neurônios recebem sinais externos,
vindos da aplicação, e na camada de saída é enviado o resultado do processamento da RNA
(ZAMBIASI, 2010).
A escolha da topologia de uma rede neural artificial é, em sua maioria das vezes, um
processo complexo. Não há modelos matemáticos que forneçam a melhor topologia para
determinado problema. Portanto, é necessário realizar o treinamento da rede diversas vezes e
assim escolher a melhor topologia que se adequa ao caso específico. A Figura 3 representa a
topologia de uma rede neural genérica de 4-8-4-1, o primeiro valor, no caso 4, representa a
quantidade de neurônios na camada de entrada, em sequência estão as camadas intermediárias,
que são representadas pelos valores intermediários entre o primeiro e último algarismos, neste
exemplo sendo os números 8 e 4, e por último, a quantidade de neurônios na camada de saída
com o valor de 1.
Figura 3 - Representação da topologia 4-8-4-1 de uma rede neural artificial (4 entradas, 8 e 4 neurônios
nas camadas intermediárias e 1 saída).
Camada de Entrada (Input Layer): onde os padrões são apresentados à rede. Camadas
Intermediárias ou Escondidas (Hidden Layer): onde é feita a maior parte do processamento,
através das conexões ponderadas; podem ser consideradas como extratoras de características.
Camada de Saída (Output Layer): onde o resultado final é concluído e apresentado (DA SILVA
ASSIS, 2015). Os neurônios ficam conectados entre si e a etapa na qual eles aprendem a
reconhecer os padrões é chamada de “treinamento”.
Para efetuar a etapa de treinamento, são inseridos dados na entrada da rede e seus
resultados extraídos na saída. A saída é comparada ao valor desejado para a resposta, a cada
entrada inserida, e se computa o erro da rede, que influenciará no ajuste dos pesos. Apesar de
não haver garantias que a rede forneça uma solução ótima para o problema, este processo é
muito utilizado por apresentar soluções satisfatórias para diferentes tarefas, incluindo o
processamento de sinais com ruído (HECHT-NIELSEN, 1989), como neste trabalho.
A Equação (3) que ajusta os pesos de acordo com o aprendizado é em uma rede neural
de camada única é dada por:
A Equação 3 denota a equação de ajuste de pesos para uma rede de camada única. Para
uma rede múltiplas camadas, não há valor desejado “d” para as camadas de entrada e
intermediárias. Para compensar isso, um processo de retropropagação do erro é usado para se
obter os valores de ajustes de tais neurônios. Além disso, nas camadas intermediárias e de saída,
o valor de entrada “x” é substituído pela entrada do neurônio em questão (HECHT-NIELSEN,
1992). Vale ressaltar que a quantidade de vezes em que todos os dados do conjunto de treino
passam pela rede neural é denominada “número de épocas”.
Cada neurônio terá seu peso ajustado individualmente, além disso, este neurônio terá
seu valor de saída definido pela chamada “Função de ativação”. A função sigmoide é
geralmente escolhida em redes neurais devido a algumas de suas características, como ser
diferenciável em qualquer ponto. A função sigmoide é útil em problemas de classificação, como
o caso deste trabalho, pois quando temos valores próximos a zero, sua derivada é máxima, o
que desloca o resultado para as extremidades do intervalo da função, como 0 e 1, que podem
ser duas classes distintas. Esta função é mostrada na Equação (4) (MOUTINHO et al. 2002) e
seu gráfico está na Figura 4.
1
∅= (4)
(1 + 𝑒 −𝑥 )
Figura 4 - Representação da função sigmoide com intervalo de [0,1]. A principal utilização da função
sigmoide é em problemas de classificação, devido ao ser fator diferenciável. Quando a função está
próxima de 0, a inclinação é máxima, e, portanto, o resultado de sua derivada também, logo, para valores
próximos de zero, o resultado será deslocado para as extremidades do intervalo escolhido, no caso [0,1],
que podem representar duas classes diferentes.
ℎ(𝑣) = (𝑤 ∗ 𝑥)(𝑡)
(5)
𝑦𝑖 (𝑣) = 𝑓(ℎ(𝑣))
(6)
O filtro de convolução será uma matriz, que realizará operações no vetor de dados de
entrada, de forma a se obter uma nova matriz, onde as características principais para o problema
em questão serão extraídas e armazenadas, o mapa de características. Para diferentes valores do
filtro, outras características do áudio original (no caso deste trabalho) são destacadas e
armazenadas para uso posterior. A execução desse processo é semelhante quando se trata de
imagens, o que torna sua representação mais simples.
Figura 6 - Características (linhas horizontais) desejadas sendo obtidas através da convolução da primeira
imagem com o filtro.
Além disso, o pooling, também é uma forma de redimensionar a imagem, tarefa também
identificada como “Down-Sampling”. Existem diversas formas de se utilizar o pooling em
conjunto com as redes convolucionais. O Max Pooling, ou Pooling Máximo, é umas das
maneiras mais tradicionais de se utilizar o pooling, sendo útelpara eliminar valores não
máximos, reduzindo a dimensão da representação dos dados e consequentemente a computação
necessária para as próximas camadas, além de criar uma invariância a pequenas mudanças e
distorções locais (FERREIRA, 2017). A Figura 7 exibe um exemplo da atuação do Pooling
Máximo em um vetor de dados. Cada bloco da matriz é representado por uma cor. Em cada
bloco, o valor máximo será selecionado e irá compor uma nova matriz, porém, dessa vez de
com dimensão menor.
Figura 7 - Exemplo da diminuição de uma matriz do mapa de características através do Pooling Máximo.
Em uma rede neural convolucional genérica, a matriz de dados de entrada passa pela
camada de convolução. O resultado desse processo é aplicado no algoritmo de Pooling Máximo,
que compõe a camada subsequente à convolução. Na última etapa das redes convolucionais, é
utilizada uma sequência de camadas de neurônios conectados a todas as ativações das camadas
anteriores (fully-connected), de forma análoga às camadas das redes neurais tradicionais
(OLIVEIRA et al. 2017). Por fim, a rede neural tradicional irá classificar os dados de acordo
com o problema. Todo o encadeamento de camadas ilustrado pela Figura 8 é chamado de rede
neural convolucional.
Figura 8 - Representação de uma típica rede neural convolucional, contendo a matriz de dados de
entrada, conectadas a uma camada de convolução. O resultado da convolução é aplicado na camada de
Pooling, que servirá de entrada para a rede neural artificial. O resultado final será a determinação de
uma das classes do problema.
𝑁−1
1
Também pode ser chamado de “Transformada de Fourier de Tempo Curto”
Onde k indica o índice do eixo das frequências, com 0 ≤ k ≤ N – 1;
2
𝑃𝐶𝑃∗ (𝑝) = ∑||𝑋(𝑙)|| 𝛿(𝑀(𝑙), 𝑝)
(8)
𝑙
−1, 𝑠𝑒 𝑙 = 0
𝑙
𝑀(𝑙) = (𝑓𝑠 ∙ ) 𝑁 (9)
12𝑙𝑜𝑔2 [ 𝑁 ] 𝑚𝑜𝑑 12, 𝑠𝑒 𝑙 = 1, … , − 1
𝑓𝑟𝑒𝑓 2
{
Onde 𝑓𝑟𝑒𝑓 é a frequência de referência correspondente a PCP* (0), por exemplo, para
uma escala iniciada em C, a frequência de referência é de 130,80Hz;
Após esse processo, deve-se normalizar o vetor obtido de forma a facilitar a comparação
entre vetores PCP para áudios de intensidades diferentes, isso faz com que a energia seja
representada como um valor relativo. A normalização é realizada ao dividir a energia de cada
raia pela energia total do PCP não normalizado, conforme mostrado na Equação (10)
(OSMALSKY, 2012).
𝑃𝐶𝑃∗ (𝑝)
𝑃𝐶𝑃(𝑝) = 11 ∗
∑𝑗=0 𝑃𝐶𝑃 (𝑝) (10)
Figura 9 - Representação do acorde C (Dó Maior) para Violão e Piano pelo vetor PCP
Apesar do PCP se mostrar um sistema robusto para fazer a descrição dos componentes
do sinal do acorde, ele se mostra insuficiente para bons resultados na classificação dos acordes.
Como mostrado no trabalho de Osmalsky et al. (2012), uma abordagem utilizando
simplesmente o algoritmo do Nearest Neighbors (1-NN) (DEZA et al., 2009), onde não há fase
de aprendizagem, apenas medindo a distância entre as raias com vetores padrão apresentou uma
taxa de erro de 8% para acordes de violão e porcentagens ainda maiores para outros acordes.
Por esse motivo, se fez necessária à implementação de um algoritmo de aprendizado de
máquina em conjunto com o classificador PCP para realizar o reconhecimento dos acordes.
3.4.1 Python
Na computação, o termo Linguagem de Programação designa a função de comunicação
com as estruturas padronizadas de semântica junto a sintaxe para especificação de um código
que ao ser processado por um dispositivo, irá especificar o conjunto de instruções a seres
executadas por esse dispositivo (SEBESTA, 2004).
O Python é uma linguagem de programação de alto nível, ou seja, sua sintaxe possui um
alto nível de abstração de conceitos da lógica computacional, se aproximando mais da
linguagem humana, tendo recebido notoriedade por sua sintaxe clara e simplificada em relação
suas antecessoras (BORGES, 2014). Tendo sido escolhida como principal linguagem de
programação para o desenvolvimento do nosso sistema.
Um dos motivos para a escolha da linguagem Python é sua vasta coleção de bibliotecas
disponibilizadas por desenvolvedores terceiros, muitas delas providenciando soluções
personalizadas para tipos específicos de problemas (SUMMERFIELD, 2010). Durante o
desenvolvimento do projeto se mostraram especialmente uteis as bibliotecas: Urlib que facilita
o processamento de URLs, Python Audio Converter, capaz de fazer a manipulação de
metadados de áudio, youtube_dl, voltada para a realização de download de vídeos do YouTube
em diversos formatos e a SoX (Sound Exchange) que permite o processamento dos sinais de
áudio digitalizados (BITTNER, 2016).
3.4.2 Flask
Um framework é uma biblioteca, ou coleção de bibliotecas, que busca resolver
parcialmente problemas com uma abordagem genérica, podendo solucionar problemas
específicos a depender da configuração e da programação da aplicação (DWYER, 2016).
A ferramenta Flask é um framework que utiliza linguagem de programação Python para
desenvolvimento do back-end de Aplicações Web. O Flask é classificado como um “micro-
framework” devido ao seu tamanho reduzido em comparação com outros padrões de
frameworks, sendo projetado para fornecer um núcleo com funções básicas e com possibilidade
expansão, com a instalação de outras funcionalidades, o que torna o Flask um framework
otimizado para cada aplicação (GRINBERG, 2018).
Para este trabalho, o Flask foi utilizado no desenvolvimento da Aplicação Web que
possui uma interface interativa para o recebimento da música a ser transcrita e exibição dos
resultados da transcrição. Sua escolha se deu pela integração com a linguagem Python e pelo
seu núcleo de funcionalidades simplificado.
3.4.3 Bootstrap
Bootstrap é um framework de código aberto que fornece comandos para a criação do
front-end em aplicações Web, combinando funcionalidades de diferentes ferramentas de
desenvolvimento de interfaces gráficas como a linguagem de marcação HTML, a linguagem de
estilo CSS, e a linguagem de programação JavaScript, permitindo a implementação
simplificada de diversos modelos de componentes interativos como tabelas, formulários e
botões (SANTIAGO, 2020).
3.4.5 FFmpeg
O FFmpeg é uma biblioteca de código aberto e um conversor de áudio e vídeo em
diversos formatos, o qual consegue trabalhar com taxas arbitrárias de amostragem, ou até
redimensionamento de vídeos. O FFmpeg lê a partir de um determinado número de arquivos de
entrada especificado pela opção -i (input), e grava em um determinado número de arquivos de
saída. A partir disso, é possível escolher diversos parâmetros, como a taxa de amostragem, o
bit rate e o número de canais de um áudio, o que torna a biblioteca relevante para a manipulação
de arquivos de música com linguagem de programação. (BINGHAM et al., 2000)
A Figura 10 mostra o diagrama de uma conversão realizada pela biblioteca FFmpeg de
um áudio .wav genérico para um áudio com os parâmetros escolhidos como padrão do projeto.
Sendo assim, os arquivos de áudios gravados foram todos padronizados em taxa de bits,
amostragem e número de canais, conforme os parâmetros descritos na Tabela 3.
Tabela 3 - Padronização dos parâmetros dos áudios utilizados.
Essa ferramenta foi integrada ao sistema desenvolvido pelo grupo com o intuito de
aumentar a acurácia das transcrições ao possibilitar que a rede processe o áudio contendo apenas
os instrumentos musicais, sem os vocais, pois, como demonstrado por Rondón et al. (2020), o
reconhecimento dos acordes pela rede neural se torna menos acurado em áudios que contenham
voz, além dos instrumentos.
O algoritmo PCP tem sido a escolha para extrair as características dos dados para um
reconhecedor automático de notas músicas, desde que Fujishima (1999) introduziu o algoritmo.
Em sua versão básica toma como entrada um vetor que representa o sinal de som no domínio
de tempo e retorna um vetor de 12 componentes representando o conteúdo de frequência do
sinal em cada uma das notas da escala musical (também é disponível em 24 e 36 componentes).
Para cada instancia, o PCP mostra como saída quão presente é a componente principal da nota
analisada.
Para efeito de comparação com os resultados obtidos no Rondón et al. (2020), foi
construído uma base de dados semelhante. Foram gravados os mesmos 10 acordes, 2000 vezes,
utilizando 4 violões. Porém, devido às limitações de equipamentos, não foi possível realizar as
gravações em uma câmara de isolamento acústico, logo, todas as notas foram emitidas em
ambientes com ruído. A Tabela 5 sumariza as comparações entre o banco de dados original e o
banco de dados gerado pelo grupo.
Dataset Tipo de violão Total de gravações Em ambiente comum Em câmara acústica Acordes
Original 3 de aço + 1 de nylon 2000 1000 1000 10
Criado 3 de aço + 1 de nylon 2000 2000 0 10
Fonte: Autores (2021)
Após a geração do conjunto de acordes, esses dados são computados pelo algoritmo de
PCP e seus resultados alocados para um arquivo de extensão csv, os quais servirão de entrada
para a rede.
O arquivo gerado possui 12 colunas, referentes a cada uma das notas principais. Esses
valores são gerados pelo algoritmo PCP. As colunas são preenchidas com valores de intensidade
de cada nota em questão, cada linha é uma amostra do conjunto de dados, que é um vetor de 12
dimensões, conforme mostrado na Tabela 6.
C C# D D# E F F# G G# A A# B
1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra 1º amostra
2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra 2º amostra
3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra 3º amostra
4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra 4º amostra
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra nº amostra
Tabela 7 - Topologias utilizadas durante o treinamento (As camadas estão separadas por hífen).
Numeração Topologia
1 12-30-10
2 12-38-24-10
3 12-30-15-30-20-12
4 12-24-48-20-48-20-10
Figura 17 - Exemplo de matriz para o cálculo do LCS de 4 elementos para as sequencias A = abcdbb e B =
cbacbaaba
2
https://www.cifraclub.com.br/
5 RESULTADOS
Este capítulo tem a finalidade de apresentar os resultados das transcrições realizadas,
bem como a Aplicação Web desenvolvida para este projeto.
Tabela 8 - Exemplo de uma das tabelas de valores de intensidade dos acordes gravados pelo grupo.
C C# D D# E F F# G G# A A# B
0,00092474 0,110325365 0,00232842 0,001462 0,312763 0,013527 0,002085 0,002595 0,015573 0,523804 0,004129 0,010484
0,001885749 0,010357825 0,003580702 0,007459 0,618462 0,054344 0,010024 0,005278 0,01757 0,225302 0,007594 0,038144
0,001232622 0,179354887 0,001691871 0,002522 0,542073 0,013123 0,010016 0,00169 0,008371 0,230875 0,00538 0,003671
0,000890025 0,093377956 0,001786343 0,006455 0,589194 0,024664 0,006383 0,007842 0,011831 0,247427 0,004879 0,005271
0,001082109 0,113005959 0,00270199 0,001726 0,408331 0,047026 0,005144 0,002377 0,005957 0,388872 0,00459 0,019186
0,001425478 0,050727927 0,002099017 0,00305 0,445557 0,049317 0,009981 0,006512 0,023267 0,376622 0,003991 0,02745
0,001142162 0,114994892 0,004170626 0,005241 0,391644 0,054757 0,00698 0,003773 0,03299 0,366969 0,001169 0,016169
0,001408445 0,070071094 0,0037059 0,001803 0,545449 0,033232 0,014538 0,00299 0,020108 0,293629 0,003396 0,009671
0,000587528 0,133057781 0,002049963 0,001061 0,408128 0,007194 0,008239 0,001931 0,022962 0,405605 0,003859 0,005325
0,003348224 0,119845913 0,005250043 0,003578 0,409022 0,131615 0,031823 0,003054 0,028468 0,232814 0,008808 0,022374
0,001278047 0,154671088 0,001799677 0,002371 0,473489 0,020327 0,008365 0,002517 0,01275 0,315782 0,002896 0,003754
0,001159458 0,039984877 0,004500568 0,003735 0,476996 0,055493 0,008042 0,003197 0,019377 0,362517 0,003417 0,021582
3
https://drive.google.com/file/d/1FEQgKn03532rb5RJYBbmNx633NoMg2RS/view?usp=sharing
Figura 18 - Gráfico de um acorde de Lá maior (A)por intensidade, gerado pelo PCP.
0.5
0.45
0.4
0.35
intensidade
0.3
0.25
0.2
0.15
0.1
0.05
0
C C# D D# E F F# G G# A A# B
Acorde
Topologia Acurácia Piano (%) Acurácia Violão (%) Acurácia Violino (%)
1 88 93 74
2 88 90 79
3 86 90 72
4 85 83 82
Com base nos resultados obtidos, a topologia escolhida foi a 1 (12-30-10). Ressalta-se
que esta topologia já apresentou bons resultados no trabalho original de Rondón et al (2020) e
novamente apresenta neste trabalho as maiores taxas de acerto. A Figura 19 mostra a matriz de
confusão gerada pela topologia escolhida para o teste com X acordes gravados apenas com
violão.
Após os testes com a detecção de acordes, foram realizados experimentos com a RNA
para remoção dos vocais. Em tais testes, mediu-se a eficácia do sistema em músicas contendo
apenas voz e violão e músicas contendo voz e diversos instrumentos musicais. Para isso, foram
realizados testes com a música Imagine4 em duas versões: A original de 1971, interpretada pelo
músico John Lennon, e a versão voz e violão de 2020, interpretada pelo músico Caico Antunes.
5.3 Resultados dos Testes com a RNA para Remoção dos Vocais
Para fins de visualização, as Figura 20 a 22 exibem demonstram a ação da RNA para
remoção dos vocais com gráficos dos sinais do trecho de uma música contendo vocais e
instrumental, seguida de suas duas decomposições em um áudio contendo apenas instrumental
e outro contendo apenas vocais por unidade de tempo. Na Figura 20 se encontra o sinal de áudio
completo, na Figura 21 está o sinal já filtrado, com apenas o som instrumental e na Figura 22,
apenas o sinal de voz compõe o arquivo de áudio.
4
Single de John Lennon do álbum Imagine. Apple Records, 1971. 3’03’’
Figura 21 - Gráfico do Sinal Instrumental x Tempo.
A aplicação da RNA para remoção dos vocais é uma das principais diferenças do nosso
sistema de reconhecimento de acordes em relação ao proposto por Randón et al.(2020). Os
resultados da RNA de Reconhecimento de acordes para uma perspectiva musical de Acurácia
e de Maior Subsequência Comum (LCS) para a comparação da versão original de 1971 da
canção Imagine do cantor John Lennon nesses dois sistemas são mostrados na Tabela 11.
Tabela 11 - Acurácia e LCS para a versão original (contendo múltiplos instrumentos) da canção Imagine
Tabela 12 - Acurácia e Semelhança LCS para a versão com apenas Voz e Violão da canção Imagine
De acordo com a Tabela 14, é possível notar que o modelo original obteve melhores
valores de acurácia. Esse resultado pode ser atribuído ao fato do projeto percursor utilizar
câmara de isolamento acústico, enquanto neste projeto todos os acordes foram gravados por um
microfone comum em um ambiente ruidoso. Embora haja essa diferença, o presente trabalho
obteve resultado satisfatório, com variação do acerto de menor que 3%.
Para algumas músicas, a RNA para reconhecimento de acordes não se comportou
adequadamente. Diversos fatores podem ter interferido nos resultados, como a qualidade do
áudio importada, devido a plataforma Youtube comprimir parte dos áudios de seus vídeos
(YOUTUBE HELP, 2021). Para cobrir isso, é recomendável a utilização da extração do áudio
em altas taxas de transferência de bit, porém, tais taxas tornam a utilização do projeto inviável
devido ao tamanho dos arquivos de áudio e o tempo necessário para manipulá-los. A
compressão de áudio pode interferir em algumas frequências que podem ser essenciais para que
a rede proposta possa fazer a distinção entre os acordes.
A RNA para remoção dos vocais atuou melhor em versões acústicas nas quais o cantor
utiliza apenas um violão. Dessa forma, o arquivo de áudio relativo aos instrumentos musicais é
apenas o de um violão, o que aproxima mais a rede de seus dados de treinamento. Já para uma
música com bateria, guitarra, baixo e teclado, o áudio dos instrumentos musicais terá a
contribuição de todos esses dispositivos simultaneamente, diminuindo a taxa de acerto da RNA
para reconhecimento de acordes de forma significativa. Isso ocorre porque nas RNAs, quanto
mais os dados de teste foram parecidos com os dados de treino, melhores serão os resultados, o
que justifica a obtenção de um erro menor quando apenas um cantor e um violão estão emitindo
frequências no áudio. Este problema, decorrente de quando a distribuição dos dados de treino
difere significativamente da distribuição dos dados de teste é chamado “Covariate shift”
(BICKEL et al. 2009).
Além disso, notou-se um problema que se perpetua desde o trabalho anterior, que é o
tamanho da janela para detecção os acordes no sinal de áudio. Através de testes, foi
demonstrado que, com uma janela fixada em 2 segundos, quando o ritmo da música é mudado
drasticamente, a detecção de acorde perde sua sincronização com o sinal, comprometendo o
processo.
Os tempos de processamentos apresentados na Tabela 13 demonstram que, apesar de
aumentar sua acurácia, o processo de remoção dos vocais demanda um tempo considerável no
processo de transcrição.
Os resultados também demonstraram que, apesar de apresentar uma menor acurácia e
LCS para os áudios que utilizam múltiplos instrumentos em comparação a áudios contendo
apenas o violão, as transcrições para essas músicas com múltiplos instrumentos ainda
apresentaram transcrições relativamente acuradas. Isso denota que a solução do algoritmo PCP,
em conjunto com as RNAs possui um nível de generalização suficiente para reconhecer acordes
em outros instrumentos musicais, mesmo tendo sido treinada apenas com o violão.
É importante destacar que as músicas utilizadas durante os testes possuíam outros
fatores diferentes além dos instrumentos musicais. Variáveis como a qualidade da gravação, o
timbre de voz do vocalista e o ritmo da música também são diferentes entre as duas versões de
“Imagine” testadas, podendo influenciar os resultados observados.
6 CONCLUSÃO
Este trabalho trouxe a proposta de solucionar alguns problemas encontrados em sistemas
de transcrição automática de acordes musicais. Na literatura é possível identificar uma
dificuldade geral na identificação de acordes musicais em arquivos de áudio que contenham,
além dos instrumentos musicais, os vocais da canção. A solução proposta para este problema é
a de realizar a remoção dos vocais do áudio antes que ele seja processado pelo sistema de
reconhecimento de acordes. sendo este processo de remoção realizado por meio de uma RNA.
Dessa forma, buscou-se a otimização da detecção de acordes musicais em áudios em que
possuam os vocais dos cantores simultaneamente com instrumentos músicas, em especial
violões.
Foi também desenvolvida uma Aplicação Web para facilitar a utilização do sistema pelo
usuário. A aplicação se mostrou uma forma visual e interativa de apresentação dos acordes
transcritos, de forma sincronizada com as músicas e indicando a duração de cada acorde,
levando o foco do trabalho para a resolução de um problema conhecido, para uma experiência
direta do usuário, interagindo visualmente com os acordes tocados, sincronizados com a música
escolhida pelo vídeo introduzido por ele.
Em conjunto com esses objetivos, teve-se a meta de realizar testes e comparações com
o trabalho de Rondón et al. (2020) que detectava notas de violão para arquivos de áudio. O
grupo gerou um banco de dados similar ao desse trabalho, além de utilizar parâmetros também
semelhantes, verificando a aplicabilidade do projeto.
O banco de dados foi gerado com sucesso pelos integrantes do grupo, que exceto pelo
fato de não possuírem câmaras de isolamento acústico, foram fiéis aos modos de gravação do
projeto inicial. Os modelos foram treinados com base nos dados novos, concluindo que a
topologia escolhida no trabalho anterior é a mais adequada também para os novos dados.
ABRAHAM, Ajith. Artificial neural networks. Handbook of measuring system design, 2005.
ANTUNES, Caico. IMAGINE - John Lennon (aula simplificada) | Como tocar no violão.
Youtube, 04 jun. 2020. Disponível em: <https://www.youtube.com/watch?v=Yu_XsTeYaJk>.
Acesso em: 15 set. 2021.
BARBANCHO, Ana M. et al. Automatic transcription of guitar chords and fingering from
audio. IEEE Transactions on Audio, Speech, and Language Processing, v. 20, n. 3, p. 915-
921, 2011.
BINGHAM, Fabrice et al. ffmpeg Documentation. [S. l.], 20 dez. 2000. Disponível em:
https://ffmpeg.org/ffmpeg.html. Acesso em: 30 set. 2021.
BITTNER, Rachel; HUMPHREY, Eric; BELLO, Juan. Pysox: Leveraging the audio signal
processing power of sox in python. In: Proceedings of the International Society for Music
Information Retrieval Conference Late Breaking and Demo Papers. 2016.
BORGES, Luiz Eduardo. Python para desenvolvedores: aborda Python 3.3. Novatec
Editora, 2014.
DA SILVA ASSIS, Lucas. O uso de uma Rede Neural Artificial Supervisionada para obtenção
do fator de carga de um alimentador. Universidade Federal de Goiás. 2015.
DA SILVA NUNES, Ivan ; SPATTI, Danilo Hernane; FLAUZINO, Rogério Andrade. Redes
neurais artificiais para engenharia e ciências aplicadas-curso prático. São Paulo: Artliber,
2010.
GUIMARÃES, Alaine Margarete et al. Módulo de validação cruzada para treinamento de redes
neurais artificiais com algoritmos backpropagation e resilient propagation. Publicatio UEPG:
Ciências Exatas e da Terra, Agrárias e Engenharias, v. 14, n. 01, 2008.
HAAS, W. Bas. Music information retrieval based on tonal harmony. 2012. Tese de
Doutorado. Utrecht University
KOVÁCS, Zsolt László. Redes neurais artificiais: fundamentos e aplicacoes. [S.l: s.n.], 1996.
LAWRENCE, Steve; GILES, C. Lee. Overfitting and neural networks: conjugate gradient and
backpropagation. In: Proceedings of the IEEE-INNS-ENNS International Joint Conference
on Neural Networks. IJCNN 2000. Neural Computing: New Challenges and Perspectives
for the New Millennium. IEEE, 2000. p. 114-119.
LENNON, John. Imagine (Remastered 2010). Youtube, 03 mai. 2017. Disponível em:
<https://www.youtube.com/watch?v=rAn-AWXtHv0>. Acesso em: 15 set. 2021.
MOTTOLA, L. Table of Musical Notes and Their Frequencies and Wavelengths. Lutherie
Information Website for builders of stringed musical instruments. Retrieved, v. 21, p. 29,
2020.
OSMALSKY, Julien et al. Neural networks for musical chords recognition. In: Journées
d'informatique musicale. 2012. p. 39-46.
OSORIO, Jimy Alexander Cortes; KNOTT, Andrew M.; OSORIO, José Andrés Chaves.
Aproximación a la síntesis de la música a través del análisis de fourier. Scientia et technica, v.
1, n. 52, p. 129-135, 2012.
ROSSING, Thomas D.; STUMPF, Folden B. The science of sound. American Journal of
Physics, v. 50, n. 10, p. 955-955, 1982.
SALAMON, Justin; GÓMEZ, Emilia. Melody extraction from polyphonic music signals using
pitch contour characteristics. IEEE Transactions on Audio, Speech, and Language
Processing, v. 20, n. 6, p. 1759-1770, 2012.
SANTANA NETO, José Pedro de. Solução computacional para reconhecimento de harmonias
musicais. 2015. 116 f., il. Monografia (Bacharelado em Engenharia de Software) Universidade
de Brasília, Brasília, 2015.
SANTIAGO, Cynthia Pinheiro et al. Desenvolvimento de sistemas Web orientado a reuso com
Python, Django e Bootstrap. Sociedade Brasileira de Computação, 2020.
SHEH, Alexander; ELLIS, Daniel PW. Chord segmentation and recognition using EM-trained
hidden Markov models. 2003.
TAKAHASHI, Naoya; MITSUFUJI, Yuki. Multi-scale multi-band densenets for audio source
separation. In: 2017 IEEE Workshop on Applications of Signal Processing to Audio and
Acoustics (WASPAA). IEEE, 2017. p. 21-25.
VAN PROOIJEN, Kees. A theory of equal‐tempered scales. Journal of New Music Research,
v. 7, n. 1, p. 45-56, 1978
WU, Jianxin. Introduction to convolutional neural networks. National Key Lab for Novel
Software Technology. Nanjing University. China, v. 5, n. 23, p. 495, 2017.
ZAMBIASI, Saulo Popov. Arquitetura das Redes Neurais. [S. l.], 2010. Disponível em:
https://www.gsigma.ufsc.br/~popov/aulas/rna/arquitetura/. Acesso em: 26 ago. 2021.
ZAPATA, Jose Ricardo et al. Assigning a confidence threshold on automatic beat annotation
in large datasets. In: 13th International Society for Music Information Retrieval
Conference, 08/10/2012, Porto, Portugal. 2012. p. 157-162.
ChordsWebApp
├───app
│ ├───blueprints
│ │ └───__init__.py
│ │ └───functions.py
│ │ └───views.py
│ ├───static
│ │ ├───css
│ │ │ └───styles.css
│ │ └───images
│ │ ├───guitar_icon_white.ico
│ │ ├─── guitar_icon_white.png
│ │ └───if_logo_horizontal.png
│ ├───templates
│ │ ├───base.html
│ │ └───home.html
│ │ └───video.html
├───chords
│ ├───models
│ ├───neural_network
│ ├───preprocessing
│ └───util
├───model
│ └───ivector
└───vocal-remover-master
├───.ipynb_checkpoints
├───appendix
├───lib
└───models
APÊNDICE B – PROGRAMA DA APLICAÇÃO WEB DESENVOLVIDA – APP.PY
app = Flask(__name__)
configuration.init_app(app)
views.init_app(app)
if (__name__ == '__main__'):
app.run()
APÊNDICE C – PROGRAMA DA APLICAÇÃO WEB DESENVOLVIDA – VIEWS.PY
from flask import Flask, render_template, request
from app.blueprints.functions import *
import os
import youtube_dl
def init_app(app):
@app.route('/')
def index():
return render_template("home.html")
try:
os.remove('D:/GitHub/ChordsWebApp/app/static/audio.wav')
except:
print ("File not found")
link = request.form['musicName']
'''
#Extrai musica do YouTube
baixaYoutube(link)
#Transcreve o acompanhamento
chordsTranscreve()
'''
#Link
linkid= get_id(link)
print("ID do Video = ", linkid)
acordesUnicos = []
listaBinaria = []
for i in range (len(dicAcordes)-1):
if dicAcordes[i] != dicAcordes[i+1]:
dicAcordes[i] = dicAcordes[i].capitalize()
acordesUnicos.append(dicAcordes[i])
listaBinaria.append('1')
else:
listaBinaria.append('0')
p=0
tam=len(dicAcordes)
print ("Dicionario de acordes: ", dicAcordes)
print ("Acordes Unicos: ", acordesUnicos )
print ("Lista Binaria: ", listaBinaria)
# Funções
def baixaYoutube(link):
print("Baixando do youtube...")
path = f'D:/GitHub/ChordsWebApp/app/static/audio.wav'
ydl_opts.update({'outtmpl':path})
def separaVocais():
#Separa Instrumental dos Vocais
os.chdir("D:/GitHub/ChordsWebApp/vocal-remover-master/")
os.system("python inference.py --input D:/GitHub/ChordsWebApp/app/static/audio.wav")
print("parou!!!")
print("Vocais separados!")
os.replace("D:/GitHub/ChordsWebApp/vocal-remover-
master/audio_Instruments.wav", "D:/GitHub/ChordsWebApp/audio_Instruments.wav")
os.replace("D:/GitHub/ChordsWebApp/vocal-remover-master/audio_Vocals.wav", "D:/GitHub/ChordsWebApp/audio_Vocals.wav")
os.chdir("D:/GitHub/ChordsWebApp")
def chordsTranscreve():
os.chdir("D:/GitHub/ChordsWebApp/")
#Converte a taxa de amostragem do áudio para 16Kb mono
pac.convert_wav_to_16bit_mono("D:/GitHub/ChordsWebApp/audio_Instruments.wav", "D:/GitHub/ChordsWebApp/audio_Instruments.
wav")
os.chdir("chords")
os.system("python split.py D:/GitHub/ChordsWebApp/audio_Instruments.wav")
os.replace("chords.txt", "D:/GitHub/ChordsWebApp/chords.txt")
def get_id(url):
u_pars = urlparse(url)
quer_v = parse_qs(u_pars.query).get('v')
if quer_v:
return quer_v[0]
pth = u_pars.path.split('/')
if pth:
return pth[-1]
APÊNDICE E – SCRIPTS DOS TEMPLATES DA APLICAÇÃO WEB
DESENVOLVIDA – BASE.HTML
<!doctype html>
<html lang="pt-br">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- JS -->
<body class="Frame">
<header class="Row">
<nav class="navbar navbar-expand-lg navbar-dark">
<a class="navbar-
brand" href="/"><img id="logo" src="/static/images/guitar_icon_white.png">Inteligência Artificial Aplicada à Transcrição de Acordes de Vi
olão</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-
expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
{% block navbar %}
{% endblock %}
</ul>
</div>
</nav>
</header>
<main>
{% block content %}
{% endblock %}
</main>
{% block navbar %}
{% endblock %}
{% block content %}
<form action="{{url_for('extract')}}" id="transcreve-musica" method="POST">
<div class="container">
<div class="jumbotron" id="texto-inicial">
<h1 class="display-4">Insira a URL do YouTube:</h1>
<hr class="my-4">
<div class="col-4">
</br>
</br>
</div>
</br>
<button class="btn btn-primary btn-lg" type="submit" href="/acordes" target="_blank" role="button">Transcrever</button>
</div>
</div>
</form>
{% endblock %}
APÊNDICE G – SCRIPTS DOS TEMPLATES DA APLICAÇÃO WEB
DESENVOLVIDA – VIDEO.HTML
{% extends 'base.html '%}
{% block navbar %}
{% endblock %}
{% block content %}
<div class="container">
<div class="jumbotron" id="texto-inicial">
<h1 class="display-4">Transcrição: </h1>
<hr class="my-4">
<!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
<div id="player">
</div>
<script>
// 2. This code loads the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
linkID = link
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '360',
width: '640',
videoId: '{{linkid}}',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
})
}
// 4. The API will call this function when the video player is ready.
function onPlayerReady(event) {
event.target.playVideo();
console.log('currentTime:', player.getCurrentTime())
}
// 5. The API calls this function when the player's state changes.
// The function indicates that when playing a video (state=1),
// the player should play for six seconds and then stop.
function onPlayerStateChange(event) {
binarylist={{listaBinaria|tojson}}
uniquechords={{acordesUnicos|tojson}}
if(event.data==1) { // playing
myTimer = setInterval(function(){
var time;
time = player.getCurrentTime();
$("#timeHolder").text(time);
console.log(time);
j=0
for (var i = 0; i<{{tam}}; i++)
{
i2 = Math.trunc(time/2)
if (binarylist[i2]==1){
if (Math.trunc(time)%2 == 1){
document.getElementById('duracaobar').innerHTML = '0';
document.getElementById('duracaobar').style["width"]="0%";
}
else {
document.getElementById('duracaobar').innerHTML = '1';
document.getElementById('duracaobar').style["width"]="12%";
}
else {
document.getElementById('duracaobar').innerHTML = '3';
document.getElementById('duracaobar').style["width"]="36%";
}
}
else if (binarylist[i2]==0 && binarylist[i2+1]==0 && binarylist[i2+2]==1){
if (Math.trunc(time)%2 == 1){
document.getElementById('duracaobar').innerHTML = '4';
document.getElementById('duracaobar').style["width"]="48%";
}
else {
document.getElementById('duracaobar').innerHTML = '5';
document.getElementById('duracaobar').style["width"]="60%";
}
}
else {
document.getElementById('duracaobar').innerHTML = '+6';
document.getElementById('duracaobar').style["width"]="100%";
}
}
if (binarylist[i]!=0){
j=j+1
}
},
100);
}
else { // not playing
clearInterval(myTimer);
}
}
</script>
<br>
<br>
<br>
<div class="row">
<div class="col-sm">
<h1 class="h2 font-weight-bold" id="Aesquerdo"></h1>
</div>
<div class="col-sm-3">
<h1 class="display-2 text-center font-weight-bold p-3 mb-4 bg-danger text-black" id="Acentral"><storng></storng></h1>
</div>
<div class="col-sm">
<h1 class="h2 text-right font-weight-bold" id="Adireito"></h1>
</div>
</div>
<br>
<h1>duração: </h1>
<div class="progress" style="height: 32px;">
<h4 class="progress-bar" role="progressbar" style="width: 50%" aria-valuenow="75" aria-valuemin="0" aria-
valuemax="100" id="duracaobar">2</h4>
</div>
</div>
</div>
<br>
</div>
{% endblock %}