ピアノロール以外の表示をやってみる
以前、midiを読み込んでプロットしました。
これをもうちょっとやってみます。
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")
最後に単音じゃなくなってますけど、まぁ今回は気にしない…
ということで、ヒストグラムにしてみます
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")
前回同様、音色ごとに色分けをしています。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")
これだとあまりわかりやすくはないかな…(hist系はyの値を指定できないので…) もう少し頑張ってみよう…