VOLTAlearn

Learn Volta / Mix & finish

Bounce & resample

Turn generated sound into reusable audio material.

lesson 27 of 39 · about 10 minutes

Open this lesson in the workbench →

Everything you have written so far is live — a graph the engine evaluates every block. Resampling breaks that loop: bounceOf renders a track offline at load time straight into the sample bank, and the binding becomes a bank handle. The render stops being an output and starts being material.

gen1 = bounceOf 4c (play stab line |> reverb 0.7 0.5) prints four cycles of a track with its effect chain into the bank. That is the whole point: the reverb tails and the compressor's squash are baked into the material rather than applied on top of it. The length is grid-exact — exactly Nc of transport, no release tail — so a later chop N divides the buffer evenly.

The binding's type is Str: it is the handle. sample gen1 plays it back anywhere a sample source goes, and every sample verb then applies — chop, chopAt, speed, stretch, granular, pitched. sample gen1 |> speed (const 1.5) |> chop 16 with a numeric pattern picking slices is the entire vocal-chop school in two lines.

The move a live graph cannot make: print a hit through a long plate, then play the print inside a patch whose ampEnv is snappy. A tail that was seconds long becomes a 140 ms body carrying a reverb's spectrum — the bloom is audio now, so a new envelope simply cuts it.

bouncesOf n dur f seed chains real renders — generation k is f applied to generation k−1's handle, up to 64 deep — and sampleAt names idx picks which generation a note plays, read once per trigger. A macro in that slot is a "how many passes" knob that is not a simulation of anything.

Bakes are deterministic (offline path, coordinate-addressed RNG), macros bake at their initial values, and a bounce that transitively samples its own output is a compile error rather than a hang. A tap inside a bounced track bakes as silence and warns.

The starting point#

The lesson opens with this song in the editor. Every edit recompiles and plays.

-- Bounce & resample: a stab, played live, with nowhere to go.
tempo = 140bpm

stab = patch {
  source = square (freq pitch) |> drive 0.3,
  ampEnv = adsr 3ms 180ms 0.2 120ms,
  cutoff = 2400Hz,
  gain   = vel * 0.5
}

stabLine = !"e2 ~ ~ e2 ~ g2 ~ ~"
dry      = play stab stabLine |> reverb 0.6 0.45

What to watch#

Compare the live stab and its print on the scope: the live one is a clean decay, the print carries the reverb's whole tail as part of the waveform. Then re-envelope it and watch that same tail get cut off mid-bloom — the spectrum stays reverb-coloured while the shape becomes a snare.

Goals#

The workbench checks these as you work; the solution is there when you want it.

  1. Print a track with bounceOf
  2. Play the print back through a patch
  3. Slice the print and rearrange it
  4. Stretch: make the generations a knob

Make it yours#

Print the same four bars three times through three different chains — one crushed, one drenched in plate, one time-stretched — then build a single patch that plays all three from one sampleAt knob and automate that knob across a scene.

Further reading#

Resample your own sounds in the reference.