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);