portmidiをいじってクロスプラットフォームなMIDIアプリケーション作成環境を構築しようとしていることは今さら言うまでもないけど、とりあえずportmidiのC#バインディングはそれなりに動いてきている。というわけで、まずはサンプルとしてSMFを読み込んで再生するだけのコンソールアプリケーションを作っている。まだproof of conceptでしかないけど。 http://github.com/atsushieno/portmidi-sharp/tree/master
このアプリもWindows上でしか動作確認できていない。でも多分Linux上では実行するだけで落ちないところまでは持って行ったので、動いていると思う。動作確認できていないのは、単にうちのLinux環境のalsaが死んでいてtimidityの音が鳴らないためだ。ハードウェアMIDI音源に繋げば確認できる予定。OSX環境では、そもそもハードウェアMIDI音源しか手元に無いので(timidity -iAのようなことができない)、これも動作確認がおあずけ状態だ。
追記: alsaは生きていたようだ。単なるテスト時の音環境の問題だった。というわけで動作するのを確認。ついでにSC-8820でもちゃんと(と言うべきかは分からないが)動作するのを確認した。
今のところ特定のファイルを再生するだけでしかないが、ちょいちょいとソースを書き換えてやれば、キーをずらしたりテンポを動的に変更したりといった遊び方もできる。MIDIメッセージのタイミングでイベントも飛んでくるので、それに合わせて何らかの処理を挟むこともできる(実際、僕がほしいと思っているのはビジュアルな再生環境だ)。
まだいろいろ問題がある。ひとつには、処理落ちが著しいということ。MIDIメッセージの送信をThread.Sleep()で待っているだけの構造になっているし、コードは全然最適化していない。また、データの解析にも一部失敗している。昨日突き詰めたら、そもそもSMF処理クラスに多々問題があることが分かったので、根本的に書き直そうと思っている。SysExメッセージも送ろうとするとportmidiからエラーが返ってくるので(これは原因不明)、修正しなければならない。
この辺の問題を一通り片付けたら、いよいよビジュアルプレイヤを作ることもできるだろう。もっとも、他にも作っておきたいものがいくつかある。一番ほしいのがお手軽な仮想MIDIキーボードだ。次に手持ちのMOTIF RACK ESの音色を簡単に作るためのエディタがほしい。あとvocaloidのNRPN/DTEメッセージを簡単に作成できるようなエディタもほしい。もっとも、vocaloid自体クロスプラットフォームではないのだが...。
Leave a comment