MIDI(ミディ、Musical Instrument Digital Interface)とは電子楽器の演奏データを機器間でやり取りする規格です。音声データ(マイクなどで録音した音の波形をサンプリングしたもの)ではなく演奏情報(音の高さや大きさといった楽器への指令)を扱うので、データサイズが小さいという特徴があります。また簡単に音楽の一部を変更することもできます。データサイズが小さいので、昔からファミコンなどのゲーム音楽にも使われてきました。今回は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 30 31 32 |
import time import pygame.midi def tone(note, tmpo): outp.note_on(note, 100) time.sleep(tmpo) outp.note_off(note, 100) pygame.midi.init() outp = pygame.midi.Output(0) outp.set_instrument(0) 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 == "間": time.sleep(t) else: tone(NOTES[d], t) outp.close() pygame.midi.quit() |
実際に演奏した音
ソースコードの説明
今回、MIDI演奏はpygameを用いています。インストールしていない人は以下のコマンドでインストールしてください。
|
1 |
pip install pygame |
|
4 5 6 7 |
def tone(note, tmpo): outp.note_on(note, 100) time.sleep(tmpo) outp.note_off(note, 100) |
音を鳴らす関数です。pygame.midi.Outputオブジェクトのnote_on関数で音を鳴らしています。第一引数は音階の番号、第二引数は音の強さです。sleep関数で一定時間、音を鳴らした後、note_off関数で音を止めています。引数はnote_on関数と同じです。
|
9 10 11 |
pygame.midi.init() outp = pygame.midi.Output(0) outp.set_instrument(0) |
pygameのMIDIを初期化した後、MIDIの出力先を指定し、そのオブジェクトを取得しています(出力先の番号は環境によって違うかもしれません)。またset_instrumentメソッドで楽器の種類を指定しています。0から127の値をとり、「0」はピアノです。他には19番がオルガン、56番がトランペットなどがあります。詳しくは以下のサイトを確認してください。
https://fmslogo.sourceforge.io/manual/midi-instrument.html
|
13 |
NOTES = dict(ド=60, レ=62, ミ=64, ファ=65, ソ=67, ラ=69, シ=71, 間=-1) |
音階(ドレミファソラシド)とMIDIの番号の対応を辞書型変数のNOTESに格納しています。また無音時間を「間」と定義しています。
|
15 16 17 18 19 20 21 22 23 |
# カエルのうた 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] |
カエルの歌の音階とそれぞれの音の長さを定義しています。二分音符=1、四分音符=0.5、八分音符=0.25となっています。私は音楽素人なので、このあたりは正確でないかもしれません(すみません)。
|
25 26 27 28 29 |
for d, t in zip(doremi, tempo): if d == "間": time.sleep(t) else: tone(NOTES[d], t) |
forループで、それぞれの音階をtone関数で出力し、「間」のときはスリープしています。
|
31 32 |
outp.close() pygame.midi.quit() |
最後にMIDIを閉じて終了です。
いかがだったでしょうか。Pythonで簡単に音楽を作成できました。私は楽器は全く演奏できませんが、これなら自分で作曲もできそうです。
- 投稿タグ
- プログラミング