Bubble Chamber
A seeded, parametric generator of imaginary particle-physics plates — the black-and-white "bubble chamber" photographs of mid-century high-energy physics — built for large-format art print. One seed → one fully-determined image, rendered either as a worn photographic plate or as clean, layered vector for print.
How the images are generated
Everything derives deterministically from a seed string: the seed is hashed
(cyrb53) to seed a chain of salted PRNGs (mulberry32) that drive a small
physics model, so the same seed always yields the same plate. Charged particles
are launched from interaction vertices and integrated step-by-step through a
uniform magnetic field — curving with radius r = p/(qB) and bleeding momentum to
a simplified Bethe–Bloch energy loss, so slow particles tighten into inward
spirals. The velocity β is tracked along every path and sets both how densely
bubbles nucleate (∝ 1/β²) and how fat they are. Low-energy electrons
knocked loose along the way (δ-rays) are drawn as tight logarithmic spirals;
neutral particles leave V-decays; stiff cosmic rays and gentle
sweepers cross the frame; a pressure shock disk, faint chamber-optics
lines, and emulsion damage (scratches, dust, water rings, stains) complete the
scene. This pure geometric description — the scene model — is renderer-agnostic
and handed to independent renderers: a photographic raster compositor that
layers soft blooming bubbles, halation, film grain, tonal mottle, vignette and
plate damage for the worn-archival look; and a vector renderer that emits the
identical geometry as layered SVG and CMYK PDF (with OCG layers) for the
print shop. Because the seed fixes every choice, an inspiration thumbnail and its
print master are the same image at different sizes.
Colour, palettes & effects
Black-and-white is the default; colour is an optional, seeded palette layer
(src/render/palette.js) applied over the same geometry. Shipped feels:
- mono (B&W), charge (duotone by charge sign), β (velocity → spectral)
- kind (one hue per particle type), kindlife / kindrise (type sets the hue, lifecycle sets the intensity — fading to, or rising toward, the death)
- lifecycle (hue across birth→death), psychedelic (hue cycling along trails)
- cyanotype (a full chemistry — blueprint ground + pale ink), magentarise (a restrained magenta-family example with a burnt-orange disk)
Orthogonal global controls: paper tone (cream/sepia/selenium/cool/olive/neutral toners + brightness + gas-glow), saturation, hue shift, depth/exposure (per-trail opacity, size & defocus from chamber depth + event age), bubble edge softness, iridescent disk (spectral sunburst), and chromatic halo (a hue-shifted aura around trails). Adding a new "feel" is one entry in the registry.
Quick start
# interactive: open the single self-contained file in a browser
open bubble_chamber.html # type a seed, hit "Derive all params from seed", tweak sliders
# dev build (modular src/ → portable single file)
node build.mjs
# browse random plates, pick by seed, render print masters
tools/inspire.sh 24 600 # → output/inspiration/index.html
tools/render.sh LAMBDA-2648 # → output/masters/ (SVG + CMYK PDF + hi-res PNG)
node tools/render-svg.mjs --seed LAMBDA-2648 out.svg 6000 diskSoften=1.5
Project layout
src/— modular source:scene/(the deterministic model),render/(canvas / svg / pdf),ui/,rng.js,main.js.bubble_chamber.html— built, portable single-file app (live sliders + export).tools/— headless render helpers, the inspiration randomizer, CLI renderers.output/—inspiration/contact sheets,iterations*/curated SVG sets (with browsableindex.html), andmasters/print files. Raster PNGs and print masters are git-ignored (large and fully reproducible from their seeds).- DESIGN.md — architecture & physics decisions.
- PRINT.md — large-format strategy (vector + texture layers, SVG/PDF layers, sizes/DPI).
- roadmap.md — where the project is going, artistically and technically.
Aesthetic
Faithful black-and-white photographic-positive by default (dark ink on milky paper), with a "negative plate" variant and an optional colour-palette layer. Vector-first for print; the seed/hash makes any preview reproducible at any resolution.