Skip to content

feat(dsp): "Graaawl" — Warwick Thumb low-band growl mode #36

Description

@yves-vogl

Sound goal

Add a "Graaawl" mode that imparts the characteristic Warwick Thumb 5 growl onto the low band — the woody, aggressive, vocal-like grind — while the low end stays tight and powerful. Opt-in; default OFF (the clean/compressed low band remains the default).

Key DSP insight (why not just "distort the lows")

The Warwick growl is not low-frequency distortion. It is an asymmetric upper-mid harmonic character (~700 Hz – 2.2 kHz) with a formant-like resonance around ~1 kHz. Distorting the sub-fundamental directly produces intermodulation mud and flabby low end — the opposite of the Thumb. So the growl must be band-limited and sub-preserving: the fundamental is never distorted; the growl is generated in parallel and blended on top.

Proposed signal design (low band)

Inserted in the low path after the low-band compressor, before lowLevel (predictable growl amount; comp keeps the lows tight). Parallel harmonic branch:

  1. Copy the low-band signal; high-pass the copy at ~300–400 Hz so only the upper part of the low band feeds the shaper — the sub stays clean.
  2. Asymmetric waveshaper (tanh + asymmetry/DC-bias term) → generates even harmonics (woody/vowel) and odd harmonics (grind). Asymmetry is the core of the Thumb character.
  3. Band-pass to the growl formant region (~700 Hz – 2.2 kHz) with a mild resonant peak (~1 kHz) for the "graaawl" vowel.
  4. Oversample the shaper path (2–4×) to avoid aliasing (reuse the M3 juce::dsp::Oversampling framework; report added latency via the M1 latency framework, Latency compensation framework #9).
  5. Blend the harmonic content back onto the clean low band, scaled by the growl amount. Dry sub-fundamental untouched → lows stay tight.

Proposed parameters (added to the frozen APVTS layout; new IDs only — no existing IDs change)

  • lowGrowl — bool, "Graaawl" enable, default false
  • lowGrowlAmount — 0..100 %, default 0 (display), suggested musical start ~40
  • (candidate for tuning) lowGrowlTone — tilt/formant focus, 0..100 %, default 50

Internal IDs stay clean identifiers; the display name is "Graaawl" (elongated a's in the UI label are fine).

Dependencies

  • M1 Full v1.0 parameter layout (APVTS) #7 (parameter layout) — base for the new params.
  • M2 low-band compressor — growl inserts after it.
  • M3 oversampling framework — the shaper path oversamples through it.

Tuning gate (project convention: voicing = listening decision)

Ship sensible starting values only. Final voicing — waveshaper asymmetry, formant center/Q, HP corner, oversample factor — is tuned by ear against a real Warwick Thumb 5 DI. Do not finalize the curve by math alone.

Acceptance criteria

  • lowGrowl + lowGrowlAmount in APVTS, default OFF, state round-trips (test)
  • With growl OFF: low band is bit-identical to current behaviour (regression test)
  • With growl ON: sub band (below ~150 Hz) THD stays negligible — growl energy concentrated in ~700 Hz–2.2 kHz (spectral test)
  • Shaper path oversampled; added latency reported and null-compensated
  • pluginval strictness 10 + auval pass
  • Yves ear-tuning sign-off against a Thumb 5 reference DI

Note on placement

Implemented as a low-band growl mode per the request ("die clean Lows knurren lassen"). Alternative considered: a 4th high-band voicing named "Graaawl" alongside Gnaw/Wool/Razor — rejected because the request is specifically about the low band, and a sub-preserving low-band growl is the more distinctive, Thumb-faithful result.

Metadata

Metadata

Assignees

Labels

area:dspAudio DSP engine

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions