BA Barış Akın~/blog

·9 分で読めます·7 閲覧

Aurora Synth: Rust で書いた、マカーム調律対応の無料ウェーブテーブルシンセ、サンプラー、モデリングピアノ

ひとつの楽器に3つのエンジン。ミップマップ付きウェーブテーブル、SFZ サンプラー、導波管の弦でモデリングしたピアノ。Arel-Ezgi-Uzdilek のコンマによるマカーム調律、録音を使わずに合成したコーラス、CC0 録音から作ったカーヌーン、ウード、バーラマ、ネイ。macOS と Windows 向けの VST3、CLAP、スタンドアロンアプリ。

Aurora Synth: Rust で書いた、マカーム調律対応の無料ウェーブテーブルシンセ、サンプラー、モデリングピアノ

Aurora は 3 つのサウンドエンジンをひとつにした楽器です。ウェーブテーブルシンセ、SFZ サンプラー、物理モデリングのピアノ。3 つとも同じフィルター、同じモジュレーションマトリクス、同じエフェクトラックを通り、マカム(makam)とマカーム(maqam)のチューニングも内蔵しています。macOS と Windows で、VST3、CLAP、スタンドアロンアプリとして動きます。無料で、ダウンロードページは aurorasynth.baltavista.com です。

この記事では中身を見ていきます。オシレーターがエイリアシングを避ける方法、ピアノの弦の計算方法、Arel-Ezgi-Uzdilek のコンマ(comma)を鍵盤に割り当てる方法、そして録音なしで合唱を合成する方法です。コードは上から下まで Rust で、プラグイン部分は nih-plug、インターフェースは egui です。合計で約 1 万 5 千行あります。

Aurora の画面: 上段に 3 つのオシレーターとミキサー、中段にフィルターグラフとドラッグ操作できるエンベロープ、下段に LFO、モジュレーションマトリクス、エフェクト、オシロスコープ、スペクトラム、鍵盤

シグナルパス

SYNTH  : OSC 1/2/3 + Sub + Noise + Ring ─┐
SAMPLED: SFZ sampler ────────────────────┼→ Filter 1 ⇄ Filter 2 → Amp → FX chain → Master
MODELED: waveguide piano ────────────────┘

エンジンは Master パネルで SYNTH、MODELED、SAMPLED から選びます。それ以降はすべて共通です。そのため、サンプリングされた kanun(カヌーン)も、supersaw のリードと同じラダーフィルター、モジュレーションマトリクス、OTT を通せます。94 個のファクトリープリセットはすべてこのひとつのボイス構造の上に作られていて、約 245 個のパラメーターはすべて DAW からオートメーションでき、プロジェクトと一緒に保存されます。

オシレーターとウェーブテーブル

基本波形(サイン、トライアングル、ソー、パルス)は PolyBLEP で生成します。波形の鋭い角のすぐ周りに小さな多項式の補正を加えることで、ナイキスト周波数を超えてあふれる倍音の大部分を抑えます。

ウェーブテーブルはもっと難しい問題です。波形は任意の 1 周期で、最大 1024 次までの倍音を含みうるからです。Aurora は各テーブルをオクターブごとのミップマップとして保持します。レベル m には 1 次から 1024 >> m 次までの倍音だけが入っています。オシレーターは鳴らす周波数を見て、最高次の倍音がまだナイキスト周波数より下に収まるレベルを選びます。高い音は倍音の少ないコピーから読み出すので、折り返しは起きません。

内蔵テーブルは 6 つ(Classic、Harmonic、Vocal、FM、Sync、Fold)で、それぞれ 16 フレームです。WT position はモジュレーションマトリクスの宛先なので、LFO やエンベロープでテーブルの中を掃引できます。テーブルは WAV としてインポートすることもできます。clm ヘッダー付きの Serum の 2048 サンプルのフレーム、256/512/1024 のフレームサイズ、または 1 周期の波形に対応しています。

さらに、ワープモード(Sync、Bend、Mirror、Squeeze/PWM、Quantize)、位相変調 FM(2→1、3→2)、OSC 1 へのハードシンク、デチューンとステレオスプレッド付きの最大 7 ボイスのユニゾンもあります。

フィルター

2 つのフィルターは直列にも並列(バランスつまみ付き)にも接続できます。モードは 9 種類です。

  • SVF: LP24、LP12、BP、HP、Notch。Simper/Zavalishin の TPT 形式によるゼロディレイフィードバック(ZDF)のステートバリアブルフィルターです。24 dB/oct は 2 段を直列にして得ています。
  • Ladder: 飽和する ZDF の Moog 風 4 ポールです。
  • Comb+ / Comb−: 正と負のフィードバックを持つコムフィルターです。
  • Formant: カットオフに合わせて A-E-I-O-U とモーフィングする母音フィルターです。

ドライブと非線形フィルターは 2 倍のサンプルレートで動かせます(Off、Auto、Always)。Auto はドライブが上がっているときか、ラダーのような飽和するフィルターが選ばれているときだけ有効になるので、クリーンな SVF が CPU を無駄にすることはありません。

インターフェースのフィルターグラフは絵ではありません。フィルターのコード内部から、デジタル伝達関数の真の振幅特性として計算されています。グラフ上でクリックしてドラッグすると、カットオフとレゾナンスを変えられます。

モジュレーション

エンベロープ 3 つ(フィルター、アンプ、専用のモジュレーションエンベロープ)、5 種類の波形または 16 ステップで描ける波形を持つ LFO 2 つ、マクロノブ 4 つ、ベロシティ、モジュレーションホイール、アフタータッチ、キー、ランダムが、すべてソースになります。マトリクスの 8 つのスロットにはそれぞれ Via スケーラーもあり、「LFO 1 でピッチを、モジュレーションホイールの量だけ動かす」といった設定ができます。パラメーターがモジュレーションされると、つまみの周りにリングが現れ、モジュレーションの範囲と現在の値の両方を表示します。

エンベロープはアナログ風の指数カーブで、ノードをドラッグして編集します。発音中のボイスのエンベロープと LFO の位置は、グラフの上にリアルタイムで表示されます。

モデリングピアノ

MODELED エンジンはサンプルを一切使いません。各鍵には、わずかにデチューンされた弦が 1 本から 3 本あります(低音域は 1 本、中音域は 2 本、高音域は 3 本)。それぞれの弦はデジタルウェーブガイドで、ディレイラインと、ループを閉じる 3 つのフィルターからできています。

  1. ロスフィルター。 1 ポールのローパスです。高次の倍音は 1 往復ごとに少しずつ多く失われるので、音は時間とともに暗くなります。
  2. ディスパージョンオールパス。 実際のピアノの弦は硬いので、倍音は正確な整数倍にはならず、少し上にずれて引き伸ばされます。最大 4 段の 1 次オールパスの連なりがその伸びを真似ます。
  3. Thiran 分数ディレイ。 ディレイラインの長さは整数ですが、正確なチューニングには小数の長さが必要です。残りの端数を Thiran オールパスが受け持ちます。

微妙なのはここです。ロスフィルターとオールパスも信号を少し遅らせ、その遅れは周波数に依存します。これを無視すると、高音がはっきり低めに鳴ります。Aurora は弦ごとに、基本周波数におけるこれらのフィルターの位相遅延を計算し、ディレイラインの長さから引いています。

let w = 2.0 * PI * f / sr;
let mut fixed = lp_delay(b, w);
for d in self.disp.iter_mut().take(n_disp) {
    d.a = disp_a;
    fixed += ap_delay(disp_a, w);
}
let total = sr / f - fixed;
let m = (total - 0.5).floor().max(2.0);
let frac = (total - m).clamp(0.1, 1.9);
self.thiran.a = (1.0 - frac) / (1.0 + frac);

減衰時間も鍵ごとに変わり、低音域の約 16 秒から最高音の約 1 秒までです。高い音でロスフィルターがその予算を単独で使い切らないよう、基本周波数での損失が予算の半分以下になるまでフィルターを和らげています。

弦を励起するハンマーは、ベロシティに依存する半サイン波のパルスです。強く打つほどパルスは短くなり、したがって明るくなります。パルスは、ハンマーが弦を打つ位置(弦長の 1/16 から 1/5 の間)で決まるコムフィルターを通ります。これは、実際のピアノで打弦点に節を持つ倍音が欠ける現象を真似たものです。その後にダンパー(実際のピアノと同じく最上位オクターブにはダンパーなし)、サステインペダル、響板の色合いのための小さなレゾネーターバンクが続きます。

サンプラー

SAMPLED エンジンは SFZ プレイヤーです。リージョン、ベロシティレイヤー、ループクロスフェード付きのループ、rt_decay 付きのリリーストリガー、amp_veltrack、リージョンごとのローパス、lorand/hirand によるラウンドロビンに対応しています。サンプルは WAV でも FLAC でも構いません。x.wav を指定した SFZ は x.flac も見つけます。SFZ のないフォルダでも、A0v1.wav のような名前なら、ファイル名から読み取ります。

2 つの実用的な問題は自動で解決します。

  • 音量。 ライブラリによって音量は大きく違います。Aurora は各セットの最初の 1 秒の中で最も大きい 50 ms ウィンドウの RMS を測り、セットを Salamander ピアノに揃えます。ウィンドウ方式は、撥弦音にも擦弦音にも公平です。
  • メモリ。 ライブラリによっては 16 のベロシティレイヤーがあります。Aurora はそれを 6 に間引き、ベロシティの全範囲がカバーされることを確認したうえで、残ったファイルだけを読み込みます。

プリセットブラウザ: Lead、Pluck、Bass カテゴリーのプリセットと、上部のカテゴリーフィルター

マカムのチューニング

12 音だけでなく、マカムを演奏できます。マカムとルートを選ぶと、すべてのエンジン(シンセ、サンプラー、ピアノ)がそのマカムの音程に合わせて調律し直されます。画面上の鍵盤には、各鍵の 12-TET からのずれがセント単位で表示されます。

トルコのマカムは Arel-Ezgi-Uzdilek 理論での位置に置かれます。オクターブを 53 の Holdrian コンマ(1 コンマ ≈ 22.64 セント)に分割し、各マカムは、ルートの上にある各音度のコンマ位置で定義されます。

const KOMA: f32 = 1200.0 / 53.0;

5 => &[5, 17, 22, 31, 40, 44],  // Hicaz: Hicaz tetrachord + Rast pentachord
3 => &[9, 17, 22, 31, 40, 48],  // Rast: Rast tetrachord + Rast pentachord

各音度はセントに変換され、最も近い鍵盤の鍵に置かれます。その差が、その鍵のずらし量です。たとえば D の Hicaz では、E♭ は +13 セント、F♯ は −15 セント、B は +6 セント動きます。結果は、すべての MIDI ノートにピッチオフセットを持つ 128 エントリのテーブルで、各エンジンはそれを自分のノートに加えます。

Rast、Uşşak、Hicaz、Hicazkar、Saba、Hüseyni、Nihavend、Kürdi に加えて、アラブの 4 分音の Bayati と Rast、5 リミットの純正律、ピタゴラス音律があります。それでも足りなければ、Scala の .scl ファイルも読み込めます。53-EDO、24-EDO、1 オクターブあたり何音でも、好きな音階が使えます。

録音なしの合唱

Voices パックの「Elven」合唱とソロソプラノには録音がまったく含まれていません。すべて Python スクリプトによる加算合成で生成しています。どの音もアンサンブルで、歌い手ごとに声門に似た倍音ソースがひとつあり、それぞれ独自のデチューン、ビブラート、ピッチのゆらぎ、息のノイズを持っています。

説得力を生む工夫は、フォルマントの適用方法にあります。母音のフォルマント(たとえば「アー」なら 850、1220、2810 Hz)は、各倍音の瞬間的な周波数で評価されます。ビブラートが倍音をフォルマントのピークに近づけたり遠ざけたりするにつれて、その倍音のレベルも変わります。本物の声のきらめきはそこから生まれます。静的なフィルターではこうはなりません。

トルコとアラブの楽器

kanun、bağlama(バーラマ)、ud(ウード)、ney(ネイ)、darbuka、def は CC0 の録音から作っています。ただし、その録音は出来合いのサンプルセットではありません。kanun の半音階の上行や、ney の即興演奏です。別の Python スクリプトがそれを楽器に変えます。撥弦楽器はオンセット検出で、ney は安定した音程が続く区間の追跡で音を見つけ、各音のピッチを測り、半音ごとに最良のテイクを選び、残ったデチューンを SFZ の tune で補正します。これらのプリセットには、マカム調律版もあります。G の Rast、A の Uşşak、Hicaz、Hüseyni、D の Bayati です。

エフェクトとその他

エフェクトチェーンは、ドラッグして並べ替えられるチップでできています。ドライブ、ビットクラッシャー、フェイザー、フランジャー、コーラス、テンポ同期のピンポンディレイ、3 バンド EQ、コンプレッサー、OTT マルチバンドコンプレッション、FDN リバーブです。リバーブはプリディレイの後に 4 つのディフュージョンオールパスがあり、Householder フィードバック行列を持つ 8 本のディレイラインが続きます。各ラインに独自のダンピングと穏やかなモジュレーションがあります。

ほかにも、6 つのモードを持つテンポ同期のアルペジエーター、16 ボイスのポリ、グライド付きのモノとレガート、オシロスコープ、FFT スペクトラムアナライザー、ステレオメーターがあり、画面上の鍵盤でもコンピューターのキーボードでも演奏できます。

DAW の中でも外でも

すべてのトラックが Aurora のインスタンスになっている Ableton Live 12 のセッション。右側には Aurora のバイオリンサンプラーが開いている

プラグインは nih-plug で VST3 と CLAP としてビルドしています。MIDI は DAW からサンプル精度のタイミングで届き、アルペジエーターと LFO は DAW のテンポに追従します。Ableton Live 12 でテストしました。上のセッションではすべてのトラックが Aurora で、サンプリングされたストリングス、ハープシコード、シンセのレイヤーが同時に鳴っています。AU 版はまだないので、Logic と GarageBand では読み込めません。そちらのためにスタンドアロンアプリがあります。

スタンドアロンアプリでは、オーディオは cpal、MIDI は midir から入ります。MIDI ファイルプレイヤーも内蔵していて、.mid をウィンドウにドラッグし、鳴らすパートを選び、テンポを変えて、鍵盤で一緒に演奏できます。複数パートのファイルでは、リードのメロディが自動で選ばれます。どちらの機能もサイトに動画があります。

macOS 版のパッケージは Apple Silicon と Intel のユニバーサルです(lipo で結合)。Windows 版のパッケージは macOS から mingw-w64 でクロスコンパイルしています。サンプルパックは FLAC で、両方のシステムで共通です。Piano(Salamander Grand と Upright KW、約 93 MB)、Orchestral(VSCO 2 CE のストリングス、木管、金管、ハープシコード、約 255 MB)、World(約 32 MB)、Voices(約 22 MB)です。シンセのプリセットにパックはまったく不要で、パックが必要なプリセットにはブラウザ上で印が付いています。

試してみる

Aurora は aurorasynth.baltavista.com からダウンロードできます。手始めには、Turkish & Arabic カテゴリーから Hicaz 調律の kanun プリセットを開いて、画面上の鍵盤の上に表示されるセントのずれを眺めてみるのがおすすめです。

BA
Barış Akın

25年以上の経験を持つソフトウェアソリューションアーキテクト。FinTechと分散システム。OxiDB、Rill、Cobraの開発者。