Oscillator Drum Jams is a Web App Now
Six years ago, I released Oscillator Drum Jams on the iOS App Store. It’s a companion to this book by my former drum teacher. You can play any exercise out of the book to a chill instrumental loop, with the sheet music up, at any tempo.

iOS 26 killed it. That's a shame, because students had been using the app to practice! It’s never had organic growth, but for the people who need it, it’s a valuable tool.
Faced with the choice between figuring out how to the update the app (I haven’t written iOS code since 2024), letting it die, or rewriting it from the ground up as a web app using coding agents while I watched TV, I chose the web rewrite.
Oscillator Drum Jams on the web
Audio
The central problem of a drum practice app based on stretching audio samples is: if you're letting the user change the tempo, how do you sync up the metronome with the audio samples without losing timing fidelity? The metronome plays spaced-out audio samples that aren't stretched, and the transients of those samples needs to match the transients of the instrument tracks, which are stretched. The timing must be accurate enough for drum practice at all tempos.
The blog series for the iOS app goes into detail about this problem. The theory was correct. But there were persistent issues I had trouble reproducing or fixing, probably because I was letting the audio engine call some Swift code on a MIDI timer, and that Swift code was then calling the audio engine back to play samples. There was room for error.
The web rewrite does it differently. It has to—web audio can’t be triggered from the background as reliably as iOS native audio. Rather than playing metronome samples live in time with the music, the metronome gets rendered to a buffer the same length as the instrumental tracks, and they all loop together. All playback stays in the audio engine.
When you change the tempo in the web version of Oscillator, the Play button will get a little progress bar around it while the rendering happens. The progress bar feels like an imperfection, but the resulting audio is rock solid. An appropriate feeling when you’re practicing rock drumming!
Besides the metronome, the other problem I had to solve in a new way was time stretching. Apple's audio frameworks include time stretching, but web audio doesn’t. Fortunately, someone packaged the Rubber Band C++ library as wasm, and it sounds even better than Apple’s.
Safari's web audio implementation is antagonistic toward developers, resulting in obvious UX deficiencies. You need to turn off your phone’s silent mode to hear anything. The lock screen playback controls don’t work. The regressions are a bummer, but it's accessible to more people and easier to maintain, so this is the tradeoff I'm living with.
UI
The original app interface was very, very red. The web version is more like a classic dark mode. And because the range of viewports is no longer limited to iPhone and iPad hardware devices, it tortures CSS Grid and media queries to adapt to any size.

Yeah, I used coding agents
If I hadn’t been able to turn my brain off and let a coding agent do the typing, I probably would have just let this app die. I have a toddler, and I’m past the point where little portfolio pieces have much impact on my professional life. I’m glad I was able to continue helping drum students.
One last link in case you missed it: Oscillator Drum Jams on the web
If you play the drums, you can check out Oscillator-the-book, as well as Jake’s other books.