Holiday Light Show

I have always been amazed by holiday lights, and I have been helping my family put them up as soon as they trusted me around electricity. In 2021, I decided I wanted to make my own holiday light display, and after four iterations across the years, this is the result. The light show has a runtime of around 15 minutes, and is set up using 600 addressable LED lights outside my family's house during the holiday season.

The Lights

The lights patterns are all custom designed, since any sort of automated tools I tried did not have the look I was going for (though I wonder if more modern AI could do a better job). I designed each animation to fit with the mood of the song and created transitions in the lights to go with changes in the music. One of my favorite parts, at around one minute in the video is when the brightness of the lights climb along with a rise in the song, culminating in a flash of white and then turning off for a few seconds before continuing. The lights themselves are controlled by an RP2040 based microcontroller running a Python program. The microcontroller, along with the power supply for the lights and some other supporting circuitry are housed in a waterproof box in the yard.

The Music

The current iteration of the light show consists of six songs, starting off with Sleigh Ride, The Twelve Days of Christmas, Jingle Bells, and Deck The Halls in 2021. In 2022 I added I Have a Little Dreidel to shine some light on the Jewish side of my family, and We Wish You a Merry Christmas to bring the total runtime to easily divide into an hour to make the math easier. All of the music is purely instrumental, partially due to the fact that it was easier to find copyright free instrumental music, but also because I wanted the focus to be more on the lights rather than the sounds.

Song Credits

Audio Synchronization

For the first version of the light show in 2021, I used a basic FM radio transmitter to broadcast the music, hoping that passersby would tune into it using their car radios. In 2022 I swapped this out for an audio player here on my website, with a QR code to allow people to access it on their phones. Synchronizing the lights and audio with this system proved to be quite the technical challenge, since the internet has significantly more latency than radio waves. My solution was to synchronize them based on the current time. With the show lasting approximately 15 minutes, each song is timed to a preprogrammed point within that 15 minute time frame, four times every hour (for example, Jingle Bells always starts at 11, 26, 41, and 56 minutes after the hour). That combined with some basic clock synchronization made it possible to keep the lights and animations in sync while minimizing network usage.

The clock syncronization was intially done with a WebSocket-based server that I ran on Glitch, which required the features of their Pro plan to function properly. In 2024 I got tired of that and decided to see if I could use my favorite cloud platform as of late, Cloudflare Workers as the backend for my synchronization. While I initially struggled to get WebSockets working reliably on the platform, I ended up with quite an elegant solution in only 22 lines of TypeScript. Cloudflare's network is perfect for projects like this that demand low latency, since their edge network has servers only a few towns over from me rather than in a massive data center in Newark or Ashburn. I ran into some further issues that seemed to be another synchronization issue, but I eventually tracked it down to some bugs in the WebKit audio engine used on iOS devices that made the audio player forget where in the song it was. Using a few workarounds using the Web Audio API I got it playing much more accurately.

Conclusion

Now that I am in college and not spending nearly as much time at my family's house (and me being more focused on software now) I think this project has reached a mature state and is unlikely to see any further major updates. I do plan on still setting this up for the holiday season, and this will always be a special project for me, bringing holiday cheer to both my family and neighbors and passersby.