🎶

music21を用いてMIDIファイルから音高を取得する

2023/06/27に公開

はじめに

ここでは、music21という音楽情報処理ライブラリを使用して、MIDIファイルから音高を取得する。

実行環境

  • macOS M1
  • Python 3.9.6

music21のインストール

sudo pip3 install music21
  • 以下を実行すると、色々と聞かれるが適宜回答して進める
python3 -m music21.configure

http://web.mit.edu/music21/doc/installing/installMac.html

データを取得する

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.midip.nameWithOctaveとする。
    MIDIノート番号と音名の対応表は、このサイトが参考になる。

参考

インストール方法
http://web.mit.edu/music21/doc/installing/installMac.html

データの取得方法
https://stackoverflow.com/questions/69383822/music21-given-midi-input-output-correctly-spelled-pitches-with-octave-numbers

offsetとdurationの違い
https://stackoverflow.com/questions/55415897/what-is-difference-between-duration-and-offset-in-midi-files

Discussion