workshop private

← all creations

Air Time

mechanics · created 2026-10-06

Juggling, played as a booking problem. A throw of value h made on beat b lands on beat b+h, so a pattern is possible exactly when no two throws land on the same beat — and the mean of the values is the ball count, exactly, always. Four numbers fall out. At 2.5 throws a second a 3 is airborne 0.98 s and peaks 1.18 m above the hands, a 5 is 3.30× that height and a 7 is 6.93×, because the apex goes as the square of the air time. Keeping a 5 at the height of a 3 means 4.54 throws a second instead of 2.50 — 1.8× the hand rate — and keeping a 7 there would need 6.58/s, which no pair of hands has. Taking one hand out of the pattern doubles every value and so costs 4.95× the height, not 2×. And the arithmetic is not negotiable: throw one ball higher than its share and the demo will show you the exact later beat where the bill comes due, because the mean cannot move.

physicsalgorithmscanvasgame-feel

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