State Values

State values were recently introducted in Tidal version `1.7.2`. For a more `in-depth` introduction, Alex McLean prepared a Google Slides document you can take a look at. It will explain why such a feature was needed and how it was implemented.

The problem with state#

What is the problem? It's tricky to get events to line up. Let's say that you wanted to pattern the structure independently from the notes (isorhythm?):

d1 \$ slow 2 \$ sound "alphabet(5,8)" # n "0 .. 4"

There are ways to fix this (e.g. with the `fix` function), but they are not too satisfying/easy.

Introduction to State Values#

But now you can use a state value called "susan" to take values from a (circular) list:

d1 \$ sound "alphabet(5,8)" # nTake "susan" [0 .. 4]

If you change it on-the-fly then you have to wait for the list to empty before it changes:

d1 \$ sound "alphabet(5,8)" # nTake "susan" [7]

It can cope with infinite lists, but then the list will never empty:

d1 \$ sound "alphabet(5,8)" # nTake "susan" [0 ..]

You can stop it and it will always start from where it left off:

d1 \$ sound "alphabet(5,8)" # nTake "susan" [0 ..]

You can also just count without a list:

d1 \$ sound "alphabet(5,8)" # nCount "harold"

This is the same named state as used by `setF` and for reading from OSC/MIDI. So you can reset the counter like this:

setF "harold" 0

Or have another pattern use it:

d2 \$ sound "newnotes*16" # n "^harold" # gain 1

There is also `nCountTo` to counting to a modulo:

d1 \$ struct "t(7,12,3)" \$
sound "gretsch"
# nCountTo "rachael" 5

Un-intuitive behavior#

You can pattern that.. It starts behaving in ways you wouldn't expect from a Tidal perspective though.. Because the counter runs independently from the pattern:

d1 \$ struct "t(7,12,3)" \$
sound "gretsch"
# nCountTo "rachael" "<4 8>"

Likewise, `rev` won't reverse the counter:

-- notes go up
d1 \$ sound "newnotes(5,8)" # nCount "harold"

The structure is reversed, but the notes still go up:

d1 \$ rev \$ sound "newnotes(5,8)" # nCount "harold"

You should be able to add `Take` to any control, and `Count` / `CountTo` to any numerical control.

warning

This feature is unstable, so these names might change.

Last updated on by Raphael Forment