π Rider asks you to remember the digits of π. The lab asks a different question: what happens if you do arithmetic to them?
You build a short pipeline of operations — add the index, multiply by π, take a sine, square it, feed the previous answer back in — and it runs over every digit of π in turn. The results fly past exactly like a ride, with π's untouched digits shown alongside as a dim reference lane, so the size and shape of the change is visible rather than inferred.
Most of what you can build here is mathematically meaningless, and that is fine. The instrument is for looking. Some transforms preserve π's famous flatness, some tilt it, some collapse it into a handful of values, and some produce structure that is entirely an artefact of the operation rather than anything about π. Telling those apart by eye is the whole exercise.
▶ PLAY in the transport bar, or tap SPACE. Digits start streaming toward the marker on the left.× π. The bright lane jumps somewhere new; the dim lane does not move, because that is π itself.+ OP to add a row, pick an operation and an operand. Rows run top to bottom.
The buttons at the left of the transport bar switch between five
ways of looking at the same numbers, and V steps
through them from the keyboard. The ride shows you a
few dozen values going past in detail. The grid shows you
tens of thousands at once: one coloured cell per value,
filling a row and then wrapping onto the next, exactly like text on
a page.
Everything else keeps working underneath. The chain, the base and the transport are shared, playback still runs and still makes sound, and the READOUT and DISTRIBUTION panels still describe the playhead — which the grid marks with a white box. Editing the chain repaints the whole picture.
The reason to do this is that periodicity becomes geometry. A transform that repeats every n values draws a vertical stripe when the row is a multiple of n wide, and a diagonal when it is not — so sliding WIDTH until the stripes stand up straight measures the period by eye. Structure that reads as noise going past one value at a time is often obvious as a texture.
1 a screen holds several hundred rows and the picture is a whole territory; at 40 it is a handful of rows read like a strip of film.0 wraps exactly at the width; anything else slides every row sideways, tilting stripes into diagonals. Negative values make rows overlap, so the same values reappear shifted — the fastest way to make the picture interfere with itself.1 everything converges on the middle colour; above it, small differences separate and the picture goes graphic.square tiles solidly; dot and diamond leave the background showing; bar makes each cell's height the value too, so the picture stays readable even in mono. Cells only a few pixels across are always drawn square — a circle inside three pixels is a worse square.digit is the ride's own palette, so a base-10 picture is coloured like the game. spectrum separates neighbouring values hardest, heat and ice read as brightness, mono strips colour out entirely, and duo is two-sided — use it with a MAP that is centred on zero.value is the transformed result. value − digit is the change the chain made, so an identity chain goes flat. step to step is the difference from the previous cell, which erases level and shows only movement. π's digit ignores your chain and paints π itself — the control picture.
Moving around. Scroll with the wheel, drag the picture, drag
the bar on the right, or use PAGE UP / PAGE
DOWN / HOME / END. FOLLOW
keeps the playing row on screen; touching the scroll yourself turns
it off, because you are looking at something. Click any cell
to send the playhead to that digit. SAVE PNG writes the
picture out as it stands, without the playhead box.
Three that are worth setting up exactly:
(i * 3) % base. Nothing about π survives, so the picture is pure lattice — a weave whose angle is set entirely by WIDTH. Useful as a calibration: that is what total structure looks like, and π's own digits look nothing like it.
SPIRAL and SQUARE are the same cells as
the grid, threaded onto a curve that winds out from the centre
instead of wrapping into rows. Index 0 is at the middle and π runs
outward from there, so how far into π a digit is becomes how far
out it sits. V steps through all five views, and
RINGS below is a third layout on the same plan.
Unlike the grid these are plans you move around on, not
pages you scroll: drag to pan, wheel to zoom, or use
+, − and 0. A spiral has no
rows to page through, and the thing worth looking at is nearly
always either the very centre or one arm a long way out.
The round spiral has two layouts, and they are genuinely different instruments.
√n, so every digit gets the same amount of room and the picture is one evenly filled disc. At the default PER TURN of 1.618 — the golden angle — no two digits ever line up, which is why all 100,001 of them fit into a single flower with nothing wasted. This is the view that shows the most at once.10.000 exactly and then detuning it: at +0.000 the rays stand still, and a nudge winds them into slow spirals whose lean measures how far off the period you are.turns, between adjacent dots in packed. In world units, so zoom is separate from it.The square spiral is the Ulam walk: right, down, left, left, up, up, and on around, one cell per digit. It is the grid's mosaic wound up rather than wrapped.
2 is the true Ulam walk and tiles the plane solidly, with no cell used twice and none left out. Anything else leaves the coil open.+1 tiles solidly; wider values leave a gap between coils, so the picture becomes a nest of separate square rings and the same digits need several times the area.SPIN reverses the winding of either spiral, and STRIDE, CONTRAST, GLOW, SHAPE, COLOR and MAP mean exactly what they mean in GRID VIEW. FIT frames the whole thing again, FOLLOW recentres on the playhead when it winds off screen, clicking a cell sends the playhead there, and SAVE PNG writes the picture out without the playhead ring.
Three that are worth setting up exactly:
10 / gcd(r, 10) different colours, so the evens are half as varied as the odds and the ray at 5 has only two. The picture is reading arithmetic, not π.(i / 3000) % base
Both spirals draw concentric rings that crowd together toward the edge. That is not π and not the transform: distance from the centre goes as the square root of the index in the packed disc and in the square walk alike, so each ring out holds more digits than the last. Worth seeing once, so you recognise it when it turns up under something you thought you had found.
RINGS is the third layout on the same pannable plan,
and the only one that is not a single curve. The digits are dealt
into closed concentric circles: the innermost ring takes
FIRST of them, and every ring after it takes GROW
more than the ring inside it. With the defaults that is one digit
in the middle, then two, then three, then four — a target rather
than a coil.
The consequence worth holding onto is that the number of digits per revolution changes as you go out. In the round spiral it is either fixed or grows on its own terms; here you set it directly, and the whole character of the picture is that one choice.
1 it is a single dot at the origin. Above that the first ring is pushed out far enough that its own digits sit one SPACING apart, because a ring of several digits cannot be at the centre — they would all be the same point.2π·k spacings to spend, so +6.28 is the value that keeps neighbours along a ring about as far apart as the rings are from each other. Below that the rings are sparse and read as rings; above it they crowd into solid bands. It is deliberately fractional — whole numbers make the ring counts an arithmetic run, and the fractions between them drift.+0.50 each ring sits half a digit round from the one inside it, which is the offset that stops the sparse rings lining up into spokes. Anything else winds the whole stack into a slow twist.SPIN, STRIDE, CONTRAST, GLOW, SHAPE, COLOR and MAP are the same controls as everywhere else, and so are FIT, FOLLOW, SAVE PNG, click-to-seek and drag/wheel to move about. The panel header counts the rings the layout came to.
Two that are worth setting up exactly:
i mod 10 and the rings become the turns spiral cut into closed circles. The rays come back exactly as they do there — one flat ray at the multiples of ten — and this is the setting to reach for when you want to read a period off the angle without the coil sliding it round.
A value starts as the digit and passes through each enabled row in
order. Row 1 gets the raw digit; row 2 gets whatever row 1 produced,
and so on. Order matters — + 1 then × 2
is not × 2 then + 1.
The presets across the top of the panel replace the whole chain. They are starting points, not modes — pick one and then edit it.
Two-sided operations combine the running value with an operand:
+ add add the operand− sub subtract it× mul multiply by it÷ div divide by it^ pow raise to its power% mod remainder after dividingmin keep the smallermax keep the largerOperands — what the operation is applied with:
number a constant you typei index the digit's position, 0, 1, 2, 3 …d digit the original digit, unchanged by earlier rowsp prev the finished value of the digit before this oneπ 3.14159…e 2.71828…base the current baseOne-sided operations transform the running value on their own and ignore any operand:
sin cos tan in radiansasin atan inverse, in radians√ sqrt square rootln natural logarithme^v exponential|v| absolute value1/v reciprocalfloor round downround round to nearestfrac keep the fractional part only−v negatep prev. It is the finished, wrapped value of
the previous digit — the one actually plotted there, not an
intermediate. This makes a chain a feedback loop: every value depends
on the entire history before it, so one edit anywhere changes the
whole run, not just one point.
After the last row, the result is folded back into the digit range
0 … base−1 by repeatedly adding or subtracting the base
until it fits. In base 10, 14 becomes 4,
−1 becomes 9, and 23.5 becomes
3.5.
Wrapping keeps fractions. A digit is a whole number but a transformed
value usually is not, and the lab plots it at its exact height —
3.7091 sits between the 3 and 4 gridlines, and its color
is blended between the 3 and 4 colors. That precision is what lets
drifting patterns show up at all.
QUANTIZE in the transport bar snaps everything to whole digits for display, so the result reads as a sequence of digits in the base rather than as a continuous signal. It is purely a lens: the underlying values are untouched and switching it off restores the full precision immediately.
Some arithmetic has no real answer. Dividing by zero, the square root or logarithm of a negative, an expression that throws — all of these produce a value that is not a number, and there is no honest height to plot it at.
Rather than silently substituting zero, the lab drops a red marker
on the dead rail below the axis and leaves the lane empty at that
index. The READOUT shows ∅ GAP, the audio plays a tick
instead of a note, and the DISTRIBUTION panel counts them separately.
Try the 1 / d preset: every place π has a zero becomes a
gap, which turns the panel into a map of π's zeros.
One exception exists so a single bad digit cannot destroy everything
after it: when p prev reads a gap, it sees 0.
The gap is still drawn as a gap.
+ EXPR adds a row where you write the arithmetic
yourself. It is evaluated once per digit and its result becomes the
running value, so expression rows mix freely with operation rows.
Variables:
d the original digiti the indexv value coming into this rowp previous digit's resultbase the current basePI E constantsFunctions — the usual set, unprefixed:
sin cos tan asin acos atan atan2 sqrt cbrt exp log log2 log10
abs sign floor ceil round trunc min max pow hypot random
Examples:
d * PI scale by πd + sin(i / 12) * 4 a slow wave through the run(d * d) % 7 squares modulo 7d < 5 ? d : base - d fold the top half downabs(d - p) the gap between neighbourslog(d + 1) * base / 2 compress the high digitsA row that will not compile, or that returns something which is not a number, is outlined in red with the reason underneath and is skipped — the rest of the chain keeps running while you fix it.
The base buttons and the number box accept anything from 2 to
64. This is a real conversion of π, not a re-reading of its
decimal digits: base 16 begins 3.243F6A8885A308D3,
base 2 begins 11.001001000011111101. Changing base
changes what the digits are.
The conversion runs in the background and streams in, so playback starts immediately while the deep digits are still arriving — the SOURCE panel shows the progress bar and the count. Bases you have already visited come back instantly.
How many digits a base yields depends on how much information each
one carries: base 2 gets around 200,000, base 10 exactly 100,001,
base 64 about 55,000 — all from the same underlying expansion of π.
Above base 10 the digits are written 0–9, then
A–Z, then a–z, then + and
/.
11 and 10), so the first two indices
are both to the left of the radix point.
SPACE does the same from anywhere except inside a text box.Editing while paused works exactly as well as editing while playing — the whole visible window recomputes either way.
AUDIO arms the sound on first click, because browsers only allow audio to start from a deliberate gesture. Click it again to silence it.
Every digit the playhead crosses is voiced, with pitch rising across the base: the lowest value is A3 and the highest is two octaves above it. In base 10 with QUANTIZE on, the lab borrows the game's own ten-note ladder so a base-10 experiment sounds like the ride it came from. Gaps get a short tick rather than a pitch, since they are not a value.
Above about sixteen notes per second the notes thin out automatically — past that density it is texture rather than melody, and stacking more voices only muddies it. Hearing a run is surprisingly good at catching short cycles that the eye reads as noise.
A tally of every value computed so far, not just the ones on screen. It updates on every edit, so it is the fastest way to see what a transform does globally.
The dashed line marks a perfectly even spread. π's own digits sit almost exactly on it — that flatness is the well-known thing about π — so the interesting question is always whether your transform preserves it. A tilt, a comb of spikes, or a hole means the operation is imposing structure of its own.
Below base 16 the bars are subdivided finer than one per digit,
because transforms that produce fractions would otherwise pile
everything into two or three bars and show nothing. Bin edges always
line up with digit boundaries, so a transform producing whole numbers
still reads as evenly spaced spikes. ∅ counts gaps and
PEAK names the most common digit.
(p * 3 + d) % base. This is roughly how a cheap random number generator works, and it produces something that looks like noise no matter what you feed it — a caution about reading meaning into any of this.^ pow, or e^v stacked — lose all meaningful precision before wrapping, and the result is numerical noise rather than mathematics.SPACE play/pause · V next view · ? this panel · ESC close it. In the grid, PAGE UP PAGE DOWN HOME END and the arrow keys scroll; in a spiral, + and − zoom and 0 fits.