This tutorial is based on Tidalcycles version 0.9.10. Some of the latest features (post 1.0.0) will not be presented. Major features and changes were added post 1.0. This tutorial should still work as an introduction to Tidal but might not present the most recent and exciting features.
Welcome to this Tidal Cycles tutorial. This is designed to be used as a worksheet during hands-on beginner/mixed workshops, and is based on Tidalcycles version
0.9.10. By Lucy Cheesman, adapted to wiki format by Alex McLean.
Once everything is installed, follow the following startup procedure each time.
SuperDirtshould be started automatically when you run the SuperCollider IDE application. If now, in the editor window of the SuperCollider IDE, type
'SuperDirt.start'and run the code by holding down
Enter(while your cursor is on the same line as the code).
Launch Tidal Cycles
In Atom, start a new file and save it with a
examples.tidal). Tidal will be automatically launch when you type and execute your first command.
Even if you haven't installed Tidal on your computer yet, it's still possible to play with it online. Estuary lets you play with Tidal and several other live-coding systems inside your browser, without the need to install anything in your own computer.
Estuary is a perfect place to learn, teach, play with others, and test distinct live-coding languages.
However, note that not all features in Tidal will work on Estuary, only a subset (called Mini-Tidal).
Haskell is using double dashes
-- at the beginning of a line to denotate a comment. A comment is a piece of code that will be ignored by the interpreter. You can use comments to take notes in your code. You can also use comments to ignore a specific line or pattern:
The basic format for making sound in Tidal looks like this:
You can stop making a sound using
There are two types of sounds you can use with
sound: either they are synths definitions (like
superpiano, see Synthesizers), or they are samples. In the latter case, you write the name of the folder that contain the sample set. By default, the first sample is used, but you can pick a different sample from the same set, with
Also, it is possible to specify the folder and the sample in two parts:
s is a synonym of
d1 $ s "drum" # n 1 is the same pattern.
Some of the samples which come with Tidal are listed below. Try some out!
You can see what other sounds there are in the default library by looking in the
Dirt-Samples folder. Find it via the
'File > Open user support directory > downloaded-quarks > Dirt-Samples'. Additionally, you can also add your own custom samples.
Make a sequence:
The more steps in the sequence, the faster it goes:
This is because of the way Tidal handles time. There is a universal cycle (sort of like a musical 'bar') which is always running. Tidal will play all of the sounds between the speech marks in one cycle, unless we tell it not to (we’ll learn how to do that later). You’ll also notice
Tidal will space the sounds out evenly within the cycle Which means we can end up with polyrhythmic structures (more on those later). We can change the length of the cycle using
cps stands for cycles per second) - this is a bit like bpm (beats per minute).
You can use
d1, d2, d3...d9 to play multiple sequences at the same time:
You can stop all the running patterns with
hush (or by pressing
You can pause everything by changing the cycle length to a negative number (remember to put negative numbers in brackets).
Start it up again with a positive number
Or you can
solo one channel:
The Atom plugin adds some key shortcuts for this common operations, like
Ctrl+1 to toggle mute for the first pattern, or
Ctrl+0 to unmute all. You can see the complete list of keybindings inside Atom, by going to
Edit > Preferences > Packages, selecting tidalcycles, and scrolling down to the
Let's add some more variety to our sequences:
Add a silence/rest with
Fit a subsequence into a step with square brackets:
This can make for flexible time signatures:
You can put subsequences inside subsequences:
You can repeat a step with
This works with subsequences too:
Or you can do the opposite using /:
* works by 'speeding up' a step to play it multiple times.
/ works by 'slowing it down'.
We can also schedule patterns across cycles using
The syntax we are using in these examples is called mini-notation, and can be used in many places within Tidal, not only the
Other common mini-notation symbols are
| to choose a random option,
, to play two patterns simultaneously, and
! to replicate a pattern.
Choose one of the two samples randomly:
Play a snare and a clap at the same time:
Play three bass drums and a snare:
Note the difference between this and
"bd*3 sn": in the first example there are four events, all of them lasting the same time. In the latter, the three
bd last for half a cycle, and the
sn lasts the other half.
"bd!3 sn" is the same as
bd bd bd sn.
Tidal has lots of effects we can use to change the way things sound.
vowel is a filter which adds a vowel sound -- try
a, e, i, o and
We create patterns of effects in much the same way we create patterns of sounds. We call these effect and sound patterns 'control patterns'. So:
Remember that we can use
"<>" to schedule across cycles:
You can add a non-vowel letter to pause the
Tidal does its best to map patterns across to one another:
The structure comes from the left - try swapping the parameters:
gain changes the volume of different sounds:
note are used for pitching samples.
speed affects the speed of playback (e.g. 2 = up an octave):
Or we can take the pattern from the speed parameter:
note pitches the sample up in semitones (e.g. 12 = up an octave):
pan allows us to create stereo effects (0 = left, 0.5 = middle, 1 = right):
shape adds distortion (but be careful - it also makes the sound much louder):
You can take a look at the Effects section to learn more about effects and to see the complete list of effects. We also suggest you to take a look at the Oscillators section to see how you can apply an LFO to some of these effects.
We can start to make much more complex patterns using transformations. Using functions like
slow you can start to transcend the cycle.
slow stretches the pattern over more cycles:
fast squashes the pattern into less than one cycle. You might also see people writing
density - it’s the same thing. Take a look:
hurry is similar to
fast, but also applies a speed transformation:
See the Time section in the Reference to learn more about time-changing functions.
Tidal Cycles offers many functions you can use to alter your patterns in different ways. In this section, some of them are introduced, but there are many more. You can check these reference sections to find more: alteration, accumulation and conditions.
You can reverse a pattern with
Or play it forwards and then backwards with
iter starts the pattern at a different point each cycle, shifting it the given number of times until it gets back to where it started:
every allows us to schedule transformations or effects in different cycles. The following example will play twice as fast every four cycles:
... or you could schedule an effect in the same way, using
jux (short for
juxtapose) takes a transformation or an effect and plays it in one speaker the original pattern plays in the other speaker:
chunk applies a transformation or an effect to a different part of the pattern each time. For example with 4 as a parameter, it will step through each quarter of the cycle.
More than one transformation is possible! You can chain them together using
Remember that (almost) everything is a pattern so we can apply these transformations to our effects too:
What about slowing down or scaling (using
What is pattern, anyway? Let's think about some different kinds of pattern and how Tidal can represent them.
We can use
n to choose samples from a folder, this allows us to apply patterns there too:
run is a short way of writing out sequential patterns:
or we can use:
Play two subsequences at once by using square brackets (sort of like one big subsequence!) separating with a comma:
If you use curly brackets instead of square you get a different effect. With square brackets both halves of the sequence are fitted into the cycle (polyrhythm). With curly brackets the pulse is set by the left hand pattern. The right hand pattern can then overlap (or underlap!) (polymeter):
If you give two numbers in brackets after an element in a pattern, then Tidal will try to distribute the first number of sounds equally across the second number of steps:
You can use this notation within a single element of a pattern:
You can also add a third parameter, which ‘rotates’ the pattern so it starts on a different step:
Randomness can help us quickly introduce character and variation into our patterns.
sometimes works a bit like
every, but instead of happening after a set period, changes have a random chance of appearing:
often (75%) works like
sometimes (50%) but happens more often:
irand generates a random integer up to the number specified. (e.g. to play a random sample):
rand generates a random decimal between
You can use
degradeBy to remove random elements. The number indicates how likely a sample is to play:
degrade on its own is the same as
Or, you can use
? to remove sounds with a 50% likelihood:
So far we've just used short samples. Longer samples can cause us some problems if we’re not careful. Let’s see what happens with a long sample:
As you can hear, Tidal will keep triggering the sample each cycle, even if it’s very long. Even if you stop the pattern playing, you will still need to listen while the samples play out. You can use
cut to truncate the sample when the next one is triggered:
The number in
cut define a group, so you can play with interference across different patterns:
legato also truncates samples, but using a fixed length:
We can also
chop samples for a granular synthesis effect:
striate is similar to
chop but organises the playback in a different way:
randslice chops the sample into pieces and then plays back a random one each cycle:
We can also use
loopAt to fit samples to a set number of cycles:
As always we can add patterns and transformations to these functions, or combine them for interesting effects: