Skip to content

Output Matrix 0.1.1-experimental: always-on LEV label and smaller core-0 DSP, on the USB base - #687

Closed
npp1993 wants to merge 20 commits into
repeat98:mainfrom
npp1993:claude/output-matrix-lev-label-usb
Closed

npp1993 wants to merge 20 commits into
repeat98:mainfrom
npp1993:claude/output-matrix-lev-label-usb

Conversation

@npp1993

@npp1993 npp1993 commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Output Matrix 0.1.1-experimental, on the USB beta base: the always-on LEV label and a smaller core-0 DSP. Builds on #682 and contains its commit until that merges.

What changes for users

  • In MATRIX the LEV box is always labelled with the track's destination (MN, PHN, M+C, …), not only while CUE is held. New detour lev_box_lev at 0x4004dcfa, sharing dest_label with the CUE-held path.
  • Core-0 DSP code shrinks from 727 + 42 to 657 + 14 P words (671 in all). The output is identical sample for sample in 26 ot_emu scenarios. The worst case drops from 4,240 to 4,194 executed instructions per frame (275 per sample with the phones crossfade). Both are in the resident engine the beta base places on demand: 675 words instead of 773.

USB base and package

  • Re-pinned manifest.py, matrix.s and matrix_mix.asm in resident_dsp.py, stock_hook_controllers.py and test_analog_bd_part_fence.py.
  • Controller re-port: the label moves lev_box_cue's stock-equal span from offset 58 to 38, and lev_box_lev repeats the same 14 bytes. That makes 20 sites and six stock copies, with new trust rows for package e2df2fbf…. The package's stock-free scan passes (10, fails at 12).
  • Base rebuilt with the beta flags: identity 3e3e3de1…, browser .bin = build_core.py .bin ca8b457f…. On this machine the same command first reproduced main's committed base byte for byte. The lease entries didn't move, so Analog BD's and Sidechain's package bytes are unchanged; the other base-bound packages only change requiredBase.

Checked

  • MKII over USB, 16 Oct 2026. I ran the panel checks; the base was RAM-booted and the package installed over USB by Claude Code. Base MAIN.raw 5ca0afbf…, package e2df2fbf…. Five checks, all passed:

    • switch into MATRIX;
    • always-on label;
    • CUE + LEVEL to MAIN, CUE, PHONES, a mono jack and OFF on a playing track, with audio where the label says;
    • MIX as the PHONES level;
    • back to NORMAL.

    Details are in evidence/usb-hardware.md. The first 10 s trial's rollback was refused once with needs-recovery and completed by the base without a further command, which is the case octatrack-link.ts retries.

  • module:verify output-matrix: 52 images match, 74 matching refusals, 0 mismatches of 126. Without Fix: native builder places a floating cave in the overflow run before refusing #682 two 11-module selections refused for different reasons, which is that PR's bug.

  • Packages: rebuilt in the isolated image and imported (--development). Tape Echo's and Euclid's standalone recipes name the four rebuilt shared asset rows' hashes (provenance only, as in Fix: write Formatter.PLAIN's zero formatter words without a stepped slot (#626) #634 and BBD Delay 0.1.1-experimental: over USB for beta testers, stop kill, cheaper worst case #645).

  • Analog BD composition proofs: re-exported natively; all 212 and builderSources identical, only moduleSourceTreeSha256 changes.

  • OT UI captures: re-run on a static 0.1.1 image; pixel-identical to 0.1.0's.

  • npm run pr:ready: Ready.

Limits

  • No power cycle, project or Part reload, MASTER TRACK, STUDIO, or other modules beside it on this version on the unit, because the base was RAM-booted.
  • The 32 s emulator stress run in evidence/performance.json was made on 0.1.0 and not repeated.
  • module:verify rewrote chooser-metadata.json with POLY8's entry in another position and no content change. I kept main's order so the committed base stays the one tested on the unit.
  • These sources are pinned in your resident-engine preparation. This PR moves those pins; tell me if you'd rather re-pin them yourself.

🤖 Generated with Claude Code

npp1993 and others added 20 commits October 16, 2026 08:31
… refusing

When a floating ColdFire cave (Recorder Loop Fix's) did not fit the menu
cave window, build_bus.py asserted "past the stock zero run" before its own
overflow fallback ran. The browser composer (requestedCaves) puts the cave
in the overflow run at 0x400d24d0 and goes on to the real limit, so the two
refused the same selection for different reasons and module:verify counted
a mismatch (two EVERB selections on main, LOFI2's 13-module ones). Native
now places the cave by the browser's rule first (floating_cave_at): the
window at the next 128 bytes if it fits whole, else the overflow at the
next 4, else refuse.

- sdk/infrastructure-verification/floating-cave-overflow-builder.json:
  128 native selections built in the pinned image with main's and this
  build_bus.py (66 ledger-refused ones left out). All 100 images are
  identical, 10 refusals change only their reason, nothing refused now
  builds. Chained into the infrastructure tests, with unit tests for the
  placement rule and its parity with the browser's overflow constants.
- Analog BD composition proofs re-exported natively: all 212 identical,
  only builderSources and moduleSourceTreeSha256 change;
  verify-analog-bd-native.mjs passes (162 comparisons, 50 refusals, 6
  round trips).
- Module packages rebuilt in the isolated image and imported
  (--development): source-commit stamps only. The Tape Echo and Euclid
  standalone recipes' hashes of the four rebuilt shared asset rows are
  refreshed (provenance only, as in repeat98#634).

With LOFI2's branch, module:verify lofi2 reports 0 mismatches of 130.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In MATRIX the LEV box now always shows where the track plays (MN, PHN, ...)
instead of LEV, not only while CUE is held. A detour at 0x4004dcfa replaces
the plain LEV label push; the level value while turning, XLV, FUNC's MAIN
view, NORMAL and STUDIO stay stock. Gate 117/117; LCD captures in TESTING.md.

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

Run.rms took each capture's own last 2,000 samples, so two runs that
captured a different number of frames after transport start were compared
one sample apart (DIR AB 127 failed at +0.057% in combined image OMXATS27;
lined up from transport start the two match to 26 LSB). Checks that compare
runs (MATRIX MAIN vs stock, the level law, mono vs stereo, DIR) now trim
every capture to the shortest before taking the window. Tolerances unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One bus-ramp routine through Y pointers (the first frame runs it twice),
pointer-based per-sample ramps and end copy, OR-ed input gain tests, direct
address-register moves, a parallel move per bus level, and the destination
table packed three list numbers to a word. Sample-identical to the previous
build in 26 ot_emu scenarios; worst-case mixdown 4,240 -> 4,194 executed
instructions per frame; gate 117/117.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… re-pins, base and packages rebuilt

The LEV box label (new detour lev_box_lev at 0x4004dcfa, shared
dest_label) and the smaller core-0 DSP (657 + 14 words instead of
727 + 42) change sources the USB base pins.

Controller (stock_hook_controllers.py): the label moves the CUE-held
path's stock-equal span from offset 58 to 38 of lev_box_cue, and
lev_box_lev repeats the same 14 bytes (stock 0x4003ffd8, same SHA-256), so
STOCK_COPIES gets both entries (six copies). controller_sites picks up the
new detour: 20 sites. The package's stock-free scan passes (10 shared
non-zero bytes, fails at 12).

Re-pinned manifest.py, matrix_mix.asm and matrix.s in resident_dsp.py,
stock_hook_controllers.py and test_analog_bd_part_fence.py. The resident
Matrix unit is 675 words (was 773).

Base rebuilt from main a59677e with the beta flags (--write; main's
committed base reproduced byte for byte here first): package a9b5fe45,
identity 3e3e3de1, browser .bin = build_core.py .bin ca8b457f. The lease
entries did not move, so Analog BD's and Sidechain's package bytes are
unchanged; packages relinked, the other base-bound packages only change
requiredBase. New trust rows for Output Matrix's package e2df2fbf.

Version 0.1.1-experimental (catalog, manifest), changelog entries. The
qualification record stays 0.1.0's until the USB hardware report exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ld, development import)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The author's panel checks on a RAM-booted beta base built from this
source (MAIN.raw 5ca0afbf, package e2df2fbf): MATRIX on and off, the
always-on LEV label, routing to MAIN, CUE, PHONES, a mono jack and OFF,
and MIX as the PHONES level, all passed. Qualification moves to 0.1.1
with the current DSP figures (275 instructions/sample; 657 + 14 P words)
and evidence/usb-hardware.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The capture plan rerun on a static 0.1.1 image (mainos a9d5e3b8): the four
screenshots are pixel-identical to 0.1.0's (the always-on label equals the
CUE-held one); records and captions updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rformance record

- module-source and dsp-package tests: Output Matrix's version and its
  671-word core-0 package.
- Tape Echo and Euclid standalone recipes: the four rebuilt shared asset
  rows' hashes (provenance only, as in repeat98#634 and repeat98#645).
- evidence/performance.json for 0.1.1: 275 executed instructions per
  sample; the 32 s stress run was made on 0.1.0 and is not repeated.

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

Re-exported natively (export-composition-proofs.py --suite analog-bd
--static-stock --vendored-sdk): all 212 proofs identical; only
moduleSourceTreeSha256 changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…claude/output-matrix-lev-label-usb

# Conflicts:
#	CHANGELOG.md
#	sdk/machines/octatrack/module-adapters/standalone-recipes.json
#	src/engine/assets/analog-bd-composition-proofs.json
#	src/engine/assets/bootstrap-package.json
#	src/engine/assets/coldfire-packages.json
#	src/engine/assets/descriptor-recipes.json
#	src/engine/assets/dsp-packages.json
#	src/engine/assets/menu-recipes.json
#	src/engine/assets/module-build.json
#	src/engine/assets/platform-writes.json
#	src/engine/assets/requested-packages.json
#	src/engine/assets/resident-dsp.json
#	src/engine/assets/rom-packages.json
#	src/engine/assets/usb-audio-packages.json
#	src/engine/assets/utility-packages.json
…es and recipe provenance

Packages rebuilt in the isolated image on the merged tree and imported
(--development); Tape Echo and Euclid standalone recipes name the four
rebuilt shared asset rows' hashes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-exported natively: all 212 proofs and builderSources identical; only
moduleSourceTreeSha256 changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
module:verify output-matrix: 52 native module-owned images match, 74
matching refusals, 0 mismatches of 126 selections (with repeat98#682's builder
fix; without it the two 11-module selections refused for different
reasons).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce record

Only evidence/performance.json changed since the tested commit; manifest.py,
matrix.s, matrix_mix.asm and verify.py are as tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
module:verify rewrote the file with POLY8's entry in another position (no
content change); main's order keeps the committed base, the one tested on
the MKII, unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The author flashed the tested base: a power cycle kept MATRIX, the
routing and all seven installed modules. After it the LEV box showed
stock's split bars until CUE redrew the page (display only), recorded as
a limitation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
repeat98 added a commit that referenced this pull request Oct 19, 2026
…e-0 DSP, on the USB base (#687) (#705)

npp1993's Output Matrix 0.1.1-experimental from #687, merged with main (including E-Verb 0.1.2). The LEV box is always labelled with the track's destination; the core-0 DSP is 657 + 14 words with the same output; the beta base (3e3e3de1) and the controller package are rebuilt for it.

Merge: E-Verb 0.1.2 and this change touched different rows of the same compiled package files; each merged file is main's plus this change's rows, and module-build.json, the Analog BD proofs and the Tape Echo and Euclid standalone recipes carry the merged hashes. Release notes now say the DSP code ran on hardware over USB inside the base (card: emulator only), that this publishes the new base, and that the 0.1.1 card image, Part/project reload, MASTER TRACK and STUDIO were not checked on the unit.

Co-authored-by: Nathaniel Pawelczyk <nathaniel.pawelczyk@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

Copy link
Copy Markdown
Owner

Thanks @npp1993. This is merged as #705: your commits with current main merged in, including E-Verb 0.1.2, because I couldn't push to your fork. E-Verb and this PR changed different rows of the same compiled package files. Each merged file is main's plus your rows, and the build record, the Analog BD proofs and the Tape Echo and Euclid recipes carry the merged hashes.

I also corrected three things in the release notes:

  • The DSP code has run on hardware over USB, inside the base; on a card it has run only in the emulator.
  • This release publishes base 3e3e3de1.
  • The 0.1.1 card image, Part/project reload, MASTER TRACK and STUDIO weren't checked on the unit.

Closing in favour of #705. I'll follow the publish run.


Generated by Claude Code

@repeat98 repeat98 closed this Oct 19, 2026
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