The full-feature desktop console (big TFT, arcade buttons, instrument pass-through)
is repositioned as the "Teacher" for studio desks and lessons:
- stage.html -> teacher.html, info-stage.html -> info-teacher.html (git mv)
- all links/paths, the embed variant (stage -> teacher), nav, cards, embed docs,
README, build.sh + deploy.sh updated; deploy cleans the stale live stage files
The "Stage" name is now free for a forthcoming foot-pedal stompbox (/stage.html).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
MicroPython sim that runs on https://wokwi.com/pi-pico: KY-040 encoder stands in
for the thumb-roller (rotate=tempo, press=start/stop, hold+rotate=track), an
SSD1306 OLED for the display, and a piezo buzzer for the click. Files:
diagram.json, main.py, ssd1306.py + README with the (manual) setup steps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Power: standardise the whole family on a single USB-C input — drop the Micro's
2×AA and the Stage's 9V DC pedal jack (+ buck/reverse-polarity). Bring a power
bank; nothing internal to wear out. BOMs updated (Micro ≈$35, Stage ≈$56) and
all copy/cards/READMEs follow.
Micro form: detach the two end caps from the body with a gap (set-back, darker
end faces) so the TRS/USB-C jacks read as being on the ENDS of the bar, not the
front panel.
Landing: add a Philosophy section — "program on the web, play on any device"
(author once → load the program string into whichever form factor fits) and
"USB-C power everywhere — no batteries" (future-proofing rationale).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reworks the Micro per the new brief: a long, narrow extruded-aluminium bar you
patch into your signal instead of a little box.
- Better display: amber 4-char 14-segment (Adafruit font) that shows BPM *and*
short track names, replacing the 3-digit 7-segment. Off-segments kept very dim
so the lit digits read clearly.
- Roller instead of knob: a recessed, clickable horizontal thumb-roller —
roll = tempo, press = start/stop, hold + roll = switch track.
- New form/I-O: 1/4" TRS in on one end; USB-C + 1/4" TRS out on the other;
USB-C or 2×AA power (battery gauge on the face). Click is summed into the
signal in the analog domain (+ a small monitor speaker).
info-micro, concepts and the landing card updated to match; BOM reworked
(analog path + 2 jacks + 2×AA + 14-seg) → ≈ $38.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The site now opens on a proper front door: a hero (logo + tagline + pitch),
an "Open the Editor →" CTA, and form-factor cards (Editor, Stage, Micro, Embed)
linking out to each page + info. The PE-1 editor app moves from index.html to
editor.html; every "Editor"/"Open" link, the embed.js editor variant, and the
editor's own brand-logo (now → /) are repointed. build.sh + deploy.sh build and
publish both index.html (landing) and editor.html (app).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Rebrand the intro to the VARASYS PolyMeter site (PE-1 editor home + concepts +
hardware mockups + embeddable widget); add a Pages map, an Embedding section
with the drop-in snippet, the live program-string note, and refresh the Build
and Files sections for all pages + embed.js.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
A faded one-line monospace bar under the app shows the current patch via
currentPatch(); it brightens on hover/focus. Press Enter or blur to apply it
(applyPatch) — paste a program string and it loads; the field renormalises to
the canonical string and flashes on apply, tints red on parse failure. A focus
guard keeps refreshUI from overwriting the field while you're typing in it.
Hidden in embed mode. Refreshed from the existing updateCtx() path.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each form factor now has an information page (purpose + live embedded widget),
with priced BOMs only on the buildable hardware (Stage ≈$59, Micro ≈$28):
- info-editor.html / info-initial.html — purpose only (web app / concept)
- info-stage.html — purpose + the priced BOM moved out of stage.html
- info-micro.html — purpose + a new ~$28 practice-unit BOM
stage.html drops the BOM panel (+ its .bom CSS) and gains a "Spec & BOM" link;
the shared .bom/.sub table CSS lives in src/base.css. "Info" added to every
page nav and to the concept cards. Wired into build.sh + deploy.sh.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Every form factor supports ?embed=1: a head flag (set on <html>, no flash)
strips the site chrome (base.css [data-embed]) + page-specific panels, leaving
just the widget, and posts its height so the host can auto-size it.
- Config/settings string preloads via the existing #p=/#sl= hash. Added that
hash handling to micro.html (it previously only loaded built-in tracks).
- New embed.js loader: <div data-varasys-metronome="micro" data-patch="…"> + one
<script> → an auto-sizing iframe to <page>?embed=1#p=…. New embed.html documents
it and dogfoods a live embedded widget.
- "Embed" nav link added across pages; build.sh/deploy.sh build embed.html and
serve embed.js.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Shared site header in src/base.css (.site-head/.site-nav/.brand-logo + theme-
aware logo + .tbtn). Applied to player/stage/micro (replacing their text
topbars) so the VARASYS logo + tagline + Editor/Concepts nav is on every page.
- Rebrand the editor: "Stackable Metronome" → "PE-1 — PolyMeter Editor" (title +
h1), with a Concepts link in its header.
- New concepts.html — the PolyMeter Concepts library: cards for the editor and
each form factor (PM-1 Initial/Stage, PM-µ Micro) + a "more coming" card.
- build.sh + deploy.sh build/deploy concepts.html; deploy.sh now loops over pages.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the shiny brushed-aluminium look with a bead-blasted matte-black
anodised finish on both the stage and micro mockups:
- flat dark graphite case + a fine bead-blast micro-texture, and the specular
top highlight removed, so the case doesn't reflect stage lights;
- light laser-etched legend colour (--silk) and the light VARASYS logo variant
on the dark case; lighter metallic rims on the top-edge connector openings so
they read on black;
- stage BOM enclosure + comments updated to "die-cast aluminium, bead-blasted,
matte-black Type II anodise, laser-etched legends".
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Rename player-asbuilt.html → stage.html (the pedalboard build). Update
build.sh + deploy.sh (deploy now also removes the old player-asbuilt.html
from the web root) and the cross-links in player.html / stage.html.
- New /micro.html — a stripped-down home-practice metronome on the same RP2040
firmware. Hardware is just: ONE depressable scroll/rotary encoder, a red
7-segment LED display, a speaker, and USB-C for power. The encoder does
everything: spin = tempo, press = start/stop, hold + spin = switch track
(the LED shows the track number, with BPM / TRACK / ▶ indicators). Tracks =
the editor's seed grooves flattened (23). Shares src/engine.js, setlists.js,
base.css; synth-only; steady practice loop (ramps/bars ignored).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Removed the PCB back view (BOM stays in the right column).
- Front and top views now share a left dimension gutter, so they're the same
width and aligned, and carry inch dimensions: front 4.7 × 5.5 in (120 × 140 mm),
top-edge thickness ≈ 1.8 in (45 mm), width 4.7 in below.
- Reworked the TFT to use the empty space: tempo with the item name beside it,
bar/beat at the bottom, and — filling the middle — ALL meter lanes drawn as
rows of step pads (subdivisions, accent/normal/ghost/mute, amber beat ticks,
per-lane playhead). Replaces the single beat-dots row.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- New back view in a right-hand column above the BOM: a green PCB schematic
with the mounted parts placed roughly as on the front — top-edge jacks,
ST7789 TFT, RP2040, 9V→5V buck, the PLAY/PREV/ENC/TAP/NEXT footprints, the
analog-audio block (PCM5102 · NE5532 · DRV134 · PAM8302), speaker, and corner
mounting holes.
- Dimensions in inches: back view labelled 4.7 in × 5.5 in (120 × 140 mm); the
top-edge view's thickness now reads ≈ 1.8 in (45 mm).
- Layout: front view (+ top-edge view, loader) on the left; back view + BOM on
the right.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Connectors: all jacks move to a separate "top edge" view above the device
(a brushed-metal edge strip with Trig In / Inst In / Out TRS / 9V DC / USB-C
and a ↕ ≈ 45 mm total-thickness dimension), since they're top-mounted for
pedalboard cabling. Removed them from the faceplate.
- Removed the fake corner screws/rivets.
- Swapped PLAY and the tempo roller: a big PLAY now sits up top (centred); the
roller sits in the button row with TAP, between PREV (far left) and NEXT (far
right).
- PLAY is static hardware now — it no longer changes colour/icon while playing
(the screen shows transport state). An illuminated/RGB arcade button could
reflect it; noted in the comment.
- Use the real VARASYS logo (logo-light, inlined at build) on the metal
faceplate instead of the text wordmark.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Case: reskin the enclosure as a brushed-aluminium / stainless faceplate
(metal sheen + brushed grain, chrome corner screws, dark engraved legends)
instead of 3D-printed matte. The on-faceplate captions switch to the dark
legend colour for contrast; I/O-strip labels stay light (they're on the dark
recessed bay). BOM enclosure → die-cast aluminium (Hammond 1590-style) /
folded stainless.
- Power: add a standard 9 V DC pedal jack (2.1 mm centre-negative) so it drops
straight onto a pedalboard, alongside USB-C (which still powers it on a desk
and carries config). BOM adds the jack + 9 V→5 V buck + reverse-polarity
protection. Total ≈ $59.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Tempo control: replace the protruding knob with a recessed side-mount
thumb-roller — a detented encoder (EC11/PEC12) with a ribbed wheel exposed
only at the edge through a slot, like a mouse scroll wheel, so there's
nothing to snap off. Scroll/drag tempo interaction is unchanged; the ribs
scroll for roll feedback (--rib) instead of a knob pointer.
- Power: no battery — the device is USB-C bus-powered from the same port that
carries config. Dropped the LiPo + TP4056 charger + 5 V boost from the BOM
(total ≈ $49) and marked USB-C as 5 V in + config.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Layout: wrap the device + loader in a left column and the BOM in a right
column (flex row, wraps to stacked on narrow screens) so you can see the
player and the parts list at once. Top bar widened to span both.
- Display: the colour TFT now draws the beat indicator itself — a centred row
of beat dots (current beat bright, group-starts amber) with the current
beat's subdivisions as pips below — so the separate 4×16 WS2812 matrix is
gone. Subdivisions still come from the finest lane sharing lane 1's grid.
- BOM: dropped the WS2812 beat-bar line (−$6 → ≈ $55) — fewer parts, and one
fewer thing to drive in firmware.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add a costed BOM panel below the loader, grouped by subsystem (brain &
display, beat bar, controls, audio—analog click injection, connectors &
power, build) with quantities and ballpark prices (~$61 one-off).
- Reflect the confirmed analog mixing in the audio path / comment: PCM5102A
click DAC → summing op-amp (NE5532/OPA2134) with a hi-Z instrument buffer →
balanced line driver (DRV134) to the shared 1/4" TRS out, plus a PAM8302A
monitor amp + speaker — the instrument is never re-digitised (no latency).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reworked the as-built panel around how it's actually used:
- Buttons: replaced the tactile/keycap ("rubber key") buttons with glossy
arcade pushbuttons, colour-keyed — cyan PREV/NEXT, a big green/red PLAY,
amber TAP.
- Layout for use: the rotary encoder sits BELOW the screen (so turning it
never hides the readout) with the buttons spread edge-to-edge underneath —
PREV far left, NEXT far right, a bigger central PLAY (+ TAP) — so you're
far less likely to hit the wrong one mid-performance.
- Rear I/O: external trigger in (footswitch), a 1/4" instrument pass-through
with the click injected, and a shared 1/4" balanced-TRS main out; plus the
monitor speaker and USB-C, each a labelled jack with a tooltip.
- Size: shrank the case to hug its content (max-width 560→380, trimmed
padding and inter-section margins) — the dead margin is gone.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 128×64 mono OLED was too pixelated, so step up to the realistic next
tier: a 2.0″ 320×240 colour IPS TFT (ST7789 — e.g. Pimoroni Pico Display 2.0),
~5× the resolution and full colour.
- Drop the 1-bit threshold + image-rendering:pixelated; render on a hi-DPI
canvas (backing = 320×240 × devicePixelRatio) with smooth anti-aliased type.
- Richer colour layout: dim header (position + green ▶ PLAY / grey ■ STOP),
a big cyan tempo with "BPM ♩ <grouping>", the centred item name (ellipsised),
and a bottom strip with bar·beat + an amber bars countdown.
The screen stays a fixed dark UI (a TFT shows whatever firmware draws); the page
chrome still follows light/dark/system. Beat matrix, encoder, buttons unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the single 16-px strip with a 4×16 WS2812 matrix (four 16-px strips,
still PIO-driven on the RP2040):
- bottom row = the beat (cyan downbeats / amber group-starts, current beat
bright, the rest a dim grid) — separated from the rows above by a divider;
- the three rows above stack the CURRENT beat's subdivisions as they pass:
a column climbs row-by-row with each subdivision and resets on the next beat,
with faint "slots" showing the ladder it will climb.
Subdivisions are driven by the finest lane that shares lane 1's beat grid
(non-poly, same beatsPerBar, max stepsPerBeat) — so an 8th-note hat shows one
row, 16ths show three, straight quarters show none. Also fixed a stray
"#05measure" typo left in the old .npx border rule.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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) <noreply@anthropic.com>
Two fixes from on-device testing:
1. Fill the screen. The earlier stage capped the device at min(96vw,168vh)
and centred it, leaving big margins on wide phones. Now the device frame
goes transparent/borderless at position:absolute inset:0 and the OLED
grows (flex:1) so the unit fills the whole viewport edge to edge.
2. Follow light/dark/system in full-screen. The full-screen skin is the
themed page gradient (light in light mode, dark in dark, OS-driven on
system), and a theme toggle (◐/☀/☾ — same cycle + "metronome.theme" key
as the main page) now sits beside the exit ✕, since the top bar that
normally holds it is hidden in stage.
The themed gradient is painted on the device element rather than the body
because a position:fixed body doesn't propagate its background to the
canvas (left a white area). The decorative PWR dot is hidden in stage so
it doesn't sit under the floating controls.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>