chorrrds: Analisando acordes de músicas brasileiras

Olá! Tudo bem? Eu sou a Bruna, e talvez você já me conheça de algum grupo de R no Telegram ou Facebook, ou mesmo pelo meu outro pacote, o
vagalumeR. Eu estou prestes a me formar em Estatística na UFPR, e esse post vai ter muito a ver com o tema do meu trabalho de conclusão de curso, que está sendo feito sob orientação do Professor Walmes Zeviani.

Recentemente, eu fiz a primeira versão do pacote do meu TCC, o chorrrds. Ainda tem muito a ser feito nele, mas os primeiros resultados já são bem legais. O pacote chorrrds pode ser utilizado para a obtenção acordes de músicas, através da raspagem do site CifraClub. Junto com o pacote já vêm diversos bancos de dados relativos à música brasileira. Ele já está disponível no CRAN, mas as próximas atualizações devem sair em primeira mão nesse repositório: https://github.com/brunaw/chorrrds

# Instalação
devtools::install_github("brunaw/chorrrds")
# ou
install.packages("chorrrds") # do CRAN
data(package = "chorrrds")

A base de dados chamada all, presente no pacote, contém dados referentes a 106 artistas nacionais, dos genêros: “rock”, “pop”, “sertanejo”, “MPB”, “bossa nova”, “forró”, “reggae” e “samba”. Ela já contém, além das variáveis extraídas com o pacote, as datas de lançamento e a popularidade das músicas, obtidas através da API do Spotify. Os detalhes sobre a seleção dos artistas e combinação dos dados com os do Spotify serão omitidos por enquanto, mas quem quiser falar sobre isso comigo, pode ficar a vontade :)

Então vamos lá. Eu vou começar acertando alguns pontos sobre os dados, já que eles não estão perfeitos, como:

  • Deixar apenas os anos de lançamento das músicas, e não a data completa;
  • Encontrar as formas mais simples dos acordes (sem acidentes ou extensões);
  • Conectar a base original com a dos genêros dos artistas;
  • Consertar enarmonias, ou seja, transformar as diferentes versões de um acorde com as mesmas notas em uma coisa só (por exemplo, Gb passa a ser F#, já que na prática eles são iguais).
library(tidyverse)

# Base de gêneros
genre <- chorrrds::genre

da <- chorrrds::all %>% 
  dplyr::mutate(date = stringr::str_extract(date, 
                                            pattern = "[0-9]{4,}")) %>%
  # Extrai apenas os anos
  dplyr::mutate(date = as.numeric(date), # Deixa as datas como valores numéricos
                acorde = stringr::str_extract(chord, # Extrai as partes fundamentais dos
                                              pattern = "^([A-G]#?b?)")) %>%  # acordes
  dplyr::filter(date > 1900) %>% # Mantém apenas os anos que fazem sentido
  dplyr::left_join(genre, by = "artist") %>%  # Traz os gêneros dos artistas
  dplyr::mutate(acorde = case_when( # Contribuição do Julio 
    acorde == "Gb" ~ "F#",
    acorde == "C#" ~ "Db",          
    acorde == "G#" ~ "Ab",
    acorde == "A#" ~ "Bb",
    acorde == "D#" ~ "Eb",
    acorde == "E#" ~ "F",
    acorde == "B#" ~ "C",
    TRUE ~ acorde)) # Conversão de enarmonias

head(da)
date music popul chord key artist acorde genre
1992 adriana calcanhotto a fabrica do poema 51 Cm D# adriana calcanhotto C MPB
1992 adriana calcanhotto a fabrica do poema 51 Ab D# adriana calcanhotto Ab MPB
1992 adriana calcanhotto a fabrica do poema 51 Db7 D# adriana calcanhotto Db MPB
1992 adriana calcanhotto a fabrica do poema 51 Db7/9 D# adriana calcanhotto Db MPB
1992 adriana calcanhotto a fabrica do poema 51 Cm D# adriana calcanhotto C MPB
1992 adriana calcanhotto a fabrica do poema 51 Fm D# adriana calcanhotto F MPB

A base está no formato longo, ou seja, temos uma linha para cada acorde da música, mantendo a sequência na qual eles aparecem no site.

Muito se fala sobre o quanto as músicas no Brasil andam ficando mais “simples”, ou que alguns genêros musicais são mais ricos que outros. Com os dados que temos, será que é possível concluir algo sobre isso olhando simplesmente para a quantidade média de acordes por música ao longo dos anos? Vejamos o gráfico a seguir.

da_g <- da %>% 
  # 2018 ainda não é um ano completo
  dplyr::mutate(date < 2018) %>%  
  # Agrupamento por data + acorde + musica
  dplyr::group_by(date, genre, music, chord) %>% 
  # Mantém os acordes distintos/ano
  dplyr::summarise(distintos = n_distinct(chord)) %>% 
  dplyr::summarise(cont = n()) %>% 
  # Média de acordes distintos nas músicas/ano
  dplyr::summarise(media = mean(cont), contagem = n()) 


# grafico
p <- da_g %>% 
  ggplot(aes(x = date, y = media)) +
  geom_point(colour = "skyblue3") +
  facet_wrap("genre") +
  scale_fill_hue(c = 55, l = 75) +
  geom_smooth(aes(group = genre), span = 0.65, colour = "white", 
              fill = "tan", method = "loess") +
  labs(x = "Anos", y = "Média de acordes/música")

# tema para deixar o gráfico bonitinho
tema <- theme(
  legend.position='none', 
  axis.line = element_line(size = 0.5, colour = "tan"),
  panel.grid.major = element_line(
    colour = "black", size = 0.08, linetype = "dotted"),
  panel.border = element_blank(),
  panel.background = element_blank(),
  strip.background = element_rect(colour = "tan", fill = "white", size = 0.6), 
  strip.text = element_text(size = 14),
  axis.title = element_text(size = 14),
  axis.text = element_text(size = 12))
  
p + tema

Claramente, gêneros como o samba, MPB e bossa nova têm, em geral, uma quantidade média de acordes distintos por música muito maior do que os outros. E eles têm mais variação ao longo dos anos também, o que pode ser um reflexo da maior criatividade envolvida nestes genêros. Os menores valores, como é esperado, estão principalmente no sertanejo, que é um genêro conhecidamente mais uniforme na questão harmônica.

Nós podemos avançar um pouco e olhar para os próprios artistas. Quem será que usa as maiores quantidades de acordes distintos em suas composições? Vamos ver o próximo gráfico, que mostra apenas os artistas com mediana maior do que 8 acordes diferentes por música.

da_g <- da %>%   
  dplyr::mutate(artist = stringr::str_to_title(artist)) %>% 
  # Agrupamento por artista + música
  dplyr::group_by(artist, genre, music) %>% 
  # Mantém os acordes distintos
  dplyr::summarise(distintos = n_distinct(chord)) %>% 
  # Obtém a mediana e quantis de acordes distintos por música/artistas
  dplyr::summarise(med = median(distintos), 
                   contagem = n(),
                   inf = quantile(distintos)[2],
                   sup = quantile(distintos)[4])


# grafico
p <- da_g %>%
  dplyr::filter(med > 8) %>% 
  ggplot(aes(x = reorder(artist, med), y = med)) +
  geom_pointrange(aes(ymin = inf, ymax = sup, colour = genre), size = 0.7) + 
  scale_colour_hue(c = 55, l = 75) +
  coord_flip() +
  labs(colour = "Gênero", 
       x = "Artistas", 
       y = "Primeiro quartil, mediana e terceiro quartil")

# tema
tema <- theme(
  axis.line = element_line(size = 0.5, 
                           colour = "tan"),
  panel.grid.major = element_line(colour = "black", 
                                  size = 0.08, 
                                  linetype = "dotted"),
  panel.border = element_blank(),
  panel.background = element_blank(),
  axis.text = element_text(size = 12), 
  axis.title.x = element_text(size = 16),
  axis.title.y = element_text(size = 16))

p + tema

E voilá. A primeira posição é ocupada por um dos maiores musicistas brasileiros, que é referência internacional em questões de harmonia: Chico Buarque. Logo em seguida, temos o Reinaldo, um dos maiores sambistas que o Brasil já conheceu, e o Pixinguinha, um gênio do choro. E assim a lista segue, com artistas principalmente da bossa nova, samba e MPB. Demora até que apareça o primeiro dos rockeiros nesta lista, que é a Rita Lee. Dos membros do sertanejo, nenhum chega a aparecer no gráfico, mostrando que a “variedade” harmônica deste gênero musical é mesmo bem baixa.

Até agora está legal mas, com música, sempre pode ficar ainda mais. A ideia mais recente que o meu caro orientador Walmes Zeviani teve para o nosso trabalho é de encadear as transições entre os acordes em um diagrama de cordas. Vocês já ouviram falar desse diagrama? Eu mal o conheço e já considero pacas.

O diagrama de cordas é um método gráfico (e lindo) de explicitar relações entre grupos ou indivíduos. Os grupos ficam arranjados de forma radial/circular, e as cordas que aparecem dentro do círculo demonstram as conexões entre eles e suas forças. Pra quem sabe um pouquinho sobre harmonia, vai ser sensacional ver o quanto isso faz sentido (mas também não vou entrar nesse mérito agora).

O exemplo que eu vou mostrar aqui é extremamente simples. Antes eu separei, dos acordes “crus” retirados do CifraClub, apenas a parte fundamental deles. Isto é, desconsiderei se um acorde tem notas extras, acidentes e maior/menor. Ou seja, aqui nós só veremos acordes como C, D, B, A#, o miolo da coisa. Podemos perder informação fazendo isso? Sim, e bastante. Mas como eu disse, esse caso é pra ser bem simples mesmo.

Enfim, vamos voltar ao exemplo. A seguir, eu considero como uma “transição” quando um acorde aparece em sequência do outro (exemplo de transição muito comum: dó-sol). O código abaixo constrói o diagrama de cordas através do pacote chordiag:

devtools::install_github("mattflor/chorddiag")
# Ordenando por círculo das quintas
ordem <- c("G", "D", "A", "E", "B", "F#", 
           "Db", "Ab", "Eb", "Bb", "F", "C")

da$acorde <- factor(da$acorde, levels = ordem)

comp <- data.frame(
  acorde = da$acorde, 
  seq = dplyr::lead(da$acorde)) %>% # Pega o acorde "seguinte"
  dplyr::group_by(acorde, seq) %>%  # Agrupa por cada transição
  dplyr::summarise(contagem = n()) # Conta quantas são as transições

mat_comp <- reshape2::dcast(comp,   # Arranja em do tipo matriz quadrada
                            acorde ~ seq, value.var = "contagem") 
mm <- as.matrix(mat_comp[ ,-1]) # Converte o df em matriz (exigência do pacote)
mm[is.na(mm)] <- 0 # Substitui na por 0 (exigência do pacote)
dimnames(mm) <- list(acorde = unique(mat_comp$acorde),
                     seq = unique(mat_comp$acorde))

# Constrói o diagrama interativo
chorddiag::chorddiag(mm, showTicks = FALSE,
                     palette = "Set2", palette2 = "#Set3")

Vejam que interessante. Como eu disse antes, uma das relações mais fortes do diagrama é o C-G (ou dó-sol), que é justificada teoricamente, já que o G é a quinta do C. O mesmo acontece com D-A, A-E, F-C e assim por diante. Quem quiser saber mais sobre esse comportamento, pode dar uma olhada aqui. Transições meio malucas, como B-Bb, também acontecem. “Maluca” porque um acorde bemol, indicado pelo “b”, é aquele cuja raíz esta meio tom abaixo do indicado pela letra anterior, que neste caso é o B (si), então esse acontecimento não faz muito sentido.

Considerações Finais

O que vimos aqui é um pedaço da análise inicial do meu TCC, que ainda não está nem um pouco pronto. São exemplos simples das informações podemos extrair com o pacote chorrrds, e o universo de possibilidades é infinito. Isso que nós nem começamos a falar sobre as conexões que podem ser feitas com a API do Spotify, o pacote music21, que é do próprio Julio Trecenti, com as letras das músicas,…

Além disso, om certeza, meu objetivo com os gráficos apresentados não é fazer nenhum tipo de juízo de valor sobre os genêros por conta de “complexidade harmônica”. Diga-se de passagem, eu mesma sou bem fã de todos esses genêros, desde a MPB até o sertanejo :D

Agradecimentos

Ao meu orientador, Walmes Zeviani, que fez eu me apaixonar pelo R, e ao Julio Trecenti, que é tão entusiasta do meu TCC quanto eu, e já fez diversas contribuições valiosas.

comments powered by Disqus