Jump to content

TidalCycles


Yaxu
 Share

Recommended Posts

I’m struggling to install MIDI out, and for some reasons can’t make bps / cps work right : where di you guys get the most current / up-to-date info ?

Aside from these hiccups, this thing is super intuitive and surprisingly fast to grasp : pure bliss.

Link to comment
Share on other sites

tidalcycles is awesome. much easier to use as a language for sequencing/sampling then something like Supercollider. the guy in the video, Kingdohm, is super helpful and has video tutorials on youtube and twitch. I have MIDI out working well, and now looking to get MIDI in. I think this was recently implemented and worth checking out:

 

https://tidalcycles.org/index.php/Controller_Input

Link to comment
Share on other sites

... and Kindohm's tunes are pretty fantastic too, and I'm so grateful he's offering several track walkthrough videos too.

 

I got MIDI Out to work pretty effortlessly... as soon as I watched the video you posted acid1, and had a pretty great acid loop going in a couple of minutes (using TC to control u-he Bazille, hosted by Live).

 

TC is beyond amazing, I totally gel with it : idk, it feels natural to directly write patterns when you've spent the last two decades making computer music hehe. And It's fascinating how it sort of reveals another facet of your musical personality : the melodies I get sound just like me, but in a totally fresh new way.

 

Now I have to install Link for TC (saw a GitHub repo offering that, will be perfect for me) and make sense of the way velocity works. Using SuperDirt / MidiOut etc... I had to came to weird values to get the usual 63/127 velocities (like, 127 = 1.2575 IIRC, wtf?) while I've read / seen it should be within the 0 to 1 range.

 

Still have a lot to learn but gosh I'm ecstatic, this was exactly what I needed.

Link to comment
Share on other sites

... and Kindohm's tunes are pretty fantastic too, and I'm so grateful he's offering several track walkthrough videos too.

 

I got MIDI Out to work pretty effortlessly... as soon as I watched the video you posted acid1, and had a pretty great acid loop going in a couple of minutes (using TC to control u-he Bazille, hosted by Live).

 

TC is beyond amazing, I totally gel with it : idk, it feels natural to directly write patterns when you've spent the last two decades making computer music hehe. And It's fascinating how it sort of reveals another facet of your musical personality : the melodies I get sound just like me, but in a totally fresh new way.

 

Now I have to install Link for TC (saw a GitHub repo offering that, will be perfect for me) and make sense of the way velocity works. Using SuperDirt / MidiOut etc... I had to came to weird values to get the usual 63/127 velocities (like, 127 = 1.2575 IIRC, wtf?) while I've read / seen it should be within the 0 to 1 range.

 

Still have a lot to learn but gosh I'm ecstatic, this was exactly what I needed.

 

I've been using TC with Diva. I'd be interested to hear what you've conjured up with Bazille.

Link to comment
Share on other sites

I'd love to hear that Ovitus. Diva is a lush synth, I've done 100% of the LP in my sig with it. But ever since I've dived deep into Bazille I haven't used anything else really. I'm trying to get it to imitate additive synths à la Razor / Harmor (to get the same sort of sounds as Gabor Lazar, or Kindohm's Lime), keep on failing... but am finding amazing yet different sounds instead.

 

I have yet to modulate Bazille using TC : I'm a bit worried TC's CCs might be steppy (if trying something a bit more complex than a sine fonction ?). But I'll investigate it ASAP hehe.

 

Currently I've set TC to sequence Live, and use that new M4L extension Signal for all my modulation needs (aside from Bazille's wires of course). I'd be happy to do it all with TC though : the simpler my setup the better.

 

I 'm about to  buy a sketchbook and to start writing down / sort out every piece of info I can gather regarding TC's language and syntax. I'm genuinely fascinated and want to know / understand it all.

 

Any advice ?

 

I'd love to hear your algorave tunes Gentlemen, and will hopefully share some in a not too distant future.

Link to comment
Share on other sites

Bazille is intriguing. modular synthesis must be way more complicated to patch compared to subtractive. I really love the sound I get from Diva and other U-he filters like Satin and Presswerk. Plus they run natively in Linux. They're CPU intense, but I have another rig I can use if my laptop can't handle what I throw at it. So far I'm keeping things relatively simple.

 

Here's a wiki on TC Midi, it includes CC modulation:

http://blog.tidalcycles.org/superdirt-midi/

 

d1 $ ccn "1*64" # ccv (range 20 100 $ slow 3 sine) # s "midi"

 

I've been doing something like the above, where the '1' can be any controller number, and '64' is the amount of steps you can adjust to make it smoother or more rigid.

 

Right now I've been using 'do' blocks to create variables that I can use to adjust multiple parameters at once, also each connection is its own variable, so I can then play them all in a stack (http://ericfairbanks.org/music/tidal/code/2017/05/31/an-introduction-to-tidal.html  was a good resource on organizing TC code, but his site is down right now).

 

ATM, just learning and messing around, but I'm already getting some really interesting results just with some of the loops I've created. It's really easy to randomize things using TC, but i'd like to get more of a structured song composition and variety. Going to look into https://tidalcycles.org/index.php/seqP next.

Link to comment
Share on other sites

Nil, I'm so happy for you!

 

I actually just picked up a 2012 Thinkpad because I want to do more TC/SC on it. I've chosen (probably mistakenly) Arch Linux as my base OS and unfortunately getting Haskell up and running has been a nightmare so far and it's not over yet. The base Arch cabal package just will not install Tidal, and trying to build from source or from the "stack" bootstrap script actually crashes my poor laptop which only has 4 GB of RAM. I'm going to take another swing at it with a fresh boot and then maybe try and hunt down some ready-to-go binaries. It's been a while and I always have this kind of adventure with Linux, but hopefully once it's done I can be off to the races and have my own little Tidal/SC workstation.

Link to comment
Share on other sites

Do what I did and nab msys2 ( https://www.msys2.org/ ) - It's Arch Linux For Windows (sortof) and I found it much easier to build github stuff from source or just do anything programmery in a more native environment.

 

TidalCycles looked like it might need a few too many hoops to jump through for getting it to working with Ableton so I grabbed this Max for Live equivalent - http://gibberwocky.cc/ / https://github.com/gibber-cc/gibberwocky#gibberwocky

Link to comment
Share on other sites

I actually just picked up a 2012 Thinkpad because I want to do more TC/SC on it. I've chosen (probably mistakenly) Arch Linux as my base OS and unfortunately getting Haskell up and running has been a nightmare so far and it's not over yet.

 

Hm, I'm on linux mint and the stock ghc haskell there works fine. I'd have thought 4G should be enough for stack, though..

Edited by Yaxu
Link to comment
Share on other sites

@yaxu:  :beer:

 

@Ovitus : Bazille isn't that hard if you're used to synths really. You start simple and patch away... and a few months later you realize you can patch it intuitively. Such a rewarding beast, and it sounds bloody amazing.

 

@mcbpete: At first glance, Gibberwocky's syntax and code seem a bit more verbose than TC's... but being a Live/M4L user I can definitely see its appeal. Hmmmmmm I might give it a try too. Damn it :D

Link to comment
Share on other sites

 

I actually just picked up a 2012 Thinkpad because I want to do more TC/SC on it. I've chosen (probably mistakenly) Arch Linux as my base OS and unfortunately getting Haskell up and running has been a nightmare so far and it's not over yet.

 

Hm, I'm on linux mint and the stock ghc haskell there works fine. I'd have thought 4G should be enough for stack, though..

Actually ghc was fine, I think Cabal and/or base was killing it.

 

My workaround was to create a dummy package with dependencies on tidal and base. Actually the latter may have been extraneous. Anyway, I had a package.yaml, a stack.yaml, and a project .cabal file and I was launching ghci/Tidal via stack from within that project folder and it did the trick. Kind of janky but hey, it worked.  

Link to comment
Share on other sites

@mcbpete: I’m embarassed to ask : how / where do you install the gibberwoxky plugin patch / folder ? It seems I can do weird MIDI routings etc in my sleep but don’t know how to install a m4l patch :D Thanks !

Link to comment
Share on other sites

I just put the entire folder in my Ableton user library (in the Max subfolder) - I think as long as the files are kept together in the folder structure I think that's all good. You don't really 'install' m4l devices, as long as they're placed in a folder that Ableton knows about (user library, and other custom folder on the left side bar), they'll appear in the library for you to drag and drop onto the required track.

 

You then put the gibberwocky_midi.amxd device on each channel, and gibberwocky_master.amxd on the master. Then when you press the 'EDIT' button on the gibberwocky master device it should pop up a browser window for you to enter code/play with the demos

Link to comment
Share on other sites

Thank you!

 

First tests with Gibberwocky, it feels less direct and more hmmm linear than TC? Easy to get into details such as various velocities and notes lengths. I've printed its doc, going to read it anyway. I'm wondering how easy it is to chain / stack / modify patterns with it, the way you'd do with degradeBy / stack / cat and such ?

 

-

 

Back to TC, I have a few questions you guys might know the answers of. As you'll see, I'm focusing on TC's sequencing abilities as I solely work with synths. I'm using samples in my examples though for the sake of clarity. 

 

Full disclosure, I've found a very, very similar pattern on TC's twitter page and admire how smart it was.. so lets say we have:

do
  setcps (160/60/4)
  d1 $ s "[bd(3,8), ~ rs*4, cp:1*16?]"

1) Is there a way to control (for example) bd's velocity without splitting the pattern into several dedicated ones nor affecting the other samples (notes if sending out MIDI notes) ?

 

I've decomposed the pattern into something significantly less elegant and much more barbaric :

do
  setcps (160/60/4)
  d1 $ s "[bd ~ ~ bd ~ ~ bd ~, ~ [rs rs rs rs], cp:1*16?]"

First, as you've already noticed, I haven't succeeded in approximating the cp:1*16? by exploding this part of the pattern into a bunch of (16 that is) "cp:1?"

Reason is, if having a patter of 16 cp:1?, they all share the same probability to be played per cycle, so basically either all or none will be played during a given cycle.

 

2) Now, why would I want such long a pattern? To pick which of my hits will be affected by the ?, and which won't. Is there a way to do that ?

 

For exemple,

do
  setcps (160/60/4)
  d1 $ s "[bd ~ ~ bd ~ ~ bd? ~, ~ [rs rs? rs rs], cp:1*16?]"

adds some simple variations to my pattern by adding some probability to 

 

Which leads to my final question. I watched Kindohm's vid regarding randomness, very insightful, with a lot to grasp for a newb like me.

 

Now I understand that :

- degradeBy 0.5 equals "?"

- degradeBy n (and similar functions) has to be written prior to the pattern

- n can be any value between 0 and 1

- "?" can be inserted anywhere in a pattern to randomise a or several given notes / sample / events

- in Atom, using let, you can basically create your own functions (as a shortcut / an alias for a bit of code)

 

3) So, is it possible to create custom functions that can be used the same way "?" can, i.e. to modify chosen notes / events ?

 

4) Or, is it possible to somehow integrate degradeBy (and such) to a pattern itself (for the reasons explained above), rather than using it as a prefix for a whole pattern ?

 

Hopefully I've managed to express it all in a clear way hehe, so thanks to anyone reading ;)

Edited by Nil
Link to comment
Share on other sites

Thank you!

 

First tests with Gibberwocky, it feels less direct and more hmmm linear than TC? Easy to get into details such as various velocities and notes lengths. I've printed its doc, going to read it anyway. I'm wondering how easy it is to chain / stack / modify patterns with it, the way you'd do with degradeBy / stack / cat and such ?

 

-

 

Back to TC, I have a few questions you guys might know the answers of. As you'll see, I'm focusing on TC's sequencing abilities as I solely work with synths. I'm using samples in my examples though for the sake of clarity. 

 

Full disclosure, I've found a very, very similar pattern on TC's twitter page and admire how smart it was.. so lets say we have:

do
  setcps (160/60/4)
  d1 $ s "[bd(3,8), ~ rs*4, cp:1*16?]"

1) Is there a way to control (for example) bd's velocity without splitting the pattern into several dedicated ones nor affecting the other samples (notes if sending out MIDI notes) ?

 

I've decomposed the pattern into something significantly less elegant and much more barbaric :

do
  setcps (160/60/4)
  d1 $ s "[bd ~ ~ bd ~ ~ bd ~, ~ [rs rs rs rs], cp:1*16?]"

First, as you've already noticed, I haven't succeeded in approximating the cp:1*16? by exploding this part of the pattern into a bunch of (16 that is) "cp:1?"

Reason is, if having a patter of 16 cp:1?, they all share the same probability to be played per cycle, so basically either all or none will be played during a given cycle.

 

2) Now, why would I want such long a pattern? To pick which of my hits will be affected by the ?, and which won't. Is there a way to do that ?

 

For exemple,

do
  setcps (160/60/4)
  d1 $ s "[bd ~ ~ bd ~ ~ bd? ~, ~ [rs rs? rs rs], cp:1*16?]"

adds some simple variations to my pattern by adding some probability to 

 

Which leads to my final question. I watched Kindohm's vid regarding randomness, very insightful, with a lot to grasp for a newb like me.

 

Now I understand that :

- degradeBy 0.5 equals "?"

- degradeBy n (and similar functions) has to be written prior to the pattern

- n can be any value between 0 and 1

- "?" can be inserted anywhere in a pattern to randomise a or several given notes / sample / events

- in Atom, using let, you can basically create your own functions (as a shortcut / an alias for a bit of code)

 

3) So, is it possible to create custom functions that can be used the same way "?" can, i.e. to modify chosen notes / events ?

 

4) Or, is it possible to somehow integrate degradeBy (and such) to a pattern itself (for the reasons explained above), rather than using it as a prefix for a whole pattern ?

 

Hopefully I've managed to express it all in a clear way hehe, so thanks to anyone reading ;)

OK I'm probably at least as much of a noob as you are (especially since I stupidly took almost a month break from Tidal) but I'll take a swing if only for the sake of my own learning :)

1) Yeah I think you're probably best off splitting bd into its own pattern if you want to manipulate it by itself... however, something I have been thinking about is the fact that this is SC, so you can create your own instruments. So e.g. you could create an instrument where you sequence the notes with one pattern and control the gain with another. In fact I would like to set up something like this for signal busses as I'm not a huge fan of the "orbit" structure. With the orbits you're effectively controlling/modulating global effects sends unlike on, say, the Octatrack which hands out track-level effects like candy.

 

2) Again, I think especially because you have a comma there you're effectively splitting it time-wise already so I think it makes sense to have it on its own track. Unless having it in one place does something for you that I'm missing? Maybe saving channels, or just making it easy to flip it on in one line (which you could still accomplish using the 'do' structure you're already using)? yaxu or kindohm might have cooler/more elegant ideas on this.

 

3) Absolutely! I'm trying to think of some examples but suffice to say kindohm did some neat tricks like this in one of his videos, for example there was a "binary pattern" one where he used such a function to shorthand sequences using 1 and 0. I think all the TC text editor plugins come with a "boot" script, and you can just pop your custom functions in there.

 

4) Yes (if I'm understanding you correctly) you can absolutely do that. For example, expanding on your first example (cool little pattern you made, btw):

do
  setcps (160/60/4)
  d1 $ "[bd(3,8), ~ rs*4, cp:1*16?]" # gain ("8 [6 <4, 8>] 7 6 5" / 8)
Link to comment
Share on other sites

Thank you so much!

 

1) in sessions, I'd be using  MIDI notes instead of samples, to trigger a drum machine (DrumSpillage2 to name it), so I'm trying to keep it all into a single pattern. But I guess I could simply stack patterns (one of the kick drums, another for the sd etc...). That should work.

 

Now the issue I have is thatI fail at using "cat" to chain patterns made with "stack", ah ! I know how to stack, I know how to cat... but I don't know how to do it at once... yet ;)

 

2) 3) & 4) so I guess I have to experiment ;)

 

Ideally, I'd love to figure out a way to write something like :

do
  setcps (160/60/4)
  d1
    $ s "[bd ~ ~ bd€ ~ ~ bd? ~, ~ [rs rs£ rs rs]•, cp:1*16¥]"

where € = degradeBy 0.25, ? = degradeBy 0.5, £ = degradeBy 0.75 and ¥ = degradeBy 0.875, and • = $ every 8 (rev) (or whatever). Or anything more complex that would happen step/event-wise.

 

Would be quite amazing to have, to program some sorts of minimal beat structure with sorts of auto-fills or micro breaks.

 

Basically, creating functions and incorporating them to the pattern itself (sorry if paraphrasing myself, not that easy to put words on these nebulous experiments).

 

-

 

By the way, auto-degrading footwork pattern à la Rian Treanor anyone?

do
  setcps (160/60/4)
  d1
    $ every 16 (degradeBy 0.875)
    $ every 4 (degradeBy 0.75)    
    $ every 3 (degradeBy 0.25)
    $ every 8 (rev)
    $ stack [
      s "bd ~ ~ bd ~ ~ bd? ~",
      s "~ [rs rs? rs rs]",
      s "cp:1*16?"
    ]
Link to comment
Share on other sites

Thank you so much!

 

1) in sessions, I'd be using MIDI notes instead of samples, to trigger a drum machine (DrumSpillage2 to name it), so I'm trying to keep it all into a single pattern. But I guess I could simply stack patterns (one of the kick drums, another for the sd etc...). That should work.

 

Now the issue I have is thatI fail at using "cat" to chain patterns made with "stack", ah ! I know how to stack, I know how to cat... but I don't know how to do it at once... yet ;)

 

2) 3) & 4) so I guess I have to experiment ;)

 

Ideally, I'd love to figure out a way to write something like :

do
  setcps (160/60/4)
  d1
    $ s "[bd ~ ~ bd€ ~ ~ bd? ~, ~ [rs rs£ rs rs]•, cp:1*16¥]"
where € = degradeBy 0.25, ? = degradeBy 0.5, £ = degradeBy 0.75 and ¥ = degradeBy 0.875, and • = $ every 8 (rev) (or whatever). Or anything more complex that would happen step/event-wise.

 

Would be quite amazing to have, to program some sorts of minimal beat structure with sorts of auto-fills or micro breaks.

 

Basically, creating functions and incorporating them to the pattern itself (sorry if paraphrasing myself, not that easy to put words on these nebulous experiments).

 

-

 

By the way, auto-degrading footwork pattern à la Rian Treanor anyone?

do
  setcps (160/60/4)
  d1
    $ every 16 (degradeBy 0.875)
    $ every 4 (degradeBy 0.75)    
    $ every 3 (degradeBy 0.25)
    $ every 8 (rev)
    $ stack [
      s "bd ~ ~ bd ~ ~ bd? ~",
      s "~ [rs rs? rs rs]",
      s "cp:1*16?"
    ]
So I've been wanting to look into this but had other stuff going on the last couple of days. I think for things like "?" you might actually have to dig into the Tidal code itself. This made me wonder if my workaround makes more sense to just use the TC source anyway and not have a dummy package at all. So I'll see if I can find more about "?" etc. while I'm in there.
Link to comment
Share on other sites

I see this in the source code: https://github.com/tidalcycles/Tidal/blob/master/src/Sound/Tidal/ParseBP.hs

 

pRand :: TPat a -> Parser (TPat a)
pRand thing = do char '?'
                 spaces
                 return $ TPat_DegradeBy 0.5 thing
                 <|> return thing

 

 

But I don't know how easy it would be to make a custom function. Maybe you can request a feature from Yaxu.

Edited by Ovitus
Link to comment
Share on other sites

Thank you !

 

The "do"function is your friend to trigger several instruments/patterns at once, a bit similar to launching a scene in Ableton Live. That's the simplest way I found to have a predefined structure. I'd fold any part of the code I don't edit, for the sake of clarity. The cover of the track is a part of the code btw.

 

Genuine question : why do you use Jack ? Linux ?

 

Nice bit ! How was it done ?

post-8398-0-51099500-1551177870_thumb.png

Edited by Nil
Link to comment
Share on other sites

Have been using do, but not like that. I was trying to sequence patterns with several stacks and seqPLoop, which led to some interesting results, but not exactly my intention. Good tip. What do you mean by fold? I assume that's a feature of the editor you're using? Atom? not https://wiki.haskell.org/Fold

 

Yeah I do most things in Linux these days. I have Tidal running with a vim plugin. Jack is a sound server for Linux that allows you to route audio from different applications. Took a while to tweak it right, I was getting a whole bunch of Xruns which would result in unpleasant audio glitches.

 

I'd post the code for that but it's on my laptop and I'm at work atm. It isn't anything fancy, and it's working with the Diva arpeggiator.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.