Tidal futures

Work has started on a bit of a rewrite/refactor of Tidal, I thought I’d write a quick post about how things are progressing. There’s a github project here if you’d like more info or want to get involved.

Structure comes from where you want

In current Tidal, “the structure comes from the left” has become a bit of a mantra. In the next version, it’ll come from where you want.

For example "1 2 3" + "4 5" used to give you "4 6 7", because the structure comes from the first part, and  that2 in the middle starts in the first half of the cycle, so matches with 4.

In the rewrite, by default, structure comes from both sides, so in the above example, you end up with the equivalent of "1 [6 7] 8" — the 2 gets split in two, to match with both 4 and 5.

To get the old behaviour, of structure coming from the left, you’d use |+, i.e. "1 2 3" |+ "4 5". To get structure from the right, you’d do "1 2 3" +| "4 5", which would give you "5 7".. Then |+| does exactly the same as +, i.e. it gets structure from both sides.

Unified pattern operators

|+|, |+ and +| all work on patterns of parameters (now known as control patterns) as well as patterns of numbers. So these two are the same: n ("1 2" + "3 4 5") + s "bass" and n "1 2" + n "3 4 5" + s "bass".

Of course there are also *, /, % and - versions of the above.

There is also |>| and |<| and friends; the arrow there points at where the values come from. So you could do "[1 2] [3 5 6]" |> "5 2" to take the structure from the left, and the values from the right, giving you "[5 5] [2 2 2". Aha!

|> basically does what # does now, we’ll likely keep that as an alias..

On the way.. Stateful patterns

Patterns can now respond to state, the idea being that you can do things like note "c a f e" # sound "bass" # speed (scale 1 1.6 $ control "knob1") where knob1 somehow maps to an external controller. Latency might be an issue.. It’s all in bits at the moment though, the new version doesn’t actually make sound yet.. Will update this post as things develop.

Internals

The most exciting thing for me is that the code is a bit cleaner on the inside, with fewer bugs and edge cases, and things generally make more sense. There’s even some tests, a start at creating a more complete definition of what patterns are and how they should behave. Patterns are flagged as being either continuous or discrete, which clears up a lot of ambiguity that was around before.

Keep an eye on the project for updates!

Leave a Reply

Your email address will not be published. Required fields are marked *