Sound Canvas
The Sound workspace is Opal's audio asset baker. It turns library clips, synth tones, noise, and microphone takes into polished WAV sound effects you can trigger from Flow, scene music, or motion markers.
It is intentionally different from runtime audio playback:
| Workspace / tool | Best for | Output |
|---|---|---|
| Sound | Compose and process SFX, record takes, bake variants | .wav library assets |
| Add → Sounds | Import or record clips as-is | Raw audio assets |
| Object / Scene Flow | Play sounds during gameplay | Runtime playback (no baking) |
| Motion markers | Footsteps and timed SFX on clips | playSound at marker time |
Important: Sound Canvas bakes assets. It does not automatically wire a sound onto the selected scene object, and it never runs in the exported player. After saving a WAV, assign it in Flow with Play audio, set it as scene music, or pick it from the asset library.
When To Use It
Use Sound Canvas when you want to shape audio before gameplay — not just import a file and play it.
Open The Workspace
- Open a project in the editor.
- Import or record source audio with Add → Sounds, or plan to use Tone / Noise / Mic inside Sound Canvas.
- Click the Sound workspace tab in the top bar (between Motion and Art).
- Use + Sample, right-click the board, or drag an audio asset from the library.
You can also open an existing audio asset from the library inspector with Open in Sound Canvas — Opal switches to the Sound workspace and spawns a Sample patch focused on that clip.
The Sound workspace is a node board. Source nodes produce audio plans, processor nodes shape them, Preview lets you hear the result, and Save bakes a 16-bit stereo WAV into the asset library.
Sample: gravel.wav ──┐
Sample: cloth.wav ──┼── Mix ── Normalize ──┬── Preview
Tone: "thud" ──┘ └── Save → coin_pickup.wavBoard Basics
Sound Canvas shares the same board gestures as Art Canvas (pan, zoom, wiring, splice, marquee select, undo).
| Gesture or control | What it does |
|---|---|
| + Sample | Pick a library audio clip and create a Sample → Preview → Save patch |
| Clear board | Remove every Sound node from the current project graph (baked WAVs stay in the library) |
| 100% | Reset board pan and zoom |
| Right-click empty board | Add a starter patch, add any Sound node, or clear the board |
| Drag from a port | Wire compatible nodes together |
| Drag a wire to empty space | Open a filtered node menu for that wire type |
| Drop a pass-through node on a wire | Splice it into the pipeline when types match |
| Shift-drag board background | Marquee-select nodes |
| Drag an audio asset onto the board | Create a Sample patch at the drop point |
The board graph is saved with the project (soundGraph), so your baking setup is still there when you return. Baked WAV assets themselves live in the asset library and export with your game like any other audio clip.
Starter Patches
Right-click the board (or use the empty-board hint) for quick pipelines:
| Patch | Pipeline |
|---|---|
| + Sample patch | Sample → Preview + Save |
| + Layered SFX | Sample ×2 → Mix → Normalize → Preview + Save |
| + Quick synth | Tone → Preview + Save |
| + Mic capture | Mic → Trim → Normalize → Preview + Save |
+ Layered SFX and + Sample patch ask you to pick a starting audio asset. + Quick synth drops in a Tone node with default settings. + Mic capture is ready for recording — click Record on the Mic card when you are set.
Core Nodes
All Sound nodes use one wire type: audioClip. Every processor can splice onto any compatible wire.
Sources
| Node | Role |
|---|---|
| Sample | An audio asset from the library — the starting clip for a pipeline |
| Mic | A microphone take recorded straight into the library (same as Sample once saved) |
| Tone | A synth tone with optional pitch sweep; presets fill the fields |
| Noise | Seeded white or pink noise for whooshes, hits, and textures |
Tone presets: Custom, Blip, Chirp up, Chirp down, Laser, Thud, Power-up. A preset is a starting point — adjust wave, frequency, duration, attack, and volume after picking one.
Processors
| Node | Role |
|---|---|
| Trim | Keep a window of the clip. End 0 runs to the end |
| Gain | Scale level in decibels (0 dB = unchanged) |
| Fade | Linear fade-in and fade-out in milliseconds |
| Pitch | Tape-style pitch shift in semitones (duration changes with pitch) |
| Reverse | Play the clip backwards |
| Lo-fi | Bit-crush and downsample for a crunchy retro tone |
| Filter | Low-pass or high-pass biquad filter |
| Echo | Feedback delay with mix control |
| Reverb | Schroeder reverb for space and tail |
| Normalize | Scale so the loudest peak hits a target level (dBFS) |
| Mix | Layer up to four clips — each with gain, pan, and offset in milliseconds |
| Variation | Bake multiple takes with deterministic pitch and gain jitter |
Chain Mix nodes when you need more than four layers. Put Normalize near the end of loud stacks so the final WAV has a predictable peak.
Output
| Node | Role |
|---|---|
| Preview | Waveform monitor with Play/Stop, loop, and take selector (when Variation is upstream) |
| Save | Bake the incoming clip to a WAV library asset |
Preview And Save
Every wired node shows a mini waveform, duration, and peak level once the pipeline renders.
Preview card controls:
| Control | Use |
|---|---|
| Play / Stop | Hear the rendered clip (browser audio unlocks on first interaction) |
| Loop | Repeat playback while tuning |
| Take | Appears when a Variation node is upstream — pick which baked take to preview |
Save card controls:
| Control | Use |
|---|---|
| Name | Base file name for the baked WAV |
| Save | Bake to the library. After the first save, the button reads Save (overwrite) and reuses the same asset id |
| Save copy | Bake a new asset with fresh ids (for variants you want to keep side by side) |
| Reveal in Library | Jump to the saved asset after a successful bake |
Before saving, the Save card shows a summary: file name(s), duration, take count, and target folder. Preview and Save share one render path, so what you hear is what gets baked.
Single take → name.wav. Multiple Variation takes → name_01.wav, name_02.wav, and so on.
Tutorial: Clean Up An Imported Clip
Use Add → Sounds to import a raw recording or downloaded SFX.
Switch to the Sound workspace. Click + Sample or drag the clip from the library onto the board.
Splice a Trim node after Sample to cut leading/trailing silence. Add Fade with a short fade-out so the tail does not click.
Add Normalize before Preview/Save so repeated playback stays at a consistent loudness (for example peak -1 dB).
Play the Preview card. Set a clear name on Save (for example sfx_coin_pickup), then click Save.
Tutorial: Layer Two Samples Into One Hit
Use + Layered SFX or build the chain by hand:
Sample (impact) ──→ Mix A
Sample (noise) ──→ Mix B ──→ Normalize ──→ Preview + Save- Pick a starting asset when Opal asks — the patch seeds both Sample nodes with it as a placeholder; change the second Sample to a different clip.
- On Mix, set per-layer Gain, Pan, and Offset so the layers land where you want (for example noise slightly after the impact).
- Tune Normalize so the combined peak is near
-1 dB. - Preview, then save as one WAV (for example
sfx_heavy_hit).
Tutorial: Bake A Retro UI Blip
- Right-click the board → + Quick synth.
- On Tone, choose the Blip preset (or Power-up for a longer reward sound).
- Optional: add Lo-fi or Echo before Preview for character.
- Preview until it feels right, name the Save node (
sfx_ui_confirm), and save.
This path is ideal for menu clicks, pickup pings, and placeholder SFX before you replace them with recorded art.
Tutorial: Record And Clean A Mic Take
- Right-click the board → + Mic capture.
- On the Mic card, click Record, perform the take, then click Stop.
- Opal saves the recording to the library and wires it into the Mic node.
- Set Trim start/end to drop silence. Adjust Normalize peak if needed.
- Preview, rename the Save node to match the role (
sfx_door_creak), and save.
You can also record from Add → Sounds first, then open that asset with Open in Sound Canvas if you prefer to capture outside the graph.
Tutorial: Bake Variation Takes
When the same sound should not feel identical every time (footsteps, coin pickups, UI ticks):
- Build your pipeline up to a single output clip.
- Insert Variation before Preview and Save.
- Set Takes, Pitch cents, Gain dB, and Seed on the Variation node.
- Use Preview's Take selector to audition each variant.
- Save once — Opal writes
name_01.wav,name_02.wav, … for each take.
Pick one take for gameplay for now, or assign different files to different objects. Runtime round-robin packs are a future milestone; today each baked file is a normal library asset.
Use The Baked Sound In Your Game
After saving:
- Reveal in Library from the Save card, or find the WAV in the Audio folder.
- In Object Flow, add Play audio and point the clip field at your baked asset.
- For scene-wide music, use scene audio settings or Scene Flow — see Audio and VFX.
Example pickup graph:
Coin / On Tap
-> Add variable score +1
-> Play audio sfx_coin_pickup
-> DestroyThe asset library inspector also has Play / Stop for quick auditioning without leaving Arrange.
Effects And Variants
Sound nodes compose like Art Canvas effects — branch one source into several saved outputs:
Sample: step.wav ──→ Normalize ──→ Save "footstep_clean"
|
├── Pitch (-2 st) ──→ Save "footstep_low"
|
└── Lo-fi ──→ Save "footstep_retro"Good variant uses:
- Pitch for lighter/heavier versions of the same source.
- Reverse for swell-ins and weird UI feedback.
- Filter + Reverb for underwater, distant, or cave versions.
- Variation when you want multiple baked files from one graph.
- Save copy when you want a new asset id without losing the original bake.
Naming And Organization
Name baked sounds by game role, not by node type:
| Weak | Better |
|---|---|
Sound | sfx_coin_pickup |
Tone | sfx_ui_confirm |
Recording | sfx_door_creak |
new sound copy | sfx_slime_hit_wet |
Save related variants near their source clips. Save nodes try to place baked WAVs in the same library folder as the upstream Sample or Mic asset.
Troubleshooting
| Problem | First checks |
|---|---|
| Preview is silent | Wire a source into Preview; click Play after a user gesture (browser autoplay policy); confirm no upstream node shows a missing asset badge |
| Save button is disabled | The Save node needs a wired, renderable input — trace back to a Sample, Mic, Tone, or Noise node |
| Waveform shows "Wire a sound in" | Connect the upstream chain; Sample/Mic need a chosen or recorded asset |
| Missing asset badge on Sample | The source file was deleted or renamed outside the library — re-pick the clip |
| Saved sound did not change in Play mode | Save (overwrite) on the same asset id, then play-test again — re-bakes invalidate the runtime decode cache |
| Mic Record fails | Allow microphone permission in the browser; use Add → Sounds as a fallback import path |
| Clip is clipped or too quiet | Add or retune Normalize; check Gain on Mix layers |
| Render warning / very long clip | Pipelines cap at two minutes — shorten sources or trim earlier |