Build a Drum Machine - Build a Drum Machine

Tell us what’s happening:

My program runs as expected, but its failing this test:
9. When you press one of the keys Q, W, E, A, S, D, Z, X, C on your keyboard, the corresponding audio element should play the corresponding sound.
When I press down on the corresponding key, it does play the correct audio so I’m not sure where I’m going wrong with this one. Please help! Thanks! :slight_smile:

Your code so far

<!-- file: index.html -->
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Drum Machine</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <div id="drum-machine">
      <div id="pad-bank">
        <button id="heater-1" class="drum-pad" type="button">Q
          <audio id="Q" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-1.mp3" class="clip"></audio>
        </button>
        <button id="heater-2" class="drum-pad" type="button">W
          <audio id="W" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-2.mp3" class="clip">
        </button>
        <button id="heater-3" class="drum-pad" type="button">E
          <audio id="E" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-3.mp3" class="clip">
        </button>
        <button id="heater-4" class="drum-pad" type="button">A
          <audio id="A" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-4_1.mp3" class="clip">
        </button>
        <button id="heater-6" class="drum-pad" type="button">S
          <audio id="S" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-6.mp3" class="clip">
        </button>
        <button id="dsc-oh" class="drum-pad" type="button">D
          <audio id="D" src="https://cdn.freecodecamp.org/curriculum/drum/Dsc_Oh.mp3" class="clip">
        </button>
        <button id="kick-n-hat" class="drum-pad" type="button">Z
          <audio id="Z" src="https://cdn.freecodecamp.org/curriculum/drum/Kick_n_Hat.mp3" class="clip">
        </button>
        <button id="rp4-kick" class="drum-pad" type="button">X
          <audio id="X" src="https://cdn.freecodecamp.org/curriculum/drum/RP4_KICK_1.mp3" class="clip">
        </button>
        <button id="cev-h2" class="drum-pad" type="button">C
          <audio id="C" src="https://cdn.freecodecamp.org/curriculum/drum/Cev_H2.mp3" class="clip">
        </button>
      </div>
      <p id="display"></p>
    </div>
    <script src="script.js"></script>
  </body>
</html>
/* file: styles.css */
body {
  background-color: grey;
}

#drum-machine {
  margin: auto;
  width: 75vw;
  height: 75vh;
  background-color: black;
}

#pad-bank {
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  gap: 5px;
  justify-content: space-between;
  background-color: black;
  width: 95%;
  height: 95%;
  margin: auto;
  position: relative;
  top: 2%;
}

#pad-bank button {
  width: 30%;
  height: 30%;
  gap: 3px;
}

p {
  background-color: orange;
  width: 100%;
  height: 25%;
}
/* file: script.js */
const drumPad = document.querySelectorAll(".drum-pad");
const display = document.getElementById("display");

drumPad.forEach((button) => {
  button.addEventListener("click", () => {
    const audioEl = button.firstElementChild;
    playAudio(audioEl);
    updateDisplay(button.id);
  });
});

const body = document.querySelector("body");
body.addEventListener("keydown", (e) => {
  for(let drum of drumPad){
    if(e.key.toUpperCase() === drum.innerText){
      const audioEl = document.getElementById(drum.innerText);
      playAudio(audioEl);
      updateDisplay(drum.id);
    }
  }
});

function updateDisplay(clip){
  display.innerText = clip;
}

function playAudio(audioEl) {
  audioEl.play();
}

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0

Challenge Information:

Build a Drum Machine - Build a Drum Machine

Is this valid HTML?

HTML Validator

Nope! Updated it, all audio elements now have closing tags. But that didn’t fix my issue in trying to pass the test! Thank you for the heads up! :slight_smile:

If you need further help, please post your updated code.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Drum Machine</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <div id="drum-machine">
      <div id="pad-bank">
        <button id="heater-1" class="drum-pad" type="button">Q
          <audio id="Q" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-1.mp3" class="clip"></audio>
        </button>
        <button id="heater-2" class="drum-pad" type="button">W
          <audio id="W" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-2.mp3" class="clip"></audio>
        </button>
        <button id="heater-3" class="drum-pad" type="button">E
          <audio id="E" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-3.mp3" class="clip"></audio>
        </button>
        <button id="heater-4" class="drum-pad" type="button">A
          <audio id="A" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-4_1.mp3" class="clip"></audio>
        </button>
        <button id="heater-6" class="drum-pad" type="button">S
          <audio id="S" src="https://cdn.freecodecamp.org/curriculum/drum/Heater-6.mp3" class="clip"></audio>
        </button>
        <button id="dsc-oh" class="drum-pad" type="button">D
          <audio id="D" src="https://cdn.freecodecamp.org/curriculum/drum/Dsc_Oh.mp3" class="clip"></audio>
        </button>
        <button id="kick-n-hat" class="drum-pad" type="button">Z
          <audio id="Z" src="https://cdn.freecodecamp.org/curriculum/drum/Kick_n_Hat.mp3" class="clip"></audio>
        </button>
        <button id="rp4-kick" class="drum-pad" type="button">X
          <audio id="X" src="https://cdn.freecodecamp.org/curriculum/drum/RP4_KICK_1.mp3" class="clip"></audio>
        </button>
        <button id="cev-h2" class="drum-pad" type="button">C
          <audio id="C" src="https://cdn.freecodecamp.org/curriculum/drum/Cev_H2.mp3" class="clip"></audio>
        </button>
      </div>
      <p id="display"></p>
    </div>
    <script src="script.js"></script>
  </body>
</html>

Here is the updated html file.

Below are the unchanged css and javascript files.

body {
  background-color: grey;
}

#drum-machine {
  margin: auto;
  width: 75vw;
  height: 75vh;
  background-color: black;
}

#pad-bank {
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  gap: 5px;
  justify-content: space-between;
  background-color: black;
  width: 95%;
  height: 95%;
  margin: auto;
  position: relative;
  top: 2%;
}

#pad-bank button {
  width: 30%;
  height: 30%;
  gap: 3px;
}

p {
  background-color: orange;
  width: 100%;
  height: 25%;
}
const drumPad = document.querySelectorAll(".drum-pad");
const display = document.getElementById("display");

drumPad.forEach((button) => {
  button.addEventListener("click", () => {
    const audioEl = button.firstElementChild;
    playAudio(audioEl);
    updateDisplay(button.id);
  });
});

const body = document.querySelector("body");
body.addEventListener("keydown", (e) => {
  for(let drum of drumPad){
    if(e.key.toUpperCase() === drum.innerText){
      const audioEl = document.getElementById(drum.innerText);
      playAudio(audioEl);
      updateDisplay(drum.id);
    }
  }
});

function updateDisplay(clip){
  display.innerText = clip;
}

function playAudio(audioEl) {
  audioEl.play();
}

Try calling addEventListener on document rather than body.

EventTarget: addEventListener() method - Web APIs | MDN