Faust:soft clipperを作ってみた2 もっと使いやすいやつ

[Faust:soft clipperを作ってみた](https://qiita.com/ttatsf/items/6d91c87d85a0b575863c)の続きです。
これで実用上問題ないし実際使えているのですが、

+ 漸近する曲線を使っているので、0dBぴったりにはならない。飽和したときに0dBになると何かと便利。
+ かかり具合は音で判断。まあそれでいいのだがもうすこし視覚的にも効果を把握したい。

考え方としては、```y = x``` と ```y = 1``` を二次曲線で滑かにつなぐ、的な感じです。

+ clipフェーダーが -a dB の時、入力 -a dB でサチり始め、入力 +a dB で出力が飽和して 0dB になるようにしたら把握しやすいのでは?
+ 単に関数をなぞる( ```y = f(x)``` )のではなく、xかける増幅率 の形( ```y = x * g(x)``` )にしておけば、表示もしやすいのでは?
 
と思いたち、そういう変形をしてます。

```js:
declare name "sqClip";

import("stdfaust.lib");

process = preGain : clipper : postGain  ;

preGain = preGainMono, preGainMono ;
preGainMono = *( preSlider : ba.db2linear )  ;

clipper = clipperMono(vuMeterL), clipperMono(vuMeterR) ;
clipperMono( m, x ) = clipGain( clipSlider, x) <: _, meter(m) : attach : *(x) ;
clipGain( s, x ) =  f0,f1,f2,f3 : ba.selectn(4,nx)
  with{
    w = s : ba.db2linear;
    c0 = abs(x) <= w ;
  	c1 = (abs(x) > w) & (abs(x) <= 1) ;
  	c2 = (abs(x) > 1) & (abs(x) <= 1/w) ;
  	c3 = abs(x) > 1/w ;
  	nx = ba.if(c0,0,0) : ba.if(c1,1) : ba.if(c2,2) : ba.if(c3,3);
    f0 = 1 ;
    f1 = abs(x)/(2 * (w^2 - 1)) + (w^2 - w - 1)/(w^2 - 1) + 1/abs(x) * w^2 / (2 * (w^2 - 1)) ;
    f2 = abs(x) * w^2 / (2 * (w^2 - 1)) - w / (w^2 - 1) + 1/abs(x) * (2 * w^2 - 1) / (2 * (w^2 - 1)) ;
    f3 = 1 / abs(x) ;
  };
meter(m) = _ : ba.linear2db : si.smoo : m ;
postGain = postGainMono, postGainMono ;
postGainMono = *( postSlider : ba.db2linear ) ;

clipGrp(x) = hgroup("[0]Clip", x ) ;
ctrlGrp(x) = clipGrp(hgroup("[0]Ctrl", x )) ;
meterGrp(x) = clipGrp(hgroup("[1])Meter", x )) ;
preSlider = ctrlGrp(vslider("[0]pre[unit:dB]", 0, 0, 20, 1 )) ;
clipSlider = ctrlGrp(vslider("[1]clip[unit:dB]", -1, -30, -1, 1 )) ;
postSlider = ctrlGrp(vslider("[2]post[unit:dB]", 0, -10, 10, 1 )) ;
vuMeterL = meterGrp(vbargraph( "[0]GR L[unit:dB]", -20, 1 ));
vuMeterR = meterGrp(vbargraph( "[1]GR R[unit:dB]", -20, 1 ));
```

ちょうどよさげな傾き。```y```ってなってるけど ```y'```とか```dy/dx```とかっていうことです。
![スクリーンショット 2017-12-21 15.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/61597/f2ceafd2-3d1d-9b11-60d9-badb90d023b1.png "スクリーンショット 2017-12-21 15.18.56.png")
よさげ、っていうのは：

+ 滑かな二次曲線にしたい -> 傾きは連続した折れ線
+ 入力が小さいうちは傾き ```1``` で
+ 入力 -a dB でサチり始め -> ```|x|= w (= 10^(-a/20)```から減り始め
+ 入力 +a dB で出力が飽和して -> ```|x|=1/w```で傾き ```0``` 。
+ 飽和して0dB になる -> ```0``` から ```1/w``` まで積分すると ```1```。

この条件を満すために、```|x|=1```で折れ線になってます。


そこから作った入力-出力。積分してみました。
![スクリーンショット 2017-12-21 15.19.22.png](https://qiita-image-store.s3.amazonaws.com/0/61597/092cff8d-e57c-cfe5-9d0e-d79f5b6ae1b4.png "スクリーンショット 2017-12-21 15.19.22.png")

それを```x``` で割った増幅率。
![スクリーンショット 2017-12-21 15.19.43.png](https://qiita-image-store.s3.amazonaws.com/0/61597/49a24bcd-f8af-357c-81bf-2a87f0f61df4.png "スクリーンショット 2017-12-21 15.19.43.png")

VSTにしてみました。[Faust&JUCEによる超高速VST開発](https://qiita.com/tomoyanonymous/items/79b3e551984a707b5c9a)
ちゃんと動いてます。
![スクリーンショット 2017-12-21 15.13.02.png](https://qiita-image-store.s3.amazonaws.com/0/61597/aaf16409-512b-9b76-c3c6-09c2701daf86.png "スクリーンショット 2017-12-21 15.13.02.png")



 ``` <,> ``` と ```&```と演算子の優先度が同じなのかも。いや```&```の方が上かな?
 グラフにする時はうまくいってた風だったけど、vstにするときにかっこで演算順を明示しないと「引数がfloatとfloatだよ」的なエラーが出てうまくいかなかった。

条件分岐がどうやっていいかわからなかったりする。こんなんでよかったのかな?
もっといい方法があればコメントおねがいします。