From 0fcbb2d28a830fbefc8e690508cd5e9a201971fd Mon Sep 17 00:00:00 2001 From: Joe Hallahan Date: Fri, 24 Jul 2026 16:59:01 -0400 Subject: [PATCH 1/3] Use chart data from bundle (post-chart-transformation plugins) (#1) (#2) * Use chart data from bundle (post-chart-transformation plugins) (#1) * Read chart data from bundle without gp5 * Code review * PR comments * Coderabbit feedback Signed-off-by: Joe --- .gitignore | 1 + .specify/memory/constitution.md | 63 ++- README.md | 24 +- package-lock.json | 22 + package.json | 10 + plugin.json | 4 +- requirements.txt | 4 - routes.py | 93 ---- rs2gp.py | 533 ------------------- screen.js | 881 +++++++++++++------------------- src/chart-quantize.js | 176 +++++++ src/score-builder.js | 220 ++++++++ test/chart-quantize.test.mjs | 168 ++++++ test/score-builder.test.mjs | 291 +++++++++++ tests/conftest.py | 16 - tests/test_rs2gp_helpers.py | 149 ------ 16 files changed, 1297 insertions(+), 1358 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 requirements.txt delete mode 100644 routes.py delete mode 100644 rs2gp.py create mode 100644 src/chart-quantize.js create mode 100644 src/score-builder.js create mode 100644 test/chart-quantize.test.mjs create mode 100644 test/score-builder.test.mjs delete mode 100644 tests/conftest.py delete mode 100644 tests/test_rs2gp_helpers.py diff --git a/.gitignore b/.gitignore index 7a60b85..b4bc537 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ *.pyc +node_modules/ diff --git a/.specify/memory/constitution.md b/.specify/memory/constitution.md index 3ef3d1d..e1ab1d8 100644 --- a/.specify/memory/constitution.md +++ b/.specify/memory/constitution.md @@ -3,44 +3,53 @@ ## Inheritance feedBack's core plugin contract governs everything in this repo (manifest, -plugin context: `get_dlc_dir`, `get_sloppak_cache_dir`, asset serving, the -`slopsmithViz_*` visualization factory contract, splitscreen mounting). This -constitution lists Tab View's own non-negotiables. +the `slopsmithViz_*` visualization factory contract, splitscreen mounting). +This constitution lists Tab View's own non-negotiables. ## Core Principles ### I. alphaTab is the renderer; we're the bridge Tab View MUST NOT render notation glyphs itself. alphaTab is the source of truth for all musical glyphs, beam grouping, stems, and bar layout. Our job -is to translate arrangement XML → Guitar Pro 5 (`rs2gp.py`) and to drive -alphaTab's cursor (`tickPosition`) from `audio.currentTime` using beat -timing data the highway already exposes. +is to translate the renderer bundle (notes/chords/tuning/stringCount/beats) +into an alphaTab `Score` (`src/chart-quantize.js` + `src/score-builder.js`) +and to drive our own boundsLookup-driven marker from `window.highway.getTime()` +(single-player) or `bundle.currentTime` (splitscreen), using beat timing data +the highway exposes. ### II. Multi-instance by construction (slopsmith#36) Per-instance state lives in factory closures returned from `createFactory()`. Module-level scope is reserved for genuine singletons: - The CDN script load promise (one `