Cycles COMP - Loops, Timing, Shaping


I've evolved this component over the last few years to suit the style of VJing I do, trying to get the most timing control with the least amount of scrambling around while playing. This is where it's at now.

The Cycles COMP lets you tap in a beat, adjust the BPM, generate a variety of ramp loops synced to beat cycles, and then time-warp them.  You can shape a lookup waveform and then output values that can be used to drive anything such as movie loops, parameters, etc.  As a timing source you can alternately use Ableton Link.

[Nov 2021 - added Ableton LInk option]

It's a big UI but you can hit the + button to get the parts separately. There are three main parts that can be extracted from this COMP separately.

Master Clock

You have to establish a beat-per-minute somehow. Usually there's no Ableton feeding in, no MIDI clock, so you have to DIY. You have ears so use them. The master clock lets you type in a BPM parameter. More practically, you can tap in a beat. Either on the Main Clock parameter page or on the UI panel with Listen/Tap/Sync which is designed for a mouse interaction or a touch screen, you turn on the Listen button, then you press Tap EVERY 4 BEATS until the BPM stabilizes, and then turn off Listen. (For a touch screen you can change Listen to a momentary gadget.). The UI on the Taps panel lets you step up/down the BPM via the + and - buttons. The BPM is established, and the single channel that is output from the master clock is a constantly-increasing ramp that increases by 1 unit every 4 beats, which drives the three Cycle COMPs.

The Sync pulse lets you reset the clock.  The other parameters on Master Clock are described below.

If you have Ableton Link, then in the network, use the Ableton Link CHOP and ONLY output its Count+Ramp channel (on the Output page). Connect it to the CHOP in the network named "count". Then you don't need to Listen/Tap (but you won't enjoy the effect of visuals slowly drifting in and out of sync with the music!).

Cycle1 to Cycle3

This is similar to what the Beat CHOP does but there is a lot more flexibility. Each Cycle COMP (3 in this case) receives the constantly-increasing ramp from Master Clock but each can do different things with it.

At the top of each Cycle COMP, you set the number of beats per "cycle" and the number of "steps" within that cycle. On the output page you set what channels you want to monitor and output. For every cycle (say it's 8 beats), you can output a ramp, a pulse, and an integer cycle count. For every step (say there are 4 steps, i.e. 2 beats), you can output a ramp, pulse and integer step count, and also the step fraction, and a random # per step.  These channels of cycle1-3 are merged together and output as a CHOP from the Cycles COMP, and can be mapped to anything in TouchDesigner, using Lookup CHOPs, S-Curve CHOPs, Pattern, Math etc.

The timing of each cycle1 to cycle3 can be individually altered and warped. With unscripted VJing, you are mostly following the music and not leading it, and there is always some degree of unpredictabiity to which you need to react fast, otherwise the visuals will not feel well-connected to the sound.

cycle1, cycle2 etc generates all the repeating channels based on an incoming always-increasing clock in units of beats, like you get from Master Clock. (Without an incoming clock it uses the Abelton Link CHOP - its "count + ramp" channel that rises by 1 unit for every 4 beats.)

In live VJing, your media may be progressing along with the main rhythm (like loops playing, or effects moving), but a lot more happens in music that causes you to want to diverge and then return to the main tempo. The music will have layers dropping out and in, and sounds pushing in intensity and speed. Some styles of music like drum 'n bass and jungle have extreme and unpredictable break-downs, speed changes, dropouts, overdubs, jabs, all to return to a main tempo. 

Each Cycle COMP has two sliders that help you deal with those transient things: Hyper Pause and Hyper Speed. When they are both 0, the ramps are generated normally along with the established BPM. But as you move Hyper Pause to 1, the output slows down to 0 speed.  When you move Hyper Speed upward, all the outputs increase in speed, but to cut all that out in one shot, press Hyper Reset and it sets everything back to the established speed.  Because each Cycle COMP has their own Hyper sliders, some parts of your visuals can continue at the normal looping and other parts can dragged down or push faster. This gives you a lot of simple control of your muti-layers.

The same Hyper sliders exist globally on the Master Clock.

Bar Phase lets you change the phase shift of your cycles, though these give abrupt changes, which can work in your favor. And the Step Forward and Step Backward pulses lets you do a bunch of small time jumps.

Map1 to Map5

Each Map gets a timing channel from one of the three Cycle COMPs. Then you build a wave shape, and the timing channel is used as an index to get a value from the wave shape.  Then you can re-range the value and map it to a parameter.

The In page gives the map an optional name, and selects from which Cycle 1, Cycle 2 or Cycle 3 you want to get your index channel (Cycle parameter value 1 to 3). Then you choose which waveform from the cycle you want to use - the Cycle Ramp, the Step Ramp, the Step Fraction (a discrete-ized step ramp), the Step Random channel (parameter value 1 to 4).

The Shape page shapes your waveform. It's divided into two parts determined by the Split parameter. The Delay holds it constant at 0 for some time, Bias affects how fast the value rises, Ease turns the linear wave into an Ease In and Ease Out. Hold keeps it constant at the peak, Tail keeps it constant at 0 at the end. The Reset pulse lets you start re-building the shape all over.

Normally the start of the wave corresponds to the start of a timing ramp. But you can make it start at the split point by toggling Start Cycle at Split parameter.

For added drama, Flash causes an extra peak at the split point, and you can set the Hold value to determine the length of the flash. As Flash increases to 1, the waveform drops to 0, so their sum is always 1. But if you move Flash above 1, it overdrives and brings back the waveform up to a sum value of 2, then above a Flash value of 3 the peak keep increasing.

The Out page will re-range the 0-1 values to any range. The Value parameter is read-only, where you can see the current value. You can connect this to any parameter: Either (1) right-click on the Value parameter and select Copy Parameter, then go to any numeric or toggle parameter, right-click on it, and select Paste Reference to put an expression in that parameter.  Or (2) drag-drop the Value parameter to any other parameter and select Paste Reference. 

You can do this a number of times for one map - of course the range will be the same for all, but once you Paste Reference, you can add to the pasted expression more math to re-range the value or do anything you want to the incoming value.

In adddition to the Shape Value parameter being available for mapping to other parameters, there is also the Cycle Count paramter (the always-increasing ramp) and its Speed - how much the cycle count goe up every second.

The Clear Mappings isn't done yet so you will have to remember where you mapped to.



This is a large size panel component, but if you press + at the top of the UI, it will bring up a smaller floating window (miniPanel) where you can choose your sections separately, which is less efficient while performing, but is fully-functional.  You can build that smaller UI into any of your control panels, and not bother with the large UI.

I also put a Null CHOP on the output of cycles and grab channels from there.  

You can pull out cycle1 and use it on its own. You can use a Select COMP and put the listenTap COMP somewhere else in your UI.

With a small bit of work, you can pull out map1 and use it separately to generate shapes, re-range and map values as above..

Feedback welcome.

J Dilla - Sunbeams

Asset Downloads

cycles.7.tox (31.64 KB)