← All modules
AvailableMIDI & Modulation

Arpeggiator

Walk held notes through a rhythmic pattern.

Engine preview

Not built for macOS, Windows or Linux

About

An arpeggiator makes no sound. It sits between your hands and whatever instrument is mounted, takes the notes you are holding, and plays them one at a time on a grid. That distinction matters here more than usual: this module has no voice of its own, so what you hear is the preview engine's own synth voice being played very quickly by something other than your fingers.

The pattern is a function of the held set, not a recording of it. Add a note to a chord you are already holding and it joins the pattern at the next step rather than restarting it; lift one and the cycle shortens around the gap. The step grid runs free from the moment the first key goes down, so the rhythm never stutters when the harmony changes underneath it.

Random is seeded, which is a deliberate departure from the plugin this was ported from. There, each step called the system random number generator, so the same patch played a different line every time and no two renders of it matched. Here the choice is a hash of the step index: the line is still unpredictable to listen to, but it is identical on every playback, in an offline render, and in the test suite. Musically it costs nothing; it is what makes the mode reproducible.

This is a preview module. The scheduling is real, every note is committed to the AudioContext clock as an absolute time, so timer jitter cannot move it, but the voice it drives is the website's stand-in engine, not a compiled kernel, and no parity claim applies.

Build evidence

Every row below is a recorded build row or the recorded absence of one. Nothing here is inferred from what this module is meant to support.

Module
music.codex.arpeggiator v1.0.0
Built at
no recorded row carries a build time; the browser lanes record none
Closure hash
not a Processor — no lowering closure
Toolchain
  • scriptc 64acce1ae3b8…
  • moduleToolchainDist c621ffab721d…
  • pluginShellKitRuntime bca003784692…
  • faceShellGeneration 8533207ab81f…
  • uiPreservation cd28dbd7e3d6…
  • packagerVersion 3
Build result and download for each format
FormatResultDownload
Browser package (JS)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
Browser package (WASM)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
VST3Not built

no recorded artifact row for vst3; native-lane-report.json is absent or records no vst3 row for this module

Not built for macOS, Windows or Linux
Audio UnitNot built

no recorded artifact row for au; native-lane-report.json is absent or records no au row for this module

Not built for macOS
CLAPNot built

no recorded artifact row for clap; native-lane-report.json is absent or records no clap row for this module

Not built for macOS, Windows or Linux
Standalone appNot built

no recorded artifact row for standalone; native-lane-report.json is absent or records no standalone row for this module

Not built for macOS, Windows or Linux

Parity

No lane recorded an artifact; there is no parity evidence.

Signal graph.

Experimental

The exact normalized graph packaged for the shared browser/native runtime and exports.

How it works.

The module is split into a pure core and a scheduler, and the split is where the interesting part lives. The core is a plain function: given the set of notes you are holding, a step index and the params, it returns the note that step plays. It has no clock, no audio and no state, which is what makes every musical claim on this page, the ordering, the octave stacking, the gate maths, the reproducibility of random, checkable in the test suite rather than by ear.

The scheduler wraps that core in the same lookahead loop the chord player and the clip player use. A timer wakes every 25 ms, asks the core for every step whose onset falls in the next 120 ms, and commits each one to the engine with an absolute AudioContext time. Because the time is computed rather than taken from the timer, a stalled main thread can delay the decision but cannot move the note, which is the whole reason this is not a setInterval that calls noteOn.

It hooks note handling rather than the audio graph. A keypress while the arp is engaged is swallowed and held; the scheduler then re-enters the engine's own noteOn with a scheduled time, so the sound comes from whichever voice the mounted module provides. That is what makes it a note filter in the roster's sense: it emits MIDI, not audio, and needs an instrument downstream to be heard.

Goes well with.

Preview

Steps

A step sequencer and arpeggiator on one grid.

PreviewNot built for macOS, Windows or Linux
Preview

Stepper

A 32-step Matrix, with ties, ratchets and a curve lane.

Preview
Preview

Chordex

Generate a voiced chord from one note.

PreviewNo build recorded
Preview

OSC Mini

A compact subtractive synth for learning the signal path.

Preview