Sound Editor
Sound Editor
The Sound Editor is a visual node-graph tool for a table’s entire audio system. One canvas covers four layers of sound: sources (sample clips, synth voices, music, playlists), synth patches (the DSP inside a synth voice — oscillators, envelopes, filters, modulation), mix/bus routing (channel strips, buses, effects, panning, ducking, down to the device output), and trigger rules (event-driven decisions that pick and fire sounds). You can also hear your work: a synth patch auditions live through the browser.
See Node Editor Basics for the shared canvas gestures. Which graph is on the canvas — the top “Sources” scope, a synth’s patch, a clip-selection graph, or the mix graph — is shown by the breadcrumb in the top-left toolbar.
The audio rail
The live-audio panels live in a right-side rail rather than crammed into the toolbar: audition transport, output meters and oscilloscope, the clip-selection panel, the mix/bus strip, and the selected-node parameter preview. The rail reserves canvas width (the graph shrinks to make room) instead of floating over the nodes, so nothing hides beneath it. The top-left toolbar keeps the light chrome — provenance dots, breadcrumb, the find-nodes filter, the add-node palette, and the status line.
The node palette
The Add node palette is scoped to where you are — it offers only the node kinds that belong on the current canvas rather than every category at once. Which scope you’re in — the top Sources graph, a synth patch, the mix graph, or a clip-selection graph — decides what you can add. A Show unavailable expander reveals the kinds that scope knows about but can’t add directly, each greyed with its reason (for example Music, which redirects you to a playlist or layer).
By scope:
- Sources ✦ (the top graph) — Audio Clip (sample playback), Synth (a voice that encapsulates a DSP patch you drill into), Playlist (an ordered/shuffled set with crossfade), Music Layer (a base track with conditional overlays).
- Synth DSP ∿ (inside a patch) — Oscillator (waveform generator; its amp doubles as FM depth), Filter (biquad low/high-pass with modulatable cutoff), Envelope (ADSR control value), and a signal Mixer. The Output and the Amp VCA are managed for you and stay greyed.
- Mix / Bus ▤ (the mix graph) — Channel and Bus. Inserts — Effect (reverb/compressor/EQ/mod), Pan, Duck (sidechain), Spatializer, Limiter, Device Out (the terminal sink to the audio device) — are added in context and stay greyed in the palette.
- Triggers ⌁ (a clip-selection graph) — Selection plus the decision kinds Condition (gate on a var/expression), Probability (weighted sampler), Anti-Repeat (no-repeat / cooldown), and Selector (pick from a pool and fire). Event references are authored in the Rules and 3D editors, not here.
Ports are rate-typed and color-coded — signal (audio-rate PCM), control (control-rate CV), trigger (sparse events), gain (a scalar), and bus (named routing). A wire only completes between compatible classes (plus the one control↔gain “modulation” cross). When a connection is refused the wire snaps back and the status line tells you why — a transient warning (for example “rejected connection — … is not rate-compatible with …”, or cade’s own reason for an illegal modulation) that clears after a few seconds. Refusals are no longer silent.
Opening a synth patch
A Synth source node encapsulates a DSP patch. Double-click it to drill
into the patch scope; the canvas repaints to the oscillators/envelopes/filters
and the breadcrumb extends (e.g. Sources › bassSynth). Press Escape,
double-click empty canvas, or click an earlier breadcrumb crumb to drill back
out. Inside a patch you can add/connect/delete/rename nodes and edit their params
inline — envelope times are scrubbable millisecond fields (drag, wheel, or
type a plain number like 120), matching the freq and gain controls. A wire onto
a param slot becomes a modulate edge (for example an envelope onto
carrier.freq).
The smallest patch that makes a sound is one oscillator wired to the output —
no envelope required. cade fills in a default amplitude gate so the voice still
plays and releases cleanly. When you do add an envelope, the first one is
auto-named amp (later ones become env, env_2, …), so you never have to
remember the magic name. The amp → output gain wire is drawn as a muted,
translucent “documentary” wire: cade binds the amplitude VCA by the reserved
amp name, not by that edge, so it’s there to show the amp is the voice level,
not as a connection you manage.
Auditioning a patch
The Audition transport lets you hear a synth patch play through your speakers. The engine renders the same bit-accurate sound the real machine uses and streams it to the browser, so the preview is the true patch, not a re-synthesis.
- ▶ Play / ■ Stop — start and immediately silence the patch.
- Note buttons — a small keyboard (A3, C4, E4, G4, A4; A3 by default) sets the audition pitch so you can demonstrate the patch across notes.
- Status line — reports readiness (
ready — bit-accurate synth via cade),auditioning…,done,stopped, or an error. If the patch can’t play yet it tells you exactly what’s missing — “Add an oscillator and an output to audition this synth.” An amp envelope is not required: an oscillator wired to an output is enough to audition.
By default Play auditions a bundled demo patch; once you’ve drilled into a live synth, Play auditions that patch. Audition is a user gesture (it starts the audio engine on first Play, satisfying browser autoplay rules). In a headless environment or an engine build without audio, the transport is disabled and reads “audition unavailable” — it never errors.
Meters, scope, and parameter preview
Two visualizers help you read a patch — don’t confuse them:
- Output meters — a live oscilloscope of the waveform plus stereo L/R level meters with peak-hold and live dB readouts. It only moves while audition is playing; idle it reads “press Play to audition.”
- Parameter preview — a static inspection panel that follows the selected DSP node and draws its shape from its numbers with no sound: an ADSR curve for an envelope, a frequency-response curve (with cutoff marker) for a filter, or a single-cycle waveform for an oscillator. Select an oscillator, filter, or envelope to populate it.
Clip selection and triggers
The Clip selection panel has a scope dropdown listing selection scopes as
owner · name (clip count); picking one loads that decision graph — event
sources, conditions, probability, anti-repeat, and selectors — onto the canvas so
you can see how a sound is chosen and fired for an event.
With Follow 3D selection on (an Options-menu toggle, on by default), picking a sound-bound device in the Object Editor surfaces that device’s selection graph on the Triggers canvas. The same happens when you open the Sound editor from the object editor’s right-click Open in editor ▸ Sound editor deep-link — it lands focused on the device you came from.
Mix and bus routing
The Mix / bus panel shows the routing as a read-only row of strip chips — one per channel or bus (buses prefixed “⇢”, effect counts shown like “(2 fx)”) — with a status such as “3 strips · 1 flagged route(s).” A flagged route is the engine pointing out a routing concern worth inspecting. The single top-level mix graph loads directly onto the canvas; the chip list is a summary, and the routing itself is the graph you edit on the canvas.
Live vs. sample
The editor draws on two data sources that can be live independently — the catalog behind the palette, and the synth patches you drill into. When live, edits round-trip through the engine and a rejected edit reverts with an explanation — and they persist across a reload and sync live to other open windows on the same table. In sample mode the palette and a faithful sample catalog are available but editing is optimistic, and audition, selection, and mix editing all need the live engine.