Mido MIDI Objects for Python
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
ファイルに保存する.