これは実際には理論的な問題ですが、次のようになります。
エフェクト オーディオ ユニットを開発していますが、ドライ信号とウェット信号の間で等しいパワーのクロスフェードが必要です。
しかし、ドライ ストリームとウェット ストリームの信号振幅のリニア フェーダーからスケーリング ファクター (ゲイン) へのマッピング機能を実行する正しい方法について、私は混乱しています。
基本的に、cos / sin関数または平方根で行われるのを見ました...本質的に対数曲線を近似しています。しかし、私たちの振幅の知覚が最初から対数的である場合、フェーダー位置を振幅にマッピングするこれらの曲線は実際には指数関数的ではないでしょうか?
これが私が意味することです:
仮定:
signal[i]
信号の i 番目のサンプルを意味します。- 各サンプルは、[0,1] の間の振幅に対して [-1, 1] の範囲の float です。
- GUI コントロールは [0,1] の範囲の NSSlider であるため、原則として線形です。
fader
NSSlider の値を持つ変数です。
最初の観察:
対数的に振幅を知覚します。したがって、線形フェーダーがあり、信号の振幅を調整するだけの場合:signal[i] * fader
私たちが知覚しているもの (数学に関係なく聴覚) は、次のようなものです。
これはいわゆるくだらないフェーダー効果です。スライダーの左端のセグメントで無音から劇的な音量増加に移行し、中央を過ぎると音量がそれほど大きくならないように見えます。
したがって、フェーダーを「正しく」行うには、代わりに dB スケールで表現してから、信号に関する限り、次のようにします。signal[i] * 10^(fader/20)
または、[0,1] でフェーダー単位を保持する場合は行う :signal[i] * (.001*10^(3*fader))
いずれにせよ、NSSlider からコード内で乗算に使用するフェーダー変数への新しいマッピングは、次のようになります。
対数的に振幅を知覚するため、基本的に線形(NSSLider 範囲 0-1) から指数関数にマッピングし、この指数出力を対数知覚に供給するため、これが実際に必要なことです。そして、次のことが判明しました。つまりlog(10^x)=x
、振幅の変化を線形 (つまり正しい) 方法で知覚することになります。
偉大な。
ここで、私の考えでは、2 つの信号間の等パワー クロスフェード (この場合、AU への入力とそこからの処理済み出力を混合するためのドライ/ウェット水平 NSSlider) は、1 つのスライダーが作用する場合と本質的に同じです。仮想信号 dry[i] と wet[i] の両方。
したがって、スライダーの範囲が 0 から 100 で、ドライが左いっぱい、ウェットが右いっぱいの場合、コードは次のようになります。
Float32 outputSample, wetSample, drySample = <assume proper initialization>
Float32 mixLevel = .01 * GetParameter(kParameterTypeMixLevel);
Float32 wetPowerLevel = .001 * pow(10, (mixLevel*3));
Float32 dryPowerLevel = .001 * pow(10, ((-3*mixLevel)+1));
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel);
そのグラフは次のようになります。
前と同じように、対数的に振幅を知覚するため、この指数マッピングは、実際には、クロスフェードが線形として聞こえる場所になるはずです。
ただし、近似を使用して曲線を記録するクロスフェードの実装を見てきました。代わりに、次のことを意味します。
しかし、これらの曲線は実際には振幅の対数的知覚を強調しているのではないでしょうか?