composição algorítmica: geração de solos de blues...
TRANSCRIPT
Composicao Algorıtmica: Geracao deSolos de Blues Utilizando Modelos
Markovianos
Dhiego Souto AndradeUniversidade Federal de Ouro Preto
Monografia submetida ao
Curso de Ciencia da Computacao
da Universidade Federal de Ouro Preto
para obtencao do tıtulo de bacharel em Ciencia da Computacao
ii
Dedico este trabalho a minha mae, exemplo de determinacao e coragem.
iii
iv
Composicao Algorıtmica: Geracao de Solos de Blues
Utilizando Modelos Markovianos
Resumo
Este trabalho descreve como compor solos de blues utilizando modelos Markovianos.
Serao compostos licks (pequenas sequencias de notas musicais) pelo software Guitar Pro,
atraves de tablaturas, para criar um banco de dados de licks. Em seguida a cadeia de
Markov ira mapear as probabilidades de uma nota acontecer apos uma outra se baseando
nas notas dos licks do banco. A partir deste mapeamento, uma tecnica de Selecao por
Roleta ira selecionar estocasticamente as notas mapeadas pela cadeia, gerando assim
uma nova sequencia de notas. Serao abordados tres metodos novos para a composicao.
Serao utilizadas cadeias com diferentes ordens para gerar os solos. Tambem sera estudado
um valor limiar que ira influenciar na ordem das cadeias, quando forem de ordens maiores
que 1. Este limiar ira reduzir a ordem da cadeia quando uma possıvel nota sucessora
tiver um numero de ocorrencias menor que o valor deste limiar.
v
vi
Composicao Algorıtmica: Geracao de Solos de Blues
Utilizando Modelos Markovianos
Abstract
This work describes a way to compose blues solos using a Markov chain. Licks (short
sequences of musical notes) will be composed by the Guitar Pro software, through tabs,
to populate a database. Then the Markov chain will map the probability of a note
happening after another, based on the notes of the database licks. From this mapping,
the Roulette selection technique will stochastically select the notes mapped in the chain,
generating a new sequence of notes. Three new methods for composition are used in
this work. Markov chains of different orders will be trained to generate the solos. A
threshold value that will influence the orders of the Markov chains is also studied in this
work, when they have orders greater than 1. This threshold will reduce the order of the
chain when a possible successor note has a smaller number of occurrences than the value
of this threshold.
vii
viii
Declaracao
Esta dissertacao e resultado de meu proprio trabalho, exceto onde referencia explıcita e
feita ao trabalho de outros, e nao foi submetida para obtencao de tıtulo nesta nem em
outra universidade.
Dhiego Souto Andrade
ix
x
Agradecimentos
Agradeco a minha mae, pelo apoio, confianca e incentivo aos estudos.
Agradeco a minha famılia, pelos conselhos e consideracao.
Agradeco aos amigos pela companhia e bons momentos.
Agradeco ao Alan, meu orientador, pela paciencia.
Agradeco aos professores do DECOM e da UFOP pelos ensinamentos.
Agradeco a UFOP, pela educacao e toda assistencia.
Agradeco a republica Manicomio pelo abrigo nesses anos de UFOP.
Agradeco ao blues, vida simples, verdadeira.
Muito obrigado.
xi
xii
Sumario
Lista de Figuras xvii
Nomenclatura 1
1 Introducao 3
1.1 Motivacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Contribuicoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Organizacao do Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Revisao da Literatura 7
2.1 Modelos de Markov em Composicao Algorıtmica . . . . . . . . . . . . . . 7
2.2 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 Cadeia de Markov 11
3.1 Formulacao Matematica . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Exemplo de um modelo Markoviano para representar mudancas climaticas 13
3.3 Modelos Markovianos e suas ordens . . . . . . . . . . . . . . . . . . . . . 15
3.4 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4 Conceitos Musicais e Midifile 17
xiii
4.1 Conceitos Musicais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1.1 Notas musicais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1.2 Altura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1.3 Tom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 Tablatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3 Esboco da estrutura padrao de um arquivo MIDI . . . . . . . . . . . . . 21
4.4 As classes da biblioteca Midifile . . . . . . . . . . . . . . . . . . . . . . . 22
4.4.1 Classe TickTime . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.2 Classe MFEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.3 Classe Midifile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.5 Representando uma melodia com a classe Midifile . . . . . . . . . . . . . 26
4.6 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 Metodologia 27
5.1 Guitar Pro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 Arranjo Associativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.1 Definicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.2.2 Arvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.2.3 Conteiner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2.4 Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.2.5 Iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.3 Utilizando o Conteiner Map para representar uma cadeia de Markov . . . 33
5.3.1 Representacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.3.2 Algoritmo de treinamento a partir de sequencias . . . . . . . . . . 34
5.3.3 Algoritmo de geracao de sequencias . . . . . . . . . . . . . . . . . 34
xiv
5.4 Analisando a influencia de um limiar na definicao da ordem da cadeia de
Markov ao gerar os solos . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.5 Metodos de Representacao de Melodias . . . . . . . . . . . . . . . . . . . 38
5.6 Teste de Friedman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.7 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6 Resultados 43
6.1 Testando a consistencia da cadeia de Markov com inteiros e caracteres . . 43
6.2 Treinando cadeias de Markov com parametros diferentes . . . . . . . . . 44
6.3 Regras para a geracao dos solos . . . . . . . . . . . . . . . . . . . . . . . 45
6.4 Avaliando novos solos baseados nos licks do guitarrista Johnny Winter . 47
6.5 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7 Conclusoes e Trabalhos Futuros 55
Referencias Bibliograficas 57
Indice Remissivo 59
xv
xvi
Lista de Figuras
3.1 Cadeia de Markov representada por um grafo . . . . . . . . . . . . . . . 13
3.2 Cadeia de Markov de ordem 2 . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3 Cadeia de Markov de ordem 3 . . . . . . . . . . . . . . . . . . . . . . . . 16
4.1 Exemplo Tablatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 Tablatura com bend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Tablatura com slide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 Tablatura com vibrato . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.5 Tablatura com hammer . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.1 Interface do Guitar Pro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2 Arranjo Associativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.3 Arvore binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.4 Arvore ternaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.5 Busca binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.6 Arranjo associativo representado por uma arvore . . . . . . . . . . . . . . 32
5.7 Representacao de uma Cadeia de Markov . . . . . . . . . . . . . . . . . . 34
5.8 Exemplo de como encontrar uma cadeia de ordem menor . . . . . . . . . 36
5.9 Exemplo de como o limiar reduz a ordem da cadeia . . . . . . . . . . . . 37
xvii
xviii LISTA DE FIGURAS
5.10 Representacao de uma melodia atraves de uma partitura e uma tablatura 38
5.11 Sequencia TND, onde o primeiro numero representa o tempo que a nota
e tocada, o segundo a respectiva nota e a terceira a sua duracao. . . . . . 39
5.12 Sequencia ND, onde o primeiro numero representa a nota e o segundo a
sua duracao. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.13 O vetor de inteiros representa as notas e o vetor de numeros reais as
duracoes de uma nota . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.14 Tabela Friedman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.15 Tabela Friedman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.1 Cadeia de Markov TND de ordem 3 . . . . . . . . . . . . . . . . . . . . . 44
6.2 Cadeia de Markov N de ordem 1 . . . . . . . . . . . . . . . . . . . . . . . 45
6.3 Cadeia de Markov D de ordem 1 . . . . . . . . . . . . . . . . . . . . . . . 46
6.4 Cadeia de Markov ND de ordem 2 . . . . . . . . . . . . . . . . . . . . . . 46
6.5 Exemplo de tablatura de um novo solo TND de ordem 2 . . . . . . . . . 47
6.6 Exemplo de tablatura de um novo solo ND de ordem 1 . . . . . . . . . . 48
6.7 Exemplo de tablatura de um novo solo N&D de ordem 3 . . . . . . . . . 48
6.8 Melhor solo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.9 Pior solo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Nomenclatura
CE Computacao Evolutiva
IA Inteligencia Artificial
SMF Standard MIDI File
MIDI Musical Instrument Digital Interface
CA Composicao Algorıtmica
1
2
Capıtulo 1
Introducao
“O blues e o lamento dos oprimidos, o grito de independencia, a paixao dos lascivos, a
raiva dos frustrados e a gargalhada do fatalista. E a agonia da indecisao, o desespero
dos desempregados, a angustia dos destituıdos e o humor seco do cınico. O blues e a
emocao pessoal do indivıduo que encontra na musica um veıculo para se expressar.”
— Paul Oliver, 1927
A composicao algorıtmica vem ha mais de um seculo ajudando a compreender e
desenvolver o campo matematico da teoria musical. E uma forma de inovacao musical,
facilitando o aprendizado e expandindo as tecnicas de composicao. Algoritmos ja haviam
sido utilizados por artistas como Mozart e John Cage para compor algumas de suas
obras, segundo Nierhaus (2009). Mozart utilizava dados para compor, arremessando-os
e se baseando no numero tirado para escolher as notas. Enquanto Cage jogava moedas
para compor, escolhendo as notas e suas duracoes de acordo com o lado das moedas que
tirava.
Uma base de dados de licks de blues serao compostos com a ajuda de um software
chamado Guitar Pro. Este software permite a composicao de partituras e tablaturas.
Pela sua facilidade de interpretacao, a composicao em tablaturas foi escolhida. Inicial-
mente todos os licks serao criados em la, por ser um tom bastante comum no blues e
por ser mais facil de ser tocado em uma guitarra. Os licks compostos serao exportados
em formato MIDI (Musical Instrument Digital Interface) atraves do Guitar Pro e clas-
sificados de acordo com seus autores. Licks de um grande guitarrista do blues, Johnny
Winter, serao utilizados para compor a base de dados deste trabalho.
3
4 Introducao
Uma biblioteca em C++ chamada Midifile, que possibilita a manipulacao de arquivos
MIDI, sera utilizada para realizar importacoes e exportacoes dos licks. As cadeias de
Markov irao mapear as probabilidades de uma certa nota musical acontecer depois de
uma outra, ou seja, apos uma determinada nota sera mapeado todas as ocorrencias de
notas que a sucedem e o numero de suas ocorrencias. Serao criados modelos Markovianos
de n ordens, onde o n significa o numero de notas que precedem a nota a ser mapeada.
Apos o mapeamento, sortearemos entre as notas que sucedem um elemento vazio, isto e,
as primeiras notas das sequencias treinadas pela cadeia, para a composicao do solo. As
proximas notas a se integrarem ao novo solo serao eleitas dentre as notas que sucedem a
ultima nota eleita de acordo com a cadeia de Markov. Porem as notas que tiverem maior
ocorrencia terao maior probabilidade de serem escolhidas, onde a selecao por roleta sera
a tecnica abordada para sorteio das notas.
Serao construıdas cadeias com ordens variaveis, isto e, sera definido um valor limiar
que ira influenciar na ordem da cadeia. Caso uma nota que pode ser escolhida para
compor o solo tenha um numero de ocorrencias menor que este valor limiar, a cadeia
reduzira sua ordem ate que haja uma nota com o numero de ocorrencias maior que este
limiar, ou ate que a cadeia reduza ate a ordem 1. Quando a cadeia reduz sua ordem ate
a ordem 1, o limiar nao influencia mais e qualquer nota pode ser escolhida independente
do seu numero de ocorrencias na cadeia. Esta tecnica e abordada pela dificuldade de
encontrar uma ordem ideal para a geracao dos solos, pois ordens muito altas tendem a
gerar copias e ordens muito baixas nao conseguem fazer uma boa inducao.
As cadeias de Markov criadas poderao ter licks de um guitarrista especıfico, tentando
imitar as caracterısticas deste artista, ou ainda poderao ser formadas por juncoes de
varios guitarristas para tentar inovar nas caracterısticas dos solos.
Este e um trabalho que forma a continuacao de trabalhos passados (Biles 1994,
Verbeurgt, Dinolfo & Fayer 2004), porem com uma especificidade voltada para o blues.
1.1 Motivacao
Alguns computadores vem ao longo do tempo tentando imitar a acao humana. Um
grande desafio e implantar a criatividade em uma maquina. A composicao musical pode
se basear em algoritmos nao determinısticos, e teve Mozart como pioneiro na utilizacao
de algoritmos para compor.
Este trabalho tem como grande motivacao a simulacao da criatividade em uma
maquina atraves de algoritmos e tecnicas computacionais, com o intuito de aproximar
Introducao 5
ao maximo da criatividade humana. O teste de Turing sera feito com algumas pessoas
para nos ajudar a perceber o quanto a maquina se aproximou do ser humano.
1.2 Objetivos
Os principais objetivos deste trabalho sao:
• Compor solos de blues atraves de tecnicas computacionais
• Simular a criatividade em uma maquina
• Reproduzir estilos de composicao de grandes guitarristas
• Facilitar o aprendizado de iniciantes para compor solos
• Avaliar os solos gerados
• Comparar os solos gerados em diferentes ordens da cadeia de Markov
• Reproduzir em forma de audio os solos gerados
1.3 Contribuicoes
As principais contribuicoes desta monografia sao:
• Estudo do efeito que a ordem dos modelos Markovianos influenciam na composicao
dos solos
• Simulacao de composicoes com caracterısticas de grandes guitarristas do blues
• Facilitar o aprendizado de iniciantes em composicao
• Criacao de uma biblioteca que auxilia a composicao de solos de blues
1.4 Organizacao do Texto
No Capıtulo 2, e apresentado uma revisao sobre os trabalhos que utilizaram os mo-
delos Markovianos para compor.
No Capıtulo 3, e mostrada a definicao da cadeia de Markov e suas aplicacoes.
6 Introducao
No Capıtulo 4, e detalhada a interface da biblioteca Midifile. Seus metodos e atri-
butos sao explicados, assim como sua estrutura.
No Capıtulo 5 e apresentada a metodologia do trabalho. Alguns conceitos sobre
musica e estrutura de dados sao apresentados para melhor entendimento do leitor. As
ferramentas utilizadas neste trabalho e a classe implementada sao discutidas aqui.
No Capıtulo 6 sao apresentados os experimentos e os resultados obtidos.
No Capıtulo 7 e discutida a conclusao sobre este trabalho.
Capıtulo 2
Revisao da Literatura
“A musica nao mente. Se tem algo a ser mudado neste mundo, isso so vai ser possıvel
atraves da musica.”
— Jimi Hendrix, 1942-1970
Neste capıtulo, apresentaremos trabalhos passados que realizaram composicoes al-
gorıtmicas utilizando modelos Markovianos.
2.1 Modelos de Markov em Composicao Algorıtmica
Os modelos Markovianos em composicao algorıtmica analisam os diferentes estados
de um determinado acervo, e extraem as probabilidades de transicao entre si. Baseando
nas probabilidades extraıdas e possıvel gerar uma sequencia de novos estados.
Segundo Nierhaus (2009), por volta do ano de 1950, Harry F. Olson (1901 - 1982) foi
o primeiro homem a analisar o comportamento das cadeias de Markov em composicao
algorıtmica. Olson foi um engenheiro eletrico e desenvolveu o “Sintetizador Musical
Eletronico” no ano de 1955, em parceria com Henry Belar. Olson analizou onze melodias
e produziu modelos Markovianos de primeira e segunda ordem em relacao as notas e
ritmos das melodias. Olson notou que modelos Markovianos de segunda ordem geram
melodias mais harmoniosas do que de primeira ordem.
Brooks, Hopkins, Neumann & Wright (1957) utilizaram 37 melodias de corais de
estruturas rıtmicas similares para desenvolver um modelo Markoviano com analises e
geracoes subsequentes dessas melodias. As 37 melodias eram 4/4, comecavam no quarto
7
8 Revisao da Literatura
tempo do compasso, a duracao de suas notas equivaliam a no mınimo uma colcheia,
as notas com a altura de 4 oitavas eram representadas por inteiros entre 2 e 99, onde
os numeros pares representam um evento de uma nova nota e os ımpares uma nota
que transitou de uma anterior. Para a realizacao desta analise todas as melodias foram
transpostas para do maior. A partir do conjunto de melodias, modelos Markovianos de
ate oitava ordem foram criados e representados em forma de octagramas. O numero de
ocorrencias de cada sequencia de oito notas tambem foram armazenados. Na geracao do
material musical algumas condicoes foram estabelecidas, como a proibicao de pausas em
algumas posicoes do compasso e as melodias deveriam terminar com uma determinada
escala de notas. Este estudo aponta 3 problemas que podem ocorrer com as estruturas
geradas pela cadeia de Markov:
• Os modelos de ordem mais baixa geram sequencias com uma aleatoriedade notavel
• Cadeias de ordem mais alta tem numero de opcoes limitado
• Sao desnecessarias analises de cadeias de ordem mais alta quando as melodias sao
bastante similares
A cadeia de Markov foi a pioneira nos processos de composicao algorıtmica. (Hiller &
Isaacson 1979) foi o primeiro trabalho a registrar o uso de algoritmos para a composicao
de musicas em um computador. Hiller & Isaacson (1979) desenvolveram um sistema
que gera notas musicais aleatorias utilizando modelos Markovianos. Este sistema foi
chamado de Illiac Suite e teve sua primeira performance no ano de 1956, ficando fa-
moso como o primeiro computador compositor. O Illiac Suite consiste em 4 acoes que
correspondem a 4 experimentos. O primeiro experimento gera cantus firmi, isto e, me-
lodias diatonicas simples a serem utilizadas para a producao de polifonia simples. No
segundo experimento algumas regras foram estabelecidas na geracao do cantus firmi. O
terceiro experimento baseou-se em demonstrar que um computador pode produzir no-
vas estruturas musicais em um estilo mais contemporaneo e codificar alguns elementos
musicais como ritmo e algumas dinamicas. E o quarto experimento consiste em tecnicas
de analise musical, como os modelos Markovianos, para produzir diferentes especies de
musica.
Em (Papadopoulos & Wiggins 1999) e feita uma revisao crıtica sobre varios algorit-
mos usados para composicao musical. Sao mostradas as principais vantagens e desvan-
tagens. As cadeias de Markov sao mencionadas como um dos algoritmos mais antigos
Revisao da Literatura 9
usados em composicao e caracterizadas por sua facilidade de composicao em diferentes
generos.
Xenakis (1992) utiliza os modelos Markovianos para organizar segmentos de diferen-
tes dinamicas. Esses segmentos, chamados de “screens”consistem em sons com diferentes
dinamicas e um grupo de instrumentos. Uma cadeia de Markov e construıda definindo
as probabilidades de transicao entre os “screens”.
Feijao (2004) criou um algoritmo para compor solos de jazz em tempo real. Nele
foram implementadas tecnicas utilizadas por musicos durante os seus improvisos usando
varias regras. Se baseando em tecnicas utilizadas pelo musico durante o seu solo, um
novo modelo estocastico representado por uma cadeia de Markov ira reproduzir solos.
O usuario ira avaliar a saıda do algoritmo em tempo real, desta forma um processo de
aprendizado ira alterar os parametros da cadeia de Markov como forma de aprendizado.
O objetivo do artigo (Verbeurgt, Dinolfo & Fayer 2004) foi realizar uma nova abor-
dagem em CA (Composicao Algorıtmica) atraves de tecnicas de extracao de padroes.
Serao extraıdos padroes de composicoes ja existentes para representar o conjunto de
estados de um modelo Markoviano. As probabilidades de transicao da cadeia de Markov
serao definidas pelas sequencias musicais dessas composicoes. A tecnica de deteccao de
padroes leva em consideracao 3 dimensoes: tempo, nota e duracao. Padroes de notas
sao considerados equivalentes quando ha mudanca no tempo e na duracao de todas as
notas. Apos a extracao desses padroes e feita a cadeia de Markov, o objetivo de Ver-
beurgt, Dinolfo & Fayer (2004) e compor musicas novas. O grande desafio encontrado
neste trabalho foi sequenciar os padroes de tal forma a preservar a solidez musical.
2.2 Conclusao
Nesta secao sao apresentados alguns trabalhos que utilizaram os modelos Marko-
vianos para compor melodias, que por sinal foi pioneiro nos processos de composicao
algorıtmica, se mostrando bastante eficaz na composicao de musicas de generos variados
segundo (Papadopoulos & Wiggins 1999). Brooks, Hopkins, Neumann & Wright (1957)
concluıram que as cadeias de Markov de ordem muito baixa geram sequencias com uma
aleatoriedade notavel e as cadeias de ordem mais alta tem numero de opcoes limitado.
Assim, este e um problema historico, portanto sera estudado uma ordem intermediaria
para gerar os solos de blues, ou mesclar as ordens baixas com as altas.
10
Capıtulo 3
Cadeia de Markov
“O blues e como um planeta. E um topico enorme. Voce nao pode ignorar o impacto que
ele teve e continua a ter em toda a cultura musical. E uma arvore em que todo mundo
esta balancando. Sem ela, eu nao sei onde eu estaria. E indelevel e indispensavel.”
— Tom Waits, 1949
As cadeias de Markov foram criadas pelo matematico russo Andrey Andreyevich
Markov. Nascido em Ryazan em 1856, foi professor da Universidade de S. Petersburgo,
e pioneiro nos processos estocasticos (conjunto de variaveis aleatorias indexadas a ele-
mentos pertencentes a um intervalo temporal). A cadeia de Markov e um processo
randomico onde o proximo estado depende unicamente do estado atual e pode ser apli-
cado em processos da nossa realidade para levantar dados estatısticos. Partindo de um
estado, existe uma matriz de probabilidades que definira o proximo estado. As mudancas
de um estado para outro sao chamadas de transicoes e as probabilidades associadas as
mudancas sao chamadas de probabilidades de transicao.
Segundo Dimuro, Reiser, Costa & Souza (2002), os processos markovianos sao mode-
lados formalmente por sistemas de transicoes de estados, onde os estados sao represen-
tados em termos de seus vetores probabilısticos, que podem variar no espaco temporal
(discreto ou contınuo), e as transicoes entre estados sao probabilısticas e dependem
apenas do estado corrente.
11
12 Cadeia de Markov
3.1 Formulacao Matematica
Considere uma cadeia de Markov com N estados xn ∈ I, onde I e o espaco de estados
discreto da cadeia de Markov e sejam xi, xj ∈ I. Denota-se xi(t) para significar que o
processo esta no estado xi no tempo t. Se Pij e a probabilidade de transicao do estado
xi(t) para o estado xj(t+ 1), entao a matriz N ×N , dada por P = [pij], denomina-se a
matriz de transicao da cadeia de Markov.
A Tabela 3.1 e uma matriz de transicoes podendo ser interpretada da seguinte forma:
as linhas representam os estados atuais, as colunas os estados futuros e os valores
numericos sao as probabilidades de transicao entre os estados. Por exemplo a estado
estado atual 1 tem 40% de ir para o estado estado futuro 1, 30% de ir para o estado
estado futuro 2 e outros 30% de ir para o estado futuro 3, e assim analogamente para as
outras linhas. Note que para que a matriz seja consistente a soma dos valores de cada
linha deve ser igual a 1 e nao deve haver valores negativos.
Tabela 3.1: Matriz de transicao
estado futuro 1 estado futuro 2 estado futuro 3
estado atual 1 0,4 0,3 0,3
estado atual 2 0,7 0,1 0,2
estado atual 3 0,5 0,5 0
A matriz de transicao tambem pode ser dada por um diagrama de transicoes de
estados, isto e, um grafo (estrutura representada por vertices e arestas). A Figura 3.1
e um modelo Markoviano onde os vertices representam notas musicais e as arestas a
probabilidade de uma nota musical suceder outra. Neste exemplo podemos ver que a
partir do estado E, existe uma probabilidade de 30% de se continuar no estado E, 50%
de transicao para o estado A e 20% para o estado B. Partindo do estado A, temos 30%
de se continuar no estado A, 60% de transicao para o estado E e apenas 10% para o
estado B. Finalmente, a partir do estado B temos 30% de probabilidade de permanecer
no mesmo estado B, outros 30% de ir para o estado A e 40% de transicao para o estado
E.
Duas propriedades devem ser satisfeitas para que um grafo possa ser considerado um
modelo Markoviano:
Cadeia de Markov 13
0.5
0.3
0.2
0.4
0.3
0.3
0.1
0.6
0.3
E A
B
Figura 3.1: Cadeia de Markov representada por um grafo
• A soma dos valores das arestas que saem do grafo devem ser iguais a 1, ou seja,
arestadesaida1 + arestadesaida2 + · · ·+ arestadesaidan = 1.
• Os valores dos arcos do grafo devem ser nao negativos.
3.2 Exemplo de um modelo Markoviano para represen-
tar mudancas climaticas
Vejamos um exemplo simples de uma cadeia de Markov modelada para representar
a mudanca de tempo, ou seja, as transicoes entre dias chuvosos e ensolarados. Vamos
considerar a seguinte matriz
P =
0, 67 0, 5
0, 33 0, 5
(3.1)
onde a primeira coluna representa as probabilidades de transicao de um dia chuvoso
para um dia chuvoso (67%) ou ensolarado (33%). A segunda coluna representa as pro-
babilidades de transicao de um dia ensolarado para um dia chuvoso (50%) ou ensolarado
(50%).
14 Cadeia de Markov
Vamos supor o dia 0 como chuvoso e representa-lo atraves do vetor de estado inicial
V (0) =
1
0
(3.2)
que indica uma probabilidade de 100% do dia ser chuvoso. O tempo no dia 1 pode
ser deduzido atraves da multiplicacao V ×P , isto e:
V (1) = V (0)P =
0, 67 0, 5
0, 33 0, 5
1
0
=
0, 67
0, 33
(3.3)
Isto significa que o dia 1 tem 67% de chance de continuar chuvoso e 33% de chance
de ser ensolarado.
Analogamente,
V (2) = V (1)P =
0, 67 0, 5
0, 33 0, 5
0, 67
0, 33
=
0, 614
0, 386
V (3) = V (2)P =
0, 67 0, 5
0, 33 0, 5
0, 614
0, 386
=
0, 604
0, 396
V (4) = V (3)P =
0, 67 0, 5
0, 33 0, 5
0, 604
0, 396
=
0, 603
0, 397
V (5) = V (4)P =
0, 67 0, 5
0, 33 0, 5
0, 603
0, 397
=
0, 603
0, 397
(3.4)
Cadeia de Markov 15
De acordo com o Exemplo 3.5, a formula geral e.
V (n) = V (0)P (n) = V (n−1)P (3.5)
Note que para obter as probabilidades do dia n e necessario obter as probabilidades dos n
dias anteriores. Tambem podemos perceber que a partir do quarto dia o vetor de estado
do sistema nao se altera, neste caso podemos dizer que o processo de Markov atingiu o
equilıbrio (nem todos os modelos Markovianos atingem o equilıbrio). Este vetor fixo e
chamado de vetor de estado estacionario, isto e, seu fluxo de entrada e igual ao seu fluxo
de saıda.
3.3 Modelos Markovianos e suas ordens
Os modelos Markovianos podem ser de n ordens. Dizer que uma cadeia de Markov e
de primeira ordem significa dizer que o estado futuro depende apenas do estado anterior.
Dizer que e de segunda ordem significa dizer que o estado futuro depende dos dois estados
anteriores. Resumindo, um modelo Markoviano de ordem n implica que um estado futuro
e dependente dos n estados anteriores.
Neste trabalho serao criados modelos Markovianos de ordem n. Isto e, poderemos
definir o numero de estados anteriores dos quais o estado futuro dependera.
A Figura 3.2 ilustra um modelo Markoviano de ordem 2, onde as notas F 1 e C sao
tocadas 2 vezes (40% das vezes) e 3 vezes (60% das vezes), respectivamente, apos a
sequencia das notas D e C. Da mesma forma a nota G e tocada 5 vezes (100% das vezes)
apos a sequencia das notas A e B.
Ja a Figura 3.3 ilustra um moledo Markoviano de ordem 3, onde as notas G e A
sao tocadas 1 vez (12.5% das vezes) e 7 vezes (87.5% das vezes), respectivamente, apos
a sequencia das notas D, F e G. Da mesma forma as notas B e G sao tocadas 4 vezes
(44.44% das vezes) e 5 vezes (55.66% das vezes), respectivamente, apos a sequencia das
notas C, D e F.
As diferentes ordens influenciam na harmonia e diversidade das musicas compostas
pelos modelos Markovianos.
1Usualmente a notacao musical anglo-saxonica e utilizada, onde as letras A, B, C, D, E, F, Grepresentam as notas la, si, do, re, mi, fa e sol, respectivamente
16 Cadeia de Markov
DC AB
[F,2] [C,3] [G,5]
Figura 3.2: Cadeia de Markov de ordem 2
DFG CFD
[G,1] [A,7] [G,5][B,4]
Figura 3.3: Cadeia de Markov de ordem 3
3.4 Conclusao
Com o estudo das cadeias de Markov, podemos concluir que e possıvel representar um
modelo onde os estados representam notas musicais. As transicoes seriam as mudancas
de notas. As probabilidades de transicao podem ser definidas pelo numero de vezes
que uma nota sucedeu outra. Cadeias de Markov de varias ordens serao criadas, com
o intuito de encontrar as ordens que geram solos mais harmonicos e diversos. Assim
teremos um conhecimento previo de quais direcoes iremos seguir na fase de composicao
de novos solos.
Capıtulo 4
Conceitos Musicais e Midifile
Neste capıtulo falaremos sobre alguns conceitos musicais importantes para o entendi-
mento deste trabalho.Tambem sera introduzido o conceito de uma ferramenta funda-
mental para o desenvolvimento deste trabalho, a Midifile.
4.1 Conceitos Musicais
Para dar inıcio a este trabalho alguns conceitos sobre teoria musical serao explicados
nesta secao para um melhor entendimento do leitor.
4.1.1 Notas musicais
O conceito de uma nota musical depende do conceito de frequencia. Frequencia e uma
grandeza da fısica que indica o numero de oscilacoes da onda em um determinado tempo.
As frequencias que determinam as notas. A onda de uma frequencia e constituıda por:
• Amplitude: determina a altura da onda, ou seja, o seu tamanho vertical.
• Comprimento: distancia entre valores repetidos sucessivos num padrao de onda.
Uma nota musical e o termo usado para medir uma frequencia musical. Podemos rela-
cionar as notas a um alfabeto musical que possibilita associar determinadas frequencias.
A escala diatonica e composta por sete notas musicais:
• do, representada pela letra C e com frequencia de 261.625519 Hz.
• re, representada pela letra D e com frequencia de 293.664734 Hz.
17
18 Conceitos Musicais e Midifile
• mi, representada pela letra E e com frequencia de 329.627533 Hz.
• fa, representada pela letra F e com frequencia de 349.228241 Hz.
• sol, representada pela letra G e com frequencia de 391.995392 Hz.
• la, representada pela letra A e com frequencia de 440 Hz.
• si, representada pela letra B e com frequencia de 493.883301 Hz.
Ja a escala cromatica e constituıda por 12 notas, sao adicionadas 5 notas na escala
diatonica com prefixos sustenido e bemol. Nesta escala o intervalo entre cada nota e
equivalente a um semitom, os sımbolos # e b significam sustenido e bemol respectiva-
mente:
• do sustenido (ou re bemol), representada pela letra C# ou Db e com frequencia
de 277.182648 Hz.
• re sustenido (ou mi bemol), representada pela letra D# ou Eb e com frequencia
de 311.126984 Hz.
• fa sustenido (ou sol bemol), representada pela letra F# ou Gb e com frequencia
de 369.994385 Hz.
• sol sustenido (ou la bemol), representada pela letra G# ou Ab e com frequencia
de 415.304688 Hz.
• la sustenido (ou si bemol), representada pela letra A# ou Bb e com frequencia de
466.163788 Hz.
4.1.2 Altura
A forma como o ouvido humano percebe a frequencia dos sons e denominada altura.
As baixas frequencias, ou seja, ondas com um baixo numero de oscilacoes em um de-
terminado tempo sao percebidas como sons graves e as altas frequencias, isto e, ondas
com alto numero de oscilacoes em um determinado tempo sao percebidas como os sons
agudos. A mınima frequencia que o ouvido humano pode perceber esta em torno de 20
Hz (unidades de frequencia) e a maxima, por volta de 20.000 Hz.
Conceitos Musicais e Midifile 19
4.1.3 Tom
Um tom e a diferenca entre duas alturas. E o maior intervalo entre duas notas
sequenciais e e constituıdo por dois semitons. Tambem muito utilizado na maioria das
musicas ocidentais, pois nas musicas orientais existe o quarto de tom. No piano, a altura
entre duas teclas brancas quando ha uma tecla preta entre elas ou entre duas teclas pretas
corresponde a um tom. O semitom equivale a diferenca de altura produzida por duas
notas contıguas do piano, e o menor intervalo entre duas notas sequenciais da musica
ocidental.
A palavra tom pode ser usada para identificar uma certa altura em Hz, por exemplo,
o tom em A e de 440 Hz. As melodias criadas neste trabalho sao compostas no tom
A. Mas a palavra tom pode representar a diferenca em Hz de duas notas, por exemplo,
existe um tom entre as notas A e B, C e D. A definicao de tom pode estar relacionado
com a altura ou com intervalos.
4.2 Tablatura
A palavra tablatura vem do latim: tabulatura. Tabula e uma tabua, prancha ou lousa
em latim. Tabular alguma coisa significa coloca-la em uma tabua, prancha ou lousa. A
tablatura e uma forma de notacao musical, um modo de ler a musica. Basicamente
ela informa ao interprete o local do instrumento onde deve ser tocado. Na maioria das
vezes e usado para instrumentos de cordas trasteados. Os trastes de um instrumento de
cordas sao divisoes com diferenca de meio tom. Por abordar um contexto mais simples
de entendimento, a tablatura foi escolhida como a forma para representar os licks que
serao criados.
Na guitarra ou violao, a tablatura e representada por 6 linhas horizontais que repre-
sentam as 6 cordas. Em cada corda e sobrescrito um numero: o numero 0 significa tocar
a corda solta, o numero 1 significa tocar a corda pressionando-a na primeira divisao de
trastes do braco do violao, o 2 ignifica tocar a corda pressionando-a na segunda divisao
de trastes, e assim sucessivamente. A tablatura indica quando iniciar uma nota, porem
nao ha uma indicacao precisa de quanto tempo ela deve durar, deixando a duracao
a criterio do interprete. Por este fato caracterizamos a tablatura como uma notacao
prescritiva.
Pela Figura 4.1 podemos entender melhor a representacao de uma tablatura, onde
as letras no inıcio das linhas horizontais representam a notacao padrao de um violao ou
20 Conceitos Musicais e Midifile
guitarra, E = mi, A = la, D = re, G = sol, B = si, e = mi. A primeira e a ultima
corda representam a mesma nota (mi), porem em alturas diferentes, onde e e uma nota
mais aguda e E uma nota mais grave. Os numeros que estao verticalmente alinhados
representam notas tocadas simultaneamente. As notas sao lidas da esquerda para a
direita, representando a ordem em que elas sao tocadas.
e|-------5-7-----7-8-----8-2-----2-0---------0--------------|
B|-----5-----5-------5-------3-------1---1-----1-----0-1-1--|
G|---5---------5-------5-------2-------2---------2---0-2-2--|
D|-7-------6-------5-------4-------3-----------------2-2-2--|
A|---------------------------------------------------2-0-0--|
E|----------------------------------------------------------|
Figura 4.1: Exemplo Tablatura
Existem outros sımbolos que representam certas tecnicas aplicadas as notas, como
o ’b’ que significa um bend aplicado a uma certa nota, que significa levantar a corda
tocada. Isto e apresentado na Figura 4.2.
e|-------5-7b----7-8b----8-2--|
B|-----5-----5-------5------3b|
G|---5---------5b------5------|
D|-7b------6b------5-------4--|
A|----------------------------|
E|----------------------------|
Figura 4.2: Tablatura com bend
Um ’s’ entre duas notas, que significa um slide de uma nota para outra, ou seja, voce
toca uma nota e escorrega o dedo ate atingir a outra. Isto e apresentado na Figura 4.3.
e|-------5s7----7s8----8s2----|
B|----------5-------------5s3-|
G|-----------5s7--------------|
D|-7s5-------------5----------|
A|----------------------------|
E|----------------------------|
Figura 4.3: Tablatura com slide
Um ’˜’ que representa o vibrato, que e basicamente um movimento tremido em cima
da nota tocada. Isto e apresentado na Figura 4.4.
Conceitos Musicais e Midifile 21
e|-------5~-------7------8~---|
B|-----5------5~------------3-|
G|---5~---------------5~------|
D|-7-------6~--------------4--|
A|----------------------------|
E|----------------------------|
Figura 4.4: Tablatura com vibrato
E o ’h’ que significa hammer, ou seja, como se voce aplicasse uma martelada com os
dedos na nota tocada. Isto e apresentado na Figura 4.5.
e|--------------7h--------2--|
B|-----5h----5--------------3|
G|---5----------------5h-----|
D|-7------6h-------------4---|
A|---------------------------|
E|---------------------------|
Figura 4.5: Tablatura com hammer
4.3 Esboco da estrutura padrao de um arquivo MIDI
Midifile e uma classe da linguagem C++ que permite a leitura e escrita de arquivos
MIDI, (Sapp 2015). Pode ser compilado em multiplas plataformas como Linux, OS X e
Windows.
Um arquivo MIDI padrao basicamente e composto por chunks (pedacos). O primeiro
chunk e um header chunk (cabecalho) e os demais sao track chunks (faixas). O header
chunk contem dados que pertencentes a todo o arquivo e os outros pedacos definem
faixas logicas.
midifile =< headerchunk > + < trackchunk > [+ < trackchunk > ...]
Cada chunk possui 3 componentes:
1. 4 caracteres que representam o ID da faixa. Por exemplo, o ID do cabecalho e
“MThd”e o ID das faixas e “MTrk”.
2. Um valor de 4 bytes que especifica o numero de bytes da secao de dados da faixa
(item 3).
22 Conceitos Musicais e Midifile
3. A secao de dados da faixa.
O header chunk consiste em uma string MThd indicando que e um cabecalho, o seu
tamanho, o formato do arquivo MIDI, o numero de faixas no arquivo e um valor de
tempo especificando unidades de tempo delta (diferenca entre 2 valores de tempo).
headerchunk = ”MThd”+ < length > + < format > + < n > + < division >
O primeiro componente do header chunk e literalmente a string MThd ou o valor
hexadecimal (0x4d546864) indicando se tratar de um arquivo MIDI. O segundo compo-
nente indica o tamanho do header chunk em bytes. O terceiro representa o formato do
arquivo MIDI, onde 0 indica formato de faixa simples, 1 indica formato em multiplas
faixas e 2 indica formato de multiplas musicas. O quarto e o numero de track chunks
que sucedem o header chunk. E o quinto e um valor em unidades de tempo delta. Se
este valor for positivo ele representa o numero de unidades por batida (ticks per beats).
Se for negativo o tempo delta esta em unidades compatıveis SMPTE.
Os track chunks consistem em uma string MTrk indicando que esta e uma faixa, o
seu tamanho e os dados dos eventos que compoem a faixa.
trackchunk = ”MTrk”+ < length > + < trackevent > [+ < trackevent > ...]
O primeiro componente do track chunk e a string MTrk que marca o inicio da faixa.
O segundo e o tamanho da faixa em bytes. O terceiro e ultimo sao os dados de eventos
que compoem a faixa, ou seja, uma sequencia de track events.
Um trackevent consiste em um tempo delta desde o ultimo evento e 1 entre 3 tipos
de eventos.
trackevent =< vtime > + < midievent > | < metaevent > | < sysexevent >
O vtime e o tempo decorrido desde o ultimo evento ate o atual. O midievent e
qualquer mensagem do canal MIDI, pode ser um note-on ou um note-off, indicando
para iniciar ou encerrar uma nota. O metaevent e um evento que pode armazenar
outras informacoes que nao sejam necessariamente sobre a nota.
4.4 As classes da biblioteca Midifile
Aqui iremos explicar os metodos e atributos da classe Midifile e como ela manipula
os arquivos MIDI.
Conceitos Musicais e Midifile 23
4.4.1 Classe TickTime
A classe TickTime contem apenas 2 atributos: o tick que e um valor de tempo
em unidades proprias do MIDI chamadas de ticks e o seconds que e o valor do tick
propriamente em segundos. Esta classe e usada para construir um mapeamento de todos
os ticks de um MIDI e seus respectivos valores em segundos. Na classe Midifile e criado
um arranjo de TickTime para representar este mapeamento.
4.4.2 Classe MFEvent
A classe Midifile e composta basicamente por uma lista de MFEvent (Eventos
Midifile). Um MFEvent contem os seguintes atributos:
• O atributo time que e um inteiro representando unidades proprias do MIDI (ticks).
O valor de um tick pode ser representado tanto no modo TIME STATE DELTA
quanto no modo TIME STATE ABSOLUTE, dependendo da configuracao da
classe Midifile que guarda o MFEvent. Se o tempo estiver no modo delta, significa
que ele e a diferenca entre o inıcio do ultimo evento ate o evento atual. Caso esteja
no modo absolute, ele e um valor absoluto de tempo da faixa.
• O atributo track, um inteiro indicando o ındice da faixa que ele esta contido
• O atributo data representando os dados do evento, que se trata de um arranjo de
caracteres de 3 posicoes.
A classe MFEvent possui 7 construtores que podem receber parametros para inici-
alizar os atributos da classe MFEvent apresentados anteriormente. Um construtor de
copia tambem foi implementado para receber um objeto MFEvent como parametro,
alem de um destrutor.
Ela tambem possui algumas funcoes convenientes para analisar seu conteudo. Como
as funcoes isNoteOn e isNoteOff que enviam mensagens dizendo se a nota esta sendo
tocada ou encerrada, respectivamente. A mensagem isNoteOn contem parametros que
denotam o tom e a velocidade (intensidade da nota ao ser tocada) da nota que esta
sendo tocada. Ja a mensagem isNoteOff denota a mudanca da nota em execucao para
uma outra. Toda mensagem isNoteOn e sucedida por uma isNoteOff, senao a nota
sera tocada indefinidamente.
As mensagens podem conter dados MIDI ou nao. As mensagens que nao contem
esses dados sao chamadas de meta mensagens. Elas podem conter dados sobre alguma
24 Conceitos Musicais e Midifile
alternancia no tempo da musica ou simplesmente representar a mudanca do instrumento
que o som sera tocado. As funcoes isMeta e isTempo retornam true se a mensagem e
uma meta mensagem e se a meta mensagem descreve o tempo, respectivamente.
Os getters desta classe podem retornar o valor do tempo em microssegundos (getTem-
poMicroseconds) e segundos (getTempoSeconds) para cada semınima, batimentos
por minuto (getTempoBPM), ticks por segundo (getTempoTPS) e segundos por
ticks (getTempoSPT). Tambem possui getters que retornam os valores dos comandos
MIDI como o command nibble, isto e, o valor que representa a nota a ser tocada e o
channel nibble, ou seja, o canal (instrumento) que toca a nota. Comandos MIDI podem
ser decompostos em um command nibble e um channel nibble, ambos de 4 bytes. Eles
podem ser representados por numeros binarios ou hexadecimais, porem e mais comum
serem vistos em formato hexadecimal.
4.4.3 Classe Midifile
A classe Midifile possui apenas 2 construtores que inicializam os seguintes atributos:
• events, um arranjo de MFEvent
• ticksPerQuarterNote, inicializada com o valor padrao 48, define o tempo com
48 ticks por semınima
• trackCount, indica o numero de tracks no arquivo, quando inicializada recebe o
valor 1
• theTrackState, estado do track, pode ser inicializado como split ou join. O
estado join significa que a faixa e a uniao de varias faixas em uma so, podendo ser
dividida. O estado split significa que a faixa e unica e nao pode ser dividida.
• theTimeState, estado do tempo, pode ser inicializado como delta ou absolute
• readFileName, le o nome do arquivo e retorna um arranjo de caracteres
• timemap, um arranjo de TickTime
• timemapvalid, indicando se existe ou nao um timemap construıdo
As principais funcoes da classe Midifile serao apresentadas a seguir.
Para nomear um arquivo, a funcao setFilename e utilizada.Para se obter o nome
de um arquivo usa-se a funcao getFilename.
Conceitos Musicais e Midifile 25
A funcao getTrackCount retorna o numero de faixas do arquivo MIDI. A funcao
getTrackCountAsType1 tambem retorna o numero de faixas contidas em um arquivo
MIDI, mas pode retornar o tamanho dos eventos se nao estiver no estado join. Caso
esteja no estado mesclado (join) le a faixa 0 e procura pelo maior valor das faixas em
seu estado separado (unjoin).
Para deletar uma faixa e utilizada a funcao deleteTrack. Com o metodo erase um
arquivo MIDI e deixado vazio, com apenas uma faixa e nenhum dado contido nela.
O metodo addTrack adiciona uma faixa em branco no final da lista de faixas e
retorna o numero de sua posicao na lista. Com o metodo joinTracks e possıvel mes-
clar os dados de todas as faixas, porem mantendo a identidade das faixas unica, para
que a funcao splitTracks possa separar as faixas novamente. A funcao mergeTracks
combina os dados de duas faixas em uma, deixando o dado na primeira faixa listada e
movendo as outras faixas para a segunda faixa. O resultado desta funcao nao pode ser
revertido.
Esta classe tambem possui metodos que ordenam os eventos de uma unica faixa
(sortTrack) ou todas as faixas de um arquivo MIDI (sortTracks).
A variavel tempo desta classe pode ser definida como absolute ou delta, para isto os
metodos absoluteTime e deltaTime convertem a variavel para o tipo que se deseja
usar. O metodo getTimeState retorna este tipo.
Pode-se adicionar eventos com a funcao addEvent ou meta eventos com a funcao
addMetaEvent, essas funcoes retornam o numero de eventos existentes no objeto. Para
obter um evento de um ındice passado como parametro, utiliza-se a funcao getEvent.
Com a funcao getNumEvents, e possıvel obter o numero de eventos de uma faixa,
onde o ındice da faixa e passado como parametro.
E possıvel obter o numero de ticks que ocorrem durante uma semınima atraves
do metodo getTicksPerQuarterNote e definir com o metodo setTicksPerQuarter-
Note. E com a funcao getAbsoluteTickTime obtem-se o valor absoluto em Tick-
Time do tempo.
Por ultimo, as principais funcoes da classe sao a read, que le um arquivo MIDI e
guarda o seu conteudo, e write que escreve um arquivo MIDI, ou seja, exporta um
arquivo MIDI com um nome passado por parametro.
26 Conceitos Musicais e Midifile
4.5 Representando uma melodia com a classe Midifile
A seguir veremos um exemplo de como criar um arquivo MIDI utilizando a classe
Midifile.
Primeiramente o construtor e chamado e logo em seguida e padronizado o tempo em
absoluto com o metodo absoluteTime da classe Midifile. Com um outro metodo desta
classe chamado addTrack sao adicionadas duas faixas ao objeto. Definimos o numero
de ticks por semınima com o metodo setTicksPerQuarterNote, geralmente o valor
padrao de numero de ticks e 48.
Um arranjo de caracteres e criado para guardar eventos e instanciado com um ta-
manho em bytes passado por parametro. Vetores de inteiros tambem sao criados para
representar as notas. Por exemplo, o numero 60 representa a nota do. Somar uma
unidade do numero implica representarmos a proxima nota de acordo com a escala
cromatica. Subtrair uma unidade no numero implica representarmos a nota anterior da
escala cromatica.
Para guardar a melodia e o tempo representados pelos vetores de inteiros no arquivo
vamos iniciar uma variavel que dara o inıcio do tempo com o valor zero e definimos um
valor para a velocidade da nota tocar ou encerrar.
Dentro de um laco de repeticao, as notas dos vetores de inteiros sao inseridas uma
por uma no arquivo com o metodo addEvent que possui 3 parametros: um inteiro
indicando a faixa que sera incluso, o tempo que o evento acontecera e o evento. Isto e
feito incluindo o vetor de notas mais agudas na faixa 1 e o vetor de notas mais graves
na faixa 2.
A funcao sortTrack entao ordena os eventos do arquivo caso eles se encontrem
desordenados. Finalmente a funcao write exporta o arquivo escrito em formato MIDI.
4.6 Conclusao
Neste capıtulo foi apresentada uma ferramenta essencial para o desenvolvimento deste
trabalho. A biblioteca Midifile possui metodos simples e de facil entendimento que abor-
dam muitas maneiras de manipulacao dos dados. Esta classe nos permite a importacao
e exportacao de arquivos MIDI trivialmente, assim com o acesso de seus componentes.
Desta forma e possıvel analisar as probabilidades de uma nota acontecer apos uma outra
em um arquivo MIDI e construir uma cadeia de Markov.
Capıtulo 5
Metodologia
“O blues nao e sempre triste. Quando estou deprimido, escuto um blues e volto a me
sentir bem.”
— John Lee Hooker, 1917-2001
Neste capıtulo serao apresentados a metodologia e tecnicas abordadas para realizar
a composicao dos solos de blues. Tambem sao apresentados as ferramentas, algoritmos
e estruturas de dados usados para desenvolver este trabalho.
5.1 Guitar Pro
O Guitar Pro e um software desenvolvido pela companhia francesa Arobas Music.
Edita e toca tablaturas para musicos que desejam obter progresso, compor ou simples-
mente aprender a tocar em seu violao ou sua guitarra. Este software possui a opcao de
escolher varios instrumentos para representar uma partitura escrita, ou seja, voce pode
escolher entre uma guitarra, piano, flauta, dentre outros para emitir o som desejado.
Sua interface tem a vantagem de permitir que se veja as notas sendo tocadas no
instrumento (as opcoes sao: piano, guitarra e baixo) ao mesmo tempo que as ouve,
facilitando o aprendizado de como tocar as notas. O Guitar Pro tambem permite o
controle dinamico do volume de todos os instrumentos que estao sendo executados em
uma faixa, permitindo um ajuste do volume de cada instrumento em tempo real, da
maneira que voce achar melhor. A Figura 5.1 mostra a interface do Guitar Pro.
Arquivos em formato MIDI podem ser importados e exportados atraves deste soft-
27
28 Metodologia
Figura 5.1: Interface do Guitar Pro
ware. Desta forma, ele nos auxiliara na criacao do banco de dados de licks. Para iniciar
este trabalho vamos compor uma base com 100 licks.
Para realizar a composicao dos licks, primeiro iniciaremos um novo projeto do Guitar
Pro, onde ira aparecer em sua interface 6 linhas em branco (iguais as linhas que represen-
tam as cordas de um violao, onde voce podera inserir uma nota clicando sobre a linha e
digitando o numero correspondente ao traste do violao que a nota e representada. Apos
inserir uma nota, com as setas do teclado voce vai caminhando na linha (que representa
a corda da guitarra) e inserindo as proximas notas. Outra forma mais facil de compor
e com a opcao de tocar as notas diretamente na imagem do instrumento. Por exemplo,
pode-se clicar em um ıcone que mostrara o braco de uma guitarra e com o mouse voce
clica em cima da corda que deseja tocar e a tablatura e automaticamente escrita. Em
partes da musica como refrao, onde sao repetidas, o Guitar Pro permite a execucao
de loops, para nao ter que escrever novamente na tablatura. Apos a composicao da
tablatura, e so exporta-la para o formato MIDI na opcao export to MIDI.
5.2 Arranjo Associativo
Nos proximos capıtulos e explicado o que sao arranjos associativos e como podem ser
representados na linguagem C++.
Metodologia 29
5.2.1 Definicao
Na ciencia da computacao, arranjos associativos sao definidos como um tipo abstrato
de dados composto por uma colecao de pares (chave, valor). Mapas, tabelas de sımbolo
e dicionarios sao exemplos de arranjos associativos. Quando nos referimos a associacoes,
dizemos que, podemos representar um ındice nao so com numeros, mas com qualquer
tipo de dado, por exemplo uma palavra.
A Figura 5.2 exemplifica um arranjo associativo onde a chave e o nome da pessoa e
o valor seus respectivos salarios.
Arranjo Associativo
Maria R$ 4.000,00
Chave (Índice) Valor
R$ 7.000,00
R$ 2.000,00
R$ 9.000,00
João
Ana
José
Figura 5.2: Arranjo Associativo
5.2.2 Arvores
No contexto da ciencia da computacao, uma arvore e uma estrutura de dados repre-
sentada por nodos e arestas. Um desses nodos e o elemento principal (raiz), que e ligado
por arestas a outros elementos (seus ramos ou filhos). Estes ramos tambem podem pos-
suir seus proprios ramos. Seus elementos sao dispostos em forma hierarquica. A ordem
de uma arvore e o numero maximo de ramos de cada elemento. A Figura 5.3 representa
uma arvore de ordem 2, ou simplesmente chamada de arvore binaria. Cada no pode ter
no maximo 2 nos filhos.
30 Metodologia
Figura 5.3: Arvore binaria
Ja a Figura 5.4 representa a estrutura de uma arvore de ordem 3, ou arvore ternaria.
Note que na Figura 5.4 o ramo central da raiz nao possui outros ramos, isto significa
que a arvore nao precisa estar sempre completa.
Figura 5.4: Arvore ternaria
A arvore binaria tem uma estrutura que garante realizar uma busca de algum dado em
tempo log n se ela estiver ordenada. Cada nodo da arvore pode guardar uma determinada
informacao, comummente denominada de chave. A ordenacao de uma arvore binaria e
dada da seguinte forma: consideramos um valor x como a chave de um nodo, o valor da
chave do filho da esquerda deve ser menor que x e a chave do filho da direita deve ser
maior que x. Uma estrutura de dados representado por uma arvore binaria com chaves
em seus nodos configuradas de forma ordenada pode ser chamada de arvore de busca
binaria.
Suponha que se deseja encontrar uma chave de valor 8 na estrutura da Figura 5.5.
A busca e iniciada pela raiz, que contem a chave de valor 5. As chaves 5 e 8 sao
comparadas. Como 8 e maior que 5, a busca e direcionada para o filho da direita, como
chave 9. Novamente a chave 8 e comparada com a chave 9. Como 8 e menor que 9 a
busca e direcionada para o filho da esquerda. O mesmo processo e feito com a chave 7,
para encontrar a chave 8.
Metodologia 31
Figura 5.5: Busca binaria
Utilizando esta estrategia de busca em arvores, ao seguir um no filho, os demais
nos nao sao examinados, minimizando o espaco de busca e garantindo encontrar uma
solucao (se houver) em tempo log n, onde n representa o numero de elementos na arvore.
A complexidade O(log n) so e garantida caso a arvore esteja com seus elementos orde-
nados. Esta busca e chamada de busca binaria e tambem pode ser utilizada em vetores
ordenados.
Um arranjo associativo pode ser representado por uma arvore, onde cada no contem
um elemento representado por uma chave e um registro. A Figura 5.6 ilustra uma arvore
onde em cada no tem um elemento e cada elemento e um par, representando uma nota
musical e o numero de ocorrencias desta nota em um determinado solo, por exemplo.
Na raiz tem um par indicando que a nota A foi encontrada 2 vezes no solo. A raiz tem
2 nos filhos onde um tem um par indicando que a nota D foi encontrada 5 vezes no solo
e o outro indica que a nota E foi encontrada 3 vezes no solo. Da mesma forma segue os
exemplos dos nos folhas.
5.2.3 Conteiner
Um conteiner e um conceito da linguagem C++ que representa um objeto usado para
guardar e manipular outros objetos, sendo responsavel pela gestao da memoria utilizada
pelos objetos que forem adicionados a ele. Os conteineres tambem possuem funcoes
32 Metodologia
[A,2]
[D,5] [E,3]
[F,4][B,4][G,8]
Figura 5.6: Arranjo associativo representado por uma arvore
para acessar e manipular os objetos que estao contidos nele, essas funcoes garantem um
acesso direto aos objetos ou por iteradores.
A linguagem C++ possui conteineres que replicam estruturas de dados muito co-
muns utilizadas em programacao como: vetores dinamicos (vector), filas (queue), lis-
tas (list), pilhas (stack), conjuntos (set) e os arranjos associativos (map, que e usado
neste trabalho).
5.2.4 Map
O Map e o conteiner da linguagem C++ que representa um arranjo associativo.
Basicamente e constituıdo por um par associado e sao geralmente usados para ordenar
e identificar seus elementos. Internamente, os elementos de um map estao ordenados de
acordo com a sua chave, obedecendo o criterio indicado pelo seu objeto de comparacao
interno. A estrutura de dados utilizada pelo Map e usualmente uma arvore binaria com
estrategias de balanceamento. As arvores explicadas na secao 5.2.2 e apenas uma das
possıveis possibilidades de representacao de um arranjo associativo.
5.2.5 Iteradores
Os iteradores sao objetos de referencia com propriedades semelhantes aos ponteiros.
Sao utilizados para acessar elementos de conteineres. E basicamente um objeto que
aponta para um certo numero de elementos e tem a habilidade de interagir com estes
elementos atraves de um conjunto de operadores.
Os iteradores sao classificados em 5 categorias: input, output, forward, bidirectional
e random access.
As categorias input e output sao as mais limitadas, realizando apenas operacoes
Metodologia 33
sequenciais. As categorias forward e bidirectional abordam as operacoes sequenciais,
mas tambem podem interagir em sentido contrario. E finalmente a categoria random
access implementa todas as funcionalidades anteriores, e tambem acessam elementos
nao sequenciais, isto e podem acessar elementos distantes um do outro. Usaremos os
iteradores para acessar os elementos das cadeias de Markov.
5.3 Utilizando o Conteiner Map para representar uma
cadeia de Markov
Utilizando a linguagem C++, foi implementada uma classe chamada Cadeiade-
Markov. Esta classe contem um arranjo associativo onde a chave e um elemento e cada
registro e outro arranjo associativo.
5.3.1 Representacao
Neste trabalho uma cadeia de Markov sera representada pela estrutura de dados map,
onde o primeiro valor chave do atributo seria um vetor de notas e o valor mapeado um
outro map que tem como valor chave as notas ocorridas posteriormente e como valor
mapeado o numero de ocorrencias dessas notas posteriores.
A Figura 5.7 ilustra uma arvore onde cada nodo e um vector de elementos. E cada
nodo tambem e uma arvore como e ilustrado. Por exemplo, a sequencia CDD e o no
raiz de uma subarvore com filhos representando arranjos associativos, onde as chaves
sao os elementos sucessores (A, B e C) e os valores mapeados sao as ocorrencias destas
sucessoes (2, 3 e 4).
Para que se possa manipular tipos genericos, esta classe foi implementada como
template, o qual permite utilizar conteineres genericos para criar cadeias de qualquer
tipo de dado.
Esta classe possui tres construtores, um deles nao possui parametro de entrada, nao
realiza nenhuma operacao e sua ordem e definida com valor 1. Um outro tem como
parametro de entrada um vetor de notas representado por um conteiner vector criado
como template e sua ordem tambem e definida com o valor 1. Ja o terceiro tem como
parametros um vetor de notas representado por um conteiner vector e a ordem que
pode ser definida. Os dois ultimos construtores explicados chamam a funcao treina que
tem o mesmo parametro de entrada do construtor, um vector como template.
34 Metodologia
ABC
ABA
AAA ABD
BDD
CDD
A,2 B,3 C,4
ACD CDD
Figura 5.7: Representacao de uma Cadeia de Markov
5.3.2 Algoritmo de treinamento a partir de sequencias
A funcao treina realiza uma varredura na sequencia de entrada utilizando um itera-
dor. Ele recebe cada elemento da sequencia e verifica se ja existe na cadeia. Caso nao
exista, um outro map auxiliar e criado e nele adiciona-se como valor chave o elemento
sucessor e o numero 1 (representa uma ocorrencia) como valor mapeado. Caso este ele-
mento ja exista na cadeia, verificamos se o elemento sucessor ja existe em seu registro,
caso nao exista o elemento sucessor e adicionado na cadeia com 1 ocorrencia, se este
elemento existir entao ele e incrementado, aumentado em uma unidade o seu numero
de ocorrencias. Uma outra funcao chamada disp tambem foi criada para imprimir os
registros e as ocorrencias de seus sucessores, auxiliando na visualizacao dos dados para
verificarmos a consistencia da cadeia gerada.
5.3.3 Algoritmo de geracao de sequencias
A funcao gera tem como parametro de entrada um inteiro que representa o tamanho
da sequencia que se deseja gerar (numero de notas que serao sorteadas para compor o
lick). E tem como parametro de retorno um vector como template representando
a sequencia gerada. Para iniciar a geracao da nova sequencia procuramos na cadeia o
elemento vazio e sorteamos um entre os seus elementos sucessores para ser o primeiro
elemento da nova sequencia. Nesta funcao, a biblioteca random e utilizada para auxiliar
Metodologia 35
na escolha das notas que irao compor a nova sequencia.
Sao utilizadas duas funcoes para gerar numeros aleatorios atraves desta biblioteca.
Uma funcao que chamaremos de gerador e sera vinculada ao relogio do computador
para ajudar evitar a geracao de numeros repetidos, e uma outra que chamaremos de
distribuicao que determina o limite inferior e o limite superior do numero que sera
gerado.
Para iniciar a geracao do solo procuramos na cadeia o elemento vazio e sorteamos um
dos elementos que o sucedem, depois sorteamos um dos sucessores do ultimo sucessor
sorteado e incluıdo na nova sequencia. E assim a cada elemento adicionado a nova
sequencia, sorteamos um elemento entre os seus sucessores para incluı-lo. A forma
abordada para escolher entre os sucessores para compor a sequencia e o metodo da
roleta. A seguir e dado um exemplo de como funciona o metodo de selecao da roleta.
Por exemplo, se depois da nota 25 existirem 6 ocorrencias da nota 43, 2 ocorrencias
da nota 54 e 7 ocorrencias da nota 90, este vetor tera tamanho igual a 15. Se o numero
sorteado for menor ou igual a 6, a proxima nota sera a 43. Se estiver entre 7 e 8, a
proxima nota sera a 54. E se for maior que 8, a proxima nota sera a 90. E importante
ressaltar que deve ser considerada a ordem das notas de acordo com o exemplo.
E criado um vetor de tamanho igual ao parametro de entrada da funcao. Esse vetor
sera preenchido com as notas escolhidas e retornado com a nova sequencia gerada.
5.4 Analisando a influencia de um limiar na definicao da
ordem da cadeia de Markov ao gerar os solos
O grande problema deste trabalho e encontrar uma ordem ideal para a geracao dos
solos, ja que ordens muito altas tendem a gerar copias e ordens muito baixas nao tem
uma boa inducao. Para resolver este problema e proposto a introducao de um valor
limiar, que ajustara a ordem da cadeia, reduzindo sua ordem, caso a ordem atual nao
satisfaca o criterio do limiar.
Os elementos das cadeias implementadas neste trabalho possuem 3 campos: estado
principal, estado sucessor e numero de ocorrencias da transicao do estado principal para
o estado sucessor. O estado principal pode ser constituıdo por uma sequencia de n
estados, onde n tambem representa a ordem da cadeia.
A importancia de introduzir um limiar neste trabalho, e fundamental para definir as
36 Metodologia
ordens que serao utilizadas para a geracao dos solos. Em cadeias de ordens muito altas,
seus elementos tem menos ocorrencias de sucessores do que os elementos de cadeias de
ordens menores. Assim, sera abordada uma estrategia em que sucessoes pouco utilizadas,
isto e, um numero de sucessoes menores que o valor definido para o limiar nao serao
geradas.
Em uma cadeia de Markov comum a sua ordem e fixa, isto e, sua ordem nao varia.
Entretanto, uma cadeia de ordem n, implicitamente, contem as cadeias com ordens
inferiores a n e maiores do que 0. E possıvel encontrar uma ordem n−x em uma cadeia
ordem n, desde que x seja um numero inteiro menor que n.
A Figura 5.8 ilustra 3 elementos de uma cadeia de ordem 3: GAB, DFB e EAB.
Para diminuir a ordem da cadeia desconsideramos a primeira nota dos elementos, ou
seja, as letras sublinhadas de vermelho representam os elementos da cadeia de ordem 2.
Analogamente os elementos de ordem 1 sao os sublinhados de verde.
G A B
D F B
E A B
G,3
A,5
F,4
B,3
C,1
D,2
Figura 5.8: Exemplo de como encontrar uma cadeia de ordem menor
Baseando no numero de ocorrencias de transicao entre os estados, iremos compara-lo
com um valor limiar. Caso esse numero de ocorrencias seja menor que o valor limiar
estipulado a ordem da cadeia sera diminuıda ate que este numero de ocorrencias seja
maior que o limiar ou ate que a ordem da cadeia seja reduzida a ordem 1. Com a
introducao desse valor limiar no trabalho, os elementos com poucas ocorrencias de su-
cessoes da cadeia serao ignorados. As cadeias tambem podem apresentar casos onde um
certo elemento nao possui sucessores.
Caso o elemento ADF Figura 5.9 seja o estado atual de uma cadeia de Markov de
Metodologia 37
ordem 3, ela tem 4 ocorrencias de estados futuros, 3 para a nota G e 1 para a nota A. Por
exemplo, se usarmos um limiar de valor 5, sua ordem sera reduzida, pois o seu numero
de ocorrencias e menor que o valor do limiar. Neste caso, ignoramos a nota A deste
elemento e analisamos todos os elementos da cadeia que sao iguais ao novo elemento
DF. Assim consideramos tambem os estados futuros do elemento BDF, que satisfaz
as novas condicoes da ordem por terminar com DF. Somando as novas ocorrencias de
estados futuros temos o valor de 9, que supera o valor do limiar. Entao a tecnica da
roleta e aplicada as novas possibilidades.
A D F
B D F
G,3
A,1
C,2
D,3
Figura 5.9: Exemplo de como o limiar reduz a ordem da cadeia
Ao treinar uma cadeia com uma ordem alta e normal que o numero de ocorrencias
de transicoes para estados sucessores diminua. Por tanto a tendencia e de aumentar os
casos onde o limiar sera maior que o numero de transicoes.
Com o intuito de encontrar a melhor ordem para este problema vamos introduzir
o limiar para diminuir a ordem da cadeia caso a soma das ocorrencias dos sucessores
de um elemento seja menor que o limiar. A reducao de ordem e analoga, caso, mesmo
abaixando a ordem da cadeia em 1 unidade, o numero de ocorrencias seja menor que o
limiar.
Para diminuir a ordem de uma cadeia e preciso percorrer toda a cadeia procurando
pelo novo elemento de ordem diminuıda. Por exemplo: caso o elemento (69 71 68 75) da
cadeia N de ordem 4 tenha um numero de sucessoes que nao satisfaca o limiar, procura-se
todos os elementos desta cadeia que terminam com (71 68 75), e os seus sucessores sao
considerados. Se mesmo assim o numero de sucessores nao satisfazer o limiar, abaixamos
de novo a ordem e procuramos na cadeia todos os elementos que terminam com (68 75),
e assim sucessivamente. A cadeia de ordem 1 e a unica que gera qualquer elemento sem
levar em consideracao o limiar.
38 Metodologia
5.5 Metodos de Representacao de Melodias
Nesta secao mostraremos as diferentes formas de representar melodias, sendo as for-
mas comuns como partituras e tablaturas ou por uma sequencia de uma estruturas
numericas, que sao as formas representadas neste trabalho.
A partitura e uma representacao escrita de melodias padronizada mundialmente. As
notas musicais sao representadas por sımbolos proprios da partitura, onde sao associadas
aos sons. Existem alguns softwares de edicao que concebem partituras como o Cake Walk
Express, Free Clef e o MusiXTEX.
A Figura 5.10 ilustra os metodos mais comuns de representacao de melodias: a
partitura e a tablatura. Na partitura existem 5 linhas e quatro espacos visıveis e mais
espacos suplementares superiores, para notas mais agudas, e inferiores, para notas mais
graves. A posicao da nota na partitura, na linha ou no espaco, define a sua altura.
Normalmente o primeiro sımbolo da partitura e a clave, seguida do compasso que define
quanto tempo entra em cada parte da musica. O compasso 4/4, mostrado na Figura
5.10, e usualmente o mais utilizado e e formado por 4 semınimas. O primeiro numero
e a quantidade de tempo (4 tempos) e o segundo e a unidade de tempo (semınima).
Tablaturas sao explicadas mais detalhadamente no Capıtulo 4.2.
Moderate h = 120
: 44
c
1
"#*
BDB
*
"!
BB
)
B
)"!
BB
(
*
BB
)
"!
BBF
&
(
BB
$
&
BB
$&
BBD
"#
BF B
"!
BB
!#
BB
$
B
'
)
BDB
('
BDB
)*
BBD3 3
3 3 3
*
BBD
"#*
BDB
#!
BBD
)&
BBF
"!
(
BB
)
)
BDB Q SL
3
3
3 R
)
B
!
B
)
B
!
B
)
B)
B
'
BD
)
B
)
B
)
B
)
B
*
B3 3
33
B
*
B
*
B
)
B
*
B R SM
3 3 3
3
5 R T
"!
B
"!
B
"!
B
"!
B
)
B
"!
B
)
B
*
B
(
B3
3
B
*
B
"!
B
*
B
(
B
&
B
(
B
&
B SM L L3
3
7 R
(
B
&
B
(
B
(
B
!
B
(
B
'
BD
!
BF
$
B
!
B!
B&
B
(
B S T3 R
"!
B
"&
B
"&
B
"&
B
"%
B
"$
B
"%
B
"&
B
"#
B
"&
B
"#
B S3 3 3
3
9 P S
"#
B
"!
B R
"!
B P SL M M
S
)
B
"!
B
)
B
"!
B Q SL S
"!
B
*
B
)
B
*
B
(
B
&
B
$
B
!
B P R3 3
3
3
Page 1/2
12S
$
B
#
B
!
B
"
B
!
B
#
B
!
B B3 3
B
!
B
#
B
!
B
#
B
!
B P R TH3 3
Figura 5.10: Representacao de uma melodia atraves de uma partitura e umatablatura
As estruturas de dados utilizadas neste trabalho para a representacao de melodias
consistem de vetores contendo informacoes sobre o tempo na musica onde uma nota
esta sendo tocada, sobre a respectiva nota e sobre o tempo de duracao da nota, isto e,
quando ela comeca a ser tocada e quando ela para. Vamos abordar 4 estruturas para
representar melodias neste trabalho: a estrutura TND, que guarda informacoes sobre o
Metodologia 39
tempo, a nota e a duracao; a estrutura ND, que guarda informacoes sobre a nota e a
duracao; a estrutura N, que guarda somente a informacao da nota e a estrutura D, que
guarda somente a informacao sobre a duracao.
A Figura 5.11 ilustra uma sequencia da estrutura Nota, composta por 3 campos:
tempo, nota e duracao. O tempo e a duracao sao representados por um double e a
nota por um int. O tempo representa a posicao da nota no compasso, nota representa
qual nota esta sendo tocada e duracao representa o tempo que esta nota ficara tocando.
Com estas 3 informacoes e possıvel representar uma melodia. Assim, o chamamos de
sequencia TND, que sera utilizada para representar as melodias neste trabalho.
Vetor TND -> (0 76 0.25) (0.25 75 0.333) (0.583 68 0.75) (1.583 77 1)
Figura 5.11: Sequencia TND, onde o primeiro numero representa o tempo quea nota e tocada, o segundo a respectiva nota e a terceira a sua duracao.
A Figura 5.12 ilustra uma outra representacao de uma melodia, utilizando a estrutura
Pair, um par de valores com apenas os campos nota e duracao, o que chamaremos de
vetor ND. Desta forma as notas seguintes serao tocadas ao fim da duracao da nota
anterior. As melodias deste trabalho tocam uma nota de cada vez, isto e, ela nao admite
que 2 notas sejam tocadas no mesmo tempo.
Vetor ND -> (76 0.25) (75 0.333) (68 0.75) (77 1) (69 1.25)
Figura 5.12: Sequencia ND, onde o primeiro numero representa a nota e osegundo a sua duracao.
Tambem representamos uma melodia com a quebra da estrutura ND. As informacoes
sobre a nota e a duracao sao separadas em vetores distintos. Geramos dois vetores de
mesmo tamanho, um recebe a informacao da nota e o outro a informacao da duracao.
Sobrepomos um vetor no outro, isto e, a nota do vetor N na posicao 1 se associa a
duracao do vetor D na posicao 1, a nota do vetor N na posicao 2 se associa a duracao
do vetor D na posicao 2, e assim sucessivamente.
A Figura 5.13 exemplifica a sobreposicao das sequencias N e D. Como na sequencia
ND, e necessario definir o tempo que a primeira nota e tocada. Lembrando que a nota
−1 representa o silencio.
40 Metodologia
Vetor N -> -1 75 68 77 69 65 64 71
Vetor D -> 0.25 0.333 0.75 1 1.25 0.425 1.5 0.186
Figura 5.13: O vetor de inteiros representa as notas e o vetor de numeros reaisas duracoes de uma nota
5.6 Teste de Friedman
Milton Friedman foi um estatıstico, economista e escritor norte-americano que ga-
nhou o Premio Nobel em Ciencias Economicas de 1976. Uma das publicacoes sobre sua
descoberta foi o artigo (Friedman 1937). E conhecido por sua pesquisa sobre a analise do
consumo, a historia e a teoria monetaria e a complexidade da polıtica de estabilizacao.
O teste de Friedman e um teste estatıstico nao parametrico (baseado em ranking
de observacoes) usado para detectar diferencas de tratamentos em varias tentativas de
teste. Este teste utiliza os ranks dos dados ao inves de seus valores brutos para o calculo
da estatıstica de teste, isto e, os dados sao ordenados e os postos ocupados por cada
grupo de dados separadamente que e levado em consideracao. Apos esta ordenacao a
hipotese de igualdade da soma dos postos de cada grupo e testada.
O teste de Friedman possui duas hipoteses: H0 (nao ha diferenca entre os trata-
mentos) e H1 (pelo menos um tratamento e diferente). A estatıstica de teste dispoe os
valores numa tabela com k (tratamentos) linhas/colunas e N (tratados) colunas/linhas.
Sao atribuıdos postos de 1 a k para cada N e sao somados os postos para cada k e
elevados ao quadrado da soma.
O teste de Friedman sera utilizado para comparar os solos de blues compostos deste
trabalho. Sera analisado se houve alguma diferenca com significancia estatıstica entre
os solos ou nao.
A Figura 5.14 um exemplo onde um professor reteve a media de um grupo de 4 alunos
no final de cada trimestre a fim de avaliar se hou progressao na aprendizagem.
Alunos Trimestre 1 Trimestre 2 Trimestre 3
1 10 14 9
2 19 15 17
3 8 13 15
4 12 11 6
Figura 5.14: Tabela Friedman
Metodologia 41
A partir dos dados da Figura 5.14, vamos ranquear os alunos com notas de 1 a 3,
onde o aluno com menor nota receba 1 e o aluno com maior nota receba 3. Tambem
iremos somar os postos de cada aluno e elevar este resultado ao quadrado, como mostra
a Figura 5.15.
Alunos Trimestre 1 Trimestre 2 Trimestre 3
1 2 3 1
2 3 1 2
3 1 2 3
4 3 2 1
R 9 8 7
R2 81 64 49
Figura 5.15: Tabela Friedman
Os dados da Tabela 5.15 e utilizado na estatıstica do teste de Friedman, que e dada
por:
S =12b
k(k + 1)
k∑j=1
(Rj
b− k + 1
2)2 (5.1)
Onde b e o numero de blocos dos experimentos, k e o numero de tratamentos e R e
a soma dos postos para cada k.
No teste de Friedman vamos testar a hipotese H0: t1 = t2 = ... = tk contra a
hipotese alternativa onde t1, t2, ..., tk sao diferentes em pelo menos um caso. Ao nıvel de
significancia α, iremos rejeitar a hipotese H0 se S ≤ sα. Caso contrario a hipotese nula
nao e rejeitada. A constante sα e escolhida de modo que a probabilidade de erro seja
igual a α.
5.7 Conclusao
Este capıtulo descreve as ferramentas que sao utilizadas no desenvolvimento deste
trabalho, como os dados serao representados computacionalmente, tecnicas computaci-
onais para compor os solos e uma forma de classificacao destes.
O fato principal a ser comentado nesta metodologia e a utilizacao do limiar para
influenciar a escolha da ordem da cadeia a ser utilizada, pois se trata de uma ideia nova
para este trabalho. O fator limiar ajudara a resolver o problema que ocorre quando
42 Metodologia
geramos cadeias de ordens muito altas (tendem a gerar copias) ou muito baixas (baixa
inducao).
As cadeias de Markov sao implementadas de forma a aceitar qualquer tipo de estru-
tura. Neste trabalho utilizamos 4 estruturas (TND, ND e N&D), todas representando
algum tipo de informacao sobre a nota. Desta forma teremos 4 cadeias diferentes para
gerar os novos solos.
O teste de Friedman e feito com os ranks dos solos. Cada rank e feito por uma pessoa.
Com o resultado de suas hipoteses poderemos definir se ha ou nao alguma diferenca com
significancia estatıstica entre pelo menos um par de solos.
Capıtulo 6
Resultados
“O blues e o que eu me transformei em, o que me deu inspiracao e alıvio em todas as
provas da minha vida.”
— Eric Clapton, 1945
Neste capıtulo e apresentado os resultados obtidos atraves das tecnicas utilizadas
para gerar os solos e a avaliacao dos solos atraves do teste de Friedman.
6.1 Testando a consistencia da cadeia de Markov com
inteiros e caracteres
Alguns experimentos foram executados com vetores de inteiros e de caracteres visando
verificar a consistencia das sequencias geradas. Os resultados obtidos foram satisfatorios,
pois as sequencias geradas obedecem os criterios da cadeia de Markov construıda, isto e,
cada elemento gerado no novo vetor e precedido por elementos que tambem os precedem
nas sequencias de entrada.
A cadeia de Markov foi implementada com um parametro no construtor que repre-
senta a ordem da cadeia, ou seja, uma cadeia de ordem n mapeia uma nota que ocorre
depois de uma sequencia de n outras notas. Os testes realizados obedeceram os criterios
da ordem, onde foram geradas novas sequencias onde uma nota e precedida por uma
sequencia de notas do tamanho da ordem definida.
43
44 Resultados
6.2 Treinando cadeias de Markov com parametros dife-
rentes
Buscando a melhor tecnica para gerar um solo de blues, diferentes cadeias de Markov
foram treinadas. Foi criada a estrutura Nota, que e composta por 3 campos: time, pitch
e duration. O campo time so tem valores entre 0 e 4, por representar um compasso 4
por 4. O campo pitch quando representado pelo inteiro −1 significa silencio, quando
representado por alguns inteiros entre 1 e 120 reproduzem notas musicais pertencentes
a escala pentatonica em la.
Uma cadeia chamada de cmTND foi treinada com sequencias da estrutura Nota.
Esta cadeia leva em consideracao 3 campos: T representa a posicao da nota no compasso,
N representa a nota e D o tempo de duracao desta nota. Um elemento desta cadeia
possui menos ocorrencias de elementos sucessores devido a um criterio de comparacao
mais detalhado entre os elementos. Por exemplo: como mostra a Figura 6.1 os elementos
sao seguidos por apenas um outro elemento especıfico. Se aumentada a ordem da cadeia,
as ocorrencias tendem a diminuir ainda mais.
E importante ressaltar que para treinar as cadeias TND a estrutura Nota contem
o tempo da nota no compasso. Diferente da estrutura quando esta representando uma
melodia, que tem o tempo absoluto da musica.
Elemento: 3.5 67 0.5 / 0 60 0.25 / 0.25 60 0.25
Seguido 1 vez pelo elemento 0.5 60 0.25
Elemento: 3.5 67 0.5 / 0 64 0.5 / 0.5 67 0.5
Seguido 1 vez pelo elemento 1 67 0.5
Elemento: 3.5 69 0.5 / 0 67 0.5 / 0.5 64 0.166667
Seguido 1 vez pelo elemento 0.666667 67 0.166667
Figura 6.1: Cadeia de Markov TND de ordem 3
Uma outra cadeia chamada cmN foi treinada com uma sequencia de int, ou seja,
levando em consideracao apenas um campo da estrutura Nota, o (pitch). Neste caso,
o elemento e sucedido por muitos outros elementos ja que leva em consideracao apenas
um campo, como ilustra a Figura 6.2. Treinando a cadeia em ordens baixas, a tendencia
e de se aumentar ainda mais este numero de ocorrencias.
Resultados 45
Elemento: 73
Seguido 27 vezes pelo elemento 45
Seguido 28 vezes pelo elemento 64
Seguido 28 vezes pelo elemento 74
Seguido 28 vezes pelo elemento 75
Seguido 14 vezes pelo elemento 76
Elemento: 74
Seguido 16 vezes pelo elemento 55
Seguido 10 vezes pelo elemento 60
Seguido 597 vezes pelo elemento 64
Seguido 15 vezes pelo elemento 66
Seguido 65 vezes pelo elemento 67
Seguido 480 vezes pelo elemento 69
Seguido 15 vezes pelo elemento 70
Seguido 15 vezes pelo elemento 71
Seguido 504 vezes pelo elemento 72
Seguido 545 vezes pelo elemento 74
Seguido 370 vezes pelo elemento 76
Seguido 148 vezes pelo elemento 79
Elemento: 75
Seguido 28 vezes pelo elemento 78
Figura 6.2: Cadeia de Markov N de ordem 1
Levando em consideracao apenas o campo duration, uma outra cadeia chamada cmD
foi treinada com sequencias de double. Analogamente a cadeia cmN, se treinada com
ordens baixas a cadeia cmD tende a mapear um maior numero de ocorrencias, como
mostra a Figura 6.3.
E finalmente uma ultima cadeia chamada cmND foi treinada com uma sequencia
de Pair (uma estrutura composta por pitch e duration). Nesta cadeia o numero de
sucessoes de um dado elemento sao mais frequentes do que o da cadeia cmTND e
menos frequentes que das cadeias cmN e cmD. A Figura 6.4 ilustra as ocorrencias da
cadeia cmND.
6.3 Regras para a geracao dos solos
Um solo e composto por varios licks, isto e, sao geradas sequencias menores (licks)
que vao se concatenando ate o tempo final da musica. Foram geradas 3 sequencias
46 Resultados
Elemento: 0.625
Seguido 1 vez pelo elemento 0.333333
Seguido 1 vez pelo elemento 0.375
Seguido 2 vezes pelo elemento 0.5
Elemento: 0.666667
Seguido 4 vezes pelo elemento 0.333333
Seguido 1 vez pelo elemento 0.5
Seguido 2 vezes pelo elemento 0.666667
Seguido 1 vez pelo elemento0.875
Seguido 1 vez pelo elemento 1
Elemento: 0.75
Seguido 9 vezes pelo elemento 0.25
Seguido 2 vezes pelo elemento 0.5
Seguido 1 vez pelo elemento 1
Figura 6.3: Cadeia de Markov D de ordem 1
Elemento: 79 0.333333 / 74 0.333333
Seguido 1 vez pelo elemento -1 2.22045e-16
Seguido 4 vezes pelo elemento 69 0.333333
Seguido 3 vezes pelo elemento 79 0.333333
Elemento: 79 0.333333 / 76 0.208333
Seguido 1 vez pelo elemento 79 0.333333
Elemento: 79 0.333333 / 76 0.333333
Seguido 3 vezes pelo elemento 74 0.333333
Seguido 4 vezes pelo elemento 79 0.333333
Figura 6.4: Cadeia de Markov ND de ordem 2
diferentes de novos solos.
A primeira sequencia foi gerada a partir da cadeia cmTND. O tempo de inıcio
do lick dentro do compasso, ou seja, em que momento sera tocada a primeira nota,
foi sorteado entre os licks originais do Johnny Winter para dar inıcio a sequencia. A
segunda sequencia e a uniao de duas cadeias, a cmN e a cmD. A uniao e feita da
seguinte forma: sao utilizadas as posicoes iguais dos elementos das duas sequencias para
uni-los. A terceira e baseada na cadeia cmND.
Para evitar uma escolha onde um elemento tenha poucos sucessores, foi definido
Resultados 47
um limiar, que e explicado no Capıtulo 5.4. Tambem e definida uma base musical
(representada pelo som de um baixo tocado com dedos) para tocar junto com o solo
(representado pelo som de um violao acustico).
6.4 Avaliando novos solos baseados nos licks do guitar-
rista Johnny Winter
Johnny Dawson Winter III foi um guitarrista de blues norte-americano conhecido
por seu albinismo e seus solos de guitarra inconfundıveis. Johnny fazia solos simples
de country blues ate solos com distorcao e slide de blues-rock. Seus solos tambem se
caracterizavam pela velocidade que as notas eram tocadas e por bends elevados.
Foi utilizado neste trabalho uma base de dados com 100 licks do Johnny Winter
para treinamento das cadeias de Markov. As Figuras 6.5, 6.7 e 6.6 ilustram partituras
de novos solos gerados com o algoritmo proposto.
Moderate h = 120
: 44
c
1
"#
B
"!
B
)
B
"!
B
*
B
"!
B
(
B
&
B
&
B
#
B
!
B
#
B
$
B B3 3
3 3 3
B
"#
B
!
B
)
B
"!
B
)
B Q SL3
3
3 R
)
B
!
B
)
B
!
B
)
B)
B
'
BD
)
B
)
B
)
B
)
B
*
B3 3
33
B
*
B
*
B
)
B
*
B R SM
3 3 3
3
5 R T
"!
B
"!
B
"!
B
"!
B
)
B
"!
B
)
B
*
B
(
B3
3
B
*
B
"!
B
*
B
(
B
&
B
(
B
&
B SM L L3
3
7 R
(
B
&
B
(
B
(
B
!
B
(
B
'
BD
!
BF
$
B
!
B!
B&
B
(
B S T3 R
"!
B
"&
B
"&
B
"&
B
"%
B
"$
B
"%
B
"&
B
"#
B
"&
B
"#
B S3 3 3
3
9 P S
"#
B
"!
B R
"!
B P SL M M
S
)
B
"!
B
)
B
"!
B Q SL S
"!
B
*
B
)
B
*
B
(
B
&
B
$
B
!
B P R3 3
3
3
Page 1/2
12S
$
B
#
B
!
B
"
B
!
B
#
B
!
B B3 3
B
!
B
#
B
!
B
#
B
!
B P R TH3 3
Figura 6.5: Exemplo de tablatura de um novo solo TND de ordem 2
Foram selecionados 18 solos, onde 3 foram criados com licks originais do Johnny
Winter e 15 atraves do algoritmo proposto. Estes 15 solos foram gerados da seguinte
forma:
• Solo ND1 representado por uma cadeia ND de ordem 1
• Solo ND2 representado por uma cadeia ND de ordem 2
• Solo ND25 representado por uma cadeia ND de ordem 2 com influencia de um
limiar com valor 5
48 Resultados
Moderate h = 120
: 44
c
1
"&
B
"$
B
"$
B
"%
B
"(
B
"&
BS
!
B
"%
B
!
B
"#
BM
3
3
2 B B
"!
B
"#
B
*
B
*
B
"!
B
"&
B
"&
B
"#
BL O
3 33
B B B
"$
B
"$
B
"!
B
"!
B
)
B
"&
BP S T
3 3
4 Q T
!
B B3 B
$
B
&
B
!
B
$
B
&
B
"!
B
)
B T3
3 Q
*
B
"!
B
(
B3
3 3
7
&
B
(
B
&
B
(
B
"&
B
"#
B
"!
B
"!
B
*
B
)
B
*
B
*
B
(
BD3
3 3 3
&
B P
&
B
#
B
!
B
#
BM B
!
B
!
B
"#
B
"$
B
"$
B
"%
B
"#
B
"#
B
"#
B3
3
3
Page 1/2
10 B
"!
B
"#
B
"!
B
"#
B
"!
B
"#
B
"$
BP
"$
B
"%
B
3 3
3
B
"#
B
"%
B Q S
"&
B
"(
B
"(
B
"&
B
"(
B
"%
B B3
3 33 3
Figura 6.6: Exemplo de tablatura de um novo solo ND de ordem 1
Moderate h = 120
: 44
c
1 P
&
B
$
B
!
B
$
B
#
B
!
B
#
B
"
B
#
B
"
B
&
B
#
B
!
B
#
B
!
B
%
BD
!
B
$
B
!
B
"
B
!
B
$
B
!
B
$
BF
"
B
#
B
$
B
$
B
)
B
"!
B
)
B
3 33 3 3
3
4B
"!
B
)
B
"!
B
)
B)
B
&
B
)
BL3 3
B
)
B
*
B
*
B
(
B
&
B
(
B
(
B
(
B
!
B3
33 3
6
!
B
#
B
#
B!
B
!
B
$
B
"
B
$
B
!
B
!
B
!
B
!
B B3
3 3 3
7 B
#
B
)
B
&
B
$
B
!
B
$
B
!
B
$
B
"
B
$
B
!
B
"
B
"'
BD
"$
B
"&
B B
3 3 3
3 3
B
"%
B
"$
B
"&
B
"#
B
"(
B
"(
B
"&
B
"(
B
"&
B
"(
B B3
3
3 3
Page 1/3
9
B
"(
B
"&
B
"(
B
"(
B
"&
B
"(
B
"%
B
"#
B
"%
B
"#
B
"!
B3
B
"#
B
"&
B
"#
B
"(
B
"&
B
"(
B
"&
B
"&
B
"&
B
"#
B
"#
B
"!
B
"#
B B
3 3
3
Figura 6.7: Exemplo de tablatura de um novo solo N&D de ordem 3
• Solo ND3 representado por uma cadeia ND de ordem 3
• Solo ND35 representado por uma cadeia ND de ordem 3 com influencia de um
limiar com valor 5
• Solo N&D1 representado pelas cadeias N e D de ordem 1
• Solo N&D2 representado pelas cadeias N e D de ordem 2
• Solo N&D25 representado pelas cadeias N e D de ordem 2 com influencia de um
limiar com valor 5
• Solo N&D3 representado pelas cadeias N e D de ordem 3
• Solo N&D35 representado pelas cadeias N e D de ordem 3 com influencia de um
limiar com valor 5
Resultados 49
• Os solos O1, O2 e O3 sao representados por licks originais
• Solo TND1 representado por uma cadeia TND de ordem 1
• Solo TND2 representado por uma cadeia TND de ordem 2
• Solo TND25 representado por uma cadeia TND de ordem 2 com influencia de um
limiar com valor 5
• Solo TND3 representado por uma cadeia TND de ordem 3
• Solo TND35 representado por uma cadeia TND de ordem 3 com influencia de um
limiar com valor 5
Para avaliar os novos solos gerados foi realizado um teste com 33 pessoas, a grande
maioria musicos e apreciadores de blues. Foi pedido para que cada pessoa avaliasse 18
solos de 30 segundos cada. Foi pedido que cada pessoa fizesse um rank dos solos, isto e,
que os ordene do melhor para pior ou vice versa. Cada pessoa escutava os solos em uma
ordem aleatoria. Foi implementada uma funcao em C++ que gera numeros aleatorios
entre 1 e 18, para definir a ordem em que as pessoas escutariam os solos. O primeiro solo
que a pessoa escutava, era classificado como solo 1, o segundo solo como solo 2 e assim
de forma analoga. A medida que a pessoa ia escutando os solos, ela adicionava-os a uma
lista feita por ela mesma de forma que a lista satisfizesse as condicoes de um rank. A
partir dos ranks feitos pelas pessoas, o melhor solo de cada sequencia ganha peso 18, o
segundo melhor ganha peso 17 e assim sucessivamente ate o ultimo solo que ganha peso
1.
Com estes 33 ranks, e construıda uma matriz 33x18. Apos a construcao da matriz
com os pesos dos solos, foi realizado o teste de Friedman para realizar a analise de
variancia dos solos. Esta analise visa, fundamentalmente, verificar se existe uma dife-
renca significativa entre as medias dos solos, isto e, verifica se os solos possuem medias
iguais ou nao. Como podemos ver na ultima coluna da Tabela 6.1 a analise de Variancia
no teste de Friedman deu um valor p = 0.5949, isto implica que nao ha uma diferenca
significativa entre os solos. Para que haja uma diferenca significativa entre os solos, p
deveria assumir um valor menor que 0.05. A partir dos dados coletados podemos afir-
mar que a hipotese nula (H0) e validada, isto e, nao podemos afirmar que as medias sao
diferentes com mais de 95% de confianca.
50 Resultados
Tabela 6.1: Tabela ANOVA de Friedman
Source SS df MS Chi-sq Prob>Chi-sq
Collumns 427.7 17 25.1604 15.01 0.5949
Error 15560.3 544 28.6034
Total 15.988 593
Agora sera feita uma analise de metodo por metodo comparando seus ranks medios.
Levando em consideracao o metodo TND, e calculando uma media das suas medias
vemos que obteve o valor de 9.70. A Tabela 6.2 ilustra todas as suas medias, onde a
media de maior destaque foi 10.12 com a ordem 2 e utilizando um limiar, e a media de
menor destaque foi 9.30 com a ordem 3 e utilizando um limiar.
Tabela 6.2: Medias do metodo TND
Metodo media
TND ordem 1 9.30
TND ordem 2 9.75
TND ordem 2 com limiar 5 9.96
TND ordem 3 10.12
TND ordem 3 com limiar 5 9.36
Considerando o metodo ND, e obtida uma media de valor 9.56 entre todas as suas
medias, e tambem a melhor media entre os metodos computacionais. Foi constatado
um dado muito interessante neste metodo, pois ele obteve a menor media entre todos os
metodos, mas tambem obteve a melhor media entre os metodos gerados pela maquina,
perdendo apenas para os originais. A Tabela 6.3 ilustra as suas medias, onde o valor
8.75 foi a menor media deste metodo e tambem a menor media geral, a o valor 11.42 sua
melhor media e tambem a melhor media entre os metodos computacionais utilizados na
geracao dos solos.
E finalmente o metodo N&D, obteve uma media igual a 8.78, a menor media entre
os metodos computacionais. Foi o metodo que apresentou menor desvio padrao entre
sua populacao. A Tabela 6.4 mostra suas medias, onde a menor obteve o valor de 7.9 e
a maior media o valor de 9.81.
Resultados 51
Tabela 6.3: Medias do metodo ND
Metodo media
ND ordem 1 8.75
ND ordem 2 8.84
ND ordem 2 com limiar 5 9.54
ND ordem 3 11.42
ND ordem 3 com limiar 5 9.24
Tabela 6.4: Medias do metodo N&D
Metodo media
N e D ordem 1 7.9
N e D ordem 2 9.81
N e D ordem 2 com limiar 5 8.69
N e D ordem 3 8.45
TND ordem 3 com limiar 5 9.06
Os solos originais obtiveram uma media de 11.708, superando as medias dos metodos
computacionais. A Tabela 6.5 ilustra as medias dos 3 solos originais.
Tabela 6.5: Medias dos solos originais
Metodo media
Original 1 10.9
Original 2 10.18
Original 3 9.63
Agora sera analisado as medias de acordo com as ordens. Os solos gerados de ordem
1 obtiveram uma media de valor 8.65, a pior media entre as ordens . Os solos gerados
de ordem 2 obtiveram uma media de 9.46. Os solos gerados de ordem 3 obtiveram uma
media de 10, a melhor entre as ordens. Isto implica aparentemente que quanto maior a
ordem, melhor conceituado sera o solo.
Agora sera analisado a influencia do limiar nos solos. Para definir o valor do limiar,
foi realizado um sorteio com numeros entre 2 e 9, onde o numero sorteado foi o 5. Os
52 Resultados
solos de ordem 2 e 3 sem a influencia do limiar obtiveram uma media de 9.075. Ja com
a influencia do limiar obtiveram uma media de 9.05. A influencia do limiar na geracao
de um solo pelo metodo TND utilizando uma ordem 2 faz com que esta ordem seja
diminuıda em 1219 vezes das 1233 possibilidades da cadeia para gerar uma nota futura,
e de ordem 3 faz com que esta ordem diminua 1313 vezes das 1319 possibilidades. Assim
podemos afirmar que os solos gerados pelo metodo TND de ordens 2 e 3 utilizando um
limiar de valor 5, praticamente sao solos gerados por ordem 1.
O metodo ND de ordem 2, quando se utiliza o limiar de valor 5 diminui sua ordem
em 725 vezes das 788 possibilidades. De ordem 3, sua ordem e diminuıda 1089 vezes das
1108 possibilidades. Assim, como o metodo TND, pode-se afirmar que a utilizacao do
limiar de valor 5 faz com que este metodo gera sequencias de ordem 1 em 99% de seus
casos.
Diferente dos casos acima relatados, o metodo N de ordem 2 diminui sua ordem
apenas 27 vezes das 285 possibilidades. De ordem 3, 96 vezes das 749 possıveis. E o
unico metodo que o limiar de valor 5 tem pouca influencia para diminuir a sua ordem.
O metodo D de ordem 2 e diminuıda 72 vezes das 105 possıveis e de ordem 3 165
vezes das 208 possıveis. Tambem sendo bastante influenciado a reduzir sua ordem pelo
limiar. A Figura 6.6 ilustra a porcentagem de elementos que nao satisfazem o valor do
limiar 5, diminuindo a ordem da cadeia.
Tabela 6.6: Tabela da influencia do limiar nos metodos computacionais utili-zados para gerar os solos
Metodo Ordem 2 Ordem 3
TND 99% 99%
ND 92% 98%
N 9% 12%
D 69% 79%
A Figura 6.8 mostra os melhores solos em destaque, dentre os 4 solos em destaque 3
sao originais e 1 pertence ao metodo ND de ordem 3.
Ja a Figura 6.9 ilustra os 4 piores solos em destaque, onde um representa o metodo
ND de ordem 1, outro o metodo ND de ordem 2, outro o metodo N&D de ordem 3 e o
ultimo o metodo TND de ordem 3 com um limiar de valor 5.
Resultados 53
5 6 7 8 9 10 11 12 13 14
TND35
TND3
TND25
TND2
TND1
O3
O2
O1
N&D35
N&D3
N&D25
N&D2
N&D1
ND35
ND3
ND25
ND2
ND1
No groups have mean column ranks significantly different from Group 4
Figura 6.8: Melhor solo
Os audios em arquivos MIDI podem ser baixados, (Souto 2015).
6.5 Conclusao
O intervalo de confianca entre todos os metodos foi de 5,8894 para um nıvel de
confianca de 0.05. Isto implica que, a princıpio, nao houve diferenca com significancia
estatıstica entre nenhum par de metodos. Tambem podemos observar entre todos os
metodos uma variacao de media entre 7.9 e 11.42. Baseando nas medias, podemos
concluir que o metodo TND foi o melhor abordado e a ordem 3, a melhor ordem a se
usar nas cadeias.
A influencia do limiar nos solos de ordens 2 e 3 reduziu-os em 99% dos casos para
solos de ordem 1. Como a ordem 1 obteve as piores medias, a influencia do limiar
direcionou os solos para uma ordem de medias inferiores. A utilizacao de 3 ordens neste
trabalho pode ter sido um numero baixo para o estudo do limiar. O estudo do limiar em
cadeias com ordens maiores pode ser mais eficaz, pois tambem haveriam mais ordens a
54 Resultados
5 6 7 8 9 10 11 12 13 14
TND35
TND3
TND25
TND2
TND1
O3
O2
O1
N&D35
N&D3
N&D25
N&D2
N&D1
ND35
ND3
ND25
ND2
ND1
No groups have mean column ranks significantly different from Group 6
Figura 6.9: Pior solo
serem estudadas.
Capıtulo 7
Conclusoes e Trabalhos Futuros
“Eu acho que o blues sempre estara por perto. As pessoas precisam dele.”
— Johnny Winter, 1944-2014
Neste trabalho, foi desenvolvido um sistema capaz de gerar solos de blues em gui-
tarras. Estes solos tem caracterısticas de solos de grandes guitarristas do blues, e sao
gerados em harmonia a uma base musical de blues pre determinada. Foi utilizada uma
base de blues representada pelo som de um baixo para harmonizar como os solos.
Foram estudadas diferentes modelos Markovianos com diferentes ordens. Implicando
em uma boa variacao de tecnicas para geracao dos solos. As ordens mais altas obtiveram
melhores medias que as ordens mais baixas, e o metodo TND (metodo com maior numero
de informacoes: tempo no compasso, nota e duracao) obteve a melhor media entre
os metodos computacionais. Talvez 3 seja um numero baixo de ordens a se estudar,
deixando uma opcao de trabalhar com mais ordens em trabalhos futuros. O valor 5 para
o limiar nao foi satisfatorio pois ele tendeu as cadeias a gerarem os solos na ordem 1, ou
seja, a ordem que obteve a menor media.
Apesar das melhores medias terem sido obtidas pelos solos originais, fazendo uma
analise individual entre os solos, o solo que obteve a melhor media foi o ND de ordem 3.
Com teste de Friedman apontando uma hipotese nula, podemos concluir que nao ha uma
diferenca com alguma significancia estatıstica entre nenhum dos solos, indicando que a
maioria dos solos gerados pela maquina foram tao bem conceituados como os originais.
Em trabalhos futuros, serao compostos novos licks de outros guitarristas do blues,
55
56 Conclusoes e Trabalhos Futuros
aumentando a base de dados e variando o estilos dos licks. Uma interface tambem
sera criada para deixar o software com uma maior facilidade de uso. Um estudo mais
aprofundado sobre o valor ideal para o limiar tambem pode ser aplicado, para uma
reducao de ordem das cadeias mais apropriado. O algoritmo genetico tambem e um
tema interessante de ser abordado para se aplicar na geracao dos solos.
E impressionante o poder que os algoritmos tem para resolver alguns problemas de
entendimento humano, e atraves deles tentaremos desempenhar uma das tarefas mais
antigas desempenhadas pelo homem: a composicao musical.
Referencias Bibliograficas
Biles, J. (1994). Genjam: A genetic algorithm for generating jazz solos, Proceedings of
the International Computer Music Conference, INTERNATIONAL COMPUTER
MUSIC ACCOCIATION, pp. 131–131.
Brooks, F. P., Hopkins, A., Neumann, P. G. & Wright, W. (1957). An experiment in
musical composition, Electronic Computers, IRE Transactions on (3): 175–182.
Dimuro, G. P., Reiser, R. H., Costa, A. C. & Souza, P. (2002). Modelos de markov e
aplicacoes, VI Oficina de Inteligencia Artificial, Pelotas: Educat pp. 37–59.
Feijao, P. C. (2004). Um algoritmo de criacao de improvisos com harmonia de jazz.
Friedman, M. (1937). The use of ranks to avoid the assumption of normality impli-
cit in the analysis of variance, Journal of the American Statistical Association
32(200): 675–701.
Hiller, L. A. & Isaacson, L. M. (1979). Experimental Music; Composition with an elec-
tronic computer, Greenwood Publishing Group Inc.
Nierhaus, G. (2009). Algorithmic composition: paradigms of automated music genera-
tion, Springer.
Papadopoulos, G. & Wiggins, G. (1999). Ai methods for algorithmic composition: A
survey, a critical view and future prospects, AISB Symposium on Musical Creativity,
Edinburgh, UK, pp. 110–117.
Sapp, C. (2015). www.sapp.mididfile.com.
Souto, D. (2015). www.alandefreitas.com.
57
58 REFERENCIAS BIBLIOGRAFICAS
Verbeurgt, K., Dinolfo, M. & Fayer, M. (2004). Extracting patterns in music for com-
position via markov chains, Innovations in Applied Artificial Intelligence, Springer,
pp. 1123–1132.
Xenakis, I. (1992). Formalized music: thought and mathematics in composition, num-
ber 6, Pendragon Press.
Indice Remissivo
Arvores, 29
Algoritmo de geracao, 33
Algoritmo de treinamento, 33
Altura, 18
Arranjo Associativo, 28
Avaliacao dos solos, 47
Cadeia de Markov, 11
Classe MFEvent, 23
Classe Midifile, 24
Classe TickTime, 23
Conceitos musicais, 17
Conceitos Musicais e Midifile, 17
Conclusao da Revisao da Literatura, 9
Conclusao sobre a Metodologia, 40
Conclusao sobre conceitos musicais e Midi-
file, 26
Conclusao sobre Modelos Markovianos, 16
Conclusao sobre os Resultados, 53
Conclusoes, 55
Conteiner, 31
Contribuicoes, 5
Estrutura padrao MIDI, 21
Exemplo de modelo Markoviano, 13
Formulacao matematica de um modelo Mar-
koviano, 12
Guitar Pro, 27
Introducao, 3
Iteradores, 32
Limiar, 34
Metodos de representacao de melodias, 37
Map, 32
Melodia Midifile, 26
Metodologia, 27
Motivacao, 4
Notas musicais, 17
Objetivos, 5
Ordens dos modelos Markovianos, 15
Organizacao do Texto, 5
Regras de geracao, 45
Representacao computacional de uma ca-
deia, 32
Resultados, 43
Revisao da Literatura, 7
Tablatura, 19
Testando a consistencia das cadeias, 43
Teste de Friedman, 39
Tom, 19
Treinando as cadeias, 44
59