mirror of
https://github.com/9x/sheetmusictrainer.git
synced 2026-11-03 22:03:54 +01:00
Fix double metronome click in single-note modes
useGameLogic's own scheduler and the footer widget's scheduler both played audible clicks while rhythm.active — assist->learn-notes switch made the second one mount. Now the widget is the single click source in non-zen modes; useGameLogic's scheduler is a silent tick source for auto-advance (full sound only in zen mode, where the widget isn't rendered). Also: widget honors Timer mode (60/seconds) like the trainer, and useMetronome skips audio nodes at volume 0.
This commit is contained in:
@@ -85,7 +85,11 @@ export const useGameLogic = (
|
||||
|
||||
const { restart: restartMetronome } = useMetronome({
|
||||
bpm: effectiveBpm,
|
||||
volume: settings.rhythm.sound ? settings.rhythm.volume : 0,
|
||||
// Audible clicks come from the shared footer widget (Controls) in
|
||||
// non-zen single-note modes — this scheduler is only the tick source
|
||||
// for auto-advance. Sounding it here too doubles every beat. In zen
|
||||
// mode the widget isn't rendered, so this scheduler IS the click.
|
||||
volume: settings.zenMode && settings.rhythm.sound ? settings.rhythm.volume : 0,
|
||||
playing: settings.rhythm.active,
|
||||
onTick: handleTick
|
||||
});
|
||||
|
||||
@@ -34,6 +34,8 @@ export function useMetronome({ bpm, volume, playing, onTick }: MetronomeOptions)
|
||||
|
||||
const playClick = useCallback((time: number) => {
|
||||
if (!audioContext.current) return;
|
||||
onTickRef.current(currentBeat.current);
|
||||
if (volume <= 0) return; // silent tick source — no audio nodes needed
|
||||
|
||||
const osc = audioContext.current.createOscillator();
|
||||
const gainNode = audioContext.current.createGain();
|
||||
|
||||
Reference in New Issue
Block a user