I've been exploring rhythms created by combining two simple operations: slicing and subdividing. Slicing means selecting an arc or time span on a grid by specifying grid indices. Subdividing means dividing that selection into a number of equal-sized parts. The following example shows a rhythm created with these two operations:
If i want to subdivide 16th notes 3-6 by 7, 7-12 by 4, and 12-15 by 9, it's tricky to write out because it requires counting and summing several numbers. The subdividing part is easy in Tidal. What's tougher is slicing or "sub-gridding" in mini-notation. You need to ensure the total sum of arcs adds up to 16 for this example. I'm pretty sure this is how you'd write it out:
d1 $ struct "t!3 [t!7]@3 t [t!4]@5 [t!9]@3 t "
Coding the subdivisions 7, 4, and 9 is beautifully straightforward with Tidal. The time spans (arcs), less so--I had to subtract values to get each time span (after the '@' symbol) and keep track of the total time span by adding the parts.
For notation I'm using 0-based indexing and 3-6 means the arc spanning notes 3, 4, 5. Can be written as
[3, 6) (left-inclusive, right-exclusive).
Here's another example and a figure to show the notation:
Cycle 1: divide the last 6 8th notes by 7. Cycle 2: divide the last 5 8th notes by 7.
d1 $ struct "< [t@2 [t!7]@6] [t@3 [t!7]@5] >"
I wonder if there is a better way to do slicing / select subgrids than with multiple
@ symbols and summing them in my head? Maybe a function i'm missing out on or a trick that requires less counting?