Skip to content

Guidonica 2026.10.2

Choose a tag to compare

@github-actions github-actions released this 07 Oct 02:15
· 10 commits to main since this release

Sing against a drone on any note and at Baroque or modern pitch, and read early music in half-note meters, from 2/2 alla breve to 12/4.

Added

  • Half-note time signatures for early music. A Half-note beat switch in Settings → Staff and in the welcome guide turns 4/4, 3/4, 2/4, 6/8, 9/8 and 12/8 into 4/2, 3/2, 2/2 (alla breve), 6/4, 9/4 and 12/4, with half-note clicks, breves and the breve rest (ADR 0090).
  • A drone to sing against: a steady shruti box or pad on any note, with its own volume, in Settings → Practice. Mute silences it too, and it sounds through the count-in so you hear the tonic before the first note. Exercise links carry the drone note (ADR 0092).
  • Common-time and alla breve signs: Settings → Staff can write 4/4 as C and 2/2 as ¢ (ADR 0093).
  • Tune the drone to A = 415, 430, 442 or 466 Hz besides 440, for Baroque, Classical or Renaissance pitch, in Settings → Practice. Exercise links carry it (ADR 0094).
  • Press D to turn the drone on and off.

Changed

  • The Compound pulse setting is now called Pulse and also works in half-note meters: the click follows the beat or each subdivision (ADR 0090).

Fixed

  • Scrolling notation is smooth on high-refresh displays and in Firefox, where it could stutter (ADR 0089).
  • Scrolling no longer hitches on each metronome click or when a new bar is drawn, on displays up to 144 Hz (ADR 0091).
  • Guidonica opens with its default settings instead of failing to start when Firefox or Safari blocks site data (ADR 0096).
  • On a wide screen, Settings now open beside the staff on the first visit, however fast the fonts load (ADR 0096).
  • Scrolling is smooth in Firefox with fingerprinting protection on, and in Tor and Mullvad Browser (ADR 0096).

Internal

  • ADR 0089 documents the frame-locked audio clock; SPEC.md §5 and AGENTS.md §1 describe it.
  • ADR 0090 documents the half-note beat meters. Meters gain a beatGroup (metric beats per felt beat), the compoundPulse setting becomes pulse (beat or division; old settings and links still load), and the beat lights group by beatGroup.
  • ADR 0091 documents jank-free beat and measure frames: compositor-only beat lights, VexFlow measures rendered in idle callbacks, an idempotent syncUI, and cached canvas gradients and dark-mode query; SPEC.md §3 and §5 and AGENTS.md §1 describe it.
  • ADR 0092 documents the drone, including why the tanpura timbre was retired (its pluck cycle ignored the tempo): src/audio/drone.ts voices on a drone bus beside the click's master gain, the droneNote, droneSound and droneVolume settings and the additive drone= link parameter; SPEC.md §5 and §6, AGENTS.md §1 and §2 and the README describe it.
  • ADR 0093 documents the C and ¢ signs: timeSignatureSpec spells 4/4 and 2/2 for VexFlow when the new meterSigns setting is on, display only, left out of links; SPEC.md §2 and §6 and the README describe it.
  • ADR 0094 documents the drone tuning: the referencePitch setting (REFERENCE_PITCHES), droneFrequency(pc, a4), MetronomeEngine.setReferencePitch and the additive a4= link parameter; SPEC.md §5 and §6 and the README describe it.
  • ADR 0094 §5 records the D shortcut: applyDroneNote serves the drone select and the key, and the last note lives in memory only.
  • ADR 0095: a zero-latency soft clipper on the output keeps click plus drone below full scale (src/audio/output.ts).
  • AGENTS.md bundle figures follow the build: ~135 kB of gzipped JS (~41.5 kB app code), ~6.4 kB per extra language.
  • ADR 0096 documents cross-engine support: Chromium 105+, Firefox 115 ESR+ and Safari / iOS 16+, verified in Blink, Gecko and WebKit, with feature-detected fallbacks only; README §17 and SPEC.md §6 state the baseline.
  • build.target in vite.config.ts is the support baseline (chrome105, firefox115, safari16) instead of Vite's implicit default; app JS shrinks from 41.6 to 40.8 kB gzipped, and AGENTS.md follows (~134 kB of gzipped JS).
  • The run-guidonica driver takes --browser chromium|firefox|webkit and --setup [engine…]; chromium.mjs gains findBrowser(engine).

Full changes: v2026.10.1...v2026.10.2