edcarstens / JugglePro

Juggling Pattern Animator
MIT License
4 stars 0 forks source link

Representing slow-fast patterns #21

Open edcarstens opened 8 years ago

edcarstens commented 8 years ago

A slow-fast pattern is one in which jugglers are juggling at different rates, but they still sync up periodically. A simple example is Ann is fast and Ben is slow. Ann passes on a 3 count. Ben passes on a 2 count, yet their passes to each other occur at approximately the same time. This could be represented in MHN as:

Ann (1,3),(0,3),(0,3) Ben (1,3),(0,3)

It looks like the throws go to the same destination, but remember, the throw-heights represent beats in each juggler's own clock domain. Suppose Ann's beat period is 2, then Ben's beat period must be 3. Let's calculate the actual periods now:

Ann (1,6),(0,6),(0,6) Ben (1,9),(0,9)

The true arrival time of Ann's first throw is 6, while the true arrival time of Ben's first throw is 9. Thus, they do not arrive at the same time. Ben's 3 throw-height is a flight time that is 50% longer than Anne's 3 throw-height.

Let's take a step back now to see how we can construct this weird slow-fast pattern. Let's start with the null pattern (Ann and Ben are not really juggling, but we they do have different clocks running):

Ann (0,0),(0,0),(0,0) Ben (1,0),(1,0)

Ann's clock beat period is 2. Ben's clock beat period is 3. The synchronization point is the first throw, that is they both are throwing at the same time for their first throws. For Ann, there are just 3 throws and then she repeats her first throw. Ben has two throws, then repeats his first.

Let's swap two throw destinations at the synchronization beat to affect a pass:

Ann (1,0),(0,0),(0,0) Ben (0,0),(1,0)

Because the throw-heights are all zero, the destination is at the same time point as the throw, so we simply swap the first throws. Now let's use translation for each juggler to give them something to juggle. This time we must be careful to maintain that synchronization point, so translation requires rotation too. Let's start by adding just one ball for each juggler.

Ann (0,1),(0,1),(1,1) Ben (1,1),(0,1)

Notice that the passes move to the last throw (beat) in each period. This maintains synchronization for the catches, which occur at the first beat for each juggler. Each time a ball is added, the throws are rotated one to the left (back one beat in time). Let's add a second ball for each juggler:

Ann (0,2),(1,2),(0,2) Ben (0,2),(1,2)

Adding a third ball for each juggler:

Ann (1,3),(0,3),(0,3) Ben (1,3),(0,3)

So far we have limited our site swap to the synchronization point, but there is no reason we can't allow site swaps to occur in different beats that are asynchronous. The throw's flight time will now consist of a sum or difference of beats in both clock domains, so we will represent this by two throw-heights. The first is the total beats and gives an approximate indication of how high to make the throw. The second is the number of destination beats that are in that total beat count in the first number. If the second number is zero, it can be omitted, but let's include it now for this discussion. Starting with the null pattern again:

Ann (0,0,0),(0,0,0),(0,0,0) Ben (1,0,0),(1,0,0)

Now we swap Ann's 2nd throw with Ben's 1st:

Ann (0,0,0),(1,-1,0),(0,0,0) Ben (0,1,1),(1,0,0)

Ann's throw is back in time one beat in her clock domain but Ben's throw is forward one beat in Ann's clock domain. Thus, Ben's 2nd throw-height is 1, whereas Ann's is 0. Let's translate and rotate to add 3 balls each:

Ann (0,3,0),(1,2,0),(0,3,0) Ben (1,3,0),(0,4,1)

Ben's pass is a 4 throw-height, but this actually is 3 of his beats and 1 of Ann's beats so in terms of Ben's beat period it comes out to 3 and 2/3, a bit less than 4.

We will discuss the implications for JugglePro in a different issue.

edcarstens commented 8 years ago

JPE lets you visualize the beats time intervals by dividing the width of each row evenly by the number of columns (beats) for that row. The notation uses a decimal (.) to separate the two numbers.