2016年5月20日金曜日

1.3 Panner with interpolation

改良したパン



パンの変数 c を調整したときの問題として、
実際に入力されている音声信号を変更しているのではなく、
FAUST は、毎 n サンプル(ホストマシンに依存する)ごとに
変更が行なわれているということです。


よって、ユーザーがどんなにスムーズにスライダーを動かしても、
常にサンプリングレートに影響されるし、
新しい値に飛び越えて移動したりするので、
クリックノイズのような音が聞こえたりします。


この問題の解決法は、なんらかの方法で、
変数 c の値が連続してとる値の間を補完していくことです。

それは、音声信号をローパスフィルターでコントロールするのと同じように、
変数 c をフィルタリングすることと同じようなものです。

例えば、`smooth` 関数を用いて行えます。
(FAUSTライブラリの `Filter.lib` (Julius O. Smith) の中にあります。)

`smooth` 関数は、同じライブラリにある他の関数と同じように引数をとる、
ローパスフィルターです。

`tau2pole` 関数は、`smooth`関数のパラメータを設定するのに用いる関数で、
変数 t (秒)をスムージングタイムとして、
`smooth( tau2pole (t) ) `とすれば、
パンの変数 c を調節した際に、
補完した値を出力できるようになります。

どのくらいの値を設定しなければならないのかは、
下のFig1.4のグラフを参考にしてください。



Figure1.4. 緑の線は  `smooth(tau2pole)`関数を使った信号です。
赤線からも二段階に分けられるのがわかります。

0 サンプルの部分で 0から1に値をとり、
200 サンプルの部分で 1から0に値をとっています。

`tau2pole` の引数は50サンプルになるように設定されています。


しかし、`smooth(tau2pole)`関数は、
50サンプル後に目標値に達していません。
なぜなら、指数関数を使って漸近的に値に近づくからです。

実際には、0から1に値が動く部分をみると、
50サンプル後に届く値は、 1 e1 0.63 です。 
そして、200サンプル後に極めて1に近づきます。

似たような動きは、0に値が向かう時にもみられます。
50サンプル経た部分で(グラフでは250サンプルの位置)、
値は0.37に近似したものをとり、0に達します。

この `smooth(tau2pole)`関数の
遅延箇所(引数と実際の目標値に達するまでの差)は、
苦労する設定部分ですが、
より厳密な補完を行うためには、
`tau2pole`関数の引数をより小さく設定していかなければなりません。
例えば、理想とする時間の4分の1ぐらいに設定します。


別のローパス関数を選ぶこともできますが、
直接答えにたどり着くより、時間をかけて、
実際にこのパラメータを設定することが大事です。


この「補完機能」を先のソースコードに組み込んでみましょう。
パンの変数 c をコントロールするスライダーに加えて、
補完時間の変数 t をコントロールするスライダーが表示されます。



import("filter.lib") ;
t = hslider("interpolation time", 0.001, 0, 0.01, 0.0001);
c = hslider("pan", 0.5, 0, 1, 0.01) : smooth(tau2pole(t)) ;
process = _<: *(1-c : sqrt), *(c : sqrt);






`smooth`関数と、`tau2pole`関数を使うために、
ソースコードの一番最初の行で、`filter.lib`を読み込みます。

同じように、別途読み込みが必要なライブラリがある際は、
architectureディレクトリに.libファイルを置くことで、
.dspファイルと同じように開くことができます。

ライブラリを読み込む際には、
関数名が重複しないように注意しなければいけません。

重複した際には、下のようなエラーメッセージが表示されます。


ERROR: redefinition of symbols are not allowed : 
BoxIdent[****] is already defined in file "****.lib" line ** 


もちろん、Faustライブラリ内の関数を用いる別の方法として、
直接自分の.dspファイルのコード内に、関数をコピーして書き込む方法もあります。
(他の関数についても同じです。)

最後に、Fig.1.5のsvgダイアグラムを見ると、
`smooth(tau2pole)`モジュールが挿入されているのがわかります。

また、`process:`内部にある2つの c は、
画像上のものであって、
実際には、それぞれ2度計算されているわけではない、
ということに注意してください。



0 件のコメント:

コメントを投稿