C++, FreeRTOS, C#, Xamarin, Android
I grew up using a piano that had LEDs under the keys which is common with cheap learning keyboards. The keyboard could help you memorize a sequence of notes in one of the preloaded songs by lighting up keys and detecting when you are pressing them. I’ve missed learning this away as opposed to sheet music, so I created my own solution that works with my full-sized keyboard which lacks LEDs.
High quality keyboards like mine sporting large weighted keys do not come with LEDs as it is usually considered to be a children’s learning tool. To circumvent this I 3D printed addressable LED mounts so light can shine on to the keys instead of glowing underneath them.


A standard LED strip is not ideal for this project because the spacing of the piano keys is fairly precise and non-uniform across the piano, so I 3D printed precisely spaced mounts which have the added benefit of blocking some of the stray light which would have lit up neighboring keys, making it harder to tell which key is being communicated. The whole strip is too large for my printer, so I came up with the idea of making the sections of LED mounts that can be snapped together like pieces of a jigsaw puzzle.

The heart of the device is an ESP32 which is responsible for almost all of the functionality and logic of the system. I’m utilizing both cores of the chip. One core handles the MIDI communication with the USB host chip as well as all WIFI communication. The other core drives the LEDs and runs all the animations and song logic.
To control the device, change settings, and upload MIDI songs to learn, I created a simple Android app to interface with the ESP32. This simple app is responsible for transferring the MIDI files with TCP and setting the learning parameters such as the song section to loop.
