Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
842d22f
Fix: native builder places a floating cave in the overflow run before…
npp1993 Oct 15, 2026
0b8f9ca
Output Matrix: label the LEV box with the track's destination
npp1993 Oct 13, 2026
a9d7171
Output Matrix gate: compare runs over the same samples from transport…
npp1993 Oct 15, 2026
ac94037
Output Matrix: core-0 code 727+42 -> 657+14 words, same output
npp1993 Oct 15, 2026
d0f2866
Output Matrix 0.1.1-experimental on the USB base: controller re-port,…
npp1993 Oct 16, 2026
44738ea
Output Matrix 0.1.1-experimental: source-built packages (isolated bui…
npp1993 Oct 16, 2026
6646ff8
Output Matrix 0.1.1-experimental: MKII hardware record over USB
npp1993 Oct 16, 2026
ebd59d7
Output Matrix 0.1.1-experimental: OT UI captures from the 0.1.1 image
npp1993 Oct 16, 2026
d88e529
Output Matrix 0.1.1-experimental: regenerate module documents
npp1993 Oct 16, 2026
0cf1845
Output Matrix 0.1.1-experimental: test pins, recipe provenance and pe…
npp1993 Oct 16, 2026
acf4de5
Analog BD composition proofs: source-tree stamp after Output Matrix 0…
npp1993 Oct 16, 2026
03e6a68
Merge remote-tracking branch 'fork/fix/builder-overflow-parity' into …
npp1993 Oct 16, 2026
706ecb9
Output Matrix 0.1.1-experimental on #682: source-built packages and r…
npp1993 Oct 16, 2026
6d4db60
Analog BD composition proofs: source-tree stamp on the merged tree
npp1993 Oct 16, 2026
d1c3574
Output Matrix 0.1.1-experimental: native comparison record
npp1993 Oct 16, 2026
2c49b75
Output Matrix 0.1.1-experimental: source identity after the performan…
npp1993 Oct 16, 2026
d5dd47d
Output Matrix 0.1.1-experimental: regenerate module documents
npp1993 Oct 16, 2026
d3f3d64
Keep main's chooser-metadata order
npp1993 Oct 16, 2026
ca39671
Output Matrix 0.1.1-experimental: power cycle on the flashed base
npp1993 Oct 16, 2026
6247f77
Output Matrix 0.1.1-experimental: regenerate module documents
npp1993 Oct 16, 2026
a47cf2f
Output Matrix 0.1.1 notes: what has run on hardware, and that this pu…
repeat98 Oct 19, 2026
6e5fb51
Merge main into Output Matrix 0.1.1 (#687)
repeat98 Oct 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
- Beta testers are asked to share diagnostics again on any page after a new consent version. The note that requires it showed once per account, so testers who went through it before the consent version changed to `2026-10-15.1` (#657) weren't asked again: on 16 October the pull held 0 records against 22 syncs the day before. Now a beta tester whose consent isn't for the current version, or has expired, gets the required step again (Share diagnostics or Leave beta) wherever they are on the site. It relies on the consent read returning the stored version (#665). A tester who turned sharing off under the current version isn't asked. Checked with unit tests; not yet seen on the live site.
- When Chrome can't open the Octatrack, the message now says why on Linux and Windows instead of only "unplug it and try again" (reported on Discord: an MKI on Chromium/Ubuntu and on Chrome/Windows). On Linux, Chrome needs a udev rule, now shown with the commands under Setup → Can't connect?, and Chromium from the Snap Store also needs its `raw-usb` connection. On Windows the Octatrack can be opened only once it runs the Modwerk base, because Windows binds WinUSB only to the base's interface. Checked with unit tests; the rule and the snap step have not been run on a Linux computer here, and neither has a Windows connection with the original OS.

- Output Matrix 0.1.1-experimental on the beta base: the base's resident Output Matrix engine is built from the module's smaller core-0 code (675 words placed on demand instead of 773), and its controller package is re-ported for the always-on LEV box label (20 stock sites, six stock-copy spans; package `e2df2fbf…`, admitted by new trust rows). The base identity changes to `3e3e3de1…`; its lease entries did not move, so Analog BD's recipe and the other base-bound packages' bytes are unchanged and only their required base moves. On the author's MKII over USB (RAM-booted base): MATRIX on and off, the label, routing and the PHONES level passed; on the flashed base a power cycle kept MATRIX and the routing, with the LEV box needing a redraw (press CUE) after it.

- Fixed the native Octatrack builder refusing a crowded selection for a different reason than the site's builder. When a ColdFire cave (Recorder Loop Fix's) did not fit the menu cave window, native octabam stopped with "past the stock zero run" before trying the overflow run, while the site put the cave in the overflow run and went on to the real limit, such as a DSP region overrun. `module:verify` reported these as mismatches (two EVERB selections on main, more on LOFI2's branch). Native now places the cave in the overflow run first, as the site does. Both builders still refuse these selections, so no firmware either one produces changes: 100 native images built before and after the change are identical, and 10 refusals change only their reason (`sdk/infrastructure-verification/floating-cave-overflow-builder.json`). Software checks only; no hardware result is claimed.

## 15 October 2026
Expand Down
Binary file not shown.
Binary file not shown.
2 changes: 1 addition & 1 deletion scripts/module-source.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ describe('release package scope and reviewed source inventory', () => {
const versions = await compiledModuleVersions(root, catalog), paths = await moduleSourcePaths(root)
expect(Object.keys(versions)).toEqual(['spectrum', 'modulation', 'character', 'miniverb', 'tapeecho', 'euclid', 'repitch', 'tapehead', 'airwindows-chorus', 'everb', 'bbd', ...requested.filter(id => id !== 'vector'),'previewvol','cc-map','sidechain-compressor','vector','playmodes','mute-modes','recorder-loop-fix','poly8','output-matrix'])
for (const id of ['playmodes', 'mute-modes', 'recorder-loop-fix', 'output-matrix']) {
expect(versions[id]).toBe(id === 'playmodes' ? '0.1.1-experimental' : id === 'mute-modes' ? '0.2.1-experimental' : '0.1.0-experimental')
expect(versions[id]).toBe(id === 'playmodes' ? '0.1.1-experimental' : id === 'mute-modes' ? '0.2.1-experimental' : id === 'output-matrix' ? '0.1.1-experimental' : '0.1.0-experimental')
expect(paths).toContain('modules/' + id + '/manifest.py')
}
expect(versions['midi-scenes']).toBe('0.2.5-experimental')
Expand Down
2 changes: 1 addition & 1 deletion sdk/catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
},
{
"id": "output-matrix",
"version": "0.1.0-experimental",
"version": "0.1.1-experimental",
"addedAt": "2026-10-08T21:55:32Z"
}
]
Expand Down
6 changes: 3 additions & 3 deletions sdk/machines/octatrack/base-binding.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"schema": 1,
"identity": "a1471aeb2dab7de08bd519b6a1eef702d1524a20175d5dd4513413a89c764bd3",
"identity": "3e3e3de1f350781b0d5b91736f77e7f3753ac9987f499cc83b32cd02568a36fc",
"arena": 1088568800,
"pool": 1086626384,
"pool": 1086625872,
"symbols": {
"modwerk_controller_write_begin": 1084865596,
"modwerk_controller_write_end": 1084865624,
Expand All @@ -11,7 +11,7 @@
},
"controllers": {
"sidechain-compressor": "fdfddb9d93a28c2c8d8c83a9c430dab1a09f0df2e416a24a4b37c7e23d6f5227",
"output-matrix": "4589b10b10842bda55b34607460257f9a2f9c317f75a253b2d5c3e6c9191ebad",
"output-matrix": "e2df2fbfff7f956846c030a87c50ff391af427b8719d40018e6449cef8e48acd",
"analog-bassdrum": "20211430d3c9eafd3253a50ebf936357ae6847420ac41717b8bcea28eec9f1ac"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ installed, so resident bases own those widenings (`resident-runtime/cue_cfg.s`:
CUE CFG 0..2 kept, three sites) and the package leaves them out; MATRIX then
survives a power cycle and `matrix_enter` is trusted by default. Retirement
refuses while MATRIX is selected (live or CS1 mirror): leave it on the AUDIO
page first. Five authored Matrix spans equal stock code byte for byte; they
page first. Six authored Matrix spans equal stock code byte for byte; they
ship as zeros plus hash-checked ABI 7 stock copies from bytes nobody patches.

Sidechain answers the base's raised `ev_mute_keep` (order 50, `sc_mute_keep`,
Expand Down
36 changes: 18 additions & 18 deletions sdk/machines/octatrack/module-adapters/controller-policies.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
{
"module": "output-matrix",
"moduleId": 3404814517,
"packageSha256": "4589b10b10842bda55b34607460257f9a2f9c317f75a253b2d5c3e6c9191ebad",
"sourcePolicySha256": "df589505c87f72735bc230661711af764e57ec5e73f1470d7af2eafb81dc3751",
"packageSha256": "e2df2fbfff7f956846c030a87c50ff391af427b8719d40018e6449cef8e48acd",
"sourcePolicySha256": "0994f291fc10c4b89c827cf60802e30ba152bf49c6572027e9edc0a22524a232",
"revisions": [
1,
1,
Expand All @@ -31,17 +31,17 @@
"feature": 2,
"requiredCores": 1,
"version": 1,
"imageBytes": 2248,
"imageBytes": 2316,
"entryName": "page_levels",
"entry": 1564,
"beginReturn": 1656,
"endReturn": 1706
"entry": 1632,
"beginReturn": 1724,
"endReturn": 1774
},
{
"module": "output-matrix",
"moduleId": 3404814517,
"packageSha256": "4589b10b10842bda55b34607460257f9a2f9c317f75a253b2d5c3e6c9191ebad",
"sourcePolicySha256": "df589505c87f72735bc230661711af764e57ec5e73f1470d7af2eafb81dc3751",
"packageSha256": "e2df2fbfff7f956846c030a87c50ff391af427b8719d40018e6449cef8e48acd",
"sourcePolicySha256": "0994f291fc10c4b89c827cf60802e30ba152bf49c6572027e9edc0a22524a232",
"revisions": [
1,
1,
Expand All @@ -50,17 +50,17 @@
"feature": 2,
"requiredCores": 1,
"version": 1,
"imageBytes": 2248,
"imageBytes": 2316,
"entryName": "matrix_leave",
"entry": 1780,
"beginReturn": 1814,
"endReturn": 1864
"entry": 1848,
"beginReturn": 1882,
"endReturn": 1932
},
{
"module": "output-matrix",
"moduleId": 3404814517,
"packageSha256": "4589b10b10842bda55b34607460257f9a2f9c317f75a253b2d5c3e6c9191ebad",
"sourcePolicySha256": "df589505c87f72735bc230661711af764e57ec5e73f1470d7af2eafb81dc3751",
"packageSha256": "e2df2fbfff7f956846c030a87c50ff391af427b8719d40018e6449cef8e48acd",
"sourcePolicySha256": "0994f291fc10c4b89c827cf60802e30ba152bf49c6572027e9edc0a22524a232",
"revisions": [
1,
1,
Expand All @@ -69,11 +69,11 @@
"feature": 2,
"requiredCores": 1,
"version": 1,
"imageBytes": 2248,
"imageBytes": 2316,
"entryName": "matrix_enter",
"entry": 1936,
"beginReturn": 1970,
"endReturn": 2020
"entry": 2004,
"beginReturn": 2038,
"endReturn": 2088
},
{
"module": "analog-bassdrum",
Expand Down
4 changes: 2 additions & 2 deletions sdk/machines/octatrack/module-adapters/resident_dsp.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
'modules/sidechain-compressor/manifest.py': '3bba6ac8ba315e10d6d7f2cb6342fb5ce6564e1ba6cd6ec362787d685c5e0cd7',
'modules/sidechain-compressor/upstream/tools/patch_sc_dsp3.asm': 'aaa1a1c947a8bcb5d19ebc9454ec3f020d1f00afe51fe786fe1f3ed4d5eccde3',
'modules/sidechain-compressor/upstream/tools/sc_tables.py': '8045e06f97fa462ca3f986b5a46e8ee48f9f9663691ae291221ce8ed6489c71a',
'modules/output-matrix/manifest.py': '1e9f844eff11dc2e262fd7efc733ae309c4285fd0a14e494da6b568d24af1216',
'modules/output-matrix/matrix_mix.asm': 'eee21cd84c8dd871ba76841dfea8fdd0edb1276ed1b4ded343687cf7b629383f',
'modules/output-matrix/manifest.py': '65d1ae009dc1c956ce2036181667434e31b361179ca138e5c8f1091227b55619',
'modules/output-matrix/matrix_mix.asm': '8f58596d8bd23bf50651d4288745c187ace9e6f9e0efffd34dcdad627b89476e',
'tools/build/ab_image.py': 'c4573d4e0715961f7081dc1d5a0639d42ac63313ccc9e50a0737ac0685e2fc14',
'tools/build/ab_records.py': '71f44c4c54b281b5c813ffbab3abb98501620ad980582367004a1daeb2eeca45',
'modules/analog-bassdrum/manifest.py': '20fa1f744630354b3986a3ad82ac6a41744345796dc783891a4c9f0bd81c787e',
Expand Down
16 changes: 8 additions & 8 deletions sdk/machines/octatrack/module-adapters/standalone-recipes.json
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,10 @@
"src/engine/coldfire-elf.ts": "319ca0d835d1b0c602c8f4b06990016d0ebfe246cedbfc596cea3cc7adfe3cd2",
"src/engine/module-build.ts": "8f547a4be722cfe691fa21d0c4b52c724b3353ba2560c2562b56579f0abe5f3b",
"src/catalog/modules.ts": "e268c6d42e4d5093ab943aed5cf2263a72e6d5e1a7ac0e72efc8a7ec6c62b89b",
"src/engine/assets/dsp-packages.json": "86bd35960c9ce78badcab617155933c1c523ec442212702c023867f258a41a04",
"src/engine/assets/descriptor-recipes.json": "6642eea46a6ceeb48c53cec6787de2fe4de898173aa9dbbcae3ad81fa2e72eef",
"src/engine/assets/menu-recipes.json": "88051f6758779c4ec9953cb0295a9aac39cea28811da4004bd7d5ee06d6e4c8d",
"src/engine/assets/rom-packages.json": "838c0f9123dcbfdfbb6924462fc8406d36c73861f4c8f2932e06972a598b116a",
"src/engine/assets/dsp-packages.json": "45da1d85694cbc738911d9611d5ffe8bb08cc704914f0043dab34f74964cb392",
"src/engine/assets/descriptor-recipes.json": "85034088e621811c10b8aa7e9816df37a6b65e558953090e2b68626efe14f2b1",
"src/engine/assets/menu-recipes.json": "bd1b2f41d2b92b2d571d4e8a60c1626a231ef7c660d6e804c966f519b3998747",
"src/engine/assets/rom-packages.json": "f591406c0cb825dab3431fcb821007102f68088d0e17ca20c5a3ee23a81f3db3",
"upstream/elekloader/link.py": "2d950474a5bd9d54e62747bfe7f9be30a37a7857df24cd9594e2198b912204f7",
"upstream/elekloader/dsp.py": "9486d64eecee023670b716f6ae854996da02ee7c1a0efd5361cd963c756dbc69",
"upstream/elekloader/patch.py": "13cc7457aa9a9e6d8f40cd5add4d40b69a3fcedd2cc5f3d65fd1b9841cc8bd9f",
Expand Down Expand Up @@ -383,10 +383,10 @@
"src/engine/coldfire-elf.ts": "319ca0d835d1b0c602c8f4b06990016d0ebfe246cedbfc596cea3cc7adfe3cd2",
"src/engine/module-build.ts": "8f547a4be722cfe691fa21d0c4b52c724b3353ba2560c2562b56579f0abe5f3b",
"src/catalog/modules.ts": "e268c6d42e4d5093ab943aed5cf2263a72e6d5e1a7ac0e72efc8a7ec6c62b89b",
"src/engine/assets/dsp-packages.json": "86bd35960c9ce78badcab617155933c1c523ec442212702c023867f258a41a04",
"src/engine/assets/descriptor-recipes.json": "6642eea46a6ceeb48c53cec6787de2fe4de898173aa9dbbcae3ad81fa2e72eef",
"src/engine/assets/menu-recipes.json": "88051f6758779c4ec9953cb0295a9aac39cea28811da4004bd7d5ee06d6e4c8d",
"src/engine/assets/rom-packages.json": "838c0f9123dcbfdfbb6924462fc8406d36c73861f4c8f2932e06972a598b116a",
"src/engine/assets/dsp-packages.json": "45da1d85694cbc738911d9611d5ffe8bb08cc704914f0043dab34f74964cb392",
"src/engine/assets/descriptor-recipes.json": "85034088e621811c10b8aa7e9816df37a6b65e558953090e2b68626efe14f2b1",
"src/engine/assets/menu-recipes.json": "bd1b2f41d2b92b2d571d4e8a60c1626a231ef7c660d6e804c966f519b3998747",
"src/engine/assets/rom-packages.json": "f591406c0cb825dab3431fcb821007102f68088d0e17ca20c5a3ee23a81f3db3",
"upstream/elekloader/link.py": "2d950474a5bd9d54e62747bfe7f9be30a37a7857df24cd9594e2198b912204f7",
"upstream/elekloader/dsp.py": "9486d64eecee023670b716f6ae854996da02ee7c1a0efd5361cd963c756dbc69",
"upstream/elekloader/patch.py": "13cc7457aa9a9e6d8f40cd5add4d40b69a3fcedd2cc5f3d65fd1b9841cc8bd9f",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
SOURCE_PINS = {
'modules/sidechain-compressor/manifest.py': '3bba6ac8ba315e10d6d7f2cb6342fb5ce6564e1ba6cd6ec362787d685c5e0cd7',
'modules/sidechain-compressor/upstream/tools/patch_sidechain.s': 'e47f44a7685f0ea82d908897d222c04a6c3729c87dc6443d8d18d2af914b0d20',
'modules/output-matrix/manifest.py': '1e9f844eff11dc2e262fd7efc733ae309c4285fd0a14e494da6b568d24af1216',
'modules/output-matrix/matrix.s': '41bb06ce2e43d46d32a4b12a1c91df6dddf03f89281c4bcfe1129baa22a7cca1',
'modules/output-matrix/manifest.py': '65d1ae009dc1c956ce2036181667434e31b361179ca138e5c8f1091227b55619',
'modules/output-matrix/matrix.s': 'a4b9f74062520437ed0db2f8b497d6af89661621ab3deef5078158514194b287',
}
UNITS = {
'sidechain-compressor': ('modules/sidechain-compressor/upstream/tools/patch_sidechain.s', 1, ('sc_norm',)),
Expand All @@ -51,7 +51,8 @@
('mw_mode_done', 2, 0x40055e62, 14, '91a4bbc12afccfa7100e67201876284c378c5e2ce3fa01d7729b37c918a4e9cb'),
('part_cue', 0, 0x4000eab0, 16, '76615980349044858d2d9013919133c736ea96190fad78cc59e5e55748ca263b'),
('part_cue', 22, 0x4004eb96, 13, 'f6bb5520b783d035828391c47f07f2457e9bf7f6cb785f9518abf6829d44f3da'),
('lev_box_cue', 58, 0x4003ffd8, 14, 'e3d21ed07e823ecac61ec2b4dd20ebf1eac251c1886b5381ce9c33a9d1783e48'))}
('lev_box_cue', 38, 0x4003ffd8, 14, 'e3d21ed07e823ecac61ec2b4dd20ebf1eac251c1886b5381ce9c33a9d1783e48'),
('lev_box_lev', 38, 0x4003ffd8, 14, 'e3d21ed07e823ecac61ec2b4dd20ebf1eac251c1886b5381ce9c33a9d1783e48'))}
# Sidechain's KEY/KFLT/KGN/MON on COMPRESSOR's own page: the catalogue's
# descriptor recipe, carried at the head of the image as an MWPP record the
# board applies in place while the controller is ACTIVE (controller_board.c).
Expand Down
Loading
Loading