いつの間にか9月が終わろうとしていますが、裏解決屋の仕事をしていて時間がありません。今月もあまり表立った活動が無いので手短にいきます。
ktmidi 0.10.0
先月試行錯誤していたlibremidiのJVMバインディングが、javacppである程度は使えるようになったので、とりあえずpanamaバインディングはいったん凍結してlibremidi-javacppをベースに、クロスプラットフォームでMIDI 2.0デバイスアクセスをサポートするというかたちにして、これを取り込んでktmidi-jvm-desktopにLibreMidiAccessを追加したktmidiを0.10.0としてリリースしました。LinuxとMacOSはこれで動作しています。libremidiを使う最大のメリットはWindows MIDI Services対応のような気もしますが、気が向いたら or 必要が生じたらやることにします(動作確認さえできたらCIビルドをちょっといじるだけのはず)。
libremidiにはALSAだけでなくPipeWireのドライバもあるので、LibreMidiAccessの初期化オプションでPipeWireを指定すれば、Flatpakアプリケーションでも使えるようになるはずです(未確認)。
MIDI 2.0デバイスアクセスを実装していて気づいたのですが、CoreMIDIやALSAではtransport protocolが異なるデバイスもクライアントAPIでは列挙できて、プロトコルが異なる場合はこれらのAPIが内部的に変換してくれるようなので(ktmidiのAPIでいえばUmpTranslatorの機能を実装しているはず)、単にUMPプロトコルのクライアントをテストしたいだけであれば、UMPトランスポートのクライアントを作ってMIDI 1.0デバイスのポートを開けば済むようです。PipeWireにはまだMIDI 2.0サポートのAPIが存在しないので、いずれ追加されてlibremidiが対応したらktmidiでも使えるようになるだろう、というフェーズです。
書き物
今月は結構な時間を原稿書きに割いていたのですが、公開postとしてはPlugin Buddyが出たときに書いたこれしか出ていないです:
misc. experiments
最近はマルチフォーマットのプラグインホストの実装がちょっとほしくなって、ただJUCEを組み込んでAGPLにするのは避けたいし、マルチフォーマットでGPLなしで使えるプラグイン/ホスト開発ライブラリは現状存在しないので、仕方なく自作しようとしています。GPLなしだとvst3sdkも使えないのでDPFに含まれるtravestyを使っていますが、まだVST3プラグインの列挙とインスタンス生成くらいしかできていないのに、この時点で割とバッドノウハウがたくさんあるなあ…という感じです。
しばらく「VST3プラグインを列挙してインスタンス生成」するコードを自分の(商用製品がいろいろ入っている)macOS環境で試したら、クラッシュするプラグインだらけだったので、ひとつひとつ確認して問題を潰していく作業をしていましたが、ほとんどがVST3 APIとかMacOS (Apple)の問題です。
VST3 APIでハマった例でいえば、フツーに考えたらIComponent::initialize()の前に他のメンバーのsetterを呼び出すなんて考えられないのにsetIoMode()だけはinitialize()の「前に」呼び出さなければならない、あたりでしょうか。APIリファレンスに何度も目を通しているうちにこの関数の存在に気づいたのですが、他のどのホスト実装でも使われておらず、とにかく呼び出すようにしてみたらDPFなプラグインが死ぬ…みたいなことになりました(詳しくは解決済のissueに書いてあります)。そしてこの関数、一体何のために存在しているAPIなのか、まったく意図がわかりません。VST3のドキュメントも何の役にも立たないです。
MacOSの問題はJUCEなんかでも議論になった(自分が確認している範囲では現存している)案件で、プラグインのCFBundleをアンロードしてもメモリが残り続ける、みたいなものがあります(そもそもCFBundleでApple専用コードを書かされる時点でめんどい)。ライブラリがアンロードできないと、大量のプラグインをもつユーザーはプラグインリストを更新するだけでメモリが死ぬことになるでしょう。CFBundleUnloadExecutableなんかを呼び出してアンロードするとクラッシュするプラグインも多数あり、Apple非推奨APIでもあり…という感じです。まあ元.NET使いとしては「AppDomainにロードしたDLLはアンロードできない問題」と同じだと思えばわからんでもないですが…(?)
あと既存のJUCEプラグインだとなぜかAudioUnitとしてはUniversalでビルドされているのかRossettaの機能なのかでロードできるプラグインがVST3だとx64のみでロードできない、みたいなハマり方もしました(手元ではddsp-vstがこれ)。
…みたいな感じで、まだ`process作れるのかどうかわからないホストを書いていますが、日の目を見ることがあるかはわかりません。まあ、せっかくなのでJUCEではできないような機能をちょいちょい取り込みたいですね。sample accurateなパラメーター設定等のイベント処理なんかは作れるはずです。