66 case fdn::Mode::count:
break;
73 case fdn::Mode::room:
return "Room";
74 case fdn::Mode::hall:
return "Hall";
75 case fdn::Mode::galaxy:
return "Galaxy";
76 case fdn::Mode::shimmer:
return "Shimmer";
77 case fdn::Mode::lofi:
return "Lo-Fi";
78 case fdn::Mode::count:
break;
93 return static_cast<fdn::Param
>(
static_cast<int>(id) - 1);
113 return value >= 0.5f ? fdn::Tier::classic : fdn::Tier::network;
120inline constexpr float kWorstCaseGain =
static_cast<float>(fdn::kWetLimiterHeadroom);
124 fdn::Mode
mode = fdn::Mode::hall;
131 for (
int p = 0; p < fdn::kNumParams; ++p) {
132 const fdn::ParamSpec& spec = fdn::kParamSpecs[
static_cast<std::size_t
>(p)];
133 const auto param =
static_cast<fdn::Param
>(p);
134 t.baked_params.push_back({
param_id_for(param),
static_cast<float>(spec.min),
135 static_cast<float>(spec.max),
136 static_cast<float>(fdn::mode_default(mode, param))});
138 t.baked_params.push_back({
kTier, 0.0f, 1.0f, 0.0f});
145 t.num_input_ports = 2;
146 t.num_output_ports = 2;
150 const auto captured_mode = mode;
151 t.create = [captured_mode]() ->
void* {
153 s->mode = captured_mode;
156 t.destroy = [](
void* p) {
delete static_cast<ReverbInstance*
>(p); };
157 t.prepare = [](
void* p,
double sr,
int max_block) {
162 s->engine.prepare(sr, std::max(max_block, 1));
163 s->engine.set_mode(s->mode);
165 t.reset = [](
void* p) {
static_cast<ReverbInstance*
>(p)->engine.reset(); };
169 t.process_instance_baked_param =
173 const float* il = in.channel_ptr(0);
174 const float* ir = in.channel_ptr(1);
175 float* ol = out.channel_ptr(0);
176 float* or_ = out.channel_ptr(1);
178 for (
int offset = 0; offset < n; offset += fdn::kControlRateSamples) {
179 const int chunk = std::min(n - offset, fdn::kControlRateSamples);
180 const auto at =
static_cast<std::int32_t
>(offset);
181 for (
int k = 0; k < fdn::kNumParams; ++k) {
182 const auto param =
static_cast<fdn::Param
>(k);
183 s->engine.set_parameter(
184 param,
static_cast<double>(params.value_at(
param_id_for(param), at)));
187 s->engine.process_block(il + offset, ir + offset, ol + offset,
188 or_ + offset, chunk);
196 d.key =
"fdn_reverb";
197 d.label =
"FDN Reverb";
198 d.description =
"True-stereo multirate feedback-delay-network reverb with five musical "
199 "voicings and a wet-only output, plus a lighter classic comb/allpass "
200 "tier behind the same controls.";
203 "A complete voicing of the shared tank, including its starting "
204 "parameter values and output damping.",
205 {{
"room",
"Room", 0.0f},
206 {
"hall",
"Hall", 1.0f},
207 {
"galaxy",
"Galaxy", 2.0f},
208 {
"shimmer",
"Shimmer", 3.0f},
209 {
"lofi",
"Lo-Fi", 4.0f}}}};
220 {
"size",
kSize,
"Size",
"%",
"Scales the tank's delay-line lengths.",
222 {
"predelay",
kPredelay,
"Predelay",
"ms",
223 "Time between the dry event and the start of the reverberant field.",
225 {
"damp_hi",
kDampHi,
"High Damping",
"%",
"Shortens the decay of high frequencies.",
227 {
"damp_lo",
kDampLo,
"Low Damping",
"%",
"Shortens the decay of low frequencies.",
232 {
"mod",
kMod,
"Modulation",
"%",
235 {
"shimmer",
kShimmer,
"Shimmer",
"%",
238 {
"drive",
kDrive,
"Drive",
"%",
"Nonlinear drive within the reverberant return.",
240 {
"bloom",
kBloom,
"Bloom",
"%",
"Builds late-tail energy after the initial reflections.",
242 {
"width",
kWidth,
"Width",
"%",
"Stereo spread of the wet return.",
244 {
"tank_rate",
kTankRate,
"Tank Rate",
"Hz",
"Internal multirate tank processing frequency.",
250 "Feedback-delay network, or the lighter classic comb and allpass reverb. Low "
251 "damping, modulation, shimmer, drive, bloom, and tank rate apply to the network only.",
254 {{
"fdn",
"FDN", 0.0f}, {
"classic",
"Classic", 1.0f}}},
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition custom_node_type.hpp:51
Definition fdn_reverb.hpp:56
Definition forge_fdn_reverb_catalog.hpp:46
CustomNodeType make_fdn_reverb_node(fdn::Mode mode)
Definition forge_fdn_reverb_catalog.hpp:141
constexpr const char * kShimmerTypeId
Definition forge_fdn_reverb_catalog.hpp:56
constexpr const char * kHallTypeId
Definition forge_fdn_reverb_catalog.hpp:54
constexpr state::ParamID kDampHi
Definition forge_fdn_reverb_catalog.hpp:99
constexpr state::ParamID kDecay
Definition forge_fdn_reverb_catalog.hpp:96
constexpr state::ParamID kPredelay
Definition forge_fdn_reverb_catalog.hpp:98
constexpr fdn::Param engine_param_for(state::ParamID id)
Definition forge_fdn_reverb_catalog.hpp:92
constexpr state::ParamID kDrive
Definition forge_fdn_reverb_catalog.hpp:104
constexpr float kWorstCaseGain
Definition forge_fdn_reverb_catalog.hpp:120
constexpr state::ParamID kShimmer
Definition forge_fdn_reverb_catalog.hpp:103
constexpr const char * type_id_for(fdn::Mode mode)
Definition forge_fdn_reverb_catalog.hpp:59
ForgeNodeDescriptor fdn_reverb_descriptor()
Definition forge_fdn_reverb_catalog.hpp:194
constexpr state::ParamID kWidth
Definition forge_fdn_reverb_catalog.hpp:106
constexpr const char * display_name_for(fdn::Mode mode)
Definition forge_fdn_reverb_catalog.hpp:71
constexpr state::ParamID kTankRate
Definition forge_fdn_reverb_catalog.hpp:107
constexpr state::ParamID kDiffusion
Definition forge_fdn_reverb_catalog.hpp:101
constexpr state::ParamID kSize
Definition forge_fdn_reverb_catalog.hpp:97
constexpr const char * kRoomTypeId
Definition forge_fdn_reverb_catalog.hpp:53
constexpr state::ParamID kDampLo
Definition forge_fdn_reverb_catalog.hpp:100
constexpr state::ParamID kMod
Definition forge_fdn_reverb_catalog.hpp:102
constexpr state::ParamID kTier
Definition forge_fdn_reverb_catalog.hpp:110
void declare_params(CustomNodeType &t, fdn::Mode mode)
Definition forge_fdn_reverb_catalog.hpp:130
constexpr state::ParamID kBloom
Definition forge_fdn_reverb_catalog.hpp:105
constexpr const char * kLofiTypeId
Definition forge_fdn_reverb_catalog.hpp:57
constexpr fdn::Tier tier_for(float value)
Definition forge_fdn_reverb_catalog.hpp:112
constexpr const char * kGalaxyTypeId
Definition forge_fdn_reverb_catalog.hpp:55
constexpr state::ParamID param_id_for(fdn::Param p)
Definition forge_fdn_reverb_catalog.hpp:88
@ 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
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_fdn_reverb_catalog.hpp:122
fdn::Mode mode
Definition forge_fdn_reverb_catalog.hpp:124
signal::FdnReverbT< float > engine
Definition forge_fdn_reverb_catalog.hpp:123