■ 新MidiKitでSMF/SoftMIDIを扱うためのライブラリ 旧MidiKitがファイルしか入力にとれなかったため、 せっかくHTTPライブラリでBPositionIOを実装しても、 HTTP越しに取得したファイルを一度テンポラリファイルとして書きださねばなりませんでした。 これはちょっと悲しい・・・。 そんなわけで木坂さん達に相談したところ、新MidiKitの存在を知りました。 をを、これは、やる鹿。
新MidiKitでは、旧MidiKitのような、 内臓SoftMIDIやSMFを手軽に使えるAPIがありません(たぶん)。 というわけで、旧MidiKitをラップしてやり、新MidiKitのインターフェースとして実装した 内臓SoftMIDI、TxBMidiSynthConsumer。 そしてSMFの再生を新MidiKitのインターフェースとして実装したTxBMidiFileProducer。 この2つのクラスを作ってみました。これらを使うことで、 新MidiKitのインターフェースから手軽にSoftMIDI、SMFが扱えます。 またSMFのImportに関しても、entry_ref、メモリバッファ、BPositionIOを入力にとれるので、 旧MidiKitのBMidiuSynthFileよりも応用がきくと思います。
◆簡単なSMFプレイヤーのサンプルRegister処理を省略することもできます。 Registerを行うと、外部からRoster経由でアクセスすることができ、 間にフィルタを挟んだりと、いかにもMidiKitな遊びが楽しめます。 再生は別スレッドで行われるので、演奏の終了を待ちたい場合には、WaitForStopを呼び出します。
[サンプル]
#include "TxBMidiSynthConsumer.h" #include "TxBMidiFileProducer.h" int main(int argc, char **argv) { BApplication app("application/x-vnd.toyoshima-house.miditest"); TxBMidiSynthConsumer *midi = new TxBMidiSynthConsumer(); midi->Register(); // register to Roster TxBMidiFileProducer *smf = new TxBMidiFileProducer(); smf->Register(); // register to Roster smf->Connect(midi); entry_ref midiRef; get_ref_for_path(argv[1], &midiRef); if (B_OK != smf->Import(&midiRef)) puts("import failed"); if (B_OK != smf->Play()) puts("play failed"); smf->WaitForStop(); smf->Unregister(); // unregister from Roster smf->Release(); // Don't delete TxBMidiFileProducer midi->Unregister(); // unregister from Roster midi->Release(); // Don't delete TxBMidiSynthConsumer return 0; }
◆ダウンロードで、公開です。うまく再生できないファイルとかあったら教えていただけると直せるかもしれませんし、 直せないかもしれません。例によって、直して頂けると大変感謝します。 ライセンスはHTTPライブラリと同様Artisticあたりにしておきます。