feedBack/static
Byron Gamatos 3fc077cbc1
feat(highway): render chord harmony fn.rn + voicing on 2D + 3D (§6.3.1, §6.6) (#541)
* feat(core): carry chord harmony fn + template voicing on the wire (§6.3.1, §6.6)

Add two OPTIONAL per-chord harmony annotations (feedpak 1.7.0), mirroring the
teaching-marks (fg/ch/sd) wire work:

- Chord.fn (instance): {rn, q, deg} harmonic-function object, key-dependent.
  Validated by _validate_fn on BOTH decode and emit so a partial / out-of-range
  fn (which would fail the schema's required-keys rule) never rides the wire.
  Default-omitted, mirroring bend bnv.
- ChordTemplate.voicing (template): key-independent voicing-type string
  ("open", "triad", "shell", "drop2", "barre", ...). Emitted only when
  non-empty; non-string wire values fall back to "".

Display/teaching only — never fed to a grader (honesty rule). fn auto-derivation
is DEFERRED (carry-only): a complete rn/q needs chord-quality analysis, and a
deg-only fn would be schema-invalid, so server.py carries author-provided fn
unchanged. GP import unchanged (no reliable per-chord function/voicing).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(highway): render chord harmony fn.rn + voicing on 2D + 3D (§6.3.1, §6.6)

Draw the chord's harmonic-function Roman numeral (instance fn.rn) and its
template voicing string, stacked above the chord name on both highways. A shared
pure helper chordHarmonyLabels(fn, voicing) formats the two labels (empty when
absent/malformed) and is node-tested against both files.

Both labels are gated behind the EXISTING teaching-marks opt-in
(_showTeachingMarks / teachingMarksVisible bundle flag) — they're chord-level
teaching overlays, same class as sd/ch, so they stay off the default highway.
2D guards the empty-note-chord case; 3D reuses the gold chord-label sprite style.

Render only — no scoring / NoteVerifier path is touched (honesty rule).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:03:15 +02:00
..
assets/venue/themes/small-club Clean release snapshot 2026-06-16 18:47:13 +02:00
capabilities feat(onboarding): first-run home tour (spotlight coach marks) (#528) 2026-06-19 16:32:33 +02:00
lottie Clean release snapshot 2026-06-16 18:47:13 +02:00
svg Clean release snapshot 2026-06-16 18:47:13 +02:00
v3 Merge pull request #337 from got-feedback/fix/feed-db-ack-typo 2026-06-20 23:06:44 -07:00
vendor Clean release snapshot 2026-06-16 18:47:13 +02:00
_tailwind.src.css Clean release snapshot 2026-06-16 18:47:13 +02:00
app.js Purge external-format terminology from code, tests and docs 2026-06-16 19:36:53 +01:00
audio-mixer.js Clean release snapshot 2026-06-16 18:47:13 +02:00
capabilities.js feat(onboarding): first-run home tour (spotlight coach marks) (#528) 2026-06-19 16:32:33 +02:00
diagnostics.js Clean release snapshot 2026-06-16 18:47:13 +02:00
highway.js feat(highway): render chord harmony fn.rn + voicing on 2D + 3D (§6.3.1, §6.6) (#541) 2026-06-21 11:03:15 +02:00
index.html feat(onboarding): input-device setup step + core-owned midi-input domain (#526) 2026-06-19 16:31:16 +02:00
lottie-api.js Clean release snapshot 2026-06-16 18:47:13 +02:00
style.css Repoint dead slopsmith URLs -> got-feedback 2026-06-17 11:02:04 +02:00
tailwind.min.css Clean release snapshot 2026-06-16 18:47:13 +02:00
tour-engine.css feat(onboarding): first-run home tour (spotlight coach marks) (#528) 2026-06-19 16:32:33 +02:00
tour-engine.js feat(onboarding): first-run home tour (spotlight coach marks) (#528) 2026-06-19 16:32:33 +02:00