12月の活動記録(2021)

12月の活動記録です。2021年の〜はめんどくさいのでやめました。毎月書いてるからただの繰り返しになりそうですし。

JzzMidiAccess

atsushieno/ktmidiはKotlin MPPでMIDIバイスに接続できるAPIを提供しています。その実装はプラットフォームごとに、かつOSごとに異なるというある意味地獄絵図のようなマトリックスになる…はずですが、Kotlin/JVMではRtMidiをJNAでアクセスしてWin/Mac/Linuxサポートをまとめて実現していたり(Linux用にはALSA実装も提供しています)、Kotlin/JSとKotlin/NativeについてはMIDIデータ(SMFとMIDI 2.0 UMP)を操作するAPIだけ使えるようにしていました。それでしばらく放置していたのですが、ふとCompose for Webでも遊んでみようと思って、それならその前にKotlin/JSで使えるMIDI Access実装を用意すべきだと考えたのでした。

Kotlin/JS実装で面倒なのは、browser環境とnodejs環境の前提がまるで違うということです。browserは要するにWeb MIDI APIで、nodejsの場合はrtmidiなどを使えば、一応最低限の機能は実現できます。ただ、この面倒な問題はKotlin/JS固有ではなく、少し探してみると、Webでもnodeでも統一的に扱えるAPIを提供しているjzzというライブラリがありました。開発元のJazz-Softは、Web MIDI APIのブラウザサポートがまだChromeにも無かった頃からブラウザプラグインで使っていた人なら覚えている人もいるかもしれませんが、あのブラウザプラグインがまさにJazz-Softです。

あとKotlin/JS、KotlinとJSのinteropがどうなっているのか、明確にドキュメントになっていないっぽい部分も多くていろいろ手探りしなければならないところがあります。たとえばJZZのMidiOutのsend()に渡すarrayはByteArrayでもIntArrayでもなくArray<Int>でないと実行時エラーになる…みたいなことになります。

もうひとつ、これはほぼ偶然なのですが、このタイミングでKotlin/JS実装に手を出したのは割と正解っぽい要素がひとつあって、今月リリースされたkotlinx-coroutines 1.6.0からsuspend funのテストが書けるようになっています。これまで書けなかったというわけです。詳しくはzennに書いています(っていうほど詳しくもないけど)。

zenn.dev

KSPで最速のコード解析・生成を実現する @ アンドロイド・アンサンブル(C99)

2年ぶりにコミケが開催されるというのでTechBoosterからAndroid同人誌の新刊が発行されたのですが、その中でKSPの記事を1本書いています。~Androidの本というかビルドシステムの本みたいになってるというのは内緒。~

techbooster.booth.pm

augeneのSystem.Reflectionを使ったXMLリアライザーの代替をKSPのコードジェネレーターで無理やり置き換えた体験をもとに書いたわけですが、MultiplatformでハマってissueやらKotlin slackやらでフィードバックしつつ解決したビルドのハマりどころに触れたり、そもそも全体的に存在意義が簡単にわかる仕組みではないのでその辺をかみくだいて説明する感じの内容になっています。

MML to MIDI 2.0 to DAW @Music LT & Modernize MML for 2022

12/14にMusic LTというイベントがあって、IoT LTという巨大コミュニティ(昔のAndroidの会が無数の支部の上部組織みたいになってたやつのIoT版)から派生したイベントだったのですが、IoT関係なくてもおkというのでLTで参加させてもらってきました。

iotlt.connpass.com

このスライドに沿ってしゃべっています。

speakerdeck.com

これに続いて(ホントは事前に出したかったのですが)、ひさびさにgithub.ioのほうでModernize MML for 2022という一連の記事を出しています。(1)から(5)まであります(!) 書くのが量的にたいへんだったし日本語ではここでちょいちょい活動記録として書いているので今回は英語のみです。

atsushieno.github.io

Vitaloid

これはいったん書いて出したので改めて書くことはほぼ無いのですが:

atsushieno.hatenablog.com

このスクリーンサイズをどうにかしたいなあと思ってJUCE本体のコード(juce_audio_plugin_clientStandaloneFilterAppあたり)をいろいろいじって試行錯誤しているのですが、この辺はvitalが独自にいじっている部分とかぶっているところでもあって、今のところうまく行ってない感じです。Viewportを独自に追加して内容を大きく表示するくらいはできても、縮尺がおかしかったりポインターイベントの座標が連動しなかったり…

あと昨日ふと思ってこっちでもやってみようと思ったのですがjuce_openglサポートが無かったのでその辺を追加して)動かしてみるところから必要なので、そこからさらにvital独自パッチも取り込んだビルドを作る…というキメラなビルドが必要になるので、ちょっとメンテナンスコスト高いな〜という感じです。まあjuce_openglが動いて出来そうならやると思います(期待値はまあ半々といったところ)。

onwards...

そんなわけで今年はVitaloidまわりをいじりながら年を越すことになると思います。来年はAndroidオーディオプラグインをもう少し進めていきたいですね。ではまた来年。