Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::host::synthesis::additive Namespace Reference

Classes

struct  Instance

Enumerations

enum class  Voice : std::uint8_t { organ , bell }
 The two registered voices. More...

Functions

float additive_bank_worst_case_gain ()
 Worst-case linear gain for the Forge registry (series law 8).
CustomNodeType make_additive_bank_node (Voice voice=Voice::organ, int max_partials=kNodeMaxPartials)
 voice picks the registered type id and the partial table; max_partials is the allocation ceiling.
ForgeNodeDescriptor descriptor ()

Variables

constexpr const char * kOrganTypeId = "synthesis.additive_organ"
constexpr const char * kBellTypeId = "synthesis.additive_bell"
constexpr state::ParamID kFundamentalHz = 1
constexpr state::ParamID kPartialCount = 2
constexpr state::ParamID kInharmonicity = 3
constexpr state::ParamID kSpectralTilt = 4
constexpr state::ParamID kMasterGainDb = 5
constexpr state::ParamID kEnvelopeMode = 6
constexpr state::ParamID kRetrigPhase = 7
constexpr state::ParamID kAttackMs = 8
constexpr state::ParamID kReleaseMs = 9
constexpr state::ParamID kDetuneCents = 10
constexpr int kNodeMaxPartials = signal::AdditiveBank::kMaxPartialsDefault
 Partial ceiling this node instantiates.
constexpr float kGateOn = 0.5f
 Gate thresholds on the CV input, with hysteresis so a noisy or slewed gate cannot retrigger on every sample near the threshold.
constexpr float kGateOff = 0.25f

Enumeration Type Documentation

◆ Voice

enum class pulp::host::synthesis::additive::Voice : std::uint8_t
strong

The two registered voices.

See the header note: the split exists because a modal voice has no inharmonicity control, not merely because the tables differ.

Enumerator
organ 

Harmonic, sustained. inharmonicity applies.

bell 

Modal, per-partial decays. No inharmonicity parameter.

Function Documentation

◆ additive_bank_worst_case_gain()

float pulp::host::synthesis::additive::additive_bank_worst_case_gain ( )

Worst-case linear gain for the Forge registry (series law 8).

Cited, not estimated: the DSP ships worst_case_gain() as an EQUALITY attained with aligned phases — its crest normaliser bounds the partial sum to 1 by construction, so the whole worst case is the master trim's legal maximum — and its own suite asserts both halves of that bound. Reported at the node's parameter ceiling, since master_gain_db is injectable and a baked param can be automated anywhere in its declared range.

◆ descriptor()

ForgeNodeDescriptor pulp::host::synthesis::additive::descriptor ( )

◆ make_additive_bank_node()

CustomNodeType pulp::host::synthesis::additive::make_additive_bank_node ( Voice voice = Voice::organ,
int max_partials = kNodeMaxPartials )

voice picks the registered type id and the partial table; max_partials is the allocation ceiling.

Both are frozen here — see the header note.

Variable Documentation

◆ kAttackMs

state::ParamID pulp::host::synthesis::additive::kAttackMs = 8
inlineconstexpr

◆ kBellTypeId

const char* pulp::host::synthesis::additive::kBellTypeId = "synthesis.additive_bell"
inlineconstexpr

◆ kDetuneCents

state::ParamID pulp::host::synthesis::additive::kDetuneCents = 10
inlineconstexpr

◆ kEnvelopeMode

state::ParamID pulp::host::synthesis::additive::kEnvelopeMode = 6
inlineconstexpr

◆ kFundamentalHz

state::ParamID pulp::host::synthesis::additive::kFundamentalHz = 1
inlineconstexpr

◆ kGateOff

float pulp::host::synthesis::additive::kGateOff = 0.25f
inlineconstexpr

◆ kGateOn

float pulp::host::synthesis::additive::kGateOn = 0.5f
inlineconstexpr

Gate thresholds on the CV input, with hysteresis so a noisy or slewed gate cannot retrigger on every sample near the threshold.

Schmitt, not a single edge, for the same reason the vocoder's voicing decision is. [design parameter] defaults 0.5 / 0.25, ranges 0.2 .. 0.9 and 0.05 .. 0.5, with kGateOff < kGateOn by construction.

◆ kInharmonicity

state::ParamID pulp::host::synthesis::additive::kInharmonicity = 3
inlineconstexpr

◆ kMasterGainDb

state::ParamID pulp::host::synthesis::additive::kMasterGainDb = 5
inlineconstexpr

◆ kNodeMaxPartials

int pulp::host::synthesis::additive::kNodeMaxPartials = signal::AdditiveBank::kMaxPartialsDefault
inlineconstexpr

Partial ceiling this node instantiates.

The DSP supports up to kMaxPartialsCeiling; this is the value baked in, which sizes the bank at prepare() and fixes the partial_count param's declared maximum. [design parameter] default 128, range 1 .. 256.

◆ kOrganTypeId

const char* pulp::host::synthesis::additive::kOrganTypeId = "synthesis.additive_organ"
inlineconstexpr

◆ kPartialCount

state::ParamID pulp::host::synthesis::additive::kPartialCount = 2
inlineconstexpr

◆ kReleaseMs

state::ParamID pulp::host::synthesis::additive::kReleaseMs = 9
inlineconstexpr

◆ kRetrigPhase

state::ParamID pulp::host::synthesis::additive::kRetrigPhase = 7
inlineconstexpr

◆ kSpectralTilt

state::ParamID pulp::host::synthesis::additive::kSpectralTilt = 4
inlineconstexpr