DAW悪戦苦闘記

DAWやMIDIを通じてちまちまとDTMを楽しむ記録+MIDI検定1級到達記

PythonでSMFを操作する (6) 移調

前回の続き(注: かなりマニアックです)。操作要領はほとんど同じである。

daw-jones.hatenablog.com

ノート番号と移調

MIDIでは音程をすべて半音単位のノート番号で管理しているので、移調・転調については各メッセージのノート番号を一斉に同一インターバルで加減すればよい。

たとえば1オクターブ下げたい場合、これは12半音下げることになるので、全メッセージのノート番号を12だけ減らせばよい。

ノート番号属性の修正

デルタタイムやチャネル同様に、MIDIメッセージ(ノート・オンまたはノート・オフ)はノート番号属性を持つので、この値を加減算して修正する。 

# ノート番号をnだけ加える関数
def transpose(track, n):
    for msg in track:
        if msg.type in ['note_on', 'note_off']:
            msg.note += n 

# 上記関数を呼び出して1オクターブ(12半音)下げる
transpose(track1, -12)

比較のために、修正前のメッセージ(ノート・オンまたはノート・オフの冒頭一部)と移調修正後のそれを下に例示しておく。

f:id:daw_jones:20170722213934p:plain

f:id:daw_jones:20170722214031p:plain