Sample — recorded one-shots & loops
A pitched sample player: picks a clip from the project sample pool, plays a window of it with linear interpolation, optional loop/reverse, and an attack/decay amp envelope. Use it for any recorded drum, vocal chop, found sound or loop.
How it works
slotselects a clip from the project-level sample pool. Becauseslotis a normal param it is p-lockable — you can play a different sample per step from one track.- Playback rate combines
tune(semitones) with the clip's source samplerate. Becausetuneis a normal param it is p-lockable, so you can shift the pitch per hit. start/enddefine the window (as fractions of the clip);reverseplays it backwards;looprepeats the window instead of stopping at the end.- A linear
attackramp then exponentialdecayshapes the level. The defaultdecay(8 s) is long enough to play most one-shots to their natural end. - Non-destructive edits reshape the clip without touching the stored audio, and being
normal params they are p-lockable like everything else:
normalizeapplies a make-up gain so the clip peaks at full scale;gainis a manual trim in dB;fadeIn/fadeOutramp the level over a fraction of the playback window. The fades follow the sample content, not the timeline — so a reversed hit still fades in at the clip's start, and a looped window fades cleanly on every lap. crushandsrrdegrade the sample source — bit-depth reduction and sample-rate reduction applied to the raw clip before the amp envelope. Because they sit before the envelope, the quantization grit is shaped by the hit's own decay, which is the classic "lo-fi sampler" sound. This is distinct from the shared voice chain'sfx_crush/fx_srr, which degrade the finished voice output after the envelope — reach for the chain ones for a more uniform, sustained crush.
Pitched: tune sets the playback pitch, and is p-lockable per hit like any parameter.
The decoded audio lives in the app/render layer and is surfaced to the core via `SampleStore`; the model only stores the file name per pool slot (the WAV bytes travel with the project's `.kpp` package). This engine just plays what the pool holds — getting a WAV *into* the pool is the UI workflow below.
Loading a WAV & assigning it to a track
A sample lives in the project sample pool (64 slots), and a track's
Sample machine plays whichever slot its slot param points at. So importing a drum is two
moves: get the WAV into a pool slot, then point a track at that slot. There are two entry
points.
From the SAMPLES page (manage the pool)
- Open the SAMPLES page — an 8×8 grid of pool slots over a waveform strip.
- Click Load WAV… (or click any empty slot) and pick e.g.
kick.wav. It decodes into the next free slot, which is then tinted and labelled with the file name. Only decodable.wavfiles are accepted. - Click a loaded slot to select it and preview its waveform.
- Click Assign to track… and choose a track. This switches that track's machine to
Sample and sets its
slotparam to the slot you picked — the track now plays your sample.
From the SOUND context (per track)
- Select the track and set its machine to Sample in the machine picker.
- A Load Sample button appears (it shows only for the Sample machine). Click it to
import a WAV straight into the selected sound's
slotin one step — no separate assign.
Either way you land in the same place: a track on the Sample machine with slot resolved to
your clip. From there, customise it with the parameters below.
Velocity layers & round-robin
The sampling machines (Sample and Granular) can pick which pool slot to play per trig from a small layer map, so one track can swap samples by how hard a step hits or cycle through variations. You draw it on the VELOCITY strip under the drum — velocity runs left (soft) to right (hard), and the layers appear as zones split by draggable dividers.
- Add / remove a split — right-click the strip; a new split re-spreads the boundaries evenly. Drag a divider to move a zone's upper velocity bound; bounds ascend and the top zone catches everything above the previous divider.
- Pick a zone's sample — click the zone and choose a pool slot.
- Mode — the chip on the strip cycles Velocity (loudness picks a zone), Round-robin (each hit advances to the next zone), or Velocity + RR (velocity picks a starting zone, then it rotates).
A per-step slot p-lock always overrides the layer map, so you can still force a
specific sample on a given step. The map is saved with the kit and is per-Sound, so it
travels with presets.
Slicing a break
A Sample reads its playback window from one of two places, and the WINDOW / SLICES pill in the corner of the sample card says which:
- WINDOW (default) — a free window between
startandend, dragged as the two handles on the waveform. - SLICES — the clip is chopped by a marker table, and
slicepicks which chop plays. The lit band is the slice you are on.
Click the pill to switch. In SLICES mode the markers are the control: double-click the wave to add one, drag it to move it, right-click it to delete it. The first marker is the fixed start and cannot be moved or removed. With no markers at all the whole clip is one slice.
For a whole break, the CHOP menu beside the pill does the table in one go:
- Detect transients — chops on the clip's own hits. Best on a break with clear attacks; on a smeared or heavily compressed loop it over- or under-chops, and you tune the result by dragging.
- Divide into 4 / 8 / 16 / 32 / 64 — equal chops, ignoring the audio. What you want for a loop that is already on the grid.
- Clear chops — back to one slice, the whole clip.
Both chop tools replace the table rather than adding to it, and each is a single undo.
The point of the mode is the p-lock. slice is an ordinary parameter, so p-lock it per
step to walk a break — step 1 plays chop 3, step 2 plays chop 7. window_mode is
p-lockable too, so a single step can drop back to the whole break while its neighbours play
individual chops.
The marker table belongs to the pool slot, not the sound: chop a break once and every sound pointing at that slot sees the same chops.
Parameters
| Param | Range | Default | What it does |
|---|---|---|---|
| `slot` | 0 … (pool size − 1) | 0 | Which sample to play (p-lockable; or chosen by velocity layers) |
| `tune` | −24 … +24 semitones | 0 | Pitch offset in semitones (p-lockable per hit) |
| `start` | 0 … 1 | 0 | Window start (fraction of the clip) |
| `end` | 0 … 1 | 1 | Window end (fraction of the clip) |
| `loop` | 0 … 1 | 0 | ≥ 0.5 loops start…end, else one-shot |
| `reverse` | 0 … 1 | 0 | ≥ 0.5 plays backwards |
| `attack` | 0 … 0.5 s | 0.001 | Amp-envelope attack |
| `decay` | 0.01 … 8 s | 8 | Amp-envelope decay (long = play to natural end) |
| `level` | 0 … 1 | 0.9 | Output gain |
| `crush` | 1 … 16 bits | 16 | Source bit-depth reduction (16 = off) |
| `srr` | 0 … 1 | 0 | Source sample-rate reduction (sample-and-hold; 0 = off) |
| `normalize` | 0 … 1 | 0 | ≥ 0.5 scales the clip to full scale (make-up = 1/peak) |
| `gain` | −24 … +24 dB | 0 | Manual gain trim (0 = unity) |
| `fadeIn` | 0 … 1 | 0 | Fade-in length, as a fraction of the window (0 = none) |
| `fadeOut` | 0 … 1 | 0 | Fade-out length, as a fraction of the window (0 = none) |
| `lp` | 200 … 20000 Hz | 20000 | Tone: one-pole low-pass (≈20 k = off) |
| `slice` | 0 … 63 | 0 | Which chop plays in SLICES mode (p-lockable — this is how you walk a break) |
| `window_mode` | 0 … 1 | 0 | ≥ 0.5 reads the slice table; below, the `start`/`end` window. Set by the WINDOW/SLICES pill |
Plus the shared voice chain — handy for filtering or re-shaping the transient of a recorded hit.
Design recipes
- Plain one-shot — defaults; just set
slot. - Chopped break — switch the pill to SLICES, chop the break with markers, then
p-lock
sliceper step to walk through the loop. Often pair withloopoff. - Retuned bass/stab from a sample — set
tunefor the octave you want, and p-locktuneper hit for a moving line. - Reverse cymbal / riser —
reverseon, long clip,attackup for a swell. - Gated stab — short
decayto chop a long sample into a tight hit. - Tonal loop —
loopon with a tightstart/endwindow for a sustained texture. - Lo-fi / crunchy break — drop
crushto ~6–8 bits and add a littlesrrfor a dusty, down-sampled character baked into the hit; layer the chainflt_cutoffto roll off the top. - Clean up a raw recording — turn
normalizeon to lift a quiet clip to full scale, trim withgain, and dial a shortfadeIn/fadeOutto kill clicks at the window edges.
Notes & limits
- Stereo playback with linear interpolation: a stereo clip keeps its left/right image, and a
mono clip plays centred. The track
panthen acts as a balance across that image. - The window is resolved on the first render after a trigger, so per-step
start/end/slot/reversep-locks take effect from that hit.