2018年5月13日日曜日

PythonでMIDIを扱えるようにpretty_midiを導入する

Pythonで楽譜を扱うのが面白いです。ABC記譜法であれば、楽譜を「文字」として扱えるのでPythonだと比較的にラクに処理できます。ただ、楽譜のインプットやアウトプットのことを考えるとMIDIファイルを扱えるようにしたほうが便利なように思えます。

pretty_midiを使う

PythonでMIDIを扱う場合、パッケージ『pretty_midi』をインポートすれば良さそうです。MIDIファイル内のトラックごとに、ノートをリストとして取得できるようになります。

インストールはpipコマンドだけで済むのでラクチン。

pip install pretty_midi

MIDIを読み込む

PrettyMIDI()でファイル名を指定すれば、あとはトラックとノートがリストで取得できます。

import pretty_midi

# MIDIファイルのロード
midi_data = pretty_midi.PrettyMIDI('test.mid')
# トラック別で取得
midi_tracks = midi_data.instruments
# トラック1のノートを取得
notes = midi_tracks[0].notes
for note in notes:
    # ベロシティー、ノートナンバー、
    # ノートオンタイム、ノートオフタイム
    # の順でノート情報が渡される
    print(note)

pretty_midiを使うときに注意しなければいけないのは次の事項でしょうか?

  • 基本的にTickではなく、時間で位置が管理されている
    ※Tickへ変換するメソッドが用意されている
  • 楽曲開始位置はアーフタクトが考慮されていない
  • 分解能は480Tickへ変換される

ABC記譜法では存在していた休符情報がMIDIでは在りません。機械学習で休符情報も欲しい場合はロケーションの差分を求めて、擬似ノートを置いてあげる必要がありますね。