QtでのMidiアクセス
Qtを使ったMidiのプログラミングをする機会があったので、記録として書いています。まず、Midiへのアクセス関数ですが、検索すると出てくるのは、Windows用ばかりでMacがなかなか出てこないです、特に日本語で。。Qtで使えるクラスもないようで。。MacでMidiプログラミングする人あまりいないのかなと検索していくと、それらしいものがありました。こちらですが、RtMidiとは、Windows、Mac OS、LinuxとOS毎に使用するライブラリーが違う為、各OSのDefineを宣言してコンパイルすれば、各種ライブラリーを呼び出してくれるラッパークラスっぽいです。しかも、C++のクラスになっているので、Windowsの関数を使うよりも簡単です。
各種OSの使用ライブラリーとDefineはこんな感じです。
OS: | MIDI API: | Preprocessor Definition: | Library or Framework: | Example Compiler Statement: |
Linux | ALSA Sequencer | __LINUX_ALSA__ | asound, pthread | g++ -Wall -D__LINUX_ALSA__ -o midiprobe midiprobe.cpp RtMidi.cpp -lasound -lpthread |
Linux or Mac | JACK MIDI | __UNIX_JACK__ | jack | g++ -Wall -D__UNIX_JACK__ -o midiprobe midiprobe.cpp RtMidi.cpp -ljack |
Macintosh OS X | CoreMIDI | __MACOSX_CORE__ | CoreMIDI, CoreAudio, CoreFoundation | g++ -Wall -D__MACOSX_CORE__ -o midiprobe midiprobe.cpp RtMidi.cpp -framework CoreMIDI -framework CoreAudio -framework CoreFoundation |
Windows | Multimedia Library | __WINDOWS_MM__ | winmm.lib, multithreaded | compiler specific |
さらにRiMidiで検索すると、QMidiなる素敵なものが。こちら。ここのコードをダウンロードすると、Qtのプロジェクトになっていて、サンプルプログラミングまでついていて、そのままプロジェクトを改造すれば使えるようになっています!QMidiとは、RtMidiのさらなるラッパーで、QStringなどのQtのクラスを引数に指定出来たりするので、さらにQtで使いやすくなっています。しかも、プロジェクトファイルにすでにOS毎のDefineがされています。あったー!よかったーと思って使っていましたが、QtMidiはRtMidiErrorというExceptionのクラスをラッパーしていない。ということで、そこだけRtMidiのクラスをそのまま使ったら、Exceptionを拾えました。
try { pMidiIn->openPort(iCurrentIndex); } catch ( RtMidiError&rtMidiError ) { QMessageBox msgBox( QMessageBox::Critical, tr("Midi Connect Error"), rtMidiError.getMessage().c_str(), QMessageBox::Ok, this ); msgBox.exec(); }
これで、LinuxでもMidiプログラミングの開発ができますね。まあ、当面やりませんが。