チャンネル形式
libsonare はシステム全体で モノラル・ステレオ・5.1・7.1 の 4 つのチャンネルレイアウトを認識しますが、各モジュールは異なる用途で作られているため、2 チャンネルを超えるチャンネル数の扱いはどこでも同じではありません。このページでは、どのモジュールが何チャンネルまで受け付けるか、標準のチャンネル順と LFE の扱いが何を意味するか、そして狭める方向と広げる方向の扱いを整理します。ダウンミックスの規則は 1 つ、アップミックスの動作は 2 通りです。
レイアウトとスピーカーの役割
| レイアウト | チャンネル数 | 役割(標準順) |
|---|---|---|
| モノラル | 1 | (役割なし。単一チャンネル) |
| ステレオ | 2 | L, R |
| 5.1 | 6 | L, R, C, LFE, Ls, Rs |
| 7.1 | 8 | L, R, C, LFE, Ls, Rs, Lss, Rss |
標準順は WAVE_FORMAT_EXTENSIBLE と一致します。7.1 では Ls/Rs(index 4/5)と Lss/Rss(index 6/7)は別名の同じペアではなく、別個の 2 組の役割です。それぞれがどこに位置するかは 広げる方向 を参照してください。
下の図は、各役割をリスナーの周りに並べ、プレーン番号を添えたものです。ラウドネス計測では、スピーカーが左右どちらかの 60° から 120° の間にあるチャンネルを +1.5 dB で重み付けします。そのため 5.1 のサラウンドペアと 7.1 の側方ペアは重み付けされ、7.1 の後方ペアはされません。
- L / R フロントペア
- C センター
- Ls / Rs サラウンド(7.1 では後方)
- Lss / Rss 側方
- ラウドネスの重み +1.5 dB(60°〜120°)
- LFE:方向なし、ラウドネス合計に含めない
LFE(低域効果音)は、デコーダーがサブウーファーへ渡す途中で約 10 dB 持ち上げる前提で、レベルを落として混ぜられた低域成分だけを運びます。再生レンダラーでは、出力先での LFE の扱いが次の 3 つの規則で決まります。ほかで使う共通の downmix は、includeLfe を指定しない限り LFE を捨てるだけです(狭める方向を参照)。
- 折り込み(出力先に LFE チャンネルが無い、または低音管理にサブウーファーが無い場合): LFE 信号を 120 Hz でローパスし、レベルを落として L/R ペアに加算します。
- サブウーファー供給(低音管理が有効でサブウーファーがある場合): LFE 信号を持ち上げ、
"small"に指定したスピーカーからクロスオーバーした低域成分と合わせて LFE チャンネルへ送ります。 - 低音管理が無効で、出力先が LFE チャンネルを持つ場合、LFE チャンネルはそのまま素通しします。後段のアンプが自前で +10 dB を掛ける前提だからです。
モジュール別のチャンネル対応
ライブラリの大半は モノラルかステレオだけを処理し、それより広い入力は拒否します。サラウンドのチャンネル数を受け付けるのは以下のモジュールだけで、それぞれ自分が出力する幅より広い素材をどう扱うかが異なります。
| モジュール | 受け付ける幅 | ステレオより広い場合の扱い |
|---|---|---|
| 音声ファイルの読み込み | モノラルに畳むか、インターリーブのバッファをそのまま通す | 1/2/6/8 チャンネルのファイルは下記の BS.775 ダウンミックスでモノラルに畳み、それ以外の数は平均します |
| 解析・ストリーミング解析 | モノラルのみ | 呼び出し側が先に畳みます |
ラウドネスメーター(lufsInterleaved) | 任意のチャンネル数 | チャンネル数に応じて BS.1770 のチャンネル重みを選びます |
| True Peak・相関・フェーズスコープ | モノラル/ステレオ | 拒否 |
| ワンショットエフェクトとマスタリングプロセッサ | 1–2 | 拒否 |
リペアセッション(masteringRepairAnalyze / masteringRepairApply) | 空でない任意のプレーナー形式のチャンネル集合 | 選んだ処理を全チャンネルに適用。デノイズとデリバーブはマスクを共有します |
| リアルタイムプロセッサ(ダイナミクス、EQ など) | 最大 64 チャンネル(プレーナー形式) | チャンネルごとに動作。ステレオペア専用のエフェクトは、幅広のバスでも前方ペアにしか作用しません |
| ミキシングのバス・ストリップ・メーター | 1 / 2 / 6 / 8 | バスが宣言したレイアウトに従います |
| ミキサーグラフ | 宣言どおりのバス幅 | より狭い宛先(小さいバス、ステレオのサイドチェーンキー)には BS.775 ダウンミックスが掛かり、より広い宛先には入力側のチャンネルがそのまま渡ります |
| リアルタイムエンジン / プロジェクトのバウンス | バスのレイアウト。出力は 1 / 2 / 6 / 8 | ミキサーグラフと同じ規則。マスターバスより広い要求は拒否されます。AudioWorklet では、5.1 または 7.1 の出力先のメータースナップショットにチャンネルごとの配列が加わります |
リアルタイムエンジンのトラックレーン(setTrackLanes) | ステレオのソースのみ | モノラル、5.1、7.1 のソースは拒否されます(InvalidParameter。WASM の worklet ファサードは RangeError)。ゼロ初期化したレーンはモノラルとして読まれるため、C の呼び出し側は SONARE_CHANNEL_LAYOUT_STEREO を設定します。setTrackLanes は MAX_TRACK_LANES(32)を超えるレーン数、−1〜+1 の外のレーンのパン、0〜2 の外の幅、フェーダー範囲外の値も拒否します |
| リアルタイムボイスチェンジャー | 1–2 | 拒否 |
| 再生レンダラー | 1 / 2 / 6 / 8、および channel map | 下記の変換表に双方向で従います |
channel map による入力レイアウトの宣言
デコーダーごとにチャンネル順は異なります。AAC は C L R Ls Rs LFE の順で、フレームワークによっては "5.1" と "5.1(side)" を区別し、プラットフォーム API もそれぞれ独自の並びを持ちます。再生レンダラーの input.channel_map は各入力チャンネルの役割を明示的に指定します(このとき input.layout は "auto" ではなく固定レイアウトである必要があります)。呼び出し側がそれぞれ自前でバッファを並べ替える必要はなく、誤った map はチャンネルが黙って入れ替わったり欠けたりするのではなく、検証エラーとしてはっきり失敗します。5.1(side) の SL/SR チャンネルは Ls/Rs の役割に対応付けられます。役割名は「左右のサラウンド」を意味し、実際にどの角度に置かれるかは入力側のラベルではなく出力側が決めます。
狭める方向(ダウンミックス)
サラウンドバスをより狭いレイアウトへ出力するすべてのモジュール(ファイル読み込み、ミキサーグラフ、プロジェクトのバウンス、再生レンダラー)は、同じ ITU-R BS.775 係数を使います。係数はミキシングモジュールの downmix として公開されています。BS.775 自体が定めているのは 5.1 までのダウンミックスで、以下の 7.1 の規則は、サイドのペアをサラウンドのペアへ折り込む形でそれを拡張したものです。サラウンドペアはレベルを落としてフロントペアに折り込まれ、LFE チャンネルは計算から外れます。downmix は includeLfe を指定しない限り捨て、再生レンダラーは上記の LFE 折り込みを自前で行います。JavaScript では同じ係数が downmix(channels, targetLayout) です。センターとサラウンドは -3 dB でフロントペアに入り、LFE チャンネルは捨てられます。decodeChannels(bytes) はファイルの全チャンネルを保持するので、自分で狭められます。Audio.fromMemoryWithBrowserFallback のブラウザコーデックへのフォールバックもこの規則でモノラルに畳むため、どちらのデコーダーでも同じサンプルになります。
downmix は元のレイアウトをチャンネル数(1、2、6、8)から読み取ります。出力先は ChannelLayout の序数で、0 がモノラル、1 がステレオ、2 が 5.1、3 が 7.1 です。
| 元 | 出力先 | 規則 |
|---|---|---|
| ステレオ | モノラル | L と R の単純平均 |
| 5.1 または 7.1 | モノラル | 下のステレオへの折りたたみを行い、2 チャンネルを平均 |
| 5.1 | ステレオ | L + 0.707 C + 0.707 Ls。右側も同様。LFE は捨てる |
| 7.1 | ステレオ | 5.1 と同じ規則に、Ls と並べて Lss を -3 dB で加える |
| 7.1 | 5.1 | Ls + Lss と Rs + Rss をゲイン 1 で加算。ほかのチャンネルはそのまま |
| 同じレイアウト | 同じレイアウト | コピー |
| 任意 | より広いレイアウト | 拒否(InvalidParameter、"downmix cannot upmix") |
| 上記以外のチャンネル数 | モノラル | チャンネルの重みなし平均 |
| 上記以外のチャンネル数 | モノラル以外 | 拒否(InvalidParameter) |
折りたたみは既定では正規化されません
この折りたたみは、フルスケールに収まるようには調整されません。フルスケールで同相の 5.1 ソースは、ステレオでもモノラルでも 2.41 に達し、7.1 ソースはステレオで 3.12 に達します。Audio.fromMemory で 5.1 ファイルを読み込むときも同じ折りたたみを使うため、フルスケールを超えることがあります。書き出す前に下記の normalize を指定するか、リミットしてください。
折りたたみには 2 つのオプションがあります。normalize は出力を最悪ケースの合計で割ります。全プレーンがフルスケールで同相のソースがちょうど 1.0 になり、割る値はレイアウトで決まる固定値で信号から測るものではないため、一般的な素材は数 dB 小さくなります。includeLfe は LFE プレーンを捨てる代わりに -3 dB でフロントペアへ折り込み、同じ最悪ケースは 3.12(5.1)または 3.83(7.1)に上がります。どちらもステレオやモノラルへ狭める折りたたみに効き、7.1 から 5.1 への折りたたみはどちらの設定でも LFE プレーンをそのまま残します。JavaScript では { normalize, includeLfe }、Python では normalize=・include_lfe=、C では sonare_downmix_ex です。
import { init, decodeChannels, downmix } from '@libraz/libsonare';
await init();
const { channels, sampleRate } = decodeChannels(fileBytes);
const stereo = channels.length > 2 ? downmix(channels, 1) : channels;from libsonare import decode_channels, downmix, ChannelLayout
channels, sample_rate = decode_channels(file_bytes) # (channel_count, frames), float32
stereo = downmix(channels, ChannelLayout.STEREO) if channels.shape[0] > 2 else channelsシグネチャは JavaScript/TypeScript Audio・ストリーミング API、C と C++ の形は C++ API を参照してください。ミキサーグラフ自身の狭める規則は サラウンドグループバスとワイドメーター にあります。
再生レンダラー自身の変換表を、入力と出力先ごとに示します。「バイノーラル化」は、スピーカーへの信号を測定した頭部伝達関数(HRTF)でフィルタリングし、音がヘッドホンの外側にあるように聞かせることです。
| 入力 \ 出力先 | ステレオスピーカー | 5.1 スピーカー | 7.1 スピーカー | ヘッドホン |
|---|---|---|---|---|
| モノラル | L/R、-3 dB | センターのみ | センターのみ | センター(バイノーラル化) |
| ステレオ | 素通し | アップミックス(upmix.enabled: false なら L/R のみ) | アップミックス(または L/R のみ) | アップミックス後にバイノーラル化(または ±30° の L/R のみ) |
| 5.1 | BS.775 ダウンミックス + LFE 折り込み | 素通し | L/R/C/LFE はそのまま。Ls/Rs は Lss/Rss へ移動し、7.1 自身の Ls/Rs は無音 | 5.1(バイノーラル化) |
| 7.1 | BS.775 ダウンミックス + LFE 折り込み | BS.775 ダウンミックス(LFE はそのまま) | 素通し | 7.1(バイノーラル化) |
広げる方向(アップミックス)
ミキサーと再生レンダラーでは、チャンネル構成を広げる方法が異なります。ミキサーは狭いバスの信号を広いバスの同じインデックスのチャンネルへ加算し、追加のチャンネルは無音のままにします。再生レンダラーはスピーカーの配置に基づいて、広い構成へアンビエンスを割り当てます。
| 変換 | ミキサー | 再生レンダラー |
|---|---|---|
| 5.1 → 7.1 | Ls/Rs はインデックス 4・5 に残り、インデックス 6・7 の側方チャンネルは無音 | Ls/Rs はインデックス 6・7 の側方チャンネルへ移り、インデックス 4・5 の後方チャンネルは無音 |
| ステレオ → 7.1 | フロントペアのみ。ほかは無音 | 後方・側方の両方にアンビエンスを生成し、後方ペアには逆相成分も加える |
サラウンドパンナーは両モジュールとも 配置図 の角度を使いますが、パンしたソースの配置にだけ使われ、バスをどう広げるかは決めません。フルパンでは、パンナーは反対側のチャンネルを完全に無音にします。
再生レンダラーは 5.1 の入力から後方ペアを合成することはせず(後方チャンネルの人工的な生成は行いません)、高さを加えた広いフォーマットへのアップミックスも行いません。詳しくは 再生レンダラー § 非対象 を参照してください。