既存のPythonで作ったWindowsアプリケーションにMIDI出力を組み込む用事があったので、実験してみました。
参考サイトはこちら。
sulume blog» ブログアーカイブ » python で MIDI を使う
MIDIIO.dllというのはおーぷんMIDIぷろじぇくとで公開されているMIDIメッセージ入出力用ライブラリです。
これもダウンロードして、pyファイルと同じ場所に置いておきます。
で、ソースコードはこちら。
import ctypes import time midiiolib = ctypes.windll.LoadLibrary(r".\MIDIIO.dll") c_deviceName = ctypes.create_string_buffer(32) midiiolib.MIDIOut_GetDeviceName(0, c_deviceName, 32) midiout = midiiolib.MIDIOut_Open(c_deviceName.value) c_mess = ctypes.create_string_buffer(3) c_mess.value = '\x90\x3C\x64' midiiolib.MIDIOut_PutMIDIMessage(midiout, c_mess.value, 3) time.sleep(3) midiiolib.MIDIOut_Close(midiout)
説明することもあまりないですが、8行目のMIDIOut_GetDeviceNameで、MIDI出力の先頭のデバイスの名前を先に取得します。
で、その名前を使ってMIDIOut_Openで出力デバイスを開きます。
11~12行目ではノートを作成します。とりあえずドの音でも鳴らしておきます。この辺もMIDIIO.dllに入っていたドキュメントのサンプルと同じ。
あとはMIDIOut_PutMIDIMessageで出力するだけです。
ちゃんと閉じておかないと、次回音が鳴らなかったりする(オープンに失敗します)ので、MIDIOut_Closeで閉じておきましょう。
実験として、ちょっと長いデータを指定してみる。
import ctypes import time midiiolib = ctypes.windll.LoadLibrary(r".\MIDIIO.dll") c_deviceName = ctypes.create_string_buffer(32) midiiolib.MIDIOut_GetDeviceName(0, c_deviceName, 32) midiout = midiiolib.MIDIOut_Open(c_deviceName.value) notes = ['\x90\x3C\x64', '\x90\x3E\x64', '\x90\x40\x64', '\x90\x41\x64', '\x90\x43\x64', '\x90\x45\x64', '\x90\x47\x64', '\x90\x48\x64'] c_mess = ctypes.create_string_buffer(3) for note in notes: c_mess.value = note midiiolib.MIDIOut_PutMIDIMessage(midiout, c_mess.value, 3) time.sleep(0.5) time.sleep(1.0) midiiolib.MIDIOut_Close(midiout)
和音を鳴らしてみるテスト。
import ctypes import time midiiolib = ctypes.windll.LoadLibrary(r".\MIDIIO.dll") c_deviceName = ctypes.create_string_buffer(32) midiiolib.MIDIOut_GetDeviceName(0, c_deviceName, 32) midiout = midiiolib.MIDIOut_Open(c_deviceName.value) notes = ['\x90\x3C\x64', '\x90\x40\x64', '\x90\x43\x64'] c_mess = ctypes.create_string_buffer(3) for note in notes: c_mess.value = note midiiolib.MIDIOut_PutMIDIMessage(midiout, c_mess.value, 3) time.sleep(3.0) midiiolib.MIDIOut_Close(midiout)
とりあえずこれだけできれば満足なので終了。