Skip to content

Instantly share code, notes, and snippets.

@gregorydgarcia
Created April 26, 2017 00:05
Show Gist options
  • Save gregorydgarcia/923c9f01dcbe3a52061457c4bcb4c679 to your computer and use it in GitHub Desktop.
Save gregorydgarcia/923c9f01dcbe3a52061457c4bcb4c679 to your computer and use it in GitHub Desktop.

Concepts Covered

  • data- attributes
  • resource: keycode.info
  • html audio
  • classList and .foreach methods
  • transitionend and keydown event listener

HTML

<div class="keys">
    <div data-key="65" class="key">
        <kbd>A</kbd>
        <span class="sound">clap</span>
    </div>
    <div data-key="83" class="key">
        <kbd>S</kbd>
        <span class="sound">hihat</span>
    </div>
    <div data-key="68" class="key">
        <kbd>D</kbd>
        <span class="sound">kick</span>
    </div>
    <div data-key="70" class="key">
        <kbd>F</kbd>
        <span class="sound">openhat</span>
    </div>
    <div data-key="71" class="key">
        <kbd>G</kbd>
        <span class="sound">boom</span>
    </div>
    <div data-key="72" class="key">
        <kbd>H</kbd>
        <span class="sound">ride</span>
    </div>
    <div data-key="74" class="key">
        <kbd>J</kbd>
        <span class="sound">snare</span>
    </div>
    <div data-key="75" class="key">
        <kbd>K</kbd>
        <span class="sound">tom</span>
    </div>
    <div data-key="76" class="key">
        <kbd>L</kbd>
        <span class="sound">tink</span>
    </div>
</div><!--keys-->

<audio data-key="65" src="sounds/clap.wav"></audio>
<audio data-key="83" src="sounds/hihat.wav"></audio>
<audio data-key="68" src="sounds/kick.wav"></audio>
<audio data-key="70" src="sounds/openhat.wav"></audio>
<audio data-key="71" src="sounds/boom.wav"></audio>
<audio data-key="72" src="sounds/ride.wav"></audio>
<audio data-key="74" src="sounds/snare.wav"></audio>
<audio data-key="75" src="sounds/tom.wav"></audio>
<audio data-key="76" src="sounds/tink.wav"></audio>

Javascript

    function removeTransition(e) {
        if (e.propertyName !== 'transform') return;
        e.target.classList.remove('playing')
    }

    function playSound(e) {
        const audio = document.querySelector(`audio[data-key="{e.keyCode}"]`);
        if (!audio) return;
        const key = document.querySelector(`key[data-key="{e.keyCode}"]`);

        key.classList.add('playing');
        audio.currentTime = 0;
        audio.play();
    }

    function bindEvents(e) {
        const keys = Array.from(document.querySelectorAll('.key'));
        keys.forEach(key => key.addEventListener('transitionend', removeTransition));
        window.addEventListener('keydown', playSound)
    }

CSS

.keys {
    display: flex;
    flex: 1;
    min-height: 100vh;
    align-items: center;
    justify-content: center;
} 

.key {
    transition: all .07s ease;
}

.playing {
    transform: scale(1.1);
    border-color: #ffc600;
    box-shadow: 0 0 1rem #ffc600
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment