40 lines
995 B
C
40 lines
995 B
C
#include "fx_overdrive.h"
|
|
#include <math.h>
|
|
|
|
void FxOverdrive_Init(FxOverdriveState *state, FxOverdriveParams *params)
|
|
{
|
|
state->tone_lp_state = 0.0f;
|
|
|
|
params->enabled = false;
|
|
params->drive = 0.4f;
|
|
params->tone = 0.6f;
|
|
params->level = 0.7f;
|
|
}
|
|
|
|
float FxOverdrive_Process(FxOverdriveState *state, const FxOverdriveParams *params, float input)
|
|
{
|
|
if (!params->enabled)
|
|
{
|
|
return input;
|
|
}
|
|
|
|
float driven = input * (1.0f + params->drive * 20.0f);
|
|
|
|
/* Ecretage asymetrique (exponentiel) : plus caracteristique/agressif qu'un tanh symetrique. */
|
|
float shaped;
|
|
if (driven >= 0.0f)
|
|
{
|
|
shaped = 1.0f - expf(-driven);
|
|
}
|
|
else
|
|
{
|
|
shaped = -1.0f + expf(driven);
|
|
}
|
|
|
|
/* Filtre passe-bas une pole pour la tonalite : coefficient = tone (0..1). */
|
|
float coeff = 0.05f + params->tone * 0.9f;
|
|
state->tone_lp_state += coeff * (shaped - state->tone_lp_state);
|
|
|
|
return state->tone_lp_state * params->level;
|
|
}
|