Skip to content

EZ: the red button stops eating the beat, and pads stop rewriting the kit - #1

Merged
mcinnisdev merged 3 commits into
mainfrom
worktree-ez-mode-bugs
Sep 14, 2026
Merged

mcinnisdev merged 3 commits into
mainfrom
worktree-ez-mode-bugs

Conversation

@mcinnisdev

Copy link
Copy Markdown
Owner

EZ mode had two destructive actions with no guard on either. Both are reproduced and then held down by tests in e2e/ez-record-and-chop.spec.ts.

The red button erased the pattern

EZ's Rec was wired to the machine's REC mode, which replaces the track under the playhead as it passes. Measured on the demo beat, without a pad being touched:

t=0   28 notes
t=1s  21 notes
t=3s  11 notes
t=5s   0 notes

Because REC becomes OVERDUB at the loop point and EZ has no punch-out, the machine then kept recording every later tap — which is what "it records even when record is not turned on" looks like from the outside. Nothing on screen said so either: Play reads its lamp from s.playing && s.record === 'OFF', so it went dark the moment recording started.

  • EZ records with OVERDUB, layering onto the pattern instead of replacing it. recordFromStart takes the mode, so OG's REC key is unchanged.
  • New punchOut() stops writing notes and leaves the transport rolling, so Rec is a real toggle rather than a disguised Stop.
  • Play's lamp follows s.playing.

A pad tap rewrote the kit

In the Chop panel every pad tap silently reassigned the selected chop, so the pads could not be played at all.

  • Placing is armed explicitly with Put on pads, disarms on leaving the panel, and walks to the next chop after each placement so pads fill left to right.
  • Opening a sound no longer rewrites its zones: the eight suggested chops come from zoneStarts() and only become real on the first edit. Clicking KICK in the chopper used to chop KICK.
  • All to pads keeps the chopper on the break instead of selecting the last slice, which the old auto-chop then sliced again.
  • Placing a chop reuses the slice already cut rather than pushing another copy into memory on every tap.
  • Tapping a waveform region auditions it.

Scope

assignChopToPad, chopToPads and recordFromStart are called from EZ and its tests only, so OG is untouched.

Testing

  • npm run typecheck clean, npm test 185/185.
  • Playwright 28/29. The one failure, account.spec.ts asserting an og:title meta tag, fails identically on clean origin/main and is unrelated.

🤖 Generated with Claude Code

https://claude.ai/code/session_019U7kCMZc9a7sezDwKKseJy

Nick McInnis and others added 2 commits September 14, 2026 10:50
… kit

EZ mode's Rec was wired to the machine's REC mode, which replaces the track
under the playhead as it passes. Pressing it emptied a two-bar pattern in
about five seconds without a pad being touched, and because REC turns into
OVERDUB at the loop point and EZ has no punch-out, the machine then recorded
every later tap. There was no sign of any of it on screen: the Play button
reads its lamp from `s.playing && s.record === 'OFF'`, so it went dark the
moment recording started.

- EZ records with OVERDUB, which layers onto the pattern instead of wiping it.
  `recordFromStart` takes the mode, so OG's REC key is unchanged.
- `punchOut()` stops writing notes and leaves the transport rolling; EZ's Rec
  button is now a real toggle rather than a disguised Stop.
- Play's lamp follows `s.playing`, so a rolling machine looks like one.

In the Chop panel every pad tap silently reassigned the selected chop, so the
pads could not be played at all and the kit changed under you. Placing is now
armed explicitly with "Put on pads", disarms on leaving the panel, and walks to
the next chop after each placement so pads fill left to right.

- Opening a sound no longer rewrites its zones: the eight suggested chops are
  drawn from `zoneStarts()` and only become real on the first edit. Clicking
  KICK in the chopper used to chop KICK.
- "All to pads" keeps the chopper on the break instead of selecting the last
  slice, which the old auto-chop then sliced again.
- Placing a chop reuses the slice we already cut rather than pushing another
  copy into memory on every tap.
- Tapping a waveform region auditions it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019U7kCMZc9a7sezDwKKseJy
The EZ table still described the red button as REC + PLAY START and a pad tap
as the way to place a chop, which is what made both of them destructive. Record
the rule the panel works to now, so the next EZ workflow does not reintroduce
it: a destructive action is either armed first, or it is not destructive.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019U7kCMZc9a7sezDwKKseJy
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Deploying chopdeck with  Cloudflare Pages  Cloudflare Pages

Latest commit: dbe019b
Status: ✅  Deploy successful!
Preview URL: https://901e26a6.chopdeck.pages.dev
Branch Preview URL: https://worktree-ez-mode-bugs.chopdeck.pages.dev

View logs

Grabbing a marker selects it and the click that follows selects it again, so
auditioning played the slice twice over itself. Cut the last voice first.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019U7kCMZc9a7sezDwKKseJy
@mcinnisdev
mcinnisdev marked this pull request as ready for review September 14, 2026 15:41
@mcinnisdev
mcinnisdev merged commit fff4a85 into main Sep 14, 2026
3 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.

1 participant