Tangible Choir
Little Laulupidu
A physical choir installation: eight rods control individual recorded voices, with lights providing feedback.
Created as a course project in the Estonian Academy of Arts’ Interaction Design MA (IxD.ma) by members of Team 2024.
News coverage
The physical build
The prototype uses a wooden cabinet, eight rod mechanisms linked to potentiometers, two door sensors, individual rod lights, and a NeoPixel strip. The intended interaction starts when both doors are open; moving the rods changes the mix of the choir parts. The current recordings include Ohjad and Tuljak.
| Part | Current role |
|---|---|
| Arduino Mega | Reads eight pots and two sensors; drives rod-light PWM and NeoPixels. |
| Raspberry Pi 5 | Runs Pure Data and plays the choir recordings. |
| USB serial | Transfers sensor/pot readings to Pure Data at 9600 baud. |
| Creative Pebble speakers | Stereo sound output from the Pi. |
Annotated build wiring diagram

docs/Hardware/wiring/wiring.fzz.Diagram and firmware pins disagree; confirm the pin map and power connections before soldering a shield.
The planned next revision is a soldered Mega shield with labeled connectors and a confirmed pin map. ESP32-S3 is an alternative I/O controller to evaluate once board models and sensor/lighting voltages are known.
Software and signal flow
choir/choir.inoreads inputs, sends ten values per line—two sensors, then eight pots—and updates lighting.arduino.pdreceives serial bytes, parses the values, and normalizes them.main.pdcombines the door states, chooses the song, and routes rod values to voice volumes.- Eight
soundfile.pdplayers are shared between the two songs, plus one rumble player. They load audio tables, play them, and pan to stereo output.
Browse the repository for the patches, firmware, and audio assets.
Development
- Wiring and power: confirm the actual parts, agree the pin map, fix the missing R5/R6 ground net in the model, and design the lighting supply and drivers.
- Firmware: separate the two sketch variants into buildable folders and clear all light outputs when a door closes.
- Pure Data control flow: evaluate both doors once per complete frame and load the selected song before starting playback.
- Reliable operation: validate serial frames, handle stale data/reconnects, pin deployment settings, and define audio completion, stereo, gain, and fades.
Tests: firmware probes, wiring checks, Arduino CLI builds, headless Pd tests, and a virtual serial fixture. The initial baseline has 7 passing and 13 failing tests; see the results for scope and setup.
Download the technical review · Download the baseline results
From the repository root:
python3 tests/review_tests.py
python3 tests/serial_fixture.py --seconds 60Setup: tests/README.md.
Project sources
- Repository
- Google Drive
- Figma / FigJam
- Project gallery
- Additional photo album
- News clip on YouTube
- Netta’s project post
- Kaitlin’s project post
Project notes: docs/README.md in the Obsidian vault.

