Skip to content

Track Solo 0.2.4-experimental: hold a track to solo it while editing - #1383

Merged
repeat98 merged 25 commits into
repeat98:mainfrom
twwwy:twwwy/track-solo-pr
Nov 10, 2026
Merged

repeat98 merged 25 commits into
repeat98:mainfrom
twwwy:twwwy/track-solo-pr

Conversation

@twwwy

@twwwy twwwy commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Track Solo 0.2.4-experimental, first release. A new Octatrack system module by @twwwy.

What it does: a temporary solo for auditioning tracks while you edit. Hold one TRACK button for half a second to solo it, tap other tracks to add or remove them, and release to go back to your normal mutes and solos. It is OFF by default (PROJECT > CONTROL > SEQUENCER > TRACK SOLO), never saved, and does not write to the project. USB only: it needs the Modwerk base, so card firmware cannot include it.

Waiting on the owner

Evidence

Hardware on the current beta base, 10 November 2026, reported by the author at the panel and read back from the device after each step. Package 50f64eb6… (source 4faa4023), OS 1.40C, MKII per this unit's earlier records, disposable project.

Step Reported Read back
Base update on modwerk.app Came back by itself Base 72defb09…, two slots confirmed, empty
Try 90 s, then Undo Row there, HOLD, hold solos T2 Empty, set unchanged
Try and Keep, about a minute of playing Solo, join and leave, audio, lamps, release, second anchor: all worked Track Solo installed
Power cycle Booted normally, row back at OFF Track Solo still installed
Play Modes 0.1.1 beside it, 300 s First gesture wins (see below) Back to Track Solo only
Remove — Empty, set as at the start

Earlier, on 6 November, 0.2.2 and 0.2.3 ran on base 462fbd2b: row, hold, join and leave, audio, lamps and editing all worked.

Not tested on hardware: other modules beside it apart from Play Modes, all eight anchors, external MIDI, arranger rows, Pickup recording, the K09 modifier orderings, self-test, MKI.

Emulator, on 0.2.4 (labelled as emulator): ux_test.py 18 checks passed; ux_test.py --audio passed, including a real MIDI mute surviving the frame override and removal restoring all seven sites; panel_test.py --menu produced the screenshots, then stopped at an assertion written for the old long hold (0.2.2 and 0.2.3 stop at the same line).

Measured worst event (emulator): cycle_count.py watches every halfword of the module image, so only the module's own executed instructions count. Dearest tick 653 instructions, frame enter 12 and leave 12 (the new check added 3), key 149. Worst event 677 instructions, about 1,687 of 9,577 cycles. Static bound 2,622.

Packages: rebuilt from this branch, Track Solo and all 32 USB packages are identical; Track Solo is out of the card build. Analog BD's 212 proofs re-exported natively: identical. Cross-compatibility: 36 modules, no problems.

Changes since your review

  1. USB-only: usbOnly: true on its package row, out of REQUESTED and the source test lists, and said in the README and manifest.
  2. Run on the beta testers' base: the table above.
  3. TRACK held with Play Modes: they do not clash; the first gesture wins. UP or DOWN within half a second of holding TRACK changes the Play Modes mode and Track Solo does not arm; a longer hold starts Track Solo, and UP or DOWN no longer reach Play Modes until TRACK is released. Said in the README, so no conflict is declared.
  4. Smaller points: TESTING.md's cancel cases now say PART, PATTERN, BANK, RECORD and STOP cancelled only the 31 October prototype, and only PROJECT and MIDI cancel since 0.2.0. manifest.py says HARDWARE. gate.s restores the snapshot at frame end only when the live word is still the one Track Solo wrote, and keeps a word stock wrote during the frame.

That changed the package, so this is now 0.2.4: every test above is on its exact package.

Why 0.2.3 moved a detour

Tuner patches the instruction before USB Audio's producer at 0x4000d99a, where 0.2.2 also restored the mute word, and modules:compat refuses that overlap for USB sets. ts_frame_leave moved three instructions earlier, to the frame counter read at 0x4000d98e: six bytes, no branch lands in it, nothing else claims it.

Checks

CI on this branch, with main and #1392 merged in: every check is green, including module-contract (the doctor test passes with the approval record) and octatrack-source. The module's native source SHA-256 is unchanged at f37562d5…, so the approval record matches as it is.

What the guides lacked

  • The doctor and two tests had not caught up with usbOnly: fixed in Fix: the doctor and tests treat usbOnly packages as having no card form #1387.
  • scripts/build-modules-isolated.sh fails on Docker Desktop for Mac with git's "dubious ownership" error. I built with a local copy that sets safe.directory; it needs its own Fix: pull request, not sent yet.
  • A trial needs USB traffic at least every 10 s. docs/OCTATRACK_DRIVING.md already says the base rolls back after 10 s of quiet; the module's HARDWARE_TRIAL.md now spells out the consequence for silent clients.

🤖 Generated with Claude Code

twwwy and others added 16 commits November 6, 2026 22:47
Move the frame-leave detour from 0x4000d99a, which Tuner patches, to
0x4000d98e so both modules install together over USB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Import the rebuilt packages, re-pin the standalone recipes, and record the
6 November functional hardware report, static cycle bound and memory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y on the rebuilt packages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Count only the module's own executed instructions with PC watches on its
image, as the owner asked on the agent board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y on the merged main

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ix, repeat98#1311)

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

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

Copy link
Copy Markdown
Owner

Thanks for Track Solo, and for the emulator count. The key handling reads cleanly: nothing is taken while it's OFF, FUNC and CUE with TRACK go to stock, and a release another module takes still ends the solo on the next tick. I'll add the approval record for the waived benchmark and stress rows once the points below are in, since it pins the source hash.

Three things before I can merge:

  1. Make it USB-only. Everything Track Solo does comes through the base (module_key, module_tick, module_enc and the ot_sequencer_rows row), so a card build would install its detours with no setting and nothing driving them. Please set usbOnly: true on its row in octatrack-module-packages.json (see "USB-only distribution" in docs/OCTATRACK_RECONSTRUCTION.md), take track-solo out of REQUESTED in scripts/build-module-packages.py and the test lists that follow it, as Tiempos and Beat Slicer do, and say so in the README.
  2. One short run on the beta base testers have. Both trials are on 462fbd2b; main's beta base is now 72defb09. Please update your unit from the site and go through the USB steps with the exact package in this PR: try, then Undo; try, Keep, play a minute; power cycle; remove. A few minutes is enough, recorded in TESTING.md with the base's identity. If the base update or an Undo doesn't come back cleanly, stop there and write down what happened. That's a result too.
  3. TRACK held with Play Modes. Play Modes uses TRACK held + UP/DOWN. If the track is held half a second before the first UP, Track Solo starts and passes a release to stock, and I suspect Play Modes then sees TRACK as released and UP/DOWN goes to stock. Could you try it with both installed? If it does clash, a line in the README is fine if the fix is just "press UP sooner", otherwise declare the conflict in compatibility.conflicts.

Smaller things, whenever you're in there:

  • TESTING.md (around the cancel cases) says PART, PATTERN, BANK, RECORD and STOP end the solo, but the code and README say they don't. Please make them agree.
  • manifest.py still says untested with no hardware qualification.
  • At the end of the frame, gate.s puts the saved mute word back without checking whether stock changed it during the frame (an arranger row, say). Keeping the current word when it no longer matches what you set would be cheap insurance.

For your information: #931 (Track Mutes) also takes TRACK presses. Whichever of the two merges second will need a declared conflict or an agreed gesture, so no change is needed here for now.

twwwy and others added 4 commits November 10, 2026 17:16
Set usbOnly on its package, take it out of the card build's REQUESTED list
and the source test lists, and say so in the README and manifest, as the
owner asked on repeat98#1383.

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

At frame end, restore the snapshot only when the live word is still the one
Track Solo wrote, as the owner suggested on repeat98#1383. Correct TESTING.md's
prototype cancel cases and the manifest's proof level.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…09, beside Play Modes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@twwwy twwwy changed the title Track Solo 0.2.3-experimental: hold a track to solo it while editing Track Solo 0.2.4-experimental: hold a track to solo it while editing Nov 10, 2026
@twwwy

twwwy commented Nov 10, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review. All three points and the smaller ones are in, and the package changed, so this is now 0.2.4.

  1. USB-only: done as you described. Track Solo is the first package marked usbOnly, and that exposed that module:doctor, usb-only.test.ts and module-release-scope.test.mjs still used the older rule (only C sources make a package USB-only), while the card build already used sources or usbOnly. Fixed separately in Fix: the doctor and tests treat usbOnly packages as having no card form #1387; this PR needs it.
  2. Beta base run: I updated the unit to 72defb09 from the site; it came back by itself. Then, with this exact package (50f64eb6…): try and Undo, try and Keep with about a minute of playing, power cycle, removal. Everything worked and every step read back clean from the device. Details are in TESTING.md and the PR description.
  3. TRACK held with Play Modes: tried with both installed. They don't clash; the first gesture wins. UP or DOWN within half a second changes the Play Modes mode and Track Solo doesn't arm; holding TRACK longer starts Track Solo, and UP or DOWN then don't reach Play Modes. It's a README line, so I didn't declare a conflict.

Smaller points: the TESTING.md cancel cases now say they were the 31 October prototype; manifest.py says HARDWARE; and gate.s now keeps a mute word stock wrote during the frame instead of restoring over it. That added 3 instructions to the frame leave; the emulator count is now 677 instructions at the worst event, about 1,687 cycles.

For the approval record: native source SHA-256 f37562d53f0f901e09cca4d42d1a73730dfc92caa2563298dc960f45eb37f2cc, version 0.2.4-experimental.

repeat98 added a commit that referenced this pull request Nov 10, 2026
…d stress rows (#1392)

The owner's record for #1383: no MIDI path, so no cfmeter benchmark or flood;
cycles counted in the Octatrack emulator. It binds native source f37562d5…,
recomputed on the pull request's head 7a6ed03.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@repeat98

Copy link
Copy Markdown
Owner

Thanks, that's everything, and the run on the beta base is just what I asked for. The Play Modes line in the README is fine.

#1387 is merged now, so please merge main into this branch: the three red tests (doctor, release scope, USB-only) should pass with it. The approval record for 0.2.4-experimental is on main too (#1392): it waives the stock benchmark and stress rows only, as we agreed, and covers source f37562d5…. If the merge changes the module folder, the hash moves, so tell me and I'll update it. Once the checks are green I'll merge.

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

twwwy commented Nov 10, 2026

Copy link
Copy Markdown
Contributor Author

Thanks! Main is merged in, with #1387 and your approval record #1392. The module folder didn't change, so the source hash is still f37562d5… and the record matches as it is. Every check is green now, including the doctor test, so it's ready to merge whenever you are.

@repeat98
repeat98 merged commit 83ca022 into repeat98:main Nov 10, 2026
13 checks passed
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