シンセサイザ/信号処理ライブラリMaximilianをlogue SDK v2から使う


この記事では、drumlogueのユニットをMaximilianというライブラリを使って開発する方法を解説します。

logue SDK v2でシンセユニットを作るには、オシレータだけでなく、エンベロープやフィルタも含めて作る必要があります。しかし、そのためのライブラリは今のところ提供されていません。

Maximilianはオシレータ、フィルタ、エンベロープを含むコンパクトでポータブルな信号処理ライブラリです。オシレータについてはPolyBLEPによるエイリアスノイズの抑制が可能です。フィルタはステートバリアブルフィルタとBiQuadフィルタ、エンベロープはAR・ASR・ADSRの他、任意のステージ数のエンベロープも作成可能です。

前回の記事で書いたdrumlogue用シンセサイザユニット「minitone」もMaximilianを使っています。他の選択肢として、Maximilian以外のライブラリを使う・自分で実装する・logue SDK v1で提供されていたものを移植する、といったことも考えましたが、Maximilianの内容を調べた結果、drumlogueの処理能力とマッチしていると思われ、まずはこれを使ってみることにしました。

Maximilianはポータブルなライブラリで、logue SDKからもヘッダファイルを一本インクルードするだけでほぼ利用可能です。
サンプルのリポジトリを用意しました。目的別に以下の3つのブランチを作ってあります。

main
1 OSC、1 LPF、1 EGのシンプルなシンセサイザ。Maximilianを使ってシンセサイザを作るのに必要な情報が揃っています。

band-limited-osc
オシレータ1つだけの最もシンプルなシンセサイザ。最低限必要なコードです。

maximilian-synth-template
SDKのdummy-synthにMaximilianを使用するための変更を加えたものです。

GitHub - boochow/maxisynth: KORG logue SDK 2 for drumlogue synth unit sample code using Maximilian library
KORG logue SDK 2 for drumlogue synth unit sample code using Maximilian library - GitHub - boochow/maxisynth: KORG logue SDK 2 for drumlogue synth unit sample co...

上記のリポジトリでは、logue-SDKのdummy-synthユニットに以下の変更を加えています。

・Makefileが、C++ソースの拡張子を.cc前提で書かれているので、Maximilianが使っている拡張子.cppも使えるように修正する
・インクルードパスにMaximilian/srcを追加する
・ソースコードにMaximilian/src/maximilian.cppとMaximilian/src/libs/PolyBLEP/PolyBLEP.cppを追加する
・synth.hの中から”maximilian.h”をインクルードする
・PolyBLEPを使う場合は”libs/maxiPolyBLEP.h”をインクルードする

Maximilianライブラリは以下のようにplatforms/drumlogueの直下においてある想定です。共用のライブラリになるので、サブモジュールにはしませんでした。

drumlogue/
├── common
├── Maximilian
└── maxisynth

なお、オリジナルのMaximilianはいくつか課題があったので、パッチを当てたフォークを以下のリポジトリに用意しています。
maxiこのリポジトリを使う必要があります。

GitHub - boochow/Maximilian: C++ Audio and Music DSP Library
C++ Audio and Music DSP Library. Contribute to boochow/Maximilian development by creating an account on GitHub.

パッチの内容は以下の通りです。

#include<limits>を追加【5/25/2023追記:本家にマージ済】
maxPolyBLEPクラスはサンプリングレートを再設定することができない。設定用メソッドsetSampleRate()を追加【5/25/2023追記:本家にマージ済】
maxPolyBLEPクラスはPolyBLEPクラスにあるsync()メソッドが使えない。メソッドsync()を追加【5/25/2023追記:本家にマージ済】
maxiEnvクラスのエンベロープは、Decayフェーズ中にノートオフしてもDecayフェーズが終わるまで音が止まらない。MaximilianのPR#64を適用

なお、Maximilianでは、エンベロープに関しては2つのクラス(maxiEnvとmaxiEnvGen)が用意されています。
後者の方が新しく、任意の数のステージを持つエンベロープを作成できます。利用を推奨されているのも後者のほうですが、実はどちらのクラスも実際に利用してみると若干の問題がありました。
しかしmaxiEnvクラスについては、上述のプルリクエストで問題が一応解決されるので、このパッチを適用した上で今回デフォルトでは前者を使用しています。
エンベロープに関しては根が深いので、別の記事で書こうと思います。

最後に、Maximilian以外のライブラリについても調べた結果を紹介しておきます。
Maximilianよりもう少し大規模なものだと、有名なのはスタンフォード大学のSTK(Synthesis Took Kit)でしょうか。また、JUCEはこの手のライブラリとしては多分一番有名なもので、GUIなども含めVSTプラグインを作るために必要な各種機能が揃っています。CSL(シズル)も有名で、JUCEと組み合わせて使われることもあるようです。いずれにせよ、このあたりのライブラリはMaximilianに比べると大規模で、スマホ以上のプラットホーム向きかと思います。
組み込み向けとしては、Teensy向けのオーディオライブラリがかなり広範な機能を提供しています。

その他、世の中にあるライブラリはこちらにまとまっています。

awesome-juce/README.md at main · sudara/awesome-juce
A curated list of JUCE modules, templates, plugins, oh my! - awesome-juce/README.md at main · sudara/awesome-juce

コメント