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

Classes

struct  Instance

Typedefs

using Quant = signal::QuantizeScale

Functions

float quantize_scale_worst_case_gain ()
 Worst-case linear gain for the Forge registry (series law 8).
float quantize_scale_mask_offset_bound_v ()
 The additive ceiling of scale-mask mode, in volts: the rounding boundary plus the widest hysteresis window plus the furthest a snap can travel (six semitones, from a mask with a single bit set).
CustomNodeType make_quantize_scale_node ()
ForgeNodeDescriptor descriptor ()

Variables

constexpr const char * kTypeId = "sequencing.quantize_scale"
constexpr state::ParamID kMode = 1
constexpr state::ParamID kEdoN = 2
constexpr state::ParamID kScaleMask = 3
constexpr state::ParamID kRootPc = 4
constexpr state::ParamID kHystCents = 5
constexpr state::ParamID kReset = 6

Typedef Documentation

◆ Quant

Function Documentation

◆ descriptor()

ForgeNodeDescriptor pulp::host::sequencing::quantize::descriptor ( )
inline

◆ make_quantize_scale_node()

CustomNodeType pulp::host::sequencing::quantize::make_quantize_scale_node ( )

◆ quantize_scale_mask_offset_bound_v()

float pulp::host::sequencing::quantize::quantize_scale_mask_offset_bound_v ( )

The additive ceiling of scale-mask mode, in volts: the rounding boundary plus the widest hysteresis window plus the furthest a snap can travel (six semitones, from a mask with a single bit set).

◆ quantize_scale_worst_case_gain()

float pulp::host::sequencing::quantize::quantize_scale_worst_case_gain ( )

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

The only node here with a real input-to-output amplitude path, so the only one whose number is a genuine ratio — and it is derived, not measured, at the node's PARAMETER CEILINGS, because a baked param can be automated anywhere in its declared range.

The memoryless answer is 2: out = round(in·N)/N is 0 below half a step, and the worst ratio is at |in| = 0.5/N, where (1/N)/(0.5/N) = 2. That is not this node's bound, because the block is not memoryless — the hysteresis latch is its entire reason for existing. The latch holds a step while the input stays within 0.5 + window of it, so an output of one step survives down to an input of 0.5 − window steps, and the ratio is 1/(0.5 − window). The window is capped at kMaxHystSteps (0.45), which the 50-cent ceiling of hyst_cents reaches at every division from EDO-30 up. So the bound is 1/(0.5 − 0.45) = 20, and the suite constructs exactly that operating point rather than assuming it is unreachable.

Scale-mask mode is NOT multiplicatively bounded at all: with a one-note mask an input arbitrarily near 0 V is snapped up to six semitones away, so the ratio is unbounded as the input approaches zero. Its invariant is ADDITIVE — |out| ≤ |in| + (0.5 + kMaxHystSteps + 6)/12 V — and reporting that as a gain would be a fabrication, so it is stated and asserted separately below.

Variable Documentation

◆ kEdoN

state::ParamID pulp::host::sequencing::quantize::kEdoN = 2
inlineconstexpr

◆ kHystCents

state::ParamID pulp::host::sequencing::quantize::kHystCents = 5
inlineconstexpr

◆ kMode

state::ParamID pulp::host::sequencing::quantize::kMode = 1
inlineconstexpr

◆ kReset

state::ParamID pulp::host::sequencing::quantize::kReset = 6
inlineconstexpr

◆ kRootPc

state::ParamID pulp::host::sequencing::quantize::kRootPc = 4
inlineconstexpr

◆ kScaleMask

state::ParamID pulp::host::sequencing::quantize::kScaleMask = 3
inlineconstexpr

◆ kTypeId

const char* pulp::host::sequencing::quantize::kTypeId = "sequencing.quantize_scale"
inlineconstexpr