why I wanted Reset Every

One thing I like about oooo is setting the loops to slightly different rates and letting them fall apart. After a while, though, I usually want some recognizable piece of the original phrase to come back. Reset Every lets a head drift and then jumps it to Reset To after a chosen number of beats or seconds.

The interval is shown in beats when the project is quantized and seconds when it is not. This lets me make a reversed loop return every eight beats while another slow loop comes back every thirteen, which is a simple way to make a pattern that takes a long time to exactly repeat.

the awkward part was the process-block boundary

The voice counts elapsed audio frames and schedules a jump without losing the exact reset point when an audio block crosses it. It also has to cope with the rate changing, playback reversing, the loop window moving, or one block being long enough to contain more than one reset. I added voice and engine tests for those cases because they are difficult to test by listening and waiting.

Reset Every and Reset To also had to be added to the engine API, footer controls, number entry, plugin state, and session archives. I placed them next to the loop timing controls, where I was already looking for them while trying the feature.