Newbie here, I'm trying to make a Javascript metronome, but I'm stuck on making the sound play according to the current bpm of the project
Here's where I think the problem lies, when I press play, it sounds, but in a fixed bpm, that is not the one being inputted in the bpm variable:
//VARIABLES
let bpm = 150;
let soundInterval = (60/bpm)*1000;
//FUNCTIONS
//START METRONOME
let startStopMetronome = startButton.addEventListener('click', () => {
startMetronome(soundInterval);
})
function startMetronome(si) {
setTimeout(() => {
primaryBeat.play();
startMetronome(si);
},si);
}
UPDATE:
I´ve tried making the soundInterval update with a function, but it still does the same, and plays the same fixed interval no matter the bpm changes
//VARIABLES
let bpm = 150;
let soundInterval;
//FUNCTIONS
//START METRONOME
let startStopMetronome = startButton.addEventListener('click', () => {
soundInterval = calculateSoundInterval();
startMetronome(soundInterval);
})
function startMetronome(si) {
setTimeout(() => {
primaryBeat.play();
startMetronome(si);
},si);
}
let calculateSoundInterval = () => {
return (60/bpm)*1000;
}
let updateBpmInDisplay = display.addEventListener('change', ()=> {
soundInterval = calculateSoundInterval();
})
I thought it might be fun to look over how I would accomplish this. I used an AudioContext and oscillator to make the sound, and instead of using setTimeout directly I used a helper function to model async practice. If I wanted to improve upon this, I might hold onto my timeout in a higher scope, so when stop is pressed I could clear the timeout and prevent any bugs when pressing stop and start quickly to have two loops running at the same time. I hope my take on things has some value was fun to look at.