6月のmusic tools hacks, あるいはLV2 for Android

もっと早くに実現していたはずだったのですが、体調不良などに引きずられて今頃になって台湾に渡ってフラフラ過ごしています。人に会う用事が毎日のようにあって、日本の引きこもり生活とは雲泥の差が…

無駄話はさておき、5月にAndroid Native MIDI APIについて書いたときに、こんなことを書いていました。

Google I/Oでこの方面でなんか発表してほしいなあというお気持ちの表明だったのですが、どうやら何も出てきませんでした。まあGoogleがやらないのであれば自分でやるしかない感じですよね…

とはいえ、何もないところから仕組みを作るのはいささか心もとないので、まずは5月にいじっていたLV2やlilvをAndroidに移植するところから着手しました(ホントはこれウソ入ってるんですが、まあ今全部書かなくてもいいでしょう)。

Androidサポートとは具体的にはFILEからの読み込みをAndroid Assetからの読み込みに変更するとか、direntを使ったディレクトリベースのプラグイン検索を無効化するとか(今回この実装を書いていて初めて気付いたのですが、Androidのassetはディレクトリ構造になっているくせにディレクトリのiteratorは無いんですね…)、ちまちまとした変更ではあります。しかし、元のライブラリが慣れないRDFやTurtleを扱うものなので勝手がわからない、慣れないCコード、ビルドがcerbero経由でしかなくgithubに確認なしでcommitしないとpullしてビルドできない、lv2の有用そうなやつをビルドするにはlibsndfileやcairoもビルドしなければならない、lv2まわりではcerberoが想定していないwafが使われている…といった諸事情もあって、割と手間取りました。たぶんここまでAndroid NDKでビルドできるようにしたやつ、cerberoのAndroid方面担当者以外では自分くらいしかいないのでは…

ソースはだいたいこの辺にあります。

LV2には、ドキュメントでも言及されている公式サンプルと、vst3sdk用のサンプルであるmdaというこの方面では割とポピュラーなもの(?)を移植したものがあり、今回Android向けにビルドした際にはこれらもビルドしています(正直プラグインはコードまで確認していません。どうせやっていることはオーディオバッファの加工くらいだろうし)。

今試験的に作っているサンプルアプリ(これはまだソース公開していない)をDeployGateで公開しているのですが(ってこのリンクもしかしたら無効なのかも…ログインしないと見られないのですが、わたしは自分のアカウントでしかログインできないので確認できない…)追記: やっぱ開けなさそうなのでとりあえずdropboxに一時うpしました、UIがまだメチャクチャで…まあそのうち使えるようになると思います(!?)。アプリ内のプラグインのスイッチを入れるとそのプラグインが適用されたwavの波形が描画されて再生もできるという感じです(再生は加工前のwavにもできるのですがwav表示がおかしい…)。また、このアプリ、諸般の事情からminSdkVersion 29なので、動作させることが出来る端末は世の中に1%も無いという…このへんは本番が出せる頃には改善したいと思っています(!?)。

また、これらのLV2プラグインをサービスとして列挙する仕組みまでは作ったのですが、それ以上は現状何もできていません。サービス側のスイッチを入れてもダミーのforeground serviceが開始されるだけです。

そんなわけで来月もこの辺のコードを書くことになると思いますが、忙しくなりそうなので手が回らないかも…とりあえず、LV2がAndroidで動く、というだけでも(当然プラットフォーム別に実装されるGUIのサポートは無くても)割と面白いんじゃないかと思います。ただもう少し一般化したいところではあります。LV2ほとんど利用例が無いので。

ちなみに、似たようなことをvst3sdkでも出来ないかと思ってビルドを試みたのですが、(X11なvstguiは論外として)Android NDK r20で実装されていないstd::experimental::filesystemLLVMではlibc++fs)に依存していたり、GCC固有の__gnu_cxx::__**atomic**_add()に依存していたり(Android NDKにはもうGCCが含まれていないのです)と、まだビルドできる状況ではないということが分かりました…(atomicはstd::**atomic**_fetch_add()で書き換えられそうではありますが)。幸いlibc++fsはNDK r21を目標に実装されそうなので、待っておこうと思っています。