I'm trying to make prog metal music with live coding, which usually involves changes of time signatures and additive groupings of 16th notes. As an exercise, I'm trying to pattern the main riff of "Phantoms" by Meshuggah (here's a wonderful explanation of the riff by Yogev Gabay).
Part of the drums play the riff in 4/4 (e.g. s "hh hh sn:3 hh"). However, kick and guitars / bass play very long sequences of 16th notes (note number n means n 16th notes, ~ means one 16th note rest, and ! means repetition): (3~ 3!2~ 3!4~ 3!3~)!3 = 34 x 3 = 102 16ths (3~ 3!2~ 3!7~ 3!4~ 3!3~) = 56 16ths (3~ 3!2~ 3!4~ 3!3~) = 34 16ths
Total length of the riff = 192 16th notes
I have 3 doubts:
Q1: How would you approach writing patterns like this in a compact way in Tidal?
Q2: How would you write a sequence of different time signatures, where the pulse duration (e.g. 16th) is maintained between bars, rather than the cycle duration? E.g. in a sequence like 4/4 5/8 3/4, my cycle would be divided into 16, 10 and 12 16th notes, but I want all of them to have the same duration.
Q3: How would you truncate a polymeter? E.g. say you have a 5 against 3 polymeter, but you wanna truncate the sequence in 5 after 4 repetitions of the sequence in 3, so when the sequence repeats, both start at the beginning of their sequence respectively:
5: 123451234512
3: 123123123123
Q1: How would you approach writing patterns like this in a compact way in Tidal?
I'm a bit confused as I think 3 ~ 3!2 ~ 3!4 ~ 3!3 ~ has 14 events not 34?
If you want to have 4 event per cycle you can use {}%4 e.g.
{3~ 3!2~ 3!4~ 3!3~}%4
Repeating these phrases beatwise is currently difficult though. This kind of beatwise concatenation is something I'm working on for version 2.0 of tidal, inspired by carnatic rhythms.
Q2: How would you write a sequence of different time signatures, where the pulse duration (e.g. 16th) is maintained between bars, rather than the cycle duration? E.g. in a sequence like 4/4 5/8 3/4, my cycle would be divided into 16, 10 and 12 16th notes, but I want all of them to have the same duration.
I think this hits the same issue unfortunately.
Q3: How would you truncate a polymeter? E.g. say you have a 5 against 3 polymeter, but you wanna truncate the sequence in 5 after 4 repetitions of the sequence in 3, so when the sequence repeats, both start at the beginning of their sequence respectively:
5: 123451234512
3: 123123123123
To restart a pattern every 4 cycles you can put restart "t/4" $ in front, e.g.
Ok I made this handy 'minicat' function. You pass it a number of beats per cycle, and a list of mininotation strings, and it will add the mininotation together beatwise.
import Data.Either
minicat :: (Show a, Parseable a, Enumerable a) => Time -> [String] -> Pattern a
minicat beatsPerCycle minis = _fast (beatsPerCycle/total) $ timeCat sized
where total = sum $ map fst sized
sized = rights $ map (((\mini -> (fst $ steps_tpat mini, toPat mini)) <$>) . parseTPat) minis
I've worked with this in the past using a combination of cps maths and zoom - unfortunately cps is applied globally so it may or may not meet your needs:
-- zoom for time sig changes - every 4 bars changes from 4/4 to 3/4
let c = (140/240)
in
d1
$ every' 4 1 (zoom (0, 0.75) . (# cps (c * (4/3))))
$ s "bd cp"
# cps c
will give you |12345123|12345123|, 1 is a cycle here, so if you did something like timeLoop 16, you would get really long polymeters that would restart on the 1 after 16 cycles