2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-21

Faust:soft clipperを作ってみたの続きです。
これで実用上問題ないし実際使えているのですが、

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

考え方としては、y = xy = 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とかっていうことです。
スクリーンショット 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

それをx で割った増幅率。
スクリーンショット 2017-12-21 15.19.43.png

VSTにしてみました。Faust&JUCEによる超高速VST開発
ちゃんと動いてます。
スクリーンショット 2017-12-21 15.13.02.png

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

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?