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);
}
}