|
|
@ -27,6 +27,8 @@ |
|
|
|
#include "effect_modulated_delay.h" |
|
|
|
#include "effect_modulated_delay.h" |
|
|
|
#include "config.h" |
|
|
|
#include "config.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern config_t configuration; |
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************/ |
|
|
|
/******************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
// Based on; A u d i o E f f e c t D e l a y
|
|
|
|
// Based on; A u d i o E f f e c t D e l a y
|
|
|
@ -58,18 +60,37 @@ boolean AudioEffectModulatedDelay::begin(short *delayline, int d_length) |
|
|
|
_delayline = delayline; |
|
|
|
_delayline = delayline; |
|
|
|
_delay_length = d_length; |
|
|
|
_delay_length = d_length; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set_modulator_filter_coeffs(1.0, configuration.chorus_frequency / 10, 1.0); // gain, center frerquency
|
|
|
|
|
|
|
|
modulator_filter_data = {1, &modulator_filter_state, modulator_filter_coeffs}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void AudioEffectModulatedDelay::set_modulator_filter_coeffs(float gain, float fc, float width) |
|
|
|
|
|
|
|
{ |
|
|
|
// modulator filter
|
|
|
|
// modulator filter
|
|
|
|
// coefficients calculated with "IOWA Hills IIR Filter Designer 6.5", http://www.iowahills.com/8DownloadPage.html
|
|
|
|
// coefficients calculated with "IOWA Hills IIR Filter Designer 6.5", http://www.iowahills.com/8DownloadPage.html
|
|
|
|
// OmegaC = 0.5, SR = 44117.64706, Fc = 11 kHz, N=2
|
|
|
|
|
|
|
|
// Example: https://web.fhnw.ch/technik/projekte/eit/Fruehling2016/MuelZum/html/parametric_equalizer_example_8c-example.html
|
|
|
|
// Example: https://web.fhnw.ch/technik/projekte/eit/Fruehling2016/MuelZum/html/parametric_equalizer_example_8c-example.html
|
|
|
|
modulator_filter_coeffs[0] = 0.291938819295525787; // b0
|
|
|
|
|
|
|
|
|
|
|
|
float32_t A = sqrt(powf(10, gain / 20.0f)); |
|
|
|
|
|
|
|
float32_t w0 = 2.0f * PI * fc / ((float32_t)AUDIO_SAMPLE_RATE_EXACT); |
|
|
|
|
|
|
|
float32_t cosw0 = cosf(w0); |
|
|
|
|
|
|
|
float32_t sinw0 = sinf(w0); |
|
|
|
|
|
|
|
float32_t alpha = sinw0 / (2.0f * width); |
|
|
|
|
|
|
|
float32_t a0 = 1.0f + alpha / A; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modulator_filter_coeffs[0] = (1.0f + alpha * A) / a0; // b0
|
|
|
|
|
|
|
|
modulator_filter_coeffs[1] = (-2.0f * cosw0) / a0; // b1
|
|
|
|
|
|
|
|
modulator_filter_coeffs[2] = (1.0f - alpha * A) / a0; // b2
|
|
|
|
|
|
|
|
modulator_filter_coeffs[3] = -(2.0f * cosw0) / -a0; // -a1
|
|
|
|
|
|
|
|
modulator_filter_coeffs[4] = (1.0f - alpha / A) / -a0; // -a2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// OmegaC = 0.5, SR = 44117.64706, Fc = 11 kHz, N=2
|
|
|
|
|
|
|
|
/* modulator_filter_coeffs[0] = 0.291938819295525787; // b0
|
|
|
|
modulator_filter_coeffs[1] = 0.582700575839973478; // b1
|
|
|
|
modulator_filter_coeffs[1] = 0.582700575839973478; // b1
|
|
|
|
modulator_filter_coeffs[2] = 0.291938819295525787; // b2
|
|
|
|
modulator_filter_coeffs[2] = 0.291938819295525787; // b2
|
|
|
|
modulator_filter_coeffs[3] = 0.005242268129729576; // -a1
|
|
|
|
modulator_filter_coeffs[3] = 0.005242268129729576; // -a1
|
|
|
|
modulator_filter_coeffs[4] = -0.171820482560754689; // -a2
|
|
|
|
modulator_filter_coeffs[4] = -0.171820482560754689; // -a2 */
|
|
|
|
modulator_filter_data = {1, &modulator_filter_state, modulator_filter_coeffs}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (true); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void AudioEffectModulatedDelay::update(void) |
|
|
|
void AudioEffectModulatedDelay::update(void) |
|
|
|