#include "fx_overdrive.h" #include 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; }