@jpdutoit/squelchy 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +5 -1
  2. package/{chunk-N7J25N5J.js → chunk-PJDNZ52Q.js} +21 -5
  3. package/chunk-PJDNZ52Q.js.map +7 -0
  4. package/docs/GUIDE.md +87 -9
  5. package/docs/MODULES.md +47 -37
  6. package/docs/modules.json +114 -32
  7. package/index.d.ts +99 -30
  8. package/index.js +557 -362
  9. package/index.js.map +3 -3
  10. package/kits/compu-78/bd.flac +0 -0
  11. package/kits/compu-78/ch.flac +0 -0
  12. package/kits/compu-78/clap.flac +0 -0
  13. package/kits/compu-78/cym.flac +0 -0
  14. package/kits/compu-78/ht.flac +0 -0
  15. package/kits/compu-78/lt.flac +0 -0
  16. package/kits/compu-78/mt.flac +0 -0
  17. package/kits/compu-78/oh.flac +0 -0
  18. package/kits/compu-78/perc.flac +0 -0
  19. package/kits/compu-78/rim.flac +0 -0
  20. package/kits/compu-78/sd.flac +0 -0
  21. package/kits/deep-analogue/bd.flac +0 -0
  22. package/kits/deep-analogue/ch.flac +0 -0
  23. package/kits/deep-analogue/clap.flac +0 -0
  24. package/kits/deep-analogue/cym.flac +0 -0
  25. package/kits/deep-analogue/ht.flac +0 -0
  26. package/kits/deep-analogue/lt.flac +0 -0
  27. package/kits/deep-analogue/mt.flac +0 -0
  28. package/kits/deep-analogue/oh.flac +0 -0
  29. package/kits/deep-analogue/perc.flac +0 -0
  30. package/kits/deep-analogue/rim.flac +0 -0
  31. package/kits/deep-analogue/sd.flac +0 -0
  32. package/kits/hard-cell/bd.flac +0 -0
  33. package/kits/hard-cell/ch.flac +0 -0
  34. package/kits/hard-cell/clap.flac +0 -0
  35. package/kits/hard-cell/cym.flac +0 -0
  36. package/kits/hard-cell/ht.flac +0 -0
  37. package/kits/hard-cell/lt.flac +0 -0
  38. package/kits/hard-cell/mt.flac +0 -0
  39. package/kits/hard-cell/oh.flac +0 -0
  40. package/kits/hard-cell/perc.flac +0 -0
  41. package/kits/hard-cell/rim.flac +0 -0
  42. package/kits/hard-cell/sd.flac +0 -0
  43. package/kits/micro-click/bd.flac +0 -0
  44. package/kits/micro-click/ch.flac +0 -0
  45. package/kits/micro-click/clap.flac +0 -0
  46. package/kits/micro-click/cym.flac +0 -0
  47. package/kits/micro-click/ht.flac +0 -0
  48. package/kits/micro-click/lt.flac +0 -0
  49. package/kits/micro-click/mt.flac +0 -0
  50. package/kits/micro-click/oh.flac +0 -0
  51. package/kits/micro-click/perc.flac +0 -0
  52. package/kits/micro-click/rim.flac +0 -0
  53. package/kits/micro-click/sd.flac +0 -0
  54. package/kits/tape-dust/bd.flac +0 -0
  55. package/kits/tape-dust/ch.flac +0 -0
  56. package/kits/tape-dust/clap.flac +0 -0
  57. package/kits/tape-dust/cym.flac +0 -0
  58. package/kits/tape-dust/ht.flac +0 -0
  59. package/kits/tape-dust/lt.flac +0 -0
  60. package/kits/tape-dust/mt.flac +0 -0
  61. package/kits/tape-dust/oh.flac +0 -0
  62. package/kits/tape-dust/perc.flac +0 -0
  63. package/kits/tape-dust/rim.flac +0 -0
  64. package/kits/tape-dust/sd.flac +0 -0
  65. package/package.json +1 -1
  66. package/{worklets-inline-EF3OTQ4D.js → worklets-inline-NWG5PWND.js} +10 -2
  67. package/{worklets-inline-EF3OTQ4D.js.map → worklets-inline-NWG5PWND.js.map} +2 -2
  68. package/chunk-N7J25N5J.js.map +0 -7
package/index.d.ts CHANGED
@@ -125,12 +125,20 @@ export type Signal<Q> = AudioNode & {
125
125
  /** Reinterpret a node as a pitch signal — the greppable escape hatch for
126
126
  * deliberate cross-quantity patches. */
127
127
  export declare const asPitch: (n: AudioNode) => Signal<Note>;
128
- /** Where a playback starts. Default 'bar' = next bar line (beat 0 if stopped). */
128
+ /** A musical position. 'now' | 'beat' | 'bar' are the next of each from the
129
+ * current position (beat 0 if stopped). `{ bar: 3, beat: 2 }` is beat 2 of
130
+ * bar 3 (both count from 0); `{ beat: n }` is an absolute beat. */
129
131
  export type StartAt = "now" | "beat" | "bar" | {
130
132
  bar: number;
133
+ beat?: Beats;
131
134
  } | {
132
135
  beat: Beats;
133
136
  };
137
+ interface AtOptions {
138
+ /** Fires when the position is actually heard (output latency included),
139
+ * like `onHit`. Use it for UI; `fn` runs a lookahead early, for audio. */
140
+ onAudible?: (time: Seconds) => void;
141
+ }
134
142
  /** Rich step form, for when a plain value isn't enough. */
135
143
  export interface StepObject<V> {
136
144
  value: V;
@@ -211,8 +219,10 @@ export interface Transport {
211
219
  resolve(at: StartAt): Beats;
212
220
  /** Play a pattern array through a voice. */
213
221
  play<V>(pattern: readonly Step<V>[], voice: Voice<V>, opts?: PlayOptions<V>): Playback<V>;
214
- /** Run `fn(time)` once at a musical position — for automation, e.g. `vca.set('gain', 0, time)`. */
215
- at(when: StartAt | Beats, fn: (time: Seconds) => void): () => void;
222
+ /** Run `fn(time)` once, a lookahead before a musical position, with its exact
223
+ * audio time — for automation. `onAudible` fires when that moment is heard.
224
+ * Returns a cancel function (cancels both). */
225
+ at(when: StartAt | Beats, fn: (time: Seconds) => void, opts?: AtOptions): () => void;
216
226
  /** Global visual tap: every hit of every playback, fired when audible. Returns unsubscribe. */
217
227
  onHit(cb: (hit: Hit) => void): () => void;
218
228
  /** Schedule everything due inside the lookahead window. Auto-called in 'auto' mode. */
@@ -260,17 +270,29 @@ export declare const Hat: {
260
270
  create(ctx: BaseAudioContext): VoiceInstance;
261
271
  };
262
272
  /**
263
- * Gate + pitch CV for driving patchable modules (Envelope trig, V/Oct inputs).
264
- * `gate` goes to the hit's velocity at `time`, back to 0 after `duration`;
265
- * `pitch` holds the note (absolute key position, 69 = A4), typed as the
266
- * library's pitch signal like every other V/OCT output. Both are
267
- * ConstantSourceNodes.
273
+ * Gate, pitch and velocity CV for driving patchable modules, like a
274
+ * MIDI-to-CV interface: `gate` into an Envelope's trigger, `pitch` into V/Oct
275
+ * inputs, `velocity` into whatever should follow how hard the note was hit
276
+ * (a VCA's gain, a filter's cutoff CV, an envelope depth).
277
+ *
278
+ * - `gate` is a fixed-height gate, like Eurorack: 1 while a note is held, 0
279
+ * otherwise, whatever the velocity. (Gate inputs open above 0.5, so a gate
280
+ * carrying velocity would silence every soft note.)
281
+ * - `pitch` holds the note (absolute key position, 69 = A4), typed as the
282
+ * library's pitch signal like every other V/OCT output.
283
+ * - `velocity` is the hit's velocity 0..1, set at note-on and held until the
284
+ * next note, so the release tail keeps the level it was played at. 0 until
285
+ * the first note.
286
+ *
287
+ * All three are ConstantSourceNodes.
268
288
  */
269
289
  export interface NoteCvInstance {
270
- /** Gate CV: the hit's velocity while a note is held, 0 otherwise. */
290
+ /** Gate CV: 1 while a note is held, 0 otherwise — every hit opens it, whatever its velocity. */
271
291
  gate: ConstantSourceNode;
272
292
  /** Pitch CV: the current note (69 = A4), held between notes. */
273
293
  pitch: ConstantSourceNode & Signal<Note>;
294
+ /** Velocity CV: the last note's velocity (0..1), held until the next note. */
295
+ velocity: ConstantSourceNode;
274
296
  trigger(time: Seconds, hit?: Partial<Hit<Note>>): void;
275
297
  dispose(): void;
276
298
  }
@@ -322,13 +344,22 @@ export interface SampleVoiceOptions {
322
344
  /** The note that plays the sample unshifted. Default 60 (C4). */
323
345
  root?: Note;
324
346
  }
347
+ /** A sample voice: a VoiceInstance whose kit can be swapped while playing. */
348
+ export interface SampleVoiceInstance extends VoiceInstance<Note | boolean> {
349
+ /** The kit hits are played from. */
350
+ readonly kit: LoadedSampleSet;
351
+ /** Play later hits from another kit (same voice key, same fallback chain).
352
+ * Hits already scheduled (up to the transport's lookahead) and samples
353
+ * still ringing keep the old kit, so the swap never cuts a tail. */
354
+ setKit(kit: LoadedSampleSet): void;
355
+ }
325
356
  /** A one-shot sample voice, like a drum machine: every hit plays the whole
326
357
  * sample, whatever the step's gate length. velocity 0..1 scales level. A
327
358
  * `Note` value plays the sample at that note (`root` = unshifted), the same
328
359
  * numbers `NoteCv` plays, so `notes()` melodies work on both; anything else
329
360
  * (e.g. `true` from steps()) plays it unshifted. */
330
361
  export declare const SampleVoice: {
331
- create(ctx: BaseAudioContext, kit: LoadedSampleSet, key: VoiceKey, opts?: SampleVoiceOptions): VoiceInstance<Note | boolean>;
362
+ create(ctx: BaseAudioContext, kit: LoadedSampleSet, key: VoiceKey, opts?: SampleVoiceOptions): SampleVoiceInstance;
332
363
  };
333
364
  export interface AcidFilterParams {
334
365
  /** Cutoff Note. Base cutoff as a note (67 ≈ 400 Hz, 69 = 440 Hz) for the iconic squelchy acid sound. Drives the V/OCT worklet 1:1 — the panel knob shows the equivalent Hz. Range 15–135 notes. Default 67. */
@@ -395,7 +426,7 @@ export type AutoPanProps = {
395
426
  };
396
427
  export declare const AutoPan: LibModule<AutoPanParams, AutoPanInputs, AutoPanOutputs, AutoPanProps>;
397
428
  export interface BitcrusherParams {
398
- /** Bit Depth. Number of bits for quantization. Lower = crunchier, more lo-fi. Range 1–16. Default 8. */
429
+ /** Bit Depth. Number of bits for quantization. Lower = crunchier, more lo-fi. 1 bit = two levels: a hard full-scale square at the input's pitch. Range 1–16. Default 8. */
399
430
  bits?: number;
400
431
  /** Sample Rate. Sample rate reduction factor. 1 = original, lower = more aliased and crunchy. Creates the classic "staircase" sample-and-hold effect. Range 0.01–1 (log). Default 0.5. */
401
432
  rate?: number;
@@ -404,6 +435,9 @@ export interface BitcrusherParams {
404
435
  }
405
436
  export type BitcrusherInputs = {
406
437
  "in": AudioNode;
438
+ "modBits": AudioParam;
439
+ "modRate": AudioParam;
440
+ "modMix": AudioParam;
407
441
  };
408
442
  export type BitcrusherOutputs = {
409
443
  "out": AudioNode;
@@ -412,6 +446,9 @@ export type BitcrusherOutputs = {
412
446
  export type BitcrusherProps = {
413
447
  "in": AudioNode;
414
448
  "out": AudioNode;
449
+ "modBits": AudioParam;
450
+ "modRate": AudioParam;
451
+ "modMix": AudioParam;
415
452
  readonly params: {
416
453
  /** Bit Depth. Native AudioParam — value is the param value 1:1. */
417
454
  "bits": AudioParam;
@@ -425,7 +462,7 @@ export declare const Bitcrusher: LibModule<BitcrusherParams, BitcrusherInputs, B
425
462
  export interface ChorusParams {
426
463
  /** Rate. Chorus sweep LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam. Range 0.1–5 Hz. Default 1.5. */
427
464
  rate?: Hz;
428
- /** Modulation Depth. How much the delay time is modulated. More = wider detuning. Scaled onto the LFO gain, so it is set-only (no single AudioParam carries it 1:1). Range 0–1. Default 0.5. */
465
+ /** Modulation Depth. How far each delay line swings around its 5.66 ms centre: ±4 ms at 1. About 0.46 matches a Juno-60's Chorus I/II swing; more = wider detuning. Scaled onto the LFO gain, so it is set-only (no single AudioParam carries it 1:1). Range 0–1. Default 0.5. */
429
466
  depth?: number;
430
467
  /** Dry/Wet Mix. Balance between original and chorused signal, driven by one ConstantSource (dry = 1 − mix·0.5, wet = mix — the antiphase voices already carry half the width at mix 1). Range 0–1. Default 0.5. */
431
468
  mix?: number;
@@ -487,21 +524,24 @@ export type CombFilterProps = {
487
524
  };
488
525
  export declare const CombFilter: LibModule<CombFilterParams, CombFilterInputs, CombFilterOutputs, CombFilterProps>;
489
526
  export interface CompressorParams {
490
- /** Threshold. Level above which compression kicks in. Lower = more compression. Range -60–0 dB. Default -24. */
527
+ /** Threshold. Peak level (dBFS) above which compression kicks in. Lower = more compression. With a soft KNEE it eases in from half the knee width below. Range -60–0 dB. Default -24. */
491
528
  threshold?: Decibels;
492
529
  /** Ratio. How much to reduce signal above threshold. 4:1 = every 4dB over becomes 1dB. Range 1–20 (log). Default 4. */
493
530
  ratio?: number;
494
- /** Attack. How fast compression responds to loud signals. Range 0.001–1 s (log). Default 0.003. */
531
+ /** Attack. How fast compression grabs a loud signal: the gain reduction gets 63% of the way in this time (nearly all of it in 3×), however hard you hit it. Range 0.0001–1 s (log). Default 0.003. */
495
532
  attack?: Seconds;
496
- /** Release. How fast compression releases after signal drops. Range 0.01–1 s (log). Default 0.25. */
533
+ /** Release. How fast compression lets go once the signal drops: the gain reduction falls 63% of the way back in this time (nearly all of it in 3×). Range 0.01–1 s (log). Default 0.25. */
497
534
  release?: Seconds;
498
- /** Knee. Width of the transition zone around the threshold. 0 = hard knee (abrupt), 40 = soft knee (gradual). Range 0–40 dB. Default 10. */
535
+ /** Knee. Width of the transition zone centred on the threshold. 0 = hard knee (abrupt), 40 = soft knee (gradual). Range 0–40 dB. Default 10. */
499
536
  knee?: Decibels;
500
537
  /** Makeup Gain. Boosts the output level to compensate for gain reduction. Up to +30 dB. Range 0–30 dB. Default 0. */
501
538
  makeup?: Decibels;
539
+ /** Key Source. What the compressor listens to. INT: the signal it is compressing. EXT: whatever is patched into KEY (side-chain), e.g. a kick that ducks a bass or pad. The gain still lands on IN. Default "internal". */
540
+ keySource?: "internal" | "external";
502
541
  }
503
542
  export type CompressorInputs = {
504
543
  "in": AudioNode;
544
+ "key": AudioNode;
505
545
  };
506
546
  export type CompressorOutputs = {
507
547
  "out": AudioNode;
@@ -509,6 +549,7 @@ export type CompressorOutputs = {
509
549
  /** Port properties on the instance: slug → native connect target (same as input()/output()). */
510
550
  export type CompressorProps = {
511
551
  "in": AudioNode;
552
+ "key": AudioNode;
512
553
  "out": AudioNode;
513
554
  readonly params: {
514
555
  /** Threshold. Native AudioParam — value is dB 1:1. */
@@ -521,6 +562,8 @@ export type CompressorProps = {
521
562
  "release": AudioParam;
522
563
  /** Knee. Native AudioParam — value is dB 1:1. */
523
564
  "knee": AudioParam;
565
+ /** Makeup Gain. Native AudioParam — value is dB 1:1. */
566
+ "makeup": AudioParam;
524
567
  };
525
568
  };
526
569
  export declare const Compressor: LibModule<CompressorParams, CompressorInputs, CompressorOutputs, CompressorProps>;
@@ -577,9 +620,11 @@ export type DelayProps = {
577
620
  };
578
621
  export declare const Delay: LibModule<DelayParams, DelayInputs, DelayOutputs, DelayProps>;
579
622
  export interface DimensionParams {
623
+ /** Stereo Width. Adjusts stereo image. 0=mono, 1=normal, 2=extra wide. Split across a four-gain matrix, so it is set-only (no single AudioParam carries it). Range 0–2. Default 1.5. */
624
+ width?: number;
580
625
  /** Rate. Widening LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam. Range 0.1–5 Hz. Default 0.5. */
581
626
  rate?: Hz;
582
- /** Modulation Depth. Amount of chorus-like modulation for that classic 80s wide sound. Scaled onto the LFO gains, so it is set-only (no single AudioParam carries it 1:1). Range 0–1. Default 0.3. */
627
+ /** Modulation Depth. How far the two BBD-style delay lines sweep (full = 1.65–5.35 ms, in antiphase). The dry signal stays in both channels, so this adds movement and width, not vibrato. Scaled onto the LFO gains, so it is set-only (no single AudioParam carries it 1:1). Range 0–1. Default 0.3. */
583
628
  depth?: number;
584
629
  }
585
630
  export type DimensionInputs = {
@@ -827,7 +872,7 @@ export declare const Flanger: LibModule<FlangerParams, FlangerInputs, FlangerOut
827
872
  export interface FormantParams {
828
873
  /** Vowel Morph. Position along the A-E-I-O-U vowel formant chain. 0 = A, 5 wraps back to A; fractional values interpolate between neighbouring vowels. Range 0–5. Default 0. */
829
874
  morph?: number;
830
- /** Resonance. Sharpness of the formant peaks, scaled per band. Higher values sound more pronounced and vocal. Range 1–20 (sqrt). Default 6. */
875
+ /** Resonance. Sharpness of the formant peaks. 6 = the bandwidths of a real voice (F1 ≈ 50–80 Hz wide); every band is 6/RES times that, so 1 is soft and blurred, 20 rings like a talk box. Loudness holds across the range. Range 1–20 (sqrt). Default 6. */
831
876
  resonance?: number;
832
877
  /** Dry/Wet Mix. Balance between the original signal and the formant-filtered output. 0 = dry, 1 = fully wet. Range 0–1. Default 1. */
833
878
  mix?: number;
@@ -844,7 +889,10 @@ export type FormantProps = {
844
889
  "in": AudioNode;
845
890
  "out": AudioNode;
846
891
  "modVowel": AudioNode;
847
- readonly params: Record<never, never>;
892
+ readonly params: {
893
+ /** Resonance. Native AudioParam — value is the param value 1:1. */
894
+ "resonance": AudioParam;
895
+ };
848
896
  };
849
897
  export declare const Formant: LibModule<FormantParams, FormantInputs, FormantOutputs, FormantProps>;
850
898
  export interface FrequencyShifterParams {
@@ -882,9 +930,12 @@ export interface GateParams {
882
930
  attack?: Seconds;
883
931
  /** Release. How fast the gate closes when signal falls below threshold. Range 0.01–0.5 s (log). Default 0.1. */
884
932
  release?: Seconds;
933
+ /** Key Source. What opens the gate. INT: the signal being gated. EXT: whatever is patched into KEY, e.g. a clock or hi-hat that chops a pad into rhythm. Default "internal". */
934
+ keySource?: "internal" | "external";
885
935
  }
886
936
  export type GateInputs = {
887
937
  "in": AudioNode;
938
+ "key": AudioNode;
888
939
  };
889
940
  export type GateOutputs = {
890
941
  "out": AudioNode;
@@ -892,8 +943,13 @@ export type GateOutputs = {
892
943
  /** Port properties on the instance: slug → native connect target (same as input()/output()). */
893
944
  export type GateProps = {
894
945
  "in": AudioNode;
946
+ "key": AudioNode;
895
947
  "out": AudioNode;
896
948
  readonly params: {
949
+ /** Threshold. Native AudioParam — value is dB 1:1. */
950
+ "threshold": AudioParam;
951
+ /** Range. Native AudioParam — value is the param value 1:1. */
952
+ "range": AudioParam;
897
953
  /** Attack. Native AudioParam — value is s 1:1. */
898
954
  "attack": AudioParam;
899
955
  /** Release. Native AudioParam — value is s 1:1. */
@@ -952,7 +1008,7 @@ export interface HarmonicTremoloParams {
952
1008
  rate?: Hz;
953
1009
  /** Modulation Depth. Intensity of the volume modulation. Split across the low- and high-band LFO gains, so it is set-only (no single AudioParam carries it). Range 0–1. Default 0.7. */
954
1010
  depth?: number;
955
- /** Crossover Frequency. Frequency where signal splits into low and high bands. Only the lowpass moves; the high band is derived (input − LP) and follows. modCrossover sums into the same AudioParam. Range 200–2000 Hz. Default 800. */
1011
+ /** Crossover Frequency. Frequency where signal splits into low and high bands (−6 dB point of a Linkwitz-Riley 2nd-order pair: both bands 12 dB/oct, summing flat). One audio-rate value drives both filters, so modCrossover moves the split, not just one side. Range 200–2000 Hz. Default 800. */
956
1012
  crossover?: Hz;
957
1013
  }
958
1014
  export type HarmonicTremoloInputs = {
@@ -1046,13 +1102,13 @@ export type LfoProps = {
1046
1102
  };
1047
1103
  export declare const Lfo: LibModule<LfoParams, LfoInputs, LfoOutputs, LfoProps>;
1048
1104
  export interface LoFiParams {
1049
- /** Saturation. Amount of warm tape-like saturation and compression. Rebuilds the waveshaper curve, so it is set-only (no single AudioParam carries it). Range 0–1. Default 0.3. */
1105
+ /** Saturation. How hard the signal hits an asymmetric tape-style curve (−18 dB clean … +24 dB heavy). Quiet signals keep their level; loud peaks round off with warm even harmonics. Set-only (it reshapes the curve). Range 0–1. Default 0.3. */
1050
1106
  drive?: number;
1051
1107
  /** Cutoff. Lowpass filter frequency. Lower = more muffled, vintage sound. Range 500–8000 Hz. Default 4000. */
1052
1108
  cutoff?: Hz;
1053
- /** Vinyl Noise. Amount of background crackle and hiss for authentic vinyl character. Scaled onto the noise gain, so it is set-only (no single AudioParam carries it 1:1). Range 0–1. Default 0.2. */
1109
+ /** Vinyl Noise. Level of the vinyl surface noise: steady hiss (about −44 dBFS at full) plus random dust ticks and pops. Never repeats. Range 0–1. Default 0.2. */
1054
1110
  noise?: number;
1055
- /** Wobble. Pitch instability like a worn tape or warped record. Scaled onto the wobble-LFO gain, so it is set-only (no single AudioParam carries it 1:1). Range 0–1. Default 0.1. */
1111
+ /** Wobble. Wow like a worn tape or warped record: a slow 0.73 Hz pitch drift, about ±16 cents at full. Adds WOB × 2 ms of average delay; none at 0. Range 0–1. Default 0.1. */
1056
1112
  wobble?: number;
1057
1113
  }
1058
1114
  export type LoFiInputs = {
@@ -1070,6 +1126,10 @@ export type LoFiProps = {
1070
1126
  readonly params: {
1071
1127
  /** Cutoff. Native AudioParam — value is Hz 1:1. */
1072
1128
  "cutoff": AudioParam;
1129
+ /** Vinyl Noise. Native AudioParam — value is the param value 1:1. */
1130
+ "noise": AudioParam;
1131
+ /** Wobble. Native AudioParam — value is the param value 1:1. */
1132
+ "wobble": AudioParam;
1073
1133
  };
1074
1134
  };
1075
1135
  export declare const LoFi: LibModule<LoFiParams, LoFiInputs, LoFiOutputs, LoFiProps>;
@@ -1078,6 +1138,8 @@ export interface MidSideParams {
1078
1138
  midGain?: number;
1079
1139
  /** Side Gain. Controls the stereo edges/differences between left and right. Range 0–2. Default 1. */
1080
1140
  sideGain?: number;
1141
+ /** Stereo Width. Overall stereo width multiplier applied after side gain. 0=mono, 1=normal, 2=wide. Range 0–2. Default 1. */
1142
+ width?: number;
1081
1143
  }
1082
1144
  export type MidSideInputs = {
1083
1145
  "in": AudioNode;
@@ -1094,6 +1156,8 @@ export type MidSideProps = {
1094
1156
  "midGain": AudioParam;
1095
1157
  /** Side Gain. Native AudioParam — value is the param value 1:1. */
1096
1158
  "sideGain": AudioParam;
1159
+ /** Stereo Width. Native AudioParam — value is the param value 1:1. */
1160
+ "width": AudioParam;
1097
1161
  };
1098
1162
  };
1099
1163
  export declare const MidSide: LibModule<MidSideParams, MidSideInputs, MidSideOutputs, MidSideProps>;
@@ -1220,11 +1284,11 @@ export declare const PingPong: LibModule<PingPongParams, PingPongInputs, PingPon
1220
1284
  export interface ResonatorParams {
1221
1285
  /** Root Pitch Offset. Semitones added to the V/OCT input. Unpatched the input is silent, so this is the root note itself: 57 = A3 (220 Hz). Driven by a keyboard or sequencer, 0 tracks the incoming notes. Every partial follows. Range -48–108 semitones. Default 57. */
1222
1286
  offset?: Semitones;
1223
- /** Structure. Harmonic spacing of the resonator partials. Left = standard harmonic series, center = bell-like, right = metallic/inharmonic. Range 0–1. Default 0. */
1287
+ /** Structure. Harmonic spacing of the resonator partials. Left = standard harmonic series, center = bell-like, right = metallic/inharmonic. Loudness holds across the knob. Range 0–1. Default 0. */
1224
1288
  structure?: number;
1225
1289
  /** Damping. Decay time of the modes, exponential across the knob: at A3 the ring lasts ~10 s at 0, ~0.45 s at the centre and ~20 ms at 1 (T60 ≈ 2.2·Q/f, Q 1000 → 2). Upper partials fade faster than the root, as on a real string. Loudness holds across the range — less damping spreads the same strike over a longer ring instead of making it quieter. Range 0–1. Default 0.5. */
1226
1290
  damping?: number;
1227
- /** Dry/Wet Mix. Balance between original and resonated signal. Range 0–1. Default 0.5. */
1291
+ /** Dry/Wet Mix. Balance between the input and the ringing modes. Fully wet by default, like a hardware resonator: at 1 you hear only the modes; turn it down to keep the original transient under the ring. Range 0–1. Default 1. */
1228
1292
  mix?: number;
1229
1293
  }
1230
1294
  export type ResonatorInputs = {
@@ -1328,9 +1392,9 @@ export type RotaryProps = {
1328
1392
  };
1329
1393
  export declare const Rotary: LibModule<RotaryParams, RotaryInputs, RotaryOutputs, RotaryProps>;
1330
1394
  export interface SaturatorParams {
1331
- /** Drive. How hard to push into saturation. Adds harmonics and soft compression. Range 0–1. Default 0.5. */
1395
+ /** Drive. How hard the signal hits the tape curve, from −12 dB (clean) to +24 dB (heavy). The output is trimmed back by the same amount, like a tape machine aligned to its operating level: quiet signals pass at unity, loud peaks round off into harmonics and soft compression. DRIVE changes the tone, not the volume. Set-only (it reshapes the curve). Range 0–1. Default 0.5. */
1332
1396
  drive?: number;
1333
- /** Warmth. Low frequency emphasis for a thicker, analog-like tone. Range 0–1. Default 0.5. */
1397
+ /** Warmth. Low-shelf boost below 300 Hz, up to +6 dB, after the saturation. A tone control for low-end weight, not more distortion. Range 0–1. Default 0.5. */
1334
1398
  warmth?: number;
1335
1399
  /** Dry/Wet Mix. Balance between clean and saturated signal. Range 0–1. Default 1. */
1336
1400
  mix?: number;
@@ -1437,6 +1501,8 @@ export declare const SpringReverb: LibModule<SpringReverbParams, SpringReverbInp
1437
1501
  export interface StereoSpreadParams {
1438
1502
  /** Spread Amount. Controls the micro-delay time for Haas widening (0–5ms). More spread = wider perceived stereo image. Range 0–1. Default 0.7. */
1439
1503
  spread?: number;
1504
+ /** Dry/Wet. Balance between mono (0%) and widened (200%) high frequencies. Range 0–2. Default 1. */
1505
+ width?: number;
1440
1506
  /** Crossover Frequency. Frequency above which Haas spreading is applied. Lows below this stay centered for mono compatibility. Range 200–2000 Hz (log). Default 800. */
1441
1507
  center?: Hz;
1442
1508
  }
@@ -1450,7 +1516,10 @@ export type StereoSpreadOutputs = {
1450
1516
  export type StereoSpreadProps = {
1451
1517
  "in": AudioNode;
1452
1518
  "out": AudioNode;
1453
- readonly params: Record<never, never>;
1519
+ readonly params: {
1520
+ /** Dry/Wet. Native AudioParam — value is the param value 1:1. */
1521
+ "width": AudioParam;
1522
+ };
1454
1523
  };
1455
1524
  export declare const StereoSpread: LibModule<StereoSpreadParams, StereoSpreadInputs, StereoSpreadOutputs, StereoSpreadProps>;
1456
1525
  export interface SubharmonicParams {
@@ -1647,7 +1716,7 @@ export interface VcoParams {
1647
1716
  skew?: number;
1648
1717
  /** Waveshape Curvature. Curvature of the waveform: −1 square, 0 triangle, +1 sine. Range -1–1. Default 0. */
1649
1718
  shape?: number;
1650
- /** Pitch Offset. Semitones added to the V/OCT input (12 = one octave). Unpatched the input is silent, so this is the note itself: 69 = A4. Driven by an absolute pitch CV (keyboard, sequencer), set 0 to play as-is or ±12 to shift an octave. Range -48–108 semitones. Default 69. */
1719
+ /** Pitch Offset. Semitones added to the V/OCT input (12 = one octave). Unpatched, the input is silent (note 0, C−1), so the offset counts up from there: 69 semitones above C−1 = A4. Driven by an absolute pitch CV (keyboard, sequencer), set 0 to play as-is or ±12 to shift an octave. Range -48–108 semitones. Default 69. */
1651
1720
  offset?: Semitones;
1652
1721
  /** Detune. Fine pitch offset in semitones; ±1 = ±100 cents. Use for detuning oscillators against each other. Range -1–1 semitones. Default 0. */
1653
1722
  detune?: Semitones;
@@ -1691,7 +1760,7 @@ export interface WahParams {
1691
1760
  resonance?: number;
1692
1761
  /** Auto-Wah Rate. Speed of the automatic wah sweep in Hz. Range 0.1–10 Hz (log). Default 1. */
1693
1762
  rate?: Hz;
1694
- /** Modulation Depth. How much the frequency sweeps. Full depth ≈ 3 octaves. Range 0–1. Default 0.6. */
1763
+ /** Modulation Depth. How much the frequency sweeps. Full depth = 3 octaves top to bottom (±1.5 octaves around the center). Range 0–1. Default 0.6. */
1695
1764
  depth?: number;
1696
1765
  }
1697
1766
  export type WahInputs = {