LoginSignup
0
3

More than 5 years have passed since last update.

Faust:色付けのないLPF,HPFを作ってみた

Last updated at Posted at 2018-02-21

Faustで自分が使い易いプラグインを作って、DAWで使ってます。
簡単に作れるし、音も使い勝手も思い通りになるので、ごきげんな感じです。

ここんとこ結構いろものを作ったんで、地味なフィルター類を作ってみました。
次数の切り替えられるバターワースとリンクウィッツ-ライリーのフィルターです。
レゾナンスがつかず切れ味すっきり。ミックスの時にはむしろこっちのほうがよく使います。
特にHPF。

つくりはどれもほとんど同じです。

HPFBW.dsp
declare name "HPFBW";
import("stdfaust.lib");

process = HPFBWMono( order, fs ), HPFBWMono( order, fs );
HPFBWMono( order, fs ) = _
                      <: par( i, 4, fi.highpass( i+1, fs) )
                      : ba.selectn( 4, order-1 ) ;
fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
order = slope / 6 ;

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]HPFBW", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 6, 24, 6 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;
LPFBW.dsp
declare name "LPFBW";
import("stdfaust.lib");

process = LPFBWMono( order, fs ), LPFBWMono( order, fs );
LPFBWMono( order, fs ) = _
                      <: par( i, 4, fi.lowpass( i+1, fs) )
                      : ba.selectn( 4, order-1 ) ;
fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
order = slope / 6 ;

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]LPFBW", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 6, 24, 6 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;
HPFLR.dsp
declare name "HPFLR";
import("stdfaust.lib");

process = HPFLRMono( order, fs ), HPFLRMono( order, fs );
HPFLRMono( order, fs ) = _
                      <: par( i, 2, seq( j, 2, fi.highpass( i+1, fs ) ) )
                      : ba.selectn( 2, order-1 ) ;
fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
order = slope / 12 ;

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]HPFLR", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 12, 24, 12 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;
LPFLR.dsp
declare name "LPFLR";
import("stdfaust.lib");

process = LPFLRMono( order, fs ), LPFLRMono( order, fs );
LPFLRMono( order, fs ) = _
                      <: par( i, 2, seq( j, 2, fi.lowpass( i+1, fs ) ) )
                      : ba.selectn( 2, order-1 ) ;
fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
order = slope / 12 ;

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]LPFLR", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 12, 24, 12 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;

FaustLiveでJuce vstで書き出し、Xcodeでビルドしました。

スクリーンショット 2018-02-21 14.56.05.png

どれも良い感じでキレてます。スライダーの感じもなかなか良い。

はまったところ

fi.lowpass(),fi.highpass()は次数が変えられるんだけど、コンパイル時には決ってないといけないみたいです。動的なままだと通らなかった。

あと、周波数リニアでなくオクターブスケールのスライダーがあったらいいな。

追記:同じところを括りだしてみた

とりあえずコピペで四つ作ってみたんですが、同じだなあと思い、同じところを .lib にまとめてみました。

filterWithOrder.lib
import("stdfaust.lib");

orderSelectedFilter( filterWithOrder, maxOrder, order, fs ) = _
                      <: par( i, maxOrder, filterWithOrder( i+1, fs ) )
                      : ba.selectn( maxOrder, order-1 ) ;

doubledFilter( filterWithOrder, order, fs ) =
      seq( j, 2, filterWithOrder( order, fs ) ) ;

orderSelectedFilter()のイメージ。4次の場合。
スクリーンショット 2018-02-22 12.52.23.png
次数を動的には変えられないので、1次から4次まで全部たちあげてselectn()で選ぶ、という作戦です。

doubledFilter()のイメージ。
スクリーンショット 2018-02-22 12.52.34.png
同じものを二つ直列。引数で次数と周波数を渡せるようにしてます。
バターワースフィルターからリンクウィッツ-ライリーフィルターを作るとき使います。

それぞれこんな感じになりました。

HPFBW.dsp
declare name "HPFBW";
import("stdfaust.lib");
import("filterWithOrder.lib");

process = par( i, 2, orderSelectedFilter( filterWithOrder, maxOrder, order, fs))
  with{
    maxOrder = 4 ;
    filterWithOrder = fi.highpass ;
    fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
    order = slope / 6 ;
  };

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]HPFBW", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 6, 24, 6 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;
LPFBW.dsp
declare name "LPFBW";
import("stdfaust.lib");
import("filterWithOrder.lib");

process = par( i, 2, orderSelectedFilter( filterWithOrder, maxOrder, order, fs))
  with{
    maxOrder = 4 ;
    filterWithOrder = fi.lowpass ;
    fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
    order = slope / 6 ;
  };

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]LPFBW", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 6, 24, 6 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;
HPFLR.dsp
declare name "HPFLR";
import("stdfaust.lib");
import("filterWithOrder.lib");

process = par( i, 2, orderSelectedFilter( filterWithOrder, maxOrder, order, fs))
  with{
    maxOrder = 2 ;
    filterWithOrder = doubledFilter( fi.highpass );
    fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
    order = slope / 12;
  };

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]HPFLR", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 12, 24, 12 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;
LPFLR.dsp
declare name "LPFLR";
import("stdfaust.lib");
import("filterWithOrder.lib");

process = par( i, 2, orderSelectedFilter( filterWithOrder, maxOrder, order, fs))
  with{
    maxOrder = 2 ;
    filterWithOrder = doubledFilter( fi.lowpass );
    fs = ba.midikey2hz( note ) : attachSmooM( freqMeter ) ;
    order = slope / 12;
  };

attachSmooM( m) = _ <: _, (si.smoo : m ) : attach ;

filterGrp( x ) = vgroup("[0]LPFLR", vgroup("[0]",( vgroup("[0]", x ))));
slope     = filterGrp(hslider("[1]Slope[unit:dB]", 12, 12, 24, 12 ));
note      = filterGrp(hslider("[2]note", 69.0 ,15.0, 136.0, 0.0));
freqMeter = filterGrp(hbargraph("[3]Freq[unit:Hz]", 20, 20000 ) ) ;

わーいみんな同じになったー。読みやすいかはまた別。
次数を動的に変えたい何かを作るとき参考になるかも。

0
3
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
0
3