soundstage_extender
ノードミックスで決まった定位を起点に、ステレオ音像を拡張します。広がった音はさらに外へ、端の音はスピーカーの外まで出し、センターの音と残響はそのまま残します。
パラメータ
{
"amount": 1,
"outside_deg": 45,
"speaker_angle_deg": 30,
"type": "soundstage_extender"
}計算
STFTのマスごとに(窓は48kHzの1024サンプルと同じ長さ、ホップは1/4):
1. L/Rの共分散を約30msで平滑する
2. u = その主固有ベクトル = [cos ψ, sin ψ · e^(jφ)]
c = (λ1 - λ2) / (λ1 + λ2) そのマスが1つの直接音である度合い
3. p = uᴴ x (直接音) a = x - u · p (残響)
4. ψから出すパン位置を amount で拡張し、
push_from から端までを outside_deg だけ外へ押し出す
動かす量は c に比例させる
5. スピーカーの内側:新しい角度で p をパンし直す
外側:送り = (Hᴴ H + β I)⁻¹ Hᴴ · d(θ)
H = スピーカーから耳、d = θにある音源が両耳に作る信号(球頭モデル)
6. 出力 = 置き直した p + a使うときの注意
すでに広がっている音だけを動かします。
センターの音と残響には触れません。半分ほど振られた音はさらに外へ、端の音はスピーカーの外へ動くので、ミックスの左右の並び順は変わりません。
外への定位にはスイートスポットが必要です。
左右のスピーカーの真ん中に頭があり、スピーカーが speaker_angle_deg の位置にある前提で計算しています。数cmのずれなら保たれますが、10cmほどずれると音像はスピーカーの内側へ戻ります。ヘッドホンでは効きません。
窓1つ分の遅延が加わります。
約21ms(44.1kHz系の素材では約23ms)です。再生中にこのノードを足したり外したりすると、その長さだけ音が途切れます。値を変えるだけなら途切れません。
重なっている音は動きが小さくなります。
同じ瞬間に同じ周波数を2つの音が分け合うと、そのマスは2つの間を向くため、どちらも目標まで動きません。外れるのは常に控えめな側で、指定より外へ押し出されることはありません。
crosstalk_canceller とは併用しないでください。
どちらもクロストークを打ち消す処理です。重ねると打ち消しが二重に掛かります。