O objetivo desse estudo é gerar aleatóriamente uma melodia baseando-se em uma composição de referência. Existem vários algoritmos para isso, a abordagem escolhida aqui foi aplicar Cadeias de Markov. Uma das utilidades disso é por exemplo, finalizar composições inacabadas de forma que seja gerado aleatóriamente o restante da melodia seguindo o padrão original.
Uma Cadeia de Markov é um processo estocástico de estados discretos com a propriedade de que o próximo estado depende apenas do estado atual e não dos eventos anteriores a esse, ou seja, dependendo apenas a memória recente. Na nossa abordagem a Cadeia de Markov será obtida a partir de uma composição base, onde cada estado será uma nota musical. As composições geradas serão baseadas na matriz de transição dessa cadeia, permitindo que elas tenham padrões similares à original.
A partir de uma composição base o primeiro passo é identificar através da partitura as notas musicais utilizadas e definir a Cadeia de Markov. As músicas serão geradas na mesma estrutura da original (usando as pausas na mesma posição e os tempos da melodia original, isto é, a mesma divisão rítmica).
A primeira nota musical não possui nenhum precedente, como alternativa utiliza-se as frequências relativas de cada nota para definir a primeira nota da sequência. A partir da composição base obtêm-se a função de probabilidade das notas. Para as seguintes notas leva-se em conta a nota anterior. Por exemplo, para gerar a quarta nota da sequência leva-se em conta apenas a terceira nota. Utilizando a frequência relativa das transições da composição base é possível definir uma matriz de transição para a Cadeia de Markov de ordem 1. Partindo para uma abordagem mais detalhada, é possível pensar na matriz de transição para a Cadeia de Markov de ordem 2. Nesse caso identifica-se todas as sequências de duas notas presentes na composição, levando em conta a frequência relativa da transição de cada uma dessas sequências para a próxima nota.
Neste estudo foram feitas duas abordagens:
Utilizar a cadeia de ordem 0 para gerar a primeira nota e a cadeia de ordem 1 para as demais.
Utilizar a cadeia de ordem 0 para gerar a primeira nota, a cadeia de ordem 1 para gerar a segunda nota, e a cadeia de ordem 2 para gerar as demais.
Espera-se que as melodias geradas pela segunda abordagem sejam mais similares a composição original do que as geradas pela primeira.
Os pseudocódigos para ambas as abordagens encontram-se nas Figuras 1 e 2.
Pseudocódigo do primeiro algoritmo
Usando como composição base: “When the Saints go Marchin’ in” apresentada a seguir.
Partitura da composição “When the Saints go Marching in”, utilizada como base.
A partir da partitura identifica-se a frequência relativa de cada uma das notas presentes, obtendo a tabela do processo de markov de ordem zero:
| Notas | Dó | Ré | Mi | Fá | Sol | Lá | Si |
|---|---|---|---|---|---|---|---|
| \(\frac{7}{33}\) | \(0\) | \(0\) | \(\frac{8}{33}\) | \(\frac{3}{33}\) | \(\frac{10}{33}\) | \(\frac{5}{33}\) |
Para a matriz de transição de ordem 1 levou-se em conta a frequência relativa das transições de uma nota para outra, obtendo a seguinte matriz de transição de primeira ordem:
| Notas | Dó | Ré | Mi | Fá | Sol | Lá | Si |
|---|---|---|---|---|---|---|---|
| Dó | \(\frac{2}{7}\) | \(0\) | \(0\) | \(\frac{2}{7}\) | \(0\) | \(\frac{2}{7}\) | \(\frac{1}{7}\) |
| Ré | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) |
| Mi | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) |
| Fá | \(0\) | \(0\) | \(0\) | \(\frac{1}{7}\) | \(\frac{1}{7}\) | \(\frac{5}{7}\) | \(0\) |
| Sol | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) | \(0\) | \(0\) |
| Lá | \(\frac{1}{10}\) | \(0\) | \(0\) | \(\frac{2}{10}\) | \(\frac{2}{10}\) | \(\frac{1}{10}\) | \(\frac{4}{10}\) |
| Si | \(\frac{4}{5}\) | \(0\) | \(0\) | \(0\) | \(0\) | \(\frac{1}{5}\) | \(0\) |
Já para a matriz de transição de ordem 2 levou-se em conta a frequência relativa das transições de uma sequência de duas notas para outra nota, obtendo a seguinte matriz de transição de segunda ordem:
| Notas | Dó | Ré | Mi | Fá | Sol | Lá | Si |
|---|---|---|---|---|---|---|---|
| Fá, Lá | \(\frac{1}{5}\) | \(0\) | \(0\) | \(0\) | \(\frac{1}{5}\) | \(0\) | \(\frac{3}{5}\) |
| Lá, Si | \(1\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) |
| Si, Dó | \(0\) | \(0\) | \(0\) | \(\frac{2}{4}\) | \(0\) | \(\frac{2}{4}\) | \(0\) |
| Dó, Fá | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) |
| Dó, Lá | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) | \(0\) | \(0\) |
| Lá, Fá | \(0\) | \(0\) | \(0\) | \(0\) | \(\frac{1}{2}\) | \(\frac{1}{2}\) | \(0\) |
| Lá, Sol | \(0\) | \(0\) | \(0\) | \(\frac{1}{2}\) | \(0\) | \(\frac{1}{2}\) | \(0\) |
| Sol, Lá | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) |
| Lá, Lá | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) | \(0\) |
| Sol, Fá | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) | \(0\) | \(0\) |
| Fá, Fá | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) |
| Lá, Dó | \(1\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) |
| Dó, Dó | \(\frac{1}{2}\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(\frac{1}{2}\) |
| Si, Lá | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) |
| Fá, Sol | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) | \(0\) | \(0\) |
| Dó, Si | \(0\) | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) | \(0\) |
De todas as composições geradas pela primeira abordagem (ordem 1), duas soavam mais agradáveis
Partitura da primeira composição escolhida gerada utilizando a matriz de transição de ordem 1.
Partitura da segunda composição escolhida gerada utilizando a matriz de transição de ordem 1.
De todas as composições geradas pela segunda abordagem (ordem 2), duas soavam mais agradáveis:
Partitura da terceira composição escolhida gerada utilizando a matriz de transição de ordem 2.
Vale observar que todas as composições escolhidas terminavam na nota correspondente a tonalidade da música (Fá), dando uma coerência ao fim. Em seguida apresenta-se um exemplo de uma composição que não termina na nota Fá, dando uma sensação de que a música está inacabada.
Partitura de uma composição gerada utilizando a matriz de transição de ordem 2.
Nesse estudo foram geradas melodias baseando-se em Cadeias de Markov, seguindo duas abordagens: Utilizando-se da matriz de transição de primeira ordem; e da matriz de transição de segunda ordem e selecionando as composições que soaram mais agradáveis. Esperava-se que as melodias geradas a partir da matriz de segunda ordem possuíssem mais propriedades da composição original do que as geradas pela matriz de transição de primeira ordem. As melodias geradas apresentaram similaridades em alguns trechos em relação a original, porém não observou-se grande diferença entre as de primeira e segunda ordem. Para trabalhos futuros é possível melhorar o algoritmo gerando por exemplo divisão ritmica pela cadeia de markov, e até mesmo a harmonia.