Estatística e Música

Por Julio 03/11/2017

Para quem está esperando posts sobre captchas, esperem mais um pouquinho 😄. Em novembro voltarei a postar sobre esse assunto.

Em setembro de 2017, participei do 16th Symposium on Computer Music, organizado pelo prof. Marcelo Queiroz do IME-USP. O evento foi muito legal! Estou estudando música nos últimos meses e acho que farei meu doutorado em soluções que ligam estatística e música. É uma área realmente apaixonante.

Uma das formas que usarei para aprender os métodos e estudar os conceitos será esse blog! Assim vocês poderão acompanhar meus avanços e propor ideias para colaborar com meus trabalhos. Pretendo desenvolver tanto modelos estatísticos e programação quanto teoria musical.

Até o momento, tenho três posts planejados ou prontos:

  • pacote music21: esse post! Veja abaixo.
  • pacote chordgen: pacote que criei para gerar sequências aleatórias de acordes com o R
  • artigo deepbach: um modelo de redes neurais capaz de imitar corais de Bach.

Computação musical numa casca de noz

Apesar da minha falta de conhecimento sobre o tema, acredito que a área de computação musical pode ser resumida em três frentes:

Leitura: extrair dados estruturados dos áudios. Envolve Music Information Retrieval - MIR

Composição: Criar ou completar músicas automaticamente

Edição: Adicionar efeitos na música para produção

Meu foco será na parte de composição, com foco em harmonização, que significa criar e completar harmonias das músicas dado algum estilo (e.g. Bach ou Beatles). Também tentarei criar soluções de improviso, apesar de não garantir nada.

music21

O objetivo do pacote music21 é funcionar como um port pipeável (%>%-able) da biblioteca music21, em python. Ele usa o excelente pacote reticulate do RStudio como backend.

Atualmente, o music21 é mais limitado que a bibloteca em python. No entanto, graças ao reticulate é fácil rodar qualquer função do music21 no R.

Instalação

Como o music21 utiliza bibliotecas python, é necessário instalar algumas dependências antes. No Ubuntu, basta rodar

sudo apt-get install python-pip
sudo pip install pip --upgrade
sudo pip install music21

Em outros sistemas opetacionais, veja a documentação oficial da biblioteca.

Eu tenho o péssimo hábito de não subir meus pacotes para o CRAN. Mas prometo que esse vou subir e manter. Por enquanto, para instalar o pacote music21 é necessário rodar

devtools::install_github("jtrecenti/music21")

Você pode carregar o pacote rodando

library(music21)

Para usar a função de plotar uma partitura, você também precisara do lilypond:

sudo apt-get install lilypond

O objeto music21

library(music21)
music21
## Module(music21)

O objeto music21 é um módulo do python. Com ele é possível rodar qualquer função do pacote usando $, tratando o objeto como uma Reference Class.

note <- music21$note$Note("C#")
note
## <music21.note.Note C#>
note %>% 
  plot()

Exemplo

Corais do Bach

get_composer("bach") %>% 
  head()
## [1] "/usr/local/lib/python2.7/dist-packages/music21/corpus/bach/bwv1.6.mxl"  
## [2] "/usr/local/lib/python2.7/dist-packages/music21/corpus/bach/bwv10.7.mxl" 
## [3] "/usr/local/lib/python2.7/dist-packages/music21/corpus/bach/bwv101.7.mxl"
## [4] "/usr/local/lib/python2.7/dist-packages/music21/corpus/bach/bwv102.7.mxl"
## [5] "/usr/local/lib/python2.7/dist-packages/music21/corpus/bach/bwv103.6.mxl"
## [6] "/usr/local/lib/python2.7/dist-packages/music21/corpus/bach/bwv104.6.mxl"

Vamos pegar uma delas e guardar numa variável

bach_music <- get_composer("bach")[61] %>% 
  read_music()

Plotando a música bwv165.6

Basta rodar plot()!!

bach_music %>% 
  plot()

No RStudio, você pode usar a função view() para visualizar a música em melhor resolução no Viewer Pane.

Imprimindo bwv165.6 (só o soprano)

Para visualizar as notas de uma música basta rodar o objeto no console. A música é organizada por Measures (compassos) e cada compasso vai mostrar seus componentes. No primeiro compasso, podemos ver a clave de sol (TrebleClef), as definições do tom (sol maior) e do tempo (4/4). Nos demais, observamos as notas e os temos associados a cada nota. Por exemplo, temos uma nota F# no primeiro tempo.

bach_music[[1]]
## {0.0} <music21.instrument.Instrument P1: Soprano: Instrument 1>
## {0.0} <music21.stream.Measure 0 offset=0.0>
##     {0.0} <music21.clef.TrebleClef>
##     {0.0} <music21.key.Key of G major>
##     {0.0} <music21.meter.TimeSignature 4/4>
##     {0.0} <music21.note.Note G>
## {1.0} <music21.stream.Measure 1 offset=1.0>
##     {0.0} <music21.note.Note G>
##     {1.0} <music21.note.Note F#>
##     {2.0} <music21.note.Note E>
##     {2.5} <music21.note.Note F#>
##     {3.0} <music21.note.Note G>
##     {3.5} <music21.note.Note A>
## {5.0} <music21.stream.Measure 2 offset=5.0>
##     {0.0} <music21.note.Note B>
##     {0.5} <music21.note.Note C>
##     {1.0} <music21.note.Note A>
##     {2.0} <music21.note.Note G>
##     {3.0} <music21.note.Note G>
## {9.0} <music21.stream.Measure 3 offset=9.0>
##     {0.0} <music21.note.Note G>
##     {1.0} <music21.note.Note A>
##     {1.5} <music21.note.Note G>
##     {2.0} <music21.note.Note F#>
##     {2.5} <music21.note.Note E>
##     {3.0} <music21.note.Note D>
## {13.0} <music21.stream.Measure 4 offset=13.0>
##     {0.0} <music21.note.Note G>
##     {2.0} <music21.note.Note F#>
##     {3.0} <music21.note.Note F#>
## {17.0} <music21.stream.Measure 5 offset=17.0>
##     {0.0} <music21.layout.SystemLayout>
##     {0.0} <music21.note.Note G>
##     {1.0} <music21.note.Note G>
##     {2.0} <music21.note.Note A>
##     {3.0} <music21.note.Note B>
## {21.0} <music21.stream.Measure 6 offset=21.0>
##     {0.0} <music21.note.Note A>
##     {2.0} <music21.note.Note A>
##     {3.0} <music21.note.Note B>
## {25.0} <music21.stream.Measure 7 offset=25.0>
##     {0.0} <music21.note.Note C>
##     {1.0} <music21.note.Note B>
##     {2.0} <music21.note.Note A>
##     {3.0} <music21.note.Note B>
##     {3.5} <music21.note.Note C>
## {29.0} <music21.stream.Measure 8 offset=29.0>
##     {0.0} <music21.note.Note A>
##     {2.0} <music21.note.Note G>
##     {3.0} <music21.bar.Barline style=final>

Você pode tratar esse objeto como uma lista. Se você entrar numa nota, você poderá ver algumas características dela

# Nota F#
bach_music[[1]][[2]][[3]]
## <music21.note.Note F#>

# duração da nota
bach_music[[1]][[2]][[3]]$duration
## <music21.duration.Duration 0.5>

# som exato
bach_music[[1]][[2]][[3]]$pitch
## F#4

Por enquanto vou acabar por aqui. Convido vocês a usarem o music21 e experimentar suas funcionalidades. Adicionem issues em https://github.com/jtrecenti/music21/issues e mandem pergundas nos comentários.

É isso! Happy coding ;)

comments powered by Disqus