Skip to content

Harsh effects pack: Octaver, Wobble, Folder, Grinder, 12 rigs and a Justice-style demo (docs/43) - #29

Merged
nooga merged 9 commits into
masterfrom
claude/harsh-fx
Oct 22, 2026
Merged

nooga merged 9 commits into
masterfrom
claude/harsh-fx

Conversation

@nooga

@nooga nooga commented Oct 21, 2026

Copy link
Copy Markdown
Owner

A pack for big, gnarly bass and guitar: Justice-style electro bass and the blog-house guitar chains people build in FL Studio from Guitar Rig, Distructor, Vintage Chorus, Hamburger and OTT. All the DSP is original. Hamburger (AGPL) was read for ideas only.

New machines

  • Octaver (oct2): an analog-style divider (comparator plus flip-flops) for one and two octaves down.
    • SQUARE or OC-2-style FLIP subs, each with its own resonant lowpass.
    • GLITCH makes the divider chatter.
    • An Octavia-style rectified octave-up into fuzz.
  • Wobble (wob2): an SVF (LP/BP/HP morph, 12/24 dB, self-oscillating) or an inductor-style wah.
    • Swept by an LFO (seven shapes, synced or free, retrig, stereo spread), 16 steps, the playing's envelope (auto-wah), or a pedal.
    • AMP turns it into a tremolo or gate.
    • Adds shared lfo.fy and follow.fy kernels.
  • Folder (fold2): triangle-to-sine folds in up to four stages, with SYMM and DYN.
    • 4x oversampling plus ADAA: nonharmonics at −74 dB at full fold.
    • AUTO holds the level.
  • Grinder (grind2): ten curves stacked up to four deep (OVERDRIVE, RAT, FUZZ, SOFT, HARD, FOLD, SINE, CUBE, RECT, DEAD).
    • Bias that follows the envelope, and mirrored emphasis EQ around the drive.
    • Zero-crossing sizzle, bass-driven flux, and phase distortion (self-modulated delay).
    • AUTO and CLIP on the output.

Changes to existing machines

  • Multi: RATIO up to 100 and UP up to 1.5 (4:1 upward), plus an OTT preset.
  • Chorus: FEEDBACK, WET HP and INVERT, for choking a distorted bass. All three default off and are bit-exact there.
  • Char: a Supercharge preset.

Rigs and demo

  • Twelve FX Rack rigs under harsh/, generated by tools/rigs/harsh.py. Each opens folded to named macros and is level-matched to bypass within 1.5 dB:
    • Wobble Oktaver and Sandwich (the two reference chains, plus Octavia Portal)
    • Kodiak and Cross Bass
    • Phantom Stack, Gated Fuzz, Ring Growl and OTT Sandwich
    • Four Slot, Bit Guitar and Royal Split
  • slabkit can turn a preset rig's macros: fx("fxrack", "harsh/kodiak", rk_m2=0.6).
  • songs/kodiak_club.py: a 118 BPM French-touch demo.
    • A Juno bass through Cross Bass, a slap bass chopped by Grinder and a step gate.
    • Hot 909-style drums with everything ducking to the kick.
    • An Octavia guitar riff and a Kodiak layer in the drops.
    • −14 LUFS; bands are sub 27%, low 41%, low-mid 20%.

Testing

  • zig build test: 527/527 passed.
  • zig build bench -- --all --check:
    • Every existing golden is bit-exact except Multi's. Its goldens differ by about an ulp (−150 dBFS) because the bench sets the default ratio through the knob's norm and the range changed. Projects store real values and are unaffected.
    • Goldens are recorded for the four new machines.
    • shift2, resonator2, buffer2 and phaser2 have no goldens on master either.
  • Measured on the bench: Octaver tracking on a 41–196 Hz bass phrase, Folder's aliasing, Grinder's per-curve signatures, Wobble's self-oscillation.
  • Rig levels and the demo mix were checked with headless renders and stem reports. None of it has been heard in the app yet.

🤖 Generated with Claude Code

nooga and others added 9 commits October 21, 2026 22:05
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…via Portal and Kodiak rigs (docs/43)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…/43 §Smaller changes)

Multi's RATIO runs to 100 and UP to 1.5 (4:1 upward, the cap opening to
24 dB), with an OTT preset at OTT's crossovers and gains. Chorus gains
FEEDBACK, WET HP and INVERT, all off by default and bit-exact there. Char
gets a Supercharge preset. Multi's goldens are re-recorded: the bench sets
the default ratio through the knob's norm, which moved by an ulp with the
range (-150 dBFS); projects store real values and are unaffected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wobble: an SVF (LP/BP/HP morph, 12/24 dB, self-oscillating) or a wah,
swept by an LFO (seven shapes, synced or free, retrig, stereo spread),
16 steps, the input's envelope or a pedal; AMP for tremolo and gates.
Octaver: comparator and flip-flops for one and two octaves down
(SQUARE or the OC-2's FLIP), a resonant lowpass per sub, GLITCH, and the
Octavia's rectified octave up into a fuzz. Folder: triangle-to-sine
folds in up to four stages, SYMM, DYN, 4x with ADAA (nonharm -74 dB at
full fold). Grinder: ten curves stacked up to four deep, envelope bias,
mirrored emphasis, sizzle, flux, phase distortion, AUTO and CLIP.
Shared kernels lfo.fy and follow.fy. Presets for each; goldens recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
….py (docs/43 §Rigs)

Wobble Oktaver, Sandwich, Octavia Portal, Kodiak, Cross Bass, Phantom
Stack, Gated Fuzz, Ring Growl, OTT Sandwich, Four Slot, Bit Guitar and
Royal Split, banked under harsh/, each folded to its named macros and
level-matched to bypass within 1.5 dB on a picked bass riff. slabkit can
now turn a preset rig's macros: fx("fxrack", "harsh/kodiak", rk_m2=0.6)
or rack(preset=...).macro(2, value=0.6).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ocs/43)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…T ranges, changelog (docs/43)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ero crossings; rigs voiced brighter (docs/43)

- AUTO matched a fast envelope, so it put the dry note's decay back onto
  the distortion. It now matches held peaks (5 ms attack, 1 s release)
  and holds through silence.
- SIZZLE's noise could exceed the signal and buried the guitar in
  Octavia Portal. It now sits in a window around each zero crossing,
  at most 0.3 of the envelope.
- Distortion tone presets moved from 4.5-7 kHz to 9-12 kHz.
- Cross Bass drops its tape stage and opens the amp's top.
- Kodiak mixes OTT in at 0.45 and soft-clips its onset spikes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stered and unchopped (docs/33)

docs/33 gains a check: RANGE, SUB and octavers move a bass below the
written note, so keep the fundamental at 40-110 Hz and the lowest part
at 30 Hz or above. Kodiak Club's Junos played at 16' (the bass at
23 Hz); they now run at 8' with held notes. The slap's step gate is
gone and only the bass and stabs duck to the kick, more gently.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nooga

nooga commented Oct 21, 2026

Copy link
Copy Markdown
Owner Author

I analyzed the demo track by track: each one rendered stage by stage, with waveforms, spectrograms, band energy, gap share and crest. Fixes:

  • Grinder and Folder AUTO followed a fast envelope, so it put the dry note's decay back onto the distortion and killed its sustain. It now matches held peaks (5 ms attack, 1 s release) and holds through silence.
  • Grinder SIZZLE could be louder than the signal. It buried the guitar in Octavia Portal under broadband noise. It's now confined to a window around each zero crossing.
  • Distortion tone presets moved from 4.5–7 kHz to 9–12 kHz.
  • Cross Bass loses its tape stage, and its amp gets more treble and presence.
  • Kodiak's OTT is mixed in at 0.45, with a soft clip after it to catch the onset spikes.
  • Kodiak Club:
    • The Junos were at 16', which put the bass at 23 Hz. They're now at 8', with held notes.
    • The slap's step gate is gone.
    • Only the bass and stabs duck to the kick, and more gently.
  • docs/33 gains a section on checking where a bass really sounds.

Results:

  • In the drop, the bass's silent share went from 50% to 0%. Its lowest peak went from 15 Hz to 73 Hz.
  • The stabs are now dense and flat out to 10 kHz.
  • In the app the demo sounds much better.
  • zig build test passes. Every bench golden is unchanged except grind2 and fold2, which I re-recorded.

🤖 Generated with Claude Code

@nooga
nooga merged commit b5c67f8 into master Oct 22, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant