██████╗ █████╗ ████████╗████████╗███████╗██████╗ ███╗ ██╗
██╔══██╗██╔══██╗╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗████╗ ██║
██████╔╝███████║ ██║ ██║ █████╗ ██████╔╝██╔██╗ ██║
██╔═══╝ ██╔══██║ ██║ ██║ ██╔══╝ ██╔══██╗██║╚██╗██║
██║ ██║ ██║ ██║ ██║ ███████╗██║ ██║██║ ╚████║
╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝
██████╗ ███████╗██╗ █████╗ ██╗ ██╗
██╔══██╗██╔════╝██║ ██╔══██╗╚██╗ ██╔╝
██║ ██║█████╗ ██║ ███████║ ╚████╔╝
██║ ██║██╔══╝ ██║ ██╔══██║ ╚██╔╝
██████╔╝███████╗███████╗██║ ██║ ██║
╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝
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.
| Control | Behavior |
|---|---|
| Tab pill | Switches the panel between PTRN (grid) and CTRL (knobs). |
| 🎲 Dice | Randomizes 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 name | Click → 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 slider | Linear dry/wet crossfade. 0 = pure dry, 1 = pure wet. Per-voice gain still governs each voice's contribution inside the wet bus. |
| ☰ Menu | Opens the actions menu (see below). |
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.
Five column headers — GAIN · PAN · FILT · RESO · DIST — and four voice rows, giving a 4×5 knob layout. Each knob is normalized 0–1.
| Knob | Range / meaning |
|---|---|
| GAIN | Voice level into the wet bus. Default 0.7. |
| PAN | Equal-power L/R pan. 0 = full left, 0.5 = center (default), 1 = full right. |
| FILT | Ladder filter cutoff, exponential 20 Hz → 20 kHz. Default 1.0 (fully open). |
| RESO | Ladder filter resonance (k = 0 → 3.9). Default 0. Pushes the cutoff into self-oscillation territory at the top of the range. |
| DIST | Per-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.
The ☰ button at the right of the top bar opens this menu:
| Entry | Effect |
|---|---|
| Init | Clear every cell, reset every knob to its default. Sets the preset label to Init. |
| Randomize | Same 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 Folder | Opens 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 updates | Single HTTPS request to a static version.json on azothaudio.com. No telemetry, no identifiers — see § 06. |
| About | Plugin name, version, link to azothaudio.com, copyright. |
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 label | Internal scale | On-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:
═════════════════════════════════════════════════════════════════════════ ░▒▓ § 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.
═════════════════════════════════════════════════════════════════════════ ░▒▓ § 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:
product field matches pattern-delay exactly.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.
<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.
═════════════════════════════════════════════════════════════════════════ ░▒▓ § 07 ▓▒░ ─ I N S T A L L A T I O N ═════════════════════════════════════════════════════════════════════════
~/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
%CommonProgramFiles%\VST3\PatternDelay.vst3
(AU is macOS-only.)