wip: filter (lp, hp, bp)
This commit is contained in:
12
inc/BandPassFilter.h
Normal file
12
inc/BandPassFilter.h
Normal 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
32
inc/Filter.h
Normal 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
12
inc/HighPassFilter.h
Normal 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
13
inc/LowPassFilter.h
Normal 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
17
src/BandPassFilter.cpp
Normal 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
41
src/Filter.cpp
Normal 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
17
src/HighPassFilter.cpp
Normal 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
22
src/LowPassFilter.cpp
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user