標準MIDIファイルの情報をCSVに書き出す

標準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