feedBack/lib
Byron Gamatos a858617d71
fix(bend): GP8 short-bend curve loss + 2D curve timing + 3D bnv gating (#535)
Post-merge Codex review of the bend-curve PRs (#531/#532) surfaced edge cases:

- GP8 (#531 P2): bnv timing used rn.sustain, which is zeroed for notes <= 0.2s,
  so short GP8 bends kept the scalar bn but lost bt/bnv. Use the beat duration
  `dur` (matching the GP5 path) so the curve survives.
- 2D highway (#532 P2): bnvNormalizedPoints mapped x over the curve's own t-range
  [first,last] instead of the note span, so curves not starting at 0 / ending at
  sus were time-distorted. Now maps over [0, sus] (clamped), with a curve-span
  fallback when sus<=0 (existing no-sus callers unaffected).
- 3D highway (#532 P3): the sustain ribbon + bend chevron were gated on bn>0, so a
  note carrying an authoritative bnv with bn==0 drew no ribbon/marker. Both now
  also fire on bnv presence; chevron steps derived from max(bn, bnv peak).

Codex-reviewed: clean (no findings). +1 JS test (sus-relative mapping + fallback).
JS 8/8, 250 core GP/song tests pass.

NB: GP8's short-bend path still lacks a dedicated synthetic-GPIF fixture (same gap
as the GP8 offset-prop-names P3) — _gpx_bend_shape units cover the function; the
fix is the one-line caller change.

Part of got-feedback/feedback#334.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:46:36 +02:00
..
audio.py Improve wording in terminology cleanup 2026-06-16 19:43:45 +01:00
diagnostics_bundle.py Clean release snapshot 2026-06-16 18:47:13 +02:00
diagnostics_hardware.py Clean release snapshot 2026-06-16 18:47:13 +02:00
diagnostics_redact.py Fix two regressions in the terminology purge 2026-06-16 21:19:16 +02:00
drums.py Clean release snapshot 2026-06-16 18:47:13 +02:00
gp2midi.py Clean release snapshot 2026-06-16 18:47:13 +02:00
gp2notation.py feat(core): adopt feedpak_version — read on load + stamp on manifest writes (spec §4) (#530) 2026-06-20 21:59:04 +02:00
gp2rs_gpx.py fix(bend): GP8 short-bend curve loss + 2D curve timing + 3D bnv gating (#535) 2026-06-21 00:46:36 +02:00
gp2rs.py feat(core): per-note bend shape (bt + bnv) — wire + GP import (#531) 2026-06-20 23:17:39 +02:00
gp8_audio_sync.py Improve wording in terminology cleanup 2026-06-16 19:43:45 +01:00
gp_autosync.py Clean release snapshot 2026-06-16 18:47:13 +02:00
logging_setup.py Clean release snapshot 2026-06-16 18:47:13 +02:00
loosefolder.py Improve wording in terminology cleanup 2026-06-16 19:43:45 +01:00
lyrics_transcribe.py Clean release snapshot 2026-06-16 18:47:13 +02:00
midi_import.py Clean release snapshot 2026-06-16 18:47:13 +02:00
notation_lift.py Clean release snapshot 2026-06-16 18:47:13 +02:00
notation.py Clean release snapshot 2026-06-16 18:47:13 +02:00
progression.py Improve wording in terminology cleanup 2026-06-16 19:43:45 +01:00
safepath.py Clean release snapshot 2026-06-16 18:47:13 +02:00
scan_worker.py Clean release snapshot 2026-06-16 18:47:13 +02:00
sloppak.py feat(core): adopt feedpak_version — read on load + stamp on manifest writes (spec §4) (#530) 2026-06-20 21:59:04 +02:00
song_score.py Clean release snapshot 2026-06-16 18:47:13 +02:00
song.py feat(core): per-note bend shape (bt + bnv) — wire + GP import (#531) 2026-06-20 23:17:39 +02:00
songmeta.py feat(core): adopt feedpak_version — read on load + stamp on manifest writes (spec §4) (#530) 2026-06-20 21:59:04 +02:00
tailwind_rebuild.py Clean release snapshot 2026-06-16 18:47:13 +02:00
tones.py Clean release snapshot 2026-06-16 18:47:13 +02:00
tunings.py Clean release snapshot 2026-06-16 18:47:13 +02:00
vocal_pitch.py Repoint dead slopsmith URLs -> got-feedback 2026-06-17 11:02:04 +02:00
wem_decode.py Improve wording in terminology cleanup 2026-06-16 19:43:45 +01:00
xp.py Clean release snapshot 2026-06-16 18:47:13 +02:00