LoginSignup
4
5

More than 5 years have passed since last update.

Faust:自分好みのディストーションを作ってみた

Last updated at Posted at 2018-01-02

ギターは弾かないんですけどディストーションはときどき使います。
綺麗すぎる音を派手に汚したり、古さや暖かさが欲しいときに軽くかけたり。

DAWを64bit環境にしたら今まで使っていたのが使えなくなってしまったんで、これも作ってみました。

ディストーションにはいろんな種類があるようですが、ぼくが作ったのはトランスのシミュレーションです。

  • degradeで高域特性
  • lossでヒステリシス損
  • clip部分で飽和

を調整します。

ヒステリシスは、ちゃんとシミュレーションすると大変なことになりそうだったので、ちょっとだけ過去をひきずった感じで動けばよくね? 程度の実装です。

  • 入力を正負に分け
  • それぞれエンベロープフォロワにかけ
  • 再び合成 (エンベロープフォロワ内にabs()が入っているのでここでは減算)

みたいなことです。
いわゆるオーディオレートで使うため、エンベロープフォロワはかなり速く動かしてます。そこが普通とちょっと違うかな。

Hystortion.dsp
declare name "Hystortion";
import("stdfaust.lib");
s_c = library("SQClip.dsp");

process = HystST : s_c.process  ;


HystST = HystMono( ds, ls ) , HystMono( ds, ls )
  with {
    ds = degradeSlider : /(100000.0) ;
    ls = lossSlider : /(100000.0) ;
  };
HystMono(degrade, loss) =
  _<: max(0), min(0)
  : an.amp_follower_ud( degrade, goodRel ) , an.amp_follower_ud( degrade, goodRel )
  : -
  with {
    goodRel = max( degrade, loss);
  };

hystGrp( x ) = vgroup("[00]Hyst", x );
ctrlGrp( x ) = hystGrp(hgroup("[0]", x ));
degradeSlider = ctrlGrp(vslider("[0]degrade[style:knob]", 10, 1, 20, 1));
lossSlider = ctrlGrp(vslider("[1]loss[style:knob]", 20, 1, 80, 1));

飽和部分は前に作ったやつのつかいまわしです。GUIだけ調整しました。

SQClip.dsp
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 ));

この二つのファイルを同階層に置いてFaust LiveからVSTを作りました。
Faust&JUCEによる超高速VST開発
Faust Liveからも同様にできます。
とりあえずFaustを始めたい人のための4つの環境
右クリックして Export As...

後は一緒です。

出来上がったVSTプラグイン。

音は...うん。歪んでる。ぼくの好きな感じです。
lossコントロールを新たに加えたのでバリエーションが広がったかな。
前使ってたのよりいいかも。使える。

4
5
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
4
5