Skip to content

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 / toolBest forOutput
SoundCompose and process SFX, record takes, bake variants.wav library assets
Add → SoundsImport or record clips as-isRaw audio assets
Object / Scene FlowPlay sounds during gameplayRuntime playback (no baking)
Motion markersFootsteps and timed SFX on clipsplaySound 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.

Imported clip needs cleanupTrim silence, normalize loudness, add a short fade, then save a tighter pickup or UI click.
Layered one-shot SFXMix two or more samples with offset, pan, and gain, then normalize into one reusable hit or pickup sound.
Quick retro synthStart from a Tone preset (blip, laser, thud, power-up), tweak it, preview, and bake — no external editor required.
Voice or foley captureRecord through the Mic node, trim the take, normalize, and save a library asset.
Variation packsAdd a Variation node before Save to bake multiple slightly different takes (`name_01.wav`, `name_02.wav`, …).

Open The Workspace

  1. Open a project in the editor.
  2. Import or record source audio with Add → Sounds, or plan to use Tone / Noise / Mic inside Sound Canvas.
  3. Click the Sound workspace tab in the top bar (between Motion and Art).
  4. 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.

text
Sample: gravel.wav ──┐
Sample: cloth.wav  ──┼── Mix ── Normalize ──┬── Preview
Tone: "thud"       ──┘                      └── Save → coin_pickup.wav

Board Basics

Sound Canvas shares the same board gestures as Art Canvas (pan, zoom, wiring, splice, marquee select, undo).

Gesture or controlWhat it does
+ SamplePick a library audio clip and create a Sample → Preview → Save patch
Clear boardRemove every Sound node from the current project graph (baked WAVs stay in the library)
100%Reset board pan and zoom
Right-click empty boardAdd a starter patch, add any Sound node, or clear the board
Drag from a portWire compatible nodes together
Drag a wire to empty spaceOpen a filtered node menu for that wire type
Drop a pass-through node on a wireSplice it into the pipeline when types match
Shift-drag board backgroundMarquee-select nodes
Drag an audio asset onto the boardCreate 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:

PatchPipeline
+ Sample patchSample → Preview + Save
+ Layered SFXSample ×2 → Mix → Normalize → Preview + Save
+ Quick synthTone → Preview + Save
+ Mic captureMic → 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

NodeRole
SampleAn audio asset from the library — the starting clip for a pipeline
MicA microphone take recorded straight into the library (same as Sample once saved)
ToneA synth tone with optional pitch sweep; presets fill the fields
NoiseSeeded 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

NodeRole
TrimKeep a window of the clip. End 0 runs to the end
GainScale level in decibels (0 dB = unchanged)
FadeLinear fade-in and fade-out in milliseconds
PitchTape-style pitch shift in semitones (duration changes with pitch)
ReversePlay the clip backwards
Lo-fiBit-crush and downsample for a crunchy retro tone
FilterLow-pass or high-pass biquad filter
EchoFeedback delay with mix control
ReverbSchroeder reverb for space and tail
NormalizeScale so the loudest peak hits a target level (dBFS)
MixLayer up to four clips — each with gain, pan, and offset in milliseconds
VariationBake 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

NodeRole
PreviewWaveform monitor with Play/Stop, loop, and take selector (when Variation is upstream)
SaveBake 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:

ControlUse
Play / StopHear the rendered clip (browser audio unlocks on first interaction)
LoopRepeat playback while tuning
TakeAppears when a Variation node is upstream — pick which baked take to preview

Save card controls:

ControlUse
NameBase file name for the baked WAV
SaveBake to the library. After the first save, the button reads Save (overwrite) and reuses the same asset id
Save copyBake a new asset with fresh ids (for variants you want to keep side by side)
Reveal in LibraryJump 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

Import the source

Use Add → Sounds to import a raw recording or downloaded SFX.

Open Sound Canvas

Switch to the Sound workspace. Click + Sample or drag the clip from the library onto the board.

Trim and fade

Splice a Trim node after Sample to cut leading/trailing silence. Add Fade with a short fade-out so the tail does not click.

Normalize

Add Normalize before Preview/Save so repeated playback stays at a consistent loudness (for example peak -1 dB).

Preview, name, save

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:

text
Sample (impact) ──→ Mix A
Sample (noise)  ──→ Mix B ──→ Normalize ──→ Preview + Save
  1. 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.
  2. On Mix, set per-layer Gain, Pan, and Offset so the layers land where you want (for example noise slightly after the impact).
  3. Tune Normalize so the combined peak is near -1 dB.
  4. Preview, then save as one WAV (for example sfx_heavy_hit).

Tutorial: Bake A Retro UI Blip

  1. Right-click the board → + Quick synth.
  2. On Tone, choose the Blip preset (or Power-up for a longer reward sound).
  3. Optional: add Lo-fi or Echo before Preview for character.
  4. 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

  1. Right-click the board → + Mic capture.
  2. On the Mic card, click Record, perform the take, then click Stop.
  3. Opal saves the recording to the library and wires it into the Mic node.
  4. Set Trim start/end to drop silence. Adjust Normalize peak if needed.
  5. 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):

  1. Build your pipeline up to a single output clip.
  2. Insert Variation before Preview and Save.
  3. Set Takes, Pitch cents, Gain dB, and Seed on the Variation node.
  4. Use Preview's Take selector to audition each variant.
  5. 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:

  1. Reveal in Library from the Save card, or find the WAV in the Audio folder.
  2. In Object Flow, add Play audio and point the clip field at your baked asset.
  3. For scene-wide music, use scene audio settings or Scene Flow — see Audio and VFX.

Example pickup graph:

text
Coin / On Tap
  -> Add variable score +1
  -> Play audio sfx_coin_pickup
  -> Destroy

The 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:

text
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:

WeakBetter
Soundsfx_coin_pickup
Tonesfx_ui_confirm
Recordingsfx_door_creak
new sound copysfx_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

ProblemFirst checks
Preview is silentWire 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 disabledThe 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 SampleThe source file was deleted or renamed outside the library — re-pick the clip
Saved sound did not change in Play modeSave (overwrite) on the same asset id, then play-test again — re-bakes invalidate the runtime decode cache
Mic Record failsAllow microphone permission in the browser; use Add → Sounds as a fallback import path
Clip is clipped or too quietAdd or retune Normalize; check Gain on Mix layers
Render warning / very long clipPipelines cap at two minutes — shorten sources or trim earlier

Opal Engine — MIT licensed