Time & playback

Press play and your whole graph comes alive — here's how DNA keeps frames, the timeline, and your simulations in sync.

DNA is a real-time app, so almost everything you build can move. Animation, fields, audio, and simulations all read from a shared sense of "what time is it right now." This page explains the transport (your play/pause/scrub controls), how frames and FPS work, the $T and $F you'll type into Expressions, and — importantly — what keeps moving live versus what freezes the moment you pause.

Frames, FPS, and the timeline

Your project plays back at a frame rate (FPS) — typically 24, 30, or 60 frames per second. Each tick of the clock is one frame.

Two values track this everywhere:

You can drop either one straight into an The Expression language to drive anything that changes over time. For example, sin($T) makes a value sway back and forth once per ~6 seconds, and $F * 2 ramps up steadily as the timeline advances.

Frames can go negative. If you scrub before frame 0 or use a time offset, $F lands in negative-frame space — that's expected, not a glitch.

The transport

The transport is your set of playback controls — play, pause, scrub, loop, and the playback range. It's the single source of "now" for the entire project, so every node, the audio engine, and any external sync all agree on the same moment.

Scrubbing is great for inspecting a single moment, but remember that scrubbing backward is a jump, not playback — time-based effects that build up over many frames (trails, accumulation, simulations) may need to replay forward to look right.

What plays live vs what freezes when paused

This is the key thing to internalise. There are two kinds of motion in DNA:

Always live — updates whenever you change something. Anything that simply reads the current time or your inputs recomputes instantly, even while paused. Drive a parameter with $T, move a Gradient, tweak a field, or feed in a live pointer position — you'll see the result immediately because the graph re-cooks on change.

Only advances during playback — simulations. Anything that integrates over time — particles, cloth, hair, soft bodies, fluids, feedback loops — needs the timeline to actually move forward. These step one frame at a time, building each frame on top of the last. When you pause, they hold their current state and wait. They advance only while the transport is playing (or as you step frames forward).

If a simulation looks frozen, check that you're actually playing. A paused transport intentionally freezes every simulation in place — it isn't broken, it's waiting for time to advance. Press play to let it run.

This split is what makes DNA feel responsive: you can pause on a frame and freely tweak look and layout with instant feedback, while your physics stays exactly where you left it until you hit play again.

Cook

You'll see a Cook badge on nodes. "Cook" just means DNA recalculating a node's output. Most nodes cook only when something they depend on changes — that's the efficient default. A few nodes (like a live pointer input) are set to cook every frame so downstream work always sees fresh values. The badge tells you a node's cook policy at a glance.

Beyond frames: audio and tempo

DNA also tracks time in two other ways that run alongside frames:

All three move together under the same transport, so a beat-synced LFO, an audio effect, and a visual animation all line up. You don't have to manage this — tempo-aware and audio nodes simply read the right clock.

Advanced retiming nodes — Time Blur, Time Warp, Frame Hold, Retime — are planned. The timeline already understands per-node time-shifting under the hood, but these aren't yet built-in nodes you can drop in.

See also