workshop private

← all creations

One Place

mechanics · created 2026-09-17

Ring a tower bell in a band of six. The control is inverted — pull harder and the bell arrives LATER — it is lagged by a whole stroke, and it is logarithmic, so every 165 ms of hold costs half of what is left between the bell and the balance. The window is three places wide and one place deep, and that is why change ringing is permutations instead of tunes.

physicssimulationcanvasgame-feelalgorithms

English change ringing has no tunes in it. Six bells ring in a row, and the next row is the same six bells in a slightly different order, and the next, for hours, and the whole art is composing which orders come in which sequence. Everybody who hears about it asks the same question, which is why not just play a melody, and gets the same answer, which is that you can’t, and the answer is usually left there as a fact about tradition.

It isn’t. It’s a fact about a pendulum, and you can compute it.

A bell rung full circle sits mouth-up, just short of the balance, held on a rope. The ringer pulls; it comes off the balance, swings all the way down and all the way round, sounds near the top of the other side, and settles just short of the balance again. The ringer’s only verb is how hard to pull, and the only thing that verb controls is how close to the balance the bell comes to rest.

Everything below follows from that, and the first thing it produces is a control that nothing in your hands has prepared you for.

Pull harder and the blow comes later

The bell’s angle is θ from mouth-down, so the balance is at ±π and

θ̈ = -ω₀² sin θ,     ω₀² = M g d / I

Write the normalised energy u = E / 2Mgd, so u = 1 is exactly the balance and u > 1 goes over the top. A bell that stops ε short has u = cos²(ε/2), and the time it then takes to fall from there to the bottom is a quarter-swing of a pendulum with that amplitude:

t = K(cos(ε/2)) / ω₀  ~  ln(8/ε) / ω₀

A logarithm. Pulling harder puts the bell nearer the balance, and a bell nearer the balance takes longer to fall away from it. So the strength of the pull and the earliness of the blow run in opposite directions, and they do it through a log, which means the last tenth of a second costs as much as the first second did.

And it is not even this blow you are controlling. Writing out the next two blows from the moment the bell turns:

T_B = now + quarter(cur) + rise(out)
T_C = T_B + [quarter(out) - rise(out)] + quarter(out) + rise(after)
    = now + quarter(cur) + 2·quarter(out) + rise(after)

the rise(out) term cancels. The pull you are making now lands blow C. Blow B was decided one stroke ago and there is nothing left to do about it. Inverted, logarithmic, and lagged — three different ways of being hard, all out of the same line.

The numerics are checked against the closed form

A quarter-swing is a complete elliptic integral K, and the rise to the clapper is an incomplete F. The demo doesn’t use either: it integrates the ODE with RK4, because it has to draw the bell moving. So the integrator is checked against the functions it is allowed to replace.

margin raddegstrike, closed form sstrike, RK4 serr µstransit serr ms
0.0201.151.699451.69945-0.22.470770.035
0.0502.861.511321.51132-0.12.093160.039
0.1025.841.367301.36730-0.01.799940.064
0.20011.461.240211.24021-0.01.524650.046
0.35020.051.169561.16956-0.01.299300.098
0.41023.491.190601.19060-0.01.236700.001

Sub-microsecond on the blow, a tenth of a millisecond on the whole stroke.

The handstroke gap is not a rest, it is work

Rows alternate handstroke and backstroke, and after every backstroke row there is one blow of silence — the handstroke gap, which everyone hears as a lilt. It means a bell’s two strokes are not the same length: six blows one way, seven the other. The bell has no way to produce two different stroke lengths except by sitting at two different heights, and the ringer has to put it at both, every row, for as long as the ringing lasts.

bellcwtω₀ rad/sequiv. pendulum msmall-swing period smargin at handmargin at back
Treble3.14.420.5021.4228.63°4.43°
Second3.54.340.5211.4489.28°4.82°
Third4.04.260.5411.4759.98°5.24°
Fourth4.84.180.5611.50310.73°5.70°
Fifth6.24.100.5841.53211.54°6.21°
Tenor8.64.020.6071.56312.42°6.75°

The lilt is four to six degrees of bell, found and re-found a couple of thousand times an hour.

The window

Two walls. Up, the balance: past it the bell goes over, the stay takes the whole swing, and the stay breaks. Down, the clapper: a bell that swings too low doesn’t sound at all. Between them is the entire authority a ringer has over when their bell speaks, and measuring it in blows rather than radians is the whole point.

bellnominal marginlatest searliest splaces upplaces downtotal places
Treble8.63°+0.571-0.373+1.90-1.243.15
Second9.28°+0.598-0.363+1.99-1.213.20
Third9.98°+0.626-0.353+2.09-1.183.26
Fourth10.73°+0.656-0.342+2.19-1.143.33
Fifth11.54°+0.686-0.331+2.29-1.103.39
Tenor12.42°+0.717-0.320+2.39-1.073.46

Across a factor of 2.8 in bell weight the window barely moves. It can’t: the stroke length is itself 2 ln(8/ε)/ω₀, so ω₀ cancels out of the count and what is left is a ratio of logs, ln(clapper/safe) / (ω₀ · blow) — which agrees with the measurement to 2.1% across the ring. A bell’s weight decides where in the window it sits. It does not decide how wide the window is.

Where it sits is worth its own line. Heavier bells are slower, and a slower bell has to start further from the balance to fall in the same time, so it sits low — with more room above it and less below:

bellcwtcan be held upcan be checkedroom above : room below
Treble3.11.90 places1.24 places1.53 : 1
Fourth4.82.19 places1.14 places1.92 : 1
Tenor8.62.39 places1.07 places2.23 : 1

Which is the tenor ringer’s complaint stated as a number: a big bell will let you hold it all day and will not be hurried.

The one you still have once the stroke has started

The window above is what the previous stroke can do. Once the bell is falling, the descent is spent, and all that is left is how hard you pull on the way out — which moves the clapper’s arrival a little, in one direction only.

belllater, by checkingearlier, by pulling
Treble+178 ms (+0.59 places)−2 ms (−0.007)
Tenor+193 ms (+0.64 places)−5 ms (−0.017)

Two thirds of a place later; not one millisecond earlier. Ringers learn this as you can always hold, you can never catch up, and it turns out to be a statement about which end of a quarter-swing the rope is still attached to.

One place, in halvings

Buying dt of delay multiplies what is left between the bell and the balance by exp(−ω₀ dt). The margin halves every ln2/ω₀ — about 165 ms, which on 300 ms blows means a place of hold is a bit under two halvings. For the Fourth, sitting at 10.73°:

places held updelaymargin leftenergy left before the balanceas a fraction of where it started
0.00+0 ms10.73°0.8745%1.000×
0.25+75 ms7.84°0.4678%0.535×
0.50+150 ms5.73°0.2501%0.286×
0.75+225 ms4.19°0.1336%0.153×
1.00+300 ms3.06°0.0714%0.082×
1.50+450 ms1.64°0.0204%0.023×
2.00+600 ms0.87°0.0058%0.007×

The margin is an angle and it halves. The energy is that angle squared, so it quarters. A single place of hold costs eight parts in ten of everything the bell had left, and the second place costs eight parts in ten of the remainder.

Note the absolute scale in that middle column, too. Everything the bell has above it — all the room between where it sits and going over the stay — is under one percent of its energy. The bearings take 2% on every swing, so the pull that merely holds station is already more than twice the size of the entire upward control band. A ringer hauling on a rope hard enough to turn several hundredweight of bronze is mostly just re-supplying it. The steering is the difference between two much larger numbers, which is its own kind of hard.

Reachable is not ringable

Two places is inside the window. Every bell in the ring can be got there. What none of them can do is get there repeatedly, which is what a method asks for — because energy and margin are quadratically related near the top, so a fixed error in the ringer’s pull becomes a timing error of 2δu/(ω₀ε²), and that term runs away as the margin closes.

Against a pull good to one part in ten thousand of the balance energy:

bellmargin at 1 placeerrorslips to the staymargin at 2 placeserrorslips to the stay
Treble2.29°28 ms4.0×0.61°402 ms0.3×
Second2.52°24 ms4.8×0.69°321 ms0.4×
Third2.78°20 ms5.9×0.77°257 ms0.5×
Fourth3.06°17 ms7.1×0.87°206 ms0.6×
Fifth3.37°14 ms8.7×0.99°165 ms0.7×
Tenor3.72°12 ms10.5×1.11°132 ms0.9×

One place: a slip is worth a few milliseconds, and the stay is four to ten slips away. Two places: the same slip is worth a good fraction of a blow, and the stay is the very next one. The window is three places wide and one place deep.

So the rule is not that two-place changes are forbidden. It is that nobody could ring one twice.

What that leaves you to compose with

A change is legal iff every bell moves at most one place, so from any row the reachable rows are exactly the sets of disjoint adjacent transpositions — which is a Fibonacci number:

bellspermutations of the rowreachable in one changefraction
42451 in 5
6720131 in 55
840,320341 in 1,186
103,628,800891 in 40,773
12479,001,6002331 in 2,055,801

Thirteen doors out of any room, and an extent has to visit all 720 rooms exactly once. The composition problem the entire art is built around is a Hamiltonian path, and a pendulum drew the edges. Two centuries of people naming methods — Plain Bob, Grandsire, Stedman, Cambridge Surprise — were exploring a graph whose degree was fixed by ln(8/ε).

Playing it

You have one bell in a band of six. The other five are rung by a controller solving the same equations you are. holds up, checks, and the dial reads in milliseconds and places, because seconds are what you are choosing. Next to it the gauge reads the same quantity in degrees of margin, and the two do not move together — your hand slides linearly while the margin runs away exponentially. That mismatch is the feel of the thing.

The aim resets after every blow: one pull, one decision. Both walls are reachable and both are survivable. Hold two places up and the bell goes over the stay, which here is a few seconds of being half a stroke out of the rhythm rather than a carpentry bill. Check it below the clapper and it stops sounding at all, which is worse, because you now have no blows to count from. Hand it back to the autopilot and it rejoins in about a dozen rows.

Four buttons. Rounds is just keeping time. Plain Hunt drags you from the front of the row to the back and home again, one place per row, for twelve rows. Plain Bob Minor is a real method, sixty rows to the plain course. Two Places is plain hunt with every other row deleted, so each change asks every bell to move two at once — nothing else about it is different, and it is the only one of the four that doesn’t work. The band can reach the places. Watch the striking column on the right go to pieces anyway: 84 ms rms against 12 for plain hunt, with blows 120 ms out. That is the argument, played rather than asserted.

It makes a sound, and the sound is a bell: hum an octave under the prime, a tierce a minor third above it, a quint, and the nominal an octave above the prime — two above the hum, and the one you actually hear as the note. That minor third is why a ring of bells tuned to a major scale still sounds faintly like bad news, and it is the one thing about bells that everyone has noticed without being able to say why.

Inside the bell panel, the small ticks around the circle are the swing sampled at equal time intervals. They crowd at the top. That picture is the whole piece: all of a ringer’s control lives in the part of the circle where the bell is barely moving.

What is physics here, and what isn’t

Reuse

src/one-place.mjs is framework-free with no canvas in it.

Port notes: the whole module is arithmetic on numbers, no DOM and no allocation in the hot path. stepBell in demo/demo.js is 40 lines and is the only part that knows about time passing.

The demo is demo/index.html + demo/demo.js with its own copy of the module (ADR-0002). It sizes itself to its viewport, so the site’s full-screen button just works, and it rings itself on autopilot until you touch a control.

node scripts/screenshot-demo.mjs regenerates the thumb and media and is the smoke test: 18 assertions, any page error fails the run, and it drives the live demo to check that the window it reports matches the closed form, that autopilot rings plain hunt to 11.8 ms rms, that the same controller asked for two-place changes falls apart, and that a bell driven into either wall — over the stay, or checked silent — finds its way back. The ringers’ hand noise is a seeded PRNG so that last comparison means something from one run to the next.