Skip to content

tap.harmony~, the recipes-improvements plan, and a package README - #61

Merged
tap merged 8 commits into
mainfrom
claude/taptools-book-recipes-vdmgr6
Aug 5, 2026
Merged

tap.harmony~, the recipes-improvements plan, and a package README#61
tap merged 8 commits into
mainfrom
claude/taptools-book-recipes-vdmgr6

Conversation

@tap

@tap tap commented Aug 5, 2026

Copy link
Copy Markdown
Owner

What this changes

Ships tap.harmony~ — the formant-preserving multi-voice harmonizer — as a full vertical slice (wrapper, reference page, help patcher, REVIVAL §13), pins submodules/taptools at the kernel branch that carries its DSP, adds plans/recipes-improvements.md (the design-of-record for everything the book's Recipes drafting surfaced, with decisions and a discovery log), and gives the package a README with CI badges.

Why

The Tools on Tap Recipes drafting audited every recipe's knobs against the wrapper sources; the plan file collects what the audit found (the ADSR is the Jamoma port and not virtual-analog; the ladder's @mode spelling drift; the uninterpolated delay pair — with the trash-or-rebuild decision recorded as rebuild; determinism gaps; maxref drift). Its first shipped consequence is the harmonizer: the "Hide and Seek" mechanism had no object, and the kernel-side pvoc/LPC substrate already existed. The README exists because the package's front door was previously a 404.

Verification

  • CI built the wrapper green on both platforms alongside the full external set — macOS universal (lipo-checked) and Windows x64 — with clang-format/clang-tidy clean. That was the first real gate for the wrapper: this container has no Max SDK, so CI is where it first compiled.
  • DSP correctness is gated in the kernel repo (companion PR): seven oracle-based Catch2 scenarios plus the executed harmonizer.ipynb (0.04-cent intervals, 3.7×10⁻⁸ dry alignment, formant-centroid measurement).
  • Post-ship fix included: the chord message now writes through the attributes, so queries stay truthful and a DSP restart no longer reverts the last chord.
  • Not done here: the in-Max validation pass and runtime maxtest (licensed Max, on-Mac), and the plan's v1.1 house-machinery items (mute/bypass, preset-chord morph) — all recorded in REVIVAL §13.

Notes for the reviewer

  • Submodule pin moved: submodules/taptools → the kernel branch head carrying harmonizer.h (companion PR Recipes (book Part IX) + the tap.harmony~ kernel TapTools#27). After both merge by rebase/squash, repoint this pin at the identical tree on main so it stays reachable after branch cleanup.
  • Max package: reference page (docs/tap.harmony~.maxref.xml) and help patcher (help/tap.harmony~.maxhelp) ship with the object; the macOS binary is universal (CI-enforced).
  • Heads-up: the ADSR virtual-analog rewrite (plan §1) begins on this same branch next — kernel first, then the wrapper here shrinks to Min glue — so further commits will land before review completes.

🤖 Generated with Claude Code

https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw


Generated by Claude Code

claude added 8 commits August 5, 2026 02:19
Design-of-record for the audit findings from Tools on Tap Part IX:
a full virtual-analog rewrite of tap.adsr~ (kernel-first — the current
object is the faithful Jamoma TTAdsr port: straight-line segments, a
bare 0.5 level gate outside the family's amplitude-as-accent contract,
and DSP living in the wrapper), a performance-modulation section for
tap.vco~ (vibrato in cents with rate and onset delay, so the book can
stop printing a scaling formula), symbolic mode/solver enums for
tap.ladder~ (the shipped chapters' "@mode lp24" spelling doesn't match
the attribute<int> wrapper), and a seed for tap.noise~. Carries a
discovery log to append to as the remaining recipe chapters land.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
The adsr rewrite item now carries the full analysis (the object is the
Jamoma TTAdsr port — straight-line segments, not an RC model — with a
virtual-analog kernel as the target and the legacy curves retained as
compatibility modes). New sections from the seven-chapter sweep: the
determinism doctrine extended to tap.verb~'s std::rand(), a rebuild
candidate for the uninterpolated feedback-less tap.delay~/tap.multitap~
pair, the vocoder's missing sibilance path and mix/bypass, QoL and bug
notes (5comb MIDI tuning entry, the vco pitch-signal glide gap,
tap.sustain~'s inert length setter, tap.crossfade~'s no-op mode), and a
maxref-drift ledger. Discovery log updated row by row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
Trash-or-rebuild for tap.delay~/tap.multitap~ is resolved as rebuild
behind the same names: deletion breaks 1999-era patchers, keeping them
bare duplicates stock Max with less, and the Hermite/DC-blocked
substrate already exists in grm_comb.h. Compatibility via an interp 0
integer mode; the 0.0-signal trap dies as a documented breaking change.
Also logged from the vocoder songbook: the "Hide and Seek" mechanism is
a formant-corrected multi-voice harmonizer, which no package object
provides — candidate new object on the DspTap LPC substrate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
The wrapper over the new taptools/harmonizer.h kernel (submodule pin
bumped to the kernel branch): four voices at fractional-semitone
intervals (interval1-4) with linear levels (level1-4, 0 disables), a
kernel-aligned dry level, formant preservation on by default, glide as
the interval slew, fftsize as the stated latency, and a chord message
that sets up to four intervals and enables exactly those voices in one
gesture. Reference page and help patcher ship alongside per the
vertical-slice rule; REVIVAL.md gains entry 13 with the honest
remaining list (platform build verification, in-Max validation,
maxtest), and the improvements plan's harmonizer row flips from
candidate to shipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
Formatting only — the style job flagged the glide attribute's line
break; no behavior change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
What the package is (1999 roots, 2026 revival on Min/CMake/Actions,
kernel-split architecture), the object families with the headliners
named, documentation pointers (the Tools on Tap book, reference pages,
REVIVAL.md), install and build-from-source instructions for both
platforms, the three-layer testing story, and license. CI badges for
the build and style workflows sit under the title.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
The chord message now writes through the interval/level attributes
instead of poking the engine, so attribute queries stay truthful and
dspsetup's re-apply preserves the last chord instead of silently
reverting it on a DSP restart. REVIVAL notes the CI build verification
that has since landed, and the improvements plan gains the tap.harmony~
v1.1 house-machinery item (mute/bypass, preset-chord morph).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
The wrapper shrinks to Min glue over taptools/adsr.h (pin bumped): the
new analog circuit-model curve is the default, with the Jamoma
hybrid/linear/exponential curves one attribute away, plus the family
trigger contract - a threshold attribute (default 0.005, so sequencer
rows' plain hits register and the hard-coded 0.5 gate is retired) and
a velocity sensitivity that lets gate amplitude scale the hit. The
reference page is rewritten to the real surface (retiring its phantom
int/float methods, one item off the maxref-drift ledger), the wrapper
tests pin the new defaults while keeping the legacy linear-curve
scenarios (the kernel preserves that math verbatim), and REVIVAL gains
entry 14 with the deliberate-default-change note. Improvements plan
section 1 is marked shipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
@tap
tap merged commit 88ef789 into main Aug 5, 2026
10 checks 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.

2 participants