From Random Scales to PracticeEngine
PracticeEngine started with a simple idea from a friend of mine, a pianist who has played for many years. He wanted an application that could generate a random scale and randomized chords within that scale.
He tried a lot of AI prompts before one finally pointed him toward LilyPond, a tool for creating sheet music. He tinkered with it for a while, then showed me what he had made and asked if I could put it on a website.
I took it from there. I added Go code to run the application, built a web frontend, and started connecting the pieces. What began as a request to host a small music tool became a project I kept coming back to.
Around the same time, I was getting back into the alto saxophone and learning piano. That changed the direction of the project. I wasn’t only helping someone else put an idea online; I was making something I could use, too. So I began adding features for exercises, practice routines, timers, and notation that accounts for the instrument being played.
Then my engineering interests found their way in. I’m an electrical engineer, and I’ve long been interested in digital signal processing. I wanted to understand my sound more deeply, so I began exploring whether the application could listen to microphone input and give useful feedback about pitch.
The result is a practice companion that can generate instrument-aware notation for piano, alto saxophone, and tenor saxophone. It supports several scale types, and exercises can use patterns such as scales, thirds, and arpeggios. A routine can bring multiple exercises together, each with its own key, tempo, duration, and rest.
There’s also a tuner mode and audio analysis. PracticeEngine estimates the fundamental pitch in a short audio sample and compares it with a target note. It can show whether the note appears sharp, flat, or in tune, along with the cents deviation. Waveform and spectrum displays make the signal visible, too.
I find that part especially interesting because it connects the musical experience with the underlying signal. A note that sounds a little off is also a frequency estimate, a measurement against a target, and a view of how the sound changes over time. The analysis has limits: microphone quality and browser audio capture matter, and a pitch estimate can’t describe everything a listener hears. Still, having those measurements gives me another way to investigate what I’m playing.
The project has also been a practical way to explore what AI can contribute to making things. My friend’s first path through a series of prompts eventually led him to LilyPond. That was a useful starting point, but it took his tinkering, my development work, and ongoing experimentation to turn the idea into a larger application. The interesting part, for me, is that AI can help someone find a tool or a next step, while the human work of trying, building, and deciding what’s useful continues.
PracticeEngine now includes session history, notes, progress charts, and CSV export, alongside its exercise and audio features. It runs locally as a private project, and I’m still developing it. I started by helping a friend get a music idea onto a website. Somewhere along the way, I built a tool that lets me explore music, software, and signal processing together.
That’s what keeps me interested: not just whether an application can generate a scale or detect a pitch, but what becomes possible when musical curiosity meets a willingness to build and experiment.