The onset detector was firing correctly. On every detected transient, particles spawned from the impact point, fanned outward along calculated trajectories, faded when their timer expired. Each one did exactly what it was told.
They felt dead.
The problem wasn’t the trigger logic. It wasn’t the trajectory calculation. The problem was uniformity across time. Every particle carried the same energy from spawn to expiry. Opacity declined linearly until the particle vanished. From the first frame to the last, nothing about the particle changed except how visible it was.
That isn’t energy. That’s a ghost with a timer.
The life-arc
The fix started with one variable: energy. Initialised at 1.0 on spawn, decayed each frame by an exponential: energy = 0.9^age. age counts frames from spawn. At frame 0, energy is 1.0. At frame 23, it’s around 0.09. At frame 46, around 0.008. The curve drops steeply in the first third of the particle’s life and coasts on a long tail through the rest. That shape mirrors a transient waveform: sharp attack, slow release.
Energy then gates the wobble: sin(age · freq + phase) · amp · energy. The wobble is perpendicular displacement — lateral motion relative to the travel direction. At birth, energy near 1.0 means full amplitude: wide, fast oscillation. Through the middle of the arc, energy around 0.3 compresses the displacement. Near the end, the particle is barely moving sideways. It’s drifting outward on inertia, the wobble almost gone.
Two other parameters changed in the same pass. Lifespan doubled. The longer arc gives the decay curve room to resolve — at the original lifespan, the late-stage drift was too brief to read as a distinct phase. Size grows with age.
Three things together: the lateral motion starts wide and compresses, the particle lives twice as long, and it expands as it ages. The combination reads as something that launched with force, spent it, and dispersed.
Why perpendicular
Wobble inline with the travel direction produces stutter. The particle moves outward in hesitant surges. It reads as inconsistent speed — a different effect, valid for some visual purposes, wrong here.
Perpendicular wobble lets the net outward travel continue while the particle has lateral body language. It’s going somewhere and doing it with visible energy. Tying the displacement to energy means that character fades with age. The particle has a busy start and a quiet end.
Why exponential and not linear
Linear decay from 1.0 to 0.0 over N frames gives constant reduction: the same energy loss every frame. The wobble amplitude shrinks at a fixed rate. The result is an even fade on the lateral motion.
Exponential decay matches the subjective experience of a transient. The attack is sharp: the particle burns through most of its energy in the early frames. The release is long: it coasts on the remainder for most of its life. The early frames do the dramatic work. The late frames are the aftermath.
0.9 as the base produces a specific curve. Raise it toward 1.0 and the tail stretches — the particle retains more energy into middle age. Lower it toward 0.8 and the tail compresses — it burns out earlier. Lifespan and the base are the two controls. They interact: a longer lifespan with a shallower decay (0.95) produces a different rhythm from a shorter lifespan with a steeper one (0.85), even if the total energy under each curve is similar. The current values were settled by watching the particles against the real track.
Why bigger at death
Grow-over-life is the counterintuitive part. A dying particle gets larger.
The reasoning: energy becoming diffuse looks like spreading, not contracting. A particle that shrinks as it loses energy reads as “running out.” One that grows reads as “dispersing.” The second is closer to what a transient actually does — the energy radiates outward rather than being consumed.
Wobble decay alone would produce a quieting-down. Size growth turns it into a spreading-out. Small, fast, and wobbly at birth; large, slow, and nearly still at death. The terminal state reads as a distinct state, not just as less-visible.
The composition context
The visualiser runs against Tasogare — 3:16 at 48kHz 24-bit stereo. The particle work was dialled in against test audio first and then validated against the real track. Real audio has soft-attack elements and ambiguous onsets. Sometimes the detector fires slightly late; sometimes it misses what the ear hears as the beat.
That turns out not to matter. The particles don’t need to be metronomically exact; they need to read as alive. A timing offset between the audible beat and the spawn point doesn’t break the life-arc effect because the arc carries its own visual narrative from whenever it starts.
What the surrounding layers are doing
Three reactive elements share the scene. The onset particles operate on transient-time — a lifespan that fits between adjacent beats. The neon bloom operates on kick-time: its opacity is driven by a kick envelope and a bass level signal, so it flares on the low end and settles quickly. The temporal portal — a winter panorama behind the spring foreground, revealed through a radial cutout in the front layer — breathes on bass-time, expanding and contracting across longer tonal shapes.
Three timescales. If all three snapped on the same trigger, the scene would read as one uniform pulse. The particles having a longer life with legible phases is what makes the scene feel layered. The viewer isn’t watching a single toggle. They’re watching things happen at different rates.
That separation wasn’t designed in from the start. It emerged from getting each layer’s internal logic right individually, then reading what the combination was doing.
The principle behind the implementation
A reactive element in a visualiser has an implicit timescale: how long its response lasts and how that response changes across its duration. Most implementations handle the instantaneous state — what happens at the moment of trigger — and leave everything after it as a linear fade.
A life-arc is an explicit decision about the entire duration. It requires three answers: what is the element at peak energy, how does it degrade, and what is its terminal state. The terminal state matters as much as the launch. If the end-state isn’t distinguishable from any mid-life frame except by being dimmer, the particle doesn’t have a death — it has a slow disappearance.
For these particles: small, fast, and wobbly at launch. Large, slow, and nearly still at death. The peak and the terminal are visually legible as distinct states. The decay connects them.
One exponent. The rest follows.



