From 42f9be5dba601606d428e83c3302c8af0a63c329 Mon Sep 17 00:00:00 2001 From: HiveBeats Date: Fri, 8 Sep 2023 13:48:05 +0400 Subject: [PATCH] wip: filter constructors --- inc/BandPassFilter.h | 11 ++++++----- inc/Filter.h | 17 +++++++++-------- inc/HighPassFilter.h | 13 +++++++------ inc/LowPassFilter.h | 13 +++++++------ src/BandPassFilter.cpp | 12 +++++++++--- src/Filter.cpp | 17 +++++++---------- src/HighPassFilter.cpp | 12 +++++++++--- src/LowPassFilter.cpp | 19 +++++++++++++++---- 8 files changed, 69 insertions(+), 45 deletions(-) diff --git a/inc/BandPassFilter.h b/inc/BandPassFilter.h index c53911f..7e9ddb7 100644 --- a/inc/BandPassFilter.h +++ b/inc/BandPassFilter.h @@ -1,12 +1,13 @@ #pragma once #include "Filter.h" -class BandPassFilter: public Filter -{ -private: +class BandPassFilter : public Filter { + private: void calculate_coefficients() override; -public: + + public: + BandPassFilter(Filter* filter); + BandPassFilter(float freq, float res, float q); BandPassFilter(/* args */); ~BandPassFilter(); }; - diff --git a/inc/Filter.h b/inc/Filter.h index 79fac1c..7961881 100644 --- a/inc/Filter.h +++ b/inc/Filter.h @@ -1,18 +1,16 @@ #pragma once #include "Effect.h" -class Filter: public Effect -{ - +class Filter : public Effect { -protected: + protected: struct Normals { float V; float K; }; - float m_freq; // cutoff frequency - float m_q; // filter quantity (resonance) + float m_freq; // cutoff frequency + float m_q; // filter quantity (resonance) float m_order; // filter order (peakGain) /* todo: filter adsr */ float m_norm; @@ -20,7 +18,8 @@ protected: float m_z1, m_z2; Normals calculate_normals(); virtual void calculate_coefficients(){}; -public: + + public: Filter(/* args */); ~Filter(); void Trigger() override; @@ -28,5 +27,7 @@ public: float Process(float in); void Process(std::vector& samples) override; void SetParameters(float freq, float res, float q); + float GetFreq() { return m_freq; } + float GetRes() { return m_q; } + float GetPeakGain() { return m_norm; } }; - diff --git a/inc/HighPassFilter.h b/inc/HighPassFilter.h index fb0e5d0..efd6d12 100644 --- a/inc/HighPassFilter.h +++ b/inc/HighPassFilter.h @@ -1,12 +1,13 @@ #pragma once #include "Filter.h" -class HighPassFilter: public Filter -{ -private: +class HighPassFilter : public Filter { + private: void calculate_coefficients() override; -public: - HighPassFilter(/* args */); + + public: + HighPassFilter(); + HighPassFilter(Filter* filter); + HighPassFilter(float freq, float res, float q); ~HighPassFilter(); }; - diff --git a/inc/LowPassFilter.h b/inc/LowPassFilter.h index 071c9f2..cbfacab 100644 --- a/inc/LowPassFilter.h +++ b/inc/LowPassFilter.h @@ -2,12 +2,13 @@ #include "Filter.h" -class LowPassFilter: public Filter -{ -protected: +class LowPassFilter : public Filter { + protected: void calculate_coefficients() override; -public: - LowPassFilter(/* args */); + + public: + LowPassFilter(); + LowPassFilter(Filter* filter); + LowPassFilter(float freq, float res, float q); ~LowPassFilter(); }; - diff --git a/src/BandPassFilter.cpp b/src/BandPassFilter.cpp index 151b4de..c6d51a8 100644 --- a/src/BandPassFilter.cpp +++ b/src/BandPassFilter.cpp @@ -1,10 +1,16 @@ #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() { Filter::Normals base = calculate_normals(); diff --git a/src/Filter.cpp b/src/Filter.cpp index a841796..386f8f2 100644 --- a/src/Filter.cpp +++ b/src/Filter.cpp @@ -1,11 +1,9 @@ #include "Filter.h" #include "Settings.h" -Filter::Filter(/* args */) { -} +Filter::Filter(/* args */) {} -Filter::~Filter() { -} +Filter::~Filter() {} Filter::Normals Filter::calculate_normals() { Filter::Normals res; @@ -15,11 +13,9 @@ Filter::Normals Filter::calculate_normals() { return res; } -void Filter::Trigger() { -} +void Filter::Trigger() {} -void Filter::Release() { -} +void Filter::Release() {} float Filter::Process(float in) { float out = in * m_a0 + m_z1; @@ -29,8 +25,9 @@ float Filter::Process(float in) { } void Filter::Process(std::vector& samples) { - // todo: that will not work for ADSR-controlled filter. So, let's calculate all the possible frequency values into array/dictionary - // then just lookup for each sample + // todo: that will not work for ADSR-controlled filter. So, let's calculate + // all the possible frequency values into array/dictionary then just lookup + // for each sample calculate_coefficients(); for (std::size_t i = 0; i < samples.size(); i++) { samples[i] = Process(samples[i]); diff --git a/src/HighPassFilter.cpp b/src/HighPassFilter.cpp index bc48cf9..b44573e 100644 --- a/src/HighPassFilter.cpp +++ b/src/HighPassFilter.cpp @@ -1,10 +1,16 @@ #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() { Filter::Normals base = calculate_normals(); diff --git a/src/LowPassFilter.cpp b/src/LowPassFilter.cpp index 4720acc..ca4a776 100644 --- a/src/LowPassFilter.cpp +++ b/src/LowPassFilter.cpp @@ -1,16 +1,27 @@ #include "LowPassFilter.h" #include "Settings.h" -LowPassFilter::LowPassFilter(/* args */) { - //todo: defaults +LowPassFilter::LowPassFilter() { + // todo: defaults m_freq = 200.f / SAMPLE_RATE; - m_q = 0.707; + m_q = 0.707f; 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() { Filter::Normals base = calculate_normals(); m_norm = 1 / (1 + base.K / m_q + base.K * base.K);