Faust:soft clipperを作ってみたの続きです。
これで実用上問題ないし実際使えているのですが、
- 漸近する曲線を使っているので、0dBぴったりにはならない。飽和したときに0dBになると何かと便利。
- かかり具合は音で判断。まあそれでいいのだがもうすこし視覚的にも効果を把握したい。
考え方としては、y = x
と y = 1
を二次曲線で滑かにつなぐ、的な感じです。
- clipフェーダーが -a dB の時、入力 -a dB でサチり始め、入力 +a dB で出力が飽和して 0dB になるようにしたら把握しやすいのでは?
- 単に関数をなぞる(
y = f(x)
)のではなく、xかける増幅率 の形(y = x * g(x)
)にしておけば、表示もしやすいのでは?
と思いたち、そういう変形をしてます。
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
とかっていうことです。
よさげ、っていうのは:
- 滑かな二次曲線にしたい -> 傾きは連続した折れ線
- 入力が小さいうちは傾き
1
で - 入力 -a dB でサチり始め ->
|x|= w (= 10^(-a/20)
から減り始め - 入力 +a dB で出力が飽和して ->
|x|=1/w
で傾き0
。 - 飽和して0dB になる ->
0
から1/w
まで積分すると1
。
この条件を満すために、|x|=1
で折れ線になってます。
VSTにしてみました。Faust&JUCEによる超高速VST開発
ちゃんと動いてます。
<,>
と &
と演算子の優先度が同じなのかも。いや&
の方が上かな?
グラフにする時はうまくいってた風だったけど、vstにするときにかっこで演算順を明示しないと「引数がfloatとfloatだよ」的なエラーが出てうまくいかなかった。
条件分岐がどうやっていいかわからなかったりする。こんなんでよかったのかな?
もっといい方法があればコメントおねがいします。