mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-07-24 05:41:53 +00:00
|
Some checks are pending
ship-ci / ci (push) Waiting to run
* feat(keys_highway_3d): add note-colour palettes and selectable camera angles
Give the 3D keys highway player-facing view options and a tuned default
look, so the piano highway is readable out of the box and customisable
from the settings panel without touching code.
Note colours (settings -> Note colours, `keys3d_bg_palette`):
- Octaves (new default): each octave its own hue climbing the rainbow,
darker sharps, so pitch height reads at a glance on any note range.
- Rainbow: the original per-pitch table (colours unchanged).
- Vivid / Pastel: per-pitch variants.
- Emerald / Ice: single-hue two-tone (uniform naturals, darker sharps).
The pick drives the notes, key glow, lane guides and hit flames, live.
Camera (settings -> Camera angle, `keys3d_bg_camera`):
- Classic (the original low rig) / Elevated / Overhead (new default).
- Height, distance and tilt fine-tune sliders nudge the base vantage the
auto-pan/zoom follow-motion orbits; presets apply live.
The new defaults are opinionated for plug-and-play (octaves palette,
overhead camera, tilt -0.6); anyone who prefers the original look can
pick Rainbow + Classic. Settings changes are re-read on init() so they
apply on return from the settings screen, not only after a relaunch.
Scoring, hit-timing and MIDI handling are untouched -- these are purely
visual. Numeric FX keys clamp to declared ranges (FX_RANGES); the pure
colour/camera helpers are covered by unit tests (node --test).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: LegionaryLeader <legionaryleader@gmail.com>
* fix(keys_highway_3d): make Classic camera reproduce the original rig + drop per-frame camera alloc
Review follow-ups on the palettes/camera feature:
- "Classic" preset now reproduces the historical rig exactly. The tuned
plug-and-play downward aim (camTilt -0.6 x CAM_TILT_UNITS = -33) is baked
into CAM_PRESETS.overhead.lookY, and camTilt now defaults to 0 (neutral).
The default overhead look is byte-identical (effective lookY still -33),
but "pick Classic for the original look" is now actually true instead of
leaving a -33 down-tilt applied. settings.html tilt slider defaults to 0.
- _rig() writes into a hoisted reusable object instead of allocating a fresh
{y,z,lookY,lookZ} literal every frame, honoring the module's documented
"no per-frame allocations in draw()" discipline. Callers read it
synchronously and never retain it, so one shared instance is safe.
Tests updated for the neutral camTilt default; adds an invariant test that
the default overhead framing is unchanged and Classic + neutral tilt == the
historical LOOK_Y. Full JS suite green (1069 pass).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Signed-off-by: LegionaryLeader <legionaryleader@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: byrongamatos <xasiklas@gmail.com>
|
||
|---|---|---|
| .. | ||
| assets | ||
| tests | ||
| LICENSE | ||
| plugin.json | ||
| README.md | ||
| screen.js | ||
| settings.html | ||
Keys Highway 3D
RS+-style falling-note 3D piano highway for Slopsmith, fed by the Sloppak Notation Format (sloppak-spec §5.3) — part of the piano/keys first-class epic (slopsmith#828, plugin workstream slopsmith#824).
- Consumes the
notation_info/notation_measureshighway-WS stream over a private per-instance socket and flattens measure → staff → voice → beat → note into{midi, t, durSec, hand}(durations derived from writtendur/dot/tuat the running tempo; ties extend; overlap-clamped). - 3D perspective highway to a vanishing point with a real white/black-key keyboard; per-key pitch-class colours (Synthesia convention — C red, D yellow, E blue, …) with hand (rh/lh) as a secondary brightness cue. Selectable note-colour palettes (settings → Note colours,
keys3d_bg_palette, default the per-octave scheme): a per-octave rainbow (each octave its own hue, darker sharps), the original per-pitch "Rainbow" table, vivid/pastel per-pitch variants, and single-hue two-tone palettes (uniform naturals, darker sharps) for players who want "black key coming" to read at a glance; notes, key glow, lane guides and hit flames all follow the pick live. - Full RS+ visual treatment: key letter glyphs printed on the active-range key tops (cached CanvasTextures), bevelled gem-style note blocks (ExtrudeGeometry, geometry/material caches keyed by size and pitch-class×hand), floating bar numbers scrolling with the notes, active-range lane dimming so the playable span pops, and a glowing pulsing hit-line (layered additive gradient planes — no postprocessing).
- Performance discipline: no per-frame allocations or DOM queries in
draw(). Chart-scoped resources — note geometries/materials, bar-number and glow textures — are cached and disposed on chart teardown; the key-letter glyphCanvasTextures live in a shared module-level cache that survives teardown and is reused across instances. - Auto-selected for arrangements with notation via
matchesArrangement(songInfo.has_notation); capability-nativevisualizationprovider declaration. - Camera settings: camera-rig presets (
keys3d_bg_camera— classic low rig / elevated / overhead; default overhead, applied live, adaptive pan-zoom preserved) with base-rig fine-tune sliders for height, distance and tilt (keys3d_bg_camHeight/camDist/camTilt) that nudge the vantage point the follow-motion orbits. Numeric FX keys clamp to per-key declared ranges (FX_RANGES, default 0–1). - Web MIDI input scoring: module-level MIDI singleton (one access per tab, focused-instance routing) with device auto-connect by saved id+name, loopback blocklist, channel filter, transpose and CC64 sustain (
keys3d_localStorage prefix;window.keysH3d*settings API). Hit detection matches played MIDI against the flattened chart notes within ±0.10 s with per-note dedupe and a missed-note sweep (only while a device is connected — never retroactive across a mid-song connect). - Live hit feedback on the MIDI path (not the chart): key depress (~4° back-edge pivot, ~120 ms spring; the key letter rides along), wrong-note red key flash, and a vertical flame flare on hits (pooled additive sprites, white-hot base fading into the pitch-class colour, ~400 ms).
- End-of-run stats: POSTs
/api/stats{filename, arrangement, score, accuracy}exactly once per run with the same formula as the guitar notedetect path (accuracy = hits / max(1, hits+misses),score = round(hits·100·accuracy)), then notifies the progression core when present. - Capability wiring (all guarded for servers without the hosts): registers as a note-detection
midiprovider (keys-midi,verify.target), opens a per-song binding scoped to the chart's keys range, reports hit/miss observability events, and exposes Web MIDI inputs to the audio-input domain with pseudonymized labels (midi-input-1, …) viasource.enumerate/describe/open/close. - Headless test hook:
window.__keysHwTest = { injectNoteOn(midi, when), getScore() }.
Tests
node --test tests/*.test.js
Ported helpers (keep in sync with highway_3d)
Visual-parity code copied from plugins/highway_3d/screen.js — same
function names, signatures, and constants on purpose, marked with
PORTED FROM highway_3d comments at each site. If the guitar highway
tunes one of these, mirror the change here (and in drum_highway_3d):
_bloomEnsure()/_bloomDispose()— EffectComposer + UnrealBloomPass (0.65/0.5/0.82) on a multisampled HalfFloat target, ACES↔None tone- mapping switch indraw(); addons dynamic-imported from/static/vendor/three/addons/(no CDN fallback — direct render is the graceful degrade)_sparkBurst()/_sparkUpdate()— pooled additive Points hit sparks (pool 96 here — the flame sprites carry most of the hit feedback)_timingHex()/_classifyTiming()— early/late/on-time feedback colors (green/cyan/amber) + the 40%-window classifier_ssActive()— host splitscreen probe (minus the guitar's focus-API checks, which it needs for input routing and we don't)BG_THEMES/_bgThemeColors()— the scene theme table (same ids/values as the guitar's, exceptdefaultwhich is this plugin's original palette); one pick drives background gradient + floor + lane rails_makeStudioEnv()— procedural PMREM studio environment (shared with drum_highway_3d; RoomEnvironment isn't vendored)_applyCinematic()— ambient/key rebalance (values tuned per plugin)BG_STYLES(off/particles/lights/geometric) +_bgGetAnalyser()/_bgReadBands()— background ambience + the stems-first audio-analyser bridge (shared with drum_highway_3d)_drawScoreFx()— score overlay (pops / tier rings / milestone bursts / streak-break wash), drum_highway_3d pattern
License
AGPL-3.0.