@@ -9,12 +9,17 @@ enum FilterModes
99 twoPole,
1010 fourPole,
1111 stateVariable,
12- numFilterModes
12+ numFilterModes,
13+ noFilter
1314};
1415
1516class OnePoleFilter
1617{
1718public:
19+ void Reset ()
20+ {
21+ a = 0.0 ;
22+ }
1823 double Process (double dt, double input, double cutoff, bool highPass = false );
1924
2025private:
@@ -24,6 +29,11 @@ class OnePoleFilter
2429class TwoPoleFilter
2530{
2631public:
32+ void Reset ()
33+ {
34+ a = 0.0 ;
35+ b = 0.0 ;
36+ }
2737 double Process (double dt, double input, double cutoff, bool highPass = false );
2838
2939private:
@@ -34,6 +44,13 @@ class TwoPoleFilter
3444class FourPoleFilter
3545{
3646public:
47+ void Reset ()
48+ {
49+ a = 0.0 ;
50+ b = 0.0 ;
51+ c = 0.0 ;
52+ d = 0.0 ;
53+ }
3754 double Process (double dt, double input, double cutoff, bool highPass = false );
3855
3956private:
@@ -46,6 +63,11 @@ class FourPoleFilter
4663class StateVariableFilter
4764{
4865public:
66+ void Reset ()
67+ {
68+ band = 0.0 ;
69+ low = 0.0 ;
70+ }
4971 double Process (double dt, double input, double cutoff, bool highPass = false );
5072
5173private:
@@ -57,13 +79,19 @@ class StateVariableFilter
5779class DualFilterBase
5880{
5981public:
82+ virtual void Reset () {}
6083 virtual void Process (double dt, double inL, double inR, double cutoff, double &outL, double &outR, bool highPass = false ) {}
6184};
6285
6386template <class T >
6487class DualFilter : public DualFilterBase
6588{
6689public:
90+ void Reset ()
91+ {
92+ left.Reset ();
93+ right.Reset ();
94+ }
6795 void Process (double dt, double inL, double inR, double cutoff, double &outL, double &outR, bool highPass = false )
6896 {
6997 outL = left.Process (dt, inL, cutoff, highPass);
@@ -78,16 +106,18 @@ class DualFilter : public DualFilterBase
78106class MultiFilter
79107{
80108public:
81- void SetMode (FilterModes m) { mode = m; }
109+ void SetMode (FilterModes m);
82110 void Process (double dt, double &l, double &r, double cutoff, bool highPass = false );
83111
84112private:
85- FilterModes mode = FilterModes::onePole;
86113 std::array<std::unique_ptr<DualFilterBase>, numFilterModes> filters = {
87114 std::unique_ptr<DualFilterBase>(new DualFilter<OnePoleFilter>()),
88115 std::unique_ptr<DualFilterBase>(new DualFilter<TwoPoleFilter>()),
89116 std::unique_ptr<DualFilterBase>(new DualFilter<FourPoleFilter>()),
90117 std::unique_ptr<DualFilterBase>(new DualFilter<StateVariableFilter>())
91118 };
92- std::array<double , numFilterModes> mix = {0.0 , 0.0 , 0.0 , 0.0 };
119+ FilterModes currentMode = FilterModes::onePole;
120+ FilterModes previousMode = FilterModes::noFilter;
121+ bool crossfading = false ;
122+ double currentModeMix = 1.0 ;
93123};
0 commit comments