Phonic Bloom

August 2026 · Source

Phonic Bloom is a sound-reactive LED geodome installation that I have brought to Burning Man, Apogaea, Saguaro Man, Elsewhence, and other events. It’s a scaled down version of a project by my friend Joan.

There is a 5 meter diameter geodome with a vinyl cover. Inside, there are 15 LED strips that radiate from the top center and down to the outside. A microphone inside listens for certain notes, and when it hears one, the LED at the top of the strip lights up. The color changes depending on the octave, and the brightness depends on the volume. Then, the LEDs “trickle down” the strip, to the bottom.

The LEDs are driven by an ESP32 embedded into a custom circuit board. It can either pick up frequencies from a microphone, or you can connect a Bluetooth source to it directly.

Technical details

Code

The program runs on an ESP32. The ESP32 is dual-core, so one core collects samples from the microphone and stores them into a circular buffer, so that no samples are skipped. The second core copies the most recent samples, processes them, then updates the LEDs.

The program runs a fast Fourier transform to find the frequencies. It collects samples at 44,100 Hz and processes 2048 samples at a time. After you perform an FFT, it produces an array of buckets that are evenly spaced by hertz, with each bucket having an amplitude. If you sum sine waves of each frequency and amplitude, it will recreate the original signal. But musical notes increase in frequency exponentially, so you need to convert those buckets to notes before you can use it. Lower notes will have more buckets assigned per note. You need to pick your sample rate and sample count so that the notes you want are represented.

Also, the human ear is attuned to certain frequencies, so the volume of a note you perceive is related to, but not directly correlated with, the amplitude of that frequency. In particular, the ear cannot hear bass notes well, so music is mixed with high-energy bass notes so that it sounds balanced. If you’re processing this music directly, the bass notes will overpower the other notes. Instead, you need to compensate using A-weighting.

Once we have the notes and amplitude, the program normalizes the amplitudes. Each strip going around in a circle visualizes a half-step, so the first LED on its strip will light up. The first LED on the other strips will also be lit, but at a lower brightness corresponding to the normalized amplitude. There is a minimum threshold, so that notes that are very soft won’t be visualized. Because there are 12 half-steps per octave, this wouldn’t give us much of a range, so I change the color and then repeat this 2 more times.

The LED strips are updated using FastLED. The strips are WS2815Bs, which receive data at 800 kHz. There are 150 LEDs per strip, and each LED takes 24 bits, so it takes 4.5 milliseconds to update. There are 15 strips, so if each strip were updated serially, it would take 67 milliseconds, limiting the framerate to about 15 frames per second - unacceptably slow. To address this, each strip’s data line is connected to a different ESP32 pin, and the data are written in parallel to each strip. In addition, the buffers are prepared asynchronously.

Hardware

I designed a custom circuit board for all the electronics. This is the first board I’ve ever made. I used KiCad. They have an excellent tutorial.

Rather than put individual components on the board, I just have slots for the ESP32 and microphone breakout boards. Antenna design and placement is kind of a black art, and ESP32 boards come with USB interfaces for uploading and buttons and other things, so I would rather just slot in an existing breakout board. I still haven’t learned how to supply a bill of materials and have components placed by the manufacturer, so I just added holes for through-hole components. I ordered the board from JLCPCB.

The ESP32 outputs 3.3V logic, but the LED strips use 5V logic. This is usually compatible - the ESP32 should output at least 2.4V to indicate high, while the LED strips should treat any signal over 2V as high (see SparkFun’s description of logic levels). However, this isn’t a very comfortable margin. If the LEDs are ever provided a different voltage (like 12.8V), or if the board is given lower than 5V, or we pick up radio signals on the data lines that create spurious voltages, this might cause glitches. To compensate, I added an LED on the board and powered it at 4.3V, making it act as a logic level converter. The overlap from 3.3V to 4.3V then to 5V logic is much more comfortable.

Power

The LEDs and all the electronics are powered from 2 LiFePO4 batteries charged by three 100W solar panels. I keep the LEDs at a pretty low brightness (around 25%) to reduce power. The batteries are 12.8V nominal, while the LED strips are 12V, so I have a step-down converter to reduce the voltage. I know some people run these LEDs directly off LiFePO4 batteries, but I think this makes them run hotter and reduces their lifespan a bit. I used 12V LEDs instead of 5V because it makes voltage drop less of a concern.

The circuit board requires power too, so I run a cord from the 12V power supply up to it. The board needs 5V, so I have a step-down voltage converter.

Structure

I purchased a V2 geodome from a friend. It consists of two different lengths of 1 inch diameter EMT tubing. The ends are flattened, bent, and have holes drilled through, where bolts and wingnuts hold them together. You can put it up with only a step stool.

The dome didn’t come with a door - instead, people had to duck through one of the triangular openings. I added a non-vertical door using the idea from Blumkraft. I later added a tunnel to extend the entrance.

Cover

The dome needs to be covered, both so that it is dark inside for the LEDs and so that it is protected from the dust and weather. I made a cover from old billboard vinyl. Billboard advertisements are printed on large vinyl sheets that they hang on the board, and once the advertisement expires, you can buy the used sheet for cheap. They’re woven vinyl and are pretty durable, roughly double the thickness of normal blue tarps.

I used the dome cover calculator from Domerama to plan out my cover. Once I cut the gores, I used my sewing machine to attach them together. One problem with sewing vinyl is that the needle punches holes in the material, as opposed to cloth where it pushes the fibers apart. This leaves the vinyl a little prone to tearing and leaking. To minimize this risk, you should sew a full flat felled seam. For my first few seams, I used an overlapping seam, and those seams drip a bit when it rains.

Although it’s heavy duty material, my home sewing machine had no problem punching through the vinyl, even 4 layers while doing the full flat felled seam. For the first pass of the flat felled seam, I was able to use the machine for the whole seam. For the second pass, I needed to fold the top gore over. Each gore is triangular, so I had to roll up the gore to fit it under my sewing machine arm as I went along. However, because each gore was 2.5 meters at the base, I wasn’t able to roll it up and fit it under the arm. So for the last quarter of the seam or so, I hand sewed it.

I also added two zippered vents for ventilation and light. These are semi-circles, and I found out after I sewed it that there are zippers that are designed to go around curves. I did not use those zippers, so they’re hard to open and close. Finally, there are two zippered doors on the front and back. Unfortunately, these zippers also drip a lot.

Sign

I made a sign on a CNC routing machine. I purchased an SVG design of a lotus flower on Etsy, and then added text on the legs. I added LEDs around the edge of the sign on the inside, shining inward. To diffuse the light, I added a clear layer of acrylic that I glued some parchment paper to. The LEDs are driven by WLED. I keep the electronics in a reusable plastic container. I just screwed the lid to the back, so you can pop the electronics container on and off. The sign attaches over the tunnel, so you walk under it to go inside.