feat: added metronome feature

This commit is contained in:
Xiaohan-Tian
2026-04-19 17:00:10 -07:00
parent f0a2f06295
commit 0ac39068b2
5 changed files with 184 additions and 3 deletions
+21
View File
@@ -59,6 +59,7 @@ interface ProjectState {
keySignature: KeySignature;
selectedMode: string;
isLooping: boolean;
isMetronomeEnabled: boolean;
loopingRange: [number, number]; // [startBar, endBar] - bar indices (0-based)
playheadPosition: number; // in beats
isPlaying: boolean;
@@ -119,6 +120,7 @@ interface ProjectState {
startPlaying: () => Promise<void>;
stopPlaying: () => Promise<void>;
toggleLoop: () => void;
toggleMetronome: () => void;
setBpm: (bpm: number) => void;
setMaxBars: (maxBars: number) => void;
setBarWidthMultiplier: (multiplier: number) => void;
@@ -269,6 +271,7 @@ export const useProjectStore = create<ProjectState>((set, get) => {
keySignature: currentProject.getKeySignature(),
selectedMode: currentProject.getSelectedMode(),
isLooping: currentProject.getIsLooping(),
isMetronomeEnabled: false,
loopingRange: currentProject.getLoopingRange(),
playheadPosition: KGCore.instance().getPlayheadPosition(),
isPlaying: KGCore.instance().getIsPlaying(),
@@ -780,6 +783,24 @@ export const useProjectStore = create<ProjectState>((set, get) => {
toggleLoop(isLooping, loopingRange, maxBars);
},
toggleMetronome: () => {
const { isMetronomeEnabled, isPlaying, timeSignature } = get();
const newValue = !isMetronomeEnabled;
set({ isMetronomeEnabled: newValue });
const audio = KGAudioInterface.instance();
audio.setMetronomeEnabled(newValue);
if (isPlaying) {
if (newValue) {
const currentBeat = KGCore.instance().getPlayheadPosition();
audio.startMetronomeDuringPlayback(currentBeat, timeSignature.numerator);
} else {
audio.stopMetronomeDuringPlayback();
}
}
},
setBpm: (bpm: number) => {
try {
// Create and execute the change project property command