Skip to content

Pepper: the Curta calculator, taken apart - #2

Merged
storagebits merged 1 commit into
mainfrom
machine/pepper
Nov 5, 2026
Merged

storagebits merged 1 commit into
mainfrom
machine/pepper

Conversation

@storagebits

Copy link
Copy Markdown
Member

What was built

Pepper, the Curta Type I mechanical calculator, in machines/pepper/ (curta-shared/, curta-film/, curta-live/). It is a model after public sources and is not affiliated with any maker or rights holder. REFERENCES.md, the page's footer and the gallery description all say so.

  • The model (curta-shared/machine.js, no three.js) is the one source of the figures and the arithmetic. It takes one input: the cumulative crank angle θ, plus the discrete state between turns (sliders, crank up or down, carriage position, ring). A plan of steps is laid out once. Every wheel position, carry lever, counter step and sound event is a pure function of t.
  • The mechanism:
    • One stepped drum: 9 addition rows, 9 complement rows half a row lower, and one row of ten for the first column.
    • 11 square shafts with sliding counting gears.
    • Carry levers dropped by a column's 9 → 0. The single carry tooth on the bell passes them in order during the second half of the turn.
    • Digit drums lying on their sides under the windows.
    • The carriage lifts, turns and drops. The clearing ring sweeps both registers back to zero.
  • The film (38 s):
    • 1,234 is set on the sliders.
    • The first turn runs in slow motion, exploded along the axis, with the drum macro.
    • 5 more turns (6 in all at position 1), a carriage notch, then 5 turns at position 2: 1,234 × 56 = 69,104.
    • The crank is pulled up and the axial cut shows the drum raised.
    • One turn back at position 2 adds 10¹¹ − 12,340, with a 7-carry cascade off the top shown in macro: 56,764 = 1,234 × 46.
    • Ring reset, then back to the vignette.
  • The live page is the same machine driven by hand:
    • Hand controls: turn, crank up/down, carriage ◂ ▸, clear. Click the setting drums (upper half +1, lower half −1). Keys: space, U, ← →, C.
    • 7 subsystem buttons, each setting its view, cut, explosion and isolation.
    • Body modes: solid, glass, axial section, exploded. 4 camera views.
    • Orbit and zoom, an auto tour with a cursor, and quality tiers.
    • Every action becomes a step of the same plan the film uses, so the digits still come from the model.
  • Aesthetic: a watchmaker-catalogue look, deliberately different from Spindl and Quantum.
    • Cool pale stone background (#e9e7e2) and one overhead light box with deep contact shadows.
    • Crackle-paint body, knurled rings as normal maps, satin steel ring and crank, brass and steel inside.
    • The warm brass accent (#b07a1c) marks only the working tooth row, the counting gear, the lowered carry levers and the carry tooth.
    • The sheet is set in Instrument Serif with fine rules. Registers are drawn as rolling numbered drums, and the operation is laid out by hand in columns.
    • Depth of field (bokeh) is on in the macro views only.
  • Sound (score.py): ratchet ticks, a home detent, one click per carry (the cascade comes out as a burst), the counter step, slider detents, carriage lift/notch/drop and ring friction. Plucked music-box notes in D major mark the strong beats, with no continuous music. Every time comes from sounds.json, written from the plan.

Figures checked (machines/pepper/check.mjs, in npm run check)

  • Registers 8 · 6 · 11 and their capacity; Type II 11 · 8 · 15 (cited only).
  • Ø 53 mm, 85 mm high (105 mm with the crank), 230 g, ~80,000 Type I.
  • 1,234 × 56 = 69,104 in 6 + 5 turns, with the counter at 56.
  • The ten's complement: the addend is 10¹¹ − 12,340, with 10 − 4 teeth on the first column and 9 − d on the others; the result is 56,764 with the counter at 46.
  • The carries of that turn: columns 5 → 11 in order, plus the overflow.
  • …999 + 1 = 0 with 10 carries.
  • The timing over a turn: each station's teeth come before its carry, carries run in order, and the counter steps last.
  • 3,000 random turns against plain arithmetic, mod 10¹¹ and mod 10⁶.

Decisions

  • Drum direction: the brief says the drum goes down when the crank is pulled. The sources (the vcalc reprint and fr.wikipedia) say it rises with the crank, so here it rises by 1.2 mm, half a row.
  • Beat order: the "…999 + 1" cascade is the cascade of the subtraction turn itself (columns 5 to 11, then one off the top). So the film runs subtraction, then cascade macro (same turn), instead of a separate cascade beat before the subtraction.
  • Station ring: 16 stations 22.5° apart (8 slider shafts, 3 carry-only shafts, 5 parked places). This keeps every result wheel over a shaft or a parked place in all 6 carriage positions. As a result the sliders span ~157° of the body, where the real machine spreads them wider.
  • Captions and the final panel read their numbers from the plan; none are typed.
  • Shared files: the only edits are additive ones: a package.json check entry, Pepper at the top of MACHINES, a README row and the gallery descriptions. Nothing in kit/, shared/, machines/spindl or machines/quantum changed.

Known limitations

  • These are estimates, listed in REFERENCES.md: the turn's timing angles, row pitch, carriage lift, ratchet tooth count, interior proportions, and how the columns above the 8th slider receive their 9s in subtraction (modelled as shafts at 0; the sources do not describe it). Rick Furr's service manuals and the patent text were not consulted.
  • The counter's own carries happen in the same step as its digit.
  • The score masters at −15.8 LUFS, short of −14: the mix is sparse by design.
  • The live page reaches ~60 fps on an Apple M1 (integrated GPU) at tier 1. One run settled at tier 2 (~34 fps) under load.
  • Under file:// the only console errors come from the Cloudflare analytics beacon and the favicon.
  • The counter windows are small in the top view; the registers on the sheet carry the readable values.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BzxZC5aA7ZkPTd3m9Kq4wy

A model of the Curta Type I after the public sources (not affiliated with any maker
or rights holder): one stepped drum for the 8 sliders, subtraction by the ten's
complement with the drum raised half a row, carries that run column after column
during the second half of the turn, the carriage lifted and turned to multiply, the
clearing ring. One input, the crank angle and the plan's discrete state; the film
multiplies 1 234 by 56 and takes one turn back. check.mjs recomputes the figures;
en, fr, es.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01BzxZC5aA7ZkPTd3m9Kq4wy
@storagebits
storagebits merged commit 99e6630 into main Nov 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant