strumming-metronome
Version:
A simple JavaScript metronome for strumming practice.
87 lines (78 loc) • 3.29 kB
JavaScript
import { metronomeTables } from './constants.js';
export function setupButtonToggles(metronomeTable) {
metronomeTable.querySelectorAll(".metronome-arrow-up-btn").forEach(button => {
button.addEventListener("click", () => {
button.classList.toggle("metronome-selected-button");
if (button.firstElementChild.className === "metronome-arrow-up-black-icon") {
button.firstElementChild.className = "metronome-arrow-up-blue-icon";
} else {
button.firstElementChild.className = "metronome-arrow-up-black-icon";
}
});
});
metronomeTable.querySelectorAll(".metronome-arrow-down-btn").forEach(button => {
button.addEventListener("click", () => {
button.classList.toggle("metronome-selected-button");
if (button.firstElementChild.className === "metronome-arrow-down-black-icon") {
button.firstElementChild.className = "metronome-arrow-down-blue-icon";
} else {
button.firstElementChild.className = "metronome-arrow-down-black-icon";
}
});
});
}
export function resetVisualStates(beats, downQuarterBeatButtons, upQuarterBeatButtons) {
beats.forEach(beat => beat.style.color = "black");
downQuarterBeatButtons.forEach(btn => {
if (btn.classList.contains("metronome-selected-button")) {
btn.firstElementChild.className = "metronome-arrow-down-blue-icon";
} else {
btn.firstElementChild.className = "metronome-arrow-down-black-icon";
}
btn.classList.remove("metronome-active-btn");
});
upQuarterBeatButtons.forEach(btn => {
if (btn.classList.contains("metronome-selected-button")) {
btn.firstElementChild.className = "metronome-arrow-up-blue-icon";
} else {
btn.firstElementChild.className = "metronome-arrow-up-black-icon";
}
btn.classList.remove("metronome-active-btn");
});
}
export function setPlayingState(icon, text, button) {
icon.classList.remove("metronome-play-icon");
icon.classList.add("metronome-stop-icon");
text.textContent = "Stop";
button.classList.add("running");
}
export function setStoppedState(icon, text, button) {
icon.classList.remove("metronome-stop-icon");
icon.classList.add("metronome-play-icon");
text.textContent = "Play";
button.classList.remove("running");
}
export function setControlsEnabled(enabled, timeSignature, bpmInput, upQuarterBeatButtons, downQuarterBeatButtons, subdivision) {
if (enabled) {
timeSignature.removeAttribute("disabled");
bpmInput.removeAttribute("disabled");
if (subdivision) {
subdivision.removeAttribute("disabled");
}
upQuarterBeatButtons.forEach(btn => btn.removeAttribute("disabled"));
downQuarterBeatButtons.forEach(btn => btn.removeAttribute("disabled"));
} else {
timeSignature.setAttribute("disabled", true);
bpmInput.setAttribute("disabled", true);
if (subdivision) {
subdivision.setAttribute("disabled", true);
}
upQuarterBeatButtons.forEach(btn => btn.setAttribute("disabled", true));
downQuarterBeatButtons.forEach(btn => btn.setAttribute("disabled", true));
}
}
export function injectTable(timeSelection) {
const metronomeTable = document.querySelector("#metronome-table");
metronomeTable.innerHTML = metronomeTables[timeSelection];
return metronomeTable;
}