MOTEBOX
granular sampler — user's manual
Motebox is a granular sampler that runs in your web browser. It takes any recording and turns it into clouds of tiny overlapping fragments — grains — that you can stretch, freeze, scatter, and pitch in real time. It is designed to be fed lo-fi analogue sources (tape echo, valve amps, vinyl) and to keep their character intact.
motebox.agoracle.io — nothing to install; Safari and Chrome on macOS.Quick start
- Open the site.
- Drop an audio file (WAV, MP3, M4A) anywhere on the page.
- Drag on the waveform — the grain cloud starts and follows your pointer.
- Press space to freeze the moment you like.
- Click capture output to record what you hear; stopping it downloads a WAV.
Thirty seconds of theory
A granulator doesn't play your recording from start to finish. Instead it fires a rapid stream of tiny snippets — grains — drawn from one spot in the recording. Each grain is smoothly faded in and out so there are no clicks. Position chooses the spot, density sets how many grains fire per second, grain size sets how long each one lasts, and everything else adds controlled randomness. Enough overlapping grains and a fraction of a second of audio becomes a sustained, evolving texture.
The waveform display
The big panel at the top is the instrument's main playing surface.
- The amber band shows where grains are being drawn from; the bright line inside it is the exact position. (With streams on, this is the selected stream — the other enabled streams show as slim tinted lines elsewhere on the display; see Streams below.)
- Drag horizontally to move position. If the cloud isn't running, dragging starts it.
- While holding, drag vertically to widen or narrow the spray.
- Sparks flash where each grain reads the buffer — higher or lower on the display according to where it lands in the stereo field.
- ← → nudge position finely; shift + arrows nudge coarsely.
- ✕ clear (in the source panel) empties the display and unloads the current source.
Freeze
Freeze (the button, or spacebar) locks the position — drags and arrow keys are ignored while it's on, though spray stays live. It's how you turn a moment into an indefinitely sustained cloud: find the spot, freeze it, then shape the sound with the other controls. The band turns ice blue while frozen.
Scrolling
Scroll (the button, or S) walks the position through the recording on its own while it plays, so an evolving gesture doesn't have to be performed by hand. It's tuned for drift rather than playback: a full pass takes anywhere from fifteen seconds to fifteen minutes, and the default two minutes turns most source material into something that changes faster than you notice and more than you expect.
Set the pace with full sweep in the Playhead panel. Direction (D) flips which way it travels.
Bounce decides what happens at the ends. Left on, the playhead reflects and sweeps back, so the texture never breaks and you can leave it running indefinitely. Turned off, it wraps around to the other end instead — which is a real edit rather than a seam, and worth it when the recording's own shape is something you want to hear recur. Some material suits one, some the other.
Freeze still works while scrolling, and does what you'd hope: it holds the drift where it is. Unfreeze and it carries on. Dragging the waveform while it scrolls simply moves the playhead and lets it continue from there.
With streams on (see Streams below), scroll respects each stream's own drift toggle: a stream with drift off keeps sounding right where it is while the rest keep moving. With streams off there's only the one playhead, and scroll behaves exactly as described above.
Tempo sync
Set bpm by dragging it or by tapping — click tap tempo (or press T) a few times in rhythm and it settles on the tempo, ignoring one sloppy tap along the way. Pause for more than two and a half seconds and the next tap starts a fresh reading rather than blending with the old one.
Grain timing picks what the clock actually touches:
- free is the organic engine this instrument shipped with — density sets the grain rate, grain size sets each grain's length, and both wander under jitter. bpm has no effect here at all.
- grid locks grain onsets exactly to the chosen division — no jitter, so a dense cloud reads as a rhythmic pulse rather than a texture. Density is dimmed, since the division now sets the rate.
- notes also times onsets from the division, but keeps the onset jitter that free uses, and each grain lasts exactly one division long rather than following the grain size knob. Both density and grain size are dimmed. The result sits between the other two: tempo- locked, but still breathing.
Division sets the note value grid and notes lock to. A trailing dot means dotted — half as long again as the plain value — and a trailing T means triplet, a true third or sixth of a beat rather than a rounded approximation, so a long run at a fast tempo never drifts out of time.
Sync sweep to bars hands scrolling's full sweep to the clock instead of the knob: a full pass takes exactly the chosen number of bars of 4/4 at the current bpm. The full sweep knob in the Playhead panel is dimmed while this is on, since the bar count is what governs the pass instead.
Loudness is compensated automatically across all three timing modes, the same way it is for density and grain size in free mode, so switching modes changes rhythm and character rather than volume.
Controls
Grain
| control | range | what it does |
|---|---|---|
| grain size | 20–1000 ms | Length of each grain. Short is gritty and granular; long is smooth and overlapping. |
| density | 2–100 /s | Grains per second — sparse pointillism up to a dense pad. Loudness is automatically compensated as grains stack up. |
| envelope shape | percussive – Hann – swell | The shape of each individual grain's fade in and out, and the biggest single lever on character here. At Hann (the centre) each mote fades in and out evenly — smooth and textural. Toward percussive the attack becomes instant and the decay long, so each mote reads as a tick or a pluck and dense clouds turn pointillist. Toward swell each mote fades in slowly and cuts off, which erases the source's transients and makes clouds breathy and smeared. Same sample, same density, completely different instrument. It does not change loudness at any setting. |
| shape scatter | 0–100 % | Spreads the envelope shape randomly per grain, the way pitch scatter does for pitch. At 0 every grain shares one shape. Raise it and some motes pluck while others swell at the same time, which makes a cloud sound internally varied rather than uniform. At the extremes of envelope shape scatter can only pull back toward the centre, so it has less effect there. |
| grain filter | off / lowpass / bandpass | Runs each grain through its own filter before the envelope shapes it. Off is the plain engine — no filtering at all, not a filter left neutral. Lowpass gives each mote its own brightness; bandpass narrows that to a resonant band, so at tighter settings each mote can ring like its own small pitched chime rather than simply brightening or dulling. |
| grain cutoff | 100 Hz–16 kHz | The filter's frequency — cutoff for lowpass, centre frequency for bandpass. Has no effect while grain filter is off. |
| cutoff scatter | 0–±4 oct | Spreads each grain's cutoff randomly around the knob. Measured in octaves rather than Hz so the spread feels even across the whole range instead of bunching at one end: some motes dark, some bright, and in bandpass each finds its own chime. |
| grain resonance | 0–100 % | Sharpness, shared by both filter types: smooth through to squelchy for lowpass, a broad tint through to a narrow ring for bandpass. Loudness is compensated automatically, so these four controls change colour rather than level, and all four travel in presets. |
Playhead
| control | range | what it does |
|---|---|---|
| position | 0–100 % | Where in the recording grains are drawn from. |
| spray | 0–500 ms | Random scatter around the position. Small values shimmer; large values smear a whole region into a wash. |
| full sweep | 15 s–15 min | How long one complete pass through the recording takes. This is a duration, not a speed — bigger means slower. |
| bounce at ends | on/off | On, the playhead reflects at each end and sweeps back, so the texture is continuous. Off, it wraps around to the other end. |
Tempo
| control | range | what it does |
|---|---|---|
| bpm | 40–200 | The clock everything else here reads from. Has no effect on grain timing while grain timing is free — but still drives the sweep speed whenever sync sweep to bars is on, regardless of grain timing. |
| tap tempo | T | Tap a few times in rhythm to set bpm by ear rather than by dragging. A gap of more than 2.5 s starts a fresh reading. |
| grain timing | free / grid / notes | Free is the shipped engine — density and grain size govern rate and length, both with jitter, bpm ignored. Grid locks onsets exactly to the division with no jitter, for a rigid pulse; density is dimmed. Notes locks onsets to the division too but keeps the jitter, and each grain lasts exactly one division; density and grain size are both dimmed. |
| division | 1/4 – 1/32 | The note value grid and notes lock onsets (and, for notes, grain length) to. A trailing dot is dotted — half as long again; a trailing T is a triplet, an exact third or sixth of a beat rather than a rounded value. |
| sync sweep to bars | on/off | Hands scrolling's full sweep to the clock: a pass takes exactly bars bars of 4/4 at the current bpm. Dims the full sweep knob in the Playhead panel while on. |
| bars | 1/2/4/8/16 | Length of the bar-synced sweep. Has no effect unless sync sweep to bars is on. |
Pitch & voices
| control | range | what it does |
|---|---|---|
| pitch | ±12 st | Transposes every grain, up to an octave either way. |
| pitch scatter | 0–±7 st | Random per-grain detune. With quantise on, scattered grains land on exact semitones — instant harmonic clouds. |
| quantise | on/off | Rounds all pitch (including scatter) to whole semitones. |
| reverse chance | 0–100 % | Probability that any given grain plays backwards. Nothing to do with scroll direction — this reverses individual grains, not the playhead. |
| voices | on/off | Held keys own the sound — see the Voices chapter below. |
| release | 50 ms–8 s | How long a voice fades after its key is released — see the Voices chapter below. |
Output
| control | range | what it does |
|---|---|---|
| stereo spread | 0–100 % | How widely grains are panned at random across the stereo field. |
| lowpass + resonance | 40 Hz–20 kHz | Tames digital sheen or hollows the cloud out from above. Resonance adds a peak at the cutoff. |
| highpass | 20 Hz–2 kHz | Thins the cloud from below. At its floor it does nothing; raise it to clear out rumble, or a long way to leave only the top of the texture. Pairs with the lowpass to leave a narrow band. |
| master | 0–100 % | Output level. |
| limiter | on/off | A safety net that catches grain pile-ups, and also an effect. Switching it off gives you the cloud's true dynamics — and its true peaks. High density with long grains can clip hard and suddenly with it off, especially with drive up, so turn master down before you experiment. Once you know where the level sits, toggling it against a deliberately overloaded cloud is worth playing with: the cloud snaps between crushed and open, which is a gesture rather than a setting. L toggles it, so you can play it with one hand while the other is on the waveform. |
Effects
| control | range | what it does |
|---|---|---|
| drive | 0–100 % | Saturation across the whole cloud, before the filters, so the filters can tame what it creates. It fuses separate grains into one texture rather than dirtying each grain individually. Level is compensated automatically, so turning it up changes the character without simply making things louder. |
| reverb size | 0.3–8 s | How long the tail takes to decay. Shown as a duration because that is what you judge by ear. It is fully live — sweep it while playing. |
| reverb damping | 500 Hz–16 kHz | How quickly the high frequencies disappear from the tail. Low values give a dark, distant room; high values a bright one. |
| reverb mix | 0–100 % | Dry against wet. At 0 the reverb is silent. At 100 you hear only the tail, which on a granular cloud is a legitimate drone rather than a mistake. |
The reverb is true stereo, so the width you set with stereo spread survives into the tail. There is no delay here on purpose — the Copicat is the delay.
Recording from a mic or interface
- Click enable input and grant microphone permission.
- Pick your device (e.g. an audio interface) from the dropdown that appears — the choice is remembered for the session.
- Watch the level meter and set gain on the interface — it turns red when you're clipping.
- Click record — up to 60 seconds. When you stop, the recording immediately becomes the source, ready to granulate.
- Click input on again to turn the input off and release the device. A recording in progress is stopped and kept, and the rolling tape — which can't run without the mic — comes down first, capturing as it always does.
- While recording, the incoming signal draws live across the main display — the full width represents the 60-second budget.
- The mono checkbox folds the input to mono and ignores a silent channel — leave it on when recording one input of a stereo interface.
- The browser's "helpful" processing (echo cancellation, noise suppression, auto-gain) is disabled automatically, so line-level signals arrive untouched.
- Mic input needs a secure connection: the hosted site qualifies; if running locally, serve via
python3 -m http.serverand use the localhost address.
Capturing and exporting
Click capture output and play; click stop & export and a 16-bit WAV of everything you heard downloads. Use capture as source loads that capture straight back in as the new source — the feedback workflow: granulate → capture → re-granulate, no files needed in between.
Presets
A preset stores the settings — grain, motion, pitch, output and effects — and nothing else. It deliberately leaves out position, spray, master and the limiter, so recalling one never drags the playhead somewhere else, changes how loud you are, or switches off your safety net. What you get back is a character you can drop onto whatever you happen to be granulating.
Save current names a preset and keeps it in this browser. Recall applies the selected one.
Compare (C) is the one worth knowing. It flips between the selected preset and whatever you currently have dialled in, without losing either, so you can keep tweaking and check whether you've genuinely improved things or just changed them. Press it again to come back. Level is excluded from presets partly for this reason: comparing two versions at different volumes tells you which is louder, not which is better.
Copy link puts a shareable URL on your clipboard. The settings travel in the link itself — there's no server involved, and nothing is uploaded. The recording doesn't travel with it, since a link can't carry audio, so whoever opens it hears those settings applied to their own material. Opening a link loads the settings straight away; save it if you want to keep it.
Presets live in this browser's storage on this machine. Clearing site data clears them, so use a link for anything you'd be sorry to lose.
MIDI CC control
Motebox listens for MIDI CC messages, so a hardware controller — knobs, sliders, buttons, a footswitch — can drive its controls directly. This needs Chrome. Safari has no Web MIDI support, and the MIDI panel says so rather than pretending; everything else in the instrument works exactly the same without it, since MIDI is an additional way in, never the only one.
Click enable MIDI and grant permission when the browser asks. Once granted, it reconnects quietly on later visits — no repeat prompt.
Learn
Click learn, wiggle the hardware control you want to bind, then click the name of the parameter you want it to drive — or the freeze or scroll button, for those two. The wiggle has to come first: clicking a bindable control while learn is armed but nothing has moved yet is held, with a "wiggle a knob first" hint, rather than binding or operating it, so an old, unrelated CC message can't sneak in and bind itself and a stray click can't work the control either. Learn gives up after 20 seconds if left armed.
Binding a control that's already in use displaces the old binding rather than doubling up on it — and always says what it displaced, whichever way the collision runs: handing a knob to a new target steals it from whatever it drove before, and handing a target a new knob steals the target away from whatever CC drove it before. Either way you're told, never left to discover it by surprise.
Continuous parameter rows and on/off switches can be learned; segmented controls like envelope shape's filter type, sync mode and division can't — those are set-and-forget, not something you'd ride with a knob.
The cc tags
A bound control grows a small tag beside its name showing its channel and CC number. Amber means waiting; green means live — and the rule for the difference is one sentence: a knob bites when it sweeps past the current value. That's pickup: nothing lurches the instant you bind a knob or recall a preset that has since moved the parameter elsewhere. Turn the hardware knob until the tag goes green, and from that point it tracks exactly.
Toggles and the transport
On/off controls (bounce at ends, sync sweep to bars, quantise, the limiter) and the two transport actions — freeze and scroll — bind the same way: pressing a button flips the switch, and releasing it does nothing. Each press flips it again, even from a button whose only signal is a repeated 127 with nothing lower in between. That works identically whether the hardware sends a single 127 from a button, a momentary pulse from a footswitch, or a sustained value from a latching pedal. Freeze on a footswitch is worth trying first — hands-free freeze, while both hands stay on an instrument or the waveform, is the single most useful mapping for playing live.
Named mappings
Whatever you've bound is always live and remembered between visits, the same way a working preset survives a reload. Save mapping… keeps a named copy of the current bindings — one per controller, or one per way of playing — and the dropdown beside it loads or deletes them. Mappings are device wiring, not sound: they never travel inside a preset or a shared link, and recalling a preset never touches a binding. Move a parameter by loading a preset and any bound knob just goes amber and waits for you to catch up to it — presets and hardware compose through the same pickup rule as everything else.
Voices
Turn on voices (the checkbox, or V) and the instrument changes what it is: the free-running cloud goes silent, and the keyboard owns the sound instead. Nothing plays until you hold a key — a key is a cloud at that pitch, a chord is several clouds at once, and letting go fades that one out. Turn voices back off and the drone engine returns exactly as it was; nothing about the free-running instrument changes underneath it.
Sources: a MIDI keyboard or guitar-to-MIDI rig (MIDI Guitar 3 works as-is, in its MIDI 1.0 Legacy mode, on any channel), and a QWERTY fallback that needs nothing plugged in — Safari gets the whole feature this way, since Safari has no Web MIDI. Every source drives the same two entry points, so nothing about the rest of the instrument needs to know or care which one is playing.
The QWERTY row
The classic soft-synth layout — white keys on the home row, black keys above:
| key | note | |
|---|---|---|
| A | C | |
| W | C♯ | |
| S | D | |
| E | D♯ | |
| D | E | |
| F | F | |
| T | F♯ | |
| G | G | |
| Y | G♯ | |
| H | A | |
| U | A♯ | |
| J | B | |
| K | C (octave up) |
Z / X shift the whole row down or up an octave (five octaves of range in total). Holding a key holds the note; key-repeat is ignored, so a held key doesn't retrigger. Switch windows or tabs mid-chord and every held note releases cleanly rather than droning on unheard.
While voices is on, S, D and T play their notes instead of their usual jobs — toggling scroll, flipping direction, and tapping tempo all become mouse-and-MIDI-only for as long as voices stays on. This is deliberate: a mode where pressing a note also toggled the scroll would be worse than reaching for the mouse. Turn voices off and all three shortcuts come back exactly as before. Every other shortcut — space, L, C, V — keeps working throughout; Z and X are the octave keys, not notes.
Release, velocity and what's sounding
The release knob (50 ms – 8 s) sets how long a cloud takes to fade after you let go of its key — short for something percussive, long for chords that overlap into each other on the way out. A MIDI keyboard's velocity scales how loud each note's cloud comes in, so picking or playing dynamics carry through; QWERTY always plays at a fixed, moderate velocity, since a computer key has no dynamics of its own to send.
A quiet line under the voices controls names what's currently sounding — C4 E4 G4 for a held C major triad — with releasing notes shown dimmed until they finish fading. It's the voices equivalent of the grain sparks: confirmation that a chord from the guitar is landing as played, and a plain-language way to learn the QWERTY layout without looking it up.
Everything else about the instrument composes with voices exactly as before: position, spray, freeze, scroll, tempo sync and the whole output chain are shared across every held note, since all voices are drawing from the same waveform and the same place in it. Grid-mode tempo sync with a held chord turns the instrument into a free arpeggiator worth trying on its own.
Streams
Turn on streams (the checkbox in the Streams panel) and the single playhead becomes four. Each is its own position in the same recording, so instead of one grain cloud you get up to four, layering the recording against itself from different moments at once — a held chord's worth of where, built from one source rather than four. Turn streams back off and the instrument is exactly the single-playhead engine it always was; nothing about that path changes underneath it.
Selecting and moving a stream
1–4 select which stream the waveform display, the arrow keys and dragging all act on — the selected one is drawn with its own tint and a full amber-style band, the way the single playhead always was. The other enabled streams show as slim tinted lines only, so the display doesn't turn into four overlapping regions. Stream 1 is always on and can't be switched off — it's the playhead the instrument shipped with, so stream 1 is always dealt grains and streams mode can never silence the instrument by itself. Streams 2–4 each get their own on/off checkbox in the panel; switching one on drops it into the mix at its current position, switching it off parks it — its grains stop, its position holds, ready to rejoin exactly where it left off.
Levels and what travels
Each stream has its own level fader, 0–100 %, so you can balance four moments against each other — one loud and driving the texture, another a quiet shadow underneath. A stream's enable, level and drift (see below) are settings and travel in presets and shared links, the same as any other character. Its position does not — exactly like the single playhead's position, streams 2–4 stay under the hand, so recalling a preset or opening a link never yanks any of them somewhere else.
Scroll, freeze and direction
Turn scroll on with streams active and every enabled stream with its drift checkbox on drifts — each reflects off the ends of the recording independently, so the positions shear apart and drift back together rather than moving in lockstep. Each stream, including stream 1, has its own drift toggle (on by default): turn a stream's drift off and it keeps sounding — still dealt grains, still audible — but its position holds exactly where it is while the others carry on drifting. That's different from disabling a stream, which stops it sounding altogether; drift only controls whether it moves. The driving case is a live tape stream parked at the playing edge while sample streams drift through their own material underneath it. A disabled stream simply holds regardless of its drift setting; turning it back on picks up scrolling from wherever it was parked, if its drift is still on. Freeze stops the whole formation at once, exactly as it always stopped the single playhead — there's no separate freeze behaviour for streams to learn. D flips direction for whichever stream is currently selected, rather than the instrument's scroll direction as a whole, so you can send one stream drifting one way and another the opposite way across the same recording (flip with D — while voices mode is on, D plays its note instead, so set directions before switching voices on).
Composing with voices, and Safari
Streams and voices stack: with both on, a held chord spreads across the enabled streams as well as across pitches, so a single chord can draw from several moments in the recording at once rather than one. Everything else — spray, envelope shape, filter, tempo sync, the whole output chain — is shared across every stream, the same way it's shared across every voice. Streams needs nothing beyond the keyboard and mouse this manual already covers, so it works identically in Safari, with no MIDI required.
Four samples, not four positions in one
Each stream also has its own source selector, choosing which of up to four loaded recordings that stream reads — so streams stops being four positions in one file and becomes a small rack: up to four samples loaded at once, any stream able to point at any of them. Point every selector at sample 1 and you get exactly the streams behaviour above; point them at different samples and you can layer up to four different sources into one cloud, or keep several sounds loaded side by side and swap a selector to change what a stream is playing without touching anything else. Loading a file or recording lands in whichever sample the currently selected stream points at — select the stream first, then load or record, the same way selecting a stream already governs the waveform display and dragging.
The selector's fifth option is the rolling tape itself (see Rolling tape below) — point a stream at it and that stream granulates live input instead of a loaded recording, while the other streams carry on granulating whatever samples they point at. Two streams can both point at the tape at once, each sitting at its own distance behind "now" — live playing layered against itself, or against the loaded material, in one cloud. A stream pointed at the tape is silent, honestly, until the rolling tape is actually switched on — same as a stream pointed at an empty sample slot. Its position means something different too: a delay behind the write head rather than a place in a recording, exactly as position works for the tape itself; see Position becomes a delay, under Rolling tape below, for what that means for dragging, scrolling and the window.
With streams on, the waveform area shows one lane per enabled stream, stacked, each with its own recording, position and grain-source region in that stream's tint. The selected lane stands out with a tinted border; the others sit dimmed. Click a lane to select that stream — the same selection 1–4 sets — and dragging in a lane moves that stream's position exactly as dragging the single waveform always did. A stream pointing at an empty sample shows its lane as empty, reading "empty — select this stream and load or record," and is dealt no grains until something is loaded there; it costs nothing while silent. A stream pointing at the tape gets a tape lane instead — the same scrolling tape view the full-width display shows when streams are off, sized to the lane, with its own head marker and its own sparks landing behind the write head — or, if the tape isn't rolling yet, an empty lane reading "tape not rolling." Turn streams off and you're back to the one waveform, exactly as before.
Four samples of up to a minute each is a few hundred megabytes of browser memory — fine on a desktop.
Rolling tape
Turn on rolling tape (the checkbox) and Motebox granulates what you are playing, while you are playing it: live input writes continuously onto a tape and the granulator reads just behind the write head — structurally a Copicat tape loop, a record head with playback heads close behind. There is no separate record button to press first and no take to go back to afterwards; the notes leaving your hands are the material. Behind that live edge the tape holds up to a minute, so a phrase from earlier in the take is still there to drag back into. Turning it back off doesn't discard the take — it pulls the tape out of the machine: whatever the window currently holds becomes an ordinary recording, loaded exactly the way stopping a normal recording loads one. With streams off, that lands in the one sample slot, exactly as it always did. With streams on, it lands in whichever sample slot no stream currently points at, so stopping the tape never replaces material something else is playing — only if every slot is already spoken for does it fall back to overwriting the currently selected stream's slot, same as loading a file there would. Either way, every stream that was pointed at the tape switches to the new recording automatically and lands at the equivalent place in it — still that many seconds behind the end of the take it was just sitting behind "now" — so the texture carries straight on rather than dropping out the moment you stop rolling. If nothing was actually written to the tape (you switched it on and off again with no input), nothing is captured or overwritten; any stream still pointed at the tape simply switches to whichever slot it would have received. Loading a file or starting a fresh recording is a different gesture, not a version of switching rolling off: it always stops the rolling tape, the same as it always has, and whatever the tape was holding is discarded rather than captured — the file or take you're loading in is the new source, so there is nothing to carry forward. If the currently selected stream points at the tape, it switches to the new recording, landing at the same position fraction it was already at rather than an equivalent place in it. Any other stream still pointed at the tape goes quiet — its selector doesn't change, but there's no longer a rolling tape underneath it to read — until you switch rolling back on or point that stream somewhere else yourself.
Rolling needs live input, so turning it on will ask for microphone permission the same way enable input does, if you haven't granted it already. If permission isn't granted, the toggle switches itself back off with a message rather than pretending to roll a tape nothing is feeding.
Position becomes a delay
Position keeps its 0–100% range, but means something different here: instead of a place in a fixed recording, it's how many seconds behind "now" the playhead sits — 100% is the freshest audio just written, 0% is the far edge of the window. Turning rolling on starts the head at 100%, as close behind "now" as a grain can read — the live-performance position; drag left to reach into the past. A parked head stays that many seconds behind while everything streams past it, so with streams on, any stream whose source selector points at the tape becomes an echo tap sitting at its own fixed delay rather than a fixed place — pointing a stream's selector at the tape while rolling is already on snaps it straight to "now," the same live-performance default, rather than picking up wherever its fraction last sat. Streams reading a loaded sample are unaffected — their position stays a place in that recording, exactly as always.
The halo fader adds a steady shimmer of very short grains read as close behind “now” as the tape allows — the live edge of your playing, always present under the cloud. It is how the instrument feels immediate while the main grains stay long and lush: the halo answers within a few hundredths of a second, the cloud blooms behind it. A soft glow at the right-hand edge of the tape shows the halo is listening. With regen up, the halo feeds the loop like everything else you hear — the tape-echo sound-on-sound effect, tamed by the tape’s own saturation.
For live playing, Chrome is the preferred browser. The tape works fully in both browsers, but the tightest path from your instrument to the grains rides on an audio engine feature (AudioWorklet capture) that Chrome runs unconditionally; where Safari declines it, Motebox deliberately falls back to an older, always-safe capture route that sits roughly a tenth of a second further behind “now” — and Safari’s own audio plumbing carries a little more latency besides. Everything sounds the same; Chrome simply answers your hands sooner.
Scrolling and freeze work exactly as they do on a fixed recording, just measured against this window instead: freeze stops the write head as well as the read heads, so the whole tape — the window's content, not just the position within it — holds still until you unfreeze, and audio played while frozen is never written to the tape at all.
Window and regen
| control | range | what it does |
|---|---|---|
| window | 5–60 s | How much tape sits behind the live edge. Changing it while rolling keeps every head's delay in seconds, not its position, so shrinking the window can pull a head that's now too deep back to the new full depth, and growing it never moves a head that already fit. |
| regen | 0–125 % | Feeds the output back onto the tape — a swell knob, the Copicat's own trick. Past 100% it doesn't run away: the tape itself soft-saturates, so the feedback builds, sustains at a loud but bounded ceiling, and always recovers, because a fresh pass of input is always coming — nothing here can trap and loop forever the way the reverb once could. |
The window starts silent on a fresh roll and audibly fills up over the first pass — a head sitting deep in the window reads silence until the tape has actually rolled that far back. That's honest tape behaviour, not a bug to route around.
Keyboard reference
| key | action | |
|---|---|---|
| space | Toggle freeze | |
| ← → | Nudge position | |
| shift + ← → | Nudge position coarsely | |
| S | Toggle scrolling (plays a note instead while voices is on) | |
| D | Flip scroll direction, or the selected stream's direction while streams is on (plays a note instead while voices is on) | |
| C | Compare against the selected preset | |
| L | Toggle the limiter | |
| T | Tap tempo (plays a note instead while voices is on) | |
| V | Toggle voices mode | |
| A W S E D F T G Y H U J K | Play notes, while voices is on | |
| Z / X | QWERTY octave down / up, while voices is on | |
| 1 2 3 4 | Select a stream, while streams is on |
Tips
- Feed it character. Tape echo tails, room recordings, vinyl surface — the engine preserves grain and hiss rather than cleaning it up.
- Sustained textures: freeze, then small spray, long grain size, high density. A fraction of a second becomes a pad.
- Harmonic clouds: quantise on, pitch scatter up to ±7, medium density.
- Broken tape: reverse chance around 50 % with a little pitch scatter.
- Spectral crunch: tiny grains (20–40 ms) at high density.
- Leave it running: scroll on, bounce on, a long sweep and a generous grain size. It will keep moving through the material for as long as you let it without ever reaching an end — good for recording a long take and keeping the interesting minute.
- Freeze while scrolling to catch something as it drifts past. Unfreeze and it picks up where it left off, so you can pin a moment without losing the thread.
- Keep echo outside the box: there is drive, filtering and reverb in here, but deliberately no delay — send the output through your own, then record the result back in through the input and granulate it again.
Troubleshooting
- No sound? Browsers require a click or keypress before audio can start — click the waveform or the start button.
- Position won't move? You're frozen — press space.
- Input won't enable locally? Mic access needs HTTPS or localhost — use the hosted site, or
python3 -m http.serverlocally. - Distortion at extreme settings? That's the safety limiter working hard — back off master or density.