wip: filter (lp, hp, bp)

This commit is contained in:
2023-09-07 23:53:29 +04:00
parent 868a59da0e
commit 5b97136f44
9 changed files with 168 additions and 0 deletions

12
inc/BandPassFilter.h Normal file
View File

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

32
inc/Filter.h Normal file
View File

@@ -0,0 +1,32 @@
#pragma once
#include "Effect.h"
class Filter: public Effect
{
protected:
struct Normals {
float V;
float K;
};
float m_freq; // cutoff frequency
float m_q; // filter quantity (resonance)
float m_order; // filter order (peakGain)
/* todo: filter adsr */
float m_norm;
float m_a0, m_a1, m_a2, m_b1, m_b2;
float m_z1, m_z2;
Normals calculate_normals();
virtual void calculate_coefficients(){};
public:
Filter(/* args */);
~Filter();
void Trigger() override;
void Release() override;
float Process(float in);
void Process(std::vector<float>& samples) override;
void SetParameters(float freq, float res, float q);
};

12
inc/HighPassFilter.h Normal file
View File

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

13
inc/LowPassFilter.h Normal file
View File

@@ -0,0 +1,13 @@
#pragma once
#include "Filter.h"
class LowPassFilter: public Filter
{
protected:
void calculate_coefficients() override;
public:
LowPassFilter(/* args */);
~LowPassFilter();
};

17
src/BandPassFilter.cpp Normal file
View File

@@ -0,0 +1,17 @@
#include "BandPassFilter.h"
BandPassFilter::BandPassFilter(/* args */) {
}
BandPassFilter::~BandPassFilter() {
}
void BandPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K);
m_a0 = base.K / m_q * m_norm;
m_a1 = 0;
m_a2 = -m_a0;
m_b1 = 2 * (base.K * base.K - 1) * m_norm;
m_b2 = (1 - base.K / m_q + base.K * base.K) * m_norm;
}

41
src/Filter.cpp Normal file
View File

@@ -0,0 +1,41 @@
#include "Filter.h"
Filter::Filter(/* args */) {
}
Filter::~Filter() {
}
Filter::Normals Filter::calculate_normals() {
Filter::Normals res;
res.V = powf(10, fabs(m_order) / 20.0);
res.K = tanf(M_PI * m_freq);
return res;
}
void Filter::Trigger() {
}
void Filter::Release() {
}
float Filter::Process(float in) {
float out = in * m_a0 + m_z1;
m_z1 = in * m_a1 + m_z2 - m_b1 * out;
m_z2 = in * m_a2 - m_b2 * out;
return out;
}
void Filter::Process(std::vector<float>& samples) {
calculate_coefficients();
for (std::size_t i = 0; i < samples.size(); i++) {
samples[i] = Process(samples[i]);
}
}
void Filter::SetParameters(float freq, float res, float q) {
m_freq = freq;
m_q = res;
m_order = q;
}

17
src/HighPassFilter.cpp Normal file
View File

@@ -0,0 +1,17 @@
#include "HighPassFilter.h"
HighPassFilter::HighPassFilter(/* args */) {
}
HighPassFilter::~HighPassFilter() {
}
void HighPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K);
m_a0 = 1 * m_norm;
m_a1 = -2 * m_a0;
m_a2 = m_a0;
m_b1 = 2 * (base.K * base.K - 1) * m_norm;
m_b2 = (1 - base.K / m_q + base.K * base.K) * m_norm;
}

22
src/LowPassFilter.cpp Normal file
View File

@@ -0,0 +1,22 @@
#include "LowPassFilter.h"
#include "Settings.h"
LowPassFilter::LowPassFilter(/* args */) {
//todo: defaults
m_freq = 200.f / SAMPLE_RATE;
m_q = 0.707;
m_order = 0;
}
LowPassFilter::~LowPassFilter() {
}
void LowPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K);
m_a0 = base.K * base.K * m_norm;
m_a1 = 2 * m_a0;
m_a2 = m_a0;
m_b1 = 2 * (base.K * base.K - 1) * m_norm;
m_b2 = (1 - base.K / m_q + base.K * base.K) * m_norm;
}

View File

@@ -4,11 +4,13 @@
#include "Logger.h"
#include "OscillatorType.h"
#include "Settings.h"
#include "LowPassFilter.h"
Synth::Synth(/* args */) {
add_oscillator();
add_oscillator();
AddEffect(new ADSR());
AddEffect(new LowPassFilter());
for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) {
float sample = 0.0f;
m_out_signal.push_back(sample);