Fox Red Labs / Builds / Audio
Jack-o'-Lantern Jukebox
Halloween music and color-changing light from an MSPM33 C321A LaunchPad, the BOOSTXL-AUDIO and a power bank. No wiring.
MediumNo wiring
portability/boosterpacks/audio/host/run_halloween.sh <folder> on a Mac: it writes a 165 s preview with sound.Parts and steps
You need
- LP-MSPM33C321A LaunchPad development kit plays the show: 1 MB of flash holds the recordings, and its RGB LED is the light
- BOOSTXL-AUDIO audio BoosterPack plug-in module the sound: a DAC8311 converter, a TPA301 amplifier and a small speaker
- USB power bank with a USB-C cable powers the show with no computer attached; pick one with an always-on or low-current mode
Build the show.TERMINAL
Build the 16 kHz show image with the five recordings from
portability/boosterpacks/audio/tracks/. The script uses TI's SDK makefile and only builds; it never flashes.OUT=build/halloween bash portability/boosterpacks/audio/boards/mspm33c321a/build.sh halloweenYou should see: The last lines are
built build/halloween/gpio_toggle_output/ticlang/gpio_toggle_output.outand the flash use from the map, about 913 kB of 1 MB.Check the image, then flash it.TERMINAL
Plug the LaunchPad into the Mac by USB-C with no BoosterPack on it. Check the image never puts the chip to sleep, then flash it with DSLite. Copy
mspm33c321a/MSPM33C321A_<probe serial>.ccxmltomspm33c321a/MSPM33C321A_<serial>.ccxmland put your probe serial in place of<probe serial>. The flash line is assembled from the board's flash command and this build's output path.Replace <serial> before you run this.
python3 tools/preflight_image.py mspm33c321a build/halloween/gpio_toggle_output/ticlang/gpio_toggle_output.out /Applications/ti/ccs2101/ccs/ccs_base/DebugServer/bin/DSLite flash -c mspm33c321a/MSPM33C321A_<serial>.ccxml -e -f -v build/halloween/gpio_toggle_output/ticlang/gpio_toggle_output.outYou should see: The check prints
SAFE, DSLite finishes with the verify passing, and a serial terminal at 115200 showsHALLOWEEN SHOW, BOOSTXL-AUDIO app, ... sample rate 16000 Hz, recorded tracks 5.Unplug, then stack the Audio BoosterPack.BENCH
Unplug the USB cable first: the swap happens with the board unpowered. Pull off any other BoosterPack. Plug the BOOSTXL-AUDIO onto the same rows, its pin 1 on J1 pin 1 (3V3). Check jumper J5 on the pack sits on SPI DAC, as shipped, and push the pack's volume slider to the top.
You should see: The pack sits flat on J1 to J4 with its speaker facing up.
Plug in the power bank.BENCH
Plug the power bank into the LaunchPad's USB-C socket. Nothing else is connected.
You should see: The Mountain King recording opens the show and the RGB LED swaps orange and purple on the beat. Songs shuffle and loop, with a scare sound between them.
Use the two buttons.BENCH
S2 short: next song. S1 short: next light theme (pumpkin, fire, lightning, ghost, heartbeat, witch, music). S2 held 0.7 s: next sound mode (clean, haunted, graveyard, mad lab). S1 held 0.7 s: volume step. Both together, released within 2 s: shuffle on or off. Both held 2 to 5 s: speaker EQ on or off, to compare.
You should see: Every action beeps, blinks the LED and prints a line on the serial console at 115200. Settings start fresh at each power-up.
Or hand it to a coding assistant
Paste this in a terminal. It hands off to an AI assistant.
git clone --depth 1 --filter=blob:none https://github.com/Fox-Red-Labs/fox-red-labs.git && cd fox-red-labs
./start.sh mspm33c321a jack-o-lantern-jukebox --assistant claudegit clone --depth 1 --filter=blob:none https://github.com/Fox-Red-Labs/fox-red-labs.git && cd fox-red-labs
py start.py mspm33c321a jack-o-lantern-jukebox --assistant claudeIt runs the steps above and reports what it saw.
Not Claude Code? Copy this prompt instead.
Make it yours
By hand
Install ffmpeg first (brew install ffmpeg). The tool cuts, filters and encodes any audio file into the show; then run steps 1 and 2 again. The five shipped recordings use 174 s and leave room for about 22 s more: to add a longer song, delete one of them from portability/boosterpacks/audio/tracks/ first.
Replace <any audio file> before you run this.
python3 portability/boosterpacks/audio/tools/add_track.py "<any audio file>" --start 30 --length 35 --title "My spooky song" --no-buildYou should see: The tool prints the track it wrote; after steps 1 and 2, your song joins the shuffle.
If something goes wrong
| It stops at once with exit code 2 | The script did not find the MSPM33 SDK or TI Arm Clang: install them in the default /Applications/ti folders. |
DSLite reports Device Connection Error ... low power mode | Reset the probe with xds110reset -s <serial> -a toggle -d 200 (it sits beside xdsdfu) and flash again. |
| The pack does not seat | Check both header rows line up; it goes on one way only, pin 1 to 3V3. |
| You hear nothing | Check J5 sits on SPI DAC and the slider is up. |
| Nothing happens at all | The bank switched off at low load: use one with an always-on or low-current mode. |
More troubleshooting
| The board does not start after you held S1 while plugging in | That button starts the chip's bootloader: unplug and plug in again without touching it. |
| The build reports the flash is full | Shorten the new track with --length or drop another one from the folder. |
Every fix for this board: the FAQ.
What to build next
Every build. The code for all of them is in the GitHub repository.
Evidence and limitsThe MSPM33 C321A plays five public-domain orchestra and organ recordings and four synth songs through the BOOSTXL-AUDIO from a power bank, with its RGB LED following the music. Ran on 1 board. Results, sources, timing and limits.
Expected result: After flashing and stacking the pack, the LaunchPad plays the show from a power bank with no computer: recordings and synth songs on shuffle, scare sounds between them, and the RGB LED following the music.
What this shows
- One LaunchPad with 1 MB of flash plays recorded orchestra and organ music: five 30 to 40 s cuts at 10 kHz in IMA ADPCM, 849.6 kB together, played back at 16 kHz.
- The sample interrupt keeps time with room to spare: 15,999 frames a second, 0 late, with the worst interrupt at 5.8k of its 10k-cycle budget.
- A speaker EQ fitted from a measured tone sweep: 300 Hz high-pass, five peaking filters and a bass enhancer for a speaker whose response spreads 15.5 dB from 500 Hz to 4 kHz.
What this does not establish, and limits
What this does not establish
- The power bank's current draw and run time were not measured.
Limits to keep in mind
- The pack's microphone gets no power on this LaunchPad (BoosterPack pin 5 is not wired to the chip), so the clap and knock listener is off here.
- Loudness stops rising above about volume step 10 of 16: a 1 kHz tone through a laptop microphone rose 8.6 dB from step 4 to 10 and 0.7 dB from 10 to 16. Whether the amplifier, the speaker or the microphone limits it was not separated.
- Some power banks switch off under about 50 to 100 mA; the show has no low-power mode, so pick a bank that stays on.
- The speaker EQ was fitted from a laptop's built-in microphone, taken as flat.
Sources
Versions, sizes and timing
| DAC frames a second | 15,999, 0 late ticks over 480 s | |
|---|---|---|
| Worst sample interrupt | 5.8k of 10k cycles at 160 MHz | |
| Speaker EQ | 300 Hz high-pass, five peaking filters and a bass enhancer, fitted to a stepped tone sweep heard by a laptop microphone; the measured spread from 500 Hz to 4 kHz is 15.5 dB, the fit predicts 6.4 dB with the EQ | |
| Image size | 913.0 kB of 1 MB flash; 19.3 kB RAM | |
| Software | MSPM33 SDK 1.04.00.00, TI Arm Clang 5.1.1.LTS -O2, SysConfig 1.28.0, Intel Mac, macOS 15.7 | README notes |
Evidence
- On 2026-10-25 the show played from a USB power bank inside a carved pumpkin, heard and filmed. The clip on this page is from that night. README notes
- The firmware counted 15,999 DAC frames a second (one frame is one 16-bit write to the DAC) against the cycle counter, with 0 late sample ticks over 480 s and 7.68M frames.
- Six of six button actions, injected from the serial console, did what the control card says.
- All five recordings are public domain: Gounod, Grieg, Mussorgsky, Saint-Saens and Bach. Each track's file keeps its source page, license and cut. the tracks folder
Other boards
- AM13E230Could work synth songs only
- MSPM0G3507, MSPM0L1306, CC2340R5, F2800137
What the status words mean
Works ran here and did what it shouldCould work some of it ran; real porting effort is left; hover for whatNot for this chip the chip or its vendor software cannot; hover for why
Result grid
Works ran here and did what it shouldShould work it builds; only naming, packaging or build glue is in the way; hover for whichCould work some of it ran; real porting effort is left; hover for whatNot for this chip the chip or its vendor software cannot; hover for why
Source files
- halloween notes (MSPM33 C321A and AM13E230)
Get the code and tell us how it wentThe clone command, the board folder with its AGENTS.md, reports from others, and the three report forms.
Get the code
Clone the repository and open the board's folder below. AGENTS.md is a plain text file of notes for AI coding assistants, and llms.txt at the root indexes the site for one.
git clone https://github.com/Fox-Red-Labs/fox-red-labs.git
- LP-MSPM33C321A: folder
mspm33c321a/.- README: the board's lab notebook (what was run, in order)
- Notes for an AI coding assistant working in this repository: notes for an AI assistant; copy it into your own project if you use one
- FAQ: errors and fixes
The other 1 board folder
- LP-AM13E230: folder
am13e230/.- README: the board's lab notebook (what was run, in order)
- Notes for an AI coding assistant working in this repository: notes for an AI assistant; copy it into your own project if you use one
- FAQ: errors and fixes
- LP-AM13E230: folder
Code is BSD-3-Clause, writing is CC BY 4.0; third-party folders keep their own licenses.
Built it? Tell us
Built this, or got stuck? Report it on GitHub with a few short answers. Your report shows here in your words, marked as yours. A failure that repeats on the bench gets its fix here.