5 ms·
I guess it's a stack in the sense that each additional loop is being pushed onto a stack of sorts. This is how the Ditto looper I use works, and you can even pe
by ericwood 6y ago
I guess it's a stack in the sense that each additional loop is being pushed onto a stack of sorts. This is how the Ditto looper I use works, and you can even perform the "pop" operation and back out of an additional layer.
I'm working on a digital delay pedal at the moment, and the underlying data structure is really similar in principle to a looper in that it's a ring buffer that continually loops around (although a bit more complex since the delay time can change!)
In actual production loop pedals I'm sure there's optimizations that can be done, but a naive implementation of the layering would just mean creating additional buffers for each layer, and keeping the read/write pointers sync'd between all of them. The output then just becomes a mixed version of all of the loops.
When a phrase extends beyond the loop length and repeats over itself, the buffer for that given layer would read the existing value and write a mixed version of the two signals.
- jmiskovic 6y agoI worked on this for a while [1], it was quite satisfying to combine electronics, SW and music in single hobby project. My looper had sort of git model with staging area and committed area. Both staging and committed loops were mixed down to output. You could re-record over staging area as many times as you wanted until you were satisfied, then you could mix it down to commited loop. It's like stack but only top-most loop is changeable. That model provided infinite loop overdubs, ability to undo mistake, and used only x2 memory. Regarding your delay effect, I was quite fascinated by how analog delay pedals allowed live-changing of loop length and the resulting effect it would produce [2]. I researched into the bucket brigade IC, quite interesting stuff. I think in digital you'd have all kinds of nasty glitches if you tried to do it with simple pointer modifications. [1] https://github.com/jmiskovic/DSPedal/ https://github.com/jmiskovic/DSPedal/ [2] https://www.youtube.com/watch?v=xJPde-C28iU https://www.youtube.com/watch?v=xJPde-C28iU
- ericwood 6y agoI love the idea of a "staging area"! That's a very smart and maps 1:1 with the behavior on most loopers I've used. Anything else would require nearly unbounded memory, and memory is easily the most expensive component of any looper. The repitching effect happens because the output from the ring buffer is effectively being resampled. Implementing this is a little funky, but with some clever tricks in how the ring buffer is used and some form of interpolation, you can get essentially the same effect. Here's my implementation, which uses Hermite interpolation: https://github.com/eric-wood/delay/blob/main/src/delay.rs https://github.com/eric-wood/delay/blob/main/src/delay.rs