Month: November 2018

Tidal 1.0.0 refactor

TidalCycles (aka Tidal) is a Haskell DSL for making (usually musical) pattern.

I’ve put a lot of time into Tidal the last couple of months, starting with preparation for an advanced tidal workshop in Tokyo, but things got out of hand and ended with a rewrite of its innards, solving some long-standing issues. It feels like I’ve only recently grown to understand what tidal really is in the process of writing (and rewriting) it over many years, and I’ve finally got to put that understanding into action. I’ve had some really useful feedback from the Haskell community in the past and so thought I’d write this post as an effort at getting feedback on this latest iteration.

Tidal is all about pattern. I’ve tried to explain what this means in terms of types in this wiki page – What is a pattern?

That page talks through the first bit of Sound.Tidal.Pattern, which also contains applicative and monad instances for patterns. The previous attempt at these didn’t conform to the applicative and monad laws, but these new versions hopefully are much closer to the mark. I’ve found though that <*> and join aren’t enough for Tidal. I also need <* for where pattern structure comes from the left, and *> for where it comes from the right, where <*> comes from both sides. Similarly, as well as join (which I’m calling unwrap) I needed to make innerJoin and outerJoin. You could have a look at the Combining pattern structure wiki page to get an insight into why these are needed.

Other modules I invite you to look at include Sound.Tidal.Core, Sound.Tidal.Control, Sound.Tidal.UI, and the rest, roughly in that order.

Tidal is my only real haskell project and I’ve learned haskell through (admittedly many years) of writing/rewriting it, so all insights much appreciated!

There has been a couple of instances where Haskell fans have been immediately turned off by Tidal, I think because of the large amount of strings used in Tidal code. These strings are actually overloaded, a parser in Sound.Tidal.ParseBP silently turns them into well-typed patterns (which are functions of time, and not strings or lists). Anything in those strings could be expressed in Haskell code, but with a _lot_ more keypresses. This mini-language is heavily influenced by the representation of cyclic structures Indian classical music (i.e. Bernard Bel’s BP2). I’d really like to get to the bottom of why people don’t like the look of these strings though, and whether there is a better alternative.

All feedback, suggestions and criticism much appreciated!

Making Tidal 1.0 happen

Too long; didn’t read? Basically, please buy me a coffee or so by pressing this button:

I’ve been doing a lot of work on TidalCycles lately. Tidal is very much a labour of love, I’ve put a lot into it over the past decade, motivated by the fun of making music with it and of enjoying what other people are doing with it. That’s not sustainable though, so I’ve been looking for ways of asking some money in return.

I’ve looked at patreon.com, but it doesn’t sit well with me. It seems high maintenance, and doesn’t fit with my motivation to work on Tidal for the fun of it, and not turn it into ‘content’ to be delivered..

I’ve also looked at liberapay, and used it to raise money for server costs. This has actually been really successful, I raised nearly €500 which covered server costs for we.lurk.org, post.lurk.org, talk.lurk.org, algorave.com, toplap.org etc for a while (thanks!). This also made me feel much better at helping keep these things going, that people are up for chipping in some hard earned cash. That money has probably run out by now, there’s a few of us running these services and we’ll look into being a bit more organised about accepting donations.

Liberapay doesn’t feel right for tidal development either, though. It’s based on an anonymous donation model, which is great for some things, but there’s no way of directly thanking people who donate (if you’re one of them, really, thanks!).. Or doing any community building around it.

I’ve also tried crowdfunding. This has been a great experience, I met my funding ‘goal’.. But in truth, crowdfunding is more a way to get people involved in a project than fundraising.. I’ll likely end up in the red overall. Plus I’ve found it really hard to get as far as finishing the project.. People have been outstandingly patient, but it’s been a very long haul (two years late!!). I will get there, though.

Anyway, now I’m looking at ko-fi. This seems to fit much better. No stress for ‘creators’ or ‘supporters’ to detract from actually making stuff. One-off or regular payments, that go straight to me (no extra platform fees). Plus a nice coffee metaphor.. It’s going to take a lot of coffees to get Tidal 1.0 done so I’d really appreciate your support!

One last thing – one reliable way to fund tidal dev that I’ve found is by running workshops. If you’d like to host a one or two-day TidalCycles workshop next year, please get in touch! There’ll a lot of new stuff to learn + share.. Same goes for talks and performances, of course.

Also get in touch if you have ideas for other ways to make tidal happen..