- Clipping: min width per bar raised (16ths 420px, 8ths 330px, quarters
240px) and format width reserves more room (clef/key 100px, barline
margin 24px) — narrow screens now wrap into more rows with real margins
instead of clipping the last bar.
- 6/8 crash ROOT CAUSE: Giuliani figures whose length didn't divide the
bar into renderable note values produced 96-tick durations (32nd-ish)
that durationCode can't spell -> renderer threw -> white screen.
Giuliani generator now snaps figure subdivision to renderable durations
(per 2/3/4 divisions, quarter-note walk as last resort); pimamim in
6/8 renders as a walking quarter figure.
- 6/8 melody templates: fixed sums (were 2640/3120 in 4 templates — those
filtered out, silently degrading to the fallback).
- More variants: arpeggio figures 1-3-5-3, 1-2-1-3-2-1, 1-5-4-5-3-5,
1-3-2-5-3-2; Giuliani patterns p-i-a-i, p-m-a-m-i, p-i-m-a-m-i (waltz),
p-i-m-a-i-a.
- Tests 179/179.
- PhraseSheetMusic: min width per bar scales with notation density
(16ths 320px, 8ths 260px, quarters 210px) — narrow screens wrap into
more rows instead of clipping notes off-screen.
- 6/8 crash fixed at the root: melody templatesFor had no 6/8 templates
(empty pool -> pick on empty array). Added 6/8 template sets for levels
1/2 plus an empty-pool fallback guard so generators can never pick from
an empty array again (any meter/level combination stays playable).
- More arpeggio broken-chord figures: 1-3-5-3, 1-2-1-3-2-1, 1-5-4-5-3-5,
1-3-2-5-3-2.
- More Giuliani patterns: p-i-a-i (wide), p-m-a-m-i, p-i-m-a-m-i (waltz
feel), p-i-m-a-i-a.
- Tests 179/179.
- NEW material 'giuliani': figures require a real voicing — the generator
assigns cycle positions (bass root + upper chord tones) to DISTINCT
strings with valid frets per bar; bars that cannot be voiced are skipped
(deterministic), clear error when nothing fits. Patterns: p-i-m, p-i-m-a,
p-a-m-i, a-i-m, p-i-m-a-m-i, p-m-a-m-i-m. Honors the chord pool, string
restrictions and the tuning; one figure per beat.
- 6/8 meter added (numerator 6) across score model, settings, generators;
meter selects now offer 4/4, 3/4, 6/8.
- Arpeggio category: Giuliani entries replaced with note-sequence
broken-chord figures (1-3-2-1, 1-3-2-5(8), 1-5-3-5(8), 1-2-3-5-3) —
pure pitch sequences, no voicing claims.
- Beam fix (root cause): setBeam now happens BEFORE voice.draw — VexFlow
decides flag vs beam at draw time; registering after drawing left both
flag and beam. Beams drawn after notes, flags suppressed correctly.
- MetronomeWidget rebuilt cleanly: ONE 'Click sound' checkbox (the earlier
restructure left duplicated option rows behind — neither worked). Widget
body always visible (dimmed when disarmed); toggle arms sound+pendulum.
- Click decision unified: 'sync to metronome' derives phrase clickSound
from the widget's sound checkbox (no separate phrase click option);
'at your pace' clicks when the metronome is armed.
- Chord selection: abwählbare Liste (arpeggioChordSelection) restricts
progression chords; first bar draws a random chord FROM THE SELECTION
(fixed first chord repeated the exercise identically).
- Scales: rhythm setting (quarters/eighths) shared with arpeggios;
drill id includes rhythm to invalidate cached scores.
- Beam fix: register Beam via note.setBeam so VexFlow suppresses flags
(eighths/16ths previously drew BOTH beam and flag).
- Sequence mode: bars (2/4/6/8) with one chord per bar, chosen by
functional rules (I->IV/V/vi...), diatonic cycle, or random (no immediate
repeats); deterministic via melody seed. Chord symbols per bar in the
score model (chordSymbols) rendered above the staff via setSection.
- Rhythm: quarters or eighths (cycling up/down through the pattern).
- Single-chord mode unchanged (whole path, overflow bars if needed).
- Auto-start: 'Start on first note (no count-in)' — step pace begins the
run as soon as the mic detects the first note; no start press needed.
- 'New' button re-rolls the progression (new seed).
- Tests 174/174.
durationCode returned '4d'/'2d' codes but VexFlow only reads the base
duration for glyph/spacing — the dot must be attached explicitly via
Dot.buildAndAttach. Dotted notes rendered without dots, which read like
extra plain quarters ('five quarters in bar 2'). Now dotted notes/rests
show their dot; spacing uses the base code correctly.
- Metronome/phrase: 'With tempo' renamed to 'Sync to metronome' (auto-enables
the metronome when selected); phrase click now yields to the metronome
click (no more double clicks) with an explicit opt-out checkbox.
- Count-in: subtle numeric badge next to the status line (muted pill, 11px).
- Melody rhythm level 3 'Elaborate': sixteenth/dotted-eighth templates for
4/4 and 3/4; renderer supports 120/360-tick codes and beams 16th pairs.
- Transpose control for library/import material widened to ±2 octaves.
- Tests 161/161 (bar-total invariants hold over 500 seeds at level 2).