feedBack/lib
Byron Gamatos 587fbbea81
feat(core): consume song_timeline tempos + time_signatures + per-chart tempos (feedpak 1.2.0) (#529)
feedpak 1.2.0 added song-level `tempos` + `time_signatures` to song_timeline.json
and a per-chart `tempos` override on arrangements (§6.10). Core stored the raw
song_timeline dict but never consumed the maps, and didn't read per-chart tempos.

- song.py: shared `sanitize_tempos([{time,bpm}])` (finite non-bool time, finite
  bpm>0, sorted); `Arrangement.tempos` field wired through arrangement_to_wire
  (omitted when None/empty per §6.10) / arrangement_from_wire.
- sloppak.py: `_sanitize_time_signatures([{time,ts:[num,den]}])`;
  LoadedSloppak.tempos / .time_signatures, loaded from song_timeline.json
  INDEPENDENTLY of beats/sections (all are optional in 1.2.0).
- server.py: stream `tempos` + `time_signatures` highway-WS messages; the active
  arrangement's per-chart `tempos` overrides the song-level map for that chart.

Renderer/UI surfacing is a thin follow-up; this lands the data plumbing.

Codex-reviewed: clean (no findings). +9 tests (sanitizers, per-chart wire
round-trip + omit-when-absent, song-level load/sanitize/absent + maps-without-
beats). 90 song/sloppak tests pass. (Pre-existing unrelated failure:
test_diagnostics_redact, fails on clean main too.)

Closes #526. Part of got-feedback/feedback#334.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:35:07 +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 Clean release snapshot 2026-06-16 18:47:13 +02:00
gp2rs_gpx.py feat(gp): extract GP chord-diagram fingerings + GP8 chord names (E3) (#522) 2026-06-20 20:44:45 +02:00
gp2rs.py fix(gp): GP5 chord enrichment — gate on diagram-matches-played + decouple name/fingers (#523) 2026-06-20 21:04:12 +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): consume song_timeline tempos + time_signatures + per-chart tempos (feedpak 1.2.0) (#529) 2026-06-20 21:35:07 +02:00
song_score.py Clean release snapshot 2026-06-16 18:47:13 +02:00
song.py feat(core): consume song_timeline tempos + time_signatures + per-chart tempos (feedpak 1.2.0) (#529) 2026-06-20 21:35:07 +02:00
songmeta.py Clean release snapshot 2026-06-16 18:47:13 +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