Loom — a 4-channel interwoven loop-delay

Using four channels made from a combination of play-once loopers and delay lines, Loom produces everything from glitchy, fractured delay tapestries, to pitch-shifted arpeggios, to tightly woven sheets of memory, swirling around one another. Each of the channels can record at a different pitch and playback direction (forward/reverse), with its own unique delay time (determined as a proportion of a maximum time). Tools like swelling, feedback ducking, and blurring (Cosmos-style cross-feedback) can be employed to further weave intricate soundscapes. To my ears, this patch is like a cheat sheet to 90s/00s layered post-rock (I think I mention something in the video about scoring a Firday Night Lights episode).

The patch begins by using an envelope-follower derived ASR envelope to control recording, but there are different methods of distributing that recording to different channels, including recording to more than one channel and glitchy clocked distribution that cycles through the channels. There are a lot of possibilities — which can be a lot to take in, I know — but if you work with this patch a little, there are also a lot of different and quite exciting outcomes it can produce. This patch has quickly become on of my favorites; it took me quite a while to record a demo video, because I kept sitting down with the intention to do so and ended up lost in weaving, looping, smearing soundscapes. (The one I recorded for the demo video is okay, but I got hit a little by the red recording light and anxiety crept into the performance.)

The origin of this patch comes from a question zhampu had on the ZOIA discord, regarding a Frippertronics performance that involved panning and volume swells. I don’t think this patch really addresses their goals (sorry — I ended up following a muse, and I’m pretty excited with where the muse took me), but it was the spark that lit the kindling. There’s some sound design DNA here from Cosmic Loops and from airport loops.

The dry signal path is stereo. The wet signal path is summed to mono before a stereo image is produced at the output. The envelope follower used to generate gates within the patch is taken from the left input.

This upload also contains two forks — Loom XT DK and Loom XT BL. These are discussed at the bottom of the page, but they sacrifice either the blurring or the ducking features to add additional delay time (30 seconds maximum instead of 15 seconds).


STOMPSWITCHES (all stompswitch behaviors are replicated on the control page):

The stompswitches select between the different individual track modes:

Left — selects envelope mode, where recording advances to the next channel based on the envelope-follower generated ASR envelope (more on this below)

Middle — selects the “manual” mode, where recording advances to the next channel based on a manual signal, i.e. pressing the corresponding UI button (labeled “Manual”) on the control page or pressing the middle stompswitch

Right — selects clocked mode, where recording advances based on a clock; the patch receives MIDI clock, but you can also tap in a tempo using the corresponding UI button on the control page or by tapping the right stompswitch; MIDI clock will override tap tempo

Each of these selections is also available with UI buttons on the control page. When an envelope is received in recording mode, these UI buttons will all light up while the envelope is active. When manually moving through the channels, the UI buttons will all light up as long as the UI button/stompswitch is pressed. And when clocked mode is active, all the UI buttons will flash in sync with the tempo.


The control page is roughly divided into two parts: on the left are per-track controls, with a couple of global controls that pertain to the delay lines. On the right are controls for how the patch records audio.

RIGHT SIDE (recording controls):

In the top right corner are the WET and DRY level controls for creating an output mix.

All recording occurs via an envelope follower-generated ASR envelope. This uses a two-fold approach to generating a gate and envelope for the recording. Recording occurs when the envelope is open.

First, on the top row are controls for the gate itself. THRESHOLD sets the basic level that the incoming signal must exceed to generate a gate. SENSITIVITY controls the Schmitt trigger built into the circuit. It might more accurately be called an “insensitivity” control because as you increase it, the audio signal must drop below a greater and greater threshold to close the gate — this makes the signal less likely to jump above and below the threshold as the signal fades, because once that minimal threshold is crossed, the threshold returns to its original condition. (There is more information on the Schmitt trigger circuit in the envelope follower section of Tips and Tricks.)

Play around with these; for “glitchier” results, you may set the threshold higher and the sensitivity lower.

Below these, on the second row, are controls for the ASR envelope. The envelope is gated by the audio input passing the threshold, with the gate closing when the audio signal drops below the minimal threshold created by the sensitiviy control. There are a few benefits to this additional envelope stage:

The ATTACK control allows you to shape the incoming audio, producing swells. Keep in mind that the attack will only affect the initial period of recording; if you play a series of notes without the envelope closing between them, only the beginning of that series will be affected by the swell. The Attack control is limited to 3 seconds. (Which is longer than you think.)

The SUSTAIN control is actually a hold length for the sustain portion of the envelope. When the envelope follower-generated gate is high, and the attack stage has been passed, the gate will hold open the sustain stage indefinitely. The hold length extends this sustained period, beyond when the gate drops. There are a few advantages to this additional hold stage. Most importantly, it can be used to recreate a series of notes where the space between individual notes might drop below the threshold; the sustain stage will keep the recording open for a period of time and if the threshold is crossed once more in that period, the hold length time will begin again. It can also allow you a grace period between the closure of the gate and the end of recording, so that the decay of a sound is not cut off as the audio passes below the threshold. This hold sustain stage is limited to 3 seconds.

The RELEASE control offers an alternative to that last use of the sustain stage hold: if you would rather have the recording taper off once it drops below the threshold, you can utilize the release section of the envelope. (For what it’s worth, I included this control because I figured: why not. But I rarely use it.) It is also limited to 3 seconds.

One thing to keep in mind is that the looper buffers are limited to 16 seconds — which is quite a long time — but you want to have your envelopes close before that time limit is reached.

So, a quick summary: when the threshold is exceeded, a gate is produced. This gate opens an ASR envelope that can be used to shape the incoming audio (via an attack stage) or to hold the gate open longer (via a “sustain” stage). The gate closes when the audio drops below a minimum threshold created by the sensitivity control, and the envelope closes when, beyond the closure of this gate, the sustain and release stages are completed.

There are a few different methods for recording: SINGLE-CHANNEL or MULTI-CHANNEL. The two methods can also be combined.

When recording into a single channel, you have three different modes for moving from one channel to the next. These are selected via UI buttons on the third row (and via the stompswitches):

ENVELOPE — recording advances to the next channel based on the envelope-follower generated ASR envelope. So, each time the envelope closes, the recording will advance to the next channel. This mode is good if you want to round-robin through the channels while recording complete notes or phrases.

MANUAL — recording advances to the next channel based on a manual signal, i.e. pressing the corresponding UI button (labeled “Manual”) on the control page or pressing the middle stompswitch. This mode is good if you want to fill a channel before moving onto the next, or if you want to selective about what is recorded to what channel (e.g. record something in channel 1, then channel 2, then advance all the way back to channel 1 to record more there).

CLOCKED — recording advances based on a clock; the patch receives MIDI clock, but you can also tap in a tempo using the corresponding UI button on the control page or by tapping the right stompswitch; MIDI clock will override tap tempo. This is good for glitchier outcomes, where a signal is chopped up and spread across the channels.

Beside these UI buttons is a fourth button: RANDOM PROGRESS. When this button is off, the progress is sequential, from channel 1 to 2 to 3 to 4, then back to 1. When the button is on, the next channel will be randomly selected.

An important thing to note is that these modes only select how the recording signal is distributed between the channels. Recording is always tied to the generated envelope discussed above.

Below these are pixels which identify the channel where audio is being recorded.

On the bottom row are a series of pushbuttons, each titled “OPEN CHANNEL.” They are colored to correspond to the channel controls on the left side. These are used for MULTI-CHANNEL recording.

When a channel is “open,” any recording signal will be directed to it. This way, you can record the same audio into all four channels at once, or two, etc..

If you are using fewer than four channels, the single-channel methods can be used to record into the channels that aren’t “opened.” If you want to disable to the single-channel recording methods, there is a pushbutton on the second page (CTRL 2), in the top left corner, called “AUTO PROGRESS.” When it is on, the single-channel methods remain active; when it is off, only the multi-channel methods are employed. (If it is off and the channels are all closed, no new audio is recorded, which can be useful, if you have a sound you want to play over.)

That’s a lot of information about recording, I know. But the varieties open up a lot of different possibilities and configurations. You probably won’t touch the top half of the controls, concerning the threshold and envelope, very often. And the bottom half of the controls are fun to explore; there are no “wrong” answers here, just different opportunities.

The LEFT SIDE of the control page is simpler. Most of the controls govern individual channels, except a couple of global controls, which pertain to all tracks. The channels are color-coded, with each column pertaining to one of the four tracks.

The top two rows deal with how the recorded material is played back.

The PITCH control determines the playback speed (and thus the pitch) of the material recorded by the looper.

Something to keep in mind is that before new audio can be recorded into a channel, the previously recorded audio must play back. (You can initiate recording before playback concludes, but it will chop up the playback, cutting it off at the moment recording initiates.) In some modes (e.g. single-channel, sequential progress), this probably isn’t a big concern — in most cases, playback will conclude before the recording comes back to that channel. But in multi-channel recording, it is something to bear in mind.

The REVERSE control reverses the playback direction of the recorded audio.

These controls only affect the audio that is played back, once, by the looper. Delay lines are used to create the regeneration buffer, so these controls will not affect audio in the delay lines’ buffers.

The next row — labeled TIME PERCENT — controls the delay lines’ buffer lengths. These lengths are a proportion of the MAX TIME (found on the row below; up to 15 seconds in Loom, up to 30 seconds in Loom XT BL and Loom XT DK; more on those forks below).

Each of the channels’ delay buffers can be set as a percentage of the max delay time. This opens up a number of possibilities for creating phased and syncopated delays, as well as more esoteric temporal conditions. So, for instance, if one channel’s delay percent is set to .500, while another is set to 1.000, the first delay will repeat at twice the rate of the second delay. But since you have four channels, each with its own delay buffer, much more complex variations are possible. These variations expand even further with the BLUR control, which will be discussed shortly.

On the next row are PANNING controls for channels 1 and 4. (Channels 2 and 3 are panned slightly off center, left and right respectively.)

Between the panning controls are two global controls for the delay buffers. MAX TIME, mentioned above, is anywhere from 0 milliseconds to 15 seconds (the patch uses 16 second delays, but I thought 15 seconds would make it easier to calculate the time as a percentage of 15, rather than 16, e.g. if max time is set to .3000, the max time is 4.5 seconds. Increments of 1.5 seconds per every .1000 value added was easier to keep track of in my head).

FEEDBACK governs the feedback regeneration of all the delay lines. Set it very high for looping-like effects. Set it to 0 for single repeats, which can be useful for generating arpeggiated effects.

On the bottom row are ERASE buttons. These allow you to erase the contents of a given channel. Once pressed, you will hear the channel repeat one more time, as they set the feedback level to 0 for that track, which means that audio that is already in the delay buffer will be played (but not repeated; I didn’t have the CPU for individual output VCAs for each channel).

You can also uses these erase buttons to create rhythmic silences or as a short-cut to creating single-repeat delays.

CTRL 2 (second page):

This page houses a couple of things that didn’t fit on the front page.

The AUTO PROGRESS button has already been discussed above. When it is on, the single-channel methods remain active; when it is off, only the multi-channel methods are employed. (If it is off and the channels are all closed, no new audio is recorded, which can be useful, if you have a sound you want to play over.)

The DUCKING control is at the center of the page. This determines how much the delay buffers’ regeneration is ducked by the output of the loopers. With it, you can replace old content with new content, or in more subtle settings, suppress old content to layer it with new content. The ducking can be quite aggressive, so in many circumstances, a little goes a long ways in terms of layering sounds.

One interesting effect is that the looper buffer playing back may be longer than the delay buffer creating the regeneration, which can cause a recording to sort of duck itself — some neat sounds can come out of this.

The ducking option has ATTACK and DECAY controls to give you more options for how smooth or sharp the ducking is.

Beneath the ducking controls is the BLUR control. This is a simplification of the cross-feedback used in a Cosmos-style delay. At 0, all audio is fed back into the buffer it originated from. But as the control is increased, audio is fed from one channel to next, with channel 1’s audio being fed into channel 2’s buffer, and on and on until channel 4 is fed into channel 1.

There are a variety of ways to utilize this feature. If the delay lines are set to unequal lengths, the output will smear together as you increase blurring. If the delays are set to equal lengths, audio will spread across the stereo field, as it travels from one delay buffer to the next. Setting blur to 1.000, and you can get complex ping-pong effects, except across 4 channels instead of two. A whole world of dense, stereo images unfold.


These are forks of the patch. More accurately, Loom is a fork of Loom XT DK. The original patch had a longer delay buffer maximum (30 seconds from joining two delay lines in series). When I decided to add the blurring, something had to go, and I found that 15 seconds was sufficient for many applications. But I wanted to leave the option open to explore the longer delay buffers as well, at the expense of some features, so I created two additional patches. Loom XT DK, the original model, does not include blurring. Loom XT BL does not include ducking.

In most ways they are identical to the patch described above, aside from the features removed to make the additional delay lines fit under the CPU.

However, Loom XT BL has a few additional parameters. One of the two delay lines it uses to implement its longer buffers is interpolated, which allows for smooth modulation. It also means that as the delay times are manipulated, pitch artifacts will be produced (these are generally somewhat unpleasant as the buffer is compressed or stretched rapidly), so be advised (you may want to have the erase buttons on or the feedback set to 0, so the pitch artifacts are removed from the buffer’s regeneration loop as you adjust the time).

The modulation options (found on the second page, CTRL 2) are:

SMEAR, which is a very slow, subtle, randomly controlled sine wave modulation. This purpose of this is less to provide modulation as an audible effect and more to randomly modulate the delay lines slightly, so that when blurring occurs, there is less likelihood of certain frequencies building-up (this can create a sort of whine or hum; it’s generally not much of an issue in the other versions of the patch, if you are ducking the regeneration, but it can occur, especially if you are running the patch for a long time without much input/ducking). It creates a smoother, washier blurring effect, regardless of its impact on frequency build-up.

WARBLE is a “tape-ish” modulation, produced by multiplying three triangle waves together, which are also modulating one another’s rate. At low levels, it can produce a pleasing sway to the delays, with some chorusing, at more extreme levels it becomes more destructive, producing distortions and unexpected pitch jumps.

9 comments on “Loom — a 4-channel interwoven loop-delay
  • beano619 on said:

    Sorry for playing but I’ve doodling with this one for months now and get lost in it. Thank you so much for the time you’ve put into this one and many of the others that I/we love.

  • christopher-h-m-jacques on said:

    I’m not really sure what you’re apologizing for ;) but I’m glad you’re enjoying it! I really like this one and how it came out. (And I also get lost in it — I remember when I was ready to film the demo/walkthrough, I’d sit down with plans to shoot, and I would start playing and forget to get around to recording anything. Usually a good indicator that at least _I_ like the patch, haha)

  • poetaster on said:

    Ah, I’ve also been getting lost in it without even touching any controls ;) Playing mostly with gambe (tenor fidel) and brass input which makes it impossible to touch the pedal while playing :)

    It’s great fun and I’m just ruminating how to get some of the continuity of loom into rivulets which is also great but more difficult to use when playing sparsely.

    All in all, great patches you make!

  • christopher-h-m-jacques on said:

    Well, I am listening now to some gambe, which is an instrument I am sure I have heard before, but which I was not aware of, so thank you for bringing it to my conscious awareness :)

    You might try increasing the density on Rivulets? Er… the density control near the tempo indicator (I named two controls density — this one has the effect of determining how often recording occurs, and thus how long granular elements are held once recorded). It’s probabilistic, so the change in effect takes place time, rather than a single instance. But as the recording likelihood decreases, the granular buffers are held onto longer.

    You might also add a delay line and feed back after the granular effect. I originally had something like this, but the CPU was quite taxed on the Euroburo I built the patch on; if you are using the pedal version of ZOIA, however, there should be more CPU headroom to experiment with.

  • snowdeaf on said:

    This is a wonderful patch.

    Unfortunately the cpu hits 107 almost constantly if you have all the channels set to OPEN causing crackling.
    But other than that this is just amazing! Genius!

  • christopher-h-m-jacques on said:

    You can try the version 1.1 I uploaded just now (in the zipped folder). On a ZOIA, running firmware 3.00, the patch did not exceed 104%; at least in my testing. I don’t think there’s much more “fat” to cut beyond those changes (which did not seem to affect performance).

    If you’re running the patch on a Euroburo — beyond the fact that many of the patches I make these days begin on a Euroburo — once I port them over to a ZOIA to finalize (which can be a matter of simply adding stompswitches or can be a much more extensive process, depending on what I find as I begin to consider publication), I do not make special efforts to make patches cross-compatible CPU wise. CPU can increase quite a lot (as much as ~8-10%) or very little when run on Euroburo as opposed to ZOIA. I got tired of trying to account for it.

    Patches demonstrated on Euroburo, with specific CV applications, are exempt and should run within the CPU thresholds for Euroburo (at least, for the firmware they are issued under; the change from firmware 2.80 to 3.00, for instance, introduced a small, but not insignificant, increase in overall CPU usage in most patches, regardless of whether they used the new modules or not).

    I don’t know if the same issues exist for the XT versions of the patch. I didn’t have them loaded on my ZOIA. If you encounter such issues using the XT versions, please let me know, and I can attempt the same minor changes applied in Loom 1.1.

  • snowdeaf on said:

    Thanks a lot, Christopher! Works much better now. I am on a 3.0 ZOIA as well.

    I intend to use the patch live. The only change that I’ll make (at least try to find out how to make it!) is use the middle stomp as a reset. I don’t need the manual mode at all, but want to make sure that every time I start to play the first CHANNEL is active. I hope it’s easy to do.

  • christopher-h-m-jacques on said:

    If you go to page 4 “Mode slct seq” (mode select sequencer):

    Disconnect the middle stompswitch module on the bottom row from the sample and hold on the row above (it is connected to both input and trigger input; you could just disconnect the trigger input, but you might as well disconnect both).

    Connect that same stompswitch module to the input and trigger input of the sample and hold in the top right corner of the page (100% connection).

    Each time the middle stompswitch is pressed, the “sequencer” for the channels (a sample and hold counter; these are often the “sequencers” for patches in the past couple of years), the sequencer will cue to the last channel… but because of the slightly confusing way in which I’ve programmed this (due to CPU constraints and also just being tired — channels here are largely arbitrary), the next threshold increase will cause the sequencer to cycle and recording to occur on the first channel.

  • snowdeaf on said:

    Thanks a million!
    I use sample and holds as sequencers as well. Probably picked that up from one of your patches.

  • Leave a Reply

    • Platform:
    • Category: Effect Sound
    • Revision: 1.1
    • License: Creative Commons Attribution Share Alike 4.0
    • Modified: 1 week ago
    • Views: 2159
      Likes: 32
      Downloads: 678