Wherein we hesitate to dally in presenting details of Hz.Delay
.
The delay plugin can be added to your audio scenes to introduce a delay to the input signal. This can be used for a variety of effects.
Hz.Delay
supports two input and one output port. These can be
configured mono
or stereo
. The second optional input port
must be mono
and supports audio-rate delivery of Delay Modulation
.
Name | Id | Description | Range |
---|---|---|---|
Delay |
0 | Delay Time | 0-180 (.25) |
DelayUnits |
1 | Units for Delay | 0:Seconds, 1:Beats * (0) |
ModScale |
2 | Scales optional incoming Delay Modulation signal | 0-1 (.1) |
*
: beats are controlled by the Clap Host environment using clap_transport_events
.
You can use TimeKeeper API to specifiy this
in the Hz
environment.
Delay
is configured with a maximum delay time
. The default value of
1 second
can be overridden but this must be done during node-creation using
the preset
mechanism as shown here:
let delay = scene.NewAnode("Hz.Delay", {preset:{maxDelay:2.0}});
A feedforward Comb Filter is implemented by combining a signal with a delayed version of itself.
The feedback variant of the Comb Filter can also be implemented subject to the constraints discussed below.
We provide Hz.Echo to create and process a delay feedback loop. For common situations, it should be preferred over the explicit
Hz.Delay
methodology described here. That said, if you want to know its inner workings, read-on.
Another common use of delay is to produce echo effects by routing the output of the delay through a feedback loop and back into itself (usually through a gain reduction node).
Here's a simple snippet:
scene.Chain(delay, gainreduction, delay); // our feedback loop
And here's a graph with an echo:
This works because Hz
implicitly sums all inputs to the same
audio port connection so delay
sees both the output of osc
as well as an amplitude-reduced version of its own delayed output.
And here's the Echo Example.
From a graph-theoretic point of view feedback results in a graph with
cycles
, and the requirement that an audio graph be acyclic
is violated
. This use of feedback-delay is quite common in
audio applications so we need a way to make it possible. Our
solution, patterned after the solution implemented in WebAudio
,
is to eliminate the cycle by breaking delay
into two pieces.
The resulting acyclic
graph looks like this:
Note that there are no more cycles in this graph and that two new
nodes, delay_prior
and blackhole
, have been introduced.
blackhole
represents a magic connection from the output of delay
to the hidden input of delay_prior
. Careful readers will notice
that this doesn't really remedy the cycle unless there is an
implicit audio-chunk-sized delay between the blackhole output and
the input to delay_prior. This is, in fact, the case and it imposes
a minimimum valid delay period on the system.
A typical value for this minimum delay
is 128 samples or around
0.3 milliseconds which is small for most purposes. Typical delays
for echo effects are at least 100 ms. Generally, a delay of
around 30 ms is considered the threshold for perceiving a distinct
echo. Delays shorter than this tend to be perceived as part of
the original sound, contributing to reverberation.
This node-splitting to resolve graph cycles theoretically works with any CLAP plugin node that follows this recipe:
splittable
feature is present in the CLAP plugin-feature list
described in the CLAP header file, plugin-features.h
process
method must be written expecting to be
run twice per-audio-chunk when a graph cycle is detected,
otherwise it is run once. The prior
execution mode can be
detected with no or constant-only inputs, while the current
execution mode can be detected by constant outputs. Normal,
non-split behavior is detected when inputs and outputs are
both present and not constant.