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 have been using the app. 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, I chose the web rewrite!

Oscillator Drum Jams on the web

Audio

The blog series for the iOS app goes into detail about the intricacies of playing a metronome in time with a stretched instrumental loop. The theory there was sound, but in practice, it never felt 100% right. The implementation used a MIDI-triggered event to call a Swift closure which scheduled another audio sample. It worked well enough, but students would report “drifting,” despite the MIDI being locked to the loop timing. I never reproduced the issue.

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 loop the same length as the instrumental tracks, and they all loop together. 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.

Apple’s web audio implementation is antagonistic toward developers, resulting in obvious UX deficiencies. For example, you need to turn off your phone’s silent mode to hear anything, and the lock screen playback controls don’t work. This all worked fine in the native version, and the regressions are a bummer. But it is Apple that makes this choice to kneecap web audio, and I need this app to not need yearly updates just to maintain baseline functionality. Plus, it’s available to Android users, so it helps twice as many people as it did before.

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 make any impact on my professional life. The energy impact is on the order of a handful of dishwasher cycles. 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.