Commit graph

333 commits

Author SHA1 Message Date
Me Here
9d48edf7e0 Rename as-built → stage.html; add micro.html (minimal home-practice unit)
- 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>
2026-05-26 09:45:58 -05:00
Me Here
f71327fd41 Bump version to 0.0.26 2026-05-26 08:55:52 -05:00
Me Here
e8c613e3e4 As-built: drop back view; inch dims on front+top (same width); TFT shows all lanes
- 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>
2026-05-26 08:55:52 -05:00
Me Here
9b5dfd63c5 Bump version to 0.0.25 2026-05-26 08:40:09 -05:00
Me Here
e016682f73 As-built: add a back view (PCB + mounted components); dimensions in inches
- 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>
2026-05-26 08:40:09 -05:00
Me Here
53c5bc1a82 Bump version to 0.0.24 2026-05-26 08:25:04 -05:00
Me Here
02523f4f7a As-built: top-edge connector view + thickness; VARASYS logo; PLAY/roller swap
- 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>
2026-05-26 08:25:04 -05:00
Me Here
810d67d071 Bump version to 0.0.23 2026-05-26 08:10:56 -05:00
Me Here
831e74a584 As-built: brushed-aluminium/stainless case + 9V DC pedal jack (pedalboard-ready)
- 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>
2026-05-26 08:10:56 -05:00
Me Here
504ea14dba Bump version to 0.0.22 2026-05-26 08:03:15 -05:00
Me Here
a40ff04fd1 As-built: recessed thumb-roller for tempo (no protruding knob); USB-C bus power
- 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>
2026-05-26 08:03:15 -05:00
Me Here
8c94749e4f Bump version to 0.0.21 2026-05-26 07:56:17 -05:00
Me Here
984b71a07d As-built: drop orphaned WS2812 CSS comment after the matrix removal
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 07:56:17 -05:00
Me Here
b7e12ec49f Bump version to 0.0.20 2026-05-26 07:55:17 -05:00
Me Here
43495777c9 As-built: side-by-side player + BOM; move the beat display onto the TFT
- 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>
2026-05-26 07:55:17 -05:00
Me Here
7b14f861a8 Bump version to 0.0.19 2026-05-26 07:42:38 -05:00
Me Here
3e70eadea7 As-built: add on-page bill of materials; confirm analog click-injection
- 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>
2026-05-26 07:42:38 -05:00
Me Here
5f18629c05 Bump version to 0.0.18 2026-05-26 07:34:40 -05:00
Me Here
4f76783af4 As-built: arcade buttons, use-driven control layout, rear I/O, compact case
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>
2026-05-26 07:34:40 -05:00
Me Here
4340f1838e Bump version to 0.0.17 2026-05-26 07:11:48 -05:00
Me Here
b434520505 As-built: upgrade the mono OLED to a 320×240 colour IPS TFT (ST7789)
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>
2026-05-26 07:11:48 -05:00
Me Here
00cb245331 Bump version to 0.0.16 2026-05-26 07:06:28 -05:00
Me Here
fcf58d9c1f As-built: stack the beat bar into a 4×16 matrix (beat + 3 subdivision rows)
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>
2026-05-26 07:06:28 -05:00
Me Here
649501b51c Bump version to 0.0.15 2026-05-26 06:57:57 -05:00
Me Here
df213272ae Add "as-built" player variant: mono 128×64 OLED + 16-px WS2812 beat bar
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>
2026-05-26 06:57:57 -05:00
Me Here
7b5fd8fc67 Bump version to 0.0.14 2026-05-25 21:42:30 -05:00
Me Here
d1bd996675 Player full-screen: edge-to-edge themed stage + theme toggle in stage
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>
2026-05-25 21:42:30 -05:00
Me Here
e22f267b83 Bump version to 0.0.13 2026-05-25 21:17:29 -05:00
Me Here
075fbb51a7 Player: full-screen "stage mode" with landscape lock
Add a ⛶ button (top bar) that takes the PM-1 device full-screen and locks
it to landscape — turning it into a glanceable stage display.

A single body.stage class drives the layout: top bar + load panel hidden,
OLED / beat-LEDs / transport enlarged with viewport units, plus a floating
✕ exit (the top bar is hidden in stage mode). Per platform:

- Android: requestFullscreen() + screen.orientation.lock("landscape").
- Desktop: real fullscreen; the lock harmlessly no-ops (already landscape).
- iPhone (no Fullscreen/orientation-lock API): CSS pseudo-fullscreen + a
  "⟳ rotate to landscape" overlay shown when held in portrait.

Screen Wake Lock keeps the display awake during a performance (re-acquired
on visibility change). 'F' toggles; Esc / fullscreenchange tear the stage
down and unlock cleanly. All API calls are guarded so rejections on
unsupported platforms never throw.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 21:17:29 -05:00
Me Here
77fdf9ee70 Bump version to 0.0.12 2026-05-25 19:16:13 -05:00
Me Here
a86421eb5c Player: light/dark theme so the device stands out from the background
The device case was nearly the same tone as the room — the body's
radial-gradient even peaked *lighter* than the case — so the unit blended
into the background. Added a theme toggle mirroring the editor (◐/☀/☾,
cycles system → light → dark, shares the "metronome.theme" key, with a
pre-paint head script to avoid a flash) and reworked the palette around it:

- dark: a charcoal device sits a clear step lighter than a near-black room,
  with a rim highlight + drop shadow + faint cyan glow so it reads as an object;
- light: the dark device sits on a bright "desk" card (panel + fields go light).

Device internals (OLED, beat LEDs, buttons, knob, screws) keep fixed
dark-hardware colours in both themes via --dtxt/--dmuted, so only the
environment switches.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 19:16:13 -05:00
Me Here
553a56d1ec Bump version to 0.0.11 2026-05-25 15:49:35 -05:00
Me Here
b548c64d2a Share engine, seed set lists & base CSS between editor and player
Both index.html (editor) and player.html (hardware-player mockup) now pull
their common code from src/ via a new build-time include marker
(/*@BUILD:include:src/…@*/), resolved by build.sh:

  src/engine.js   — audio voices (DRUMS×30), Web Audio scheduler primitives,
                    and the share-language codec (patch/set-list encode+decode)
  src/setlists.js — SEED_SETLISTS, so the player ships the SAME default set
                    lists as the editor (player BUILTIN = SEED_SETLISTS)
  src/base.css    — reset + VARASYS brand palette + type stack

The editor inlines the CC0 acoustic samples; the player passes an empty
SAMPLES object and the shared playInstrument falls back to its synth voices,
so the device stays faithfully synth-only. Each app keeps its own state
globals, setBpm, advanceMaster/scheduler, and UI. ~400 lines of duplicated
engine code removed; the player's favicon is now the shared @BUILD:favicon@.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:49:35 -05:00
Me Here
0ec49a0c3b Bump version to 0.0.10 2026-05-25 15:21:32 -05:00
Me Here
632890c812 Add build step (inline assets at build); drop "mockup" from the main app
The source index.html now keeps small @BUILD:* markers instead of the
~250KB of base64 blobs (audio samples, logos, favicon), which move to
assets/. build.sh inlines them into a self-contained dist/index.html
(+ dist/player.html); deploy.sh runs the build first and serves dist/.
dist/ is git-ignored. Keeps the single-file deploy while stopping the
samples from eating the editing budget.

Also reframe the main page as the full web app (it is not a mockup —
only the play-only player.html device is): drop "Mockup" from the title,
the source comment, and the README intro; add Build/Files docs and
correct the "no build step" claim.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:21:28 -05:00
Me Here
91cf48c551 Bump version to 0.0.9 2026-05-25 15:04:17 -05:00
Me Here
ec23da5164 Add hardware-device player mockup at /player.html
A self-contained simulator of the RP2040 "PM-1" unit: it plays the share
language (synth voices, same scheduler) and drives an OLED + beat-LED
display like the firmware would. Loads from a #p=/#sl= link, the editor's
saved set lists (localStorage), or a pasted patch / set-list code — with
validation. Transport: play/stop, prev/next item, tempo ±, tap; bar-count
segments auto-advance. deploy.sh now version-stamps and publishes it too.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:04:17 -05:00
Me Here
8633d535f2 Bump version to 0.0.8 2026-05-25 14:34:42 -05:00
Me Here
b189fa1fef Header: stack logo + buttons above the title on narrow screens
Below 580px the header becomes a column-reverse so the controls (theme,
help, logo) sit above the title, then the legend — all left-aligned.
Uses !important to beat the inline align-items/flex-wrap on the row.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 14:34:42 -05:00
Me Here
08c9de945f Bump version to 0.0.7 2026-05-25 14:20:58 -05:00
Me Here
7e3f36c543 Header: keyboard legend left under title; responsive wrap
- Move the shortcut legend to the left, directly under the title (was
  right-aligned), and break it into non-breaking segments so it wraps
  only between groups (at the · separators), never mid-token.
- Header row now wraps: on narrow screens the buttons + logo sit on their
  own line above the legend (controls use margin-left:auto to stay right).
- Drop the rule that hid the legend below 620px — it now shows and wraps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 14:20:58 -05:00
Me Here
1dd83065ea Bump version to 0.0.6 2026-05-25 14:04:23 -05:00
Me Here
b2982897e2 Header logo → right; fix Alt+↑/↓ reorder; non-emoji theme glyph
- Move the VARASYS logo to the right-hand control group (was left of the
  title).
- Alt+↑/↓ now seeds the cue when none is set, so reordering works without
  having to cue an item first (it was silently no-opping).
- Theme button uses plain glyphs (◐ system / ☀ light / ☾ dark) instead of
  the 🖥 emoji, which didn't render in some browsers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 14:04:23 -05:00
Me Here
964620031d Bump version to 0.0.5 2026-05-25 13:47:50 -05:00
Me Here
1e19cd4626 Add a continuous ~4:00 demo song set list
New "🎵 Song" seed list (SEED_VERSION 3): 8 bar-length segments that
auto-advance through tempo ramps (92→120 build, 132→83 outro), a 2/4
samba, a half-time shuffle, a 909 four-on-the-floor and a 16th peak —
totalling ~4:00. Also gate bar-count auto-advance on the Continue toggle
(matches its "countdown / bars" label; only bar-length items are
affected, which previously didn't exist outside this song).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 13:47:50 -05:00
Me Here
1b16a61930 Bump version to 0.0.4 2026-05-25 13:38:48 -05:00
Me Here
811891bf5a Sample the rest of the acoustic kit from VCSL (CC0)
Add embedded CC0 one-shots for toms (stick), tambourine, cowbell,
woodblock and claves; tomMid is the low tom pitched up (VCSL has only
two toms). Now 10 sampled voices. rim, open-hat and ride stay
synthesized (no clean VCSL source), as do beep/clap/jamblock and 808/909.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 13:38:48 -05:00
Me Here
8a869f14ea README: link the Codeberg repo directly in the License (§13) section
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 13:16:06 -05:00
Me Here
89e5291f0e Bump version to 0.0.3 2026-05-25 13:10:06 -05:00
Me Here
dad9a666e4 Point source links at the public Codeberg repo
In-app help "Source" link and README now reference
codeberg.org/VARASYS/metronome (the public mirror) instead of the
internal git.varasys.io.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 13:04:28 -05:00