Twin Paradox — an experimental time-stretching looper and delay

Twin Paradox is a dual stereo looper that decouples pitch and speed, allowing for time dilation effects (speeding up and slowing down loops without effecting their pitch) and re-pitching loops without affecting their timing. And, of course, combinations of the two are possible. Additionally, it allows you to speed up or slow down loops to match an external clock (or an internal tap tempo). (The name comes from a famous thought experiment about time dilation as a pair of twins experience different relative times due to one twin’s acceleration to nearly the speed of light.)

There’s also a “delay mode”/delayed processing mode, which converts the two looper buffers into alternating read/write loopers with feedback (this can also be used to “bounce” audio from one buffer to the other during other recording modes).

Before you get too excited here: this effect is quite grainy. The way that it works is that an incoming recording’s interval between beginning and end is sent to a tap to CV converter controlling a linear LFO (actually, two linear LFO’s per looper; one — a ramp — controls forward playback, while the other — a sawtooth — controls reverse playback). The LFO moves the start position of the loop, while a very fast trigger constantly retriggers the loop. So, playback is really affected by pitch/speed, but the retriggering of the loop turns that into re-pitched/sped slices, and the slices are governed by the LFO speed.

I’ve worked on this patch, off and on, for quite a while. I tried a lot of things to make it smoother, but in the end, I just decided to embrace the peculiarities/exploit them for some neat, if glitchy/weird, effects. That said, certain things work better than others here — speech/voice, in particular, can sound quite good, or drums. Things with percussive, inharmonic elements, essentially. Anything with sustain will sound choppier than you’d probably like. It’s definitely an “effect,” rather than the sort of solution you could get from a VST with bespoke software and more processing power to analyze FFTs and provide interpolation/smoothing between slices.

This patch is not a miracle-worker (see the many caveats and explanations below), but it can do some fun/weird/interesting stuff. On the one hand, it’s by no means a perfect tool for time-stretching (I mean, I think it’s about as good as you can get with ZOIA, but people’s expectations on this stuff can be a little untempered). But on the other hand, by embracing that imperfection, this patch can produce some stuff you can’t do with more polished time-stretching products. So…. approach with an open mind?

Audio is recorded in stereo and passed in stereo.

Let’s dive into the controls.

As a general rule, controls are color-coded-ish. Yellow/orange controls affect one looper. Blue-ish controls affect the other looper. White controls affect both. Green controls affect the pitch mixer. The CV controls somewhat deviate from this. More on them at the end.

Each looper has a TIME DILATION control, which affects the speed of the loop. This goes from 5x faster to …. very slow? I’m not really sure. It’s somewhat limited by the slowest speeds of the LFOs. The control works such that positive values increase the pitch linearly: .25 = 2x speed, .5 = 3x speed, etc..

Negative values, on the other hand, work through division, and so proceed exponentially: -.5 = half speed. -.75 = quarter speed, -.875 = eighth speed and so on.

Probably a good time for a caveat: the tap-to-CV converters and LFOs do the best they can, but they have limitations. There may be some rounding errors that produce less than absolutely precise results. Likewise, the tap-to-CV converter can struggle with really slow speeds. Up to ~6 or 7 seconds of recording seems to be about its limit. (Which is why we’re working with loops instead of samples — you can apply the same technique to a sampler, of course, but calculating the timing requires a very different process, since samples are likely to be longer and loading a sample is different from recording a loop.)

Time dilation can also be controlled via CV; I’ll discuss that more toward the end.

Each looper has a PITCH control. This works as you’d probably expect (relative to the limitations of the patch), changing the pitch of the loop without affecting its perceived speed.

Each looper has a DIRECTION button. This switches from forward playback to reverse playback. Due to the nature of the process, switching from one direction to another will not pick up from the same location in the loop. Because of this, the direction button also varies in brightness according to the position of the loop playback, so you can make more informed decisions about the position of the loop when you change its direction. (That said, you can have some glitchy fun just randomly changing the direction throughout playback — a feature that is also CV controllable).

Each looper has a RECORD button (also replicated in stompswitches). So, now would be a good time to explain the recording modes (which are selected by red pushbuttons in the center of the fourth row):

— Manual — recording occurs when the button is pressed and ends when it is pressed again

— Clocked — recording begins on the clock cycle following the initial press (the patch accepts CV, MIDI clock, and tap tempo; the tap tempo button in the bottom left corner will display incoming MIDI or CV clock — tap tempo is overridden by the presence of either)

— Delay — lots of caveats with this, because in development I had a lot of trouble getting it to work consistently (it’s working more consistently now, at least). I would therefore label this mode as “experimental.” (As in sometimes the experiment fails.) But this takes the clock (tap, CV, MIDI) and alternates the loopers based on it. Each looper has independent controls, so you can set them similarly, but you can also do some weird shit by setting them to do different things.

Each looper has control over JITTER, which randomly augments the start position, moving the play head around the scanning LFO and producing stutter-y/glitch-y effects (kind of like a skipping CD?). The jitter controls include a JITTER RESOLUTION control (you could also think of this as a rate; it subdivides the loop and determines how many subdivisions there are, so a higher resolution means more and faster opportunities for a jitter). There is also a JITTER PROBABILITY control (how likely a jitter is to occur) and a JITTER RANGE control (how much the jitter may deviate from the present start position).

Each looper also has a PITCH CHANGE RESOLUTION control. This works like the resolution in the jitter control, determining how many subdivisions of the loop there are.

This controls the rate of change possible via the PITCH MIXER. So, each loop has a pitch control, which sets a base pitch. But this pitch can also be randomly augmented by a pitch change from the pitch mixer in the bottom right corner. The pitch mixer weighs the probability of outcomes, with options for “no change,” “interval 1,” and “interval 2.” The interval amounts can be set using the controls above the mixer (e.g. setting an interval to A1 would produce changes of +1 octave, depending on its probability).

Each looper also has a RANDOM PANNER. It, too, has a resolution, but this PAN RESOLUTION is based on the playback retrigger speed, rather than subdivisions of the loop (I wanted faster options for this control). There is a PAN SPREAD as well to control the range of random panning.

And finally, for the individual controls, each looper has a LOOP LEVEL control. The output of the loopers is boosted by +6 dB, but this is more due to the effects on amplitude of the retriggering process. I may bump this even louder, as the loops can become quite quiet under some conditions.

As far as global controls: We’ve already discussed the recording modes. Above these, are controls for PLAYBACK RESOLUTION. “Playback resolution” controls the CV input of a clock divider; “Playback resolution multiplier” controls the multiplier input of that speed. That sort of sounds like two controls that do the same thing, but the former can be used for more specific adjustments of resolution, while the latter can provide more dramatic and fast changes in the playback retriggering speed.

A word of advice: You may find yourself thinking, “more resolution = better.” But the greater the resolution, the more “grainy” the outcome. Up to a point, that graininess can provide a better sense of the original material. But beyond that, it can introduce a lot of aliasing and distortion. Not necesssarily bad/can be interesting, but maxing out the resolution is probably not the best way to approach the controls, at least at first.

The FEEDBACK control determines the amount of audio sent from the output of the loopers to their inputs. This serves two purposes: in delay mode, it determines the amount of feedback between the two alternating recording/playback buffers. In the other recording modes, this can be used to “bounce” audio from one buffer to the other, or as a sort of very peculiar and unrefined overdub (since you can record new material while the audio is bouncing from one looper to the other).

There is also a DRY LEVEL control, located beside the pitch mixer.

Finally, above the TAP TEMPO button is an EXTERNAL CLOCK button. This will replace the internal timing of the loops with an external one produced by the clock source (CV, MIDI, tap). You can still dilate the time (for instance, if you have a longer loop and the external clock speeds it up a lot, you might consider changing it to half time or quarter time). Pressing the “external clock” button also resets the loops’ phase, which may be useful for aligning the loops to an external source.

So, now the peripherals. STOMPSWITCHES (for ZOIA) and CV INPUTS/OUTPUTS (for Zebu):

STOMPSWITCHES (all behaviors are replicated in UI buttons on the control page, if using Zebu):

Left — record into buffer 1 (yellow)

Middle — record into buffer 2 (blue)

Right — tap tempo (also accepts MIDI clock, CV clock)

Expression/CV in on ZOIA can be routed to pitch and/or time dilation for one and/or both buffers using the buttons and attenuverters placed on the bottom row of the control page. (More on these in the CV input section.)


Clock — accepts a CV clock (again, the patch can also accept MIDI clock or internal tap tempo)

Time dilation — so, here is where things get a little odd. This is a 0-5V input (you can always change that, of course). It has an attenuverter, located above the input on the control page. But above the attenuverter, there is also a button, called “Destination.” As you press this, it changes colors. Yellow directs it to looper 1; blue to looper 2; white directs it to both.

Pitch — This is a 0-10V input, so you can use it for sequencing. Again, we have an attenuverter — max this out for V/oct tracking. And again, a “Destination” button, that works the same as above.

Direction — This is global and a gate or trigger at this input flips the direction of both loopers (if both are moving forward, for instance, it flips them to reverse; if one is reverse and the other is moving forward, they switch, etc..).


Outputs of the LFOs controlling the progress of each looper’s playback.

Leave a Reply

  • Platform:
  • Category: Effect Sound
  • Revision: 0.1
  • License: Creative Commons Attribution Share Alike 4.0
  • Modified: 8 months ago
  • Views: 1430
    Likes: 15
    Downloads: 469