Games and interactions for a screen-free computer for my ~1-year-old babies (named after my triplets and tricorders), using MIDI controllers, sound, and lights controlled by a Raspberry Pi.
The idea is to build a nontraditional computer that is safe for babies to explore, with no screen or keyboard, which we can customize into a million different toys and games, instead of relying on what's commercially available.
| Category | My specific setup |
|---|---|
| Raspberry Pi as the computer, inaccessible to the babies | Raspberry Pi 5 |
| Bluetooth MIDI controllers for button input and light output | A few JP MINIs and a Synido TempoKEY K32 Play |
| Bluetooth speakers for audio output | — |
| RGB LED matrix for more visual output | Two Adafruit 64×32 RGB LED matrices |
See Setup for Pi installation, Bluetooth pairing, upload instructions, and the pad-color diagnostic.
Press pads on a JP MINI to send rings of color across its 4×4 grid. After completing setup, run from your development computer:
./scripts/upload
./scripts/pi -t 'cd ~/triputer && python3 -m interactions.ripple'You can also run it directly with python3 interactions/ripple.py on the Pi.
On startup, pads stay dark until the first press identifies the active bank. Then each pad shows its source color dimly. Press and hold to emit expanding rings; multiple held pads emit independently and their colors blend. Releasing a pad stops new rings from that source and fades its existing rings over two seconds. Rapid taps on the same pad resume its ripple rhythm while it is fading, rather than stacking wave trains that wash out the animation. After it fully fades, the next press starts a new ripple.
Aftertouch does not start additional rings. Rows run bottom-to-top. Notes
4–19, 36–51, 52–67, and 68–83 map to the same physical pads automatically. Each range
selects a different color palette, detected on the first pad press after a bank
change. This palette remains after ripples fade and is remembered across
reconnections during the same run. Existing rings retain their colors as they
fade. For a custom consecutive note range, use --base-note N with the
bottom-left pad's note. Unmapped notes print a diagnostic.
All paired JP MINIs run independently, including controllers paired while the program is running. Each controller's input and lights are matched by Bluetooth address, so identical names and changing ALSA port numbers are harmless. A lost connection retries automatically, with delays increasing from 2 to 15 seconds; other controllers keep running. Reconnection resets held pads and old ripples so missed releases cannot leave a source stuck on. Press a pad again to resume.
Press Ctrl+C to stop and clear the lights. -t gives the remote process a
terminal so Ctrl+C reaches it. Run only one LED program at a time.
./scripts/pi -t 'cd ~/triputer && python3 -m interactions.ripple --speed 2 --period 1.5 --fade 3'
./scripts/pi 'cd ~/triputer && python3 -m interactions.ripple --duration 30'--speed is measured in pads per second; --period and --fade are in seconds.
The program also accepts --brightness, --fps, and --chunk-delay.
To restrict it to specific paired controllers, pass
--address AA:BB:CC:DD:EE:FF, repeating the option for additional addresses.
Press/release coordinates and connection status print to the terminal. The
ripple program reads BLE MIDI directly and does not need --midi-port or an
ALSA MIDI bridge.