Isorhythms in tidal

I got interested by a previous reference from @ana.mora to isorhythms and I have been trying to define the same concepts in code. But I get to this problem which I can't wrap my head around.

Let's say I have a super-easy talea of equal durations with a pause in the third step:
let talea = "t t f t"
and a super-easy color:
let color = "0 1 2 3"

Now, when combining I would like to have something like 0 1 ~ 2 3, i.e. a 5-step long melody where each step is a quarter of a cycle.
But when doing $ mask talea $ note color the result sounds like 0 1 ~ 3 for each cycle.
I know I could obtain something similar with let melody = "{0 1 ~ 2 3}%4" but I would really like to keep both the rhythm and the melody separated.

Does anyone have a handy hint on how to achieve it?

1 Like

fit might be good for this.

But how do you get a 5-step rhythm from "t t f t"?

I think I might understand what you are saying- you want a way to have the top level events of patterns step at the same rate implicitly instead of being squeezed into a cycle? Do I understand this correctly? So like, the events in "0 1 2" and "a b" would become 0a 1b 2a 0b 1a 2b etc...

@yaxu ideally you want to map the notes in the color to the durations in the talea only - not the pauses. That is why I was picturing something like 0 1 ~ 2 3 as final result.
@eris yes, ideally I want to have the events in "0 1 2 3" mapped only to the t .
Perhaps I am tackling this from the wrong angle.

Ok, I think I got to understand one thing: I can achieve what I want if I have both talea and color within a cycle. E.g. "t t [f t] t" and "0 1 2 3" do what I wanted and the result sounds like "0 1 [~ 2] 3".

But say that now I add one more subsequence, i.e. "t t [f t] [1!2]". The triggered events from this binary pattern are 5, but I have only 4 events in "0 1 2 3", meaning the 3 will be repeated instead of having the last event in the cycle being 0. Do you see what I mean?

@mattia.paterna is this what you're looking for?:

d1 $ gain "{1 1 ~ 1 1}%4" # up "{0 2 4 5}%4" # s "arpy"

1 Like

@SpacepersonJ sorry didn't see it!

hmm I would say almost, but not entirely. That is because your code gives me this:

tidal> gain "{1 1 ~ 1 1}%4" # up "{0 2 4 5}%4" # s "arpy"
(0>¼)|gain: 1.0f, note: 0.0f, s: "arpy"
(¼>½)|gain: 1.0f, note: 2.0f, s: "arpy"
(¾>1)|gain: 1.0f, note: 5.0f, s: "arpy"

where the last event in the first cycle is note: 5.0f instead of note: 4.0f. And when going on in the progression, the "missing" note will be different, e.g. 0 2 ~ 5 0 2 4 ~ 0 2 4 5 ~ 2 4 5 etc. whereas in my case there would be no missing note.

Ideally I would love to have this:

"{(1, 0) (1, 2) ~ (1, 4) (1, 5)}%4"

where the first value in the tuple is gain and the second is note. I think this is not possible with the mininotation though.

Hi @mattia.paterna, did you ever find a solution to this? I have been racking my brain trying to figure it out too.

So you have a four things [0,1,2,3] and want to fit them to a rhythm with 5 things 0 1 [~ 2] [3 4]
that would be fit 5 [0,1,2,3] "0 1 [~ 2] [3 4]". That would give "0 1 [~ 2] [3 0]" for the first cycle, and "1 2 [~ 3] [0 1]" for the second.. Is that what you want?


Thank you @yaxu. I found this thread because I had the same question as @mattia.paterna.

fit works well and accomplishes the basic isorhythm idea of separate pitch and rhythm cycles. I agree with @mattia.paterna that keeping the melody (color) and rhythm (talea) as separate as possible would open up lots of possibilities, especially if algorithmic transformations could be applied to the melody or rhythm separately.

Is it possible to apply transformations to only the rhythmic pattern (second variable) inside of fit? For example, could (scan(15)/16) <~ below apply only to the rhythm but maintain the same melodic sequence? (As is the <~ obviously shifts both melody and rhythm.)

$ ( scan(15)/16 )
<~ n (fit 6 [0,4,-2,9,5] "0 1 ~ 2 ~ ~ ~ 3 4 ~ ~ 5 ~ ~ ~ ~")
# s "supervibe"

I'm still a Tidal novice and have only started to explore the possibilities with let and do blocks, which I suspect might be a solution. I'm coming to TidalCycles from SuperCollider and am still getting used to how it handles variables and modularization.

1 Like

Hi, I'm not exactly sure what scan(15)/16) <~ does but if you want it to only apply to the rhythmic pattern rather than the outcome of fit then you'd do

d1 $ (n (fit 6 [0,4,-2,9,5] ((scan(15)/16 ) <~ "0 1 ~ 2 ~ ~ ~ 3 4 ~ ~ 5 ~ ~ ~ ~")))
  # s "supervibe"

I'm not fully sure that I have the parenthesis right there but you get the idea..

Isorhythms are now easy with the new state values


Ooh exciting!

There's also this standard techno trick where a pulse "1 1 ~ 1 ~ 1" when applied to a progression of "a b c d e f g" would output "a b ~ c ~ d" "e f ~ g ~ a".

I've been wondering how to do this recenty... is this easily achievable at the moment in tidal?

edit: I think rot with a polymetre and timeLoop might get there? Alteration | Tidal Cycles

This was a while back, but I went with tidalcycles generating midi notes, while pure data would have the sequence. Each pulse from tidalcycles would trigger the note I wanted.

I think this should work, can't test -

struct "1 1 ~ 1 ~ 1"
$ s "arpy"
# noteCount "n" [0..7]


1 Like

What's noteCount?

It isn't searchable on the website.

Just check the link provided above - that's the closest you'll get to documentation. It's the same as nCount except it works with note (pitch adjustments) instead of n (sample index or midi note adjustment, depending on the context you're using it with)

I couldn't get noteCount to work, but things like this do...

j1 $ struct "<t t@2>" $ s "vrm" # nTake "notes" [0..4]

1 Like

Cool - I apologise, I didn't test before writing.

Strangely, this does work also:

d1 $ struct "1 1 ~ 1 ~ 1"
$ s "arpy"
# nCountTo "n" "<4 8>"

I'll have a dig when I get a moment, try and find out what happened to nCount

1 Like