Skip to content

Top Decay caps at 50 ms, so Niner cannot produce cymbals or long metallic tails #7

Description

@Hornfisk

src/params.rs:497top_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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions