DSP 実装解説
このページは、各 DSP ファミリーが内部で何をしているかを説明します。
次の 3 つのリファレンスページを補完します。
| ページ | 役割 |
|---|---|
| マスタリングプロセッサ | 公開プロセッサのレジストリ |
| アルゴリズム根拠 | 標準規格、アルゴリズム名、互換性参照 |
| 実装検証 | 機能グループとテストの対応 |
UI にプロセッサを出す前、リアルタイム設定を選ぶ前、レンダリングレポートを説明するときの実装レベルの資料として使います。
記述の根拠は libsonare リポジトリの C++ 実装です。
| 領域 | ソース |
|---|---|
| DSP 実装 | src/analysis、src/feature、src/mastering、src/effects、src/mixing、src/engine |
| マスタリングプロセッサの公開名 | src/mastering/api/named_processor_registry.cpp |
| 解析・特徴量ヘルパー | quick API と各言語バインディング |
初めて読む場合
このページは実装寄りなので、最初から全部を理解する必要はありません。まず「DSP は音声を数値列として扱い、測る・分ける・変形する処理の総称」と捉えてください。表の「主な用途」を読み、自分が使う処理だけ詳しく見れば十分です。
たとえば BPM を知りたいだけなら 解析と特徴量 DSP を、ラウドネスや配信用の仕上げをしたいなら マスタリングチェーン と 最終段とマキシマイザー を読む、という使い方で構いません。
目的別のプロセッサ
| 目的 | まず見るもの |
|---|---|
| ラウドネスの目標に合わせる | チェーンのラウドネススロット、またはファイル全体なら maximizer.loudnessOptimize。最終段とマキシマイザーを参照 |
| ピークをシーリング以下に収める | maximizer.truePeakLimiter または dynamics.brickwallLimiter |
| ダイナミクスをそろえる | ダイナミクス |
| 音色を整える | EQ と スペクトル処理とステレオ処理 |
| ノイズ、ハム、クリック、クリッピングを取り除く | リペア |
| 空間や動きを加える | エフェクトと編集 DSP と モジュレーション・ディレイ・フィルター・ユーティリティのインサート |
| ステレオの幅を広げる・狭める・確認する | スペクトル処理とステレオ処理 |
| リファレンスに合わせる | リファレンスマッチングと解析 |
| BPM、キー、コードを知る | 解析と特徴量 DSP |
このページで身につくこと
このページを読むと、次のことを判断・説明できるようになります。
- 解析、エフェクト、マスタリング、ミキシング、リアルタイム処理を支える共通 DSP 構成要素を特定できる。
- 公開プロセッサ名と、それを実現する低レベル実装部品の違いを説明できる。
- ルックアヘッド、アロケーション、FIR 再構築、スムージング、レイテンシなど、リアルタイム上注意すべき実装点を見つけられる。
- 挙動を検証したいときに、どのソースディレクトリを見るべきか判断できる。
読み進め方
| 知りたいこと | 読むページ |
|---|---|
| 公開プロセッサ ID とプリセット名 | マスタリングプロセッサ |
| DSP の内部挙動、共通構成要素、リアルタイム境界 | このページ |
| 標準規格、論文、互換性参照 | アルゴリズム根拠 |
| テスト範囲と検証状況 | 実装検証 |
共通の構成要素
多くのプロセッサは、それぞれがまったく独自の仕組みで動いているわけではありません。フィルター、レベル検出、遅延、ステレオ変換、畳み込みといった小さな部品を組み合わせています。下の表は、その部品がどこで使われるかを示します。
| 構成要素 | 実装上の役割 | 主な利用箇所 |
|---|---|---|
| バイクアッドとフィルター設計 | 低レイテンシの IIR EQ、シェルフ、カット、プレゼンス/エア処理、検出器用フィルター | EQ、ダイナミクスのサイドチェイン、スペクトル系、ステレオ系 |
| エンベロープフォロワー | レベル検出とゲイン変化のアタック/リリース平滑化。各時間は 1 時定数で、設定時間で約 63% に達する | コンプレッサー、エキスパンダー、ゲート、ディエッサー、ボーカルライダー、リミッター |
| パラメータスムーザー | ブロック処理中のクリックを避けるパラメータ遷移。グライドはどのサンプルレートでも目標値にぴったり収束し、途中で中断されたグライドは適用済みの値から再開する | マスタリングプロセッサ、ミキサーのストリップ制御、オートメーション |
| ルックアヘッドとスライディング最大値 | 先読みを使ったピーク制御 | ブリックウォールリミッター、True Peak リミッター、マキシマイザー |
| オーバーサンプリングと True Peak フィルター | サンプル間ピーク(ISP)推定とエイリアシング対策 | リミッター、クリッパー、サチュレーション、最終出力 |
| ディレイライン | 時間合わせ、Haas 拡張、モジュレーションディレイ、ダッキングの整列 | ステレオ処理、ディレイ、モジュレーション、ミキシングのアラインメント |
| Mid/Side 変換 | 中央成分と側成分を分けて処理 | Mid/Side EQ、イメージャー、モノメーカー、ステレオバランス |
| パーティション畳み込み | 長いカーネルやインパルス応答(IR)をブロック単位で効率よく処理 | コンボリューションリバーブ、リニアフェイズ EQ、マッチ EQ |
| ノイズトラッカーと LPC ヘルパー | 古典的なノイズプロファイル追跡と LPC 残差/再構成の補助 | denoise は NoiseTracker、declick/declip は LPC ヘルパーを使う |
ビルディングブロックの平易な解説
- ルックアヘッド: オーディオを少し遅らせ、ピークが鳴る数ミリ秒前に「先読み」して、急に潰すのではなく滑らかにゲインを下げます。代償はわずかなレイテンシです。
- True Peak 補間: オーバーサンプリングした再構成フィルターで、保存されたサンプル間のピークを推定します。規定の再構成特性を近似する測定であり、個々の DAC のアナログ出力を測るものではありません。
- 非線形処理のオーバーサンプリング: 歪みを生むプロセッサを高いレートで動かし、元のレートへ戻す前にフィルターをかけて折り返しを減らします。True Peak の測定とは別の用途です。
- ミッド/サイド(M/S): ステレオ信号をミッド(モノラルの中央)とサイド(左−右の差分)に変換し、中央と広がりを別々に処理してから戻します。
- パーティション畳み込み: 畳み込みはある信号の「指紋」を別の信号に適用する処理です(部屋のインパルス応答やリニアフェイズ EQ など)。長いフィルターをブロックに分割し、リアルタイムでも効率よく動かします。
- Haas ワイドニング: 片チャンネルへの非常に短いディレイ(約 40 ms 未満)で、エコーではなくステレオの広がりとして聞こえます。
- LPC(線形予測符号化): あるサンプルを直前のサンプル群から予測するモデル。リペアでは、クリックやクリップしたピークが本来どうだったかを再構成するのに使います。
解析と特徴量 DSP
解析側、すなわち MIR(music information retrieval。テンポ、キー、コードといった音楽的な情報を音声から取り出すこと)は、1 つの巨大なアナライザーではなく、再利用できる特徴量段の組み合わせで構成されています。STFT(短時間フーリエ変換)とフレーム処理は、メル/MFCC、クロマ、オンセット包絡線、テンポグラム、セクション特徴量に使われます。一方、YIN 系のピッチ追跡は波形の周期性から求めます。差分計算を FFT で高速化していても、キャッシュ済みの STFT スペクトログラムとは別の計算です。高レベル解析は、可能な範囲でこれらの表現を共有します。
初心者向けに言い換えると、解析はだいたい次の流れです。
- 音声を短い窓に区切る。
- 目的に合わせて、スペクトルや F0 用の周期性指標を求める。
- 目的別の要約を作る。リズムを見るならオンセット、ハーモニーを見るならクロマ、音色を見るならメルや MFCC、メロディを見るならピッチの時間変化を使います。
- BPM、キー、コードなどの高レベルな結果を、それらの要約から推定する。
| ファミリー | 実装上の役割 | 主な用途 |
|---|---|---|
| STFT とフレーミング | オーバーラップする窓への FFT と、共通の frame/hop 規約 | スペクトル、クロマ、オンセット、メル、MFCC の基盤 |
| メル / MFCC | メルフィルタバンクと DCT 系のケプストラム圧縮。任意でケプストラルリフタリング(lifter。既定は 0 で無効) | ML 特徴量、音色サマリー、librosa 互換ワークフロー |
| クロマ / CQT / VQT / NNLS クロマ | ピッチクラス表現と対数周波数表現。定Qクロマグラム(chromaCqt)を含む | キー、コード、ハーモニー類似度、ピッチを考慮した特徴量 |
| オンセット / テンポグラム / PLP | オンセット包絡線と局所周期性の表現 | BPM、ビート、リズム、パルス解析 |
| ピッチ追跡 | YIN / pYIN 系の F0 推定 | メロディ抽出と単音ピッチ解析 |
| 逆変換特徴量 | 非負最小二乗(NNLS)によるメルフィルタバンク逆変換、逆 DCT による MFCC の復元、Griffin-Lim 音声合成 | デバッグ用プレビューと特徴量の往復確認 |
| ルーム音響解析 | IR の energy decay curve 指標、通常録音向けの自由減衰フィット、等価ルーム推定、鏡像音源法による RIR 合成、ルームモーフィング | RT60、EDT、C50、C80、D50、バンド別減衰、体積、寸法、吸音率、DRR、生成 RIR、信頼度 |
特徴量の逆変換、ブラインド音響推定、等価ルーム推定は有用ですが、いずれも推定です。逆変換ヘルパーは失われた位相やメル/MFCC の細部を復元できません。ブラインド音響モードとルーム推定は、通常録音に明確な自由減衰区間が含まれるとは限らないため、信頼度を返します。
マスタリングチェーン
masteringChain(...) は、構造化された設定から固定のプロセッサチェーンを組みます。同じ設定と入力からは常に同じステージ順と同じ出力が得られ、実行ごとのばらつきはありません。ここでいう「決定的」とはこの性質を指します。
ストリーミング版の StreamingMasteringChain も同じステージを同じ順で実行しますが、ブロック間で各プロセッサの状態を保持するため、ライブ処理にも使えます。
高レベルのワークフローには、オフライン前提のプロセッサも入ります。リアルタイムレンダーの可否は各プロセッサの契約に従います。バッファ再確保や FIR カーネル再構築を伴う変更は、audio thread safe ではありません。
プリセットは別の DSP アルゴリズムではありません。リペア、EQ、ダイナミクス、サチュレーション、スペクトル処理、ステレオ、マキシマイザー、ラウドネスの各スロットから処理を選び、ジャンルや配信先向けの値を設定したものです。
固定のスロット順はリペア → EQ → ダイナミクス → サチュレーション → スペクトル処理 → ステレオ(ステレオ経路のみ) → マキシマイザー → ラウドネスです。設定でスロットを省略できますが、順番は変えられません。チェーン全体の図には、全スロットとプリセットで有効になる処理を示しています。ラウドネス段には正規化後に働く True Peak リミッターがあるため、プリセットでは別のマキシマイザーリミッターを重ねていません。そのゲインは候補ゲインで信号を測り直して解くので、ゲインによって絶対ゲートをまたぐブロックがあっても、ゲート後のラウドネスターゲットに着地します。ストリーミングチェーンは同じゲインを streamingLoudnessGain から受け取ります。
すべてのインサートはレイテンシとテールを報告します。テールは入力が止まった後に出力が鳴り続けるサンプル数で、フルスケールの 1e-5 まで数えます。リバーブだけでなく、IIR EQ、フィルター、サチュレーション、ステレオ系インサート、モジュレーションディレイ、オーバーサンプリング段、マルチバンドのクロスオーバーも対象で、バウンスやフリーズの長さはここから決まります。オフにしてからオンに戻した段は、保持していた履歴を再生せず静止状態から始まります。set_config は値が変わった段だけを作り直し、設定が拒否された場合はプロセッサを元のまま残します。
ダイナミクス
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
dynamics.brickwallLimiter | ルックアヘッドピーク検出、素早いゲインリダクション、シーリング制御 | サンプルピークを上限以下に抑える | 先読みレイテンシがある。ストリーミング前に prepare すれば扱いやすい |
dynamics.compressor | フィードフォワード検出、アタック/リリースエンベロープ、レシオ/ニーのゲイン計算、メイクアップゲイン | マスター全体のダイナミクスを整え、一体感を出す | パラメータ変化は平滑化してジッパーノイズを避ける |
dynamics.deesser | バンドパスフィルター、しきい値、レシオ、アタック/リリース、レンジ、bandpass Q を持つ split-band de-esser | 高域の歯擦音エネルギーを減衰 | これらのパラメータはアロケーションや状態リセットなしでオートメーション可能 |
dynamics.expander | しきい値以下をエンベロープ検出で下向きに拡張 | 小さい被りやノイズを下げてコントラストを出す | リリース時間が聴感を大きく左右する |
dynamics.gate | ヒステリシスを持つ開閉判定でゲート処理 | 無音部や背景ノイズの抑制 | ホールド/リリースでチャタリングを避ける |
dynamics.limiter | 高レシオで短い時定数のピーク向けコンプレッサー | 最終段前の短いトランジェント捕捉 | ブリックウォールより低レイテンシだが絶対的ではない |
dynamics.parallelComp | 圧縮経路とドライ経路をブレンド | トランジェントを残しながら密度を足す | 共有のコンバイナーがすべての並列経路を最長の遅延に揃えて報告するため、ブレンドは位相が揃ったまま |
dynamics.sidechainRouter | 外部または派生した制御信号を検出器へルーティング | サイドチェイン依存のコンプレッションやダッキング | 高度なグラフ向けの内部寄りヘルパー |
dynamics.duckingProcessor | キー信号のエンベロープでプログラム音を下げる | ナレーション時の BGM ダッキング、配信/放送系ミックス | アタック/リリース形状が明瞭度を決める |
dynamics.transientShaper | アタックとサステインのエンベロープを分けて独立ゲインを適用 | 打音を強調または柔らかくする | 高速検出経路はブロックサイズの影響を受けやすい。ゲインリダクションを報告する |
dynamics.upwardCompressor | 大きい音を下げる代わりに、しきい値以下を持ち上げる | 細部と密度を増やす | ノイズフロアも上がりやすいので必要に応じてデノイズやゲートと併用する |
dynamics.upwardExpander | 低めのしきい値以上の素材を強調し、静かな部分は低いまま残す | ハードゲートより自然にアーティキュレーションを戻す | アンビエンスの多い素材に向く |
dynamics.vocalRider | 遅めのエンベロープでボーカルレベルを目標レンジへ寄せる | ボーカルやスピーチの自動レベルライド | ピークリミッターではなく、ゆるやかなゲインオートメーションとして扱う。ゲインリダクションを報告する |
ダイナミクス用語: ニー・メイクアップゲイン・サイドチェイン・ダッキング
- ニー(knee): しきい値付近で入力と出力の関係がどう変わるかを決めます。ハードニーはそこでカーブの傾きが変わり、ソフトニーは一定の幅で圧縮後の傾きへ移ります。ゲインがそのカーブに追従する速さはアタックとリリースで決まります。
- メイクアップゲイン: コンプが大きい部分を下げると全体が小さくなるので、メイクアップゲインで同等のレベルまで持ち上げます。結果として以前より均一になります。
- サイドチェイン: プロセッサのレベル検出に別の信号を入れ、その信号に反応させる仕組みです。
- ダッキング: サイドチェインの定番用途。声(キー信号)があるときに音楽ベッドが自動的に下がり、声が止むと戻ります。
- ブリックウォールリミッター: レシオが非常に高く反応も速いリミッターで、シーリングを一切超えさせません。まるで壁にぶつかるように止めます。
EQ
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
eq.bandPass | バイクアッドのバンドパスフィルター | 周波数帯域の切り出し | 低レイテンシ |
eq.cutFilter | スロープ指定できるハイパス/ローパス | ランブル、ヒス、不要帯域の除去 | 低レイテンシの IIR 経路 |
eq.dynamic | エンベロープ検出で動く EQ バンド | 特定帯域だけの圧縮/拡張 | 検出器の時定数を平滑化する |
eq.equalizer | 検証、ルーティング、スペクトラム補助を持つマルチバンド EQ エンジン | 補正 EQ と音作り | IIR 経路はライブ向き |
eq.graphic | 固定バンドのグラフィック EQ | 予測しやすい帯域で大まかな音作り | 低レイテンシ |
eq.linearPhase | FIR/リニアフェイズ系の EQ 経路 | 位相を保ったマスタリング EQ | レイテンシがあるため、オフラインまたはレイテンシ許容のストリーミング向き |
eq.midSide | L/R を M/S に変換し、それぞれへ EQ をかけて戻す | 中央とサイドの帯域を別々に整える | ステレオ入力とモノラル互換性の確認が必要 |
eq.minimumPhase | ミニマムフェイズ EQ トポロジー | 低レイテンシを重視するマスタリング EQ | ライブ経路で優先しやすい |
eq.parametric | ピーク、シェルフ、カットのパラメトリックバンド | 精密な補正 EQ | 低レイテンシ |
eq.passiveTube | low boost、low attenuation、high boost、high attenuation、component model、output drive を持つ passive-style program equalizer | 低域/高域のプログラム EQ | 多くのコントロールはオートメーション可能。component model はオートメーション対象外 |
eq.shelving | ロー/ハイシェルフフィルター | 指定周波数の上下を持ち上げる/下げる | 低レイテンシ |
eq.steppedProportionalQ | 4 バンドのステップ式 proportional-Q バイクアッド EQ | 周波数とゲインを段階的に指定する音色整形 | 係数をインプレースで変更し、ゲインは 2 dB 刻み、ゲインの絶対値が大きいほど Q が狭くなる |
eq.tilt | ピボット周波数を中心に低域と高域を相補的に傾ける | 明るい/暗いの大まかなトーン調整 | プリセットやアシスタント提案で使いやすい |
最終段とマキシマイザー
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
final.bitDepth | 指定ビット深度へ量子化 | ビット深度削減のプレビューや書き出し | 通常は最後または最後付近 |
final.dither | 量子化前に低レベルノイズを加える | 量子化歪みを目立ちにくくする | 書き出し段の処理 |
final.outputChain | 出力ゲイン、シーリング、ビット深度、ディザー、最終チェックをまとめる | 書き出し直前の整理 | トーンやダイナミクス処理の後に置く |
maximizer.adaptiveRelease | 信号に応じてリミッターのリリースを変化させる | パンピングを抑えながらラウドネスを上げる | 検出器の状態を持つ。既定で 129 サンプルのレイテンシを報告する |
maximizer.loudnessOptimize | ラウドネスを測定し、目標に向けたゲイン戦略を適用 | 配信/放送向けの LUFS(フルスケール基準のラウドネス単位)目標へ合わせる | ファイル全体の最適化はオフライン処理 |
maximizer.maximizer | シーリング管理付きのラウドネス向けリミッティング | 知覚上の音量を上げる | 強い設定では後段の True Peak 保護が重要 |
maximizer.softKneeMax | ハードな上限前にソフトニーのリミッティング曲線を使う | 急なリミッティング感を抑える | 最終 True Peak 保護の前段に向く |
maximizer.truePeakLimiter | オーバーサンプリングによる True Peak 推定とシーリング制御。出力ガードが補正で持ち上がり得る過去の位置をすべて再確認するため、短いバーストでもシーリングを守る | サンプル間ピークを避ける | 計算コストと先読み系レイテンシがある(既定で 129 サンプル)。実行中にシーリングを下げると、すでにキューにある出力も再評価される |
マルチバンド
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
multiband.compressor | クロスオーバーで帯域分割し、各帯域を圧縮して再合成 | 帯域別のダイナミクス制御 | クロスオーバー設計とレイテンシ補償が重要 |
multiband.dynamicEq | 帯域ごとにダイナミック EQ 的な挙動を適用。再び有効にした帯域は、検出器・EQ スロット・ゲインのグライドを静止状態から始め直す | 共鳴や刺さる帯域だけを動的に抑える | 検出器の平滑化が必須 |
multiband.expander | 帯域ごとにしきい値以下を拡張 | 帯域別のノイズ除去やコントラスト調整 | やりすぎると音色バランスが変わる |
multiband.imager | 帯域ごとのステレオ幅/Mid/Side 処理 | 低域を中央に保ち、高域を広げる | 必ずモノラル互換性を確認する |
multiband.limiter | 再合成前に帯域ごとのリミッティング。先読みやオーバーサンプリングが異なる帯域は時間が揃えられる | 帯域別ピークの捕捉 | クロスオーバー由来の違和感を避ける |
multiband.saturation | 帯域ごとの非線形ドライブとブレンド | 周波数帯ごとに倍音の色を足す | オーバーサンプリングまたは控えめなドライブでエイリアシングを抑える |
リペア
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
repair.declick | 孤立したインパルス状の不連続を検出し、補間または減衰 | クリックや小さなデジタル欠陥の除去 | 検出窓に局所的な前後文脈が必要 |
repair.declip | クリップした領域を推定してピークを再構成 | ハードクリップした音声のリペア | 文脈を使うためオフライン向き |
repair.decrackle | 密な小インパルスを追跡して滑らかにする | レコード的なクラックルの軽減 | 単発クリック除去より重い。因果的で、リアルタイムインサートとしても使える(median モード) |
repair.dehum | ハムの基本周波数と倍音をノッチ系で抑える | 電源ハムの除去 | 周波数が分かっていれば低レイテンシ。リアルタイムインサートとしても使える |
repair.denoiseClassical | ノイズ追跡とスペクトル減衰 | 定常的な背景ノイズの低減 | プロファイル推定は文脈依存。リアルタイムインサートとしても使え、報告されるレイテンシだけ遅れる。ストリーミング向けノイズ推定器(既定は spp)を使う |
repair.dereverbClassical | t60_sec、late_delay_ms、over-subtraction、spectral floor、任意の WPE 設定を持つ STFT ドメインの残響除去設定 | 部屋鳴りやにじみの軽減 | ファイル単位 API として新しい Audio オブジェクトを返す。マスクをチャンネル間で連動させるリアルタイムインサートとしても使える |
repair.trimSilence | しきい値による先頭/末尾の無音除去 | 書き出しやバッチ素材の整理 | ライブインサートではなくファイル単位のユーティリティ |
repair.decrackle、repair.dehum、repair.denoiseClassical、repair.dereverbClassical は因果的で、リアルタイムインサートとして動作します。同じ設定ならオフライン関数と同じ結果になり、インスタンスが報告するレイテンシだけ遅れます。オフライン専用の設定(wavelet モード、WPE、クォンタイル推定器)は名前を挙げて拒否されます。repair.declick、repair.declip、repair.trimSilence は因果的ではなく、オフライン専用です。
サチュレーション
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
saturation.ampSim | プリアンプドライブ → トーンスタック → 任意のパワーアンプ(sag/トランス/NFB) → キャビネット特性 | ギター/ベースアンプ系の色付けインサート | cab/cabModel/ampModel の離散トポロジー選択はオートメーションではなく構築時に指定する。パワー段の半サンプルの遅延と 2 本目のマイクの経路差は常に計上されるため、報告レイテンシはオートメーションで動かない |
saturation.bitcrusher | ビット深度やサンプルレートを粗くする劣化処理 | ローファイ質感 | 出力ゲインを管理する |
saturation.exciter | 高域の倍音生成とブレンド | 明るさと細部感の追加 | すぐに刺さるため控えめに使う |
saturation.hardClipper | ハードな非線形伝達曲線 | 攻撃的なピーク削りと歪み | オーバーサンプリングまたは控えめなドライブを使う。ADAA の半サンプルは報告され、ブレンドのドライ経路はそれに合わせて遅らされる |
saturation.multibandExciter | 帯域分割したエキサイターと帯域別ブレンド | 低域を濁らせずにきらびやかさを足す | クロスオーバーとドライブ配分が重要 |
saturation.overdrive | 720 Hz でハイパスしたクリップ経路をゲインとソフトクリップに通し、原音と合算する。クリップはホストの 2 倍のレートで、反微分アンチエイリアシングの後ろで動き、続いて 1 次のトーンローパスと出力レベルがある | 低域を保ったまま軽くつぶす | リアルタイムのマルチチャンネルインサート。報告レイテンシにオーバーサンプラーとアンチエイリアシングの遅延を含む |
saturation.distortion | ゲイン、ゲイン帯域幅によるローパス、間に結合ハイパスを挟んだ 2 段のハードクリップ。オーバーサンプリング、トーン、レベルの構成は同じ | より強く引き締まった歪み | リアルタイムのマルチチャンネルインサート。レイテンシの計上はオーバードライブと同じ |
saturation.softClipper | 滑らかな非線形曲線 | 穏やかなピーク丸め | マキシマイザー前段で使いやすい |
saturation.tape | トーン変化と緩いコンプレッションを伴う非線形サチュレーション(微小信号応答は桁落ちなしで評価) | テープ的な密度 | ドライブで音量と音色が同時に変わる |
saturation.transformer | 低次倍音の色付けと軽いサチュレーション(微小信号応答は桁落ちなしで評価) | アナログ的な厚み | マスタリングでは通常さりげなく使う |
saturation.tube | 非対称の非線形伝達で音楽的な倍音を強調 | 温かさ、ボーカルや楽器の色付け | DC と低域のふくらみに注意 |
saturation.waveshaper | 設定可能な非線形伝達曲線 | 汎用的な歪みと色付け | パラメータ平滑化でクリックを避ける |
スペクトル処理とステレオ処理
| プロセッサ | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
spectral.airBand | 高域シェルフ/エキサイター的な強調 | プレゼンスより上のエア感を足す | 歯擦音が増える場合はディエッサーと併用する |
spectral.lowEndFocus | 低域の形とまとまりを整える | ベースを締め、濁りを減らす | モノラル互換性が重要 |
spectral.presenceEnhancer | プレゼンス帯域の整形と細部強調 | ボーカルやリードの前に出る感じを改善 | マスキングに注意し、かけすぎない |
spectral.spectralShaper | 広いスペクトル傾向の補正 | 音色の輪郭合わせや耳につく帯域の緩和 | 中庸な設定ほど透明に効く |
stereo.autoPan | LFO によるパン移動 | クリエイティブな動き | マスタリング用の中立な処理というより演出向け |
stereo.binaural | 測定 HRTF による仮想スピーカー配置。スピーカー用クロストークキャンセルと方位移動にも対応 | ヘッドホンまたはスピーカーの仮想空間へステレオペアを配置 | ステレオペア用プロセッサ。レイアウト変換、部屋、ヘッドトラッキングまで必要なら完全な PlaybackRenderer を使う |
stereo.haasEnhancer | 短い左右差ディレイで幅を作る | 見かけのステレオ幅を広げる | モノラル互換性を下げることがある |
stereo.imager | Mid/Side の幅ゲインと必要に応じた帯域別の処理 | ステレオイメージを広げる/狭める | 相関値とモノラルサムを確認する |
stereo.monoMaker | クロスオーバー以下をモノラル化 | 低域を中央に安定させる | 最終リミッター前によく使う |
stereo.phaseAlign | ディレイ/極性系の整列補正 | ステレオ位相関係の改善 | 聴感または測定で慎重に確認する |
stereo.stereoBalance | L/R または M/S のバランス調整 | 左右に寄ったイメージの補正 | 低レイテンシ |
リファレンスマッチングと解析
| 名前 | 実装 | 主な用途 |
|---|---|---|
match.applyMatchEq | ソースとリファレンスのスペクトル差から得た EQ カーブを適用 | 音色バランスをリファレンスへ近づける |
match.alignReferenceToSource | ソースに対するリファレンスの遅延を推定して補正 | A/B 比較やマッチ EQ の信頼性を上げる |
match.abSwitch | ソースとリファレンス経路を切り替える | 比較試聴 |
match.abCrossfade | ソースとリファレンスをクロスフェードする | クリックなしの滑らかな比較 |
match.referenceLoudness | リファレンスのラウドネスメトリクスを測る | レベルを揃えた比較 |
match.tonalBalance | 帯域エネルギー分布を比較 | 大まかな音色比較 |
match.tonalBalanceLogBands | 対数帯域で音色バランスを比較 | 聴感に寄せたリファレンス比較 |
match.matchEqCurve | 補正 EQ カーブを推定 | マッチ EQ 設定の生成 |
match.estimateReferenceDelaySamples | サンプル単位の遅延候補を推定 | 比較前のファイル整列 |
stereo.monoCompatCheck | モノラル互換性メトリクスを計算 | 位相やキャンセルの問題を検出 |
stereo.monoCompatCheckLogBands | 対数帯域ごとのモノラル互換性を計算 | ステレオ問題のある帯域を見つける |
エフェクトと編集 DSP
| DSP | 実装 | 主な用途 | リアルタイム上の注意 |
|---|---|---|---|
| HPSS / harmonic / percussive | スペクトル表現上のメディアンフィルターで、水平成分の倍音エネルギーと垂直成分の打撃エネルギーを分離 | リミックス、前処理、解析の整理 | ファイル全体のオフライン処理向き |
| タイムストレッチ | 位相ボコーダ系の処理 | ピッチを保って長さを変える | ストリーミングではオーバーラップと状態管理が必要 |
| ピッチシフト | リサンプリングとタイムストレッチの関係を利用 | 長さを大きく変えずに移調 | ボイスチェンジ経路でない限りフォルマントは保たれない |
| ピッチ補正 | ピッチ推定とターゲット MIDI ノートへの補正 | ボーカルや単音素材のチューニング | モノフォニック素材に向く |
| ノートストレッチ | ノート区間に対するリージョンベースのストレッチ | ノートの長さ編集 | オフライン編集処理 |
| ボイスチェンジ | ピッチとフォルマントの制御。ピッチ段は正確に 2^(semitones/12) だけシフトする | 声質変換 | 単純なピッチシフトより重い。モノラル/ステレオストリップ向けのリアルタイムインサート voice.changer でもある |
| 正規化 | ピークまたは目標レベルへのゲイン調整 | レベル合わせ | 事前にゲインが分かる場合を除きファイル単位 |
| 無音 trim/split | しきい値によるセグメント化 | バッチ整理と素材準備 | ファイル単位のユーティリティ |
| リバーブインサート | Plate/Dattorro、FDN、velvet、convolution、幾何ベースのルーム、ルームモーフィング | ミキサー/マスタリング insert graph 内の空間、残響、ルームモーフィング | ビルドフラグと IR 要件が処理ごとに異なる |
| モジュレーション/ディレイインサート | コーラス、アンサンブル、フランジャー、フェイザー、ワウ、オートワウ、ロータリー、リングモジュレーター、ピッチシフター、ステレオディレイの DSP はソースモジュールとして存在 | クリエイティブ FX の構成要素 | インサートファクトリとシーンインサート経由で公開。すべての ID が汎用の masteringProcess / mastering_process レジストリからも呼べるが、専用のトップレベル JS/Python ヘルパー関数はない |
リバーブインサートの提供条件
effects.reverb.plate / effects.reverb.dattorro、effects.reverb.fdn、effects.reverb.velvet、effects.reverb.convolution、モジュレーション/ディレイインサートには SONARE_HAVE_FX が必要です。effects.reverb.room と effects.acoustic.roomMorph には BUILD_ACOUSTIC_SIM も必要です。
アルゴリズムリバーブと幾何ベースのルームリバーブはストリーミング可能です。コンボリューションは insert params の base64 float32 IR を受け取るか、省略時に decaySec と seed から減衰ノイズの IR を合成します。
モジュレーション・ディレイ・フィルター・ユーティリティのインサート
これらのインサートは src/effects/ と src/mastering/utility/ の小さなモジュールから作られています。いずれもリアルタイムインサートで、パラメータはインサートエフェクトにあります。
| プロセッサ | 実装 | 主な用途 |
|---|---|---|
effects.modulation.chorus | ステレオコーラス。低周波発振器で揺らす分数ディレイラインで、前段に任意の 1 次セクションを置ける | 音を厚くして広げる |
effects.modulation.ensemble | チャンネルごとに 3 本のディレイタップを 120 度ずつずらし、遅い発振器と速い発振器で同時に変調する。帯域制限あり | ストリングマシン風の揺らぎ |
effects.modulation.flanger | 変調ディレイにループを閉じた構成。フィードバックの符号がくし形フィルターの歯の位置を決める | くし形フィルターが掃引する動き |
effects.modulation.phaser | 1 つのコーナーを共有する 1 次オールパス段のカスケードを原音とミックスする。2 段ごとにノッチが 1 つ | やわらかく掃引するノッチ |
effects.modulation.wah | 発振器で掃引する共振バンドパス | リズミカルなフィルター掃引 |
effects.modulation.autoWah | 入力のエンベロープで駆動する共振バンドパス | 演奏の強弱に反応するフィルター掃引 |
effects.modulation.rotary | 2 つのローターによるドップラーとトレモロ。各ローターは、加速と減速で別々の時定数を持って目標速度へ滑らかに移る | 回転スピーカーの動き |
effects.modulation.pitchShifter | クロスフェードする 2 本のディレイタップによる時間領域のシフター | 小幅で低レイテンシなデチューン |
effects.modulation.ringModulator | 入力に正弦波キャリアを掛ける | 金属的で非倍音的な音色 |
effects.delay.stereo | ゼロレイテンシのステレオフィードバックディレイ。左右のラインがループに入り、パンした 2 本のフィードフォワードタップがモノラル入力を読む | エコーとピンポン |
effects.filter.vowel | 直接経路と並べた 3 本の並列バンドパス。前段に任意のドライブを置ける。1 つのコントロールで母音の間を連続的に動かす | 話し声のようなフィルターの動き |
effects.gsEfx | タイプを選ぶ GS インサーションエフェクトユニット。20 バイトの生パラメータを持つ | GS 用に書かれた MIDI のエフェクトタイプ |
utility.gain | 広帯域のレベルトリム | チェーン内のレベル合わせ |
mixLaw を持つカタログ項目は 9 つあり、dryWet のときにドライ経路とウェット経路をどう重み付けするかを選びます。上の表のコーラス、アンサンブル、フランジャー、ピッチシフター、リングモジュレーター、ステレオディレイの 6 つに加え、Dattorro リバーブとそのエイリアスの plate、ビットクラッシャーです。ドライ/ウェットの混合法則を参照してください。
ミキシング DSP
ミキサーはルーティングであると同時に DSP です。
チャンネルストリップは、入力トリム、極性、アラインメントディレイ、パンロー、ステレオ幅、インサート処理、フェーダー、ミュート/ソロ、センド、メーターを扱います。
バスはルーティングされた信号を加算し、VCA グループは制御ゲインを適用します。メーターはピーク、RMS、LUFS 系の値、True Peak、ゲインリダクション、相関値、ゴニオメーターバッファを計算します。
オートメーションレーンはサンプル位置で管理され、linear、exponential、hold、s-curve の補間に対応します。トポロジー変更時はルーティンググラフをコンパイルします。音声処理経路では、コンパイル済みのグラフと事前確保された状態を使います。
リアルタイムエンジンとの境界
RealtimeEngine は、トランスポート、テンポ同期、グラフ実行、クリップ再生、メトロノーム、キャプチャ、モニター実行、オフラインバウンス、テレメトリを担当します。
これはマスタリングプロセッサレジストリの置き換えではありません。リアルタイム安全な DSP ブロックを載せる、スケジューラ兼グラフランタイムです。
ファイル全体の解析、非因果的なリペア段(declick、declip、無音トリム)、ラウドネス最適化は、オフラインまたはレイテンシを許容する処理として扱います。因果的なリペア段(decrackle、dehum、denoise、dereverb)は、インサートとしてライブで動かせます。
リアルタイム処理では「今この瞬間の音を、次の音が来る前に処理しきる」必要があります。
そのため、次のような処理は向きません。
- ファイル全体を見てから判断する処理
- 巨大なバッファを作り直す処理
- 上限がなく、事前確保もできない先読みを必要とする処理
上限付きで事前確保した先読みディレイならリアルタイムで動かせますが、その分のレイテンシは生じます。制約になるのはコールバックの期限と、状態を事前準備できるかどうかです。
逆に、EQ、簡単なゲイン、短いディレイ、状態を持ったコンプレッサーのような処理は、事前準備を済ませればリアルタイムに載せやすいです。
根拠
このページは、名前からの印象ではなくソースに基づいて書きます。主に次の根拠を使います。
このページが使う根拠
| 根拠 | 例 |
|---|---|
| レジストリ | 公開プロセッサ名は src/mastering/api/named_processor_registry.cpp |
| ヘッダーコメント | compressor.h は soft knee と makeup gain を持つ feed-forward compressor と説明している。linear_phase.h は FFT-domain response から作る linear-phase FIR equalizer と説明している |
| 設定フィールド | TruePeakLimiterConfig は lookahead_ms、release_ms、oversample_factor、apply_gain_at_input_rate を持つ。DenoiseClassicalConfig は 3つのゲイン関数(LogMMSE、MMSE-STSA、spectral subtraction)と 3つのノイズ推定器(Quantile、MCRA、IMCRA)を持つ |
| 実行時契約 | 複数のプロセッサが、リアルタイム安全なパラメータと、バッファ再確保や FIR カーネル再構築が必要な変更を明示している |
| 実装で使うヘッダー | リペア系では declick/declip が LPC ヘルパーを使う。denoise は NoiseTracker を使う。コンボリューションリバーブとリニアフェイズ EQ はパーティション畳み込みを使う |
「主な用途」は、プロセッサ名、設定、ヘッダーコメントから読み取れる想定用途です。ソースから確認できない隠れたモデル挙動は断定しません。