clip player
clipplayer · modulationCLIP PLAYER — an Ableton-Session-style clip launcher with 8 INSTRUMENT LANES. Rotates Ableton's layout 90° to sit on a wide monome grid: ROWS = 8 instruments (lanes), COLUMNS = 8 clip slots per instrument (64 note clips total). Each lane plays its launched clip out its OWN pitch/gate/velocity outputs, so up to 8 clips sound at once — one per instrument (the owner model: "each row reflects a given instrument's materials"). It is a companion to a monome grid 128 controller AND to a one- or two-unit Novation Launchpad Mini Mk3 (both browser-native — WebSerial for the grid, WebMIDI for the Launchpad, no native helper — see lib/control/monome + lib/control/launchpad) but is fully usable from the card alone. CLOCK: LOCKED TO TIMELORDE (the rack transport) — no internal BPM, no clock cable. It runs only while TIMELORDE.running, at TIMELORDE.bpm, and freezes when it stops (free-runs if no TIMELORDE is in the rack). The only timing control is STEP (1/4 · 1/8 · 1/16 (default) · 1/32 = steps-per-beat). The card's ▶/■ transport writes TIMELORDE.running, and HIDES itself when TIMELORDE is slaved to an external clock (MIDICLOCK → start_in/stop_in). LAUNCH: clicking a clip queues it; with QNT on (default) it takes over on that lane's next loop boundary (off = immediately). Each lane queues independently, so a whole new arrangement can drop in on the bar line. A "scene" is a COLUMN — firing it launches one clip per instrument together. The per-lane playing/queued set syncs over the Y.Doc so collaborators (and a second grid) see the same session; grid LED + serial I/O stay per-user local. CLIPS are tiny note/step patterns (default 16 steps, up to 128 — set non-destructively, so notes past a shortened length are kept and replay when you lengthen again): polyphonic (chords fan out across the lane's poly pitch/gate pairs), per-note length (held gates), per-note velocity (drives the lane's vel CV), per-note probability, and scale-aware (major/minor/pentatonic/chromatic). Clips may be DIFFERENT lengths per lane; lanes free-run as a POLYMETER and all re-align to step 0 on the TIMELORDE transport downbeat (a fresh ▶ is always phase-locked). CARD: a SESSION view (8×8 launch grid, lane-tinted; single-click = launch/queue, click the playing cell = stop, DOUBLE-CLICK = open the clip's editor) and an EDIT view (a piano-roll note editor — X = step, Y = pitch in-key; click a cell to place/remove a note, right-click to cycle its velocity through 6 levels (≈0/20/40/60/80/100%), with scale/root/length controls, per-lane MONO/POLY, ROW/OCT pitch-window scroll + a TIMELORDE-locked playhead). GRID (16×8): left 8×8 = clip matrix, right control strip = per-lane STOP + SCENE launch + COPY/PASTE/PASTE-REVERSE (held modifiers: hold COPY/PASTE/PASTE-REV + tap a clip to copy it to / paste it from a per-machine buffer; PASTE-REV pastes a time-reversed copy) + STOP-ALL + TRANSPORT; HOLD the EDIT pad + tap a clip to turn the whole grid into that clip's note editor. The on-grid note editor pages a clip in up to 8 pages of 16 steps — FOLLOW auto-scrolls the shown page with the playhead, tap it to FREEZE and page with LEFT/RIGHT; DOUBLE dups the first half into a doubled length; a dedicated 2-row LENGTH page sets the clip length (block ×16 then trim to the exact end step). LAUNCHPAD (Novation Launchpad Mini Mk3, one or two units over WebMIDI): the same clip matrix + note editor, plus a command deck exposing per-lane MONO / MUTE / clock-RATE / SWING / per-clip CLIP-DIV, a RESET pad, tempo nudge, and a KEYS isomorphic keyboard for live note entry + clip-record. Its scene-launch column is a SCROLLING window (shift-layer amber UP/DOWN) reaching up to 64 scene slots per lane — FIXED stride-64 clip storage means clips can live in scenes past the first 8 (older saves migrate once on load) — and a TYPED clipboard COPY/PASTEs whole SCENES (all 8 lanes at a slot, full-replace) as well as single clips: scene→scene and clip→clip apply, the cross-type pastes are no-ops with dimmed targets, and a scene paste is one undo step. SCENE REPEATS (Deluge-style): scenes loop forever by default (repeats = infinite), but HOLD GRID + HOLD a scene-launch button (position-relative through the scene scroll) to open the orange REPEAT-COUNT view — tap pad k to set k repeats (1–63; pad 64 = infinite; pads 1..N stay lit for count N, all 64 = infinite) — and after N passes of the scene's longest clip (frozen at launch) the player auto-launches the next content scene down through the normal quantized launch path, skipping empty rows and keeping the last content scene looping; manual launches always win (relaunching resets the count, an individual clip launch cancels it), muting never voids it, whole-scene COPY/PASTE carries the count with the scene, and the card shows a read-only "×N" flair (live "p/N" while counting) at the right of each scene row. PER-CLIP AUTOMATION (Deluge-like): right-click a MODULE'S CARD → "Assign to automation lane" (1–8; MODULE-level — one lane per module, re-assigning moves it; the assigned card gets a thin border in the lane's colour and the AUTO block shows per-lane assigned-module counts), then arm THAT LANE's teal ◉ (per-lane arm, under its channel column next to RATE; on a Launchpad, SHIFT+the lane's top-row button, lane 8 = double-tap SHIFT) — while a lane is armed and its note clip plays, TOUCHING any control of a module assigned to it (screen / MIDI / Electra — NEVER CV: automation records your hands, a CV cable is performance signal and is never captured) records by CONTINUOUS OVERDUB into the PLAYING clip's OWN automation (punch-in at that clip's next loop start; each clip in a lane carries its own envelopes, stored beside the notes so note edits never clobber them; only moved params are written, max 16 recorded controls per clip; touching an unassigned module's control records nothing — assignment is explicit; per-lane single-writer, so two collaborators can record two lanes at once). Launching a clip launches its envelopes with it (linked to the clip's length); the ENVELOPE BELONGS TO THE CLIP — copy/paste + scene-duplicate carry it (PASTE-REV time-reverses it), pasting over a clip replaces it, clearing/emptying a clip clears it, carriers show a teal dot on their cell, and if two lanes' clips automate the same control exactly ONE drives it (its module's assigned lane wins, else lowest). Deletion is explicit + undoable: right-click → "Clear recorded automation" (per control; distinct from the module menu's "Remove automation assignment", which only stops future recording) and the editor's CLR AUTO (per clip). Playback is transient on every peer and never rewrites the saved patch; grabbing an automated control suspends its automation until you physically release it, and the on-card override dot re-enables all. Two current limits: the on-card grid shows only the first 8 scenes (card scene-scroll is a follow-up), and the arranger records session launches of scenes 1–8 (scene 9+ arranger recording is a follow-up). Inputs — STOP ALL: a rising edge stops every lane (canonical windowed edge counter, no double-count). Outputs — PITCH 1-8: each lane's launched-clip pitch as a poly-capable V/oct cable (chords fill lanes), GATE 1-8: high while that lane's note sounds, VEL 1-8: that lane's per-note velocity as a 0..1 CV (patch into a VCA/ADSR amount). Params — STEP (steps per beat), OCT (octave transpose), GATE (per-step gate duty cycle), QNT (quantize launch to the loop boundary), S&H (ON by default). The upper-right S&H toggle bakes in a gate-sampled Sample & Hold across ALL 8 lanes at once — replacing the 8 external S&H modules a user otherwise needs: on a REST (empty step) the lane's gate still closes but its pitch CV HOLDS its last value instead of resetting to C4, so each lane's pitch latches to the gate edge. Turn S&H OFF for the legacy continuous behavior where rests rewrite pitch. SONG MODE (arranger): the header SES/ARR toggle flips between live SESSION play and ARRANGEMENT playback of a recorded TIMELINE of clip launches (an event log over song-beats). The ● REC arm captures launches into that timeline; the RPL/OVR toggle next to it sets the record mode — REPLACE (default: arming clears the log + restarts the song at bar 1) or OVERDUB (arming KEEPS the existing take and merges new launches into it by song-beat). In ARRANGEMENT view the card shows a compact lane×bar timeline whose clip blocks can be DRAGGED in time (bar-snapped) to retime a launch, selected to cycle/delete, with the loop length nudged in bars. The "ARR ⤢" button pops out a FULL-WINDOW arranger editor (like the MAPPY map editor) hosting a large timeline with the same drag-to-move + all the edit ops + a SNAP bar/beat toggle; it reads/writes the SAME synced arrangement so the card, the pop-out, and peers stay in lock-step. The arrangement is Y.Doc-synced; drags commit one transactional write on drop (no per-frame store churn). All ports live on the yellow drill-down PATCH PANEL (no side jacks); knobs are MIDI / control-surface assignable. Usage: build a few note clips per instrument, patch each lane's PITCH/GATE into its own voice, start TIMELORDE, then launch/quantize-switch clips + scenes from the card (or a monome grid) to perform, RECORD a take into the arrangement (REPLACE or OVERDUB) and refine it by dragging blocks on the timeline (in-card or the pop-out editor). A faithful monome Kria step-sequencer ships as the separate `kria` module.
Full guide: Clip launcher, monome grid & song mode The full illustrated guide — launching clips, scenes & quantize, editing notes on the pads, driving it from a monome grid 128, and recording a session into a song-mode arrangement.the faceplate
inputs
| id | cable | what it does |
|---|---|---|
stop_all | gate | Stop-all trigger: a rising edge immediately stops every lane (a panic/stop button), in both session and arrangement modes. gate / trigger; trigger — fires once per rising edge |
reset | gate | Reset trigger: a rising edge snaps every ACTIVE lane back to step 1 and re-anchors all lanes to a shared phase origin (divided/multiplied lanes restart their counting together). Queued-but-not-started launches are untouched — they still drop in at the next loop boundary of the longest playing clip. Stopped lanes stay stopped; the arrangement's song position is not rewound (this is a clip-step reset, not a transport rewind). gate / trigger; trigger — fires once per rising edge |
outputs
| id | cable | what it does |
|---|---|---|
pitch1 | polyPitchGate | Lane 1's pitch output — the launched clip's notes as a poly chord cable (a mono pitch input receives just the root; a poly voice plays the whole chord), shifted by the OCT control. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate1 | gate | Lane 1's gate — goes high while a note in lane 1's clip plays (its width set by GATE; tied/held notes stay high across their span); low on rests. Patch into an envelope/VCA. gate / trigger |
vel1 | cv | Lane 1's velocity CV — each note's velocity as a control voltage, for velocity-sensitive patching (e.g. into a VCA or filter depth). control voltage (CV) |
pitch2 | polyPitchGate | Lane 2's pitch output (poly chord cable), from lane 2's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate2 | gate | Lane 2's gate — high while lane 2's notes play, low on rests. gate / trigger |
vel2 | cv | Lane 2's velocity CV. control voltage (CV) |
pitch3 | polyPitchGate | Lane 3's pitch output (poly chord cable), from lane 3's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate3 | gate | Lane 3's gate — high while lane 3's notes play, low on rests. gate / trigger |
vel3 | cv | Lane 3's velocity CV. control voltage (CV) |
pitch4 | polyPitchGate | Lane 4's pitch output (poly chord cable), from lane 4's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate4 | gate | Lane 4's gate — high while lane 4's notes play, low on rests. gate / trigger |
vel4 | cv | Lane 4's velocity CV. control voltage (CV) |
pitch5 | polyPitchGate | Lane 5's pitch output (poly chord cable), from lane 5's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate5 | gate | Lane 5's gate — high while lane 5's notes play, low on rests. gate / trigger |
vel5 | cv | Lane 5's velocity CV. control voltage (CV) |
pitch6 | polyPitchGate | Lane 6's pitch output (poly chord cable), from lane 6's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate6 | gate | Lane 6's gate — high while lane 6's notes play, low on rests. gate / trigger |
vel6 | cv | Lane 6's velocity CV. control voltage (CV) |
pitch7 | polyPitchGate | Lane 7's pitch output (poly chord cable), from lane 7's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate7 | gate | Lane 7's gate — high while lane 7's notes play, low on rests. gate / trigger |
vel7 | cv | Lane 7's velocity CV. control voltage (CV) |
pitch8 | polyPitchGate | Lane 8's pitch output (poly chord cable), from lane 8's launched clip. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
gate8 | gate | Lane 8's gate — high while lane 8's notes play, low on rests. gate / trigger |
vel8 | cv | Lane 8's velocity CV. control voltage (CV) |
params
| id | label | range | default | curve |
|---|---|---|---|---|
stepDiv | Step | 0..3 | 2 | discrete |
octave | Oct | -2..2 | 0 | discrete |
gateLength | Gate | 0.1..1 | 0.9 | linear |
quantize | Qnt | 0..1 | 1 | discrete |
snh | s&h | 0..1 | 1 | discrete |
restrictRange | RngLim | 0..1 | 0 | discrete |
rangeFloor | RngFlr | 0..8 | 3 | discrete |
controls
| control | what it does |
|---|---|
| Clipplayer auto arm {n} | Lane {n}'s ◉ automation arm (CLIP RECORD, CONTINUOUS OVERDUB) — the small teal button under channel {n}'s column, next to its RATE control; PER LANE, Deluge-like (this replaced the old single global AUTO button), and distinct from the experimental red ● arranger record. While lane {n} is armed and a note clip plays in it, the recorder punches in cleanly at THAT clip's own next loop start; then just MOVE any control of a MODULE assigned to lane {n} (screen / MIDI / Electra all count — CV never records): it records WHILE you hold it, and every OTHER track keeps playing back so the automation loops audibly/visibly. Recording lands in the clip PLAYING in the lane (each clip carries its own envelopes). Release a control and it reverts to playback next loop. It overdubs EVERY loop until you click the ◉ again — a MANUAL STOP (no auto punch-out); stopping mid-loop keeps the untouched tail. Touching a control on an UNASSIGNED module records nothing — right-click the module's card → "Assign to automation lane" first. A 🟡🟡🔴🔴 countdown flashes this ◉ (and the recording clip's grid cell + Launchpad pad) on the last four beats before the clip's wrap. Per-lane single-writer: the arming client records this lane (another collaborator can record a DIFFERENT lane at the same time); peers still play back. On a Launchpad, SHIFT + the top-row button of the lane's column toggles the same arm (lane 8 = double-tap SHIFT). |
| Clipplayer auto assigned {n} | Per-lane ASSIGNED-MODULE count — one tiny chip per lane, tinted the lane's colour, showing how many MODULES are assigned to that lane's automation (right-click a module's CARD → "Assign to automation lane"; the assigned card gets a border in the lane's colour; a deleted module is not counted). A dim chip = nothing assigned. While lane {n} is armed, moving ANY control of these modules records it (max 16 recorded controls per clip). The module menu's "Remove automation assignment" only stops FUTURE recording — the recorded envelopes keep playing until you "Clear recorded automation" (right-click the control) or CLR AUTO the clip. |
| Clipplayer auto cap {n} | MAX badge — flashes for a few seconds when a touch (or a record commit) would exceed the 16-recorded-controls cap of the recording clip's automation. Nothing is lost: the 16 existing tracks keep recording/playing; the over-cap control is simply not captured. Free a slot by clearing a recorded control (right-click → "Clear recorded automation") or the clip's CLR AUTO. |
| Clipplayer auto override {n} | Automation override dot — lights when a control this player automates is being grabbed live (screen drag / MIDI CC / Electra), which SUSPENDS that param's automation playback (live wins) until you physically RELEASE the control (pointer-up, or a short idle after the last MIDI/Electra move) — NOT the loop wrap, so a gesture spanning a loop is never interrupted. On release the param glides back to the envelope; the instant you grab it the queued automation tail is truncated so it doesn't fight your hand. Click the dot to re-enable every suspended param at once. |
| Clipplayer cell {n} | A note cell in the piano-roll editor (rows are scale degrees/pitches, columns are steps). Click to toggle a note on or off at that pitch and step; right-click a note for its menu. The menu's top level is three SUBMENUS that expand into their option lists — NOTE PROBABILITY (a 0–100% firing chance), PITCH PROBABILITY (an off–100% pitch-instability amount in 40 increments) and SKIP EVERY (a 1–8 count-divider that plays the note only on every Nth loop of the clip) — followed by three actions on the CLIP you are editing: COPY and PASTE, which use the same typed clipboard as the Launchpad and Push 2 (so a clip copied on the card pastes on the hardware and vice versa; a paste replaces the target's notes AND its recorded automation, and a whole-SCENE buffer will not paste onto a single clip), and CLEAR, which DELETES the clip — the same undoable operation as the launch grid's right-click CLEAR, and distinct from the editor's ⌫, which empties the notes but keeps the clip. The first two STACK and decide WHETHER the note fires: it sounds only when it's that loop's turn AND it wins its probability roll. The third decides WHAT PITCH it fires at — off (the default) plays exactly the note you drew, and turning it up lets the note wander to nearby SCALE DEGREES of the clip's key, from occasional ornaments through melodic variation to out-of-key reharmonisation at the top, with octaves favoured over equally-distant dissonances. The cell colour codes the first two — white = always fires, a dimmer purple/orange as probability drops, RED (dimmer the higher N) for a play-every note, and the AVERAGE of the two when a note is both probabilistic and play-every. Pitch probability deliberately does NOT add a third colour to that blend (it would be unreadable at cell size): a note whose pitch can wander gets a DASHED border instead, and its exact amount is in the cell's tooltip and the menu's checkmark. The cells make up the clip you're editing for the selected lane+slot. |
| Clipplayer clear auto {n} | CLR AUTO — delete the OPEN clip's whole recorded automation (all of its envelopes) while keeping its notes. Shown in the piano-roll editor only when the clip carries automation; undoable. The editor's ⌫ clear wipes notes AND automation together; per-control deletion is right-click → "Clear recorded automation". |
| Clipplayer mono {n} | Lane {n}'s mono/poly toggle — switches that lane between MONO (one note per column, replace-on-add) and POLY (a chord: multiple notes stacked in one column, played out the lane's poly pitch output up to the poly cable's voice width). |
| Clipplayer pad {n} | A clip slot in the launch grid (one cell of the 8 lanes × 8 slots). Click to launch that lane's clip (with QNT on it quantizes to the longest playing clip's next loop boundary; immediately when nothing's playing yet or via NOW), click the playing pad to stop the lane, and double-click to open the clip in the piano-roll editor. RIGHT-CLICK a pad for the CLIP menu — the SAME menu, with the same rows in the same order, that a note cell opens, only scoped to the whole clip: NOTE PROBABILITY (the clip DEFAULT every note without its own inherits), PITCH PROBABILITY and SKIP EVERY (both applied to EVERY note in the clip), then COPY, PASTE and CLEAR. It opens on EVERY pad, loaded or empty: on an empty slot only PASTE is live, which is how a copied clip is duplicated onto a free pad, exactly as on a Launchpad or Push 2. An empty pad shows differently from a filled or playing one; a clip that CARRIES RECORDED AUTOMATION shows a small teal dot in its corner (the envelope belongs to the clip — copy/paste moves it with the clip). |
| Clipplayer rate {n} | Lane {n}'s clock-rate control (the per-lane dropdown under each channel column) — divides or multiplies the lane's step rate off the global STEP grid: 1/8, 1/4 and 1/2 advance the lane every 8th/4th/2nd base step; 2x and 4x advance it 2×/4× per base step (exact, since the tempo comes from TIMELORDE); 1 (the default) runs on the STEP grid. All lanes count from a shared phase origin (transport start or RST), so divided lanes stay locked to the others. Exposed on the card AND the Launchpad deck's per-lane RATE row (tap to cycle up); the monome grid has no rate surface. |
| Clipplayer scene repeat {n} | Scene {n}'s repeat-count flair — a small read-only "×N" to the right of that scene's row, shown only when the scene carries a finite repeat count (infinite shows nothing — the default). While the scene is actively counting it shows live progress "p/N" (pass p of N). After N passes of the scene's longest clip the player auto-launches the next content scene down. The count itself is SET on a Launchpad: HOLD GRID + HOLD the scene's launch button, then tap pad k in the orange repeat-count view (pad 64 = back to infinite); card-side editing is a follow-up. |
| Gate | GATE — how much of each step the per-note gate stays high, from short staccato stabs to near-legato (held/tied notes ignore this and stay high across their full span). |
| Oct | OCT — transposes every lane's pitch output up or down by whole octaves (-2..+2). |
| Qnt | QNT — launch quantization: on, a clip you launch waits and drops in cleanly at the next loop boundary of the LONGEST currently-playing clip (the shared reference bar — the Deluge model), so mixed-length clips stay phase-locked; off, it launches immediately. A launch fires immediately only when NOTHING is playing yet (there is no reference loop to line up to) or with a per-lane NOW override — a launch into an idle lane is otherwise queued to that reference boundary, not fired at once. |
| RngFlr | RANGE FLOOR (clip-view display only) — the LOWEST octave shown when RESTRICT RANGE is on: the 4-octave editor window runs from this octave's C upward, clamped so it never scrolls past the editable range's top or bottom. Display only; does not transpose or gate anything. |
| RngLim | RESTRICT RANGE (clip-view display only) — off (default) the piano-roll note editor shows the WHOLE editable pitch range at once; on, it shows a compact 4-octave window (its lowest octave set by the FLOOR control) so a tall grid stays scannable. Affects the editor view ONLY — never the played notes, pitch CV, or anything a clip emits. |
| s&h | S&H — one global sample-and-hold toggle for all 8 lanes' pitch outputs: on (default), on a rest the gate closes but each lane's pitch HOLDS its last note (latched to the gate edge); off, rests reset pitch to 0 (the legacy continuous behavior). |
| Step | STEP — how many steps fall per TIMELORDE beat (1/4, 1/8, 1/16, 1/32), i.e. the playback resolution of the clips. |
source
clipplayer.ts on GitHub.