Device screen redesign (CircuitPython app.py), built proportional to WIDTH/HEIGHT so it scales to other panels (one adaptive firmware, per-panel config — not a fork): - gen_assets.py bakes logo.bin (VARASYS wordmark, no tagline), midi.bin (DIN-5), usb.bin (trident) as 4-bit-alpha bitmaps (same packing as the fonts). - Header: VARASYS logo (brand cyan) replaces the "PM_K-1 KIT" text; MIDI icon goes green when a host is listening, USB icon lights when supervisor.runtime.usb_connected. load_alpha/make_glyph are non-fatal — a missing .bin falls back to text, never a black screen (addresses the corrupt-file failure mode we just hit). - Pad grid: filled squares on main beats, hollow outline squares (outer+inner rect) on off-beats; playhead fills the lit pad. Vertical gridlines at the master lane's beats (full height) so beats line up across lanes. - Stopwatch (m:ss) + bar counter (master-lane cycles), refreshed ~4x/s only on change. The .bin assets ship in the drive bundle (the A/B updater only pushes app.py), so a one-time re-copy is needed to pick them up. APP_VERSION -> 0.0.2. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
49 lines
2.8 KiB
Bash
Executable file
49 lines
2.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Assemble the deployed single-file pages from source + shared partials + assets/.
|
|
#
|
|
# Every page (the Concepts landing, the editor app, and the device/form-factor
|
|
# pages) is a source that shares code via markers:
|
|
# /*@BUILD:include:src/<file>@*/ inlines a shared partial (engine, seed lists, base CSS, header/footer/chrome)
|
|
# @BUILD:favicon@ / @BUILD:logo-*@ inline base64 assets (voices are all synthesized — no samples)
|
|
# This resolves them so each built page in dist/ is one self-contained file
|
|
# (zero deps, works fully offline). deploy.sh runs this first. dist/ is generated —
|
|
# don't edit or commit it.
|
|
set -euo pipefail
|
|
cd "$(dirname "${BASH_SOURCE[0]}")"
|
|
mkdir -p dist
|
|
python3 - <<'PY'
|
|
import os, pathlib, re
|
|
A = pathlib.Path("assets")
|
|
|
|
def build(name):
|
|
src = pathlib.Path(name).read_text()
|
|
# 1) inline shared partials (function-replacement: no backslash/group interpretation)
|
|
src = re.sub(r"/\*@BUILD:include:([^@]+)@\*/",
|
|
lambda m: pathlib.Path(m.group(1)).read_text().rstrip("\n"), src)
|
|
# 2) inline base64 assets (voices are all synthesized now — no samples)
|
|
src = src.replace("@BUILD:favicon@", (A / "favicon.b64").read_text().strip())
|
|
src = src.replace("@BUILD:logo-dark@", (A / "logo-dark.b64").read_text().strip())
|
|
src = src.replace("@BUILD:logo-light@", (A / "logo-light.b64").read_text().strip())
|
|
assert "@BUILD:" not in src, f"unresolved build marker(s) remain in {name}"
|
|
out = pathlib.Path("dist") / name
|
|
out.write_text(src)
|
|
return out.stat().st_size
|
|
|
|
for name in ("index.html","editor.html","player.html","teacher.html","stage.html","micro.html","showcase.html","kit.html",
|
|
"embed.html",
|
|
"info-editor.html","info-player.html","info-teacher.html","info-stage.html","info-micro.html","info-showcase.html","info-kit.html"):
|
|
print("built %s (%dKB)" % (name, build(name) // 1024))
|
|
pathlib.Path("dist/embed.js").write_text(pathlib.Path("embed.js").read_text()) # loader, served as-is
|
|
print("copied embed.js")
|
|
pathlib.Path("dist/pico-main.py").write_text(pathlib.Path("pico/main.py").read_text()) # PM_K-1 firmware, downloadable
|
|
print("copied pico-main.py")
|
|
pathlib.Path("dist/pico-cp-app.py").write_text(pathlib.Path("pico-cp/app.py").read_text()) # served for the editor's A/B firmware updater
|
|
print("copied pico-cp-app.py")
|
|
import zipfile # PM_K-1 CircuitPython drive bundle (download → unzip onto CIRCUITPY)
|
|
with zipfile.ZipFile("dist/pm_k1_circuitpy.zip", "w", zipfile.ZIP_DEFLATED) as z:
|
|
for f in ("code.py", "app.py", "boot.py", "programs.json", "font_s.bin", "font_m.bin", "font_l.bin",
|
|
"logo.bin", "midi.bin", "usb.bin", "README.md", "protect-firmware.sh"):
|
|
z.write("pico-cp/" + f, f)
|
|
z.write("dist/editor.html", "editor.html") # offline copy of the editor, on the drive
|
|
print("zipped pm_k1_circuitpy.zip")
|
|
PY
|