Tidal Fundamentals page

Hi everyone, happy New Year. I recently started to learn Tidal, and this week I published a page that's a walkthrough of the core library code from the ground up. It's aimed at (Haskell) developers learning Tidal for the first time. I thought it would be relevant to share here.

I think the things that are interesting about it are that I made a lot of illustrative diagrams, and that I describe things from a relatively low level, starting from the internals.



Please take a look if that sounds like your kind of thing. Thanks!



This is really nice! How do you feel about adding your work to the tidalcycles.org website? I think that it would be a really valuable ressource for the community and it is worth referencing it in a central place.

EDIT: I can do some work to reformat it if necessary.

For sure, I'd be happy to add it if it fits!

It might take some work since I wrote a build process and tooling on top of Pandoc to generate the diagrams, as well as render out the ghci sessions. But I could generate a Markdown version if that helps. I'd also be happy to adjust the text or correct any inaccuracies.

1 Like


With a MarkDown version, it would almost be copy/paste/double check and that's it. There might be small adjustements to do with diagrams and code, but as long as the page doesn't move that much, it should work!

1 Like

I put a Markdown version here for testing and to see what further work there would be:

I hope to add some more material in the future, but it would probably be easy enough to port over.


I've only just seen this, really fantastic work!

One confusion you flagged - "Events that straddle a cycle boundary show up as two events with different parts but the same whole. .. I’m not sure if this is intentional or if it’s an artifact of how I’m doing this."

Remember that functions like slow take a pattern of factors to slow a pattern down by. So the 1.5 in slow 1.5 $ fastFromList ['a', 'a', 'b', 'c'] is a pattern, where 1.5 repeats once per cycle. That's probably what's splitting the event in two in your example. This shouldn't matter, an event that's split in two should behave in exactly the same way as one that hasn't. As you say, an event fragment without an intact onset is generally ignored by the scheduler, unless you're working with control busses. They're also useful e.g. when you combine patterns.

This is really wonderful! Thank you for the resource!