guitfx/delay.c
2025-02-17 18:40:11 +01:00

56 lines
1.4 KiB
C

#include "delay.h"
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
void delay_init(
struct delay* delay)
{
delay->mix = 0.8;
delay->feedback = 0.8;
delay->duration = 0;
delay->buf_idx = 0;
delay->buf_capacity = 0;
delay->buf = NULL;
}
void delay_set_time(
struct delay* delay,
uint64_t new_duration)
{
printf("set delay duration to %lu samples\n", new_duration);
if (new_duration > delay->buf_capacity) {
delay->buf_capacity = new_duration;
delay->buf = realloc(delay->buf, sizeof(float) * new_duration);
}
for (int i = delay->duration; i < new_duration; ++i) {
delay->buf[i] = delay->buf[i - delay->duration];
}
delay->duration = new_duration;
if (new_duration > 0) {
delay->buf_idx %= new_duration;
}
}
void delay_process(
struct delay* delay,
size_t frame_size,
float const* in,
float* out)
{
for (size_t i = 0; i < frame_size; ++i) {
if (delay->duration > 0) {
out[i] = in[i]
+ delay->mix * delay->buf[delay->buf_idx];
delay->buf[delay->buf_idx] *= delay->feedback;
delay->buf[delay->buf_idx] += (1.0 - delay->feedback) * in[i];
delay->buf_idx = (delay->buf_idx + 1) % delay->duration;
} else {
out[i] = 0.5 * in[i];
}
}
}