Interpolated delay line, not smoothed.
You can either use the usual API for updating coefficients and processing signals or you can directly write and read from the delay line which, for example, allows you to implement smoothing and multi-tap output.
Version: 1.3.0
License:
Included in Brickworks, which is:
Here you can download one or more example VST3 plugins for Windows, macOS and Linux. Source code of the audio engine(s) is included in the archive(s).
| Description | Link |
|---|---|
| Interpolated, non-smoothed delay line | Download |

Module type: DSP
typedef struct bw_delay_coeffs bw_delay_coeffs;
Coefficients and related.
typedef struct bw_delay_state bw_delay_state;
Internal state and related.
static inline void bw_delay_init(
bw_delay_coeffs * BW_RESTRICT coeffs,
float max_delay);
Initializes input parameter values in coeffs using max_delay (s) as the maximum delay time.
max_delay must be finite and non-negative.
static inline void bw_delay_set_sample_rate(
bw_delay_coeffs * BW_RESTRICT coeffs,
float sample_rate);
Sets the sample_rate (Hz) value in coeffs.
static inline size_t bw_delay_mem_req(
const bw_delay_coeffs * BW_RESTRICT coeffs);
Returns the size, in bytes, of contiguous memory to be supplied to bw_delay_mem_set() using coeffs.
static inline void bw_delay_mem_set(
const bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT state,
void * BW_RESTRICT mem);
Associates the contiguous memory block mem to the given state using coeffs.
static inline void bw_delay_reset_coeffs(
bw_delay_coeffs * BW_RESTRICT coeffs);
Resets coefficients in coeffs to assume their target values.
static inline float bw_delay_reset_state(
const bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT state,
float x_0);
Resets the given state to its initial values using the given coeffs and the initial input value x_0.
Returns the corresponding initial output value.
static inline void bw_delay_reset_state_multi(
const bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT const * BW_RESTRICT state,
const float * x_0,
float * y_0,
size_t n_channels);
Resets each of the n_channels states to its initial values using the given coeffs and the corresponding initial input value in the x_0 array.
The corresponding initial output values are written into the y_0 array, if not BW_NULL.
static float bw_delay_read(
const bw_delay_coeffs * BW_RESTRICT coeffs,
const bw_delay_state * BW_RESTRICT state,
size_t di,
float df);
Returns the interpolated value read from the delay line identified by coeffs and state by applying a delay of di + df samples.
df must be in [0.f, 1.f) and di + df must not exceed the delay line length (max_delay * sample_rate).
static void bw_delay_write(
const bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT state,
float x);
Pushes the new sample x on the delay line identified by coeffs and state.
static inline void bw_delay_update_coeffs_ctrl(
bw_delay_coeffs * BW_RESTRICT coeffs);
Triggers control-rate update of coefficients in coeffs.
static inline void bw_delay_update_coeffs_audio(
bw_delay_coeffs * BW_RESTRICT coeffs);
Triggers audio-rate update of coefficients in coeffs.
static inline float bw_delay_process1(
const bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT state,
float x);
Processes one input sample x using coeffs, while using and updating state. Returns the corresponding output sample.
static inline void bw_delay_process(
bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT state,
const float * x,
float * y,
size_t n_samples);
Processes the first n_samples of the input buffer x and fills the first n_samples of the output buffer y, while using and updating both coeffs and state (control and audio rate).
static inline void bw_delay_process_multi(
bw_delay_coeffs * BW_RESTRICT coeffs,
bw_delay_state * BW_RESTRICT const * BW_RESTRICT state,
const float * const * x,
float * const * y,
size_t n_channels,
size_t n_samples);
Processes the first n_samples of the n_channels input buffers x and fills the first n_samples of the n_channels output buffers y, while using and updating both the common coeffs and each of the n_channels states (control and audio rate).
static inline void bw_delay_set_delay(
bw_delay_coeffs * BW_RESTRICT coeffs,
float value);
Sets the delay time value (s) in coeffs.
Valid range: [0.f, max_delay].
Default value: 0.f.
static inline size_t bw_delay_get_length(
const bw_delay_coeffs * BW_RESTRICT coeffs);
Returns the length of the delay line in samples as stored in coeffs.
coeffs must be at least in the "sample-rate-set" state.
static inline char bw_delay_coeffs_is_valid(
const bw_delay_coeffs * BW_RESTRICT coeffs);
Tries to determine whether coeffs is valid and returns non-0 if it seems to be the case and 0 if it is certainly not. False positives are possible, false negatives are not.
coeffs must at least point to a readable memory block of size greater than or equal to that of bw_delay_coeffs.
static inline char bw_delay_state_is_valid(
const bw_delay_coeffs * BW_RESTRICT coeffs,
const bw_delay_state * BW_RESTRICT state);
Tries to determine whether state is valid and returns non-0 if it seems to be the case and 0 if it is certainly not. False positives are possible, false negatives are not.
If coeffs is not BW_NULL extra cross-checks might be performed (state is supposed to be associated to coeffs).
state must at least point to a readable memory block of size greater than or equal to that of bw_delay_state.
template<size_t N_CHANNELS = 1>
class Delay {
public:
Delay(
float maxDelay = 1.f);
~Delay();
void setSampleRate(
float sampleRate,
size_t * BW_RESTRICT memReq = BW_NULL);
void memSet(
void * BW_RESTRICT mem);
void reset(
float x0 = 0.f,
float * BW_RESTRICT y0 = BW_NULL);
# ifndef BW_CXX_NO_ARRAY
void reset(
float x0,
std::array<float, N_CHANNELS> * BW_RESTRICT y0);
# endif
void reset(
const float * x0,
float * y0 = BW_NULL);
# ifndef BW_CXX_NO_ARRAY
void reset(
std::array<float, N_CHANNELS> x0,
std::array<float, N_CHANNELS> * BW_RESTRICT y0 = BW_NULL);
# endif
void process(
const float * const * x,
float * const * y,
size_t nSamples);
# ifndef BW_CXX_NO_ARRAY
void process(
std::array<const float *, N_CHANNELS> x,
std::array<float *, N_CHANNELS> y,
size_t nSamples);
# endif
void setDelay(
float value);
size_t getLength();
...
}
memReq/memSet to C++ API.N_CHANNELS in C++ API.BW_NULL in the C++ API and implementation.BW_INCLUDE_WITH_QUOTES, BW_NO_CXX, and BW_CXX_NO_EXTERN_C.bw_delay_process() to bw_delay_process_multi().bw_delay_process_multi() to ensure that buffers used for both input and output appear at the same channel indices.BW_NULL and BW_CXX_NO_ARRAY.read() and write() from C++ API.bw_delay_reset_state().bw_delay_reset_state_multi() and updated C++ API in this regard.bw_delay_reset_state() returns the initial output value.reset() functions taking arrays as arguments.size_t instead of BW_SIZE_T.bw_delay_process() and bw_delay_process_multi() now use size_t to count samples and channels.const and BW_RESTRICT specifiers to input arguments and implementation.process() function taking C-style arrays as arguments.bw_delay_process_multi().