1月の開発記録 (2024)

2024年最初の月次報告書です(かしこまった言い方)

ktmidi 0.7.0, and ktmidi-ci-tool first preview release

先月ずっと開発していたktmidi-ci-toolというかMIDI-CI基盤ですが、いつまでも遊んではいられない(!?)ので、今月Mavenパッケージのレベルでktmidiからktmidi-ciを新たに切り離して、それがProfile Configuration, Property Exchange, Process Inquiryの3つの柱(PIがthree Psに該当するのかは怪しいところですが)を実装できたところでfeature completeとしてリリースに踏み切りました。

ktmidi-ciのAPIはktmidi-ci-toolの開発過程でだいぶひっちゃかめっちゃかになって、今でもend user developers向けのAPIとしては全然整備されていないのですが、これは「そういうもの」と明示して、とりあえずktmidi-ci-toolを公開することを最優先課題として動いています。この場合の「公開」は、ざっくり書くと

というボリューム感で、1週間くらいはこのリリース作業そのものに追われました。特にUnderstanding MIDI-CI Toolsは「そろそろMIDI-CIをちゃんと理解したい人なら誰でも参照する資料」みたいなやつがほしいと思って書いたやつなので(同じノリで書いたやつとしてはAndroid+JUCE+CMakeのやつとか、日本語だとlanguage server protocolの解説記事とか)、今後もMIDI-CIの説明が必要になったときに適宜指していこうと思います。

日本語版をまだ書いていないので(JUCE Advent Calendarの記事で満足しちゃったかも)、英語を読めないと置いてきぼりですが、日本語で読みたい人はDeepLなりChatGPTなりにでもかけてください。

この過程でMMAが(関係者が開発しているため)midi.orgでしょっちゅう言及しているMIDI 2.0 Workbenchなんかも試してみたんですが、JUCE CapabilityInquiryDemoの実装のほうが圧倒的に実用性が高いので、そっちを使ったほうが理解が早いと思います(というかworkbenchのほうは「実装検証用ツール」以外の側面ではほぼ無ですね)。ktmidi-ci-toolは仮想的なMIDI-CIデバイスを作れるCapabilityInquiryDemoと「同等」にするのを目指して作ったので、だいたいの機能は同様に使えます。

post-release momentum

ktmidi 0.7.0というリリースを出したのは「とりあえずひと段落つける」ためでしたが、ktmidi-ciのAPIはひっちゃかめっちゃかな状態で他人に使ってもらえる状態ではないので、一旦整理する必要があると思っています。本当はMIDI 2.0サポートをMidiAccessに追加してktmidi-ciでもUMPをサポートしたかったのですが、ALSA以外で使えるのはCoreMIDIくらいしかなく、CoreMIDIをサポートするにはJVMもNativeも自分で実装しなければならず、ktmidiにばかりかまけているとAAPが進まなくなる…という感じで先送りにしたので(圧倒的に開発の人手(?)が足りない…)、この辺も今後のTODOです。まあMidiAccessなしでUMPをサポートする方法も無いわけではないですが(実利に乏しい)。

ktmidi-ci-toolはアプリとしてだいぶプリミティブなCompose Multiplatformプロジェクトになっていて、まともなアーキテクチャも適用しておらず(最初Essentyを使おうとしたのですが、状態管理実装がAPIレベルでしかなさそうだったので、ドキュメントなり資料なりが増えるまで見送り)、androidx側でLiveDataとかをKMPに移植しそうなふいんきもあるので少し待とうと思っています。あとKotlin/Wasmがもう少し整備されるかもしれないKotlin 2.0待ちなところもあります。KotlinConf 2024が5月下旬なので、そこまで出ないかも。

あとProcess InquiryのMIDI Message Reportの機能をもう少し拡充して仮想MIDIレジスタステートマシンにしてしまえば、「汎用MIDI 2.0コントローラー」のようなものも作れると思います。Roland/YAMAHA/KORGあたりが自前で作っていそうな気もしますが(!) 特にKORGはKeyStageでPEの実装まで持ってるはずだし。PEの実装は割と大変で、AppleのCoreMIDIにも含まれていないやつです。これは「CoreMIDIの中でJSONやりたくない(JSON処理系を参照したくない・取り込みたくない)」が理由かもしれませんが(!?)

Android audioチームも同様のライブラリを作っている可能性が割とありますが、たぶんAndroid専用になるでしょうし、Kotlinかどうかはわかりません。

what is new in this month

ktmidi-ciとktmidi-ci-tool、この1ヶ月で何が変わったのかを集めてみましたが、だいぶ多いので箇条書きで終わらせます…

  • Responder UIの内容が空っぽだった(要するに何の機能も無かった)のを作った
  • MidiCIResponderのProfile Configurationサポートが実装されてなかったので作った
  • PEのメッセージに含まれる高度な機能を全部作った: columns, subscriptions, body chunking, pagination, mutualEncoding, partial updates(これはクライアント側だけあった)
  • Profile Details Inquiry/Replyサポートが無かったので実装した
  • Process Inquiryを実装した
  • 単なるdata classだったMessageクラスでのコード共通化(common parts, serializerなど)
  • zlib+Mcoded7のためにzlib実装をDesktop/Androidだけ何とか使えるようにした
  • 設定のロード/セーブを実装した(セーブは手動)
  • ktor-ioの参照を外して(ByteOrder等の自前実装)Wasmビルドを追加した
  • MidiCIInitiatorとMidiCIResponderをMidiCIDeviceに融合した(一部古いものが残っている)
  • InitiatorScreenで複数のMIDI-CIデバイスを表示するようにした(もしあれば)
  • Android用の仮想ポートとしてMidiDeviceServiceを追加した
  • PEでDeviceInfoをやり取りしてInitiator側で表示できるようにした

AAP 2023 Year in Review and 2024 Roadmap

そんなわけで1月もほぼktmidi-ciの開発に費やしてしまったのですが、2月はAAPに少しずつ戻ってこようと思っています。まずは例年なら年末に公開していたYear in Reviewの記事を書きました。去年はそれまでと比べてだいぶAAPの作業を多めにやっていたので(勉強会も開催していなかったし)、進捗が大きい…

https://atsushieno.github.io/2024/01/28/aap-2023-year-in-review.html

(先月はAndroidでのオーディオプラグインAPIのリアルタイム拡張機能についても記事を書いていて、今月は上記ktmidiの記事2本も上げたので、英語ブログの更新が多い…)

それから、これも例年なら年初に公開というか更新していた2024 Roadmapを出しました。

https://github.com/atsushieno/aap-core/issues/191

2023年初には20項目くらいあったのですが、去年はGUIを消化したりMIDI2 UMPで拡張機能メセージングを整理した関係で割と多めに課題を解消できていて、今年は14件でスタートです。

あと「ほぼktmidi-ciの開発に費やしていた」とかしれっと書きましたがちょっとウソで、Tracktion Engine on Androidの開発相談を受けてちょいちょい調べ物をしたりしていました。tracktion_engineのDemoRunnerをAndroidでビルドできるようにしたので、これに手を加えてこのRoadmapにあるaap-juceのTE対応タスクも完了となる可能性が高いです(楽観的)。TE、Androidでは非常に重いやつがあるのですが、OboeからOpenSLESにしたら軽くなったとかいう謎報告も受けていて、まだ調べ物をする必要があるやつかもしれません(仕事ではないので今はやってない)。

2月の予定

そんなわけで、2月はたぶんAAPメインに戻ってくると思います。ただM3 2024春にサークル参加することになったので、もしかしたらそっちの作業を何かやっているかもしれません。MIDI-CI本くらいは出そうと思っています(2月でなくてもいい)。