src/params.rs:497 — top_decay_ms, the metallic/inharmonic section:
FloatRange::Skewed { min: 1.0, max: 50.0, factor: skew_factor(-1.0) } // default 6.0
Absolute ceiling is about 79 ms, once both multipliers are maxed: drift ±5% (dsp/drift.rs:66) and accent +50% on decay (dsp/engine.rs:144). A crash or ride wants 1 to 3 seconds, so Niner is 20 to 60x short and cannot cover cymbals or open hats that ring.
For reference, the other decays: Mid Noise Decay 1-400 ms (params.rs:491), Mid Decay 20-1000 ms (params.rs:474). Both are body/noise rather than inharmonic metal, so neither substitutes. A 400 ms noise tail does give a usable open hat, but not a cymbal.
Please do not simply widen the existing range
nih-plug stores parameter values normalized 0-1. Raising max from 50 to, say, 3000 ms silently reinterprets every value already stored: 0.9975 would become ~3000 ms instead of ~50 ms. That changes the sound of every existing preset and every user's saved session.
Concretely, the skew math for this knob (skew_factor(-1.0) = 0.5, so exponent 2) is value = min + (max-min) x normalized^2. A stored 0.9975 is 1 + 49 x 0.995 ≈ 49.8 ms today.
Suggested approach
Add a separate parameter (a Top Sustain, or a cymbal mode) so the extra range is opt-in and existing normalized values keep their meaning. Note that a convincing multi-second inharmonic decay is likely more than a longer envelope; the ring-mod and bandpass structure has to hold up over that time.
Also worth knowing: Niner's UI grid is fixed and its knob rows are positionally load-bearing, so a new knob needs a home that doesn't shift existing rows.
src/params.rs:497—top_decay_ms, the metallic/inharmonic section:Absolute ceiling is about 79 ms, once both multipliers are maxed: drift ±5% (
dsp/drift.rs:66) and accent +50% on decay (dsp/engine.rs:144). A crash or ride wants 1 to 3 seconds, so Niner is 20 to 60x short and cannot cover cymbals or open hats that ring.For reference, the other decays:
Mid Noise Decay1-400 ms (params.rs:491),Mid Decay20-1000 ms (params.rs:474). Both are body/noise rather than inharmonic metal, so neither substitutes. A 400 ms noise tail does give a usable open hat, but not a cymbal.Please do not simply widen the existing range
nih-plug stores parameter values normalized 0-1. Raising
maxfrom 50 to, say, 3000 ms silently reinterprets every value already stored:0.9975would become ~3000 ms instead of ~50 ms. That changes the sound of every existing preset and every user's saved session.Concretely, the skew math for this knob (
skew_factor(-1.0)= 0.5, so exponent 2) isvalue = min + (max-min) x normalized^2. A stored0.9975is1 + 49 x 0.995≈ 49.8 ms today.Suggested approach
Add a separate parameter (a Top Sustain, or a cymbal mode) so the extra range is opt-in and existing normalized values keep their meaning. Note that a convincing multi-second inharmonic decay is likely more than a longer envelope; the ring-mod and bandpass structure has to hold up over that time.
Also worth knowing: Niner's UI grid is fixed and its knob rows are positionally load-bearing, so a new knob needs a home that doesn't shift existing rows.