Skip to content

Module/track mutes (MPC style) - #931

Open
jonathanwardle1992-beep wants to merge 15 commits into
repeat98:mainfrom
jonathanwardle1992-beep:module/track-mutes
Open

jonathanwardle1992-beep wants to merge 15 commits into
repeat98:mainfrom
jonathanwardle1992-beep:module/track-mutes

Conversation

@jonathanwardle1992-beep

@jonathanwardle1992-beep jonathanwardle1992-beep commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

TRACK MUTES 0.1.33 adds a PERSONALIZE checkbox. Empty is stock (T selects, FUNC+T mutes). Ticked, T1-T8 mute and unmute, including several at once, and FUNC+T selects that track.

Review follow-up on this branch:

  • FUNC+T saves d2 on entry and restores it before returning, matching the stock handler.
  • FUNC+REC1/2 on the MIDI page opens recorder buffers only while the box is ticked.
  • The checkbox is stored in the module, not in Mute Modes' battery word 0x800000dc. It returns to empty after power-off until a base settings store exists. The ANDY length pokes are gone.
  • The shared edit to scripts/module-compat.py is removed.
  • Current main is merged.

PERSONALIZE table growth is unchanged on purpose. ot_personalize_rows (#1023) is still open, and this module will contribute its row there instead of growing stock's tables.

How I checked it

npm run modules:generate validated the module folders. npm run module:doctor -- track-mutes is not green: there is no USB package, no evidence/performance.json, no native comparison, and modules:compat still reports the PERSONALIZE table clashes with Mute Modes (and the TRACK key clashes with Play Modes). Those table clashes stay until #1023. This machine has no ColdFire assembler, so the committed package object was not reassembled and npm run module:verify was not run.

0.1.33 has not been flashed. The 0.1.32 card's AED follow and the LCD photos are reported for that card only.

Guides

Nothing in the guides was wrong for this pass. The USB package and the PERSONALIZE row both wait on the base table in #1023.

  • Changing a module someone else wrote: its author said yes before I started, and I link it here.
  • I read the guide for its category in docs/module-guides/ (and sequencing.md if it acts in time), and TESTING.md lists what I did not test.
  • Source and media are mine or properly licensed, with authors and full licence texts kept. Nothing comes from Elektron firmware.
  • Screenshots are real captures of the current module UI. Hardware results are what a named person saw on this exact build; emulator results are labelled as emulator results. The photos are the 0.1.32 card. 0.1.33 has not been photographed or flashed.
  • Automatically merge and publish my module update after checks pass.
  • I verified the source, licences, UI and qualification reports, including instance isolation and Part/project/reboot persistence where applicable; no required acceptance check is failed or untested.
  • I checked the cycle and memory reports against the worst case, the attributed hardware evidence against the submitted source and build, and the screenshots, tutorial and access steps against the current UI.

Related to #931.

…inning.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ath.

0.1.9 hooks the 0x460d1aec==0 PLAY branch this unit uses (seqpause 0x4006188a, start 0x40061892). Same-unit card PS 0.1.9: with X, every PLAY starts from 1.

Co-authored-by: Cursor <cursoragent@cursor.com>
Module/play start

play start option in PERSONALIZE enabling PLAY button to globally play from 1 upon every actuation (instead of pausing and unpausing from where you paused) 

MPC style transport control for greater immediacy in performance focused address.
Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown

This update needs owner review instead of automatic publication: This GitHub account is not a registered module author.

SYSTEM STATUS shows TM 0.1.32; PERSONALIZE empty and ticked. AED follow remains unverified. Firmware stays off git.
Drop the mixed PLAY START tree, pin the native source fingerprint, use a POSIX modules/ gate path, and fill the README Usage section so module-contract and Windows path checks can pass.

Co-authored-by: Cursor <cursoragent@cursor.com>
Native source fingerprint now matches the folder, Gate() uses modules/track-mutes/verify.py, and Usage is populated so the tutorial heading is not treated as empty.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ing.

src/community/module-changelogs is checked against catalog-listed modules only, so an unlisted first release fails module-contract as Unknown changelog module.

Co-authored-by: Cursor <cursoragent@cursor.com>
…tes.

Record reported 0.1.32 AED follow on the card (not verified). Skip byte clashes the configurator already refuses so PERSONALIZE growers can list.

Co-authored-by: Cursor <cursoragent@cursor.com>

@repeat98 repeat98 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for Track Mutes. Swapping T and FUNC+T is a good idea, and the TESTING.md log is really thorough. Some things need to change before it can go in:

  1. Please drop the edit to scripts/module-compat.py. That gate is shared by every module, so changes to it go in their own pull request. It also doesn't turn CI green: sdk/tests/test_module_compat.py calls check() directly and still finds all 23 clashes.
  2. The clashes. Track Mutes relocates the same PERSONALIZE arrays, row count and ANDY restore sites as Mute Modes, and stores its setting in the same word (0x800000dc). It also detours the TRACK key (0x40040250) and the trig keys (0x40060cfc), which Play Modes already patches. As it stands it can never be installed next to either of them. I'd like these to be base-owned instead (a PERSONALIZE row table, and events for the TRACK and trig keys) so all three can be installed together. I'll come back here once I've decided how.
  3. USB. A new Octatrack module needs the USB lifecycle (ADD_A_MODULE.md): a runtime package, install, self-test, Keep/Undo, removal and reboot, all tested on the unit. A runtime package can't carry TableGrow, so the PERSONALIZE growth needs the in-unit table form that section describes. Until that's done, please keep the module under sdk/drafts/track-mutes/ with its notes in a CHANGELOG.json (see "The fast loop" in the same guide).
  4. The other red checks:
    • presentation/thumbnail.svg line 2 has a control byte (0x14) where the dash should be. The renderer can't parse the file, so the preview JPEG comes out blank. A plain hyphen fixes it.
    • resources.impact.dsp.rationale ("No DSP code.", octamod.module.json:106) needs more than 20 characters.
    • evidence/performance.json (npm run perf:audit) and the native comparison (npm run module:verify -- track-mutes --os <your 1.40C file>).
  5. tm_rec_midi (trackmutes.s:276) makes FUNC+REC1/2 open on the MIDI page even when the box is empty, so installing the module changes stock behaviour. Please gate it on LIVE like the other hooks, or leave it out, since it isn't about mutes.
  6. tm_func_track (trackmutes.s:208, :216) writes d2 before saving it on a second FUNC+press of the same key, and returns with it changed. The stock handler saves d2, so its caller expects to get it back. Please save d2 on entry.
  7. Release notes. Players never had 0.1.0 to 0.1.31, so src/community/module-changelogs/track-mutes.json should have a single entry for the version you ship, saying what it does for them. The test history is already in TESTING.md.
  8. module-build.json has file sizes and hashes from a CRLF checkout: it lists resident-dsp.json at 25630 bytes, but the committed file is 25257. Re-importing from an LF checkout fixes it.
  9. Play Start (#947) also grows PERSONALIZE and edits the same lists, so whichever goes in second has to name the other in conflicts and rebuild the packages. Until you have a published module I review one pull request of yours at a time, and this one is first.

One more thing: the automatic-publication and reviewer boxes in the template are for registered authors and for me. Please leave them unticked on a first release.

@repeat98

Copy link
Copy Markdown
Owner

Hi, thanks for these, and for trying them on your unit. Before I go through the code, a few things that affect both Track Mutes and Play Start.

  1. Every new Octatrack module now ships its USB package with the card build: install, self-test, Keep/Undo and removal over USB (docs/ADD_A_MODULE.md, "Octatrack base and USB lifecycle"). Neither has one yet.
  2. Mute Modes, Play Start and Track Mutes each grow the same PERSONALIZE tables and use the same battery word, so no two of them can be in one build. That's why Module/play start (PERSONALIZE PLAY START) #947 is red, and Track Mutes and Play Start would clash with each other too. I'd rather make PERSONALIZE rows a base table that modules add their rows to, so all three can go in one build. I'll open that as its own base PR. Please hold both until then.
  3. Track Mutes hooks the TRACK key in the same two places as Play Modes, which is devilfish707's module, so the two can't be in one build either.
  4. The red checks here: run npm run module:verify -- track-mutes (the native comparison is missing), and one CPU/DSP/memory description is too short (it needs more than 20 characters). npm run pr:ready shows both.
  5. Until your first module is published, one module PR is reviewed at a time, so Play Start waits behind this one.

Small things: please keep the description to what changes and how you tested it, and untick the automatic-publication boxes; they're for registered authors' updates.

@repeat98

Copy link
Copy Markdown
Owner

Hi, a quick update on the PERSONALIZE clash, since it changes what you need to do. The base is getting a PERSONALIZE rows table (ot_personalize_rows, #1023). Once it's in, Track Mutes and Play Start each contribute their row in runtime.json instead of growing stock's three tables, so they can sit in one build with Mute Modes, and the base patches those sites, not the modules. Please hold off on the PERSONALIZE part until #1023 merges; I'll ping you here when it does.

The other points from my review still stand: the USB package with the card build (install, self-test, Keep/Undo, removal), dropping the scripts/module-compat.py edit, the battery word Mute Modes also uses, and the two asm fixes. And please merge current main before your next push; the branch is about 220 commits behind.

Drop the shared compatibility filter, save d2 on the FUNC+T path, gate FUNC+REC on the checkbox, and keep the setting out of Mute Modes' battery word. PERSONALIZE table growth waits for repeat98#1023.

Co-authored-by: Cursor <cursoragent@cursor.com>
Current main is 5f28c9a. Keep the packages already on this branch; they were not rebuilt. PERSONALIZE growth still waits on repeat98#1023.

Co-authored-by: jonathanwardle1992-beep <jonathanwardle1992-beep@users.noreply.github.com>
@repeat98

repeat98 commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Hi, thanks for keeping this up to date. Here's an update on the two things I said I'd come back to.

PERSONALIZE. #1023 is still open. It goes in right after Mute Modes 0.2.2 (#1007), and I'll ping you here when it does. After that, Track Mutes contributes its row in runtime.json and stops growing the three tables and the row count.

The TRACK key and the trig keys. Track Mutes and Play Modes both detour 0x40040250 and 0x40060cfc. The compatibility gate refuses two modules on the same stock bytes even when each names the other in conflicts, so those are the last 2 of the 20 problems in modules:compat. They need to become base hooks that both modules subscribe to. If you're up for it, please open that as its own pull request, as "Propose a hook" in docs/module-guides/README.md describes: one events.json entry for the TRACK key and one for the trig keys, plus a pending-migration entry for Play Modes in compatibility.json. I'll review it and ask Play Modes' author about moving over.

Until both are in, module-contract and module-paths-windows stay red whatever you push, so you don't need to keep merging main.

octatrack-source is a separate problem. CI compiles the packages again and needs the committed ones to match, and these weren't reassembled. You can build them on Windows with Docker: docker build --file sdk/build/Dockerfile --tag modwerk-source-tools ., then bash scripts/build-modules-isolated.sh and npm run modules:import as in ADD_A_MODULE.md, step 4. It's worth doing once the PERSONALIZE row and the hooks have settled, since both change the package.

@repeat98

Copy link
Copy Markdown
Owner

Hi, an update that changes what Track Mutes and Play Start (#947) need, in your favour.

The card builder is retired. Since today (#1451, #1453) an Octatrack module ships only as a package for the Modwerk base, over USB. So for both modules you can forget the native comparison (module:verify), the card packages and the card pair table: none of them exist any more. The USB package is the module, and npm run module:doctor -- <id> now lists only what that needs.

Still waiting on me: the PERSONALIZE rows table (#1023) isn't in yet. It goes in with the next base, and I'll ping you here when it does. The TRACK key and trig key hooks from my 4 November comment are still open too. Until both are there, please leave these two as they are; there's no need to merge main meanwhile.

Threshold Slices (#1285) stays first. It has two open points from 9 November: take the LEVEL and D gestures out, and replace the Windows path in TESTING.md with the package's SHA-256. Screen Off (#1341) has its two small ones as well. Those you can do now.

This branch has not been deployed

No deployments
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.

3 participants