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:
LinuxALSA Sequencer__LINUX_ALSA__asound, pthreadg++ -Wall -D__LINUX_ALSA__ -o midiprobe midiprobe.cpp RtMidi.cpp -lasound -lpthread
Linux or MacJACK MIDI__UNIX_JACK__jackg++ -Wall -D__UNIX_JACK__ -o midiprobe midiprobe.cpp RtMidi.cpp -ljack
Macintosh OS XCoreMIDI__MACOSX_CORE__CoreMIDI, CoreAudio, CoreFoundationg++ -Wall -D__MACOSX_CORE__ -o midiprobe midiprobe.cpp RtMidi.cpp -framework CoreMIDI -framework CoreAudio -framework CoreFoundation
WindowsMultimedia Library__WINDOWS_MM__winmm.lib, multithreadedcompiler 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プログラミングの開発ができますね。まあ、当面やりませんが。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です