Repository navigation
Octatrack base: the key bus to Y $7E00, Sidechain's MON words to Y $FF0 (#1064) - #1098
Conversation
…F0 (repeat98#1064) Frees Y $7F0-$9FF on both cores for a DSP machine's voice. The key bus moves to the tail of the first internal FX2 slot (+$3E00, past every +$3DFD ring), Sidechain Compressor's MON words to Y $FF0-$FFF (no stock effect writes either range: emulator, every stock effect through FX1/FX2 on all tracks, both cores). - dsp-sites.json / dsp_ledger.h / resident_dsp: feature 1 owns three regions, feature 8 the window and the bus at $7E00. A reset chunk stops at every region end from the ledger (MW_DSP_RESET_END); the board's 528 and the driver's single split assumed two regions. - Sidechain Compressor 0.2.1: manifest tokens and declared ranges only (source: Zac-Kyoti/octatrack-kyoti-fw 8868867). - Sidechain Ringmod 0.2.1: the same-core read at $7E00 (npp1993 agreed). - BBD Delay 0.1.2: buffer_words 0x203A as octabam repeat98#783 (JamCones agreed), so it stays clear of the bus on T1/T5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sidechain Compressor 0.2.1 and BBD Delay 0.1.2: hardware reports from the author's MKI (30 October 2026), native images fb7c5e31 / c234d13c. Sidechain Ringmod 0.2.1: screens on its native card image; hardware pending (USB only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ay 0.1.2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- octatrack:base --beta --write: base 62ed0ec0 (controller trust rows, base binding and base assets); Analog BD's machine recipe recaptured (only imageSha256 moved: the base's symbols shifted). - octatrack:module-packages --stock: Sidechain Compressor 0.2.1 (fd275bf2), Sidechain Ringmod 0.2.1 (91281f07), BBD Delay 0.1.2 (58b77069, buffer 8,250); Output Matrix and Analog BD rebound to the new base. Earlier versions' files kept as on main. - Tape Echo's and Euclid's standalone recipes re-pin the rebuilt shared assets (as repeat98#969). - Sidechain Compressor's composed image recorded (9b8c9ed3, captures pixel-identical to the native image's). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, import record author pin Suites sidechain / sidechain-visible / analog-bd: the same selections build and refuse as with 0.2.0; only selections containing the module changed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…records - module:verify: Sidechain Compressor, Sidechain Ringmod and BBD Delay, 0 mismatches of 162 selections each. - modules:pairs: bbd+sidechain-compressor is no longer refused in card builds (BBD's 8,250-word claim stays clear of Sidechain's key window). - Tests that pinned Sidechain's two-region reset or the old MON address (test_owned_transfer, test_resident_boot, sidechain-compressor.test.ts). - BBD and Ringmod performance records carried to their new versions (same instructions); the hooks doc does not grow. Sidechain Ringmod 0.2.1's qualification stays 0.2.0's until its USB run on a unit, so modules:generate refuses and module-documents.json is not regenerated in this branch yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dalone recipes re-pinned Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks Zac, this is a clean base change: reset ends from the ledger fix the two-region assumption properly, and npp1993's and JamCones's OKs on #1064 cover their modules' parts. Three things before it can merge:
Separately: the packager deleting earlier versions' Generated by Claude Code |
…d's release note names the T1/T5 limit BBD's conflict with Sidechain Compressor existed only because of the 16K claim (repeat98#731); with 8,250 words the pair builds (review on repeat98#1098). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Jannik.
|
…1120) The builder clears public/octatrack-modules before its first write, so a write-mode `octatrack:module-packages` dropped every earlier version's .mwrm that main publishes, and a run that stopped part way left the folder half empty (#1098). The wrapper now puts back every file the run did not rewrite, on success and on failure; the builder, a base input, is unchanged. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Zac, #1029 and #1059 are in, and they regenerated the same base files, so now's the time: please merge |
…generated next) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… base-bound packages relinked Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Jannik. Done: main (
After your run I'll fill Ring-SC's qualification, regenerate |
|
Jannik, before I open the Phase 1 hook-slot base PR (it waits for #1098, since both regenerate the base), here is the design I prototyped, because it changes one answer in Why a chain, not a signature filter in the base. Analog BD checks each track's source record for its signature and returns to stock otherwise. BlackPyramids' engine has to see every track, not only its own: on a core's first track it ages its voice claim, and it frees the voice as soon as its own track's record turns stock. So the base can't pick one engine per track; each engine needs every call, in turn. The chain. Site 5 becomes a chain site (
An engine that returns (not its track) comes back to the stub, and the next member is called. One that renders drops its return and leaves through its exit, as Analog BD does now. The base aims that exit at the trampoline instead of the stock exit, so the trampoline drops the site's return too. The engines don't change: Analog BD's package is byte-identical, and only the exit word the base writes moves. What stays as it is. A packaged feature's regions stay in the ledger, because the receiver's reset is built from them ("neither the host nor a module can name a DSP address"). So a new DSP machine still brings a ledger feature and a trust row in its own PR. Phase 2 (admission by declared entitlements) is where that would go away. Should packages declare their regions inside a base-named pool instead, say so and I'll look at it, but it loosens that receiver rule. Checked so far, in the vendored DSP interpreter (not the chip):
Found on the way. Cost. The permanent block grows 6 words per core. A dormant member costs a Not done yet: the controller adapters are still Analog BD-named ( Does the chain match what you meant by hook slots? If you'd rather have slots assigned at install (PLACE naming a slot index rather than a feature), that's a small change on top: the chain positions are already per member. |
|
Yes, the chain is what I meant by hook slots. Every engine sees each call in turn, Analog BD's package stays byte-identical, and the cost is a few instructions per track. Keep it per feature, as you prototyped, rather than slot indices assigned at install, and keep the ledger rule as it is. Phase 2 can revisit that. Go ahead with the hook-slot PR once this one is in. For this PR, the next step is still my MKII run of its base. One heads-up: #1088 just merged and changed the Octatrack package assets, so expect one more Generated by Claude Code |
|
Thanks, Jannik. I'll leave this branch exactly as it is (head |
|
Zac, a change to the order. #1007 is in and rebuilt the beta base too. So that my MKII run covers the exact base that merges, I'll ask you to merge Generated by Claude Code |
|
Zac, I'm back with the MKII and it's connected. To save a round trip I'll do the last step myself now: merge Generated by Claude Code |
…ain, regenerated next) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s relinked (only requiredBase moved) npm run octatrack:base -- --stock OS.bin --beta --write, then npm run octatrack:module-packages -- --base-only --stock OS.bin. Drops the Sidechain Compressor 0.2.0 row the merge brought back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…c0), imported with --development: only sourceCommit and the source tree fingerprint move Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re-exported (212, no refusal flips; against main only selections with Sidechain Compressor move) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dule twice; guide line on merging main into base and package assets Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s in another order (RINGMOD SC) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eta base dd3827f0 (twin 5015d2a7); module documents regenerated; superseded packages removed DUCK keyed from the same and the other core and RING, measured from the unit's USB audio, beside BBD Delay on T1/T5 FX2 and a keyed Sidechain Compressor; self-test, removal in use refused, trial rollback and device:qualify passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ain Ringmod 0.2.1 and BBD Delay 0.1.2) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Zac, done and pushed ( Ring-SC 0.2.1 ducks from the same core (both cores) and from the other core, and RING follows the key; with BBD 0.1.2 on T1 and T5 FX2 and a keyed Sidechain 0.2.1 beside it, every path keeps working. Self-test, removal in use, a trial's rollback and Two small tool fixes rode along (a duplicate package row is refused with a clear message, and Generated by Claude Code |
…nerated asset JSONs merged row by row, rebuilt next Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h --development (only sourceCommit and the source fingerprint move) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the source tree fingerprint moves) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged and live, Zac. modwerk.app serves Sidechain Ringmod 0.2.1 ( Generated by Claude Code |
What
The first base PR from #1064. The beta base's key bus moves from Y $800-$9FF to Y $7E00-$7FFF, and Sidechain Compressor's MON words from Y $7F0-$7FF to Y $FF0-$FFF. That frees Y $7F0-$9FF on both cores for a DSP machine's voice, with no cost per access: both new places are internal memory.
Modules that move with it, as agreed in #1064:
Zac-Kyoti/octatrack-kyoti-fw8868867add #>$7e00,a(ringsc.asm:187); package read claims at $7E00buffer_words=0x203A, as octabam since #783; reserved-Y resource 8,250 words@npp1993 @JamCones: this is the change you agreed to on #1064. Please check your module's part before it merges.
How
Base
dsp-sites.json,dsp_ledger.handresident_dsp.resource_ranges: feature 1 (Sidechain) now owns three regions (MON $FF0+$10, the window, the bus $7E00+$200). Feature 8 (the key bus) owns the window and the bus at $7E00.reset_sourcehard-coded 528 (Sidechain's old first range), and the driver's@SPLIT@allowed a single split. Both now stop a reset chunk at every region end from the ledger (dsp_sites.reset_ends,MW_DSP_RESET_END). The DSP receiver was already generic.buffer_fitsandmw_hook_ranges_idleneed no change. The table already makes them refuse a whole 16,384-word FX2 buffer on T1/T5 while Sidechain or the key bus is held, and admit a +$3DFD ring and BBD's 0x203A.octatrack:base --beta --write, base62ed0ec0). Analog BD's machine recipe was recaptured; only itsimageSha256moved, because the base's symbols shifted. The base-bound packages were rebound.Modules and assets
build-modules-isolated.sh(imagesha256:2c78cdad…) at1574c62e.fd275bf2, Sidechain Ringmod91281f07, BBD Delay58b77069(thebufferfield is now 8,250). Earlier versions' files are kept, as on main.sidechain,sidechain-visibleandanalog-bdsuites. The same selections build and refuse as before (169/512, 618/1,024, 146/212); only selections containing Sidechain Compressor changed.bbd+sidechain-compressoris no longer refused in card builds, because BBD's 8,250 words stay clear of Sidechain's key window.Checked
Software
module:verify, 0 mismatches of 162 selections each:test_resident_enginesruns the base's resident engine in the DSP simulator at the new addresses. A cross-core key arrives exactly two blocks late for every enable order and core skew, as in 0.2.0. The test now pokes MON at $FF0.fb7c5e31) differs from 0.2.0's (131142e1) in 12 bytes: the address words, six per DSP payload.Hardware (my MKI, card builds, 30 October)
fb7c5e31, MW_SC021): same-core and cross-core keys duck; MON, KBAS and KWID behave; no other track appears in T1/T5 FX2 reverbs; project reload and a power cycle keep the settings.c234d13c, MW_BBDSC): BBD on T1, T5 and T3 FX2 beside a keyed compressor, including maximum TIME, STGS 4096 and FRZ, is clean, and the compressor still ducks.npm run check -- --base origin/mainpasses on this tree except one gate: Sidechain Ringmod 0.2.1 has no hardware qualification. The module reads the key bus only over USB, and I have no MKII. So itstests.qualificationis still 0.2.0's,modules:generaterefuses it, andmodule-documents.jsonis not regenerated here. With that one qualification field set locally to 0.2.1 (never committed), the whole check passes.Finished on 10 November (owner's session)
Merge and regeneration.
main(9b320991, 1,054 commits sincef4e18fa4) merged in. The conflicts were all generated files. Base files were taken frommainand rebuilt; the module asset JSONs were merged row by row, so each side keeps its own modules' rows.octatrack:base --beta --write: beta basedd3827f0126b3f76b8cbc63d754c401ba84605106166fac4737ae81f486043ec; the browser.binequalsbuild_core.py's (5a717aed…), stock-free and flash-safety scans pass.octatrack:module-packages -- --base-only: the five base-bound packages relinked; againste20e0bb4onlyrequiredBasemoved (Sidechain 0.2.1 stillfd275bf2).build-modules-isolated.shataaf3e5ca(image1b15c3c0…, rebuilt fromsdk/build/Dockerfile), imported with--development: onlysourceCommitand the source fingerprint move.mainonly the 28 selections with Sidechain Compressor change).bbd/0.1.1,ring-sc/0.2.0,sidechain-compressor/0.2.0) removed, asmodules:generatenow requires.Hardware: the owner's MKII, over USB, RAM-booted
--devtwin5015d2a7…ofdd3827f0(MAINb0d74917…, never flashed). Measured from the unit's per-track USB audio, a kick on T1 as the key, folded on its onsets:npm run device:qualifywith the three packages: passed (alone on T1/T5 FX2, four Ring-SC beside four BBD playing, 12/12 Part switches, 120 s soak, highest core peak 749 per mille, removal).module-documents.jsonregenerated.Checks.
npm run check -- --base origin/mainpasses (234 s).pr:ready's only remaining line is "changes a module and also the base": CI exempts pull requests opened before 9 November, and this one cannot be split, since Sidechain Compressor is a base input and the 0.2.0 modules read the old bus address.Two small fixes found on the way (each with a test and a changelog entry):
octatrack:module-packagesrefuses a package list that names a module twice (the merge had kept main's Sidechain 0.2.0 row; the run then died on "Use a new empty private controller package directory").device:qualifyfinds a chooser name whose words are in another order (RINGMOD SC for the SC Ringmod package); it failed to place Ring-SC before.Guides
Three things a later developer would trip over; none is fixed here:
dsp-sites.jsonreads as if a feature could own any number of regions, but the board and the driver assumed two (fixed here).standalone-recipes.jsonpins whole shared asset files, so any package rebuild forces a Tape Echo/Euclid recipe re-pin; [tapeecho] Tape Echo issue of Volume Drop. #969 did the same. A guide line in ADD_A_MODULE.md would help.octatrack-module-packages.pyin write mode deletes every earlier version's.mwrmthat main still carries. I restored those files by hand.Added (10 November):
docs/DEVELOPER_WORKFLOW.md, "Make it mergeable": how to mergemaininto a branch that changes Octatrack base and package assets (take main's base files and rebuild; merge the module asset JSONs row by row, one row per module; then the rebuild sequence).🤖 Generated with Claude Code