Skip to content

Repository files navigation

AcidBox S3

AcidBox is a headless ESP32 groovebox-style synth:

  • 2x TB-303-like synth voices
  • 1x TR-808-like drum engine
  • MIDI-driven control
  • 44.1 kHz, 16-bit stereo I2S output (external DAC recommended)
  • Optional 8-bit built-in DAC mode
  • Uses both ESP32 cores

Sound shaping includes cutoff, resonance, env mod, accent, wavefolder, overdrive, drum filtering/bitcrush, reverb send, delay send, and master compression.

See src/acidbox/midi_config.h for current MIDI mapping details and channel configuration.

Two Modes

AcidBox firmware supports two startup modes:

  • AcidBox mode: the synth/drum engine (2x303 + 808-style drums), controlled by MIDI or Jukebox logic.
  • Streaming mode: internet radio player mode with Wi-Fi setup, station selection, and I2S audio playback.

Mode is selected at boot from the streamer mode input pin (STREAMER_ENABLE_PIN in src/constants.h). If you change modes during runtime, the unit restarts and comes back in the newly selected mode.

Jukebox Mode

When JUKEBOX is enabled in src/acidbox/config.h, AcidBox can run as an autonomous acid generator.

Pattern generation is based on the original Acid Banger concept:

Demo

YouTube

Video

Audio Samples

Internet Radio

Depending on the mode detected at startup, this unit also operates as an internet radio box for playing Rinse FM and other online radio stations.

On first boot (or when Wi-Fi credentials are missing), the unit starts a Wi-Fi setup portal so you can choose an SSID and enter the password.

The player supports MP3 streams and AAC streams (AAC requires ESP32-S3 with PSRAM).

Integration: Tape Deck MIDI Controller

This project can be paired with the external controller project:

Cassette deck integration

In that setup, AcidBox runs as the synth/drum sound engine while the tape deck project acts as a MIDI control surface and transport-style interface. This gives you a physical, performance-oriented workflow for driving patterns, parameters, and playback behavior.

How the control link works

The tape deck project sends MIDI messages to AcidBox, typically including:

  • Note On / Note Off for triggering synth and drum voices
  • Control Change (CC) for parameters such as cutoff, resonance, decay, accent, delay, and reverb
  • Optional transport-style actions mapped to specific MIDI events

On the AcidBox side, incoming MIDI is parsed and routed to synth/drum engines, where each CC updates the corresponding parameter in real time.

At the same time, the tape deck controller keeps a local copy of the values it sends and renders those values on its display, so the UI reflects the active parameter state while you perform.

When integrating the two projects, make sure both sides use matching MIDI channel assignments and CC mappings.

Project write-up and build notes:

Radio Config

The station list and startup behavior are controlled by radio-config.txt, which is downloaded at startup from the URL set in src/main.cpp.

For reliable streaming, an ESP32-S3 with an external IPX antenna is recommended to improve Wi-Fi signal strength and reduce dropouts.

  1. Line 1: default channel index (0-based)
  2. Line 2: startup volume (0.0 to 1.0)
  3. Remaining lines: stream_url, station_name

Example:

0
0.9
https://admin.stream.rinse.fm/proxy/rinse_uk/stream, Rinse FM UK
http://stream.srg-ssr.ch/srgssr/rsj/mp3/128, Radio Swiss Jazz

Hardware Notes

Recommended:

  • ESP32 or ESP32-S3 with PSRAM (4 MB+ recommended)
  • External I2S DAC (for example PCM5102)

The current PlatformIO setup in this repo targets ESP32-S3 N16R8 (16 MB flash, 8 MB PSRAM).

Build (PlatformIO Recommended)

Open the project in VS Code + PlatformIO. Dependencies are downloaded automatically from platformio.ini.

1) Confirm Board and Memory Config

Review platformio.ini, especially:

  • board
  • flash/PSRAM settings
  • partition file (acidbox_16MB.csv)

Reference board configs: https://github.com/sivar2311/ESP32-PlatformIO-Flash-and-PSRAM-configurations#esp32-s3-wroom-11u-n16r8

2) Build

Use PlatformIO task Build (or pio run).

3) Prepare Flash and Filesystem

Use PlatformIO tasks:

  1. Erase Flash
  2. Upload Filesystem Image

This is required to install sample data from the data/ folder.

4) Upload Firmware

Use PlatformIO task Upload.

Arduino IDE (Alternative)

If using Arduino IDE:

  • Board: ESP32 Dev Module (or ESP32S3 Dev Module)
  • Partition scheme: No OTA (1MB APP / 3MB SPIFFS) or equivalent for your target
  • PSRAM: Enabled / correct PSRAM type

Also upload drum/sample assets to filesystem (FatFS/LittleFS workflow depending on core/tooling).

MIDI Control Reference

Current CC mapping used by the synth/drum engines:

// 303 synth CC#defineCC_303_PORTATIME 5
#defineCC_303_VOLUME 7
#defineCC_303_PORTAMENTO 65
#defineCC_303_PAN 10
#defineCC_303_WAVEFORM 70
#defineCC_303_RESO 71
#defineCC_303_CUTOFF 74
#defineCC_303_ATTACK 73
#defineCC_303_DECAY 72
#defineCC_303_ENVMOD_LVL 75
#defineCC_303_ACCENT_LVL 76
#defineCC_303_REVERB_SEND 91
#defineCC_303_DELAY_SEND 92
#defineCC_303_DISTORTION 94
#defineCC_303_OVERDRIVE 95
// 808 drums CC#defineCC_808_VOLUME 7
#defineCC_808_PAN 10
#defineCC_808_RESO 71
#defineCC_808_CUTOFF 74
#defineCC_808_REVERB_SEND 91
#defineCC_808_DELAY_SEND 92
#defineCC_808_DISTORTION 94
#defineCC_808_BD_TONE 21
#defineCC_808_BD_DECAY 23
#defineCC_808_BD_LEVEL 24
#defineCC_808_SD_TONE 25
#defineCC_808_SD_SNAP 26
#defineCC_808_SD_LEVEL 29
#defineCC_808_CH_TUNE 61
#defineCC_808_CH_LEVEL 63
#defineCC_808_OH_TUNE 80
#defineCC_808_OH_DECAY 81
#defineCC_808_OH_LEVEL 82
// global CC#defineCC_ANY_COMPRESSOR 93
#defineCC_ANY_DELAY_TIME 84
#defineCC_ANY_DELAY_FB 85
#defineCC_ANY_DELAY_LVL 86
#defineCC_ANY_REVERB_TIME 87
#defineCC_ANY_REVERB_LVL 88
#defineCC_ANY_RESET_CCS 121
#defineCC_ANY_NOTES_OFF 123
#defineCC_ANY_SOUND_OFF 120

Functional Diagram

("Acid Banger" Jukebox drives MIDI functions like an external app.)

Credits

Hardware Photos

ESP32 proto

ESP32-S3 proto

About

ESP32 synth: all-in-one acid combo TB303 + TB303 + drum machine + fx chain, cd-quality, no lag

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages