What if you wanted to make a shiny 🎇 blinkenlight bling bag 🎇 that reacted to the sounds around it?
Maybe it would look something like this…
I made this bag towards the end of 2024 to bring along to hacker events and annoy the neighbours, and thought it would be a fun addition to an Algorave being organised by the lovely Patternclub Sheffield folk in April 2025.
If you’ve not come across the Algorave concept before, the idea is that a bunch of people get up on stage (if there is a stage) and live code some music using an algorithmic approach like TidalCycles. There are a bunch of open source tools to help you out, in particular the Strudel live coding platform, the Hydra video synthesizer and collaborative live coding environments like Flok and Nudel. You’ll notice when you visit these websites that they encourage you to hack, tweak and remix existing compositions. There are a lot of people sharing their creations, in what is a defiantly open culture. If this sounds interesting, you might want to watch the live stream of the April 2025 algorave in Sheffield.
This post will focus on the 🎇 blinkenlights 🎇 but I might write up the bag part separately. For now, just imagine that you have a handy transparent bag or box somewhere that you could put your bits and bobs in. Bonus points if you line it with dichroic film, but more of that anon…
Unfortunately my initial attempt at a CyberBag didn’t last the night much beyond the photo at the end of this post, so I took the opportunity afterwards to have another go with benefit of hindsight. Here, without further ado, are the key ingredients of CyberBag mk2, featured in the video above:






You might be able to pick up the details from the photos, but in case it’s useful here they are in a more readable format:
- Pimoroni Plasma 2350W microcontroller
- 3 pin LED Strip Input/Output Cable (with pin termination)
- 2 x Neon-like RGB LED Strip with Diffuser (aka NeoPixel, WS2812, SK6812)
- DollaTek Electret Microphone Amplifier MAX4466 Module with Adjustable Gain
- 3 x female-to-female Dupont cables
I got most of these components from Pimoroni, Sheffield’s finest Purveyors of Piratical Paraphenalia, but they are also available from other reputable suppliers. And some less reputable ones whose drivers allegedly have to pee in bottles.
To make the 🎇 blinkenlights 🎇 happen, we need to connect the microphone to the 2350W. However, the microphone and the 2350W don’t come with headers soldered on, so I did this bit myself. Don’t judge me! My soldering is slowly improving…
I used the 5V, DAT and “-” (Ground) screw connectors on the 2350W for the cable which feeds the LED strips - this only has three pins. The ordering of the pins on both cables is important, so if attempting your own build, be sure to check the docs for your LEDs.
For the microphone, I used the 2350W’s first Analogue to Digital Converter (aka ADC0, but labelled A0 on the Plasma board), the 3V3 power output and one of the “-” ground pins. Again the ordering is important so be sure to check, and then check again to avoid inadvertently releasing the dreaded blue smoke. The pinout is labelled on the mic itself.
Finally, I futzed about with adapting Pimoroni’s fire.py MicroPython demo code in an attempt to feed in and massage the audio samples from the microphone and map the mic voltage to a suitable range of colours. NB This is all very low effort code, could undoubtedly be done better, and doesn’t make best use of the 2350W hardware.
But it sort of mostly works, so that’s all good!
See below for the code, which you just need to copy onto your 2350W as main.py using Thonny, mpremote or your tool of choice.
I have to extend massive thanks to Kevin Walters for his article on Instructables Adding a Microphone to Pi Pico W on Pimoroni Galactic Unicorn which I liberally plundered for ideas. Adafruit also have some very useful info on the Maxim MAX4466 op-amp which may be of interest.
If you decide to make a CyberBag after reading this, don’t forget to take it to your nearest algorave, hackspace or demoparty…

import plasma
import time
from random import random, uniform
from machine import ADC, Pin
# Initialize ADC on pin GP26 (ADC0)
adc = ADC(Pin(26))
NUM_LEDS = 192
led_strip = plasma.WS2812(NUM_LEDS, color_order=plasma.COLOR_ORDER_RGB)
led_strip.start()
def moving_average(samples, new_sample, size):
samples.append(new_sample)
if len(samples) > size:
samples.pop(0) # Remove the oldest sample if the list exceeds the size
return sum(samples) / len(samples)
sample_size = 50 # Number of samples for averaging
samples = [] # List to store the samples
while True:
maxi = 0
# Read the raw ADC value (0-65535 for 16-bit resolution)
raw_value = adc.read_u16()
filtered_value = moving_average(samples, raw_value, sample_size)
voltage = (filtered_value / 65535) * 3.3
if (voltage < 1):
continue
maxi = voltage * 150 # fudge factor
flooring = maxi - 5
ceiling = maxi + 5
if flooring < 110:
flooring = 110
if ceiling > 140:
ceiling = 140
hue = uniform(flooring,ceiling)
sat = random()
bright = random()
for i in range(0, NUM_LEDS):
led_strip.set_hsv(i, hue, sat, bright)
time.sleep(0.1)