Skip to content

Commit cb74091

Browse files
committed
filter refactor (not working yet)
1 parent f92ea48 commit cb74091

File tree

2 files changed

+23
-36
lines changed

2 files changed

+23
-36
lines changed

source/Filter.cpp

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,10 @@ double StateVariableFilter::Process(double dt, double input, double cutoff, bool
4545
return highPass ? high : low;
4646
}
4747

48-
void MultiFilter::UpdateFilterMixes(double dt)
49-
{
50-
filter1Mix += ((mode == FilterModes::onePole ? 1.0 : 0.0) - filter1Mix) * 100.0 * dt;
51-
filter2Mix += ((mode == FilterModes::twoPole ? 1.0 : 0.0) - filter2Mix) * 100.0 * dt;
52-
filter4Mix += ((mode == FilterModes::fourPole ? 1.0 : 0.0) - filter4Mix) * 100.0 * dt;
53-
filterSvfMix += ((mode == FilterModes::stateVariable ? 1.0 : 0.0) - filterSvfMix) * 100.0 * dt;
54-
}
55-
5648
void MultiFilter::Process(double dt, double & l, double & r, double cutoff, bool highPass)
5749
{
58-
UpdateFilterMixes(dt);
50+
for (int i = 0; i < std::size(mix); i++)
51+
mix[i] += ((mode == i ? 1.0 : 0.0) - mix[i]) * 100.0 * dt;
5952

6053
auto inL = l;
6154
auto inR = r;
@@ -64,19 +57,10 @@ void MultiFilter::Process(double dt, double & l, double & r, double cutoff, bool
6457
l = 0.0;
6558
r = 0.0;
6659

67-
filter1.Process(dt, inL, inR, cutoff, tempOutL, tempOutR, highPass);
68-
l += tempOutL * filter1Mix;
69-
r += tempOutR * filter1Mix;
70-
71-
filter2.Process(dt, inL, inR, cutoff, tempOutL, tempOutR, highPass);
72-
l += tempOutL * filter2Mix;
73-
r += tempOutR * filter2Mix;
74-
75-
filter4.Process(dt, inL, inR, cutoff, tempOutL, tempOutR, highPass);
76-
l += tempOutL * filter4Mix;
77-
r += tempOutR * filter4Mix;
78-
79-
filterSvf.Process(dt, inL, inR, cutoff, tempOutL, tempOutR, highPass);
80-
l += tempOutL * filterSvfMix;
81-
r += tempOutR * filterSvfMix;
60+
for (int i = 0; i < std::size(filters); i++)
61+
{
62+
filters[i].Process(dt, inL, inR, cutoff, tempOutL, tempOutR, highPass);
63+
l += tempOutL * mix[i];
64+
r += tempOutR * mix[i];
65+
}
8266
}

source/Filter.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <array>
34
#include <cmath>
45

56
enum FilterModes
@@ -53,8 +54,14 @@ class StateVariableFilter
5354
double low = 0.0;
5455
};
5556

57+
class DualFilterBase
58+
{
59+
public:
60+
void Process(double dt, double inL, double inR, double cutoff, double &outL, double &outR, bool highPass = false) {}
61+
};
62+
5663
template<class T>
57-
class DualFilter
64+
class DualFilter : public DualFilterBase
5865
{
5966
public:
6067
void Process(double dt, double inL, double inR, double cutoff, double &outL, double &outR, bool highPass = false)
@@ -68,23 +75,19 @@ class DualFilter
6875
T right;
6976
};
7077

71-
7278
class MultiFilter
7379
{
7480
public:
7581
void SetMode(FilterModes m) { mode = m; }
7682
void Process(double dt, double &l, double &r, double cutoff, bool highPass = false);
7783

7884
private:
79-
void UpdateFilterMixes(double dt);
80-
8185
FilterModes mode = FilterModes::onePole;
82-
DualFilter<OnePoleFilter> filter1;
83-
DualFilter<TwoPoleFilter> filter2;
84-
DualFilter<FourPoleFilter> filter4;
85-
DualFilter<StateVariableFilter> filterSvf;
86-
double filter1Mix = 0.0;
87-
double filter2Mix = 0.0;
88-
double filter4Mix = 0.0;
89-
double filterSvfMix = 0.0;
86+
std::array<DualFilterBase, numFilterModes> filters = {
87+
DualFilter<OnePoleFilter>(),
88+
DualFilter<TwoPoleFilter>(),
89+
DualFilter<FourPoleFilter>(),
90+
DualFilter<StateVariableFilter>()
91+
};
92+
std::array<double, numFilterModes> mix = {0.0, 0.0, 0.0, 0.0};
9093
};

0 commit comments

Comments
 (0)