Commit graph

288 commits

Author SHA1 Message Date
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
Me Here
6c32e05f0b Bump version to 0.0.2 2026-05-25 12:57:02 -05:00
Me Here
3213c6afe4 Remove QR sharing; README accuracy pass
Drop the QR-code share button, its external-service warning banner/CSS,
and the api.qrserver.com handler — sharing is now copy/open link only, so
the app makes no external requests at all. README: remove QR references
and the Deploy section, refresh Features/sounds/dynamics/swing, list the
808/909 voices, and note which acoustic voices use CC0 samples.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 12:54:19 -05:00
Me Here
06986e83aa Embed CC0 acoustic samples (VCSL) — kick/snare/hat/crash slice
Sample-playback engine: short one-shots are embedded as base64 WAV,
decoded to AudioBuffers at audio start; playInstrument plays the sample
when present, else falls back to synthesis. First slice covers kick,
snare, closed hat and crash from the Versilian Community Sample Library
(CC0), trimmed to mono 22.05kHz/16-bit (~117KB). More acoustic voices to
follow once the quality/size is confirmed by ear. Credit added to README.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 12:29:29 -05:00
Me Here
e07b4bc42d Add synthesized 808/909 drum-machine voices
These machines are synthesizers in reality, so synthesis is the faithful
approach. Adds 808 (kick/snare/clap/hat/open hat/cowbell/tom) and 909
(kick/snare/clap/hat/ride/crash) voices via a shared metallic-hat helper
(6 detuned squares → bandpass+highpass) plus tuned tone/noise envelopes.
Acoustic kit will move to CC0 samples (VCSL) separately.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 12:23:48 -05:00
Me Here
d3403df6c2 Add ghost-note dynamics level (4 levels) + help on local/sharing
Pads now cycle accent → normal → ghost → mute. Ghost is a soft hit
(gain 0.25) — added as new level value 3 so set lists already saved at
the 3-level stage (0/1/2 = mute/normal/accent) keep their meaning with
no migration. Share pattern gains a "g" char; the Purdie shuffle's snare
ghosts now use it. Ghost pads render faint with a · marker.

Help: explain that set lists/items/log live only in localStorage and how
to move or share them (Share set-list link / Share settings link /
Export-Import).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 11:58:33 -05:00
Me Here
8171b37e72 Split demo seed into Styles + Practice; add shuffle/samba/nañigo
Two seed set lists instead of one mixed "Demos":
- 🥁 Styles — grooves/feels: four-on-the-floor, swing ride, Purdie
  half-time shuffle (triplet grid, backbeat on 3, snare ghosts), Samba
  (2/4, surdo on 2), Nañigo (6/8 bembé bell), 6/8, 7/8, 5/4.
- 🎯 Practice — polyrhythms, triplet hats, accent demo, tempo builder,
  gap trainer.

Seed is now versioned + additive: a bumped SEED_VERSION adds any seed
list whose title isn't already present, without clobbering or re-adding
the user's lists.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 11:51:45 -05:00
Me Here
766d5d40ae Per-step accent/normal/mute dynamics + swing
Pads are now 3-state instead of on/off: click cycles accent → normal →
mute. Default keeps the first step of each beat accented (the rest
normal), so existing grooves are unchanged in feel; legacy on/off masks
migrate (on-downbeats → accent, on-subs → normal).
- Audio gain is driven per step by level (accent 1.0 / normal 0.6);
  the old auto group-start accent is replaced by explicit per-step level.
- Swing: "swing 8th / swing 16th" subdivision options apply a triplet
  (2:1) long–short feel to even subdivisions (per-lane).
- Share language: pattern uses X (accent) / x (normal) / . (mute), and
  the sub token takes a trailing s for swing (e.g. ride:4/2s). The
  default-accent pattern is omitted; legacy x/. still parse.
- Demos: "Swing ride" and an accents example.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 11:13:53 -05:00
Me Here
7a6aa1d5ba Live-performance set switching, bar-length segments, favicon
Cue/commit model for moving through a set without audible gaps:
- Arrows/Home/End/PgUp/PgDn move an amber cue cursor across set lists.
  Enter commits with a SMOOTH cutover at the next bar; Shift+Enter a
  RUDE cutover at the next beat. N/P are rude quick-steps; Esc cancels.
- One gap-free cutover (armSwitch → scheduler horizon-cap →
  performCutover) replaces the old stop()/start() switch — the audio
  clock stays continuous across every transition (manual or auto).
- Per-item bar length (b<n> patch token + Bars input) with a bar
  countdown; Continue auto-advances at the boundary (cross-list aware).
  Each segment owns its tempo/ramp and resets at the cut.
- Decouple loaded vs viewed list (loadedSL) so the playing item can
  live in a list you're not currently viewing.

Set-list panel: editable name combobox (rename in place; the ▾ menu
lists the set lists with "+ New" last), auto-growing description,
add-item row moved below the list, trimmed hint.

Add an inline SVG favicon (brand-cyan metronome on navy).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 10:31:36 -05:00
Me Here
61c933e44f Header: VARASYS tagline lockup left of title; Save tooltip
- Move the VARASYS logo to the left of the title and switch to the
  tagline-bottom lockup, with theme-aware dark/light variants swapped
  via CSS (both inlined as data URIs).
- Right-justify the theme/help buttons; drop the shortcut legend to its
  own line so the buttons no longer wrap on medium widths.
- Save button: wrap it so the tooltip shows while disabled, and make the
  tooltip dynamic (why it's disabled vs. which item it overwrites).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:05:34 -05:00
Me Here
1f957b7630 Update README: fix stale claims found in code review
- Drop the false "vendored QR library" line; state it's a single
  self-contained, zero-dependency file and document offline use.
- Fix keyboard shortcuts to match the in-app help: remove the
  non-existent R toggle, add Alt+↑/↓ (reorder), 1–9 toggles a lane.
- "GM drum voice" → synthesized; set-list items load on click (no ▶
  auto-start); QR is an external service; clarify release.sh.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:05:34 -05:00
Me Here
0142039b0e Add VARASYS logo to header
Inline the compact cyan VARASYS banner (base64 data URI) in the header,
between the shortcut legend and the theme/help buttons, linked to
varasys.io. Inlined rather than shipped as a file so deploy.sh's
single-file publish still covers it; the self-contained banner reads the
same on light and dark themes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 08:43:21 -05:00
Me Here
87f323b782 Add GNU AGPL v3 license
LICENSE holds the verbatim AGPL-3.0 text. index.html carries the SPDX
header + notice; README gains a License section noting §13 is met by the
in-app source link (git.varasys.io/VARASYS/metronome).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 08:33:40 -05:00
Me Here
c2a88e5014 Reclaim Space for play/stop; narrow the keyboard focus guard
The real conflict wasn't the key: shortcuts bailed whenever ANY form
control (slider/checkbox/menu/button) had focus, and those keep focus
after use — so P/T/A/N seemed dead most of the time.

- Guard now stands down only for text-entry fields (text/number/textarea/
  contenteditable), so shortcuts work right after you touch a slider or
  checkbox.
- Space always = play/stop (preventDefault so it won't scroll, toggle a
  focused checkbox, or re-fire a focused button) — the DAW standard,
  which also fixes the original Space/checkbox conflict.
- Arrow keys still defer to a focused range slider / select.
- Legend, help overlay, README updated back to Space.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 08:08:37 -05:00
Me Here
9cb7c2c193 Per-step pad grid (beats × subdivision); drop confusing Sig dropdown; help: repo link + offline note
- Pad row now shows beatsPerBar × subdivision pads, each individually
  toggleable (the subdivision control sets pad resolution). Subdivision
  pads render smaller; downbeats labeled; group/beat gaps preserved.
- Mask (beatsOn) is now per-step; playhead tracks the current step.
  recomputeLane remaps on grouping/subdivision change and migrates legacy
  per-beat masks (saved data, short share patterns) by expanding across subs.
- Share language: =pattern is now per-step (len = beats × sub); short
  per-beat patterns still accepted and expanded. README updated.
- Removed the Sig time-signature preset dropdown (confusing vs subdivision).
- Help dialog: link to git.varasys.io/VARASYS/metronome + note that it's a
  single-page app you can save & run offline, but file:// won't auto-save
  the set list (export a backup).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 08:01:17 -05:00
Me Here
61b5dfb6de Countdown display value inherits the large display font (was stuck at 13px via .tval)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:49:51 -05:00
Me Here
17492fdfb0 Single Save button by Tap (disabled when nothing loaded); per-entry + Clear-all history delete; bigger display text
- Move per-item 💾 out of set-list rows into one 💾 Save next to Tap; it
  overwrites the loaded item and is disabled when no item is loaded.
- History list: red ✕ on hover deletes one session; Clear all wipes
  history for the current item only.
- Bump dark-display text again (BPM 80px, timers 26px, status 19px);
  widen the display column to fit.
- README: play key Space -> P.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:45:26 -05:00
Me Here
1be6920827 Bigger display + legend text; switch play/stop from Space to P (Space conflicted with focused controls)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:39:21 -05:00
Me Here
333477afdb Timers: add enable checkbox; collapse settings + hide display readouts when off
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 19:08:28 -05:00
Me Here
a011a89100 Collapse a feature's parameters until it's enabled (hide fbody when off)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:52:36 -05:00
Me Here
ba752745b7 Per-lane enable (replacing mute), feature boxes, set-list continue mode, external QR
- Each meter lane has an 'enable' checkbox right after its number (default on,
  green-dim row when off); replaces the right-side 'mute'. Renamed mute→enabled
  throughout (scheduler, snapshot, share '!' flag, 1–9 keys, now-playing). Old
  saved data still loads (back-compat).
- Features area redesigned into highlighting boxes (Gap trainer / Tempo ramp /
  Timers); trainer & ramp boxes light up + un-dim when enabled.
- Set list 'Continue' mode: per-item countdown (saved in each item, 'cd' token),
  and when a playing item's countdown hits 0 it auto-loads the next — so a list
  with countdowns plays straight through.
- Removed the in-app QR (vendored qrcode.js); 'QR ↗' now opens api.qrserver.com
  with the link, behind a banner warning it's a third party (verify it decodes).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:47:16 -05:00
Me Here
285d78b499 Timers: show stopwatch + countdown in the BPM display; countdown blank-default, hⓂ️s input
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:35:58 -05:00
Me Here
72147f5b32 Countdown: keep counting into negative (overtime) instead of stopping at 0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:12:16 -05:00
Me Here
a447df39e9 UX: always-show set list (remove hide toggle), add practice timers, '+' add button
- Removed the set-list show/hide toggle and the R shortcut / Esc-close / close ✕.
  The panel is always visible: sticky side column on desktop, stacked below the
  metronome on mobile. Theme/help buttons stay right-justified.
- Added practice timers in the gap/ramp area: an Elapsed (count-up) timer and an
  adjustable Countdown (minutes; 0 = off), each with a reset. Both advance only
  while the metronome runs; countdown reaching 0 stops it (turns amber under 10s).
- '+ Add meter' button is now just '+'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:10:40 -05:00
Me Here
7010ba7cb8 Move live status into the display under the BPM (drop bottom status line)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:01:55 -05:00
Me Here
3f04383e2b UX: select-to-load set-list items; now-playing info block; drop preset dropdown
- Set-list rows are now click-to-load (the transport is the only play/stop); the
  per-item ▶/⏹ and ↑/↓ buttons are gone. Reorder via Alt+↑/↓ (tooltip + help).
  Selected row is highlighted and reveals compact 💾 (save-back) / ✕ (remove).
- Replaced the main-screen preset dropdown with a 'Now loaded' info block showing
  the item name, config summary, and the set list's title + description.
- Presets consolidated into set-list items (removed preset functions/UI). N loads
  the next item; shortcuts help + demo description updated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:55:58 -05:00
Me Here
7207ffe1c7 Add 'Reset everything' to the set-list menu (confirm + wipe localStorage)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:38:02 -05:00
Me Here
5320da4325 Add QR share dialog (vendored qrcode.js) + README documenting the language
- Share menu now opens a dialog with a copyable link AND a QR code (scan to open
  on a phone); generated locally by vendored qrcode-generator (MIT). deploy.sh
  publishes qrcode.js alongside index.html.
- README documents the share language grammar, sounds, URL forms, shortcuts,
  versioning and deploy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:34:26 -05:00
Me Here
6910f31a2f Add shareable meter language + share menu + demo set list
- Compact human-readable patch language encodes tempo, lanes (sound/grouping/
  subdivision/pattern/poly/mute) and practice settings (trainer, ramp).
- Share menu (⋯) copies links: settings as #p=<patch> (readable) and a whole
  set list as #sl=<base64url>. Opening such a link applies/imports it on load.
- Seeds a ' Demos' set list (once) with 10 examples authored in the language:
  grooves, 5:4 / 3:2 / 3-lane polyrhythms, 7/8 6/8 5/4, triplets, ramp, trainer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:27:26 -05:00
Me Here
c0b6628488 Layout: dock the set-list panel beside the metronome (push, not overlay)
- App is now a flex shell (#app): the set-list panel docks as a sticky side
  column that pushes the metronome instead of floating over it.
- Collapses via the header 'Set Lists' toggle; falls back to an overlay drawer
  below 820px. Defaults open on desktop, closed on mobile.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:17:44 -05:00
Me Here
c087f11637 Theme: add System (OS-follow) option; fix light-theme playhead ring (was white-on-white)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:10:54 -05:00
Me Here
a7770eaf47 Add versioning: VERSION file, dev/formal stamping, release.sh
- VERSION holds the formal version (0.0.1), single source of truth.
- deploy.sh stamps the served HTML: "X.Y.Z" on a clean commit tagged v<VERSION>,
  else "X.Y.Z-dev.<utc-ts>.<sha>[.dirty]".
- index.html shows the build version in the header badge (APP_VERSION).
- release.sh cuts a formal release (sets VERSION + tags v<VERSION>).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 16:59:31 -05:00
Me Here
38d860b4dd Refine mockup: set lists, per-beat patterns, theming, shortcuts
- Tempo ramp gains a start BPM and signed (up/down) steps.
- Presets and set-list items now capture practice settings (trainer + ramp).
- Set-list items: per-item ▶/⏹ play, 💾 save-back, per-item history view.
- Log & backup moved into a ⋯ menu; "+ Add meter" moved below the lanes.
- Light/dark theming (OS-aware + toggle, persisted) and mobile/desktop responsive layout.
- Keyboard shortcuts (Space/T/↑↓/A/R/N/1-9/?) + help overlay; fixed dead Tap button.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 16:35:17 -05:00
Me Here
49c8584c8c Add stackable metronome mockup and Caddy deploy script
index.html: single-file browser mockup of the polymetric groove trainer —
stackable meter lanes, subdivisions, odd-meter grouping, per-beat patterns,
GM percussion voices, true ratio polyrhythm (poly toggle), presets, set
lists with a recordable practice log, and keyboard shortcuts.

deploy.sh: copies index.html into the Caddy web root that serves
https://metronome.varasys.io (no restart needed).

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