🎶
music21を用いてMIDIファイルから音高を取得する
はじめに
ここでは、music21という音楽情報処理ライブラリを使用して、MIDIファイルから音高を取得する。
実行環境
- macOS M1
- Python 3.9.6
music21のインストール
sudo pip3 install music21
- 以下を実行すると、色々と聞かれるが適宜回答して進める
python3 -m music21.configure
データを取得する
import music21
midi_path = "data.mid"
score = music21.converter.parse(midi_path)
for element in score.recurse():
# note.Noteオブジェクト(単一の音)
if isinstance(element, music21.note.Note):
pitch = element.pitch.midi # 音高をMIDIノート番号で取得
duration = element.duration.quarterLength # 長さを四分音符の長さで取得
offset = element.offset # 曲の開始からの時間の長さ
# 出力
print("コードの音高:", pitch)
print("長さ:", duration)
print("曲の開始からの時間の長さ:", offset)
print("--------------------")
# chord.Chordオブジェクト(複数の音)
elif isinstance(element, music21.chord.Chord):
pitches = [p.midi for p in element.pitches] # コードの音高をMIDIノート番号のリストとして取得
duration = element.duration.quarterLength
offset = element.offset
# 出力
print("コードの音高:", pitches)
print("長さ:", duration)
print("曲の開始からの時間の長さ:", offset)
print("--------------------")
-
chord.Chord
オブジェクト: 複数の音を表す。例えば、「ドミソ」や「ミソシ」などのコードである。 -
note.Note
オブジェクト: 単一の音を表す。 -
offset
: 曲の開始からの時間の長さ -
duration
: ノートが保持されている時間 - MIDIノート番号ではなく、音名で取得したい場合、
p.midi
をp.nameWithOctave
とする。
MIDIノート番号と音名の対応表は、このサイトが参考になる。
参考
インストール方法
データの取得方法
offsetとdurationの違い
Discussion