From df213272ae4c7e57083ab9b1d4adc66dbf698e5e Mon Sep 17 00:00:00 2001 From: Me Here Date: Tue, 26 May 2026 06:57:57 -0500 Subject: [PATCH] =?UTF-8?q?Add=20"as-built"=20player=20variant:=20mono=201?= =?UTF-8?q?28=C3=9764=20OLED=20+=2016-px=20WS2812=20beat=20bar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New /player-asbuilt.html showing the PM-1 with parts you'd actually solder for an RP2040 build, alongside the idealized /player.html: - 128×64 MONOCHROME OLED (SSD1306 class): rendered as a true 1-bit framebuffer — drawn, then thresholded to crisp on/off pixels and scaled with image-rendering:pixelated — so the cramped real layout is honest (position / big BPM / grouping / scrolling name / bar·beat). - Fixed 16-px WS2812 ("NeoPixel") RGB beat bar on a strip PCB: lights the first beatsPerBar slots (cyan downbeats, amber group-starts, dim others), the rest dark — showing the fixed-count hardware honestly. - EC11 rotary encoder you actually turn (wheel / vertical drag) for tempo, tactile buttons, MAX98357A-style speaker grille, USB-C, PWR LED, matte case. Shares the same firmware via src/engine.js + src/setlists.js (same seed set lists, same scheduler); only the panel rendering differs. The device is fixed dark hardware; the page chrome follows light/dark/system. build.sh + deploy.sh now assemble/serve all three pages; player.html links to it ("As-built ↗"). Co-Authored-By: Claude Opus 4.7 (1M context) --- build.sh | 5 +- deploy.sh | 2 + player-asbuilt.html | 433 ++++++++++++++++++++++++++++++++++++++++++++ player.html | 1 + 4 files changed, 439 insertions(+), 2 deletions(-) create mode 100644 player-asbuilt.html diff --git a/build.sh b/build.sh index ffab6d6..b6326a8 100755 --- a/build.sh +++ b/build.sh @@ -30,6 +30,7 @@ def build(name): out.write_text(src) return out.stat().st_size -i = build("index.html"); p = build("player.html") -print("built dist/index.html (%dKB) + dist/player.html (%dKB)" % (i // 1024, p // 1024)) +i = build("index.html"); p = build("player.html"); a = build("player-asbuilt.html") +print("built dist/index.html (%dKB) + dist/player.html (%dKB) + dist/player-asbuilt.html (%dKB)" + % (i // 1024, p // 1024, a // 1024)) PY diff --git a/deploy.sh b/deploy.sh index 1d03de0..93f068a 100755 --- a/deploy.sh +++ b/deploy.sh @@ -43,6 +43,8 @@ sed "s|const APP_VERSION = \"[^\"]*\";|const APP_VERSION = \"$BUILD\";|" "$DIST_ echo "deployed v$BUILD ($(stat -c '%s' "$DEST_DIR/index.html") bytes) -> $DEST_DIR" sed "s|const APP_VERSION = \"[^\"]*\";|const APP_VERSION = \"$BUILD\";|" "$DIST_DIR/player.html" > "$DEST_DIR/player.html" echo "deployed player.html ($(stat -c '%s' "$DEST_DIR/player.html") bytes)" +sed "s|const APP_VERSION = \"[^\"]*\";|const APP_VERSION = \"$BUILD\";|" "$DIST_DIR/player-asbuilt.html" > "$DEST_DIR/player-asbuilt.html" +echo "deployed player-asbuilt.html ($(stat -c '%s' "$DEST_DIR/player-asbuilt.html") bytes)" # If real audio samples are added later (see the plan's GM-sample note), # sync that directory too. diff --git a/player-asbuilt.html b/player-asbuilt.html new file mode 100644 index 0000000..d8d20f0 --- /dev/null +++ b/player-asbuilt.html @@ -0,0 +1,433 @@ + + + + + +VARASYS PM‑1 — as‑built (real components) + + + + + + + +
+ VARASYS PM‑1 · as‑built (real components) + + + Idealized ↗ + Editor ↗ + +
+ + +
+ + +
+
VARASYS PM‑1 Polymeter Player
+
PWR
+
+ +
+
+ +
+
+
0.96″ 128×64 mono OLED (SSD1306)
+ +
+
16‑px WS2812 RGB beat bar
+ +
+
+
Prev
+
Play
+
Next
+
Tap
+
+
TEMPO
+
+ +
+
+
USB‑C
+
+
+ + +
+

Load a configuration onto the device

+

Same firmware as the idealized unit — only the panel hardware differs. Paste a patch + (e.g. v1;t120;kick:4;snare:4=.X.X;hatClosed:4/2), a set‑list code, or a + #p=…/#sl=… link.

+ + +
+ + or pick a built-in or saved set list: + +
+
+
+ + + + diff --git a/player.html b/player.html index 048b021..8137873 100644 --- a/player.html +++ b/player.html @@ -199,6 +199,7 @@ + As‑built ↗ Open editor ↗