4月の開発記録 (2024)

毎年M3春にサークル参加すると、GWまで意識がそっちに持っていかれてしまって、GW何もしないマンです(時候の挨拶)

M3 2024春 出展レポート

そういうわけでM3でオーディオプラグイン研究所のブースに来てくださった皆様ありがとうございました。M3はいつも割とアウェイなのですが(技術書典と比べると相対的に)、今回は明らかに売れなそうな新刊を用意していったのに思いのほか売れて、ありがたいことに他の本も割と傾向が見えない感じで売れて、MIDI 2.0まわりの話もプラグインフォーマットの話も何度もできて(あとMMLの話も何回か)、リーチすべき層の人が参加者の中に増えてきている感じがしてきました。ソフトウェア技術者は全体的に増加傾向にあるはずなので、自然な成り行きかもしれません。

MIDI 2.0って今使えるんですか?」みたいな話はだいたい「Windowsサポートが今年いっぱいかかるから…」「プラグイン開発に使われるライブラリがその後で対応してくるから…」「まだみなさんが打ち込みで使うフェーズはあと1, 2年は来ない…」みたいな話に着地させていました。LV2本とCLAP本があるので「プラグイン開発してみたいんだけど…」という話も多く、「プラグイン開発ならJUCEみたいなライブラリを使えば…」「プラグイン開発したい人はこのサークルじゃなくてJUCEの本があってですね…」みたいなところに着地させていました。

あとMIDI 2.0まわりの話では「MIDI 2.0入門みたいな本は…」というやり取りも何回かあって、そろそろMIDI 2.0 Primer的なやつを書いたほうがいいのかな…となりました。実際には、UMPガイドブックはUMPがトピックなのでそれなりに平易で、MIDI-CIガイドブックも現在使えるツールという条件ではこれまでになく「入門者向きの」内容なので、どちらかというとMIDI 2.0のエコシステムがエンドユーザー向けに十分に「降りてきていない」という問題が先に解決されたほうがよさそうです。あと3マイルくらいはありそうです(ProgramListとかAllCtrlListとかがサポートされる、プラットフォームAPIが整備されてJUCE等が対応する、DAWプラグインでMIDI2サポートが実装される)。あとは「何を」カバーするかという問題です。プラットフォームMIDI 2.0サポートを要しないMMLで出来るレベルではすでにサポートしているので…(!)

あとLinux DTMガイドブックも見本を展示しているのですが、やはりこれは取っつきやすく読みやすいので、何度も「無料配布しているので…」と案内することになりました。「紙で読みたい」という方も一定数いて、紙版も完売してしまったので、無料配布本でも改めて刷っていったほうがいいのかも…あともうそろそろテーブル半分では並べきれないのが問題ですね。一方で「どの本のトピックも興味あるやつ」「全部読みたい」とも何度か言われていて、完全にありがたい…(自分も自分の読みたいものを書いてるから完全にわかるw)となっており、取捨選択して置く方向にはいかないほうがいいな…とも思っています。アーカイブ的に置いておいて立ち読みできるようにしておきたいですね(幸い、ごくまれに全面が埋まる程度の弱小サークルなので、立ち読みされても困らない)。

M3では、今回はいつもより忙しく過ごしていたこともあって、一度も自分のブースを離れることなく過ごしていたので、会場を見て回る時間もなかったので、そろそろワンマン出展も終わりにしても良いかも…と思っています。コロナ以前は概ね誰かしらにお願いしていたので…

ちなみに新刊はboothで販売開始しています(会場価格とは異なります)。

xamaritans.booth.pm

ちなみに技術書典16でも販売する予定です。技術書典の決済で済ませたい方はそれまで待つと良いでしょうし、一方で技術書典オンラインではイベントが開催されていないとアップデートが反映されないので、up to dateな更新がほしい方はboothのほうが良いでしょう。

ktmidi 0.8.0 release

4月はずっとpreviewリリースばかりだったktmidi 0.8.0をようやく本番リリースしました。今月は、以前から「いずれ実装しよう…」と思っていたKotlin/NativeのCoreMIDIサポートを追加しました。それでAndroid以外にiOSmacOSでUMPトランスポートのMidiAccessを実装して、どうやら使い物になりそうだとわかったので、0.8.0リリースで一区切りつけようと決めました。

今月は、ktmidi 0.8.0にもうひとつ、UMPエンドポイントを構築するためのAPIを追加しました。これはUMP Endpoint Configurationの機能を実装したものです、MIDI-CIデバイスはfunction block単位で構成するものですが、ktmidiでfunction blockを構成しようと思ったらUMPエンドポイントを構成する必要があり、そのやり取りはMIDI-CIのDevice Discoveryと同程度には難しいものです。であれば、ktmidi-ciにおけるCIDeviceと同様のクラスを用意して、APIを叩くだけでfunction block構成をやり取りできるようにしよう、となって、新しくumpdeviceというパッケージがktmidiに追加されています。

0.8.0でAPIに破壊的変更を加えるリリースを出す前にもうひとつ片付けておきたかった案件として、MIDIバイス接続状態の変更検知のAPI刷新しました。ktmidiはAPIの設計でWeb MIDI APIを大まかに踏襲しているのですが、Web MIDI APIに存在するデバイス接続状態の変更検知は、プラットフォームによってはそもそも機能として存在しないものです(たとえばwinmmなど)。Chromiumではこのへんの実装をプラットフォームAPI依存の実装とポーリング状のソフトウェア実装の合せ技でカバーしているようですが、同じことをやりたくはないので、ktmidiではプラットフォームが接続状態の変更検知をサポートしている場合はそれを使い、そうでなければシンプルにサポートしないことにしています。ポーリングによる検出はアプリケーションで独自のポリシー(試行期間や回数の調整)に基づいて行うべきです。

last but not leastな変更として、0.8.0リリースではwasmJsターゲットも追加されています(ktmidi-ci-toolのwasmJs版ですでにガッツリ使われています)。さらに、ktmidiのパッケージ発行を拡張して、ネイティブパッケージのビルドと配布をGitHub Actionsのbuild matrixを使って並列に行って、macosArm64ビルドも追加されています。これがかなり難物で、SonaType Nexusのためにパッケージリポジトリを作成するgradleプラグインが、実際にはGitHub Actionsのsecretの扱いが厳格すぎて使えなくなっているので、並列ビルドで複数のnexusリポジトリを作成して配布するworkaroundで対策しています。ktmidiはrtmidiのネイティブコードをビルドの過程でstatic binariesとしてビルドする関係で、kotlinc/konanによるクロスコンパイルをあてにできないという問題もあって、割とややこしいのです。この辺は6月に開催されるKotlinFest 2024で登壇が決まったので、そこで解説しようと思います。

ktmidiの最終的なパッケージアップデートに合わせて、mugene-ng、kmmk、compose-audio-controlsも更新されています。

AAP APK Installerのユーザビリティ改善

M3ではAAPのデモ展示を行うつもりだったので、その入口とも言えるAAP APK Installerを見せる機会もあるだろうと考えましたが、AAP APK Installerは挙動がイマイチ不安定で、エラーで落ちた時にその原因もadb logcatを見ないとわからないという状態だったので、少なくとも例外メッセージくらいは確認できるようにしよう、と思って、WorkManagerを導入したり通知を実装しようとしたり(Compose UIでログを表示できるようにしたので不要かなと思って実装していない) 、いろいろ改善を施しました。

まだ改善項目だらけなのですが、こればかりやっているわけにもいかないので、今は寝かせています。

aap-juce-audible-planets

今月はひさしぶりにJUCEプラグインをAAPに移植してみました。今回はAudiblePlanetsの移植です。

github.com

そんなに難しいところはありませんでしたが、Ginとmelatonin_blurというライブラリに依存していて、どちらもAndroidではビルドできなかったので、修正してビルドしています。GinはPRが瞬時に取り込まれましたが、melatonin_blurはもうメンテしていないっぽく放置されたままなので、問題が悪化するようだったら依存関係を切り捨てて作り直す予定です(単なるUIライブラリで全然クリティカルではないので)。