Rot that rotates also the rests, i.e. not preserving the structure as rot does?

Is there a way in tidal to rotate a pattern not preserving the structure as rot does? E.g.
other_rot 1 "a ~ b c"
would result in:
~ b c a

In this case you could shift time by a quarter cycle:

`0.25 <~ "a ~ b c"

However that wouldn't work for

"[a ~] b c"

So the short answer is no - rests aren't events, but the absence of events, so aren't structural elements that can easily be moved about. ( It's something I've thought about in the past though - https://github.com/tidalcycles/Tidal/issues/250 )

There are similar things which are doable using boolean patterns, which we'll come to.

1 Like

Thanks a lot, Alex!

Here's my cobbled-together attempt at a simplified Steve Reich's "clapping music".
I'm not repeating each shift of the pattern 12 times, but rather 2 (best heard when using the "debugging" arpy-pattern instead of the clap:3-pattern). Still, towards the end of the 12ths shift the displacement seems to be less then an 8th note.

hush

resetCycles

setcps (-1)

setcps 0.4

twelfthPat = "<0.0 8.333333333333333e-2 0.16666666666666666 0.25 0.3333333333333333 0.4166666666666667 0.5 0.5833333333333334 0.6666666666666666 0.75 0.8333333333333334 0.9166666666666666 1.0>/2"

clapPat = "arpy:7 ~ ~ ~ arpy:8 ~ ~ ~ arpy:9 ~ ~ ~" -- for debugging

clapPat = "clap:3 clap:3 clap:3 ~ clap:3 clap:3 ~ clap:3 ~ clap:3 clap:3 ~"

d1 $ stack [
  sound clapPat # pan 0,
  twelfthPat <~ (sound clapPat) # pan 1
]

There were two issues apart from the wrong displacements mentionend above:

I didn't manage to get the patterns to start synchronously at the beginning.

Also, generating the pattern of 12ths-shifts like this:

import Text.Printf

twelfthPat = "<"++ concatMap (printf "%f ") [ x/12 | x <- [0..12]] ++ ">/2"

failed. I had to print the twelfthPat variable and then copy the output from the status window and paste it as a literal string:

"<0.0 0.08333333333333333 0.16666666666666666 0.25 0.3333333333333333 0.4166666666666667 0.5 0.5833333333333334 0.6666666666666666 0.75 0.8333333333333334 0.9166666666666666 1.0 >/2"

I'm eager to learn about more Tidalish ways to achieve this!
Thank you!

1 Like

Good stuff!

You can specify exactly a twelfth of a cycle in the mini-notation with "1%12" So that could be "0 1%12 2%12" etc. Alternatively you can specify it as "0 .. 11"/12, or using the run function, run 12/12.

To superimpose a copy of a pattern on top of itself with a pattern applied, you can use superimpose, e.g. d1 $ superimpose (twelfthPat <~) $ sound clapPat. I like jux, which is similar but pans the original and the transformed patterns hard left and right respectively.

resetCycles is inaccurate. There's also reset, so reset 1 retriggers the pattern when d1 is updated.

So here's my effort:

d1 $ reset 1 $ jux ((slow 144 $ run 12/12) <~) $ sound "cp!3 ~ cp! ~ cp ~ cp! ~"
3 Likes

gasp!

Interesting. In SuperCollider a Rest is a silent event, rather than a non-event, which seems musically intuitive to me.

Yes I think it would be better to have silent events. It's still something I'd like to fix in Tidal.

The philosophical question is, what's the difference between two rests in a row, and a long rest? :slight_smile:

1 Like

I prefer this version:

d1 $ reset 1 $ jux (repeatCycles 12 . iter 12) $ sound "cp!3 ~ cp! ~ cp ~ cp! ~"

It seems closer to idea of the composition.

3 Likes

Erwin Schulhoff (1919) "In futurum"

Definitely more expressive / less cognitive load / easier to configure. Thank you!

1 Like

Nothing, in notated music you'd use the simplest (or clearest) notation for the duration of the resting event. But when it comes to steps the durations are implicitly specific durations relative to tempo, so a longer rest is just two (or however many) rest-events in a row. But in TC it's cool 'cause you define the steps themselves, making complex rest structures. I mean this kind of asks the question (to my mind at least), what is the difference in TC between a sustaining event (i.e. legato 2) and a resting event? You say that the rest is a non-event, so does that mean that for any given point in the cycle the structure is either firing an event or not, rather than patterning the durations of events?

PS. Thanks for pointing me towards the Clapping Music stuff! This is so fascinating. :smiley:

d1 $ reset 1 $ jux (repeatCycles 12 . iter 12) $ sound "cp!3 ~ cp! ~ cp ~ cp! ~"

I'm running tidal-1.9.3. reset 1 doesn't work:

<interactive>:14:6: error:
    Variable not in scope:
      reset :: t0 -> Pattern ValueMap -> Pattern ValueMap

I fixed it like this:

do
	resetCycles
	d1 $ jux (repeatCycles 12 . iter 12) $ sound "cp!3 ~ cp! ~ cp ~ cp! ~"

Is this currently the way to go? Thank you!