JUCE Advent Calendar 2020 3日目のエントリーはゆる〜く自分がこれまでかき集めてきた「JUCEで作られたOSSのオーディオプラグイン」をいろいろ紹介します。
目次
- Rationale
- Birch-san/juicysfplugin
- osxmidi/SFZero-X
- artfwo/andes
- asb2m10/dexed
- jpcima/ADLplug
- yokemura/Magical8bitPlug2
- ffAudio/Frequalizer
- GuitarML/SmartGuitarAmp
- surge-synthesizer/surge-fx
Rationale
そもそも何でそんなのを集めているのか?という話ですが、単に趣味で集めていたわけではありません(いや、あるか?)。まずChrome*1でこのページを見てみてください(宣伝)。
わたしがちょっと手伝っていたjuce_emscriptenのデモとして、世に出回っているJUCE系アプリケーションをWeb Assemblyアプリとして動かしているものです。ファイル関連APIなどいろいろな機能制限もあるため、完全なかたちではないにしても、さまざまなアプリケーションが既に動いています。作ったのは今春くらいなのですが、juce_emscriptenも特に進化していないので*2これが最新版という感じです。
もうひとつ、Android用に自作しているオーディオプラグインフレームワークがあって、JUCEからの移植もサポートしていて、少し手を加えるだけでJUCEプラグインのオーディオ部分を鳴らすことができるものが少なくないので、気が向いた時に動かせそうなものを探しています。
もちろん、自分のLinuxデスクトップでも使えるオーディオプラグインは常に探しています(何しろ選択肢が少ないので)。わたしのようなユーザーにとっては、ソース付きで公開されているJUCE系のプラグインは良い狩り場(?)になるのです。大概はjucerファイルをちょっと加工すればLinuxでもビルドできるようになるので。
そんなわけで、JUCE系のプラグインやアプリケーションをいろいろ探しては試す癖がついていました。それなりに使えそうな知見になってきた気もするので、この機会にいろいろ紹介しようと思います。こういう契機なので紹介内容はOSS…少なくともソースコードのあるソフトウェア限定です。最近リリースされたVitalとか、(juce_emscriptenの原点である)Synthesizer Vとかは含まれません。
サンプラー → シンセ → FM/PSGエミュレーター → エフェクター くらいの雑な順番になっています。
Birch-san/juicysfplugin
Fluidsynthを経由してサウンドフォント(SF2/SF3)をサポートするサンプラー音源です。MIDI音色に相当するインストゥルメントプラグインとして使うにはコレが手っ取り早くて助かります。SF2はかなり古いフォーマットですが、まだ使われることもあるようです(やや練度の足りない内容ですがこれも2年前にまとめてあります)。Fluidsynthは今でも開発が継続していて、最近ではMIDI 2.0 UMPサポートなども実装されつつあるようです。
移植性の観点では、まずfluidsynthのビルドを取り込まないといけないところで躓くことになるかもしれません。Androidビルドは公式にCIがあるので(わたしがAndroidサポートを追加したときに書いたビルドスクリプトをCI設定してくれた人がいたらしい)、そこから引っ張ってくるのが安牌です。また割と無邪気にFluidsynthを共有ライブラリとして参照解決するので(互換性のないバージョンを参照したり、共有ライブラリのロードパスの関係で問題を引き起こしたりするので、依存関係はなるべく静的に取り込んでビルドするほうが好ましいです)、ホストによってはロードできずに落ちたりすることもあります。
サウンドフォントでよく言及されるのはDebianなどで配布されているFluidR3_GM.sf2ですが、探すと他にもいろいろ見つかります。自分の場合は最近は musical-artifacts.com で見つけた https://musical-artifacts.com/artifacts/1057 を使うことが多いです。
osxmidi/SFZero-X
SF2ではなくSFZのサンプラーのプラグインとして作られているのがSFZeroです。osxmidi/SFZero-Xは今では開発されていないオリジナルのstevefolta/SFZeroからの派生版で、音源部分はSFZeroModuleという別リポジトリに含まれているsfzeroという非JUCEモジュールの実装です。
ただ、SFZフォーマットは現在でも継続的に開発されている現役のフォーマットなのですが、SFZeroの音源部分はもう5年近く開発されていないので、わたしがSFZサンプラーとしてSFZero-Xを推薦することはないです。サポートされていないSFZ opcodeも数多くあります。今一番アクティブに開発されていてopcodeのカバレッジも広いOSSはsfztools/sfizzですが、これは今はVSTGUIでUIが作られているVST3/LV2音源なので、今回はSFZero-Xの紹介としました*3。どうしてもJUCEでやる必要がある/移植する必要がある場合はこちらでしょう。
TheWaveWarden/odin2
モダンでクールなGUIを備えた高機能シンセサイザーです。JUCE6で全プラットフォームVST3に対応しているほか、LV2 Porting Projectを使用したビルドにも考慮しています(README.mdで詳しく説明されています)。Surgeと同様Odin2もOne Synth Challengeで数多くの楽曲が作られています。
プリセット音色もたくさん用意されているのですが、現状のビルドではバンクに相当するodsファイルが何もビルドされず、ユーザー定義音色の格納場所についても問題を抱えているので、プリセットを1つ1つ手作業で選択していく作業が必要になっています。この辺りが(多分)次のリリースで改善されるとだいぶ実用的になると思います。
artfwo/andes
オシレーター1つのシンプルで移植の難易度が低いシンセサイザーです。もっとも、シンプルとは言っても、このオシレーター自体はPerlin noiseをオーディオ処理に適用するという実験を実装したもので、Linux Audio Conferenceのサイトで論文(というのが適切なのかは分かりませんが)も提出されています。
移植作業の最初の一歩として試すには良い選択肢です。ただしPerlin noiseの処理にそれなりにコストがかかるのか、(自分がAndroid環境で試した限りでは)オーディオ処理はあまり軽量ではありません。素でglitch noiseが発生するほどではありませんが、組み込みデバイスなどで最初に試すのには向いていないかもしれません。
asb2m10/dexed
このはてなブログではちょいちょい登場していますが、YAMAHA DX-7のエミュレーターをなぜかGooglerがAndroid向けに趣味で(?)開発したもの*4を、外部の開発者がデスクトップでJUCEのGUIを付けて公開したものです。DX-7の音色バンクとなるCartのサポートなども追加されています。
音源側のコードであるmusic-synthesizer-for-Androidについては2年前に書いたのでそちらを見てください。
jpcima/ADLplug
これもこれまでちょいちょい登場しているFM音源(OPL/OPN/OPM)のエミュレーターです。実態はlibADLMIDIとlibOPNMIDIにJUCE GUIを付けたものと言えます。
これらのライブラリはさらに別のさまざまなFM音源エミュレーター(libOPNMIDIならNuken, MAME, Neko, PMDWinなど)を包括的にサポートしていて、エミュレーション結果が気にならなければ別のエミュレーターを試せるようになっています。
個人的には、今年はFM音源エミュレーターのコードにコントリビュートしてもsfizzのコードにコントリビュートしてもJUCE LV2のコードにコントリビュートしてもこの開発者が出てきて、この人強すぎでは…??ってなりました。
yokemura/Magical8bitPlug2
ゲーム向けのPSG音源を再現するインストゥルメントプラグインです。オシレーターはシンプルですが、ADSRのほかにLFOや自動ピッチベンドなどゲーム用途らしいパラメーターが用意されているのが、いかにもという感じの使いやすさをもたらしている音源です。
コードベースがJUCE 5.4.7と新し目なので、これも移植難易度が低く、実験には有用です。JUCE 5.4.7はアプリケーション次第では(?)そのままだとLinux gccビルドがコケる鬼門バージョンでもあるので、失敗したらCXX=clangでのビルドを試すようにすると良いでしょう。
ffAudio/Frequalizer
6点マルチバンドEQを実現するJUCEプラグインです。最初やや取っ付きにくいのですが、たぶん小一時間くらい使って慣れると、多機能でよく出来ていることがわかります。リアルタイムで入出力の波形が表示されるので、適用結果を視覚的に確認できるようにもなっています。
取っ付きにくい理由は主に(1)最初に6点それぞれのどこにコントロールポイントがあるのか完全にわかりにくい(細い縦線が見にくいのと、発見できた後もy軸の中央すなわち0dbの位置に点があるのが見えず丸型スライダーで値をずらさないと発見できない)のと、(2)制御点のそれぞれがPeak/Low Shelf/High Passなど10種類以上の選択肢があって、慣れないと意図した曲線を描けないのと、(3)初期値で6点は多分多すぎるためです。これさえ把握していれば多分何とかなります。点の多さはアクティブな点を減らすことで解決できるでしょう(Aボタンがたぶんactivateの意図なんですが、これで制御できます)。
ffAudioにはPluginGuiMagicというプラグインGUIをパラメーターから(たぶん)簡単に構築できるJUCEベースのGUIコンポーネントのコレクションもあり、Frequalizerはこれを使って構築されています。
GuitarML/SmartGuitarAmp
Googleのメディア/アート系プロジェクトに深層学習を応用するWaveNetを使ってギターアンプやペダルの既成品をシミュレートする GuitarML/PedalNetRT というプロジェクトがあるのですが、これをJUCEと組み合わせてオーディオプラグイン化したのがSmartGuitarAmpです。
紹介するのは同じpedalnetを使用している(そしてこのプロジェクトの元ネタでもある)damskaggep/WaveNetVAでも良かったのですが、新しいほうを選びました。WaveNetVAのほうはデモページでさまざまな適用結果を聞くことができます。
ただ、これは環境依存なのかもしれませんが、WaveNetVA同様、CPUコストが非常に大きく、まだまだリアルタイムでのまともな発声は無理だと思います。standaloneでビルドしたアプリでJUCEのオーディオテストがブツ切れになるレベルです。非リアルタイム用途では使えるかもしれない、といったところです。
関連: hacker newsのスレッド
surge-synthesizer/surge-fx
surgeは、旧くはVermber Audioから配布され今はOSSで開発されている多機能シンセサイザーです。surge-fxはそのエフェクト部分をプラグインとして抜き出してJUCE GUIを付けたものという位置づけになるようです。surgeはsurgeで独自にUIが構築されています。surgeは基本的にJUCEを使っていないようなので今回は紹介しませんでしたが、JUCEを有効にしたビルドオプションというものも存在するようです(patch_playerというコードもあってこれがJUCEアプリケーションになっているようですが、詳しくは未確認)。
surge-fxとして単独で使用したい場面がどれほどあるかわかりませんが、JUCE6にアップデート済なので、JUCE6を使用したビルドの動作確認には有用です。ただ、内部的に巨大なsurgeのコードを(全部ではないにしても)ビルドすることもあって、移植性は高くないかもしれません。*5
*2:春先に自分が手を入れたWebMIDIサポートが取り込まれたくらい
*3:以前はsfizz-juceというものがあったのですが
*4:初期チェックインの後はメンテナンスされていません
*5:半年ほど前にjuce_emscriptenでビルドしようとした時は、xmmintrin.h依存が解決できなくてあきらめたのですが、emscriptenではサポートされている雰囲気もあるので、がんばればビルドできるかもしれません。