tap.harmony~, the recipes-improvements plan, and a package README - #61
Merged
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
Ships
tap.harmony~— the formant-preserving multi-voice harmonizer — as a full vertical slice (wrapper, reference page, help patcher, REVIVAL §13), pinssubmodules/taptoolsat the kernel branch that carries its DSP, addsplans/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
@modespelling 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
harmonizer.ipynb(0.04-cent intervals, 3.7×10⁻⁸ dry alignment, formant-centroid measurement).chordmessage now writes through the attributes, so queries stay truthful and a DSP restart no longer reverts the last chord.Notes for the reviewer
submodules/taptools→ the kernel branch head carryingharmonizer.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 onmainso it stays reachable after branch cleanup.docs/tap.harmony~.maxref.xml) and help patcher (help/tap.harmony~.maxhelp) ship with the object; the macOS binary is universal (CI-enforced).🤖 Generated with Claude Code
https://claude.ai/code/session_01V6CC6kpK5Lx2YkJWuNNQpw
Generated by Claude Code