Six panels, one clock, identical state. Panel 0 reproduces the shipping PERFORMANCE screen
including its 100 ms beat flash (LEDBeatRow.swift:99-105) — at 120 BPM that is a
20 % duty cycle, so four glances in five land on a bar row showing no beat at all.
A, B and C are the v1 layouts. D1 and D2 are the v2 lead: Beacon's ring carrying Cockpit's
information, plus the one thing neither parent had — which note is sounding.
1 CSS px = 1 iOS pt — every size on this page is the number to ship.
Press 1 m or 2 m and the row shrinks to the visual angle a real phone subtends at that distance on a music stand. That is the whole test: what is still there when it gets small? On a phone, use FOCUS — one panel, near 1:1.
Fuse BEACON with COCKPIT. The radial variant is the one the owner picked; the information density he wants is Cockpit's. D1 and D2 are that fusion, and they are the lead — 0, A, B and C stay on the page as the comparison baseline, not as candidates. The v1 note on A · BEACON stands unchanged: it survives as a STAGE MODE, for players who are genuinely reading the phone out of the corner of the eye and want nothing else on it.
The two sub-variants differ on exactly one axis — how much of the panel the dial gets. D1 spends it on the ring (a 318 pt beat ring and a 240 pt subdivision pip ring); D2 spends it on the numerals (a 134 pt dial gauge, the largest bar/beat figures on the page). Both clear R1's tempo band at 2 m and carry beat position at 100 % duty. Every number is stated under its own panel and computed from R1 §2.2, not asserted.
Armed-colour rule for this scheme. The field is the shipping Ember dark
#0C0C0E, whose relative luminance is far below the v1 law's 0.1135 ceiling, so
#F0A040 remains a legal armed colour here. What changed is how often it fires:
the app already carries two lit tokens — dotLitAcc for accent beats,
dotLitNorm for plain ones (LEDBeatRow.swift:290-294) — and v1 flattened
them into one. v2 restores the split: the sacred ember appears exactly once per bar, on the
downbeat segment. Everything else that is sounding now reads cream. Ratios below are computed
in-page from the tokens, not typed in.
The shipping PERFORMANCE screen, reproduced from source. Tempo is the hero; beat is a 100 ms flash; bar hides in 14 pt monospace.
The bar becomes one 334 pt ring. Burnt arc = beats played, LIT head = now, sweep hand = continuous motion. Built for the corner of your eye.
One bezelled instrument: tempo, beat ladder, bar / meter / note as co-equal gauges divided by hairlines. The only variant whose tempo clears the optimal band at 2 m.
Four objects total. Numeral, filament rule (beat + meter), bar figure, ignition. Everything else deleted — labels included.
Beacon's ring, Cockpit's readouts, one bezel. A 318 pt beat ring with an inner 240 pt subdivision pip ring; bar · beat · meter · note as gauges beneath it.
Same parts, opposite weighting. The dial shrinks to a 134 pt gauge beside a 128 pt numeral, and the subdivision moves to a full-width ladder.
From BEACON: the ring. Position as a 2.84° object at 1 m that needs no fine detail resolved, plus a sweep hand — R1 §5.2's two strongest peripheral channels, luminance onset and motion, instead of only the first.
From COCKPIT: the bezel and the hairline-divided gauges, and the tempo size that made it the only v1 variant legible at 2 m. D1 runs Bebas 118 — Cockpit's exact hero — inside the ring rather than above a ladder.
From neither: the subdivision. No v1 panel said which note is sounding; the shipping screen doesn't either. It is a third concentric channel in D1 and a ladder in D2, and it is the reason the fusion is worth building rather than just picking one parent.
The beat's rate ceiling is the familiar one: 180 BPM = 3 Hz = WCAG 2.3.1. The subdivision's is
bpm × subdiv / 60, which crosses 3 Hz at 90 BPM in eighths and reaches
8 Hz at 120 BPM in 16ths. Move the Subdivision control and watch the SUB HZ readout.
That is legal — but only by the area exemption. A lit pip is 5 × 22 = 110 pt²; a lit ladder cell at 4/4 in eighths is 37 × 34 = 1 258 pt². A 10° field at 1 m is 1 123 pt across, so its area is ≈990 500 pt² — the pip is 0.011 % of it and the cell 0.13 %, against a 25 % threshold. The design rule that falls out: the faster a channel runs, the smaller it must be. Subdivision may never be a large-area cue.
A second, different limit arrives higher up. R1 §5.3 puts critical flicker fusion at 22-30 Hz; 240 BPM × 6-let is 24 Hz, where the onsets stop being discrete events. Position survives anyway — because it is carried by accumulated area, not by the onset. That is the §6 fix earning its keep a second time.
D1 and D2 differ on one number. A ring at radius 120 pt has 754 pt of circumference; D2's ladder has 325 pt of width (measured in the page, not estimated). Same panel, 2.3× the room, because a circle spends the diagonal a rectangle wastes.
It only matters at the top of the range. At 4/4 in eighths (8 marks) both are comfortable — 94 pt vs 38 pt of pitch. At 6/8 × 6-let (36 marks) the ring still gives 20.9 pt while the ladder gives 6.1 pt — 3.3 arcmin at 1 m, under the 5′ optotype floor, i.e. not small but unresolvable. If dense subdivisions matter, the dial is not a style preference.
The shipping app has always had two lit tokens: dotLitAcc #F0A040 for accent beats and
dotLitNorm #EAD8B0 for plain ones — see LEDBeatRow.swift:290-294, which picks
between them per beat. The v1 panels on this page painted every now-beat with the ember.
D1 and D2 restore the split, and it matters more with subdivisions on: at 4/4 in 16ths there are
16 "now" events per bar. If all sixteen were #F0A040, the one colour that means
downbeat would fire sixteen times a bar and stop meaning anything. Here it fires once.
The sounding subdivision reads cream at 13.90:1 — brighter than the ember in luminance, but not the
ember. Ranking is by area, not by hue: ring segment > beat pip > sub pip.
Shipping encodes the beat as a transient: flashBeat = beat, cleared 100 ms later
(LEDBeatRow.swift:99-105). Between pulses the row shows nothing about where you are.
A, B and C encode it as accumulated area — cold / burnt / LIT. Count the burnt cells and you have the beat, at any instant, at 100 % duty. Onsets stay abrupt (R1 §5.2), so the luminance-capture channel is untouched; what changes is that missing the onset no longer costs you the information.
Every caption on the shipping screen sits at 8-9 pt system font — a cap-height of 5.8-6.5 pt, which subtends 3.1-3.5 arcmin at 1 m. The 20/20 optotype floor is 5 arcmin. Those labels are not "small", they are below the resolution limit of a normal eye at stand distance.
So a label is a 0.4 m object, not a 1 m one. Either size it to clear MIL-STD-1472H's 10-arcmin soft-display minimum at 0.7 m (13.1 pt cap ≈ 19 pt Overpass Mono) or delete it. C deletes them all; B keeps three at 11-14 pt because the cluster's identity depends on them; A keeps two.
180 BPM is exactly 3 Hz — WCAG 2.3.1's flash ceiling. Push the tempo slider past it and the downbeat bloom switches off in all three panels; position keeps reading off the fill, and the sweep / filament keep the motion channel alive (R1 §5.4, path 2).
The area exemption is generous at these sizes: at 1 m a 10° field is ~1123 pt across, so 25 % of it is a 561 pt disc. Beacon's lit arc is 0.35 % of that field, the 92 pt ignition 0.7 %. Only a full-screen wash would be a problem — at 0.7 m a whole 393×852 pt screen is 69 % of the 10° field. Never flash the field.
Tokens here are the shipping Ember dark literals so the comparison isolates layout. They sit in a
single :root block; swapping in a brighter candidate ground is a one-block edit.
Two numbers D1 should carry over: dotNorm #34322E is 1.53:1 and the idle ignition
border amberDeep #7A4A10 is 2.62:1 — both under WCAG 1.4.11's 3:1 for meaningful
non-text. The stopped transport is a 2.6:1 ring on a 1.03:1 disc. "Brighter" is not just taste here;
the resting states are measurably under floor.