Skip to content

Revive Loop Machine as the LM-919 - #42

Merged
brsbl merged 4 commits into
mainfrom
bb/revive-and-modernize-the-project-thr_ianjr6jmwn
Oct 4, 2026
Merged

brsbl merged 4 commits into
mainfrom
bb/revive-and-modernize-the-project-thr_ianjr6jmwn

Conversation

@brsbl

@brsbl brsbl commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Human comments

What was wrong

Loop Machine was a JavaScript/Tailwind prototype with dated visuals and thin, clipped synthesized sounds. It also carried leftover Jest, Babel, npm, and dev-toolbar tooling.

What changed

  • The app is now the LM-919: TR-909 identity pieces on a modern panel.
  • Drums now sound like house: an 808 kick with a 909 snap, a driven snare, and a disco open hat.
  • Each drum has DELAY and DECAY knobs; DELAY is a tempo-synced stereo ping-pong echo.
  • The synth is a wide, stereo seven-voice arp that pumps with the kick.
  • A piano keyboard shows held notes with LEDs and adds OCTAVE (−1/0/+1) and CHORD keys.
  • The app opens on one of six house patterns, selectable from PATTERN keys.
  • UNDO and ⌘Z / Ctrl+Z step back one change; a knob drag undoes as one step.
  • Holding the first key fills in a synth rhythm, so the keyboard always makes a sound.
  • Share links (?s=2~…) now encode the whole session, including the new controls.
  • The code is TypeScript on React 19, Vite, Vitest, ESLint, CSS Modules, and pnpm.

How you verified

  • Remote CI passed lint, typecheck, test, and build on b7547b5. Run
  • Slop Cop (security, architecture, code quality, performance, QA) passed; its one P1 is fixed.
  • Links from every earlier app version load their beat; regression tests cover both old formats.
  • A crafted link can no longer write to Object.prototype; a regression test covers it.
  • Chrome 151 (headless) QA passed: open, play, stop, pattern, chord, undo, reload, and an old link.
  • Keyboard focus now shows on the tempo arrows and black piano keys.
P2 follow-ups from the review (not fixed here)
  • Phone screens: the panel scales down to fit, so it is small and hard to use.
  • At SPEED 1/4, the auto-filled synth rhythm and two patterns are silent.
  • Fast knob changes can exceed browser limits on rewriting the address.
  • Each kick and snare hit builds its own distortion stage.
  • Docs mention offline renders and Mixtape, which don't exist yet.
  • Unused 808 samples (11 MB) under public/ still deploy; README lists old knobs.
  • Re-clicking a lit option or Reset on an empty grid adds an undo step.
  • Escape in the tempo field applies the typed value.
  • LED option groups have no arrow-key navigation.
  • Trackpad swipes move knobs one notch per event.
  • Stop lets hits already scheduled in the next 100 ms play.
  • Firefox loses the synth's decay when a note is released early.
  • Choked kicks and hats keep their sources running until their tail ends.
  • A held chord drones if every synth step is cleared.

Screenshots

Before: 8919665 · After: 344a67a (the head b7547b5 only adds link decoding) · Captured at 2× in Chrome for Testing

Screen / state Viewport Before After
Panel / idle Desktop · 1440×900 Before: old panel idle After: LM-919 panel idle
Panel / playing Desktop · 1440×900 Before: old panel playing After: LM-919 panel playing
Panel / idle Mobile · 390×844 Before: old panel on mobile After: LM-919 panel on mobile

BB-Thread-ID: thr_d58s3peww2

🤖 Generated with Claude Code

AGENT GENERATED

Rewrite the app in TypeScript on React 19 and Vite, with pnpm only.

- One session document drives everything: UI dispatches pure commands,
  the store keeps undo history, and the share link (v2) is rewritten on
  every change.
- New Web Audio engine: a worker-ticked clock that keeps time in background
  tabs, synthesized 808 kick, 909 snare, and disco open hat with per-drum
  delay and decay, a stereo unison arp synth, a kick-triggered pump, a
  ping-pong delay, and a glue bus with headroom.
- New LM-919 panel: TR-909 identity pieces (cream LED step keys, chrome
  knobs, red 7-segment tempo, Michroma nameplate) on modern surfaces, a
  piano keyboard with key LEDs, octave and chord selectors, six house
  patterns, and undo.
- Replace Jest, Babel, Tailwind, and the old JSX components with Vitest,
  ESLint, and CSS Modules; CI runs lint, typecheck, test, and build.

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

vercel Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
loop-machine Ready Ready Preview Oct 4, 2026 10:29am UTC

A link naming __proto__ as a drum made decoding write knob values onto
Object.prototype. Only accept ids the session actually has.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Links from the previous app (<steps>_<knobs>_<bpm>) now load their
  beat, volumes, and tempo instead of a blank machine.
- The tempo arrows and black piano keys get a focus ring that shows on
  their dark surfaces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Links from Jul-Dec 2025 used a shorter knob part and opened a blank
machine. Like the previous app, load the steps from any
<steps>_<knobs>[_<bpm>] link, and read volumes only from the layout
that carries them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brsbl
brsbl marked this pull request as ready for review October 4, 2026 10:59
@brsbl
brsbl merged commit 7e12648 into main Oct 4, 2026
3 checks passed
@brsbl
brsbl deleted the bb/revive-and-modernize-the-project-thr_ianjr6jmwn branch October 4, 2026 11:01
@brsbl brsbl mentioned this pull request Oct 4, 2026

This branch was successfully deployed

1 active deployment
Preview — b7547b5e Deployed Oct 4, 2026 by vercel[bot]
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