Pattern Delay — User Manual

██████╗  █████╗ ████████╗████████╗███████╗██████╗ ███╗   ██╗
██╔══██╗██╔══██╗╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗████╗  ██║
██████╔╝███████║   ██║      ██║   █████╗  ██████╔╝██╔██╗ ██║
██╔═══╝ ██╔══██║   ██║      ██║   ██╔══╝  ██╔══██╗██║╚██╗██║
██║     ██║  ██║   ██║      ██║   ███████╗██║  ██║██║ ╚████║
╚═╝     ╚═╝  ╚═╝   ╚═╝      ╚═╝   ╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝

         ██████╗ ███████╗██╗      █████╗ ██╗   ██╗
         ██╔══██╗██╔════╝██║     ██╔══██╗╚██╗ ██╔╝
         ██║  ██║█████╗  ██║     ███████║ ╚████╔╝
         ██║  ██║██╔══╝  ██║     ██╔══██║  ╚██╔╝
         ██████╔╝███████╗███████╗██║  ██║   ██║
         ╚═════╝ ╚══════╝╚══════╝╚═╝  ╚═╝   ╚═╝
Azoth Audio · User Manual · v1.0.2

Pattern Delay is a pattern-step delay plugin for VST3 and AU hosts. Four delay voices, each independently sequenced across eight host-synced 1/16th-note steps, each with its own gain, pan, drive, ladder filter, and resonance.

This manual covers everything in the plugin window. Skim the table of contents and jump to what you need.

═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 01  ▓▒░   ─   H O W   I T   W O R K S
═════════════════════════════════════════════════════════════════════════

Pattern Delay is structured around a 4 × 8 grid:

            STEP    1   2   3   4   5   6   7   8
                  +---+---+---+---+---+---+---+---+
       VOICE 1    | * |   | * |   | * |   | * |   |
                  +---+---+---+---+---+---+---+---+
       VOICE 2    |   | * |   |   |   | * |   |   |
                  +---+---+---+---+---+---+---+---+
       VOICE 3    | * |   |   | * | * |   |   | * |
                  +---+---+---+---+---+---+---+---+
       VOICE 4    |   |   | * |   |   | * | * |   |
                  +---+---+---+---+---+---+---+---+
                    ^
                    +-- playhead -->

When the host transport plays, the playhead column crosses left → right once per bar. Each lit cell triggers its voice to read from a delay tap positioned (step + 1) × (1/16th in samples) behind the live input — so column 1 plays back ~one 16th late, column 8 plays back ~half a bar late, and so on. Multiple lit cells in the same voice sum their reads, creating rhythmic echoes that lock to the grid.

The result is more rhythm machine than ambient delay: program a pattern, let the host transport drive the playhead, and shape each voice's tone independently to build polyrhythmic delay textures.

═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 02  ▓▒░   ─   T H E   P L U G I N   W I N D O W
═════════════════════════════════════════════════════════════════════════

The editor is divided into a top bar and a panel. The panel toggles between two views — PTRN (the step grid) and CTRL (the per-voice knobs) — via the tab pill in the top bar.

Top bar

ControlBehavior
Tab pillSwitches the panel between PTRN (grid) and CTRL (knobs).
🎲 DiceRandomizes the pattern: ~20% of cells lit, plus per-voice knob values rolled in their full range (gain is capped at 70% so randomized patches stay headroom-safe). Sets the preset label to Random.
Preset nameClick → opens the preset menu (Factory / User submenus). Double-click → inline-rename the current name. Shows Init or Random for unsaved states.
‹ / ›Step backwards / forwards through the combined factory + user preset list (factory first, then user alphabetical). Wraps at the ends.
MIX sliderLinear dry/wet crossfade. 0 = pure dry, 1 = pure wet. Per-voice gain still governs each voice's contribution inside the wet bus.
☰ MenuOpens the actions menu (see below).

PTRN view

Eight STEP 1…8 column headers across the top, four VOICE 1…4 row labels down the left, and the 32-cell grid in between. Click any cell to toggle it. While the host is playing, lit cells flash red as the playhead column crosses them.

CTRL view

Five column headers — GAIN · PAN · FILT · RESO · DIST — and four voice rows, giving a 4×5 knob layout. Each knob is normalized 0–1.

KnobRange / meaning
GAINVoice level into the wet bus. Default 0.7.
PANEqual-power L/R pan. 0 = full left, 0.5 = center (default), 1 = full right.
FILTLadder filter cutoff, exponential 20 Hz → 20 kHz. Default 1.0 (fully open).
RESOLadder filter resonance (k = 0 → 3.9). Default 0. Pushes the cutoff into self-oscillation territory at the top of the range.
DISTPer-voice tanh saturation drive. 0 = clean (1× into the saturator), 1 = heavy (20×). Default 0.

The filter is a per-voice ZDF Moog ladder (4-pole, 24 dB/oct, trapezoidal integration with zero-delay feedback). Distortion sits after the filter and uses a fast Padé tanh for soft-clipping. Gain and pan apply last.

Actions menu

The button at the right of the top bar opens this menu:

EntryEffect
InitClear every cell, reset every knob to its default. Sets the preset label to Init.
RandomizeSame as the dice button.
Save Preset…Opens a modal with a suggested name (<current> Custom if you're on an unmodified factory preset; otherwise the current name) and writes a JSON file under the user presets folder. Factory-name collisions are blocked.
Open Preset FolderOpens the user presets folder in the OS file browser.
License…Opens the license entry dialog. The label surfaces the current activation state at a glance.
Size ▸Editor zoom: 100% / 125% / 150%. See Window sizes below.
Check for updatesSingle HTTPS request to a static version.json on azothaudio.com. No telemetry, no identifiers — see § 06.
AboutPlugin name, version, link to azothaudio.com, copyright.

Window sizes

The editor's native canvas is 840 × 426 at 1.25× rendering (1050 × 533 on screen) — the source artwork is authored at 3× density so the default canvas already takes advantage of the high-density assets. The size submenu's labels are shifted to match what a user expects to read:

Menu labelInternal scaleOn-screen size
100% (default)1.25×1050 × 533
125%1.50×1260 × 639
150%1.75×1470 × 746

The chosen zoom is persisted to disk and re-applied next time the editor opens.

═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 03  ▓▒░   ─   T E M P O   &   T R A N S P O R T
═════════════════════════════════════════════════════════════════════════

Pattern Delay is always host-synced. There is no manual BPM control and no free-running mode. Every audio block, the plugin reads the host's process context:

Even with the host stopped, lit cells still produce delays — the voices' read positions are tempo-derived, so cells still fire; you just don't see the visual playhead crossing them.
═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 04  ▓▒░   ─   P R E S E T S
═════════════════════════════════════════════════════════════════════════

Pattern Delay ships with 31 factory presets and supports any number of user presets. The two are kept in separate folders so user files can never shadow a factory entry:

<Documents>/Azoth Audio/PatternDelay/
  Factory/             ← read-only, auto-extracted on first launch
    Acetate Slap.json
    Basserator.json
    …
  Presets/             ← user-writable
    My Preset.json
  config.json          ← editor zoom factor
  license.json         ← (after activation)

On every editor open, any missing factory file is re-extracted from the embedded copy — so deleting one from disk just restores it on next launch. If you re-author a factory file in place, the on-disk copy wins.

Preset JSON contains only the user-controllable parameters — the grid (32 cells) and the per-voice knobs (4 × 5 = 20 values). Mix, Bypass, and the implicit host-sync globals are deliberately excluded so loading a preset doesn't fight the DAW.

Factory names are reserved — renames colliding with a factory entry are silently dropped.
═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 05  ▓▒░   ─   L I C E N S I N G
═════════════════════════════════════════════════════════════════════════

Pattern Delay uses an offline Ed25519 key/signature scheme. The plugin embeds the public half of a keypair; the private half lives only on the signing server. Activation is fully offline — no network calls, no phone-home, no machine ID.

A license key is a single string of the form:

base64(payload).base64(signature)

where the payload is a small JSON object including your purchase email, order ID, and a product identifier. The plugin verifies:

If any gate fails, the dialog shows a specific message (invalid key vs. wrong email) so you can correct the right thing. Until a valid license is present, the audio path is a clean dry passthrough — the plugin is audible but the wet bus is muted. Re-enter your key any time via the actions menu.

The accepted key is stored at <Documents>/Azoth Audio/PatternDelay/license.json and is re-verified on every plugin load.
═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 06  ▓▒░   ─   U P D A T E   C H E C K
═════════════════════════════════════════════════════════════════════════

Pattern Delay makes a single HTTPS GET to azothaudio.com/patterndelay/version.json only when you click Check for updates in the menu (5-second timeout, 64 KB response cap). The request carries no query string, no user identifier, no telemetry; the URL is hard-coded and identical for every install.

The dialog reports one of four states — Checking…, Up to date, Update available, or Couldn't check — and in the latter two cases shows a "Go to downloads" button that opens azothaudio.com/downloads in your browser.

No automatic, scheduled, or background invocation. The check only ever fires on an explicit menu click.
═════════════════════════════════════════════════════════════════════════
 ░▒▓  § 07  ▓▒░   ─   I N S T A L L A T I O N
═════════════════════════════════════════════════════════════════════════

macOS

~/Library/Audio/Plug-Ins/VST3/PatternDelay.vst3
~/Library/Audio/Plug-Ins/Components/PatternDelay.component

After installing the AU you may need to clear the AudioUnit cache so the host re-scans it:

killall -9 AudioComponentRegistrar || true
rm -rf ~/Library/Caches/AudioUnitCache

Windows

%CommonProgramFiles%\VST3\PatternDelay.vst3

(AU is macOS-only.)