Rivulets — a textural 4-part granular processor
Rivulets began as an attempt to make a sort of “live recording” Tiny Orchestra (https://patchstorage.com/tiny-orchestra-time-stretching-to-reveal-hidden-symphonies-within-sound/), where frozen/slowly scrubbed sounds would fade in and out. You -can- achieve a somewhat similar effect — to a degree — with Rivulets, but there wasn’t room in the CPU for a reverb, which does a great deal in that patch to smooth out the rough edges (pro-tip: place a reverb after this patch, or as I do in some of the examples in the video, a weird reverb/delay hybrid like For Keith Barr: https://patchstorage.com/for-keith-barr-a-reverb-delay-inspired-by-a-legendary-developers-design/). Something of the sort remains an interest, so you may see me return to the drawing board on the concept at some point in the future.
But what turned up in its place was satisfying in its own right: a glitchier, buzzier granular patch that reminded me a lot of the turn of the millennium ambient guitar work (+ computer programs) of artists like Christian Fennesz and Jim O’Rourke. Rhythmic remnants, sustained sounds, glitchy repeats, whispers of the input… a great deal of texture can be wrung from Rivulets.
The basic explanation of the patch is: Four granular modules operate in parallel, fading in and out as they capture and process frozen sounds held in their buffers. The capture is determined probabilistically; one granular module might be active, or all four, or none, at any given point. The pitch, grain size and density of the granular modules can be set individual (or in the case of grain size and density, linked to a single control). And they can be set to randomly jump in pitch, intensifying the glitchy, prismatic aspect of the patch.
The dry signal is passed in stereo. The wet signal is summed to mono before a (fairly simple, to be honest) stereo image is created through a Haas effect.
Left stompswitch — tap tempo (replicated by a UI button on the control page; the patch also accepts MIDI clock; if you load this patch on a Zebu, the CV 1 input can be used to accept internal clock)
The tempo controls a few things: how often new recording periods occur (governed by the density control), the “clocked sync” setting (which syncs the grain size to the clock), and the clock divided pitch jump setting. Because of the recording mechanism, new granular buffers may not necessarily coincide with the global tempo’s beat (e.g. the fade setting affects this time, as do some of the peculiarities of the granular buffer itself) — for tight integration between clock and granular output, you will probably want to look for another patch.
In the top left corner is the global TEXTURE control. This applies an amplitude envelope to the granular modules, with more applied as the texture reaches 1. (Note: because this affects the amplitude of the grains, this also affects the overall amplitude of the wet signal.)
Going down the leftmost column, below the texture control are PITCH controls for each granular module. You can set each granular module’s pitch individually, to provide a greater variety of tones.
Skipping the control at the top of the next column for the moment, next to each pitch control is a MUTE button. When the button is lit/bright, the corresponding granular engine will mute (respective of the fade settings, more on those in a moment). The patch can get quite thick, and sometimes it’s nice to be able to thin it out a little.
At the top of the mute button column is a button CLOCK SYNC, which will sync the grain size of all the granular modules to the tap tempo/clock.
Next to the clock sync button is a button SYNC GRAIN SIZE. When clock sync is disabled and this button is enabled, the top GRAIN SIZE control in the column below will act as a master control for the grain size of all the granular modules. When both clock sync and sync grain size controls are disabled, each granular module’s grain size can be independently set using the grain size controls below. Settings above ~.75 retain some of the character of the original audio, while settings below this (as grain size drops below ~50 milliseconds) exhibit characteristics more akin to a wavetable derived from the incoming audio.
At the top of the next column is a button SYNC DENSITY. Like the grain size, the density controls can be synced to the topmost DENSITY control in the column below, to allow it to act as a master control for all the granular modules. When sync density is off, each channel’s density can be set independently. (Tip: I’ve worked hard to keep this patch in check, CPU-wise, but granular modules are very dynamic; if you find yourself in a situation where you experience clipping it is most likely because all the granular modules’ densities are at 1.000. Setting even one channel a tiny bit below 1.000 can usually greatly improve the CPU performance.)
A triangle LFO is used to scrub the position of each granular module’s buffer. Depending on the LFO settings (and the grain size settings), this can provide a sense of movement for the sounds in the granular buffer, introduce compression/expansion of the buffer length, appear to change the playback direction, and/or introduce glitchy artifacts.
At the top of the next column you will find a pixel labeled SCRUB LFO, which shows the output of this LFO (including its attenuation; more on that in a second). Below this is the SCRUB LFO SPEED… which sets the LFO speed; it can go very slow or somewhat fast (its maximum speed is about twice as fast as the granular buffers’ length of 1 seconds). The SCRUB RANGE LOW and SCRUB RANGE HIGH attenuate the range of the LFO — setting the low while set the the minimum position it scrubs from, while setting the high will set the maximum position it scrubs to. (You can set the low setting higher than the high setting, which inverts the LFO — this doesn’t do anything interesting — and then the roles of the controls reverse.) If you want to disable the LFO, you can set the ranges to the same values, which will fix the granular position at that point. The SPREAD control randomly moves the baseline position of the bottom three granular modules each time their buffers are triggered; this can create more variety in the output of the patch.
The PITCH JUMP control in the next column determines the likelihood that the pitch of the granular buffer will shift. At 0, no pitch jumps will occur; as the control increases, they are more and more likely to occur — at 1.000, there is a 66% chance (approximately) the pitch will jump. The PITCH JUMP RANGE sets the pitch that will be jumped to — e.g. at a pitch jump range of +1 octave (A1), the buffer will either play at its original pitch, or one octave above that pitch, -or- one octave below that pitch. (If you set the pitch jump range to -A1, the same will results will occur.) If you only want to pitch jump in one direction, e.g. only up one octave instead of up or down one octave, you can use the PITCH JUMP RECTIFY button, which will cause the pitch jumps to only occur by the amount set by the pitch jump range control. The rate at which pitch jumps are calculated is based on the PITCH JUMP CLOCK DIVIDER found on the second page; this is a division (or more likely, multiplication) of the tap tempo/clock.
The next section deals with how the granular modules are triggered. The TAP TEMPO control (already mentioned in the stompswitch section; can be set by means other than tap) sets the “window” when recording into the buffer occurs and when the frozen buffers are played back. Sitting beside the tap tempo, the DENSITY control determines the probability of playback in a given clock cycle. At 0, no playback occurs. As you increase density, the number of modules likely to play back their buffers increases -and- the likelihood that they remain open longer between recordings increases. At 1, no new audio will be recorded, only playback will occur. (I do realize, admittedly only after the fact and having already shot the demo video, that there are two different ‘densities’ in this patch. In both cases, the word feels apt, to be honest, so I’m not sure I would change the name, even if I had made this realization in time. One has to do with the density of grains within the granular module, and one has to do with the density of granular module output overall. So, hopefully this is not confusing; you can always rename the control to something else if it bothers you too much.)
Below this is a sort of dynamics control section (more or less). The FADE TIME affects how quickly the granular modules fade in and fade out once they are frozen. The range of the control is determined by the tap tempo/clock — at 0, no fade it applied and the output of the modules simply turns on and off. At .5, the fade lengths are equal to the set tempo. At 1, the fade twice is twice the set tempo. One thing to keep in mind is that material will only be recorded into the granular buffers once the envelopes used to control the output VCAs close entirely, so the fade time can affect how often the granular buffers refresh (especially at longer fade times).
There is also a crude DUCKING control. This will duck the dry signal when the granular modules’ VCAs open. It is designed so that even when only one granular module is unmuted, at 1.000, the dry signal can be entirely ducked. But that means that if all four granular modules are active, the dry signal can be ducked entirely at .2500 (provided all of their envelopes are open). Also, since it is based on the envelopes, rather than the amplitude of the output itself, a granular buffer might record silence or a very quiet sound, but it will ‘duck’ the input as much as a granular module outputting a much louder signal. It’s not perfect, but used subtly, it can provide some nice crossfading/melding between the input and the frozen, granulated signal. And at more extreme settings (particularly with little to no fade), it can have an interesting glitchy aspect.
Finally, in the bottom corner are WET and DRY LEVEL controls. It should be noted: the wet signal can actually get quite loud, as it is the sum of four granular modules. I’ve attenuated their outputs some, but even so, it can get quite loud in some settings.