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

1 Like

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