Juggling looks like a dexterity problem and is mostly an accounting one. The
hands alternate on a metronome; beat b belongs to hand b & 1. A throw made
on beat b with value h lands on beat b + h, in hand (b + h) & 1 — so odd
values cross and even values come back to the hand that threw them. Everything
else in this creation follows from those two sentences.
The one rule
A pattern is possible iff no two throws land on the same beat: iff
b ↦ b + s(b) is a permutation. That is the whole of legality. Not difficulty,
not style, not how high the digits are.
441 is a pattern. 432 is not, and it is the same three digits. Drive 432
in the demo and it does not fail vaguely, it fails on schedule: all three
throws come down on the same slot, two balls arrive in one hand on one beat,
and you finish holding one ball and a lot of empty beats. The rail at the
bottom of the screen had it booked from the first throw.
54 fails differently and more quietly. It averages 4.5, and —
The mean is the ball count
Sum the values over one period and you have counted, once per ball per period,
how many beats each ball spends away from the hands. So the mean of the digits
is the number of balls, exactly, and 54 describes four and a half balls,
which is not a thing to hold.
This is the screw the mechanic is built on. You can shuffle where the height
goes; you cannot make less of it. A low throw is not thrift, it is a loan, and
the repayment is a high throw on a beat the arithmetic has already chosen. Put
a 5 into a three-ball cascade in the demo and watch what you are forced into
two beats later: 3 3 5 3 1 3 3. Nobody decided on that 1. The slot the 5
booked was the slot the cascade wanted, and 1 is the only free beat left.
The four numbers
Everything below is facts() in src/air-time.mjs evaluated at the demo’s
default 2.5 throws per second and a dwell of 0.55 beats — the fraction of a beat
a ball sits in the hand between catch and throw. Air time for a value h is
(h − dwell) × beat; released and caught at the same height, the apex is
g·t²/8.
A 3 is 0.98 s and 1.18 m. A 5 is 3.30× that. A 7 is 6.93×. The apex goes as the square of the air time, and in a steady pattern the value is the ball count, so each ball you add is not a bit more work. Five balls peak at 3.88 m above the hands; seven at 8.16 m; nine at 14.00 m, which is why nobody juggles nine for very long.
Or 1.8× the hand rate, and that runs out. The other way to keep a 5 at the height of a 3 is to speed the hands up: 4.54 throws a second instead of 2.50. Fine. The same trade for a 7 asks for 6.58/s, and hands do not go there — the module caps the dial at 5.2/s, which is already optimistic. That is the honest reason seven balls are thrown high rather than fast, and the demo lets you walk into the wall yourself.
One hand costs five times the height, not two. Take a hand out of the pattern and every ball must be kept on the other side, which means every throw must be even, which means every 3 becomes a 6. A 6 peaks at 5.83 m: 4.95× a 3, for exactly the same three balls and the same hands-per-second. Run 2 · Hands Off and the camera has to pull back to 6.9 m to hold the picture.
A ceiling is a clock problem. 3 · Low Roof asks for the same free hand under a 4.5 m ceiling, which the 6s miss by 2.4 m. There is no pattern fix — the mean is pinned — so the only move left is the hand rate: above 3.24 throws a second the 6s fit. 4 · Seven does the same to five balls and a 7 under 6 m: 3.21/s and it goes.
What is on screen
The top half is metres, with a ruler, and the camera frames whatever is actually in the air — so throwing a 7 visibly pulls the view back, which is the ball-count-squared fact as a camera move rather than a claim.
The bottom half is the ledger, drawn straight off the module’s slot map. Two rows, one per hand, a column per beat, time running right. A filled dot is a ball that will arrive on that beat whether or not you have a hand free for it; a hollow dot is a beat still for sale. Arcs are throws already made, and they are commitments: the arc from beat 6 to beat 11 is the reason the button for 5 is dim on beat 6. Two balls on one dot draws a red ring, and a beat or two later a ball bounces off a full hand and keeps falling.
Tap a throw value, or tap the sky at the height you want — the apex you aim at
picks the value. Keys 1–9 queue throws (you can queue several), [ and ]
move the hand rate, S loads the answer to the current run into the queue so
you can watch it. Unchosen beats are filled by an assistant that always plays
the lowest legal value and never aims a ball at the ceiling, so the pattern
keeps running while you think — the drops are yours.
The patterns row drives any siteswap directly: 3, 441, 531, 51, 423,
552, 633, 97531, 06 (one-handed, three balls), and the two red ones,
which cannot be juggled by anyone.
Things worth knowing if you reuse this
- The module has no renderer.
new Juggler({ balls, tempo, roof, seq })steps in seconds, returns events (throw,catch,gap,drop), and exposesfree(beat),options(),pos(ball)andhandPos(hand)in metres. - A juggler starts already running.
reset()builds the ground state of its own pattern by asking which throws at negative beats have not landed yet — which produces exactly the right number of balls, in flight, for free, with no transient to juggle through and no special case for0or2. validate(seq)is the two-line truth: the mean must be a whole number and the landing slots must be distinct.facts()recomputes every number quoted above rather than trusting this file.- Dwell is the one parameter with no single right value. Real jugglers sit
somewhere around 0.5–0.75 of a beat and it moves with tempo; 0.55 is a
defensible constant and the heights all scale with
(h − dwell)², so a different dwell changes the numbers and none of the arguments. - A
2here is an active self-toss rather than a hold, which is a real juggling choice and keeps the ball on the same parabolic footing as everything else. A1comes out of the same formula as a flat 0.04 m zip across, which is about right. - What the model does not have is the third dimension, so there are no showers that go behind the back, no multiplex (two balls from one hand on one beat) and no synchronous patterns. All three are extensions of the same ledger — multiplex is just allowing a slot to hold more than one ball on purpose — and none of them changes the two facts the mechanic is about.



