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.
- Print a track with bounceOf
- Play the print back through a patch
- Slice the print and rearrange it
- 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.