前回までMIDIを演奏するPythonプログラムを紹介してきました。今回は前回までに使った音情報フォーマットからMIDIファイル自体を作成するプログラムを作ってみたので紹介します。
ソースコードはこちら
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import mido import time mid = mido.MidiFile() track = mido.MidiTrack() mid.tracks.append(track) track.append(mido.MetaMessage('set_tempo', tempo=mido.bpm2tempo(120))) NOTES = dict(ド=60, レ=62, ミ=64, ファ=65, ソ=67, ラ=69, シ=71, 間=-1) # カエルのうた doremi = ["ド", "レ", "ミ", "ファ", "ミ", "レ", "ド", "間", "ミ", "ファ", "ソ", "ラ", "ソ", "ファ", "ミ", "間", "ド", "ド", "ド", "ド", "ド", "ド", "レ", "レ", "ミ", "ミ", "ファ", "ファ", "ミ", "レ", "ド", "間"] tempo = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 1, 1, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 1] for d, t in zip(doremi, tempo): if d == "間": track.append(mido.Message('note_off', note=0, time=int(t*1000))) else: track.append(mido.Message('note_on', note=NOTES[d], velocity=100, time=0)) track.append(mido.Message('note_off', note=NOTES[d], time=int(t*1000))) mid.save('カエルのうた.mid') |
ソースコードの説明
今回、MIDIファイル作成はmidoというモジュールを用いています。以下のコマンドでインストールしてください。
|
1 |
pip install mido |
|
4 5 6 7 |
mid = mido.MidiFile() track = mido.MidiTrack() mid.tracks.append(track) track.append(mido.MetaMessage('set_tempo', tempo=mido.bpm2tempo(120))) |
midiのオブジェクトを生成した後、MidiTrackメソッドでMIDIのトラックオブジェクトを作成しています。トラックとは演奏情報を記録する場所のことです。生成したトラックオブジェクトをmidの変数tracksに追加しています。「tracks」と複数形になっていることから分かるように、複数のトラックオブジェクトを追加することができるようです。
このあと、midに追加したtrackオブジェクトに、演奏情報をメッセージとして追加していきます。X行目で演奏のテンポを120に指定しています。私は音楽に疎いのでよく知りませんが、1分間の四分音符の数として速さを指定するようです。
|
10 |
NOTES = dict(ド=60, レ=62, ミ=64, ファ=65, ソ=67, ラ=69, シ=71, 間=-1) |
音階のコードをディクショナリ型変数 NOTES として作成しています。また無音部分を「間」として定義しています。
|
12 13 14 15 16 17 18 19 20 |
# カエルのうた doremi = ["ド", "レ", "ミ", "ファ", "ミ", "レ", "ド", "間", "ミ", "ファ", "ソ", "ラ", "ソ", "ファ", "ミ", "間", "ド", "ド", "ド", "ド", "ド", "ド", "レ", "レ", "ミ", "ミ", "ファ", "ファ", "ミ", "レ", "ド", "間"] tempo = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 1, 1, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 1] |
前回までと同様に「カエルのうた」の音情報を定義しています。
|
22 23 24 25 26 27 |
for d, t in zip(doremi, tempo): if d == "間": track.append(mido.Message('note_off', note=0, time=int(t*1000))) else: track.append(mido.Message('note_on', note=NOTES[d], velocity=100, time=0)) track.append(mido.Message('note_off', note=NOTES[d], time=int(t*1000))) |
音情報に応じて、trackオブジェクトにメッセージを追加していきます。音を鳴らすときは「note_on」、音を止めるときは「note_off」とします。
|
29 |
mid.save('カエルのうた.mid') |
最後にファイル名を指定して、データをファイルに保存します。
以上のプログラムを実行すると「カエルのうた.mid」というファイルが出来上がります。このファイルはWindowsのMediaPlayerなどで再生できます。
mid形式のファイルはwavやmp3など、もっと一般的な音楽フォーマットに変換するWebサービスもあります。気になる方はそちらもどうぞ。
midi → wav変換サービス
https://mp3cutterpro.com/jp/convert-midi-to-wav
midi → mp3変換サービス
https://www.bearaudiotool.com/jp/midi-to-mp3
- 投稿タグ
- プログラミング