#include "fx_echo.h" #include void FxEcho_Init(FxEchoState *state, FxEchoParams *params) { memset(state->buffer, 0, sizeof(state->buffer)); state->write_idx = 0; params->enabled = false; params->delay_ms = 300.0f; params->feedback = 0.35f; params->mix = 0.3f; } float FxEcho_Process(FxEchoState *state, const FxEchoParams *params, float input) { if (!params->enabled) { return input; } uint32_t delay_samples = (uint32_t)(params->delay_ms * (FX_ECHO_SAMPLE_RATE / 1000.0f)); if (delay_samples >= FX_ECHO_BUFFER_SIZE) { delay_samples = FX_ECHO_BUFFER_SIZE - 1U; } uint32_t read_idx = (state->write_idx + FX_ECHO_BUFFER_SIZE - delay_samples) % FX_ECHO_BUFFER_SIZE; float delayed = (float)state->buffer[read_idx] / 32768.0f; float to_store = input + delayed * params->feedback; if (to_store > 1.0f) to_store = 1.0f; if (to_store < -1.0f) to_store = -1.0f; state->buffer[state->write_idx] = (int16_t)(to_store * 32767.0f); state->write_idx = (state->write_idx + 1U) % FX_ECHO_BUFFER_SIZE; return input * (1.0f - params->mix) + delayed * params->mix; }