library(tidyverse)
library(magick)
knitr::opts_chunk$set(echo=FALSE, warning = FALSE, message=FALSE)

Contexto

knitr::include_graphics('bach.jpg')

Questões norteadoras

Análise de dados na música em 3 passos

Análise de dados na música em 3 passos

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

library(magick)
im1 <- image_read('arrow-bold-right-ios-7-symbol_318-35504.jpg') %>% 
  image_scale('100x100') %>% 
  image_border('white', 'x50')
im3 <- image_read('Tutu-mp3-wav-converter.jpg') %>% 
  image_scale('x130') %>% 
  image_border('white', 'x50')
im2 <- image_read('midi.jpg') %>% 
  image_scale('x180')
image_join(im3, im1, im2) %>% 
  image_append() %>% 
  image_write('download.png')
knitr::include_graphics('download.png')

Análise de dados na música em 3 passos

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

im1 <- image_read('arrow-bold-right-ios-7-symbol_318-35504.jpg') %>% 
  image_scale('100x100') %>% 
  image_border('white', 'x50')
im2 <- image_read('midi.jpg') %>% 
  image_scale('x180') %>% 
  image_border('white', 'x50')
im3 <- image_read('midi.jpg') %>% 
  image_scale('x180') %>% 
  image_charcoal()
image_join(im3, im1, im2) %>% 
  image_append() %>% 
  image_write('generate.png')
knitr::include_graphics('generate.png')

Análise de dados na música em 3 passos

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

im1 <- image_read('arrow-bold-right-ios-7-symbol_318-35504.jpg') %>% 
  image_scale('100x100') %>% 
  image_border('white', 'x50')
im2 <- image_read('daw.jpg') %>% 
  image_scale('x180') %>% 
  image_border('white', 'x50')
im3 <- image_read('midi.jpg') %>% 
  image_scale('x180')
image_join(im3, im1, im2) %>% 
  image_append() %>% 
  image_write('transform.png')
knitr::include_graphics('transform.png')

Interesse

Parte 2: composição

Queremos

Notação

Restrições

$$ \mathcal V_i = {\mathcal V_i^t}_t, t\in {1,\dots,T}, i={1,2,3,4} $$

Notas

$$ \mathcal V_i^t \in {__, C_1, C#_1, D1, D#_1, ... B_1, C_2, C#_2, ...} $$

Metadados

$$ \mathcal M = (\mathcal S, \mathcal F, \mathcal R) $$

Dados

Para cada música, nossos dados de entrada são a tupla

$$ (\mathcal V, \mathcal M), $$

em que $\mathcal V = (\mathcal V_i),i\in 1,2,3,4$.

image_read('data.png') %>% 
  image_crop("1100x320+670+340") %>% 
  image_write('data_ok.png')
knitr::include_graphics('data_ok.png')

Modelo

Construímos um modelo que nos dê

$$ \left{p_i(\mathcal V_i^t | \mathcal V_{\setminus {i,t}}, \mathcal M, \theta_{i})\right}, i \in 1,2,3,4; t\in 1,\dots, T $$

$$ \tilde {\mathcal V}_{\setminus{i,t}} = {\mathcal V_j^s, j \neq i, s\in{t-\Delta t, \dots, t-1, t+1, \dots, t + \Delta t}} $$

Otimização

Queremos obter $\theta_{i}$ de tal forma que

$$ \hat \theta_i = \arg \max_{\theta_i} \sum_t \log p_i(\mathcal V_i^t | \mathcal V_{\setminus {i,t}}, \mathcal M, \theta_{i}), \;\;\;i=1,2,3,4 $$

Arquitetura

image_read('architecture.png') %>% 
  image_crop("660x960+920+090") %>% 
  image_write('architecture_ok.png')
knitr::include_graphics('architecture_ok.png')

Um pouco de NN, RNN e LSTM

Algoritmo generativo (composição)

Algoritmo pseudo-gibbs

Fazemos isso por um número de iterações $M$ definido pelo usuário.

Resultados

Teste com humanos

Condução do teste

Resultados

Vermelho: % de pessoas que chutaram "Bach" nas composições

image_read('results.png') %>% 
  image_crop("1080x480+700+330") %>% 
  image_write('results_ok.png')
knitr::include_graphics('results_ok.png')

Comentários finais

Conclusões

Futuro (julio)

Bibliografia



r-music/deepbach documentation built on May 27, 2019, 7:46 a.m.