標準MIDIファイルで演奏を録音して分析したいという要求があったので、Taktを使ってやってみました。MIDIファイルからノートオン・イベントだけを取り出してCSVファイルに書き出したいとのことなので、以下のようにささっと。Taktマニュアルに書いてあるサンプルにファイル書き出し部分を付けただけですが。
var buf = read("etude1.mid") var fh = File.open("output.csv", "w") fh.printf("time, note_number, velociy, duration\n") foreach(ev, buf) { if( ev is NoteOnEvent ) { // print only note-on events fh.printf("%d, %d, %d, %d\n", ev.t, ev.n, ev.v, ev.noteOff.t - ev.t) } } fh.close()
etude1.midというMIDIファイルを読み込んで、出力されたCSVファイルの先頭部分は以下のようになっています。
time, note_number, velociy, duration 0, 36, 90, 3840 0, 48, 90, 3840 120, 48, 71, 120 240, 55, 72, 120 360, 60, 72, 120 480, 64, 94, 120 600, 60, 74, 120 720, 67, 75, 120 : :
それをRで読み込んでsummaryを見てみます。
A <- read.csv("output.csv") summary(A)
note_numberの平均値は69.12(音高はだいたいA4、443.06 Hz)、中央値は71(音高はB4、493.88 Hz)とのこと。他にも工夫次第でいろいろなことが分かるようになるでしょう。
time note_number velociy duration Min. : 0 Min. : 24.00 Min. : 71.00 Min. : 120 1st Qu.: 37200 1st Qu.: 59.00 1st Qu.: 76.00 1st Qu.: 120 Median : 74880 Median : 71.00 Median : 80.00 Median : 120 Mean : 74613 Mean : 69.12 Mean : 83.38 Mean : 327 3rd Qu.:111720 3rd Qu.: 83.00 3rd Qu.: 90.00 3rd Qu.: 120 Max. :149760 Max. :101.00 Max. :110.00 Max. :3840