From b9c1c188b2faf022e13bc91fac41ff28e2936651 Mon Sep 17 00:00:00 2001 From: spacedevin Date: Tue, 1 Sep 2026 11:05:21 -0700 Subject: [PATCH] docs(site): document the whole instrument catalog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The site rendered examples for three voices — gameBoyDmg, gbaDirectSound, basicOsc — and said nothing about the other thirty. The catalog page now covers all 33: label, description, every parameter with its default, and the factory presets where they exist. Generated from generatorCatalog() and defaultParamsForGeneratorId() rather than written by hand, so it cannot drift from the code. Presets come from the app that authored them. packages/synths also had no presence on the site at all — site/build.mjs listed packages/player explicitly and never mentioned it, so the package README did not render. It has an Instruments section now. Verified: site builds, /synths/ and /synths/catalog/ render, all 33 ids appear on the page, 26 preset blocks, and the catalog is in the sidebar. --- packages/synths/CATALOG.md | 705 +++++++++++++++++++++++++++++++++++++ site/build.mjs | 15 + 2 files changed, 720 insertions(+) create mode 100644 packages/synths/CATALOG.md diff --git a/packages/synths/CATALOG.md b/packages/synths/CATALOG.md new file mode 100644 index 0000000..735b426 --- /dev/null +++ b/packages/synths/CATALOG.md @@ -0,0 +1,705 @@ +# Instrument catalog + +Every voice in `@spacedevin/deck-synths`, generated from `generatorCatalog()` and +`defaultParamsForGeneratorId()` so it cannot drift from the code. + +Select one with `track id gen `. Parameters are set with `gen ` +in snake_case — `sweep_amt 26` reaches the voice as `sweepAmt`. Values below are the defaults. + +| Voices | Count | +|---|---| +| Chip emulations | 8 | +| Hard sync | 4 | +| Analog & electronic | 7 | +| Atmospheric | 4 | +| Acoustic models | 3 | +| Percussion | 4 | +| Vocal | 3 | +| **Total** | **33** | + +## Chip emulations + +### `gameBoyDmg` — LR35902 + +Game Boy DMG APU emulator (100% hardware parity). + +| Parameter | Default | +|---|---| +| `type` | `"pulse"` | +| `duty` | `"50"` | +| `envMode` | `"step"` | +| `vol` | `15` | +| `sweep` | `0` | +| `noiseMode` | `"long"` | +| `waveShape` | `"saw"` | +| `attack` | `0` | +| `decay` | `0` | +| `sustain` | `15` | +| `release` | `0` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | +| `len` | `0` | +| `envStep` | `0` | +| `envUp` | `false` | +| `sweepShift` | `0` | +| `sweepPeriod` | `0` | +| `sweepDown` | `false` | +| `noiseShift` | `null` | +| `noiseRatio` | `0` | + +Factory presets: + +- **GB Pulse Lead** — `{ channel: "pulse_50", decay: 0.15, sweep: 0 }` +- **GB Bass** — `{ channel: "wavetable", waveShape: "sawtooth", decay: 0.3, sweep: 0 }` +- **25% Pulse** — `{ type: "pulse", duty: "25", envMode: "step", vol: 15, sweep: 2, attack: 0, decay: 0, sustain: 15, release: 0 }` +- **Wavetable Crunch** — `{ type: "wave", waveVol: "100", attack: 0, decay: 0, sustain: 15, release: 0 }` + +### `nes2a03` — 2A03 + +NES APU emulator (100% hardware parity). + +| Parameter | Default | +|---|---| +| `type` | `"pulse"` | +| `duty` | `"50"` | +| `envMode` | `"decay"` | +| `vol` | `10` | +| `sweep` | `0` | +| `noiseMode` | `"long"` | +| `attack` | `0` | +| `decay` | `0` | +| `sustain` | `15` | +| `release` | `0` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `dutySweep` | `0` | +| `dpcmSample` | `"kick"` | + +Factory presets: + +- **NES Pulse 50%** — `{ channel: "pulse_50", decay: 0.2, sweep: 0 }` +- **NES Pulse 25%** — `{ channel: "pulse_25", decay: 0.2, sweep: 0 }` +- **NES Pulse 12.5%** — `{ channel: "pulse_12_5", decay: 0.25, sweep: 0 }` +- **NES Triangle** — `{ channel: "triangle", decay: 0.4, sweep: 0 }` +- **NES Noise** — `{ channel: "noise", decay: 0.1, sweep: 0 }` +- **NES Laser Sweep** — `{ channel: "pulse_50", decay: 0.2, sweep: -12 }` +- **Pulse Lead** — `{ type: "pulse", duty: "50", envMode: "decay", vol: 12, attack: 0, decay: 3, sustain: 10, release: 2 }` +- **12.5% Pluck** — `{ type: "pulse", duty: "12_5", envMode: "decay", vol: 15, attack: 0, decay: 6, sustain: 0, release: 1 }` +- **Triangle Bass** — `{ type: "triangle", vol: 15, attack: 0, decay: 0, sustain: 15, release: 0 }` + +### `c64sid` — MOS 6581 + +Commodore 64 SID chip emulator (100% hardware parity). + +| Parameter | Default | +|---|---| +| `waveform` | `"sawtooth"` | +| `pulseWidth` | `0.5` | +| `filterType` | `"lowpass"` | +| `cutoff` | `2000` | +| `resonance` | `5` | +| `attack` | `0` | +| `decay` | `5` | +| `sustain` | `15` | +| `release` | `6` | +| `hardSync` | `false` | +| `ringMod` | `false` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | + +Factory presets: + +- **C64 SID Lead** — `{ waveform: "sawtooth", pulseWidth: 0.5, filterType: "lowpass", cutoff: 3500, resonance: 6, attack: 0.008, decay: 0.2, sustain: 0.6, release: 0.1 }` +- **C64 SID Bass** — `{ waveform: "pulse", pulseWidth: 0.4, filterType: "lowpass", cutoff: 1200, resonance: 8, attack: 0.005, decay: 0.35, sustain: 0.4, release: 0.08 }` +- **C64 PWM Pad** — `{ waveform: "pulse", pulseWidth: 0.3, filterType: "lowpass", cutoff: 2000, resonance: 4, attack: 0.08, decay: 0.5, sustain: 0.7, release: 0.3 }` +- **SNES Warm Pad** — `{ waveform: "pulse", pulseWidth: 0.5, filterType: "lowpass", cutoff: 1500, resonance: 2, attack: 0.12, decay: 0.5, sustain: 0.65, release: 0.4 }` +- **SNES Lead** — `{ waveform: "sawtooth", pulseWidth: 0.5, filterType: "lowpass", cutoff: 2500, resonance: 3, attack: 0.008, decay: 0.25, sustain: 0.6, release: 0.12 }` +- **SID Brass** — `{ waveform: "sawtooth", pulseWidth: 0.5, filterType: "lowpass", cutoff: 4000, resonance: 2, attack: 0.03, decay: 0.3, sustain: 0.7, release: 0.15 }` +- **Hard Sync Lead** — `{ waveform: "sawtooth", hardSync: true, attack: 2, decay: 5, sustain: 10, release: 6, pitchDrop: -12, pitchDec: 0.2 }` +- **Filter Bass** — `{ waveform: "pulse", pulseWidth: 0.5, filterType: "lowpass", cutoff: 600, resonance: 8, attack: 0, decay: 4, sustain: 4, release: 3 }` + +### `ym2612` — YM2612 + +Sega Genesis FM Synth emulator (References: Nuked-OPN2, Genesis Plus GX). + +| Parameter | Default | +|---|---| +| `algorithm` | `0` | +| `feedback` | `0` | +| `op1_mul` | `1` | +| `op1_tl` | `0` | +| `op1_ar` | `31` | +| `op1_dr` | `5` | +| `op1_sr` | `5` | +| `op1_rr` | `5` | +| `op1_sl` | `0` | +| `op2_mul` | `1` | +| `op2_tl` | `0` | +| `op2_ar` | `31` | +| `op2_dr` | `5` | +| `op2_sr` | `5` | +| `op2_rr` | `5` | +| `op2_sl` | `0` | +| `op3_mul` | `1` | +| `op3_tl` | `0` | +| `op3_ar` | `31` | +| `op3_dr` | `5` | +| `op3_sr` | `5` | +| `op3_rr` | `5` | +| `op3_sl` | `0` | +| `op4_mul` | `1` | +| `op4_tl` | `0` | +| `op4_ar` | `31` | +| `op4_dr` | `5` | +| `op4_sr` | `5` | +| `op4_rr` | `5` | +| `op4_sl` | `0` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | + +Factory presets: + +- **Genesis E-Piano** — `{ algorithm: 4, feedback: 0, op1_mul: 1, op1_tl: 0, op1_ar: 31, op1_dr: 12, op1_sr: 5, op1_rr: 8, op1_sl: 5, op2_mul: 1, op2_tl: 20, op2_ar: 31, op2_dr: 15, op2_sr: 5, op2_rr: 8, op2_sl: 5, op3_mul: 4, op3_tl: 30, op3_ar: 31, op3_dr: 18, op3_sr: 5, op3_rr: 8, op3_sl: 5, op4_mul: 1, op4_tl: 10, op4_ar: 31, op4_dr: 10, op4_sr: 5, op4_rr: 8, op4_sl: 5 }` +- **Genesis Brass** — `{ algorithm: 1, feedback: 5, op1_mul: 1, op1_tl: 0, op1_ar: 20, op1_dr: 15, op1_sr: 5, op1_rr: 10, op1_sl: 2, op2_mul: 2, op2_tl: 15, op2_ar: 22, op2_dr: 12, op2_sr: 5, op2_rr: 10, op2_sl: 2, op3_mul: 1, op3_tl: 5, op3_ar: 18, op3_dr: 10, op3_sr: 5, op3_rr: 10, op3_sl: 2, op4_mul: 1, op4_tl: 0, op4_ar: 24, op4_dr: 8, op4_sr: 5, op4_rr: 10, op4_sl: 2 }` + +### `sn76489` — SN76489 + +Sega Master System / Genesis PSG emulator (References: MAME). + +| Parameter | Default | +|---|---| +| `type` | `"square"` | +| `noiseMode` | `"white"` | +| `noiseFreq` | `0` | +| `vol` | `15` | +| `attack` | `0` | +| `decay` | `0.1` | +| `sustain` | `15` | +| `release` | `0` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | + +Factory presets: + +- **PSG Square Lead** — `{ type: "square", vol: 15, attack: 0, decay: 0.1, sustain: 15, release: 0 }` + +### `spc700` — SPC700 + +Super Nintendo S-DSP emulator (References: bsnes, snes9x). + +| Parameter | Default | +|---|---| +| `waveform` | `"strings"` | +| `attack` | `0` | +| `decay` | `3` | +| `sustainLevel` | `7` | +| `sustainRate` | `0` | +| `echoEnable` | `false` | +| `echoDelay` | `4` | +| `echoFeedback` | `0` | +| `echoFir` | `0` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | + +Factory presets: + +- **Echo Strings** — `{ waveform: "strings", attack: 10, decay: 3, sustainLevel: 7, sustainRate: 0, echoEnable: true, echoDelay: 8, echoFeedback: 40 }` +- **Warm Brass** — `{ waveform: "brass", attack: 6, decay: 5, sustainLevel: 5, sustainRate: 0, echoEnable: false, echoDelay: 4, echoFeedback: 0 }` + +### `gbaDirectSound` — GBA DirectSound + +Game Boy Advance 8-bit DAC software mixing simulator. + +| Parameter | Default | +|---|---| +| `waveform` | `"pulse"` | +| `duty` | `"50"` | +| `vol` | `15` | +| `attack` | `0` | +| `decay` | `2` | +| `sustain` | `15` | +| `release` | `0` | +| `bitcrush` | `true` | +| `pitchDrop` | `0` | +| `pitchDec` | `0.05` | +| `vibRate` | `0` | +| `vibAmt` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | + +Factory presets: + +- **Software Saw Lead** — `{ waveform: "sawtooth", duty: "50", attack: 0, decay: 1, sustain: 15, release: 0, bitcrush: true }` +- **Pulse Chug** — `{ waveform: "pulse", duty: "25", attack: 0, decay: 0.1, sustain: 0, release: 0.2, bitcrush: true }` + +### `chiptune` — Chiptune + +Retro 8-bit pulse-width modulation and decimation crush. + +| Parameter | Default | +|---|---| +| `waveform` | `"pulse"` | +| `pulseWidth` | `0.5` | +| `pwmSpeed` | `0` | +| `bitcrush` | `0` | +| `lowpass` | `0` | +| `arpRate` | `0` | +| `arpSemis` | `0` | +| `attack` | `0.005` | +| `decay` | `0.3` | +| `sustain` | `0` | +| `release` | `0.05` | + +## Hard sync + +### `syncLead` — Sync Lead + +Aggressive true hard sync analog lead with an automated sweep envelope. + +| Parameter | Default | +|---|---| +| `masterTune` | `0` | +| `slaveBase` | `12` | +| `sweepAmt` | `24` | +| `sweepDecay` | `0.4` | +| `lfoRate` | `0` | +| `lfoAmt` | `0` | +| `cutoff` | `3000` | +| `resonance` | `5` | +| `filterEnvAmt` | `0` | +| `filterDecay` | `0.4` | +| `attack` | `0.05` | +| `decay` | `0.3` | +| `sustain` | `0.8` | +| `release` | `0.5` | + +Factory presets: + +- **Sync Screamer** — `{ slaveBase: 19, sweepAmt: 36, sweepDecay: 0.25, cutoff: 5000, resonance: 3, filterEnvAmt: 0, attack: 0.02, decay: 0.2, sustain: 0.9, release: 0.3 }` +- **Sync Pluck** — `{ slaveBase: 12, sweepAmt: 24, sweepDecay: 0.15, cutoff: 2400, resonance: 6, filterEnvAmt: 0.3, filterDecay: 0.2, attack: 0.005, decay: 0.15, sustain: 0, release: 0.2 }` +- **Sync Talk Box** — `{ slaveBase: 5, sweepAmt: 12, sweepDecay: 0.6, lfoRate: 3.5, lfoAmt: 8, cutoff: 1800, resonance: 8, attack: 0.08, decay: 0.4, sustain: 0.7, release: 0.4 }` + +### `syncChoir` — Sync Choir + +Lush, robotic 80s analog choir built from detuned hard sync formants. + +| Parameter | Default | +|---|---| +| `vowelShift` | `24` | +| `morphRate` | `0.5` | +| `morphAmt` | `12` | +| `ensembleDetune` | `15` | +| `vibRate` | `5` | +| `vibAmt` | `10` | +| `highpass` | `300` | +| `attack` | `1` | +| `decay` | `1` | +| `sustain` | `0.8` | +| `release` | `1.5` | + +Factory presets: + +- **Android Choir** — `{ vowelShift: 24, morphRate: 0.5, morphAmt: 12, ensembleDetune: 15, vibRate: 5.0, vibAmt: 10, highpass: 300, attack: 1.0, decay: 1.0, sustain: 0.8, release: 1.5 }` +- **Slow Morph Pad** — `{ vowelShift: 19, morphRate: 0.12, morphAmt: 24, ensembleDetune: 20, vibRate: 4.0, vibAmt: 8, highpass: 200, attack: 2.0, decay: 1.5, sustain: 0.85, release: 2.5 }` +- **Tight Ensemble** — `{ vowelShift: 12, morphRate: 0.8, morphAmt: 6, ensembleDetune: 6, vibRate: 6.5, vibAmt: 14, highpass: 400, attack: 0.3, decay: 0.5, sustain: 0.9, release: 0.8 }` + +### `obSync` — OB Sync + +Massive, creamy dual-oscillator hard sync synth with Oberheim-style width and a sweeping filter. + +| Parameter | Default | +|---|---| +| `detune` | `15` | +| `sweepRate` | `0.5` | +| `sweepAmt` | `24` | +| `cutoff` | `1200` | +| `resonance` | `2` | +| `filterEnv` | `2400` | +| `filterDecay` | `0.8` | +| `attack` | `0.1` | +| `decay` | `0.4` | +| `sustain` | `0.6` | +| `release` | `0.5` | + +Factory presets: + +- **Oberheim Jump** — `{ detune: 18, sweepRate: 0.7, sweepAmt: 30, cutoff: 2000, resonance: 3, filterEnv: 3200, filterDecay: 0.5, attack: 0.04, decay: 0.3, sustain: 0.7, release: 0.3 }` +- **OB Pad** — `{ detune: 12, sweepRate: 0.2, sweepAmt: 12, cutoff: 800, resonance: 1.5, filterEnv: 1600, filterDecay: 1.2, attack: 0.6, decay: 0.8, sustain: 0.8, release: 1.5 }` + +### `laserSync` — Laser Sync + +Punchy, retro-arcade zap. A rapid pitch-dropping master oscillator ripping through a static sync slave. + +| Parameter | Default | +|---|---| +| `dropRate` | `0.8` | +| `dropAmt` | `36` | +| `slaveBase` | `18` | +| `attack` | `0.01` | +| `decay` | `0.3` | + +Factory presets: + +- **Arcade Zap** — `{ dropRate: 0.9, dropAmt: 48, slaveBase: 24, attack: 0.005, decay: 0.15 }` +- **Laser Sweep** — `{ dropRate: 0.3, dropAmt: 24, slaveBase: 12, attack: 0.02, decay: 0.6 }` + +## Analog & electronic + +### `acid303` — Acid 303 + +Classic 303-style bassline with resonant filter and envMod sweep. + +| Parameter | Default | +|---|---| +| `waveform` | `"sawtooth"` | +| `cutoff` | `800` | +| `resonance` | `15` | +| `envMod` | `4000` | +| `decay` | `0.4` | + +Factory presets: + +- **Classic Acid** — `{ waveform: "square", cutoff: 600, resonance: 18, envMod: 5000, decay: 0.35 }` +- **Acid Squelch** — `{ waveform: "sawtooth", cutoff: 400, resonance: 22, envMod: 6000, decay: 0.2 }` +- **Deep Acid** — `{ waveform: "sawtooth", cutoff: 500, resonance: 12, envMod: 3000, decay: 0.6 }` + +### `sub808` — Sub 808 + +Heavy sine wave sub-bass with punch and drive saturation. + +| Parameter | Default | +|---|---| +| `punch` | `60` | +| `decay` | `1.2` | +| `drive` | `0` | +| `glide` | `0.05` | + +Factory presets: + +- **808 Long Tail** — `{ punch: 48, decay: 2.5, drive: 0.15, glide: 0.08 }` +- **808 Distorted** — `{ punch: 72, decay: 1.0, drive: 0.6, glide: 0.03 }` + +### `reeseBass` — Reese Bass + +Thick, multi-oscillator detuned Supersaw bass with filter wobble. + +| Parameter | Default | +|---|---| +| `voices` | `3` | +| `detune` | `30` | +| `cutoff` | `1500` | +| `wobble` | `0` | +| `decay` | `1` | + +Factory presets: + +- **DnB Reese** — `{ voices: 5, detune: 40, cutoff: 1200, wobble: 0.6, decay: 1.5 }` +- **Minimal Sub Reese** — `{ voices: 2, detune: 15, cutoff: 800, wobble: 0, decay: 1.2 }` + +### `basicOsc` — Basic OSC + +Single oscillator + ADSR in generator params. + +| Parameter | Default | +|---|---| +| `waveform` | `"sine"` | +| `attack` | `0.005` | +| `decay` | `0.08` | +| `sustain` | `0.4` | +| `release` | `0.12` | + +Factory presets: + +- **Saw Lead** — `{ waveform: "sawtooth", attack: 0.01, decay: 0.15, sustain: 0.7, release: 0.2 }` +- **Square Sub** — `{ waveform: "square", attack: 0.005, decay: 0.3, sustain: 0.8, release: 0.15 }` + +### `fmTone` — FM tone + +Two-operator FM + ADSR in generator params. + +| Parameter | Default | +|---|---| +| `ratio` | `2` | +| `modIndex` | `4` | +| `carrierWave` | `"sine"` | +| `modWave` | `"sine"` | +| `attack` | `0.005` | +| `decay` | `0.08` | +| `sustain` | `0.4` | +| `release` | `0.12` | + +Factory presets: + +- **FM E-Piano** — `{ ratio: 1, modIndex: 3, carrierWave: "sine", modWave: "sine", attack: 0.003, decay: 0.8, sustain: 0.15, release: 0.4 }` +- **FM Brass** — `{ ratio: 1, modIndex: 6, carrierWave: "sine", modWave: "square", attack: 0.06, decay: 0.3, sustain: 0.7, release: 0.25 }` + +### `matrixFm` — Matrix FM + +Multi-operator FM/RM graph via deck gen_block (Sytrus-style). + +### `patch` — Patch + +Modular synth patch (gen_block patch): osc/noise/filter/shaper/gain + breakpoint envelopes — any voice, written in deck. + +## Atmospheric + +### `pad` — Pad + +Detuned triple-osc + lowpass + slow env — ethereal, reverb-friendly. + +| Parameter | Default | +|---|---| +| `wave1` | `"sine"` | +| `wave2` | `"triangle"` | +| `detune` | `9` | +| `cutoff` | `2200` | +| `attack` | `0.08` | +| `decay` | `0.25` | +| `sustain` | `0.6` | +| `release` | `0.7` | + +Factory presets: + +- **Warm Blanket** — `{ wave1: "triangle", wave2: "sine", detune: 14, cutoff: 1200, attack: 0.6, decay: 0.8, sustain: 0.75, release: 2.0 }` +- **Glass Shimmer** — `{ wave1: "sawtooth", wave2: "square", detune: 8, cutoff: 4000, attack: 0.3, decay: 0.4, sustain: 0.6, release: 1.2 }` + +### `aether` — Aether + +Theremin — eerie, voice-like heterodyne tone with a portamento swoop into each note, a living two-hand pitch/amplitude waver, and a breathy volume-hand swell. + +| Parameter | Default | +|---|---| +| `glide` | `0.4` | +| `waver` | `0.5` | +| `tone` | `0.3` | +| `swell` | `0.45` | +| `air` | `0.25` | + +Factory presets: + +- **Classic Theremin** — `{ glide: 0.4, waver: 0.5, tone: 0.3, swell: 0.45, air: 0.25 }` +- **Sci-Fi Wail** — `{ glide: 0.7, waver: 0.8, tone: 0.5, swell: 0.6, air: 0.4 }` + +### `halo` — Halo + +Hang drum / handpan — lush inharmonic octave + compound-fifth shimmer triad over a long ethereal ring, with a soft fingertip strike and a warm 'gu' body. + +| Parameter | Default | +|---|---| +| `temper` | `0.4` | +| `ring` | `0.55` | +| `mallet` | `0.35` | +| `bloom` | `0.5` | +| `lows` | `0.45` | + +Factory presets: + +- **Meditation Bowl** — `{ temper: 0.3, ring: 0.8, mallet: 0.2, bloom: 0.65, lows: 0.6 }` +- **Steel Tongue** — `{ temper: 0.55, ring: 0.35, mallet: 0.6, bloom: 0.3, lows: 0.35 }` + +### `bell` — Bell + +Inharmonic sine partials + highpass + bell decay — metallic shimmer. + +| Parameter | Default | +|---|---| +| `partial` | `2.01` | +| `highpass` | `800` | +| `decay` | `1` | + +Factory presets: + +- **Crystal Chime** — `{ partial: 3.01, highpass: 1200, decay: 2.0 }` +- **Dark Bell** — `{ partial: 1.41, highpass: 400, decay: 1.8 }` + +## Acoustic models + +### `arco` — Arco + +Bowed strings — violin · viola · cello · bass · fiddle. Stick-slip saw through real body-resonance formants, with bow pressure, articulation, vibrato and rosin noise. Only string-player controls. + +| Parameter | Default | +|---|---| +| `voice` | `"violin"` | +| `pressure` | `0.5` | +| `bow` | `0.4` | +| `vibrato` | `0.35` | +| `rosin` | `0.3` | +| `body` | `0.6` | + +Factory presets: + +- **Solo Violin** — `{ voice: "violin", pressure: 0.55, bow: 0.45, vibrato: 0.4, rosin: 0.25, body: 0.65 }` +- **Cello Legato** — `{ voice: "cello", pressure: 0.6, bow: 0.5, vibrato: 0.5, rosin: 0.2, body: 0.75 }` +- **Country Fiddle** — `{ voice: "fiddle", pressure: 0.7, bow: 0.55, vibrato: 0.3, rosin: 0.55, body: 0.5 }` +- **Upright Bass** — `{ voice: "bass", pressure: 0.45, bow: 0.35, vibrato: 0.2, rosin: 0.15, body: 0.8 }` + +### `tine` — Tine + +Rhodes-style electric piano — velocity-barked FM tine (hard = metallic bark, soft = mellow bell), a metal tine ping, EP decay, and lush suitcase tremolo. + +| Parameter | Default | +|---|---| +| `bark` | `0.55` | +| `tine` | `0.6` | +| `tremolo` | `0.35` | +| `decay` | `0.5` | +| `drive` | `0.2` | + +Factory presets: + +- **Suitcase Warm** — `{ bark: 0.35, tine: 0.4, tremolo: 0.6, decay: 0.65, drive: 0.15 }` +- **Stage Bright** — `{ bark: 0.7, tine: 0.75, tremolo: 0, decay: 0.45, drive: 0.3 }` +- **Neo Soul Keys** — `{ bark: 0.45, tine: 0.55, tremolo: 0.25, decay: 0.7, drive: 0.1 }` + +### `guitar` — Guitar + +Karplus-Strong plucked electric guitar — string model + palm mute + drive + body. Pairs with the chord voice for strums. + +| Parameter | Default | +|---|---| +| `tone` | `0.5` | +| `decay` | `0.6` | +| `damping` | `0.4` | +| `drive` | `0.25` | +| `body` | `3500` | +| `mute` | `0` | + +Factory presets: + +- **Clean Electric** — `{ tone: 0.55, decay: 0.6, damping: 0.35, drive: 0.1, body: 3800, mute: 0 }` +- **Palm Mute Chug** — `{ tone: 0.35, decay: 0.3, damping: 0.55, drive: 0.45, body: 2800, mute: 0.7 }` +- **Nylon Acoustic** — `{ tone: 0.72, decay: 0.75, damping: 0.25, drive: 0, body: 4200, mute: 0 }` +- **Bass Guitar** — `{ tone: 0.28, decay: 0.55, damping: 0.6, drive: 0.15, body: 1800, mute: 0 }` + +## Percussion + +### `drumSynth` — Drum + +Pitch-envelope drum synth — punchy kicks, snares, toms, 808s (+ noise + drive). + +| Parameter | Default | +|---|---| +| `tone` | `"sine"` | +| `pitchEnv` | `36` | +| `pitchDecay` | `0.06` | +| `decay` | `0.35` | +| `noise` | `0` | +| `noiseDecay` | `0.12` | +| `noiseHp` | `1500` | +| `drive` | `0` | + +Factory presets: + +- **TR-909 Kick** — `{ tone: "sine", pitchEnv: 30, pitchDecay: 0.035, decay: 0.3, noise: 0.05, drive: 0.2 }` +- **Boom Bap Kick** — `{ tone: "sine", pitchEnv: 38, pitchDecay: 0.07, decay: 0.55, noise: 0, drive: 0.08 }` +- **Rim Shot** — `{ tone: "triangle", pitchEnv: 12, pitchDecay: 0.015, decay: 0.06, noise: 0.5, noiseHp: 3000, noiseDecay: 0.04, drive: 0.15 }` +- **Tom Low** — `{ tone: "sine", pitchEnv: 24, pitchDecay: 0.04, decay: 0.35, noise: 0.1, drive: 0.05 }` +- **Tom High** — `{ tone: "sine", pitchEnv: 18, pitchDecay: 0.03, decay: 0.25, noise: 0.12, drive: 0.05 }` + +### `clap` — Clap + +The Clap — handclap engine: hand count, timing spread, hand size, brightness, room tail, and clusters (single / double / many-hand crowd). + +| Parameter | Default | +|---|---| +| `hands` | `3` | +| `spread` | `0.4` | +| `size` | `0.5` | +| `tone` | `0.5` | +| `claps` | `1` | +| `gap` | `0.35` | +| `tail` | `0.4` | +| `body` | `0.2` | + +Factory presets: + +- **Tight Clap** — `{ hands: 2, spread: 0.2, size: 0.3, tone: 0.6, claps: 1, gap: 0.2, tail: 0.25, body: 0.15 }` +- **Crowd Clap** — `{ hands: 8, spread: 0.7, size: 0.7, tone: 0.45, claps: 3, gap: 0.4, tail: 0.6, body: 0.35 }` + +### `cymbal` — Cymbal + +TR-808 style cymbal cluster (6 tuned squares + noise + highpass). + +| Parameter | Default | +|---|---| +| `tune` | `300` | +| `metallic` | `0.8` | +| `decay` | `0.4` | +| `highpass` | `7000` | + +Factory presets: + +- **Ride Cymbal** — `{ tune: 340, metallic: 0.7, decay: 0.8, highpass: 6000 }` +- **Crash** — `{ tune: 280, metallic: 0.9, decay: 1.5, highpass: 5000 }` + +### `noiseBurst` — Noise burst + +Filtered noise; attack + decay shape the hit. + +| Parameter | Default | +|---|---| +| `attack` | `0.002` | +| `decay` | `0.07` | +| `tone` | `0.45` | +| `pitchFollow` | `0.25` | + +## Vocal + +### `formantVocal` — Formant Vocal + +Expressive formant synthesizer with gliding notes and vibrato. + +| Parameter | Default | +|---|---| +| `glide` | `0.1` | +| `vibDepth` | `0.02` | +| `vibRate` | `5` | +| `humanize` | `0.5` | +| `release` | `0.2` | + +### `ttsVocal` — TTS Vocal + +Web Speech API Text-to-Speech engine for robotic vocal sequences. + +| Parameter | Default | +|---|---| +| `voice` | `0` | +| `rate` | `1.5` | + +### `meSpeakVocal` — meSpeak Vocal + +Retro robotic TTS using meSpeak.js with sample-accurate timing. + +| Parameter | Default | +|---|---| +| `pitch` | `50` | +| `speed` | `175` | +| `wordgap` | `0` | +| `variant` | `"m1"` | +| `amplitude` | `100` | + diff --git a/site/build.mjs b/site/build.mjs index b21a594..3aaed92 100644 --- a/site/build.mjs +++ b/site/build.mjs @@ -49,6 +49,21 @@ const SECTIONS = [ // documents, and the host-facing snippets are all tagged `tish`. Declared rather than guessed. defaultLang: 'deck', }, + { + label: 'Instruments', + dir: 'packages/synths', + slug: 'synths', + order: ['README.md', 'CATALOG.md'], + ignore: ['node_modules', 'dist', 'src', 'test'], + // Same reason as Playback below: README.md is PUBLISHED, so its title and description are + // declared here rather than in frontmatter that npmjs.com would render as stray text. + titles: { 'README.md': 'Instruments', 'CATALOG.md': 'Catalog' }, + descriptions: { + 'README.md': 'The instrument catalog for .deck — 33 voices, shared by every host.', + 'CATALOG.md': 'Every voice, its parameters and defaults, and the factory presets.', + }, + defaultLang: 'deck', + }, { label: 'Playback', dir: 'packages/player',