45 t.type_id =
"eurorack.attenuverter";
47 t.num_input_ports = t.num_output_ports = 1;
48 t.default_name =
"Attenuverter";
52 t.prepare = [](
void*, double, int) {};
53 t.reset = [](
void*) {};
54 t.baked_params = {{
kAmount, -1.0f, 1.0f, 1.0f},
59 const float* input = in.channel_ptr(0);
60 float* output = out.channel_ptr(0);
61 for (
int i = 0; i < n; ++i) {
62 const auto o =
static_cast<std::int32_t
>(i);
63 output[
static_cast<std::size_t
>(i)] =
64 input[
static_cast<std::size_t
>(i)] * params.value_at(
kAmount, o)
82 t.type_id =
"eurorack.slew";
84 t.num_input_ports = t.num_output_ports = 1;
85 t.default_name =
"Slew Limiter";
88 t.destroy = [](
void* p) {
delete static_cast<SlewInstance*
>(p); };
89 t.prepare = [](
void* p,
double sr, int) {
91 s.sample_time = sr > 0.0 ? 1.0 / sr : 1.0 / 48000.0;
94 t.reset = [](
void* p) {
static_cast<SlewInstance*
>(p)->y = 0.0f; };
101 const float* input = in.channel_ptr(0);
102 float* output = out.channel_ptr(0);
103 const auto dt =
static_cast<float>(s.sample_time);
104 for (
int i = 0; i < n; ++i) {
105 const auto o =
static_cast<std::int32_t
>(i);
106 const float x = input[
static_cast<std::size_t
>(i)];
107 const float t_s = (x > s.y) ? params.value_at(
kSlewRise, o)
114 const float step = slope * dt;
115 s.y += std::clamp(x - s.y, -step, step);
117 output[
static_cast<std::size_t
>(i)] = s.y;
135 t.type_id =
"eurorack.clock_divider";
137 t.num_input_ports = t.num_output_ports = 1;
138 t.default_name =
"Clock Divider";
144 t.baked_params = {{
kDivision, 1.0f, 64.0f, 2.0f}};
149 const float* input = in.channel_ptr(0);
150 float* output = out.channel_ptr(0);
151 for (
int i = 0; i < n; ++i) {
152 const auto o =
static_cast<std::int32_t
>(i);
153 const float v = input[
static_cast<std::size_t
>(i)];
157 const auto div =
static_cast<std::int64_t
>(
158 std::max(1.0f, std::round(params.value_at(
kDivision, o))));
159 if (++s.count >= div) {
169 output[
static_cast<std::size_t
>(i)] = s.out_high ?
kGateHigh : 0.0f;
185 t.type_id =
"eurorack.sample_hold";
187 t.num_input_ports = 2;
188 t.num_output_ports = 1;
189 t.default_name =
"Sample & Hold";
198 const float*
signal = in.channel_ptr(0);
199 const float* trigger = in.channel_ptr(1);
200 float* output = out.channel_ptr(0);
201 for (
int i = 0; i < n; ++i) {
202 const auto index =
static_cast<std::size_t
>(i);
203 const float v = trigger[index];
210 output[index] = s.held;
222 return {
"eurorack_attenuverter",
"Attenuverter",
223 "Scales, inverts, and offsets a Eurorack control-voltage signal.",
224 {}, {{
"default",
"eurorack.attenuverter"}},
225 {{
"amount",
kAmount,
"Amount",
"",
226 "Scales the input from full inversion through zero to unity.",
228 {
"offset_v",
kOffset,
"Offset",
"V",
229 "Adds a bipolar voltage offset after scaling.",
234 return {
"eurorack_slew",
"Slew Limiter",
235 "Limits independent rising and falling CV slopes for glide and lag processing.",
236 {}, {{
"default",
"eurorack.slew"}},
238 "Sets the time for a ten-volt upward transition.",
241 "Sets the time for a ten-volt downward transition.",
246 return {
"eurorack_clock_divider",
"Clock Divider",
247 "Emits a ten-volt gate on every Nth Schmitt-detected input clock edge.",
248 {}, {{
"default",
"eurorack.clock_divider"}},
250 "Sets the integer input-clock division from one through sixty-four.",
255 return {
"eurorack_sample_hold",
"Sample & Hold",
256 "Captures the signal input on each Schmitt-detected trigger edge and holds it.",
257 {}, {{
"default",
"eurorack.sample_hold"}}, {}};
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition custom_node_type.hpp:51
Definition forge_eurorack_utility_catalog.hpp:20
constexpr float kGateHigh
Definition forge_eurorack_utility_catalog.hpp:26
ForgeNodeDescriptor attenuverter_descriptor()
Definition forge_eurorack_utility_catalog.hpp:221
CustomNodeType make_clock_divider_node()
Definition forge_eurorack_utility_catalog.hpp:133
constexpr state::ParamID kAmount
Definition forge_eurorack_utility_catalog.hpp:30
CustomNodeType make_slew_node()
Definition forge_eurorack_utility_catalog.hpp:80
constexpr state::ParamID kSlewFall
Definition forge_eurorack_utility_catalog.hpp:33
constexpr float kAudioPeak
Published voltage standards, in one place so nodes cannot drift apart.
Definition forge_eurorack_utility_catalog.hpp:23
constexpr state::ParamID kDivision
Definition forge_eurorack_utility_catalog.hpp:34
CustomNodeType make_attenuverter_node()
Definition forge_eurorack_utility_catalog.hpp:43
constexpr state::ParamID kOffset
Definition forge_eurorack_utility_catalog.hpp:31
ForgeNodeDescriptor clock_divider_descriptor()
Definition forge_eurorack_utility_catalog.hpp:245
ForgeNodeDescriptor sample_hold_descriptor()
Definition forge_eurorack_utility_catalog.hpp:254
CustomNodeType make_sample_hold_node()
Definition forge_eurorack_utility_catalog.hpp:183
constexpr float kSchmittHigh
Definition forge_eurorack_utility_catalog.hpp:28
constexpr float kCvUnipolarMax
Definition forge_eurorack_utility_catalog.hpp:24
constexpr float kCvBipolarPeak
Definition forge_eurorack_utility_catalog.hpp:25
constexpr float kSchmittLow
Definition forge_eurorack_utility_catalog.hpp:27
constexpr state::ParamID kSlewRise
Definition forge_eurorack_utility_catalog.hpp:32
ForgeNodeDescriptor slew_descriptor()
Definition forge_eurorack_utility_catalog.hpp:233
@ continuous
Definition forge_param_descriptor.hpp:25
@ linear
Definition forge_param_descriptor.hpp:29
Definition additive_bank.hpp:218
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_eurorack_utility_catalog.hpp:41
Definition forge_eurorack_utility_catalog.hpp:127
bool high
Definition forge_eurorack_utility_catalog.hpp:128
bool out_high
Definition forge_eurorack_utility_catalog.hpp:130
std::int64_t count
Definition forge_eurorack_utility_catalog.hpp:129
Definition forge_eurorack_utility_catalog.hpp:178
bool high
Definition forge_eurorack_utility_catalog.hpp:179
float held
Definition forge_eurorack_utility_catalog.hpp:180
Definition forge_eurorack_utility_catalog.hpp:75
double sample_time
Definition forge_eurorack_utility_catalog.hpp:77
float y
Definition forge_eurorack_utility_catalog.hpp:76