wip: filter constructors

This commit is contained in:
2023-09-08 13:48:05 +04:00
parent 6dc3de1eda
commit 42f9be5dba
8 changed files with 69 additions and 45 deletions

View File

@@ -1,12 +1,13 @@
#pragma once #pragma once
#include "Filter.h" #include "Filter.h"
class BandPassFilter: public Filter class BandPassFilter : public Filter {
{ private:
private:
void calculate_coefficients() override; void calculate_coefficients() override;
public:
public:
BandPassFilter(Filter* filter);
BandPassFilter(float freq, float res, float q);
BandPassFilter(/* args */); BandPassFilter(/* args */);
~BandPassFilter(); ~BandPassFilter();
}; };

View File

@@ -1,18 +1,16 @@
#pragma once #pragma once
#include "Effect.h" #include "Effect.h"
class Filter: public Effect class Filter : public Effect {
{
protected: protected:
struct Normals { struct Normals {
float V; float V;
float K; float K;
}; };
float m_freq; // cutoff frequency float m_freq; // cutoff frequency
float m_q; // filter quantity (resonance) float m_q; // filter quantity (resonance)
float m_order; // filter order (peakGain) float m_order; // filter order (peakGain)
/* todo: filter adsr */ /* todo: filter adsr */
float m_norm; float m_norm;
@@ -20,7 +18,8 @@ protected:
float m_z1, m_z2; float m_z1, m_z2;
Normals calculate_normals(); Normals calculate_normals();
virtual void calculate_coefficients(){}; virtual void calculate_coefficients(){};
public:
public:
Filter(/* args */); Filter(/* args */);
~Filter(); ~Filter();
void Trigger() override; void Trigger() override;
@@ -28,5 +27,7 @@ public:
float Process(float in); float Process(float in);
void Process(std::vector<float>& samples) override; void Process(std::vector<float>& samples) override;
void SetParameters(float freq, float res, float q); void SetParameters(float freq, float res, float q);
float GetFreq() { return m_freq; }
float GetRes() { return m_q; }
float GetPeakGain() { return m_norm; }
}; };

View File

@@ -1,12 +1,13 @@
#pragma once #pragma once
#include "Filter.h" #include "Filter.h"
class HighPassFilter: public Filter class HighPassFilter : public Filter {
{ private:
private:
void calculate_coefficients() override; void calculate_coefficients() override;
public:
HighPassFilter(/* args */); public:
HighPassFilter();
HighPassFilter(Filter* filter);
HighPassFilter(float freq, float res, float q);
~HighPassFilter(); ~HighPassFilter();
}; };

View File

@@ -2,12 +2,13 @@
#include "Filter.h" #include "Filter.h"
class LowPassFilter: public Filter class LowPassFilter : public Filter {
{ protected:
protected:
void calculate_coefficients() override; void calculate_coefficients() override;
public:
LowPassFilter(/* args */); public:
LowPassFilter();
LowPassFilter(Filter* filter);
LowPassFilter(float freq, float res, float q);
~LowPassFilter(); ~LowPassFilter();
}; };

View File

@@ -1,10 +1,16 @@
#include "BandPassFilter.h" #include "BandPassFilter.h"
BandPassFilter::BandPassFilter(/* args */) { BandPassFilter::BandPassFilter(/* args */) {}
BandPassFilter::BandPassFilter(Filter* filter) {
m_freq = filter->GetFreq();
m_q = filter->GetRes();
m_order = filter->GetPeakGain();
} }
BandPassFilter::~BandPassFilter() { BandPassFilter::BandPassFilter(float freq, float res, float q) {}
}
BandPassFilter::~BandPassFilter() {}
void BandPassFilter::calculate_coefficients() { void BandPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals(); Filter::Normals base = calculate_normals();

View File

@@ -1,11 +1,9 @@
#include "Filter.h" #include "Filter.h"
#include "Settings.h" #include "Settings.h"
Filter::Filter(/* args */) { Filter::Filter(/* args */) {}
}
Filter::~Filter() { Filter::~Filter() {}
}
Filter::Normals Filter::calculate_normals() { Filter::Normals Filter::calculate_normals() {
Filter::Normals res; Filter::Normals res;
@@ -15,11 +13,9 @@ Filter::Normals Filter::calculate_normals() {
return res; return res;
} }
void Filter::Trigger() { void Filter::Trigger() {}
}
void Filter::Release() { void Filter::Release() {}
}
float Filter::Process(float in) { float Filter::Process(float in) {
float out = in * m_a0 + m_z1; float out = in * m_a0 + m_z1;
@@ -29,8 +25,9 @@ float Filter::Process(float in) {
} }
void Filter::Process(std::vector<float>& samples) { void Filter::Process(std::vector<float>& samples) {
// todo: that will not work for ADSR-controlled filter. So, let's calculate all the possible frequency values into array/dictionary // todo: that will not work for ADSR-controlled filter. So, let's calculate
// then just lookup for each sample // all the possible frequency values into array/dictionary then just lookup
// for each sample
calculate_coefficients(); calculate_coefficients();
for (std::size_t i = 0; i < samples.size(); i++) { for (std::size_t i = 0; i < samples.size(); i++) {
samples[i] = Process(samples[i]); samples[i] = Process(samples[i]);

View File

@@ -1,10 +1,16 @@
#include "HighPassFilter.h" #include "HighPassFilter.h"
HighPassFilter::HighPassFilter(/* args */) { HighPassFilter::HighPassFilter(/* args */) {}
HighPassFilter::HighPassFilter(Filter* filter) {
m_freq = filter->GetFreq();
m_q = filter->GetRes();
m_order = filter->GetPeakGain();
} }
HighPassFilter::~HighPassFilter() { HighPassFilter::HighPassFilter(float freq, float res, float q) {}
}
HighPassFilter::~HighPassFilter() {}
void HighPassFilter::calculate_coefficients() { void HighPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals(); Filter::Normals base = calculate_normals();

View File

@@ -1,16 +1,27 @@
#include "LowPassFilter.h" #include "LowPassFilter.h"
#include "Settings.h" #include "Settings.h"
LowPassFilter::LowPassFilter(/* args */) { LowPassFilter::LowPassFilter() {
//todo: defaults // todo: defaults
m_freq = 200.f / SAMPLE_RATE; m_freq = 200.f / SAMPLE_RATE;
m_q = 0.707; m_q = 0.707f;
m_order = 0; m_order = 0;
} }
LowPassFilter::~LowPassFilter() { LowPassFilter::LowPassFilter(float freq, float res, float q) {
m_freq = freq / SAMPLE_RATE;
m_q = res;
m_order = q;
} }
LowPassFilter::LowPassFilter(Filter* filter) {
m_freq = filter->GetFreq();
m_q = filter->GetRes();
m_order = filter->GetPeakGain();
}
LowPassFilter::~LowPassFilter() {}
void LowPassFilter::calculate_coefficients() { void LowPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals(); Filter::Normals base = calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K); m_norm = 1 / (1 + base.K / m_q + base.K * base.K);