2016年5月22日日曜日

2.1 S&H


2.1 S&H

"Sample & Hold" は 、
指定されたタイミングで信号を保持出力し(sample)、
その信号を新しい指令が来るまで出力し続ける(hold)関数です。

入力された新しい信号はすぐに出力されるようになります。
これはより複雑なものを開発していくのに不可欠な機能です。

それでは FAUST のソースコードを見てみましょう。


  1 but = button("Hold!") ;
  2 SH(trig,x) = (*(1 - trig) + x * trig) ~ _;
  3 process = SH(but) ; 



UIは非常に単純です。


"Hold!" とラベルされたボタンがあるだけです。
これは `but` 変数に格納されています。

もし、ボタンが押されると、ボタンは1、または0を返します。
それらが、`but` 変数のもつ値です。

その後、`SH` 関数が宣言されています。
最初の引数である、`trig` は、イベントを始める信号です。

第二引数の x 秒の間、サンプルが続けられます。


そして、 `process` にて `SH(but)` 関数が実行されています。
独特な引数を持っていることがわかります。
(イベントを起こす信号を SH 関数では、`trig`と呼んでいます)

割り当てがない間は、待ち受け状態になります。

`but`、ボタンの値は、SH関数が信号を受け入れ始める信号を送る役割を持ちます。



SH(trig, x )関数について、もう少し説明します。

もし、 trig = 1 ならば、 SH は x  と同じ値になり、
そうでなければ、その前の値を持ちます。
(t はその時の時間を表しています。)




この関数はこのように書き表せます。



`trig` が1または0の値を持ち続ける間、
1を持っていた場合、
最初に加えられるのは空白で、そして、2つめに与えられた値を残していきます。
0ならば、逆のことを行います。

もし、`trig`に間の値をもたせたならば、2つの加えられた値は凸結合となります。
例えば、SH t-1 (trig, x) と x の間では、線形の補完が行われます。

しかし今、不幸なことに、FAUST では、この書き方は意味がなく、
ユーザーは関数をこのように呼び出すことはできません。


ですが、"~"演算子を用いて、
右の出力を左の入力に送るといったことができます。
もちろん、 1 sampleの遅れが生じます。

SH関数を書いた行を見てみると、
先に表したSH t- 1 という部分を、
同じ値で終わるものにつなげていることが想像できます。

次のような具合です。





矢印は、ループする線を表しています。
この表現は、とてもFAUST Likeで、
時間の t に注意する必要がないばかりか、
FAUST の表現に置き換えてしまいます。

このように、正確なコードに適することができます。

SH( trig, x ) = ( * ( 1 - trig ) + x * trig ) ~ _;

それでは最後に、.svg ブロックダイアグラムを見てみましょう(fig2.1)。
"Looping Cable"が、Outputのケーブルからきて、
内部の * ブロックに戻っていくのがわかります。





0 件のコメント:

コメントを投稿