Mido MIDI Objects for Python

1 minute read

Midoは,PythonでMIDOを扱うためのライブラリである。

import mido
output=mido.open_output()
output.send(mido.Message('note_on',note=60,velocity=64))

pipでのインストールは,次の命令を実行する。

$pip install mido

公式のガイドにあるPortMidiとpython-rtmidiもインストールする 。

Midoを用いると,MIDIメッセージをPythonのオブジェクトとして扱うことができる.例えば,新しいメッセージを生成するには,次のようにする.

>>> from mido import Message
>>> msg=Message('note_on',note=60) 
>>> msg
<message note_on channel=0 note=60 velocity=64 time=0>

オブジェクトの値は,属性としてアクセスできる.

>>> msg.type
'note_on'
>>> msg.note
60
>>> msg.velocity
64

出力ポートの生成してメッセージを送るには,

>>> outport = mido.open_output()
>>> outport.send(msg)

入力ポートを生成してメッセージを受けるには,

>>> inport = mido.open_input()
>>> msg = inport.receive()
とする

[Working with MIDI data in Python using Mido](https://www.twilio.com/blog/working-with-midi-data-in-python-using-mido)にはMidoを使った処理の例があるこのサイトの例を参考にMidiファイルを処理する

MidiFileを使うと新しくMIDIファイルを生成したり既存のMIDIファイルを開いたりできる

`VampireKillerCV1.md`を開くには次のようにする

```python
from mido import MidiFile
mid=MidiFile('VampireKillerCV1.mid',clip=True)
print(mid)

画面には,

<midi file 'VampireKillerCV1.mid' type 1, 9 tracks, 4754 messages>

と出力されるが,これは,9つのトラックをもち,4754のメッセージがあることを示している。

for track in mid.tracks:
    print(track)

を実行すると,

<midi track '' 5 messages>
<midi track 'CV1- Vampire Killer' 7 messages>
<midi track 'Staff-2' 635 messages>
<midi track 'Staff-3' 659 messages>
<midi track 'Staff-4' 728 messages>
<midi track 'Staff-5' 635 messages>
<midi track 'Staff-6' 659 messages>
<midi track 'Staff-7' 1421 messages>
<midi track 'Staff-1' 5 messages>

と画面に表示される。これより,9つのトラックのタイトルと,各トラックのメッセージ数を確認できる。

最初のトラックのメッセージをみるには,次のようにする。

for msg in mid.tracks[0]:
    print(msg)

VampireKillerCV1.midは,例えば,Garabegand, Abletonのような音楽制作ソフトウェアに読み込むことができ,インストルメントを指定すれば,音として聞くことができる.

ソフトウェアで聞いてみるとわかるように,これらのトラックにはピッチとして重複しているものがある. これらを取り除くには,次のプログラムを実行する。

import os

from mido import MidiFile

cv1 = MidiFile('VampireKillerCV1.mid', clip=True)

message_numbers = []
duplicates = []

for track in cv1.tracks:
    if len(track) in message_numbers:
        duplicates.append(track)
    else:
        message_numbers.append(len(track))

for track in duplicates:
    cv1.tracks.remove(track)

cv1.save('new_song.mid')
import os

from mido import MidiFile


or1 = MidiFile('VampireKillerCV1.mid', clip=True)

for track in or1.tracks:
    print(len(track))

とすると,

5
7
635
659
728
635
659
1421
5

と表示される。これをみると,トラックの長さが635のものが2つ,659のものが2つ,5のものが2つあることがわかる。これはを重複したトラックとみなして,あとで出てきたトラックを取り除くのが,上の処理である.こうして得られたcv1のトラックの長さは,

5
7
635
659
728 
1421

となる。

さて,VampireKillerCV3.midは,VampireKillerCV1.midと比べると,旋律はほぼ同じで,ハーモニーと、ベースラインが少し変更されている.ここでは,VampireKillerCV3.midのベースラインとドラムのトラックを,VampireKillerCV1.midの旋律とハーモニーと組み合わせるプログラムを実行する.

import os

from mido import MidiFile


cv1 = MidiFile('new_song.mid', clip=True)
cv3 = MidiFile('VampireKillerCV3.mid', clip=True)

del cv1.tracks[4]
del cv1.tracks[4]

cv1.tracks.append(cv3.tracks[4])
cv1.tracks.append(cv3.tracks[5])

cv1.save('mashup.mid')

これは,見たまんまの処理を実行する。すなわち,new_sond.mid(VampireKillerCV1.midから重複するトラックを削除したもの)の5番目と6番目のトラックを削除して,VampireKillerCV3.midの5番目と6番目のトラックを追加する.そうして得られたものをmashup.midファイルに保存する.

Tags:

Updated: