Audrey LeoAudrey Leo
HomeWorksAboutGarden

[CREATIVE COMPUTING · INTERACTIVE INSTALLATION]

A p5.js installation that turns darkness into living memory

Impermanence is a browser-based installation controlled by an Arduino photoresistor. When the room darkens, coloured particles bloom and pentatonic notes emerge, as if memory is surfacing. When light returns, everything dissolves.

Skip to Final Design ↓
Impermanence

SCOPE

Creative Computing Interactive Installation

ROLE

Solo. Concept, circuit design, p5.js code, and sound system.

[PROBLEM SPACE]

Memory is not stored. It is performed — and it needs the right conditions.

We forget not because we choose to, but because the conditions for remembering stop existing. A smell, a song, a sudden quiet — these are triggers, not choices. Impermanence builds that logic into hardware: a photoresistor sensor that releases colour and sound only when the room is dark. You cannot force it. You can only remove the light.

[CONCEPT]

What if forgetting was just a problem of light?

An Arduino Uno reads ambient light continuously via a photoresistor voltage divider. When darkness drops below a set threshold, p5.js spawns coloured particles and activates pentatonic oscillators, and the room begins to remember. Sustained darkness triggers memory mode: particles glow brighter and resist decay. When light returns, everything dissolves. The audience does not interact. They inhabit.

[PROCESS]

Circuit Design

The circuit uses a photoresistor in a voltage divider configuration wired to analog input A0 on an Arduino Uno. Values stream 0 (total dark) to 1023 (bright) over Web Serial API — no server, no latency. The darkness threshold was set at 300 after testing in the gallery space, where ambient light during opening hours hovered around 450.

Visual System

The visual logic was drawn directly from constellations: nodes of light connected by proximity, not by design. Twelve pastel colours, each assigned a unique pentatonic frequency, map to individual particle types. Particles exhibit emergent flocking behaviour, connecting via proximity-based lines when within 80px of each other. Extended darkness beyond 1.5 seconds triggers memory mode, where particles glow brighter and their decay timer resets. The result is a sky that shifts each time the room goes dark.

°·⸜(。˃ ᵕ ˂ )⸝ I've always been so fascinated by these sparkles above.
°·⸜(。˃ ᵕ ˂ )⸝ I've always been so fascinated by these sparkles above.

Sound Design

Twelve independent sine wave oscillators run in parallel via p5.sound. Each maps to one colour-particle pair. When a particle spawns, its oscillator briefly activates — amplitude mapped to darkness intensity. The result is a generative, non-repeating harmony that grows denser the longer the room stays dark. No loop. No file. Pure synthesis.

Process

The build started with the serial connection: getting the Arduino to talk to the browser reliably was harder than expected. Baud rate, cable quality, and browser permissions all introduced failure points. Once serial was stable, the particle system came together quickly — the flocking logic is simpler than it looks. Sound was the last layer, tuned in the gallery space itself during setup.

°·⸜(。˃ ᵕ ˂ )⸝ Gallery setup. Arduino wired to breadboard, running alongside the browser sketch on a laptop.
°·⸜(。˃ ᵕ ˂ )⸝ Gallery setup. Arduino wired to breadboard, running alongside the browser sketch on a laptop.

[FINAL DESIGN]

Impermanence

Impermanence asks one question: what do you remember when the room goes dark? The installation offers no interface, no prompt, and no correct response. It simply responds.

°·⸜(。˃ ᵕ ˂ )⸝ look at them go !!! little particles finding each other in the dark ,,
°·⸜(。˃ ᵕ ˂ )⸝ look at them go !!! little particles finding each other in the dark ,,

[REFLECTION]

What the piece changed about how I think about hardware.

Web Serial is fragile in ways that matter

Permissions reset between sessions. Cables introduce signal noise. Baud rate mismatches produce silence rather than errors. Building a fallback mode that simulates sensor input from the mouse would make this viable in any gallery context, not just ones where serial works.

The threshold is a design decision, not a calibration

Setting the darkness threshold at 300 was not a technical choice. It was a curatorial one: how dark does the room need to be before memory surfaces? A future version would let the threshold shift across an exhibition's run, so the piece becomes harder to trigger as the days progress.

[SOURCE CODE]

View source on p5.js editor

[INTERESTED IN MORE?]

See the next projects here →

view all works →