Cat + slow = problem?

Should these generate the same pattern?

d1 $ s "bd/1.25 sn"
d1 $ stack [ s "bd/1.25", s "~ sn" ]

It's a bit easier to hear if you pan like

d1 $ s "bd/1.25 sn" # pan "0 1"
d1 $ stack [ s "bd/1.25" # pan 0, s "~ sn" # pan 1]

The bd of the patterns plays like this (well it would but I couldn't get tidal to play nice with the pattern to slow)

d1 $ slow "<1.125 1.125 1.125 1.625>" $ s "bd"
d1 $ slow "1.25" $ s "bd"

The version using stack plays a 4 against 5 pattern with the two playing in unison on their third triggers as expected.

The first version above ends up using timeCat which mentions fastcat in a comment so I tried these versions below and they behave identically to the first pattern above even though timeCat uses rotR and _fastGap rather than any kind of cat.

[I notice that at some point my tests changed to the snare hitting on the first half of the cycle, it doesn't really impact the issue but sorry.]

d1 $ fastcat [ slow 1.25 $ s "bd", s "sn" ]
d1 $ fast 2 $ cat [ slow 1.25 $ s "bd", s "sn" ]

I investigated a simplified version using cat since it's simpler than timeCat and they behave the same.
Here are the transforms that I noticed in cat and slow (transforming the query then the result - I hope they make sense)

setcps 1
d1 $ cat [ slow 1.25 $ s "bd", s "sn" ]

global   cat     slow       Event        slow       cat
                 / 1.25                 * 1.25
0>1      0>1     0>0.8      0 - BD        0          0
1>2      0>1                0 - SN                   1
2>3      1>2     0.8>1.6    1 - BD        1.25       2.25 (should be 2.5)
3>4      1>2                1 - SN                   3
4>5      2>3     1.6>2.4    2 - BD        2.5        4.5 (should be 5)
5>6      2>3                2 - SN                   5
6>7      3>4     2.4>3.2    3 - BD        3.75       6.75 (should be 7.5 **)
7>8      3>4                3 - SN                   7
8>9      4>5     3.2>4.0      -
9>10     4>5                4 - SN                   9
10>11    5>6     4.0>4.8    4 - BD        5.0        10
11>12    5>6                5 - SN                   11
12>13    6>7     4.8>5.6    5 - BD        6.25       12.25 (should be 12.5)

In this particular case the result needs to be multiplied by n (number of buckets) and then offset by the bucket # (cycle mod n). I could get this far but the ** interesting problem is that for events triggered in the second half of the cycle this ends up generating results that are beyond the current cycle's end and are dropped and they won't be picked up again in the next cycle. Completely abandoning cat it's pretty straight forward (in this fairly simple case) to build a pretty simple solution using stack/rotR/slow similar to how TPat_Seq is expanded in the bp parser.

[Edit: I discovered that although the first version of the stack/rotR/slow worked for this case it didn't work for nested patterns at all so here's a pattern that seems to to work with arbitrary nesting although it doesn't work for nested patterns that include slow and, well, that's the whole point so I'll keep looking for one that does work.]

d1 $ stack [ slow 1.25 $ s "bd", s "~ sn" ] # pan 0
d2 $ stack [ slow 1.25 $ s "bd", stack [ rotR 0 $ _fastGap 2 $ silence, rotR (1%2) $ _fastGap 2 $ s "sn" ] ] # gain 1

Here's the post's first version for posterity.

d1 $ stack [ slow 1.25 $ s "bd", s "~ sn" ] # pan 0
d2 $ fast 2 $ stack [ rotR 0 $ slow 2 $ slow 1.25 $ s "bd", rotR 1 $ slow 2 $ "sn" ] # pan 1

As I said before, playing & learning.

I think you answer it yourself, but the answer is no. But d1 $ stack [ s "bd/1.25 ~", s "~ sn" ] should be the same.

The "bd/1.25" lives over a cycle, and "bd/1.25 ~" should be the same but squashed into half a cycle.

[edit: worked through it and I completely get it now. It's in my reply to this comment.]

Working through this I almost get it. Skip to the bottom if you don't want to see the work and get to the real question...

These are the same

d1 $ s "bd sd" # pan 0
d2 $ stack [ s "bd", s "~ sd"] # pan 1

These are too.

d1 $ s "bd/2 sd" # pan 0
d2 $ stack [ s "bd/2", s "~ sd"] # pan 1

And these

d1 $ s "bd/3 sd" # pan 0
d2 $ stack [ s "bd/3", s "~ sd"] # pan 1

Granted, the integral divisor is always aligning on the beginning of the cycle but it's not accelerating or decelerating the skips just because it's part of a two step pattern.

But once the slow is no longer an integral number of cycles their behaviors diverge in ways I can't explain to myself yet.

setcps 0.5
-- Each character below is 0.5s or 1/4 cycle. .'s are just silent space so I can see the alignment.
d1 $ s "bd/1.5 sn" # pan 0
-- B....B......B....B..
-- ..S...S...S...S...S.
d2 $ stack [ s "bd/1.5", s "~ sn" ] # pan 1
-- B.....B.....B.....B.
-- ..S...S...S...S...S.

If there was any squishing going on in the d1 pattern why isn't it consistently squishing? The meta-pattern is correct for a /1.5, playing two hits in three cycles but d1 is doing it on 5/4, 7/4 subdivisions not 6/4, 6/4 like d2 does.

d1 $ s "bd/1.25 sn" # pan 0
-- 0...1...2...3...4...5...6...7...8...9...10.. (seconds)
-- B........B........B........B............B...
-- ....S.......S.......S.......S.......S.......
d2 $ stack [ s "bd/1.25", s "~ sn" ] # pan 1
-- 0...1...2...3...4...5...6...7...8...9...10.. 
-- B.........B.........B.........B.........B...
-- ....S.......S.......S.......S.......S.......

Here the meta-cycle correctly repeats every four cycles but subdivisions of 9/8, 9/8, 9/8, 13/8 for d1 rather d2's uniform subdivisions of 10/8. How does squishing explain 9, 9, 9, 13?

:flashlight: :cloud_with_lightning: :rotating_light: :cloud_with_lightning: :flashlight:
What does "compressed into the first half of a cycle mean?" To me it would look like this.

d1 $ s "bd/1.25 ~" # pan 1
-- 0...1...2...3...4...5...6...7...8...9...0...1...2...3...4...5...6
-- B...x...!B..x...!.B.x...!..Bx...B...x...!B..x...!.B.x...!..Bx...B
-- !...x...!...x...!...x...!...x...!...x...!...x...!...x...!...x...!

The bd slowly walks through the first half of the cycle then repeats.

Looking at that I immediately noticed the 9/8, 9/8, 9/8 pattern. Then thinking that I'd completely missed that pattern all along, looked back to see that I didn't. In tidal the last subdivision is 13/8 but in my "ideal" pattern it's only 5/8.

d1 $ s "bd/1.25 sn" # pan 0
--            0...1...2...3...4...5...6...7...8...9...10.. (seconds)
-- (expected) B...x...!B..x...!.B.x...!..Bx...B...x...!B..
-- (tidal)    B........B........B........B............B...

Tidal is generating the first four "beats" by compressing the bd into the first half of the cycle. It then misses/skips a cycle making the pattern 5 cycles long matching the length of "bd/1.25."

So, should "bd/1.25 ~" repeat the bd pattern in four or five cycles? And why? This is making my head hurt (in a good way).

Cheers

Nevermind. I finally get it now. Just had to walk away (actually figured it out in the :shower:) The "skipped" cycle is just the 4 ticks that are part of the previous hit. No different mathematically (but quite different rhythmically) than skipping from 3 3/4 to 5 in an uncompressed version.

0...1...2...3...4...5...6...7...8...9...10
B....B....B....B....B....B....B....B....B

Now take that cycle and insert another cycle every 4 ticks

0...x...1...x...2...x...3...x...4...x...5...x...6...x...7...x...8...x...9...x...10
B...x....B..x.....B.x......Bx.......x...B...x....B..x.....B.x......Bx.......x...B

It's not 9/8 and 13/8 it's always 5/8 within the first cycle.

1 Like