Skip to content
This repository was archived by the owner on Aug 2, 2026. It is now read-only.

release: v1.0.0 — out of beta - #29

Closed
jameshgordy wants to merge 17 commits into
feat/guitar-modefrom
release/v1
Closed

jameshgordy wants to merge 17 commits into
feat/guitar-modefrom
release/v1

Conversation

@jameshgordy

@jameshgordy jameshgordy commented Jul 27, 2026 •

Copy link
Copy Markdown
Contributor

v1.0.0 — out of beta. Version bump + README, plus the v1 polish round (2026-08-01/02):

Drive stage: DRIVE (25–400 %), RELEASE (drive-envelope, default 2500 ms — ear-picked on stems; stateVersion 5 pins pre-v5 sessions to the legacy 250 ms), SUSTAIN (upward env compression), SATURATE (combined FX-bus AGC-normalised shaper — cross-mic intermod).

Shaping: master EQ column (4 bands, clickable per-band frequency choices), WIDTH spreader (generated side, mono-fold mathematically exact, 0 = bypass), per-strip PAD (−30/−12/0, default −12 = classic level exactly), per-room FEED selects (all-on = bit-identical classic feed).

UI: SIMPLE/EXPERT view (amber, view-only — presets still set everything), GUITAR MODE in the Standalone (red lag notice), premium F5 fader/knob styling (drawing-only), strip renames (display only — CLEAN 15"/12", FX 57/421/TWEETER), two-tone EQ captions, footer social icons via the site's tracked redirects.

Presets: "Box Of Rules (Artist)" section — Tax Wealth, Not Work (Main/Verse/Heavy/Heavy Fuzz), spectral-fitted to the printed stems with tools/preset_match.cpp (mean band errors ~2–2.5 dB).

Analytics: Source/Analytics.h — anonymous batched usage events per the site contract (encrypted local queue, hourly flush, real timestamps), SYS USAGE STATS opt-out + PRIVACY link, README FAQ discloses everything. Production endpoint verified live (202).

Verification: every DSP change null-tested — default render byte-identical to the pre-round baseline throughout; auval PASS; pluginval strictness 10 PASS; state migration verified bit-exact for legacy sessions.

Merge order per the playbook: #28 first, then retarget this PR to main BEFORE deleting feat/guitar-mode.

🤖 Generated with Claude Code

jameshgordy and others added 17 commits July 27, 2026 22:05
Version bump + README: the GUITAR mode section (octave-down front end,
red theme, plugin-formats-only) and the 1.0 what's-new. Tag cut after
approval.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n duck'

The drive strips' output envelope is the AGC peak follower (the clipper
saturates at the locked drive amounts), so the stock 250 ms release fell
audibly from each pluck's attack peak to the body level. Two new global
dials in the master bar reshape that envelope for all drive strips:
RELEASE (100 ms-4 s, default 2500 ms — won the 2026-08-01 stem audition)
and SUSTAIN (env^(1-s/200) upward compression, default 0 = stock). Greyed
until a FUZZ/DIST key is engaged. No IR changes: the AGC wraps the cab
convolution.

stateVersion 5: pre-v5 sessions and user presets are pinned to an explicit
legacy 250 ms (ms->s by exact /1000 division), verified bit-identical to
the pre-dial render; the 2500 ms default render is bit-identical to the
picked audition variant. auval PASS.

Also: tools/fuzz_variants.cpp (bor-fuzz-variants) — the offline harness
that rendered the audition grid; drives the shipped params.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… key

- Each ROOM strip gets a FEED column (SUB/15"/12"/57/421/TW) choosing which
  voicing layers feed that room's sum ('boomy rooms? drop SUB out'). All-on
  default uses the same 0..5 add order as the old shared voicing sum, so
  pre-v1 renders are bit-identical; the shared voiceMono buffer is gone.
- Master EQ column at the far right (LOW 90 Hz shelf / LO MID 250 / HI MID
  900 / HIGH 3.2 kHz shelf, +/-12 dB), post GLUE pre OUTPUT; skipped
  entirely when all dials are neutral. Panel widens 1180 -> 1264.
- Display renames (ids untouched): CLEAN 15", CLEAN 12", FX 57, FX 421,
  FX TWEETER — the LOW prefix was premium-engine legacy. README updated to
  match, plus FEED/RELEASE/SUSTAIN/EQ docs and a MIDI-mapping FAQ.
- Header key now reads GUITAR MODE with a fuller pitch-down tooltip.

All new params default neutral -> no stateVersion bump needed; verified
default render bit-identical to the pre-change build; auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Physical caps from box-of-bass-plugin: fader gets the rounded gradient cap
with grip ridges, seat shadow and catchlight; rotaries get the shared
machined cap (gradient body, radial sheen, ink rim, bone pointer). Slider
geometry/hit-areas untouched; the per-instance accent member is kept so
GUITAR mode still recolors. No premium features pulled in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- DRIVE (25-400 %, default 100 = exact x1) joins RELEASE/SUSTAIN: scales
  every drive strip's locked clipper amount; same grey-out gating.
- Each master-EQ band's frequency is now a 4-way choice param
  (eq_*_freq, defaults = the fixed v1 centres): click the knob caption
  (reads e.g. "LO MID · 250") for the menu; append-only choice surface.
- Byte-identity fix the probe surfaced: a skewed range's 0..1 roundtrip
  returns 99.9999924 for the step-1 default 100, so the drive dials'
  raw values are rounded to their legal grid before deriving factors.
  Verified: default render bit-identical to the audition files again.

auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…dalone

- WIDTH: 0-200 % mid/side image scale between GLUE and OUTPUT, stereo
  instances only (hidden in mono like the pans). 100 % bypasses the stage
  entirely — M/S decompose+recompose is not bit-exact even at unity — and
  the raw value is rounded (skew-roundtrip lesson). Ramped per block.
- GUITAR MODE is no longer plugin-only: the Standalone gets the header key
  too, with a red footer notice 'GUITAR MODE may incur unavoidable lag'
  while active (no host there to compensate the ~32 ms tracking latency).

Verified default render bit-identical; auval PASS; pluginval strictness 8
PASS on the previous build (re-run on this one alongside).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…anel

SIMPLE trims the panel to SUB, the clean pair, the FX strips, DRIVE and the
master gains (no DI/ROOM strips, EQ column, RELEASE/SUSTAIN or WIDTH) and
re-themes the accent to #F2A20C amber (GUITAR red still outranks it). It is
a VIEW, not a parameter: hidden controls keep running and presets/sessions
still set every value. Persisted as the non-param "uiMode" state property
(freqView pattern), resynced by the editor timer on session restore.
Visible strips stretch to fill the row. auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…inks

- 'Box Of Rules (Artist)' PRESET section (always present, under User):
  the four Tax Wealth, Not Work tones (Main/Verse/Heavy/Heavy Fuzz),
  fitted from the band's printed stems with the new bor-preset-match tool
  (renders the DI through the engine, coordinate-descends the preset
  surface to minimise 1/6-octave log-spectrum distance; mean band errors
  ~2-3 dB, loudness baked into out_gain).
- Analytics.h: anonymous usage events -> POST boxofrules.com/api/v1/events
  per the site's PLUGIN-ANALYTICS contract (random install_id only, no
  PII/IP; fire-and-forget; BOR_EVENTS_URL env override for testing).
  Launch ping once per process; SYS gains the contract-required USAGE
  STATS opt-out key; verified end-to-end against boxofrules.test (202,
  row landed in plugin_events).
- Footer social links (INSTAGRAM / TIKTOK / BOXOFRULES.COM): direct URLs,
  clicks counted as link_click events; site link carries utm for GA4.
- README 'Does it phone home?' rewritten to disclose the pings + opt-out
  (contract requirement).

auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e row

All six follow the theme accent (red in GUITAR MODE, amber in SIMPLE);
each click still counts as an anonymous link_click event.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The stack is nearly mono by design (lows centred, pans at the detent), so
the old mid/side scale had no side to scale: the dial did nothing. Above
100 % it now synthesizes a side signal — 6 ms delayed, 250 Hz low-cut copy
of the mid, pushed +L/-R — so the image genuinely wraps wider while the
mono fold-down stays EXACTLY the untouched mid (the generated side
cancels) and the lows stay centred. Below 100 % still narrows real stereo
content; 100 % remains a bit-exact bypass. auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-able)

Band name stays muted; the clickable frequency part draws in the live
theme accent (cyan / GUITAR red / SIMPLE amber).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ial icons

- SATURATE: the three FX strips render to a sub-bus that clips as ONE
  signal (level-compensated tanh, dry/wet) before joining the mix — the
  cross-mic intermod a printed drive tone has and per-strip drive cannot
  make. 0 (default) keeps the classic direct routing bit-exactly.
- PAD selector at the bottom of every strip (-30 / -12 / 0 dB, default
  -12 = the classic level exactly): re-references the strip's headroom so
  a maxed fader is never the ceiling (the TWNW fits were railing the
  TWEETER at +12). Applied after the -60 silence floor.
- WIDTH re-ranged 0-100, default 0: the old 0-100 'narrow' half was dead
  travel on a mono-by-design stack; the whole dial is now spread amount.
  (Param semantics change is safe: v1 params were never released.)
- Footer socials are now house-style vector icons (semiotics over words):
  IG / TikTok / YouTube / Spotify / Apple Music / BOR monogram, accent-
  tinted, theme-following, tooltipped, still counting link_click events.
- bor-preset-match gains fx_sat + per-strip pad coordinates.

Verified default render bit-identical; auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d, README re-jig

- SATURATE was near-inaudible: internal levels sit far below tanh's knee,
  so the shaper ran in its linear region. Now envelope-normalised into the
  curve (3 ms / 150 ms follower, FuzzChain's AGC trick) and restored on the
  way out — density at constant loudness, properly gnarly at 100 %.
- Box Of Rules (Artist) presets re-fitted with SATURATE + PADs in the
  search space: mean band errors drop (MAIN 8.7->5.2, HEAVY 10.4->6.2);
  every tone chose 10-15 % SATURATE and PAD 0 on the TWEETER.
- README re-jigged for 1.0: grouped what's-new, artist presets, updated
  signal flow, screenshot placeholders (assets/ shots pending).

auval PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… events, PRIVACY link in SYS, socials via boxofrules.com tracked redirects

Events carry their real timestamp so batching costs no accuracy; offline
sessions queue until the next flush. User preset names are never sent.
Queue file is BlowFish-obfuscated local hygiene, documented in-source.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…creenshots list

The BOR_BUILD_TOOLS console targets compile PluginEditor.cpp, which now
pulls in Analytics.h's BlowFish queue — they need the module too, or the
tool link fails. Also: .gitignore .env -> .env*, docs/SCREENSHOTS.md (the
README + wiki shot list for James).

v1 gate results: all targets build; auval PASS; pluginval STRICTNESS 10
PASS (first max-strictness run — closes the CLAUDE.md TODO); default
render byte-identical to the audition baseline; production endpoints
verified live (events 202, tracked redirects 302).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Room FEED defaults: SUB + cleans OFF (anti-boom, per James) — FX-only
  is the shipped room voice. Pre-v5 sessions are migrated to explicit
  all-on (their classic feed, bit-identical), and the artist presets with
  audible rooms pin all-on to preserve their fitted tone. Default render
  unchanged (rooms ship at the fader floor).
- SIMPLE now mutes the hidden strips (DI + rooms) and remembers which
  were unmuted (session state property); leaving restores exactly those.
  Preset loads while in SIMPLE re-apply the muting but update the restore
  set, so the preset's intent lands on exit. User presets no longer carry
  view state (uiMode/restore list stripped on save & load).

auval PASS; default render byte-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jameshgordy

Copy link
Copy Markdown
Contributor Author

Development has moved — Bass Better-er is feature-final at 0.2.2; its successor ships separately. See the README.

@jameshgordy jameshgordy closed this Aug 2, 2026
@jameshgordy
jameshgordy deleted the release/v1 branch August 2, 2026 11:11
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant