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がされています。あったー!よかったーと思って使っていましたが、QMidiは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プログラミングの開発ができますね。まあ、当面やりませんが。
2件のコメント
通りすがり
QtMidiはRtMidiErrorというExceptionのクラスをラッパーしていない。
→ QtMidi ではなく、QMidi でしょうか?
yamamin
はい、QMidiです。すみません、訂正致しました。