2016年5月18日水曜日

1.2 Panner maintaining global intensity

単純な Pan その2



実際に Pan を使うことを想定すると、
ミキシングのバランスに影響することなく音量を変えるために、
片方のチャンネルのバランスを変えても、
全体の音の大きさには影響しないパンを作るでしょう。


先の Pannerでは、
音声信号を掛け合わせるときに(Faust では S(c) 関数 )、
変数 c の値に比例して音を出力しています。

しかし、実際に私たちの耳に聞こえるのは、音の強度となります。
そして、その音の強度は出力の2乗になります。


I A


これより、一定の強度を保ち続けるパンを作るならば、
強度の合計が一定になるように、
また、出力の合計が一定にならないようにしなければなりません。

この状態を Condition(2) と呼びます。


I(c) = IL(c) + IR(c) A2L(c) + A2R(c) = const. 

よって、正しい出力時の正しいスケーリングは、
S(c) = (1-c, c)
ではなく、
S(c) = ( 1-c の平方根,  c の平方根)
となります。

このようにして、Condition(1)とCondition(2)を表すことができます。

A 2L ( c ) + A 2R ( c ) = A 2 ( 1 c 2 + c 2 ) = A 2


元の出力 A は、変数 c に対しては一定です。
よって、 S (c) は Condition(2) といえます。
また、 Condition (1) であるとも確認できます。

それではコードを書き換えてみましょう。



c = hslider("pan", 0.5, 0, 1, 0.01);
process = _ <: *((1-c) : sqrt), *((c) : sqrt);


実行画面


SVGダイアグラム





みて分かる通り、
単純に process 箇所で sqrt 関数を用いたのみのコードです。

sqrt 関数はプログラミング言語ではよく用いられ、
Faust でも平方根を表す関数として用いられます。

関数は " : " と一緒に用いられます。

演算子の優先順位に合わせて、先と同じコードを、カッコを省いても書けます。


process = <: *(1 - c : sqrt), *(c : sqrt);


また、好むならば、よりありふれた書き方でも大丈夫です。


process = <: *(sqrt(1 - c)), *(sqrt(c));


SVGで書き出したダイアグラムは下の図になります。





Fig1.3のグラフを見れば、R Channel、 LChannel ともに、
c=0.5のときに、同じ値をとることがわかります。
その値は 0.5 よりも大きく、前のパンでは0.5の値をとっていました。

前のパンの中央での音の響き方は、強度に対してとても弱かったことがわかります。




1−1 で挙がった強度の問題は解決しました。
それでは2つめのクリックノイズの問題について解決していきます。

0 件のコメント: