Last year, frustrated with the complexity and instability of the existing open-source live loopers (like mobius and sooperlooper), I started developing one myself: loopers. And of course I decided to write it in Rust. After picking the project back up this summer, it’s now pretty much usable (although still missing a few key features), and I’ve decided it’s time to open it up.
For those unfamiliar with live looping, the idea is to allow a single musician to create complex arrangements in a live setting by building up overdubs on top of a continuously looping track. Originally loopers used simple tape delay devices, but soon more sophisticated looping devices were released, supporting multiple loops of different lengths, effects, quantization, and more powerful control schemes.
Loopers implements many of these features, and pairs them with a sophisticated GUI that makes it easy to understand the state of the system. It looks like this:
Currently it runs as a jack application (only supported on Linux at the moment, although probably would not be hard to support MacOS as well), using rust-jack. Hopefully it will be possible to make it into a plugin as well.
The GUI is completely custom, drawn via rust-skia and hosted in an sdl2 window. Communication between the audio thread, the GUI, and the looper backends is done with a bounded crossbeam-channel.
The code is over at https://github.com/mwylde/loopers, which also has more information and documentation. I think there’s some interesting ideas in the code around how to do complex multi-threading and UIs for real-time audio applications in Rust, and I’m sure a lot of stuff that could be improved.
Working on this has made me very excited for the future of Rust audio, but clearly there are still a bunch of gaps. Lacking a real GUI solution is probably the biggest. I tried several of the existing GUI crates (druid, azul, conrod, orbtk) and found that none of them were suitable for real-time audio applications. But at the same time, it would be nice to be able to rely on pre-built widgets for things like text editing and configuration.