Building a soundboard
A Raspberry Pi, a row of arcade buttons, and a speaker. It’s cheap, fun, and endlessly customizable.

For a long time I wanted something tactile for sound effects — a device where I could slam a big red button and trigger a laugh track or a silly sound without reaching for the mouse. Software soundboards exist, but they always feel clunky: too many menus, too many clicks. What I wanted was hardware.
So I built one. A Raspberry Pi, a row of arcade buttons, and a speaker. It’s cheap, fun, and endlessly customizable.
Gathering the pieces
The hardware stack is simple:
- Raspberry Pi 3 (a Zero W also works)
- 6 arcade buttons
- Breadboard + jumper wires
- A powered speaker
Arcade buttons are great for this — they’re cheap, satisfyingly clicky, and designed to take abuse.
Wiring it up
Each arcade button is just a switch. You connect one leg to a Pi GPIO pin, the other to ground. On the breadboard, I daisy-chained the ground pins so all buttons share the same reference. The result: one pin per button, six inputs total.
Lesson learned: double-check your wiring. At first, one button wasn’t registering. Turned out I had crossed the ground and signal pins — easy mistake when you’re staring at a spaghetti of jumper wires.
The code
Python makes it straightforward. I used gpiozero
for button detection and pygame
for sound playback. Here’s the barebones version:
from gpiozero import Button
from pygame import mixer
from random import choice
mixer.init()
button1 = Button(2)
sounds = ["audio1.mp3", "audio2.mp3", "audio3.mp3"]
while True:
if button1.is_pressed:
mixer.music.load(choice(sounds))
mixer.music.play()
Every press loads a random sound from the list and plays it. Expand this with one button per channel, or even map buttons to folders of sounds.

Adding variety
The magic is in the mapping. Instead of one button = one file, you can:
- Assign a button to a category (e.g., zelda, ff7..).
- Load from a folder so each press picks a different track.
- Chain multiple buttons to trigger combos
proto, before LEDs
Things I discovered along the way
- Arcade buttons bounce, so a single press might trigger multiple times.
gpiozero
handles some of this, but I added a small sleep delay in the loop to prevent rapid re-triggers. - WAVs play instantly, MP3s sometimes add a slight delay. Converting all sounds to WAV improved responsiveness.
- Pygame defaults to a single channel; if you want overlapping sounds, use
pygame.mixer.Sound
objects instead ofmixer.music
.
Where to take it next
Right now it’s a basic soundboard, but there’s so much room to grow:
- Add LED lights under the buttons for feedback.
- Run a tiny Flask server so you can trigger sounds remotely from your phone.
- Add categories and a config file so you can re-map buttons without touching the code.
- Print a custom case so it looks like a real arcade panel instead of wires taped to wood.
Building this soundboard reminded me why I love Raspberry Pi projects: the barrier to entry is low, but you can go as deep as you want. At the end of the day, I now have a physical device on my desk where I can slam a button and trigger a perfectly timed sound effect. And honestly, nothing beats that feeling.