niszetの日記

細かい情報を載せていくブログ

midiを読んでヒストグラムをプロットしてみる

ピアノロール以外の表示をやってみる

以前、midiを読み込んでプロットしました。

niszet.hatenablog.com

これをもうちょっとやってみます。

J.S.Bach の インヴェンション は2声なので上と下の音をそれぞれ取り出すとほぼ単音になります。
これはもとのmidiデータの作りによりますが、tuneR::getMidiNotesで取り出したdata.frameのtrack列が五線譜の上下それぞれを表していたりします(そう作れば、ですが)

確かめてみます。

inv1 <- tuneR::readMidi("Bwv772_Inventionen_1.mid")
inv1 %>% tuneR::getMidiNotes() %>% select(track) %>% distinct()
#>   track
#> 1     2
#> 2     3

内部的にtrack2と3でデータを持っています。2が上パートになっているのでこれを使います。

前回同様にプロットしてみます。

inv1 %>% getMidiNotes() %>% filter(track==2) %>% mutate(endtime=time+length) %>%
  ggplot()+geom_segment(aes(x=time, y=note, xend=endtime, yend=note, color=as.factor(note%%12), size=1))+scale_color_brewer(palette = "Paired")

f:id:niszet:20180101210741p:plain

最後に単音じゃなくなってますけど、まぁ今回は気にしない…

ということで、ヒストグラムにしてみます

library(tidyverse)
library(tuneR)

inv1 %>% getMidiNotes() %>% filter(track==2) %>%
  ggplot() + geom_histogram(aes(x=note, fill=as.factor(note%%12)) ,binwidth = 1) +
  scale_fill_brewer(palette = "Paired")

f:id:niszet:20180101205441p:plain

前回同様、音色ごとに色分けをしています。noteの数値から音階がパッとわからないので色を分けていますが、真ん中の一番高い水色の棒、72番はドの音です。
インベンション、1番はハ長調なので、ドレミファソラシドの音がよく出やすく、それ以外は出現しにくいことがわかりますね。

ちなみに、この表示の仕方だと音の長さが考慮されません。lengthを考慮するならこんな感じですかね…やっつけであまり自身がないですが。

inv1 %>% getMidiNotes() %>% filter(track==2) %>% group_by(note) %>% summarise(sum_note=sum(length)) %>% 
  ggplot() + geom_point(aes(x=note, y=sum_note, color=as.factor(note%%12)) )+scale_color_brewer(palette = "Paired")

f:id:niszet:20180101215058p:plain

これだとあまりわかりやすくはないかな…(hist系はyの値を指定できないので…) もう少し頑張ってみよう…