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

Classes

struct  Instance

Typedefs

using Engine = signal::ChorusEnsemble
using Voicing = Engine::Voicing
using JunoMode = Engine::JunoMode

Functions

std::string chorus_type_id (Voicing voicing, JunoMode juno_mode, bool bbd_color)
 The type id for one realization.
std::string chorus_display_name (Voicing voicing, JunoMode juno_mode, bool bbd_color)
float chorus_worst_case_gain (Voicing voicing, double sample_rate)
 Worst-case linear gain for the Forge registry (series law 8).
CustomNodeType make_chorus_node (Voicing voicing=Voicing::ce2, JunoMode juno_mode=JunoMode::mode_I, bool bbd_color=false)
 One chorus voicing as a lowerable custom node.

Variables

constexpr state::ParamID kRateHz = 1
constexpr state::ParamID kDepth = 2
constexpr state::ParamID kMix = 3
constexpr state::ParamID kStereoWidth = 4
constexpr double kRateMinHz = 0.05
 The registered rate span, in Hz.
constexpr double kRateMaxHz = 10.0

Typedef Documentation

◆ Engine

◆ JunoMode

◆ Voicing

Function Documentation

◆ chorus_display_name()

std::string pulp::host::modulation::chorus::chorus_display_name ( Voicing voicing,
JunoMode juno_mode,
bool bbd_color )

◆ chorus_type_id()

std::string pulp::host::modulation::chorus::chorus_type_id ( Voicing voicing,
JunoMode juno_mode,
bool bbd_color )

The type id for one realization.

Built from the arguments rather than picked from a fixed list, because the realization axes multiply: four voicings, three Juno positions on one of them, and the colour stage on any. A registry that gave two differently behaving nodes the same id would make a session unreloadable in the direction that is hardest to notice — it loads, and sounds wrong.

◆ chorus_worst_case_gain()

float pulp::host::modulation::chorus::chorus_worst_case_gain ( Voicing voicing,
double sample_rate )

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

Delegates to the DSP's own closed-form L1 bound rather than restating it, because two of its terms are counterintuitive and a hand-written number would get them wrong: each modulated tap carries the 4-point Lagrange kernel's L1 norm of 1.25 rather than unity, and the Dimension D's cross-feed high-pass carries nearly 2 rather than the unity its passband gain suggests. The DSP suite recomputes both directly from the shipped kernel.

Reported at the node's PARAMETER CEILING — full stereo width — because a baked param can be automated anywhere in its declared range, and width multiplies two of the terms.

◆ make_chorus_node()

CustomNodeType pulp::host::modulation::chorus::make_chorus_node ( Voicing voicing = Voicing::ce2,
JunoMode juno_mode = JunoMode::mode_I,
bool bbd_color = false )

One chorus voicing as a lowerable custom node.

voicing, juno_mode and bbd_color are REGISTRATION-TIME REALIZATIONS, and none of them is frozen for the usual latency reason — this engine reports zero latency in every configuration. Three separate arguments force it:

  • The voicings differ in VOICE COUNT (one tap for the CE-2, two for the Juno and Dimension D, three for the TriChorus) and in the matrix that recombines them. That is topology, not coefficients.
  • set_voicing and set_juno_mode REWIND EVERY LFO PHASE and overwrite the rate with the voicing's own table value. Injected per sample they would hold every modulator at phase zero, and the node would render a static comb that a reviewer would describe as "the chorus sounds weak".
  • mode_I_plus_II engages BOTH of the Juno's LFOs rather than selecting a third one, so even within the Juno the mode is a voice-count change.
  • bbd_color routes every tap through a companded, clock-jittered BBD device model. It is a fidelity-and-CPU policy for the artifact's life, which is the same argument that freezes the saturator's antialiasing.

What is left — rate, depth, mix and width — are pure coefficient stores, and they inject.

Variable Documentation

◆ kDepth

state::ParamID pulp::host::modulation::chorus::kDepth = 2
inlineconstexpr

◆ kMix

state::ParamID pulp::host::modulation::chorus::kMix = 3
inlineconstexpr

◆ kRateHz

state::ParamID pulp::host::modulation::chorus::kRateHz = 1
inlineconstexpr

◆ kRateMaxHz

double pulp::host::modulation::chorus::kRateMaxHz = 10.0
inlineconstexpr

◆ kRateMinHz

double pulp::host::modulation::chorus::kRateMinHz = 0.05
inlineconstexpr

The registered rate span, in Hz.

The DSP clamps to the same window; quoting it here rather than restating numbers keeps the two from drifting.

◆ kStereoWidth

state::ParamID pulp::host::modulation::chorus::kStereoWidth = 4
inlineconstexpr