Longer compositions in tidalcycles

I find it incredibly easy to noodle around in tidal: making loops and chopping samples and effects, etc. Composing an entire track naturally requires more forethought, but given the cyclic nature of tidal, I’ve found it incredibly difficult to come up with a consistent structure for long-form composition (which for me is a long string of let and ur statements that ends up just turning into a longer, more complicated loop).

I was wondering if anyone has tried composing an entire song (as in: evaluate one block and the song plays), in just tidalcycles, And if they’ve done it more than once, how have they done it?

2 Likes

For awhile, I was using let to define different scales, harmonies, chord progressions for a song and then executing it line-by-line (sometimes block-by-block). I never found tidal to be linear - I really enjoy the non-linear, performative nature of it. Doesn’t orca do something like sequencing different tidal snippets along a timeline? Maybe that’s what you’re looking for?

1 Like

seqP could work for this. Build up sections and then run them at specified cycles

2 Likes

Sometimes I find it useful to use tidal for idea generation and then leave the linear arranging as a later task in a DAW. I’ve also used ur for this with some mixed results. With ur what I’ve found works best for me it to compose the sections as regular tidal patterns (without ur) and then refactor into a structure with ur.

I also made some utility functions to make ur easier to deal with.

mkpat name pattern = (name,pattern)

mkfx name fx = (name,fx)

I also added the following snippets to atom because I could never remember the syntax that ur requires:

  'song - ur template - length channel':
    'prefix': 'urt'
    'body': 'let\n    songLen = $1\n    structure = ""\n    patterns = []\n    fx = []\n    in\n    $2 $ ur songLen structure patterns fx'

  'song - template':
    'prefix': 'songt'
    'body': 'do\nd9 $ midicmd "stop" # s "midi"\nhush\n\ndo\ncps (128/60/2)\nd9 $ midicmd "midiClock*48" # s "midi"\n\nd9 $ midicmd "stop" # s "midi"\n\nd9 $ midicmd "start" # s "midi"'

Anyway, still an area I’m trying to figure out too. Hope that’s useful.

1 Like

to build on this a bit, i made some utility functions that make it easier for me to use seqP. I stole some ideas from gibber’s syntax. I hated balancing the parens and braces so:


let measures n p ms = (n, p):ms
    loopend n p = measures n p []
    songLoop ms = seqPLoop $ structureSong 0 ms
    structureSong st [] = []
    structureSong st (p:ps) =  (st,(st+(fst p)),snd p) : (structureSong ((fst p)+st) ps )
in
d1
$ songLoop
$ measures 2 (s "bd(<3 5 7>,8)")
$ measures 2 (stack [s "bd(5,8)", s "~ sd"])
$ measures 2 (stack [s "bd(5,8)", s "~ sd", s "hh*3"])
$ loopend 2 (s "rm*8?")

I grew very frustrated with Tidal early on when I tried structuring music in familiar ways. For me, it works much better as a generative tool that just continuously runs and I’m never really sure where it begins and ends.

That being said, I do try to introduce some structure with liberal use of whenmod, every, and const. With this I can at least achieve things like Part A and Part B. However it’s really out of my hands. I write code where I don’t really know when Part A or Part B might be played.

As others may have mentioned already, seqP and setting cps to 0 (or -1?) might be what you want for more deliberate sequencing and timing.

3 Likes