Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
b6e9d51
Mute Modes 0.2.2-experimental: SHADOW out of the stock timestretch ta…
Zac-Kyoti Oct 27, 2026
0d0566f
Mute Modes 0.2.2: imported source-built packages (development)
Zac-Kyoti Oct 28, 2026
22f8e36
Mute Modes 0.2.2: probe targets the unit's SHADOW byte; author refere…
Zac-Kyoti Oct 28, 2026
dad7786
Mute Modes 0.2.2: hardware report, qualification, captures, USB packa…
Zac-Kyoti Oct 28, 2026
62dde6e
Mute Modes 0.2.2: packages rebuilt from the final source
Zac-Kyoti Oct 28, 2026
707a72a
Mute Modes 0.2.2: native comparison (0 mismatches of 162 selections),…
Zac-Kyoti Oct 28, 2026
dc47530
Mute Modes 0.2.2: cycles per event, test pins (qualified, 970 B), rec…
Zac-Kyoti Oct 28, 2026
e3c2b01
Mute Modes 0.2.2: packages from the final source; Analog BD proof hea…
Zac-Kyoti Oct 28, 2026
c1d00bd
Mute Modes 0.2.2: regenerated catalogue
Zac-Kyoti Oct 28, 2026
98ac995
Mute Modes 0.2.2: native comparison of the final source
Zac-Kyoti Oct 28, 2026
40a7626
Mute Modes runtime fixture: seed and read SHADOW in the installed uni…
Zac-Kyoti Oct 28, 2026
aea53c9
Merge main into mute-modes-0.2.2 (generated assets taken from main, r…
Zac-Kyoti Oct 29, 2026
d42ffe7
Mute Modes 0.2.2: packages rebuilt from the merge; Analog BD proof he…
Zac-Kyoti Oct 29, 2026
2fae7a9
Mute Modes 0.2.2: native comparison on current main (0 mismatches of …
Zac-Kyoti Oct 29, 2026
11b6701
Merge remote-tracking branch 'origin/main' into mute-modes-keyhold
Zac-Kyoti Nov 2, 2026
fc58fbb
Mute Modes 0.2.2: KEYHOLD -- a muted side-chain KEY track stays cut a…
Zac-Kyoti Nov 2, 2026
fcf0959
Mute Modes 0.2.2 (KEYHOLD): imported source-built packages (development)
Zac-Kyoti Nov 2, 2026
52a7586
Mute Modes 0.2.2 (KEYHOLD): USB package, recipe and qualification sou…
Zac-Kyoti Nov 2, 2026
641ea05
Mute Modes 0.2.2 (KEYHOLD): native comparison (0 mismatches of 162)
Zac-Kyoti Nov 2, 2026
3536e58
Mute Modes 0.2.2 (KEYHOLD): probe at the new SC_KEY origin with hold/…
Zac-Kyoti Nov 2, 2026
e3d788e
Mute Modes 0.2.2 (KEYHOLD): packages rebuilt from the final source
Zac-Kyoti Nov 2, 2026
8c3842b
Merge remote-tracking branch 'origin/main' into mute-modes-keyhold
Zac-Kyoti Nov 3, 2026
091eb3b
Mute Modes 0.2.2 (KEYHOLD): packages rebuilt from the merge; native c…
Zac-Kyoti Nov 3, 2026
cea2035
Mute Modes 0.2.2 (KEYHOLD): hardware report (MW_MMKH1, Sidechain Comp…
Zac-Kyoti Nov 3, 2026
8e25ef3
Merge remote-tracking branch 'origin/main' into mute-modes-keyhold
Zac-Kyoti Nov 3, 2026
903045b
Tape Echo and Euclid standalone recipes re-pinned to the rebuilt asse…
Zac-Kyoti Nov 3, 2026
2783a7e
Analog BD proofs re-exported natively (8 shards, committed order): al…
Zac-Kyoti Nov 3, 2026
5332376
Mute Modes 0.2.2 (KEYHOLD): test pins, SC_KEY unit 1086 -> 1100 B
Zac-Kyoti Nov 3, 2026
0236053
Mute Modes 0.2.2: OT-exit hold -- a track still muted when MUTE MODE …
Zac-Kyoti Nov 4, 2026
7decf4a
Mute Modes 0.2.2 (OT-exit hold): imported source-built packages (deve…
Zac-Kyoti Nov 4, 2026
a2d9882
Mute Modes 0.2.2 (OT-exit hold): USB package, recipe and qualificatio…
Zac-Kyoti Nov 4, 2026
cceecba
Mute Modes 0.2.2 (OT-exit hold): native comparison (0 mismatches of 162)
Zac-Kyoti Nov 4, 2026
b9bd875
Mute Modes 0.2.2 (OT-exit hold): probe remapped to the new units with…
Zac-Kyoti Nov 4, 2026
c4fcfa3
Mute Modes 0.2.2 (OT-exit hold): TESTING section, test image MW_MMOH1…
Zac-Kyoti Nov 4, 2026
4fcc9bc
Mute Modes 0.2.2 (OT-exit hold): changelog line within the 200-charac…
Zac-Kyoti Nov 4, 2026
e729fe1
Mute Modes 0.2.2 (OT-exit hold): packages rebuilt from the final sour…
Zac-Kyoti Nov 4, 2026
d7a582e
Tape Echo and Euclid standalone recipes re-pinned to the rebuilt asse…
Zac-Kyoti Nov 4, 2026
fe5e343
Analog BD proofs re-exported natively (8 shards, committed order): al…
Zac-Kyoti Nov 4, 2026
09fe7dc
Mute Modes 0.2.2 (OT-exit hold): hardware report (MW_MMOH1, Sidechain…
Zac-Kyoti Nov 4, 2026
fcb07e3
Merge origin/main into mute-modes-0.2.2 (generated assets taken from …
repeat98 Nov 4, 2026
e3a91ff
Mute Modes 0.2.2: table-owner declaration, owner approval record, rel…
repeat98 Nov 4, 2026
8de3f2f
Mute Modes 0.2.2: beta base with the 0.2.2 table owner (462fbd2b...),…
repeat98 Nov 4, 2026
7542d59
Merge origin/main into mute-modes-0.2.2
repeat98 Nov 4, 2026
d5bc9eb
Merge remote-tracking branch 'origin/main' into claude/pr1007-mute-modes
repeat98 Nov 5, 2026
a0cdfd2
Mute Modes 0.2.2: release notes dated on the merge day
repeat98 Nov 5, 2026
5ce3716
Merge remote-tracking branch 'origin/main' into claude/pr1007-mute-modes
repeat98 Nov 5, 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
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', 'lofi2', 'ring-sc', ...requested.filter(id => id !== 'vector'),'previewvol','cc-map','sidechain-compressor','vector','playmodes','mute-modes','recorder-loop-fix','poly8','output-matrix','quantize-live-rec-toggle','apply-scene','direct-jump-kyoti','dejavu', 'arp-key-locks', 'temp-save'])
for (const id of ['playmodes', 'mute-modes', 'recorder-loop-fix', 'output-matrix', 'quantize-live-rec-toggle','apply-scene','direct-jump-kyoti','dejavu', 'arp-key-locks', 'temp-save']) {
expect(versions[id]).toBe(id === 'playmodes' ? '0.2.0-experimental' : id === 'mute-modes' ? '0.2.1-experimental' : id === 'output-matrix' ? '0.1.1-experimental' : id === 'apply-scene' ? '0.2.0-experimental' : id === 'quantize-live-rec-toggle' ? '0.1.1-experimental' : id === 'direct-jump-kyoti' ? '0.1.2-experimental' : '0.1.0-experimental')
expect(versions[id]).toBe(id === 'playmodes' ? '0.2.0-experimental' : id === 'mute-modes' ? '0.2.2-experimental' : id === 'output-matrix' ? '0.1.1-experimental' : id === 'apply-scene' ? '0.2.0-experimental' : id === 'quantize-live-rec-toggle' ? '0.1.1-experimental' : id === 'direct-jump-kyoti' ? '0.1.2-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 @@ -119,7 +119,7 @@
},
{
"id": "mute-modes",
"version": "0.2.1-experimental",
"version": "0.2.2-experimental",
"addedAt": "2026-10-07T20:00:00Z"
},
{
Expand Down
140 changes: 140 additions & 0 deletions sdk/imports/mute-modes-bb9bead.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
{
"schemaVersion": 1,
"repository": "https://github.com/sambanks/octabam",
"revision": "08bffd529c0f301708bcb2d48759e54e11f59858",
"moduleVersion": "0.2.2-experimental",
"root": "sdk/octabam/modules/mute-modes",
"modules": [
"mute-modes"
],
"files": [
{
"path": "patch_softmute.s",
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "bb9beada9248fdae13bee32684a7f2564e586f6c",
"sourcePath": "modwerk-modules/mute-modes/patch_softmute.s",
"sourceBytes": 89378,
"sourceGitBlob": "53dc570405ba693e7f7edb355d0d3e579aaf9d31",
"sourceSha256": "4fb8d84a6f848299d3de611e20237901110e77041fc46c2620bd149f44ccb2c1",
"vendoredSha256": "4fb8d84a6f848299d3de611e20237901110e77041fc46c2620bd149f44ccb2c1"
},
{
"path": "patch_mutemode.s",
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "bb9beada9248fdae13bee32684a7f2564e586f6c",
"sourcePath": "modwerk-modules/mute-modes/patch_mutemode.s",
"sourceBytes": 10222,
"sourceGitBlob": "132712bf4a68879c6a0433ad08a44703523885a2",
"sourceSha256": "85b0be45d2ec5540a89d97d8e87884590cc1feb1b6719087acff686e83aba100",
"vendoredSha256": "85b0be45d2ec5540a89d97d8e87884590cc1feb1b6719087acff686e83aba100"
},
{
"path": "manifest.py",
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "bb9beada9248fdae13bee32684a7f2564e586f6c",
"sourcePath": "modwerk-modules/mute-modes/manifest.py",
"sourceBytes": 8503,
"sourceGitBlob": "fc9fcfc41ddceab6b166ad865bc216103a546041",
"sourceSha256": "33e06de61d255800107843c44583c6487280ef452c703e79fa07179051d4e1bd",
"vendoredSha256": "33e06de61d255800107843c44583c6487280ef452c703e79fa07179051d4e1bd"
},
{
"path": "runtime.json",
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "bb9beada9248fdae13bee32684a7f2564e586f6c",
"sourcePath": "modwerk-modules/mute-modes/runtime.json",
"sourceBytes": 204,
"sourceGitBlob": "56c66cc1f50412b2c2397737a8801a859efa6f34",
"sourceSha256": "848cf42bed75ec3fd101f4d5869185ffb33967a29e1e55eae737c829a9d83a86",
"vendoredSha256": "848cf42bed75ec3fd101f4d5869185ffb33967a29e1e55eae737c829a9d83a86"
},
{
"path": "upstream/README.md",
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "d3e0801a5f666abc04bc05fc1cb37969d7fb38d0",
"sourcePath": "octabam-modules/mute-modes/README.md",
"sourceBytes": 3390,
"sourceGitBlob": "a575ed3a5ca04f647bdbf6f23cead2447d577fc2",
"sourceSha256": "1b6cdac7e69b416026b995b73fc48ccec9b5a05c7e097ade87dd3a7e7ee5d54a",
"vendoredSha256": "1b6cdac7e69b416026b995b73fc48ccec9b5a05c7e097ade87dd3a7e7ee5d54a"
},
{
"path": "LICENSE",
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "d3e0801a5f666abc04bc05fc1cb37969d7fb38d0",
"sourcePath": "LICENSE",
"sourceBytes": 4451,
"sourceGitBlob": "3e76489f7da43570add4342b27fd9e1aff949672",
"sourceSha256": "0d3f46fdaa57dcf513b0d62975eb019334f4eb9cc8ea0b973ce191dd661741f5",
"vendoredSha256": "0d3f46fdaa57dcf513b0d62975eb019334f4eb9cc8ea0b973ce191dd661741f5"
},
{
"path": "upstream/OCTABAM_LICENSE",
"repository": "https://github.com/sambanks/octabam",
"revision": "6f9e5bc9db0ae9fa99fa2f2a0f4de1fdb8e9a136",
"sourcePath": "LICENSE",
"sourceBytes": 2112,
"sourceGitBlob": "112114d5d319dc4a789dacf1e84b867420a03614",
"sourceSha256": "f91a43799d9e31ccc3540f385f68c4d6ff5a096f93ae933be2ce98f6b3f7f113",
"vendoredSha256": "f91a43799d9e31ccc3540f385f68c4d6ff5a096f93ae933be2ce98f6b3f7f113"
}
],
"stockGuards": [
{
"address": "0x40004dc6",
"bytes": 6,
"sha256": "0759b4a7055beab59cdc9d7b8f51bcc27fc8e6b07d38842260ceef916dc33d53"
},
{
"address": "0x40006844",
"bytes": 6,
"sha256": "27f17790db914b0847a6bd64cfef8523d1910193c6c550577e389ea506a68b94"
},
{
"address": "0x4000f4dc",
"bytes": 8,
"sha256": "c605d386cc7bbf132d9a1bc10d655c3f8f550c75e0cf51715ac2966015b40068"
},
{
"address": "0x4000d498",
"bytes": 6,
"sha256": "00dfac25f63401293b216e5ec256e32776a875e1f4d10cf27f31694e95f70308"
},
{
"address": "0x40006820",
"bytes": 8,
"sha256": "87faf47c9893d1a9506259f68551bf06eb1ce723ac12cfae49a5b10b8b169fb6"
},
{
"address": "0x40004c72",
"bytes": 6,
"sha256": "6314eb6bf2fc2b8a735ece556af833c4937e3c2added6668f6015e33455866d0"
},
{
"address": "COUNT_AT",
"bytes": 2,
"sha256": "5dd82fd23ac20130aebe3391a4c9a9fda6ca01bd143223a558ec253b65083dfd"
},
{
"address": "site",
"bytes": 4,
"sha256": "8c4c50dbddad08d1ae644a694665e608f2bbdb90d7a321fc640e844ae4c149fa"
}
],
"excluded": [
"Firmware and stock expectation bytes",
"Generated firmware, runtime images and memory dumps",
"Unrelated modules and author repository tooling"
],
"notes": [
"patch_softmute.s, patch_mutemode.s, manifest.py and runtime.json are the author's files byte for byte at the pinned commit, from modwerk-modules/mute-modes/, the author's own Modwerk copy (the 0.2.1 sources with Modwerk's MODWERK_EVENTS blocks, plus this version's changes). upstream/README.md, LICENSE and upstream/OCTABAM_LICENSE are unchanged from 0.1.0's record.",
"0.2.2 moves SHADOW, hook 1's per-frame silenced set, from SRAM 0x80006c66 into the unit after KEYMASK; sambanks/octabam pins that change at a1e0288 (PR #928, merged as the revision above).",
"0.2.2 also adds the hold: a muted track keeps stock's post-FX cut until it is unmuted when it has been a side-chain KEY (ev_mute_keep's answer, SC_KEY units) or when it was still muted as MUTE MODE left OT (every unit). In OT, `pre` clears the inverted hold byte UNHELD and SHADOW with one clr.w; the plain unit gets the hold as p1_hold. The question came from sambanks/octabam#1013. The units equal the author's references (plain 996 B at 0x400d7400, was 970; SC_KEY 1106 B at 0x400d6e54, was 1100).",
"The stock guard digests are 0.1.0's; no hook site changed."
],
"status": "Listed; author update. Hardware: see TESTING.md.",
"authorPin": {
"repository": "https://github.com/Zac-Kyoti/octatrack-kyoti-fw",
"revision": "bb9beada9248fdae13bee32684a7f2564e586f6c"
}
}
16 changes: 8 additions & 8 deletions sdk/machines/octatrack/base-binding.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schema": 1,
"identity": "9680e9ac861ff9313ce4f7a710a37ad2aa8e9b50b2cf8c043dafa2a0b78cdffc",
"identity": "462fbd2b2ee95dd71c02778ef3b17aacba945bac9b6206688d8ef8995003826e",
"arena": 1089508832,
"pool": 1087548400,
"symbols": {
Expand All @@ -15,12 +15,12 @@
"analog-bassdrum": "579b9b5e76b000a8b9c95f6131a547fbb5117f497d4bc3ee0f98385edc96e5a3"
},
"variants": {
"tracks-main-cue": "9680e9ac861ff9313ce4f7a710a37ad2aa8e9b50b2cf8c043dafa2a0b78cdffc",
"tracks": "244a8636b24d70dbec07ce49b1089050c2b224191e11068b4090a2cef5ea7492",
"tracks-post": "5b80a6086bcd0738b01aca792bbff00e3435dbe60e9c1a96153b4be24e08040a",
"main-cue": "9dc67f4c98bb27e292e225d8aa316e9fe4e24f870c83c5b86da9336cac26ed20",
"main": "42d7cb4a043a6e7c54c0cff0961ad240513d0f18a0c89841151f424fc2d19d28",
"master": "bc84a9694c768ff7e1cbb6972dfacfe1df90c343010ecbcf8ce8093029115f84",
"off": "a8b7b104d2ecdf61e77dfb2ba48a693800f14cb91c9dd74539c12bbd0618bd3b"
"tracks-main-cue": "462fbd2b2ee95dd71c02778ef3b17aacba945bac9b6206688d8ef8995003826e",
"tracks": "2fba659c58db63c42ace7cfeba23bfcdb98ca8b73738b8b2504ddc042d1f9451",
"tracks-post": "5fcd9902f697951f7aacf17af4e8e1fac82528c81f4ff19d6370e391dfa0ebe4",
"main-cue": "69532eed67b1bd8931207ffc3d0cccbfcad3a72e08a8ac7aadf7b40e07083daa",
"main": "485fe2533ef7a98261e91c8d19982c1a0199703818be9ac50f36af81ab0e56e3",
"master": "1a4b1da86bcbc1c0e8faa32e17f5fd96cd34dd36ff963c7bcfe304cff26ebb70",
"off": "ec660ded5e6c4e291a38046925a11b74d0a15b627b8a6aab853a201d4ec8df8a"
}
}
18 changes: 9 additions & 9 deletions sdk/machines/octatrack/module-adapters/candidate-recipes.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,18 +102,18 @@
"sources": {
"sdk/octabam/modules/mute-modes/runtime.json": "848cf42bed75ec3fd101f4d5869185ffb33967a29e1e55eae737c829a9d83a86",
"sdk/octabam/modules/mute-modes/patch_mutemode.s": "85b0be45d2ec5540a89d97d8e87884590cc1feb1b6719087acff686e83aba100",
"sdk/octabam/modules/mute-modes/manifest.py": "ad7468c3aa9b48780cc881feffbbeb0ce7b4b3cf7cb963a2453b22f88fe85e5f",
"sdk/octabam/modules/mute-modes/manifest.py": "33e06de61d255800107843c44583c6487280ef452c703e79fa07179051d4e1bd",
"sdk/octabam/modules/mute-modes/qualification.example.json": "80662f1b39221cc59d933e023ddddedc3bdcc65f10185acd4a6816a420485519",
"sdk/octabam/modules/mute-modes/octamod.module.json": "02036446cb875025e023e935a28ec2ce177b62d78d92891e26598d4473d282b0",
"sdk/octabam/modules/mute-modes/patch_softmute.s": "21fa011e7d118f98eafa9373c89732cf12840abcb28f2cd945514223e0b4a2bb",
"sdk/octabam/modules/mute-modes/octamod.module.json": "3a58482dfe3c34b2aece554cd0824a2700eba10787343ab319d7a8b1d51014cb",
"sdk/octabam/modules/mute-modes/patch_softmute.s": "4fb8d84a6f848299d3de611e20237901110e77041fc46c2620bd149f44ccb2c1",
"sdk/octabam/modules/mute-modes/evidence/reproduction.json": "ead6381c5e7c9bfa04ac08572d5d71f90e7318a5cbb26d2fb4182db210b2242f",
"sdk/octabam/modules/mute-modes/evidence/source-identity.json": "e2b614f4f4e6fac5fce8123bd2943a968446606b00cf1251e99dd6c4aef17143",
"sdk/octabam/modules/mute-modes/evidence/probes.json": "51a456346db2be6299fc5ba7127369d8430d4c69f8b99a0d6547ed82563f7af0",
"sdk/octabam/modules/mute-modes/evidence/memory-layout.json": "9c3bc924d147e493926c2dfa0d57ee937caf7097fea5ad0ce781090540dac712",
"sdk/octabam/modules/mute-modes/evidence/performance.json": "046b4800071eb007b0cb4cafdf6f64d1571a9cba4331a0bc5cfc4bde4296e11a",
"sdk/octabam/modules/mute-modes/evidence/source-identity.json": "a46af3e865ca0b920c0ab31a688fe9b5764aa437dd01869432f58007a1bc6aa3",
"sdk/octabam/modules/mute-modes/evidence/probes.json": "aed2f2c1ca1fd3574620f89446c5f09ef1f7ea513f940cfe4b6974fa67e7b6fe",
"sdk/octabam/modules/mute-modes/evidence/memory-layout.json": "fed0d869a2d588113347aadb3198d499b5747a258ebba66bf240b46df3a0fe21",
"sdk/octabam/modules/mute-modes/evidence/performance.json": "60b6632de8d6531a5cb3d2ee2b2605eb0f760a37cf8c49d66e0404e1e9ae340d",
"sdk/octabam/modules/mute-modes/evidence/local-image.json": "168bc0d3d0e37fc307042edec7f882331d8b32a6b08dbe37f7671fc024449ae8",
"sdk/octabam/modules/mute-modes/qualification/run.py": "f45ed781001b74991d6e89829e29db04510844ea8eca89affa6208c3a9e0f609",
"sdk/octabam/modules/mute-modes/media/capture.json": "a89008483cd9b05e638090b01d54016bcf0037a54c87ec7bed35d180c861b7c4",
"sdk/octabam/modules/mute-modes/qualification/run.py": "d5295785e1e1fe1c766c3291a17c5dea5291e2609c09454358679732e871f28a",
"sdk/octabam/modules/mute-modes/media/capture.json": "90c2f58902f57257186752c687615684e48a2610e4b23ed78ac08a1b772a22f8",
"sdk/octabam/tools/remix/platform_build.py": "e72b7a29b45851addecf135ad520db98b66f5e10c5cd354adf37fb52d6c2e42f",
"sdk/octabam/tools/remix/machine_composition.py": "6be0efdccc78a4fd1fafdba0cf39fcdb9cf510e72bd26aa22e7cdfe06d857783",
"sdk/octabam/tools/remix/stock_guard.py": "b05e115afaa11d1507273bdcd26e05c25e7a6424d3e0fb4eb21d797194e508b3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
static constexpr uint32_t sp0 = 0x46c7f920, packet = 0x47010000, stop = 0x47300000, base = 0x47400000;
static constexpr uint32_t PRE_SITE = 0x40004dc6, PRE_BACK = 0x40004dcc, BIND_SITE = 0x40006820, NOTEOFF = 0x40008f84;
static constexpr uint32_t GATE = 0x800000dc, SH_GATE = 0x100fff6c, MUTE_STATE = 0x80000008, SOLO_FLAG = 0x80000037;
static constexpr uint32_t REL_STATE = 0x8000184a, SHADOW = 0x80006c66, RECORDS = 0x80000110, NOTE_STUB = 0x47300200, NOTED = 0x47300300;
static constexpr uint32_t REL_STATE = 0x8000184a, RECORDS = 0x80000110, NOTE_STUB = 0x47300200, NOTED = 0x47300300;
static std::vector<uint8_t> load(const char *path) { std::ifstream f(path, std::ios::binary); assert(f.good()); return {(std::istreambuf_iterator<char>(f)), {}}; }
static std::map<std::string, uint32_t> names(const char *path) // nm's "address type name" lines
{
Expand Down Expand Up @@ -93,18 +93,20 @@ struct Frame { uint32_t gate, muted, soloed, flag; uint8_t fx[8][4]; };

int main(int argc, char **argv)
{
// stock, events image + symbols, legacy image + symbols, new package + symbols, raw plain, raw SC_KEY + symbols, provider
assert(argc == 12);
// stock, events image + symbols, legacy image + symbols, new package + symbols, raw plain + symbols, raw SC_KEY + symbols, provider
assert(argc == 13);
auto stock = load(argv[1]);
auto ev_code = load(argv[2]); auto ev_sym = names(argv[3]); auto old_code = load(argv[4]); auto old_sym = names(argv[5]);
Pkt mmNew{load(argv[6]), names(argv[7])}, mmPlain{load(argv[8])}, mmKey{load(argv[9]), names(argv[10])}, keep{load(argv[11])};
Pkt mmNew{load(argv[6]), names(argv[7])}, mmPlain{load(argv[8]), names(argv[9])}, mmKey{load(argv[10]), names(argv[11])}, keep{load(argv[12])};
unsigned scenarios = 0;

// The frame: hook 1 from its site to its return, then every track's fresh-voice bind (and the all-tracks call).
auto frame = [&](Probe& p, const Pkt *mm, const Frame& f) {
std::vector<uint32_t> out;
// SHADOW (hook 1's last silenced set) is a byte inside the installed unit since 0.2.2, not SRAM.
const uint32_t shadow = p.call("fixture_image", {mm->id()}) + mm->sym.at("SHADOW");
p.m.write32(GATE, f.gate); p.m.write32(MUTE_STATE, f.muted << 8 | f.soloed); p.m.write8(SOLO_FLAG, f.flag);
p.m.write8(SHADOW, 0x0f); p.m.write8(REL_STATE, 0x40); p.m.write8(NOTED, 0);
p.m.write8(shadow, 0x0f); p.m.write8(REL_STATE, 0x40); p.m.write8(NOTED, 0);
for (unsigned half = 0; half < 2; half++)
for (unsigned t = 0; t < 8; t++) {
const uint32_t r = RECORDS + 0x200 * half + 64 * t;
Expand All @@ -115,7 +117,7 @@ int main(int argc, char **argv)
CHECK(r[0] == 0xd0d0d0d0 && r[1] == 0xd1d1d1d1 && r[2] == 0xd2d2d2d2 && r[3] == 0xd3d3d3d3); // hook 1 keeps them
CHECK(r[8] == 0xa0a0a0a0 && r[9] == 0xa1a1a1a1 && r[15] == sp0); // and a0/a1, the stack
out.push_back(r[5]); // the frame word stock builds the levels from
out.push_back(p.m.read8(SHADOW)); out.push_back(p.m.read8(REL_STATE)); out.push_back(p.m.read8(NOTED));
out.push_back(p.m.read8(shadow)); out.push_back(p.m.read8(REL_STATE)); out.push_back(p.m.read8(NOTED));
for (unsigned half = 0; half < 2; half++)
for (unsigned t = 0; t < 8; t++) out.push_back(p.m.read16(RECORDS + 0x200 * half + 64 * t + 6) << 16 | p.m.read16(RECORDS + 0x200 * half + 64 * t + 10));
out.push_back(mm && mm->sym.count("KEYMASK") ? p.m.read8(p.call("fixture_image", {mm->id()}) + mm->sym.at("KEYMASK")) : 0);
Expand All @@ -142,7 +144,7 @@ int main(int argc, char **argv)
for (unsigned k = 0; k < 4; ++k) {
Frame f = layouts[k]; f.gate = gate; f.muted = s[0]; f.soloed = s[1]; f.flag = s[2];
std::vector<uint32_t> plain, key, none, with[2];
{ Probe p(stock, old_code, old_sym, false); CHECK(p.install(mmPlain.b) == 1); plain = frame(p, nullptr, f); }
{ Probe p(stock, old_code, old_sym, false); CHECK(p.install(mmPlain.b) == 1); plain = frame(p, &mmPlain, f); }
{ Probe p(stock, old_code, old_sym, false); CHECK(p.install(mmKey.b) == 1); key = frame(p, &mmKey, f); }
{ Probe p(stock, ev_code, ev_sym, true); CHECK(p.install(mmNew.b) == 1); none = frame(p, &mmNew, f); }
for (unsigned order = 0; order < 2; ++order) {
Expand Down
Loading
Loading