All books

Patterns + scenes — the live-arrangement model

~5 min read · updated 2026-09-20 · markdown

Everything you've done so far in the grid lives in ONE pattern per track. The pattern model lets each track carry up to 8 patterns (labelled A..H by default, renameable), and scenes capture whole-sequencer pattern combinations — the same multi-track "chorus / verse / bridge" mechanic familiar from Ableton's Session view, with FaustWave's own quantize + launch semantics.

This is the live-performance layer of the Sequencer. Once you understand it, you stop "writing a long song" and start "writing a few short patterns and launching them in real time".

Patterns — per-track variation

Each track has a pattern bank. A new track starts with 4 patterns; you can add up to 8 with sequencer.pattern.add.

On the track's chip there's a pattern launcher — A / B / … pads. Each pattern has three states the launcher distinguishes:

  • Active — the pattern the engine is playing. One per track at a time.
  • Edit — the pattern the piano-roll editor is showing. Independent from active — you can edit pattern B while the engine plays pattern A.
  • Pending — a pattern that was launched while playing, but is still waiting for its quantize point. Visual pulse until the swap commits.

Click a pattern pad to launch it. The behaviour depends on transport state:

  • Stopped: launch is immediate. Next sequencer.play starts in the launched pattern.
  • Playing: launch is queued and commits at the pattern's launch-quantize boundary (default: next bar).
For AI & automation · MCP

sequencer.pattern.active.set { pattern_id, track_id?, instance_id? } is the launch. Returns immediately even if the actual swap is queued.

Independently from launching, you can change which pattern the editor is showing without affecting playback:

For AI & automation · MCP

sequencer.pattern.edit.set { pattern_id, track_id? } is a view-only change. Useful when you want to fill in pattern D while the engine plays pattern A — set the edit pattern to D, paint, set it back to A (or just launch D).

Per-pattern launch quantize

Each pattern carries its own launch quantize — the boundary the engine waits for before committing the launch. Five values:

QuantizeCommits at
instantImmediately (no quantize). Use for fills.
next-beatNext beat boundary (every 4 × 16ths).
next-bar (default)Next pattern wrap.
next-2-barsEvery second pattern wrap.
next-4-barsEvery fourth pattern wrap.

Stopped sequencer always commits immediately regardless of this value.

For AI & automation · MCP

sequencer.pattern.quantize.set { pattern_id, quantize, track_id? }.

Mixing quantizes inside one sequencer is fine — a fill pattern at instant, your main verse / chorus at next-bar, a long-form variation at next-4-bars. The launcher visuals reflect the quantize so you can tell at a glance.

Renaming patterns

Default labels are A..H (positional). Rename via right-click → Rename, or:

For AI & automation · MCP

sequencer.pattern.rename { pattern_id, label, track_id? }. The pattern id is positional and unchanged — only the display label moves.

A / B / C / D works for sketches; "verse / chorus / bridge / fill" works for live sets.

Removing patterns

For AI & automation · MCP

sequencer.pattern.remove { pattern_id, track_id? }. Refuses on the last pattern (a track always keeps ≥ 1). If the removed pattern was active, edit, or pending, those references fall back to the first remaining pattern.

Scenes — whole-sequencer combinations

A scene captures "which pattern is active on each track" as a single named handle. Launch a scene → every assigned track queues its scene's pattern (using each track's own per-pattern quantize). The combination commits at each track's next quantize point, so you can swap from "verse combo" to "chorus combo" with one launch.

Building a scene

The usual flow: dial up a combination by launching patterns track-by-track, then save it:

For AI & automation · MCP

sequencer.scene.add { from_current: true (default), label? } snapshots the current activePatternId of every track as the scene's assignments. Returns { ok, scene_id }.

Default label = Scene N. Rename via:

For AI & automation · MCP

sequencer.scene.rename { scene_id, label }.

Launching a scene

For AI & automation · MCP

sequencer.scene.launch { scene_id }. Queues each assigned track's pattern via the same pendingPatternId mechanism as sequencer.pattern.active.set (next-bar when playing, immediate when stopped). Tracks NOT in the scene's assignments are left untouched.

Sets active_scene_id so the panel highlights the active scene.

Removing a scene

For AI & automation · MCP

sequencer.scene.remove { scene_id }. If it was the active scene, active_scene_id clears.

A live-perf chain

actions:
  - action_id: sequencer.track.add
    input: { name: "Patterns demo" }
    save_as: t
    label: "▶ 0. Add a demo track (leaves your tracks alone)"
  - action_id: sequencer.pattern.add
    input: { track_id: "{{t.track_id}}" }
    save_as: chorus
    label: "▶ 1. Add a 'chorus' pattern to it"
  - action_id: sequencer.pattern.rename
    input:
      pattern_id: "{{chorus.pattern_id}}"
      label: "Chorus"
      track_id: "{{t.track_id}}"
    label: "▶ 2. Rename it 'Chorus'"
  - action_id: sequencer.pattern.quantize.set
    input:
      pattern_id: "{{chorus.pattern_id}}"
      quantize: next-2-bars
      track_id: "{{t.track_id}}"
    label: "▶ 3. Launch on a 2-bar boundary"
  - action_id: sequencer.pattern.active.set
    input:
      pattern_id: "{{chorus.pattern_id}}"
      track_id: "{{t.track_id}}"
    label: "▶ 4. Launch the chorus"
  - action_id: sequencer.scene.add
    input: { from_current: true, label: "All-Chorus" }
    label: "■ 5. Snapshot the current combo as a scene"

When to scene vs launch directly

  • Just one or two tracks change at a section boundary: per-track pattern launch is simpler. Fewer concepts in play.
  • Three or more tracks change at the same boundary: scenes save the gesture. One launch → every track moves to its assigned pattern.
  • You need to A/B different combinations live: scenes win — name them, launch them, return to neutral.

The Edit Pattern mechanic lets you fill in upcoming sections without disturbing what's playing. The combination + scene model lets you stage transitions cleanly.

Perform mode — the layout for live

For AI & automation · MCP

surface.open { surface: "faustwave-bundled/sequencer#patterns" }. UI: the PATTERNS button in the Sequencer header, or the Patterns row in the launcher.

Track cards, enlarged pattern pads, direct mute/solo, scenes — bigger touch targets and less visual noise. If you operate the Sequencer with one finger on a touchscreen or one hand on a controller, this is the surface you keep open; the roll can stay open next to it, or not.

Flip back to edit whenever you need to compose; the pattern bank survives unchanged.

Next section: the full MCP surface, with a multi-track build-from-scratch chain.

Try it yourself — the IDE runs in your browser. Open the IDE → Get the desktop app

Text licensed under CC BY 4.0 — Mani Weber / FaustWave. For language models: llms.txt · llms-full.txt

AUDIO · 48k · 48.0ms FAUST · 3 KB · 1171 docs CPU · 8.4% BPM · 120.0 UTF-8 BETA· v0.90.0