Skip to content

Listen options, animated keys and an input picker in the practice bar - #8

Merged
PaulJoshi merged 5 commits into
mainfrom
claude/listen-options
Oct 3, 2026
Merged

PaulJoshi merged 5 commits into
mainfrom
claude/listen-options

Conversation

@PaulJoshi

@PaulJoshi PaulJoshi commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Requested by Paul · project thread

Before: in Listen mode the piece plays through the app piano and the on-screen keyboard stays still. Sending playback to a MIDI keyboard, and switching between computer keys, MIDI and microphone, were only possible from Settings.

After: when Listen is selected, a small settings button sits left of the song name, above the on-screen keyboard. It opens a menu upwards with one switch per option, so more can be added later. Keyboard speakers (shown only when a MIDI output is connected) plays the piece through the keyboard's own speakers. Animate keys (on by default) presses each on-screen key as its note sounds and lifts it when the note ends. Hand colours (on by default, unavailable while keys are not animated) lights those keys blue for the right hand and purple for the left, matching the falling notes. The menu closes on an outside click or Escape. In every practice mode, the bar with the input meter also has a small icon picker for computer keys, MIDI keyboard or microphone, locked while a take runs; the usual "Connect MIDI keyboard" / "Turn on the microphone" prompt appears below it after switching.

How: the Player emits each note as it schedules it, with its hand and key-down and key-up times (the written length including ties, not the pedalled sound). In listen mode the practice controller turns those into timed presses on a new liveKeys.playing map (token -> hand, or null for the neutral pressed look from #5), which the keyboard shows as down, play-R or play-L. Keys lift slightly early so repeated notes visibly strike again. The speaker switch reuses the existing midiOutPlayback setting, picks the connected output if the remembered one is gone, and the runtime now re-routes playback when MIDI ports change. New settings listenKeyAnimation and listenHandColours. The input picker calls a new runtime.setSource, which stops the mic when leaving it, updates the meter right away and reloads calibration for the new source. Everything follows the design system: square menu panel with a hairline, no shadow, pill tracks with ink for the chosen item, Lucide icons.

Tests: player unit test for key timings; e2e/listen.spec.ts covers the menu (only in listen mode, keys go down and up, hand colours on and off, switching animation off clears keys and disables hand colours, MIDI out receives notes with a mocked output, Escape closes it) and the input picker (switches source and meter, shows the connect prompts, locked while running). Typecheck, unit tests, build and full e2e pass locally.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HvmoDPbUWx35sRniGQQfBT

In listen mode, two pill switches sit left of the song name above the
on-screen keyboard: Keyboard speakers (only when a MIDI output is
connected) sends playback to the keyboard, and Animate keys presses each
on-screen key as its note sounds and lifts it when the note ends.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvmoDPbUWx35sRniGQQfBT
@PaulJoshi PaulJoshi self-assigned this Oct 3, 2026
@vercel

vercel Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
open-keys Ready Ready Preview Oct 3, 2026 9:49am UTC

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvmoDPbUWx35sRniGQQfBT
…ards

A quiet settings button sits left of the song name in listen mode; its
square menu lists one row per option so more can be added later. It
closes on an outside click or Escape.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvmoDPbUWx35sRniGQQfBT
A Hand colours switch (on by default, off when keys are not animated)
lights the keys the app plays blue for the right hand and purple for
the left, matching the falling notes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvmoDPbUWx35sRniGQQfBT
@PaulJoshi
PaulJoshi marked this pull request as ready for review October 3, 2026 09:36
…hone

A small icon picker beside the input meter changes the judged input
without going to Settings; it is locked while a take runs. The meter
shows the new source straight away and calibration reloads for it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvmoDPbUWx35sRniGQQfBT
@PaulJoshi PaulJoshi changed the title Listen mode: keyboard speakers and animated keys Listen options, animated keys and an input picker in the practice bar Oct 3, 2026
@PaulJoshi
PaulJoshi merged commit f0ce2ce into main Oct 3, 2026
4 checks passed

This branch was successfully deployed

1 active deployment
Preview — 89172056 Deployed Oct 3, 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.

2 participants