Dataset/JS/Piano_NativeJS/script.js (65 lines of code) (raw):
const soundMapper = {
c: new Audio(`./assets/audio/a.mp3`),
d: new Audio(`./assets/audio/d.mp3`),
e: new Audio(`./assets/audio/e.mp3`),
f: new Audio(`./assets/audio/f.mp3`),
g: new Audio(`./assets/audio/g.mp3`),
a: new Audio(`./assets/audio/a.mp3`),
b: new Audio(`./assets/audio/b.mp3`),
'c♯': new Audio(`./assets/audio/c♯.mp3`),
'd♯': new Audio(`./assets/audio/d♯.mp3`),
'f♯': new Audio(`./assets/audio/f♯.mp3`),
'g♯': new Audio(`./assets/audio/g♯.mp3`),
'a♯': new Audio(`./assets/audio/a♯.mp3`),
}
let played = [];
function play(event) {
const isKeyboard = event instanceof KeyboardEvent;
const pianoEl = isKeyboard ? document.querySelector(`.piano-key[data-letter=${event.key.toUpperCase()}]`) : event.target;
if (!pianoEl) return;
const note = pianoEl.dataset.note;
if (!note || played.includes(note)) return;
pianoEl.classList.add('piano-key-active')
const sound = soundMapper[note]
sound.currentTime = 0
sound.play()
played.push(note);
}
function resetActive(event) {
const isKeyboard = event instanceof KeyboardEvent;
const pianoEl = isKeyboard ? document.querySelector(`.piano-key[data-letter=${event.key.toUpperCase()}]`) : event.target;
if (!pianoEl) return;
pianoEl.classList.remove('piano-key-active')
played = played.filter(note => note !== (pianoEl.dataset.note))
}
const btnContainer = document.querySelector(`.btn-container`)
btnContainer.addEventListener('click', change)
const piano = document.querySelector(`.piano`)
function change(event) {
document.querySelector('.btn-active').classList.remove('btn-active')
event.target.classList.add('btn-active')
if (event.target.classList.contains('btn-letters')) {
piano.classList.add('letters')
} else {
piano.classList.remove('letters')
}
}
document.addEventListener('keydown', play)
document.addEventListener('keyup', resetActive)
piano.addEventListener('mousedown', play)
piano.addEventListener('mouseup', resetActive)
piano.addEventListener('mouseout', resetActive)
piano.addEventListener('mousemove', (event) => {
if (event.buttons === 1) {
play(event)
}
})
function fullscreen() {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen()
} else {
document.exitFullscreen();
}
}
const fullscreenButton = document.querySelector('.fullscreen');
fullscreenButton.addEventListener('click', fullscreen);