Help get this Terrarium delay sounding less "crunchy"

soggybag

Member
I'm working on a Terrarium delay. The delay is working but the delay signal is sounding "crunchy", like digital noise. Here is the code I'm using.


Code:
#include "daisysp.h"
#include "daisy_petal.h"
#include "terrarium.h"

using namespace daisy;
using namespace daisysp;
using namespace terrarium;

DaisyPetal petal;
Parameter param_feedback, param_mix;
SmoothedParameter smooth_delay_time;
Led led1, led2;

constexpr size_t MAX_DELAY = 48000 * 2; // 2 seconds max delay
DelayLine<float, MAX_DELAY> delay;
float samplerate;
Tone lp_filter;
bool effect_enabled = true;



void InitParams()
{
    smooth_delay_time.Init(petal.knob[Terrarium::KNOB_1], 0.01f, 2.0f, Parameter::LINEAR);
    param_feedback.Init(petal.knob[Terrarium::KNOB_2], 0.0f, 1.0f, Parameter::LINEAR);
    param_mix.Init(petal.knob[Terrarium::KNOB_3], 0.0f, 1.0f, Parameter::LINEAR);
}

void InitLeds()
{
    led1.Init(petal.seed.GetPin(Terrarium::LED_1), false);
    led2.Init(petal.seed.GetPin(Terrarium::LED_2), false);
}

void AudioCallback(AudioHandle::InputBuffer in, AudioHandle::OutputBuffer out, size_t size)
{
    float delay_time = smooth_delay_time.Process();
    float feedback = param_feedback.Process();
    float mix = param_mix.Process();

    float delay_samples = delay_time * samplerate;
    delay.SetDelay(delay_samples);

    for (size_t i = 0; i < size; i++)
    {
        float dry = in[0][i];
        float delayed = delay.Read();
        float input = dry + delayed * feedback;
        float filtered = lp_filter.Process(input);
        // Clamp to [-1.0, 1.0] before writing to delay
        filtered = fminf(fmaxf(filtered, -1.0f), 1.0f);
        delay.Write(filtered);

        float wet = delayed;
        float mixed = (1.0f - mix) * dry + mix * wet;

        float output = effect_enabled ? mixed : dry;
        out[0][i] = out[1][i] = output;
    }
}

int main(void)
{
    petal.Init();
    lp_filter.Init(petal.AudioSampleRate());
    lp_filter.SetFreq(4000.0f);
    samplerate = petal.AudioSampleRate();

    InitParams();
    InitLeds();

    delay.Init();
    petal.StartAdc();
    petal.StartAudio(AudioCallback);

    while (1)
    {
        petal.ProcessAnalogControls();
        petal.ProcessDigitalControls();

        if (petal.switches[Terrarium::FOOTSWITCH_1].RisingEdge())
        {
            effect_enabled = !effect_enabled;
        }

        // LED1 indicates if effect is enabled
        led1.Set(effect_enabled ? 1.0f : 0.0f);
        led1.Update();

        // LED2 shows mix level from KNOB_3
        led2.Set(param_mix.Process());
        led2.Update();

        System::Delay(10);
    }
}
 
Back
Top