Clicks are short noise bursts, not pitched tones — but speaker bleed can still disturb the microphone. Headphones recommended.
diff --git a/src/exercises/library.ts b/src/exercises/library.ts index 207f663..55bfdb6 100644 --- a/src/exercises/library.ts +++ b/src/exercises/library.ts @@ -18,6 +18,19 @@ import firstPositionRaw from './library/first-position-study.abc?raw'; import eMinorRaw from './library/e-minor-study.abc?raw'; import dottedRaw from './library/dotted-rhythm-study.abc?raw'; import brokenChordRaw from './library/broken-chord-study.abc?raw'; +import jingleRaw from './library/jingle-bells.abc?raw'; +import maryRaw from './library/mary-had-a-little-lamb.abc?raw'; +import londonRaw from './library/london-bridge.abc?raw'; +import cMajorRunRaw from './library/c-major-run.abc?raw'; +import thirdsRaw from './library/thirds-study.abc?raw'; +import aMinorArpRaw from './library/a-minor-arpeggio-study.abc?raw'; +import waltzRaw from './library/waltz-study.abc?raw'; +import eMinorPentRaw from './library/e-minor-pentatonic-run.abc?raw'; +import dottedEighthRaw from './library/dotted-eighth-study.abc?raw'; +import mixedRhythmRaw from './library/mixed-rhythm-study.abc?raw'; +import fMajorRaw from './library/f-major-study.abc?raw'; +import bbMajorRaw from './library/bb-major-study.abc?raw'; +import descendingRaw from './library/descending-study.abc?raw'; export interface ExerciseInfo { readonly id: string; @@ -30,9 +43,22 @@ export interface ExerciseInfo { export const EXERCISES: ExerciseInfo[] = [ { id: 'ode-to-joy', label: 'Ode to Joy (Theme)', level: 'beginner', abc: odeRaw }, { id: 'twinkle', label: 'Ah! vous dirai-je, maman', level: 'beginner', abc: twinkleRaw }, + { id: 'jingle-bells', label: 'Jingle Bells (Opening)', level: 'beginner', abc: jingleRaw }, + { id: 'mary-had-a-little-lamb', label: 'Mary Had a Little Lamb', level: 'beginner', abc: maryRaw }, + { id: 'london-bridge', label: 'London Bridge (First Phrase)', level: 'beginner', abc: londonRaw }, { id: 'first-position-study', label: 'First Position Study', level: 'beginner', abc: firstPositionRaw }, + { id: 'c-major-run', label: 'C Major Run', level: 'beginner', abc: cMajorRunRaw }, + { id: 'thirds-study', label: 'Thirds Study', level: 'beginner', abc: thirdsRaw }, + { id: 'waltz-study', label: 'Waltz Study (3/4)', level: 'beginner', abc: waltzRaw }, { id: 'e-minor-study', label: 'E Minor Study', level: 'intermediate', abc: eMinorRaw }, + { id: 'e-minor-pentatonic-run', label: 'E Minor Pentatonic Run', level: 'intermediate', abc: eMinorPentRaw }, { id: 'dotted-rhythm-study', label: 'Dotted Rhythm Study', level: 'intermediate', abc: dottedRaw }, + { id: 'dotted-eighth-study', label: 'Dotted Eighth Study', level: 'intermediate', abc: dottedEighthRaw }, + { id: 'mixed-rhythm-study', label: 'Mixed Rhythm Study', level: 'intermediate', abc: mixedRhythmRaw }, + { id: 'f-major-study', label: 'F Major Study', level: 'intermediate', abc: fMajorRaw }, + { id: 'bb-major-study', label: 'Bb Major Study', level: 'intermediate', abc: bbMajorRaw }, + { id: 'a-minor-arpeggio-study', label: 'A Minor Arpeggio Study', level: 'intermediate', abc: aMinorArpRaw }, + { id: 'descending-study', label: 'Descending Study', level: 'intermediate', abc: descendingRaw }, { id: 'broken-chord-study', label: 'Broken Chord Study', level: 'intermediate', abc: brokenChordRaw }, ]; diff --git a/src/exercises/library/a-minor-arpeggio-study.abc b/src/exercises/library/a-minor-arpeggio-study.abc new file mode 100644 index 0000000..c0aaed3 --- /dev/null +++ b/src/exercises/library/a-minor-arpeggio-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise: A minor broken chords (project contributor, 2026, CC0). +X:12 +T:A Minor Arpeggio Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:Am +A, C E C | A, C E A | G, B, D B, | G, B, D G | F, A, C A, | F, A, C F | E, G, B, G, | E, G, B, E |] diff --git a/src/exercises/library/bb-major-study.abc b/src/exercises/library/bb-major-study.abc new file mode 100644 index 0000000..4e35ff2 --- /dev/null +++ b/src/exercises/library/bb-major-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise in _B major (two flats) (project contributor, 2026, CC0). +X:18 +T:_B Major Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:_B +_B, C D _E | F G F D | _B, C D F | G F D _B, | C D _E F | G F _E C | D _E F G | F2 D2 |] diff --git a/src/exercises/library/c-major-run.abc b/src/exercises/library/c-major-run.abc new file mode 100644 index 0000000..7a18f0e --- /dev/null +++ b/src/exercises/library/c-major-run.abc @@ -0,0 +1,11 @@ +% Original technical exercise (project contributor, 2026, CC0). +% C major, steady quarters — a gentle reading warm-up. +X:10 +T:C Major Run +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:C +C D E F | G A B c | c B A G | F E D C |] diff --git a/src/exercises/library/descending-study.abc b/src/exercises/library/descending-study.abc new file mode 100644 index 0000000..ed5a7a2 --- /dev/null +++ b/src/exercises/library/descending-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise: descending lines in A minor (project contributor, 2026, CC0). +X:19 +T:Descending Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:Am +c B A G | F E D C | B, C D E | F E D C | A G F E | D C B, A, | B, C D E | A2 z2 |] diff --git a/src/exercises/library/dotted-eighth-study.abc b/src/exercises/library/dotted-eighth-study.abc new file mode 100644 index 0000000..e5dee47 --- /dev/null +++ b/src/exercises/library/dotted-eighth-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise: dotted quarter + eighth figures (project contributor, 2026, CC0). +X:15 +T:Dotted Eighth Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=70 +K:G +G3/2 A/2 B G | D3/2 E/2 G B | A3/2 B/2 c A | E3/2 ^F/2 A c | B3/2 A/2 G ^F | E3/2 D/2 B, A, | G,3/2 A,/2 B, D | G2 z2 |] diff --git a/src/exercises/library/e-minor-pentatonic-run.abc b/src/exercises/library/e-minor-pentatonic-run.abc new file mode 100644 index 0000000..52d733e --- /dev/null +++ b/src/exercises/library/e-minor-pentatonic-run.abc @@ -0,0 +1,10 @@ +% Original technical exercise: E minor pentatonic (project contributor, 2026, CC0). +X:14 +T:E Minor Pentatonic Run +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=90 +K:Em +E G A B | d B A G | E D B, A, | B, D E2 | G A B d | B A G E | D B, A, B, | E2 z2 |] diff --git a/src/exercises/library/f-major-study.abc b/src/exercises/library/f-major-study.abc new file mode 100644 index 0000000..7443050 --- /dev/null +++ b/src/exercises/library/f-major-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise in F major (one flat) (project contributor, 2026, CC0). +X:17 +T:F Major Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:F +F G A _B | c d c A | F G A c | d c A F | G A _B c | d c _B G | A _B c d | c2 A2 |] diff --git a/src/exercises/library/jingle-bells.abc b/src/exercises/library/jingle-bells.abc new file mode 100644 index 0000000..37dc6be --- /dev/null +++ b/src/exercises/library/jingle-bells.abc @@ -0,0 +1,13 @@ +% Jingle Bells — opening phrase. James Lord Pierpont, 1857; public domain. +% Transcription: project contributor, 2026 (CC0). Opening 4 bars only. +% Pitch convention: concert pitch. +X:7 +T:Jingle Bells (Opening) +C:James Lord Pierpont (1857) +S:Public domain since publication; opening phrase +Z:Project contributor, 2026 (CC0 transcription) +M:4/4 +L:1/4 +Q:1/4=120 +K:C +E E E2 | E E E2 | E G C D | E2 z2 |] diff --git a/src/exercises/library/london-bridge.abc b/src/exercises/library/london-bridge.abc new file mode 100644 index 0000000..da8f788 --- /dev/null +++ b/src/exercises/library/london-bridge.abc @@ -0,0 +1,13 @@ +% London Bridge Is Falling Down — traditional English nursery rhyme. +% Traditional tune: public domain. Transcription: project contributor, 2026 (CC0). +% Adaptation: the first two-measure phrase, repeated as the tune itself does. +X:9 +T:London Bridge (First Phrase) +C:Traditional (English nursery rhyme) +S:Common version of the tune +Z:Project contributor, 2026 (CC0 transcription); adaptation: first phrase, repeated +M:4/4 +L:1/4 +Q:1/4=100 +K:C +G A G F | E F G2 | D E F2 | E F G2 | G A G F | E F G2 | D E F2 | E F G2 |] diff --git a/src/exercises/library/mary-had-a-little-lamb.abc b/src/exercises/library/mary-had-a-little-lamb.abc new file mode 100644 index 0000000..6ab81dc --- /dev/null +++ b/src/exercises/library/mary-had-a-little-lamb.abc @@ -0,0 +1,12 @@ +% Mary Had a Little Lamb — traditional nursery melody (19th century). +% Traditional tune: public domain. Transcription: project contributor, 2026 (CC0). +X:8 +T:Mary Had a Little Lamb +C:Traditional +S:Common nursery-rhyme version +Z:Project contributor, 2026 (CC0 transcription) +M:4/4 +L:1/4 +Q:1/4=100 +K:C +E D C D | E E E2 | D D D2 | E G G2 | E D C D | E E E E | D D E D | C2 z2 |] diff --git a/src/exercises/library/mixed-rhythm-study.abc b/src/exercises/library/mixed-rhythm-study.abc new file mode 100644 index 0000000..d1e3b9e --- /dev/null +++ b/src/exercises/library/mixed-rhythm-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise mixing paired eighths and quarters (project contributor, 2026, CC0). +X:16 +T:Mixed Rhythm Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:C +C C D/2 E/2 F | G G A/2 B/2 c | c B A/2 G/2 F | E E D2 | F F G/2 A/2 B | c c B/2 A/2 G | A G F/2 E/2 D | C2 z2 |] diff --git a/src/exercises/library/thirds-study.abc b/src/exercises/library/thirds-study.abc new file mode 100644 index 0000000..0590cf2 --- /dev/null +++ b/src/exercises/library/thirds-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise: melody in thirds (project contributor, 2026, CC0). +X:11 +T:Thirds Study +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:4/4 +L:1/4 +Q:1/4=80 +K:C +C E D F | E G F A | G B A c | B c B2 |] diff --git a/src/exercises/library/waltz-study.abc b/src/exercises/library/waltz-study.abc new file mode 100644 index 0000000..26ab4ef --- /dev/null +++ b/src/exercises/library/waltz-study.abc @@ -0,0 +1,10 @@ +% Original technical exercise in 3/4 (project contributor, 2026, CC0). +X:13 +T:Waltz Study (3/4) +C:Original exercise (project contributor) +Z:Project contributor, 2026 (CC0) +M:3/4 +L:1/4 +Q:1/4=90 +K:C +C E G | c2 G | A G F | E2 C | D F A | c2 A | G F E | D2 C |] diff --git a/src/hooks/usePhraseTrainer.ts b/src/hooks/usePhraseTrainer.ts index 59ddf18..79939cb 100644 --- a/src/hooks/usePhraseTrainer.ts +++ b/src/hooks/usePhraseTrainer.ts @@ -30,7 +30,6 @@ export interface PhraseTrainerConfig { readonly pace: 'step' | 'tempo'; readonly bpm: number; readonly clickSound: boolean; - readonly repeat: boolean; readonly inputMode: 'mic' | 'virtual'; readonly previewVolume?: number; } @@ -47,7 +46,6 @@ const LOOKAHEAD_S = 0.1; const CLICK_VOLUME = 0.4; const PREVIEW_GROUP = 'phrase-preview'; const CLICK_GROUP = 'phrase-clicks'; -const REPEAT_DELAY_MS = 1400; /** Longest a sustained episode may block a repeated note in at-your-pace mode. */ const REARM_AFTER_SUSTAINED_MS = 2500; @@ -106,6 +104,7 @@ export function usePhraseTrainer( const windowIdxRef = useRef(0); const scoreStartRef = useRef(0); const spbRef = useRef(1); + const countInBeatsRef = useRef(0); const runTokenRef = useRef(0); const repeatTimerRef = useRef