Playground polish: KeyboardContainer, piano voice, unified controls
Created by: jedmund
Summary
- Fix piano voice: continuous decay envelope (was jumping from 5% to 40%), soft attack ramp, sustain-on-hold with release phase
- Add KeyboardContainer component with two size classes (contained/docked) and overlay system for step arcs and degree labels
- Unify all 8 keyboard playground tools into a single KeyboardContainer driven by the configurator panel
- Replace mode picker (Exercise/Free Play) with size class toggle, octave controls, and overlay toggles
- Delete FreePlayKeyboardView, replaced by KeyboardContainer
Includes all prior work from jedmund/module-2-integration: sound design tools, module 2 content, tool playground, and reactive parameter controls.
Test plan
-
Open any keyboard tool in the playground -
Switch between Contained and Docked size classes -
In Contained: toggle 1-2 octaves, verify keys stay the same size and height -
Toggle step arcs on, adjust arc count 1-7 -
In Docked: verify keyboard anchors to bottom, keys have natural proportions -
Play notes: verify smooth attack, sustain while held, fade on release -
Verify sound design tools (Waveform Generator, etc.) still work independently -
Check lesson keyboards are unaffected (SharedKeyboardView, exercise views)