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 "Logger.h"
|
||||||
#include "OscillatorType.h"
|
#include "OscillatorType.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
|
#include "LowPassFilter.h"
|
||||||
|
|
||||||
Synth::Synth(/* args */) {
|
Synth::Synth(/* args */) {
|
||||||
add_oscillator();
|
add_oscillator();
|
||||||
add_oscillator();
|
add_oscillator();
|
||||||
AddEffect(new ADSR());
|
AddEffect(new ADSR());
|
||||||
|
AddEffect(new LowPassFilter());
|
||||||
for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) {
|
for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) {
|
||||||
float sample = 0.0f;
|
float sample = 0.0f;
|
||||||
m_out_signal.push_back(sample);
|
m_out_signal.push_back(sample);
|
||||||
|
|||||||
Reference in New Issue
Block a user