20inline constexpr const char*
kTypeId =
"wavetable.oscillator";
42 t.num_input_ports = 0;
43 t.num_output_ports = 1;
44 t.default_name =
"Wavetable Oscillator";
47 t.create = []() ->
void* {
return new Instance{}; };
48 t.destroy = [](
void* p) {
delete static_cast<Instance*
>(p); };
49 t.prepare = [](
void* p,
double sample_rate,
int ) {
51 s->bank.set_sample_rate(
static_cast<float>(sample_rate));
52 s->bank.set_frequency_immediate(220.0f);
55 t.reset = [](
void* p) {
static_cast<Instance*
>(p)->bank.reset(); };
57 t.baked_params.push_back({
kFrequencyHz, 20.0f, 20000.0f, 220.0f});
58 t.baked_params.push_back({
kPosition, 0.0f, 1.0f, 0.0f});
59 t.baked_params.push_back({
kLevelDb, -60.0f, 0.0f, -12.0f});
65 float* output = out.channel_ptr(0);
66 for (
int k = 0; k < n; ++k) {
67 const auto offset =
static_cast<std::int32_t
>(k);
68 s->bank.set_frequency(params.value_at(
kFrequencyHz, offset));
69 s->bank.set_position(params.value_at(
kPosition, offset));
70 const float gain = std::pow(10.0f, params.value_at(
kLevelDb, offset) / 20.0f);
71 output[
static_cast<std::size_t
>(k)] = s->bank.next() * gain;
79 "wavetable_oscillator",
80 "Wavetable Oscillator",
81 "An oscillator that morphs continuously across sine, saw, square, and triangle tables.",
91 {
"level_db",
kLevelDb,
"Level",
"dB",
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition custom_node_type.hpp:51
static WavetableT make_saw(std::size_t bands=10, std::size_t table_length=2048, float reference_sample_rate=float{48000.0f})
static WavetableT make_triangle(std::size_t bands=10, std::size_t table_length=2048, float reference_sample_rate=float{48000.0f})
static WavetableT make_square(std::size_t bands=10, std::size_t table_length=2048, float reference_sample_rate=float{48000.0f})
static WavetableT make_sine(std::size_t table_length=2048, float reference_sample_rate=float{48000.0f})
Definition forge_wavetable_catalog.hpp:18
constexpr state::ParamID kPosition
Definition forge_wavetable_catalog.hpp:23
CustomNodeType make_wavetable_oscillator_node()
Definition forge_wavetable_catalog.hpp:38
constexpr float worst_case_gain()
Definition forge_wavetable_catalog.hpp:98
constexpr const char * kTypeId
Definition forge_wavetable_catalog.hpp:20
constexpr state::ParamID kLevelDb
Definition forge_wavetable_catalog.hpp:24
constexpr state::ParamID kFrequencyHz
Definition forge_wavetable_catalog.hpp:22
ForgeNodeDescriptor descriptor()
Definition forge_wavetable_catalog.hpp:77
@ continuous
Definition forge_param_descriptor.hpp:25
@ logarithmic
Definition forge_param_descriptor.hpp:29
@ linear
Definition forge_param_descriptor.hpp:29
Definition additive_bank.hpp:218
WavetableBankT< float > WavetableBank
Definition wavetable.hpp:308
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_wavetable_catalog.hpp:26
signal::WavetableBank bank
Definition forge_wavetable_catalog.hpp:27
Instance()
Definition forge_wavetable_catalog.hpp:29
Wavetable oscillator with band-switching + bank morphing.