September 2013 Archives

portable MIDIライブラリの再検討

| No Comments | No TrackBacks

また半年くらい書いていなかったわけだけど、今回はパブリックにコードを書いていたわけではなくて単に多忙な時期の後に語学の勉強をしていた。それはさておき、ひさしぶりに自分の書いたMIDIユーティリティで遊ぼうと思って、手元にある新しいマシンでも使えるようにとportmidiをビルドしようとしたのだけど、全く上手く行かない。原因はわかるのだけど、そもそもportmidiはビルドが不親切すぎて、とても多用されている気がしない。

そんなわけで、この際、他にライブラリもあるだろうと思って探してみた。とりあえずぱっと見あまり悪い印象がなかったのがRtMidiだ。MITライセンスだし、iOSまで対応している(AndroidにはまともなMIDIサポートは無いので対応も無い)。これを使ってみることにした。

とりあえずコードがAPIのレベルでC++なので、これをCで呼び出せる形に変換しないとP/Invokeなどが出来ない。というわけでまずはCのラッパーを書くところからスタートだ。Cのヘッダーは、APIドキュメントをもとに適当に作った。public APIのレベルでstd::vectorやstd::stringが出てくるので、この辺はchar*に全て置き換えだ(stringといってもMIDIデバイス名くらいで、ASCIIで考えてもほぼ問題ないはず)。

実装側はC++で書くことになる(呼び出すライブラリがC++だし)。面倒なのはコールバック関数にこれらが使われている場合で、いったん登録時にRtMidiが要求する形式に合ったC++ベースの関数を定義して、さらにCのコールバック関数とCのコールバック登録時ユーザーデータの2つをメンバーとする別のユーザーデータクラスを作って、RtMidi本体にはそれらを登録する。コールバック関数が呼び出されると、C++ベースの関数の実装は、ユーザーデータとして渡された先のユーザーデータクラスのオブジェクトから、Cのコールバック関数とCのコールバックユーザーデータを取得して、それらを呼び出す...という手順が必要になる。

そんなわけで実装まで書いてみたけど、実際に試す前に力尽きたので続きはまた今度。