why I used circles
I started oooo with a simple idea: I wanted a loop to look like a loop. Most loopers put audio into horizontal tracks, but I wanted to watch several circular heads move at different speeds and immediately see when one reversed or drifted away from the others.
The size, position, movement, and small traces of audio activity all became part of the control. The circles can overlap and still remain separate objects. This visual decision also shaped the engine: each loop owns a larger allocation, an active window inside it, and one or more heads that move through that window.
keeping the audio engine out of the interface
I kept the main audio engine in plain C++ instead of tying it directly to JUCE. This let me test transport, recording, routing, DSP, scheduling, voices, and loop editing without opening a plugin window. The standalone app and plugin then use the same loop API.
I also embedded a Lua runtime with an o.* API, made a browser editor that talks to it, and added a monome path for controlling the circles with hardware. This was more architecture than the first version strictly needed, but it has made nearly every release after 1.0.0 easier to build.
putting it in other people's hands
I released oooo before I considered it finished because it was already useful for making music and because other computers, DAWs, displays, and ways of playing would find problems that my setup did not. The non-Retina scaling bug in 1.0.1 proved this almost immediately.
The releases after that added modulation, routing, updates, master tape controls, exact number entry, musical rate scales, periodic resets, deeper grid control, larger waveforms, better live-input recording, and shimmer. I am still using the same four circles, which feels like a good sign.