PythonでMIDIから色々な情報を取得したい

とりあえずPythonMIDIファイルを扱えるようにするのが今回の目的です。

そもそもMIDIってどんなファイルなの?

MIDIファイルって、そもそも何なの?」
という人は、このブログに辿り着かないと思うので、省略。

どうしても知りたい人は、以下を読めば良いかと。
www.dtmstation.com

ここでは細かい話は抜きにして
MIDIデータとはPCが演奏するための楽譜データである
と思っておけば、問題ないです。

さて、いるのかどうかは分からないけど、
「これからPythonMIDIデータを扱ってみたい」という方がいたら
MIDIファイルは以下のように考えておいてくだされ。

f:id:tory_0601:20220224230927p:plain
MIDIの構造イメージ

ここで出てくる"Track"は「フォルダみたいなもの」で、それ自体は情報を持ってないです。
実際の「テンポや音程の情報」は"Message"に記述されています。

この辺のイメージがあれば、もうビビることなく触れると思うので
実際にPythonを使って読み込んでいきます。

どうやってPythonで読み込む?

PythonMIDIファイルを扱うためには、
Midoという外部ライブラリをインストールする必要があります。

公式ドキュメントはこちら
Mido - MIDI Objects for Python — Mido 1.2.10 documentation


開発環境にもよって変わりますが、
基本的には以下2つのコマンドを実行すれば良いです。
python-rtmidiはportを使うのに必要らしいのだけど、現時点では正直よくわかってない)

> pip install mido
> pip install python-rtmidi

動作確認してみる

とりあえず、何かしらMIDIファイルを準備します。
DAWやMuseScoreで作る、フリーのMIDIファイルをダウンロードする、...などなど)

MIDIファイルが準備できたらMidoを使って読み込んでみます。
(以下は3つの音符しか入ってない簡素なファイル"new_song.mid"を読み込んだ例)

import mido
midi = mido.MidiFile("new_song.mid")
print(midi)
MidiFile(type=1, ticks_per_beat=480, tracks=[
  MidiTrack([
    MetaMessage('set_tempo', tempo=500000, time=0),
    Message('note_on', channel=0, note=64, velocity=100, time=0),
    Message('note_off', channel=0, note=64, velocity=64, time=480),
    Message('note_on', channel=0, note=66, velocity=100, time=0),
    Message('note_off', channel=0, note=66, velocity=64, time=480),
    Message('note_on', channel=0, note=68, velocity=100, time=0),
    Message('note_off', channel=0, note=68, velocity=64, time=480),
    MetaMessage('end_of_track', time=0)])
])

読み込んだMIDIファイルにもよりますが、
こんな感じでMessageが沢山表示されていれば、
正常に動作していると思います。

とりあえず、今回はMidoの動作確認ができたので終了。
次回、簡単に抜き出せそうな情報を抜いてみる予定です。