Transport, Run/Stop and file lifecycle
Every generator-shaped .dsp follows the global transport by
default. Master-Control Play starts its engine, Stop stops it — exactly
like a Builder. This is usually what you want: press Play, the whole rig
comes up.
Opting out is source-driven, like everything else about a DSP:
declare options "[transport:off]";
The footer Link-toggle and dsp.transport.follow.set { module_id, enabled } edit that token for you. A DSP with the token runs
independently — drive it via its own Run button or dsp.run, and a
global Stop leaves it playing.
Nuances worth knowing:
- Modules opened after the transport already started do not auto-join — deliberate "open a tab to inspect, not to interrupt" behavior. Hit Run yourself or cycle the transport.
dsp.runon an already-running DSP recompiles cleanly — it stops the prior worklet first. Use it as the "apply my edits" verb.- A follow-run that errors blocks re-runs until the source changes — no repeated error banners on every Play for a broken DSP.
- FX-shape sources never auto-start regardless of the flag (they can't run standalone at all).
Files, autosave, projects
A .dsp module created via documents.add IS a project file from birth —
assets/<title>.dsp, autosaved on every edit, restored with the project.
documents.save { module_id } forces a write (or writes to an explicit
path); project.file.rename renames it. A project export
(project.export → .fwproject.zip) bundles every DSP with the
project's project.json, so mixer strips, routings and sequencer content
travel together.