77 return std::isfinite(value) && value >= 0.5f;
87 TapeTier tier = TapeTier::standard) {
94 case Character::clean:
101 case Character::vintage_digital:
return "Vintage Delay";
102 case Character::tape:
103 return tier == TapeTier::physical ?
"Tape Delay (Physical)" :
"Tape Delay";
104 case Character::bbd:
return "BBD Delay";
105 case Character::diffusion:
return "Diffusion Delay";
106 case Character::clean:
107 default:
return "Clean Delay";
119 float tape_speed_ips = 7.5f) {
123 t.num_input_ports = 2;
124 t.num_output_ports = 2;
130 t.prepare = [character, tier, tape_speed_ips](
void* p,
double sr,
int ) {
132 s->delay.set_character(character);
133 s->delay.set_tape_tier(tier);
134 s->delay.set_tape_speed_ips(tape_speed_ips);
135 s->delay.set_sample_rate(sr);
143 t.baked_params.push_back({
kTimeOffset, 0.5f, 1.5f, 1.0f});
144 t.baked_params.push_back({
kFeedback, 0.0f, 1.1f, 0.35f});
145 t.baked_params.push_back({
kCrossfeed, 0.0f, 1.0f, 0.0f});
146 t.baked_params.push_back({
kCharacter, 0.0f, 1.0f, 0.5f});
147 t.baked_params.push_back({
kModRate, 0.0f, 1.0f, 0.3f});
148 t.baked_params.push_back({
kModDepth, 0.0f, 1.0f, 0.0f});
149 t.baked_params.push_back({
kDuck, 0.0f, 1.0f, 0.0f});
150 t.baked_params.push_back({
kFreeze, 0.0f, 1.0f, 0.0f});
151 t.baked_params.push_back({
kReverse, 0.0f, 1.0f, 0.0f});
157 const float* in_left = in.channel_ptr(0);
158 const float* in_right = in.channel_ptr(1);
159 float* out_left = out.channel_ptr(0);
160 float* out_right = out.channel_ptr(1);
166 for (
int k = 0; k < n; ++k) {
167 const auto offset =
static_cast<std::int32_t
>(k);
168 s->delay.set_time_ms(params.value_at(
kTimeMs, offset));
169 s->delay.set_time_offset(params.value_at(
kTimeOffset, offset));
170 s->delay.set_feedback(params.value_at(
kFeedback, offset));
171 s->delay.set_crossfeed(params.value_at(
kCrossfeed, offset));
172 s->delay.set_character_amount(params.value_at(
kCharacter, offset));
173 s->delay.set_mod(params.value_at(
kModRate, offset),
175 s->delay.set_duck(params.value_at(
kDuck, offset));
179 float left = in_left[
static_cast<std::size_t
>(k)];
180 float right = in_right[
static_cast<std::size_t
>(k)];
181 s->delay.process(&left, &right, 1);
182 out_left[
static_cast<std::size_t
>(k)] = left;
183 out_right[
static_cast<std::size_t
>(k)] = right;
191 d.key =
"character_delay";
192 d.label =
"Character Delay";
193 d.description =
"Stereo wet-only delay spanning clean, vintage digital, tape, bucket-brigade, "
194 "and diffused echoes.";
195 d.axes = {{
"character",
197 "Delay-line and coloration topology fixed when the node is built.",
198 {{
"clean",
"Clean", 0.0f},
199 {
"vintage",
"Vintage Digital", 1.0f},
200 {
"tape",
"Tape", 2.0f},
201 {
"tape_physical",
"Tape (Physical)", 3.0f},
202 {
"bbd",
"BBD", 4.0f},
203 {
"diffusion",
"Diffusion", 5.0f}}}};
222 "Amount of each channel fed into the opposite channel's feedback path.",
227 {
"mod_rate",
kModRate,
"Modulation Rate",
"%",
228 "Rate of delay-time instability within the selected character.",
230 {
"mod_depth",
kModDepth,
"Modulation Depth",
"%",
"Depth of delay-time instability.",
232 {
"duck",
kDuck,
"Duck",
"%",
"Reduces delayed output while the input is active.",
238 "Holds the current delay contents in a sustaining feedback loop.",
241 {{
"off",
"Off", 0.0f}, {
"on",
"On", 1.0f}}},
246 "Reads completed delay segments in reverse.",
249 {{
"off",
"Off", 0.0f}, {
"on",
"On", 1.0f}}},
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition custom_node_type.hpp:51
Character
Definition character_delay.hpp:87
TapeTier
Definition character_delay.hpp:88
Stepped controls fail closed on malformed host automation.
Definition forge_character_delay_catalog.hpp:75
bool baked_switch_on(float value) noexcept
Definition forge_character_delay_catalog.hpp:76
Definition forge_character_delay_catalog.hpp:40
constexpr state::ParamID kCharacter
Definition forge_character_delay_catalog.hpp:62
CustomNodeType make_character_delay_node(Character character, TapeTier tier=TapeTier::standard, float tape_speed_ips=7.5f)
One factory, six registered realizations.
Definition forge_character_delay_catalog.hpp:117
constexpr state::ParamID kModRate
Definition forge_character_delay_catalog.hpp:63
ForgeNodeDescriptor character_delay_descriptor()
Definition forge_character_delay_catalog.hpp:189
const char * character_delay_default_name(Character character, TapeTier tier)
Definition forge_character_delay_catalog.hpp:99
constexpr const char * kBbdTypeId
Definition forge_character_delay_catalog.hpp:49
constexpr const char * kVintageTypeId
Definition forge_character_delay_catalog.hpp:47
constexpr state::ParamID kTimeOffset
Definition forge_character_delay_catalog.hpp:59
constexpr state::ParamID kTimeMs
Definition forge_character_delay_catalog.hpp:58
signal::CharacterDelay::TapeTier TapeTier
Definition forge_character_delay_catalog.hpp:43
constexpr const char * kTapePhysicalTypeId
The physical tape tier is its own realization of the same factory: the tier is a construction-time co...
Definition forge_character_delay_catalog.hpp:54
constexpr state::ParamID kDuck
Definition forge_character_delay_catalog.hpp:65
constexpr const char * kDiffusionTypeId
Definition forge_character_delay_catalog.hpp:50
constexpr const char * kCleanTypeId
Definition forge_character_delay_catalog.hpp:46
constexpr state::ParamID kFreeze
Definition forge_character_delay_catalog.hpp:66
constexpr const char * kTapeTypeId
Definition forge_character_delay_catalog.hpp:48
constexpr state::ParamID kCrossfeed
Definition forge_character_delay_catalog.hpp:61
const char * character_delay_type_id(Character character, TapeTier tier=TapeTier::standard)
Stable type id for a (character, tier) pair.
Definition forge_character_delay_catalog.hpp:86
constexpr state::ParamID kFeedback
Definition forge_character_delay_catalog.hpp:60
constexpr float kMaxTimeMs
Longest addressable delay, in ms. Matches the DSP's own maximum.
Definition forge_character_delay_catalog.hpp:70
constexpr state::ParamID kReverse
Definition forge_character_delay_catalog.hpp:67
signal::CharacterDelay::Character Character
Definition forge_character_delay_catalog.hpp:42
constexpr state::ParamID kModDepth
Definition forge_character_delay_catalog.hpp:64
@ stepped
Definition forge_param_descriptor.hpp:25
@ continuous
Definition forge_param_descriptor.hpp:25
@ logarithmic
Definition forge_param_descriptor.hpp:29
@ linear
Definition forge_param_descriptor.hpp:29
CharacterDelayT< float > CharacterDelay
Definition character_delay.hpp:854
uint32_t ParamID
Unique parameter identifier, stable across plugin versions.
Definition parameter.hpp:55
Definition custom_node_type.hpp:90
Definition forge_param_descriptor.hpp:127
Definition forge_character_delay_catalog.hpp:81
signal::CharacterDelay delay
Definition forge_character_delay_catalog.hpp:82