@jpdutoit/squelchy 0.0.1 → 0.0.2

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.
@@ -0,0 +1,3332 @@
1
+ {
2
+ "AcidFilter": {
3
+ "name": "AcidFilter",
4
+ "panel": "303",
5
+ "import": "import { AcidFilter } from '@jpdutoit/squelchy';",
6
+ "summary": "TB-303 Acid Filter",
7
+ "description": "The iconic squelchy filter from the Roland TB-303. Features real triggered envelope that sweeps the cutoff for that classic acid house sound.",
8
+ "categories": [
9
+ "Filters"
10
+ ],
11
+ "inputs": {
12
+ "in": {
13
+ "signal": "audio",
14
+ "name": "Audio Input",
15
+ "description": "Audio signal for the iconic TB-303 acid filter sound.",
16
+ "target": "AudioNode"
17
+ },
18
+ "trigger": {
19
+ "signal": "gate",
20
+ "name": "Trigger Input",
21
+ "description": "Trigger the envelope sweep for classic acid patterns.",
22
+ "target": "AudioNode"
23
+ },
24
+ "modFreq": {
25
+ "signal": "modulation",
26
+ "name": "Cutoff V/Oct",
27
+ "description": "External modulation of cutoff in semitones (V/Oct). ±12 = one octave.",
28
+ "target": "AudioNode"
29
+ }
30
+ },
31
+ "outputs": {
32
+ "out": {
33
+ "signal": "audio",
34
+ "name": "Audio Output",
35
+ "description": "Squelchy, resonant acid bass output.",
36
+ "type": "AudioNode"
37
+ }
38
+ },
39
+ "params": {
40
+ "note": {
41
+ "name": "Cutoff Note",
42
+ "description": "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.",
43
+ "type": "Note",
44
+ "unit": "note",
45
+ "default": 67,
46
+ "min": 15,
47
+ "max": 135,
48
+ "automatable": true
49
+ },
50
+ "resonance": {
51
+ "name": "Resonance",
52
+ "description": "Resonance amount, 0–100% of travel. Creates the characteristic 303 \"wow\" at high settings. Like the hardware, there is no resonance CV input — the knob is the only control.",
53
+ "type": "number",
54
+ "unit": "factor",
55
+ "default": 8,
56
+ "min": 0,
57
+ "max": 15,
58
+ "scale": "sqrt",
59
+ "automatable": false
60
+ },
61
+ "envMod": {
62
+ "name": "Envelope Mod",
63
+ "description": "How much the triggered envelope sweeps the filter cutoff.",
64
+ "type": "number",
65
+ "unit": "factor",
66
+ "default": 0.7,
67
+ "min": 0,
68
+ "max": 1,
69
+ "automatable": false
70
+ },
71
+ "accent": {
72
+ "name": "Accent",
73
+ "description": "Intensifies the envelope sweep for more aggressive acid sounds.",
74
+ "type": "number",
75
+ "unit": "factor",
76
+ "default": 0.5,
77
+ "min": 0,
78
+ "max": 1,
79
+ "automatable": false
80
+ },
81
+ "decay": {
82
+ "name": "Decay Time",
83
+ "description": "How quickly the filter envelope falls. Short = plucky, long = sustained.",
84
+ "type": "Seconds",
85
+ "unit": "s",
86
+ "default": 0.2,
87
+ "min": 0.05,
88
+ "max": 1,
89
+ "scale": "log",
90
+ "automatable": true
91
+ }
92
+ }
93
+ },
94
+ "AutoPan": {
95
+ "name": "AutoPan",
96
+ "panel": "PAN",
97
+ "import": "import { AutoPan } from '@jpdutoit/squelchy';",
98
+ "summary": "Auto-Panner",
99
+ "description": "Stereo auto-panner using LFO-controlled panning. Creates movement and animation in the stereo field.",
100
+ "categories": [
101
+ "Effects",
102
+ "Stereo"
103
+ ],
104
+ "inputs": {
105
+ "in": {
106
+ "signal": "audio",
107
+ "name": "Audio Input",
108
+ "description": "Audio signal to pan across the stereo field.",
109
+ "target": "AudioNode"
110
+ },
111
+ "modRate": {
112
+ "signal": "modulation",
113
+ "name": "Rate CV",
114
+ "description": "Modulate the pan LFO speed.",
115
+ "target": "AudioParam"
116
+ },
117
+ "modDepth": {
118
+ "signal": "modulation",
119
+ "name": "Depth CV",
120
+ "description": "Modulate the pan sweep depth.",
121
+ "target": "AudioParam"
122
+ }
123
+ },
124
+ "outputs": {
125
+ "out": {
126
+ "signal": "audio",
127
+ "name": "Audio Output",
128
+ "description": "Stereo audio with automatic panning movement.",
129
+ "type": "AudioNode"
130
+ }
131
+ },
132
+ "params": {
133
+ "rate": {
134
+ "name": "Rate",
135
+ "description": "Panning LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam.",
136
+ "type": "Hz",
137
+ "unit": "Hz",
138
+ "default": 2,
139
+ "min": 0.1,
140
+ "max": 10,
141
+ "automatable": true
142
+ },
143
+ "depth": {
144
+ "name": "Depth",
145
+ "description": "How far the pan sweeps from left to right. 1 = full stereo sweep. modDepth sums into the same AudioParam.",
146
+ "type": "number",
147
+ "unit": "factor",
148
+ "default": 0.8,
149
+ "min": 0,
150
+ "max": 1,
151
+ "automatable": true
152
+ },
153
+ "shape": {
154
+ "name": "LFO Shape",
155
+ "description": "Waveform shape: sine for smooth, triangle for linear, square for hard left/right.",
156
+ "type": "\"sine\" | \"triangle\" | \"square\"",
157
+ "default": "sine",
158
+ "options": [
159
+ "sine",
160
+ "triangle",
161
+ "square"
162
+ ],
163
+ "automatable": false
164
+ }
165
+ }
166
+ },
167
+ "Bitcrusher": {
168
+ "name": "Bitcrusher",
169
+ "panel": "CRUSH",
170
+ "import": "import { Bitcrusher } from '@jpdutoit/squelchy';",
171
+ "summary": "Bitcrusher",
172
+ "description": "Lo-fi digital destruction. Reduces bit depth and sample rate for crunchy, retro video game sounds. RATE controls sample-and-hold decimation.",
173
+ "categories": [
174
+ "Distortion"
175
+ ],
176
+ "inputs": {
177
+ "in": {
178
+ "signal": "audio",
179
+ "name": "Audio Input",
180
+ "description": "Audio signal for lo-fi bit and sample rate reduction.",
181
+ "target": "AudioNode"
182
+ }
183
+ },
184
+ "outputs": {
185
+ "out": {
186
+ "signal": "audio",
187
+ "name": "Audio Output",
188
+ "description": "Crunchy, retro bit-crushed audio output.",
189
+ "type": "AudioNode"
190
+ }
191
+ },
192
+ "params": {
193
+ "bits": {
194
+ "name": "Bit Depth",
195
+ "description": "Number of bits for quantization. Lower = crunchier, more lo-fi.",
196
+ "type": "number",
197
+ "unit": "factor",
198
+ "default": 8,
199
+ "min": 1,
200
+ "max": 16,
201
+ "automatable": true
202
+ },
203
+ "rate": {
204
+ "name": "Sample Rate",
205
+ "description": "Sample rate reduction factor. 1 = original, lower = more aliased and crunchy. Creates the classic \"staircase\" sample-and-hold effect.",
206
+ "type": "number",
207
+ "unit": "factor",
208
+ "default": 0.5,
209
+ "min": 0.01,
210
+ "max": 1,
211
+ "scale": "log",
212
+ "automatable": true
213
+ },
214
+ "mix": {
215
+ "name": "Dry/Wet Mix",
216
+ "description": "Balance between clean and crushed signal.",
217
+ "type": "number",
218
+ "unit": "factor",
219
+ "default": 1,
220
+ "min": 0,
221
+ "max": 1,
222
+ "automatable": true
223
+ }
224
+ }
225
+ },
226
+ "Chorus": {
227
+ "name": "Chorus",
228
+ "panel": "CHORUS",
229
+ "import": "import { Chorus } from '@jpdutoit/squelchy';",
230
+ "summary": "Chorus Effect",
231
+ "description": "Stereo chorus: two delayed voices swept in antiphase by one LFO (left rises while right falls), over a centred dry signal — width and gentle detune from a mono source. Classic for pads, guitars, and synths.",
232
+ "categories": [
233
+ "Time",
234
+ "Effects"
235
+ ],
236
+ "inputs": {
237
+ "in": {
238
+ "signal": "audio",
239
+ "name": "Audio Input",
240
+ "description": "Audio signal to thicken with chorus effect.",
241
+ "target": "AudioNode"
242
+ },
243
+ "modRate": {
244
+ "signal": "modulation",
245
+ "name": "Rate CV",
246
+ "description": "Modulate the chorus sweep speed.",
247
+ "target": "AudioParam"
248
+ },
249
+ "modMix": {
250
+ "signal": "modulation",
251
+ "name": "Mix CV",
252
+ "description": "Modulate the dry/wet balance.",
253
+ "target": "AudioParam"
254
+ }
255
+ },
256
+ "outputs": {
257
+ "out": {
258
+ "signal": "audio",
259
+ "name": "Audio Output",
260
+ "description": "Stereo chorus output: dry centred, voices spread left/right.",
261
+ "type": "AudioNode"
262
+ }
263
+ },
264
+ "params": {
265
+ "rate": {
266
+ "name": "Rate",
267
+ "description": "Chorus sweep LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam.",
268
+ "type": "Hz",
269
+ "unit": "Hz",
270
+ "default": 1.5,
271
+ "min": 0.1,
272
+ "max": 5,
273
+ "automatable": true
274
+ },
275
+ "depth": {
276
+ "name": "Modulation Depth",
277
+ "description": "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).",
278
+ "type": "number",
279
+ "unit": "factor",
280
+ "default": 0.5,
281
+ "min": 0,
282
+ "max": 1,
283
+ "automatable": false
284
+ },
285
+ "mix": {
286
+ "name": "Dry/Wet Mix",
287
+ "description": "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).",
288
+ "type": "number",
289
+ "unit": "factor",
290
+ "default": 0.5,
291
+ "min": 0,
292
+ "max": 1,
293
+ "automatable": true
294
+ }
295
+ }
296
+ },
297
+ "CombFilter": {
298
+ "name": "CombFilter",
299
+ "panel": "COMB",
300
+ "import": "import { CombFilter } from '@jpdutoit/squelchy';",
301
+ "summary": "Comb Filter",
302
+ "description": "Karplus-Strong style comb filter using short delay with feedback. Creates metallic, resonant, and pitched tones from any input.",
303
+ "categories": [
304
+ "Filters"
305
+ ],
306
+ "inputs": {
307
+ "in": {
308
+ "signal": "audio",
309
+ "name": "Audio Input",
310
+ "description": "Audio signal for comb filtering.",
311
+ "target": "AudioNode"
312
+ },
313
+ "voct": {
314
+ "signal": "pitch",
315
+ "name": "Pitch CV",
316
+ "description": "Pitch CV input — plays the comb chromatically from keyboard or sequencer CV. Set TUNING to CHROMATIC for scale-true tracking.",
317
+ "target": "AudioNode"
318
+ },
319
+ "modFreq": {
320
+ "signal": "modulation",
321
+ "name": "Pitch FM",
322
+ "description": "Frequency modulation in semitones. ±12 = one octave. Connect an LFO or envelope for musical sweeps.",
323
+ "target": "AudioNode"
324
+ }
325
+ },
326
+ "outputs": {
327
+ "out": {
328
+ "signal": "audio",
329
+ "name": "Audio Output",
330
+ "description": "Metallic, resonant comb-filtered audio output.",
331
+ "type": "AudioNode"
332
+ }
333
+ },
334
+ "params": {
335
+ "offset": {
336
+ "name": "Pitch Offset",
337
+ "description": "Semitones added to the V/OCT input (12 = one octave). Unpatched the input is silent, so this is the comb note itself: 55 ≈ 196 Hz, 69 = 440 Hz. Driven by an absolute pitch CV, set 0 to track it as-is.",
338
+ "type": "Semitones",
339
+ "unit": "semitone",
340
+ "default": 55,
341
+ "min": -48,
342
+ "max": 96,
343
+ "automatable": true
344
+ },
345
+ "feedback": {
346
+ "name": "Feedback",
347
+ "description": "Resonance amount. Higher values create more pronounced, ringing tones.",
348
+ "type": "number",
349
+ "unit": "factor",
350
+ "default": 0.7,
351
+ "min": 0,
352
+ "max": 0.95,
353
+ "automatable": true
354
+ },
355
+ "mix": {
356
+ "name": "Dry/Wet Mix",
357
+ "description": "Balance between original and comb-filtered signal.",
358
+ "type": "number",
359
+ "unit": "factor",
360
+ "default": 0.5,
361
+ "min": 0,
362
+ "max": 1,
363
+ "automatable": true
364
+ },
365
+ "tuning": {
366
+ "name": "Tuning Mode",
367
+ "description": "CHROMATIC snaps the FREQ knob to semitones; FREE allows continuous tuning.",
368
+ "type": "\"chromatic\" | \"free\"",
369
+ "default": "chromatic",
370
+ "options": [
371
+ "chromatic",
372
+ "free"
373
+ ],
374
+ "automatable": false
375
+ }
376
+ }
377
+ },
378
+ "Compressor": {
379
+ "name": "Compressor",
380
+ "panel": "COMP",
381
+ "import": "import { Compressor } from '@jpdutoit/squelchy';",
382
+ "summary": "Dynamics Compressor",
383
+ "description": "Reduces dynamic range by attenuating loud signals. Threshold sets where compression begins, ratio controls intensity.",
384
+ "categories": [
385
+ "Dynamics"
386
+ ],
387
+ "inputs": {
388
+ "in": {
389
+ "signal": "audio",
390
+ "name": "Audio Input",
391
+ "description": "Audio signal to compress.",
392
+ "target": "AudioNode"
393
+ }
394
+ },
395
+ "outputs": {
396
+ "out": {
397
+ "signal": "audio",
398
+ "name": "Audio Output",
399
+ "description": "Compressed audio with makeup gain applied.",
400
+ "type": "AudioNode"
401
+ }
402
+ },
403
+ "params": {
404
+ "threshold": {
405
+ "name": "Threshold",
406
+ "description": "Level above which compression kicks in. Lower = more compression.",
407
+ "type": "Decibels",
408
+ "unit": "dB",
409
+ "default": -24,
410
+ "min": -60,
411
+ "max": 0,
412
+ "automatable": true
413
+ },
414
+ "ratio": {
415
+ "name": "Ratio",
416
+ "description": "How much to reduce signal above threshold. 4:1 = every 4dB over becomes 1dB.",
417
+ "type": "number",
418
+ "unit": "factor",
419
+ "default": 4,
420
+ "min": 1,
421
+ "max": 20,
422
+ "scale": "log",
423
+ "automatable": true
424
+ },
425
+ "attack": {
426
+ "name": "Attack",
427
+ "description": "How fast compression responds to loud signals.",
428
+ "type": "Seconds",
429
+ "unit": "s",
430
+ "default": 0.003,
431
+ "min": 0.001,
432
+ "max": 1,
433
+ "scale": "log",
434
+ "automatable": true
435
+ },
436
+ "release": {
437
+ "name": "Release",
438
+ "description": "How fast compression releases after signal drops.",
439
+ "type": "Seconds",
440
+ "unit": "s",
441
+ "default": 0.25,
442
+ "min": 0.01,
443
+ "max": 1,
444
+ "scale": "log",
445
+ "automatable": true
446
+ },
447
+ "knee": {
448
+ "name": "Knee",
449
+ "description": "Width of the transition zone around the threshold. 0 = hard knee (abrupt), 40 = soft knee (gradual).",
450
+ "type": "Decibels",
451
+ "unit": "dB",
452
+ "default": 10,
453
+ "min": 0,
454
+ "max": 40,
455
+ "automatable": true
456
+ },
457
+ "makeup": {
458
+ "name": "Makeup Gain",
459
+ "description": "Boosts the output level to compensate for gain reduction. Up to +30 dB.",
460
+ "type": "Decibels",
461
+ "unit": "dB",
462
+ "default": 0,
463
+ "min": 0,
464
+ "max": 30,
465
+ "automatable": false
466
+ }
467
+ }
468
+ },
469
+ "Crossfade": {
470
+ "name": "Crossfade",
471
+ "panel": "X-FADE",
472
+ "import": "import { Crossfade } from '@jpdutoit/squelchy';",
473
+ "summary": "Crossfader",
474
+ "description": "Blends between two input signals. Equal-power curve maintains consistent volume. Essential DJ tool and utility for mixing sources.",
475
+ "categories": [
476
+ "Utility"
477
+ ],
478
+ "inputs": {
479
+ "a": {
480
+ "signal": "audio",
481
+ "name": "Input A",
482
+ "description": "First audio source for crossfading.",
483
+ "target": "AudioNode"
484
+ },
485
+ "b": {
486
+ "signal": "audio",
487
+ "name": "Input B",
488
+ "description": "Second audio source for crossfading.",
489
+ "target": "AudioNode"
490
+ }
491
+ },
492
+ "outputs": {
493
+ "out": {
494
+ "signal": "audio",
495
+ "name": "Audio Output",
496
+ "description": "Blended mix of inputs A and B.",
497
+ "type": "AudioNode"
498
+ }
499
+ },
500
+ "params": {
501
+ "blend": {
502
+ "name": "Crossfade Position",
503
+ "description": "Position between inputs. 0 = all A, 1 = all B.",
504
+ "type": "number",
505
+ "unit": "factor",
506
+ "default": 0.5,
507
+ "min": 0,
508
+ "max": 1,
509
+ "automatable": true
510
+ },
511
+ "curve": {
512
+ "name": "Curve Type",
513
+ "description": "Linear or equal-power crossfade curve.",
514
+ "type": "\"linear\" | \"equal-power\"",
515
+ "default": "equal-power",
516
+ "options": [
517
+ "linear",
518
+ "equal-power"
519
+ ],
520
+ "automatable": false
521
+ }
522
+ }
523
+ },
524
+ "Delay": {
525
+ "name": "Delay",
526
+ "panel": "DELAY",
527
+ "import": "import { Delay } from '@jpdutoit/squelchy';",
528
+ "summary": "Echo Effect",
529
+ "description": "Creates repeating echoes of the input signal. Adjust time, feedback for number of repeats, and mix for wet/dry balance.",
530
+ "categories": [
531
+ "Time"
532
+ ],
533
+ "inputs": {
534
+ "in": {
535
+ "signal": "audio",
536
+ "name": "Audio Input",
537
+ "description": "Audio signal to be delayed.",
538
+ "target": "AudioNode"
539
+ }
540
+ },
541
+ "outputs": {
542
+ "out": {
543
+ "signal": "audio",
544
+ "name": "Audio Output",
545
+ "description": "Delayed audio signal mixed with dry signal.",
546
+ "type": "AudioNode"
547
+ }
548
+ },
549
+ "params": {
550
+ "time": {
551
+ "name": "Delay Time",
552
+ "description": "Time between original signal and echo. Sync to tempo for rhythmic effects.",
553
+ "type": "Seconds",
554
+ "unit": "s",
555
+ "default": 0.3,
556
+ "min": 0.01,
557
+ "max": 1,
558
+ "scale": "log",
559
+ "automatable": true
560
+ },
561
+ "feedback": {
562
+ "name": "Feedback",
563
+ "description": "How much delayed signal feeds back. Higher = more repeats. Be careful of runaway feedback!",
564
+ "type": "number",
565
+ "unit": "factor",
566
+ "default": 0.4,
567
+ "min": 0,
568
+ "max": 0.95,
569
+ "automatable": true
570
+ },
571
+ "mix": {
572
+ "name": "Dry/Wet Mix",
573
+ "description": "Balance between original (dry) and delayed (wet) signal.",
574
+ "type": "number",
575
+ "unit": "factor",
576
+ "default": 0.5,
577
+ "min": 0,
578
+ "max": 1,
579
+ "automatable": true
580
+ }
581
+ }
582
+ },
583
+ "Dimension": {
584
+ "name": "Dimension",
585
+ "panel": "DIM",
586
+ "import": "import { Dimension } from '@jpdutoit/squelchy';",
587
+ "summary": "Dimension Expander",
588
+ "description": "Roland Dimension-D inspired stereo widener. Adds subtle modulation to create spacious, wide stereo images. Classic 80s lush pad sound.",
589
+ "categories": [
590
+ "Effects"
591
+ ],
592
+ "inputs": {
593
+ "in": {
594
+ "signal": "audio",
595
+ "name": "Audio Input",
596
+ "description": "Audio signal for stereo widening.",
597
+ "target": "AudioNode"
598
+ },
599
+ "modRate": {
600
+ "signal": "modulation",
601
+ "name": "Rate CV",
602
+ "description": "Modulate the widening LFO speed.",
603
+ "target": "AudioParam"
604
+ }
605
+ },
606
+ "outputs": {
607
+ "out": {
608
+ "signal": "audio",
609
+ "name": "Audio Output",
610
+ "description": "Spacious, wide stereo audio with subtle modulation.",
611
+ "type": "AudioNode"
612
+ }
613
+ },
614
+ "params": {
615
+ "rate": {
616
+ "name": "Rate",
617
+ "description": "Widening LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam.",
618
+ "type": "Hz",
619
+ "unit": "Hz",
620
+ "default": 0.5,
621
+ "min": 0.1,
622
+ "max": 5,
623
+ "automatable": true
624
+ },
625
+ "depth": {
626
+ "name": "Modulation Depth",
627
+ "description": "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).",
628
+ "type": "number",
629
+ "unit": "factor",
630
+ "default": 0.3,
631
+ "min": 0,
632
+ "max": 1,
633
+ "automatable": false
634
+ }
635
+ }
636
+ },
637
+ "Distortion": {
638
+ "name": "Distortion",
639
+ "panel": "DIST",
640
+ "import": "import { Distortion } from '@jpdutoit/squelchy';",
641
+ "summary": "Distortion Effect",
642
+ "description": "Three clipping circuits: soft (tanh overdrive), hard (true rail clipper — flattens to a square at high drive), fuzz (biased asymmetric saturator with even harmonics). Output is loudness-compensated so DRIVE and TYPE shape timbre, not volume; TONE tames the fizz.",
643
+ "categories": [
644
+ "Distortion"
645
+ ],
646
+ "inputs": {
647
+ "in": {
648
+ "signal": "audio",
649
+ "name": "Audio Input",
650
+ "description": "Clean audio signal to distort.",
651
+ "target": "AudioNode"
652
+ }
653
+ },
654
+ "outputs": {
655
+ "out": {
656
+ "signal": "audio",
657
+ "name": "Audio Output",
658
+ "description": "Distorted audio signal output.",
659
+ "type": "AudioNode"
660
+ }
661
+ },
662
+ "params": {
663
+ "distortionType": {
664
+ "name": "Clipping Curve",
665
+ "description": "Which clipping transfer curve the signal is pushed into.",
666
+ "type": "\"soft\" | \"hard\" | \"fuzz\"",
667
+ "default": "soft",
668
+ "options": [
669
+ "soft",
670
+ "hard",
671
+ "fuzz"
672
+ ],
673
+ "automatable": false
674
+ },
675
+ "drive": {
676
+ "name": "Drive Amount",
677
+ "description": "How hard the signal is pushed into the clipping curve. The whole travel is usable: low = warm break-up, high = full clipping.",
678
+ "type": "number",
679
+ "unit": "factor",
680
+ "default": 5,
681
+ "min": 1,
682
+ "max": 20,
683
+ "scale": "log",
684
+ "automatable": false
685
+ },
686
+ "frequency": {
687
+ "name": "Tone",
688
+ "description": "Post-clip lowpass (500 Hz – 16 kHz). Turn down to tame the high-frequency fizz clipping creates — the Filter knob on a RAT.",
689
+ "type": "Hz",
690
+ "unit": "Hz",
691
+ "default": 16000,
692
+ "min": 500,
693
+ "max": 16000,
694
+ "scale": "log",
695
+ "automatable": true
696
+ },
697
+ "mix": {
698
+ "name": "Dry/Wet Mix",
699
+ "description": "Balance between clean and distorted signal. Low settings give parallel distortion.",
700
+ "type": "number",
701
+ "unit": "factor",
702
+ "default": 0.8,
703
+ "min": 0,
704
+ "max": 1,
705
+ "automatable": true
706
+ }
707
+ }
708
+ },
709
+ "Ducker": {
710
+ "name": "Ducker",
711
+ "panel": "DUCK",
712
+ "import": "import { Ducker } from '@jpdutoit/squelchy';",
713
+ "summary": "Sidechain Ducker",
714
+ "description": "Ducks the input whenever the sidechain reaches the threshold, using a sample-accurate follower with separate attack and release. The detector saturates like a real sidechain circuit, so a hot kick does not wind it up — REL always sets how fast the signal breathes back. Classic pumping effect for EDM and mixing.",
715
+ "categories": [
716
+ "Dynamics"
717
+ ],
718
+ "inputs": {
719
+ "in": {
720
+ "signal": "audio",
721
+ "name": "Audio Input",
722
+ "description": "Main audio signal to be ducked.",
723
+ "target": "AudioNode"
724
+ },
725
+ "sc": {
726
+ "signal": "audio",
727
+ "name": "Sidechain Input",
728
+ "description": "Control signal that triggers ducking. When this exceeds threshold, main input is attenuated.",
729
+ "target": "AudioNode"
730
+ }
731
+ },
732
+ "outputs": {
733
+ "out": {
734
+ "signal": "audio",
735
+ "name": "Audio Output",
736
+ "description": "Ducked audio output with sidechain-controlled dynamics.",
737
+ "type": "AudioNode"
738
+ }
739
+ },
740
+ "params": {
741
+ "threshold": {
742
+ "name": "Threshold",
743
+ "description": "Sidechain level that triggers ducking. Lower = more sensitive.",
744
+ "type": "Decibels",
745
+ "unit": "dB",
746
+ "default": -24,
747
+ "min": -60,
748
+ "max": 0,
749
+ "automatable": false
750
+ },
751
+ "amount": {
752
+ "name": "Duck Amount",
753
+ "description": "How much to reduce the main signal when triggered.",
754
+ "type": "number",
755
+ "unit": "factor",
756
+ "default": 0.7,
757
+ "min": 0,
758
+ "max": 1,
759
+ "automatable": false
760
+ },
761
+ "attack": {
762
+ "name": "Attack",
763
+ "description": "How fast ducking kicks in after sidechain exceeds threshold.",
764
+ "type": "Seconds",
765
+ "unit": "s",
766
+ "default": 0.01,
767
+ "min": 0.001,
768
+ "max": 0.1,
769
+ "scale": "log",
770
+ "automatable": true
771
+ },
772
+ "release": {
773
+ "name": "Release",
774
+ "description": "How fast signal returns to normal after sidechain drops.",
775
+ "type": "Seconds",
776
+ "unit": "s",
777
+ "default": 0.2,
778
+ "min": 0.001,
779
+ "max": 1,
780
+ "scale": "log",
781
+ "automatable": true
782
+ }
783
+ }
784
+ },
785
+ "EnvelopeFollower": {
786
+ "name": "EnvelopeFollower",
787
+ "panel": "ENV-F",
788
+ "import": "import { EnvelopeFollower } from '@jpdutoit/squelchy';",
789
+ "summary": "Envelope Follower",
790
+ "description": "Extracts the amplitude envelope from audio using sample-accurate asymmetric smoothing. Separate attack and release times for precise dynamic tracking. Depth scales the CV output for modulating filters, VCAs, etc.",
791
+ "categories": [
792
+ "Modulators",
793
+ "Utility"
794
+ ],
795
+ "inputs": {
796
+ "in": {
797
+ "signal": "audio",
798
+ "name": "Audio Input",
799
+ "description": "Audio signal to analyze for envelope.",
800
+ "target": "AudioNode"
801
+ }
802
+ },
803
+ "outputs": {
804
+ "env": {
805
+ "signal": "modulation",
806
+ "name": "Envelope CV",
807
+ "description": "Amplitude envelope CV, scaled by DEPTH. Connect to filter, VCA, or other modulation inputs.",
808
+ "type": "AudioNode"
809
+ }
810
+ },
811
+ "params": {
812
+ "attack": {
813
+ "name": "Attack Time",
814
+ "description": "How quickly the envelope responds to rising levels. Shorter = snappier transient tracking.",
815
+ "type": "Seconds",
816
+ "unit": "s",
817
+ "default": 0.01,
818
+ "min": 0.001,
819
+ "max": 0.5,
820
+ "scale": "log",
821
+ "automatable": true
822
+ },
823
+ "release": {
824
+ "name": "Release Time",
825
+ "description": "How quickly the envelope responds to falling levels. Longer = smoother, more sustained envelope.",
826
+ "type": "Seconds",
827
+ "unit": "s",
828
+ "default": 0.1,
829
+ "min": 0.001,
830
+ "max": 2,
831
+ "scale": "log",
832
+ "automatable": true
833
+ },
834
+ "sensitivity": {
835
+ "name": "Sensitivity",
836
+ "description": "Input gain before envelope detection. Higher = more responsive to quiet signals.",
837
+ "type": "number",
838
+ "unit": "factor",
839
+ "default": 0.5,
840
+ "min": 0,
841
+ "max": 1,
842
+ "automatable": false
843
+ },
844
+ "depth": {
845
+ "name": "Output Depth",
846
+ "description": "Scales the CV output amplitude. For V/Oct filter targets, 12 semitones = one octave, so 48 ≈ four octaves. For VCA or other targets, use lower values (0.5–2).",
847
+ "type": "Semitones",
848
+ "unit": "semitone",
849
+ "default": 48,
850
+ "min": 0,
851
+ "max": 96,
852
+ "scale": "sqrt",
853
+ "automatable": true
854
+ }
855
+ }
856
+ },
857
+ "Envelope": {
858
+ "name": "Envelope",
859
+ "panel": "ADSR",
860
+ "import": "import { Envelope } from '@jpdutoit/squelchy';",
861
+ "summary": "ADSR Envelope",
862
+ "description": "Shapes how a sound evolves over time. Connect a gate signal to TRIG (from keyboard or sequencer) to trigger the Attack→Decay→Sustain→Release cycle.",
863
+ "categories": [
864
+ "Modulators"
865
+ ],
866
+ "inputs": {
867
+ "in": {
868
+ "signal": "audio",
869
+ "name": "Audio Input",
870
+ "description": "Audio signal to shape with the envelope.",
871
+ "target": "AudioNode"
872
+ },
873
+ "trigger": {
874
+ "signal": "gate",
875
+ "name": "Trigger Input",
876
+ "description": "Connect a gate signal (from keyboard or sequencer) to trigger the envelope cycle.",
877
+ "target": "AudioNode"
878
+ }
879
+ },
880
+ "outputs": {
881
+ "out": {
882
+ "signal": "audio",
883
+ "name": "Audio Output",
884
+ "description": "Envelope-shaped audio output.",
885
+ "type": "AudioNode"
886
+ },
887
+ "env": {
888
+ "signal": "modulation",
889
+ "name": "Envelope CV",
890
+ "description": "Scaled envelope output. Use DEPTH to control how much the envelope sweeps the target.",
891
+ "type": "AudioNode"
892
+ }
893
+ },
894
+ "params": {
895
+ "attack": {
896
+ "name": "Attack",
897
+ "description": "Time for signal to rise from zero to full level when triggered.",
898
+ "type": "Seconds",
899
+ "unit": "s",
900
+ "default": 0.01,
901
+ "min": 0.001,
902
+ "max": 2,
903
+ "scale": "log",
904
+ "automatable": true
905
+ },
906
+ "decay": {
907
+ "name": "Decay",
908
+ "description": "Time to fall from peak to sustain level after attack completes.",
909
+ "type": "Seconds",
910
+ "unit": "s",
911
+ "default": 0.1,
912
+ "min": 0.001,
913
+ "max": 2,
914
+ "scale": "log",
915
+ "automatable": true
916
+ },
917
+ "sustain": {
918
+ "name": "Sustain",
919
+ "description": "Level held while the note is held. 0 = plucky, 1 = organ-like.",
920
+ "type": "number",
921
+ "unit": "factor",
922
+ "default": 0.7,
923
+ "min": 0,
924
+ "max": 1,
925
+ "automatable": true
926
+ },
927
+ "release": {
928
+ "name": "Release",
929
+ "description": "Time to fade to silence after note is released.",
930
+ "type": "Seconds",
931
+ "unit": "s",
932
+ "default": 0.3,
933
+ "min": 0.001,
934
+ "max": 3,
935
+ "scale": "log",
936
+ "automatable": true
937
+ },
938
+ "depth": {
939
+ "name": "ENV Depth",
940
+ "description": "Scales the ENV output in semitones (12 = one octave), the unit every pitch and cutoff modulation input on this rack reads. Higher values produce a wider sweep on the modulation target.",
941
+ "type": "Semitones",
942
+ "unit": "semitone",
943
+ "default": 48,
944
+ "min": 0,
945
+ "max": 96,
946
+ "scale": "sqrt",
947
+ "automatable": true
948
+ }
949
+ }
950
+ },
951
+ "ThreeBandEq": {
952
+ "name": "ThreeBandEq",
953
+ "panel": "EQ3",
954
+ "import": "import { ThreeBandEq } from '@jpdutoit/squelchy';",
955
+ "summary": "3-Band Equalizer",
956
+ "description": "Shape your sound with bass, mid, and treble controls. Boost or cut frequencies by up to 12dB. Essential for mixing and tone shaping.",
957
+ "categories": [
958
+ "Filters"
959
+ ],
960
+ "inputs": {
961
+ "in": {
962
+ "signal": "audio",
963
+ "name": "Audio Input",
964
+ "description": "Audio signal to be equalized.",
965
+ "target": "AudioNode"
966
+ }
967
+ },
968
+ "outputs": {
969
+ "out": {
970
+ "signal": "audio",
971
+ "name": "Audio Output",
972
+ "description": "Tone-shaped equalized audio output.",
973
+ "type": "AudioNode"
974
+ }
975
+ },
976
+ "params": {
977
+ "low": {
978
+ "name": "Bass",
979
+ "description": "Low shelf gain at 320 Hz. Boost for warmth, cut for clarity.",
980
+ "type": "Decibels",
981
+ "unit": "dB",
982
+ "default": 0,
983
+ "min": -12,
984
+ "max": 12,
985
+ "automatable": true
986
+ },
987
+ "mid": {
988
+ "name": "Midrange",
989
+ "description": "Peaking gain at the mid frequency. The presence and body range.",
990
+ "type": "Decibels",
991
+ "unit": "dB",
992
+ "default": 0,
993
+ "min": -12,
994
+ "max": 12,
995
+ "automatable": true
996
+ },
997
+ "high": {
998
+ "name": "Treble",
999
+ "description": "High shelf gain at 3.2 kHz. Boost for brightness, cut for smoothness.",
1000
+ "type": "Decibels",
1001
+ "unit": "dB",
1002
+ "default": 0,
1003
+ "min": -12,
1004
+ "max": 12,
1005
+ "automatable": true
1006
+ },
1007
+ "midFreq": {
1008
+ "name": "Mid Frequency",
1009
+ "description": "Center frequency for the mid band EQ.",
1010
+ "type": "Hz",
1011
+ "unit": "Hz",
1012
+ "default": 1000,
1013
+ "min": 200,
1014
+ "max": 5000,
1015
+ "scale": "log",
1016
+ "automatable": true
1017
+ }
1018
+ }
1019
+ },
1020
+ "Exciter": {
1021
+ "name": "Exciter",
1022
+ "panel": "EXCITE",
1023
+ "import": "import { Exciter } from '@jpdutoit/squelchy';",
1024
+ "summary": "Harmonic Exciter",
1025
+ "description": "Adds high-frequency harmonics and \"air\" to dull signals. Generates subtle saturation in the treble range for presence and sparkle.",
1026
+ "categories": [
1027
+ "Dynamics"
1028
+ ],
1029
+ "inputs": {
1030
+ "in": {
1031
+ "signal": "audio",
1032
+ "name": "Audio Input",
1033
+ "description": "Audio signal for harmonic enhancement.",
1034
+ "target": "AudioNode"
1035
+ }
1036
+ },
1037
+ "outputs": {
1038
+ "out": {
1039
+ "signal": "audio",
1040
+ "name": "Audio Output",
1041
+ "description": "Bright, exciting audio with added harmonics.",
1042
+ "type": "AudioNode"
1043
+ }
1044
+ },
1045
+ "params": {
1046
+ "drive": {
1047
+ "name": "Drive",
1048
+ "description": "Amount of harmonic saturation added to high frequencies.",
1049
+ "type": "number",
1050
+ "unit": "factor",
1051
+ "default": 0.5,
1052
+ "min": 0,
1053
+ "max": 1,
1054
+ "automatable": false
1055
+ },
1056
+ "frequency": {
1057
+ "name": "Frequency",
1058
+ "description": "Cutoff frequency above which excitement is applied.",
1059
+ "type": "Hz",
1060
+ "unit": "Hz",
1061
+ "default": 4000,
1062
+ "min": 2000,
1063
+ "max": 8000,
1064
+ "scale": "log",
1065
+ "automatable": false
1066
+ },
1067
+ "mix": {
1068
+ "name": "Mix Amount",
1069
+ "description": "How much excited signal is added to the original.",
1070
+ "type": "number",
1071
+ "unit": "factor",
1072
+ "default": 0.5,
1073
+ "min": 0,
1074
+ "max": 1,
1075
+ "automatable": true
1076
+ }
1077
+ }
1078
+ },
1079
+ "Flanger": {
1080
+ "name": "Flanger",
1081
+ "panel": "FLANGER",
1082
+ "import": "import { Flanger } from '@jpdutoit/squelchy';",
1083
+ "summary": "Flanger Effect",
1084
+ "description": "Creates jet-plane swooshing by mixing signal with a short modulated delay. The feedback control adds metallic resonance for dramatic sweeps.",
1085
+ "categories": [
1086
+ "Time",
1087
+ "Effects"
1088
+ ],
1089
+ "inputs": {
1090
+ "in": {
1091
+ "signal": "audio",
1092
+ "name": "Audio Input",
1093
+ "description": "Audio signal for flanging effect.",
1094
+ "target": "AudioNode"
1095
+ },
1096
+ "modRate": {
1097
+ "signal": "modulation",
1098
+ "name": "Rate CV",
1099
+ "description": "Modulate the flanger sweep speed.",
1100
+ "target": "AudioParam"
1101
+ },
1102
+ "modDepth": {
1103
+ "signal": "modulation",
1104
+ "name": "Depth CV",
1105
+ "description": "Modulate the flanger modulation depth.",
1106
+ "target": "AudioParam"
1107
+ },
1108
+ "modFeedback": {
1109
+ "signal": "modulation",
1110
+ "name": "Feedback CV",
1111
+ "description": "Modulate the resonance feedback amount.",
1112
+ "target": "AudioParam"
1113
+ },
1114
+ "modMix": {
1115
+ "signal": "modulation",
1116
+ "name": "Mix CV",
1117
+ "description": "Modulate the dry/wet balance.",
1118
+ "target": "AudioParam"
1119
+ }
1120
+ },
1121
+ "outputs": {
1122
+ "out": {
1123
+ "signal": "audio",
1124
+ "name": "Audio Output",
1125
+ "description": "Swooshing, jet-plane flanged audio output.",
1126
+ "type": "AudioNode"
1127
+ }
1128
+ },
1129
+ "params": {
1130
+ "rate": {
1131
+ "name": "Rate",
1132
+ "description": "Flanger sweep LFO speed, a real a-rate AudioParam on the worklet. modRate sums into the same AudioParam.",
1133
+ "type": "Hz",
1134
+ "unit": "Hz",
1135
+ "default": 0.5,
1136
+ "min": 0.1,
1137
+ "max": 5,
1138
+ "automatable": true
1139
+ },
1140
+ "depth": {
1141
+ "name": "Modulation Depth",
1142
+ "description": "How much the delay time is modulated, a real AudioParam on the worklet. modDepth sums into the same AudioParam.",
1143
+ "type": "number",
1144
+ "unit": "factor",
1145
+ "default": 0.7,
1146
+ "min": 0,
1147
+ "max": 1,
1148
+ "automatable": true
1149
+ },
1150
+ "feedback": {
1151
+ "name": "Feedback",
1152
+ "description": "Resonance amount, a real AudioParam on the worklet. modFeedback sums into the same AudioParam.",
1153
+ "type": "number",
1154
+ "unit": "factor",
1155
+ "default": 0.7,
1156
+ "min": 0,
1157
+ "max": 0.95,
1158
+ "automatable": true
1159
+ },
1160
+ "mix": {
1161
+ "name": "Dry/Wet Mix",
1162
+ "description": "Crossfade between original and flanged signal, driven by one ConstantSource (linear law: dry = 1 − mix, wet = mix).",
1163
+ "type": "number",
1164
+ "unit": "factor",
1165
+ "default": 0.5,
1166
+ "min": 0,
1167
+ "max": 1,
1168
+ "automatable": true
1169
+ }
1170
+ }
1171
+ },
1172
+ "Formant": {
1173
+ "name": "Formant",
1174
+ "panel": "FORMANT",
1175
+ "import": "import { Formant } from '@jpdutoit/squelchy';",
1176
+ "summary": "Formant Filter",
1177
+ "description": "Vocal formant filter with smooth morphing between vowels A-E-I-O-U. Creates voice-like resonances. Morph smoothly between vowel sounds for talking synth effects.",
1178
+ "categories": [
1179
+ "Filters"
1180
+ ],
1181
+ "inputs": {
1182
+ "in": {
1183
+ "signal": "audio",
1184
+ "name": "Audio Input",
1185
+ "description": "Audio signal for vowel/formant filtering.",
1186
+ "target": "AudioNode"
1187
+ },
1188
+ "modVowel": {
1189
+ "signal": "modulation",
1190
+ "name": "Vowel CV",
1191
+ "description": "Control voltage to sweep through vowels A-E-I-O-U.",
1192
+ "target": "AudioNode"
1193
+ }
1194
+ },
1195
+ "outputs": {
1196
+ "out": {
1197
+ "signal": "audio",
1198
+ "name": "Audio Output",
1199
+ "description": "Vocal-like formant filtered audio output.",
1200
+ "type": "AudioNode"
1201
+ }
1202
+ },
1203
+ "params": {
1204
+ "morph": {
1205
+ "name": "Vowel Morph",
1206
+ "description": "Position along the A-E-I-O-U vowel formant chain. 0 = A, 5 wraps back to A; fractional values interpolate between neighbouring vowels.",
1207
+ "type": "number",
1208
+ "unit": "factor",
1209
+ "default": 0,
1210
+ "min": 0,
1211
+ "max": 5,
1212
+ "automatable": false
1213
+ },
1214
+ "resonance": {
1215
+ "name": "Resonance",
1216
+ "description": "Sharpness of the formant peaks, scaled per band. Higher values sound more pronounced and vocal.",
1217
+ "type": "number",
1218
+ "unit": "factor",
1219
+ "default": 6,
1220
+ "min": 1,
1221
+ "max": 20,
1222
+ "scale": "sqrt",
1223
+ "automatable": false
1224
+ },
1225
+ "mix": {
1226
+ "name": "Dry/Wet Mix",
1227
+ "description": "Balance between the original signal and the formant-filtered output. 0 = dry, 1 = fully wet.",
1228
+ "type": "number",
1229
+ "unit": "factor",
1230
+ "default": 1,
1231
+ "min": 0,
1232
+ "max": 1,
1233
+ "automatable": false
1234
+ }
1235
+ }
1236
+ },
1237
+ "FrequencyShifter": {
1238
+ "name": "FrequencyShifter",
1239
+ "panel": "SHIFT",
1240
+ "import": "import { FrequencyShifter } from '@jpdutoit/squelchy';",
1241
+ "summary": "Frequency Shifter",
1242
+ "description": "True Bode-style single-sideband shifting: a Hilbert-transform quadrature network splits the signal into an analytic pair, so every partial moves by a fixed number of Hz instead of a musical interval. Inharmonic, alien, bell-like — and unlike a ring modulator, only one sideband survives.",
1243
+ "categories": [
1244
+ "Effects"
1245
+ ],
1246
+ "inputs": {
1247
+ "in": {
1248
+ "signal": "audio",
1249
+ "name": "Audio Input",
1250
+ "description": "Audio signal for frequency shifting.",
1251
+ "target": "AudioNode"
1252
+ },
1253
+ "modShift": {
1254
+ "signal": "modulation",
1255
+ "name": "Shift Amount",
1256
+ "description": "Modulate the shift amount in Hz. An LFO here sweeps the sidebands for rotating, Leslie-like motion.",
1257
+ "target": "AudioParam"
1258
+ }
1259
+ },
1260
+ "outputs": {
1261
+ "out": {
1262
+ "signal": "audio",
1263
+ "name": "Audio Output",
1264
+ "description": "Alien, bell-like frequency-shifted audio output.",
1265
+ "type": "AudioNode"
1266
+ }
1267
+ },
1268
+ "params": {
1269
+ "shift": {
1270
+ "name": "Frequency Shift",
1271
+ "description": "Amount to shift all frequencies in Hz. Positive = up, negative = down.",
1272
+ "type": "Hz",
1273
+ "unit": "Hz",
1274
+ "default": 0,
1275
+ "min": -500,
1276
+ "max": 500,
1277
+ "automatable": true
1278
+ },
1279
+ "mix": {
1280
+ "name": "Dry/Wet Mix",
1281
+ "description": "Balance between original and frequency-shifted signal.",
1282
+ "type": "number",
1283
+ "unit": "factor",
1284
+ "default": 1,
1285
+ "min": 0,
1286
+ "max": 1,
1287
+ "automatable": true
1288
+ }
1289
+ }
1290
+ },
1291
+ "Gate": {
1292
+ "name": "Gate",
1293
+ "panel": "GATE",
1294
+ "import": "import { Gate } from '@jpdutoit/squelchy';",
1295
+ "summary": "Noise Gate",
1296
+ "description": "Silences signal below threshold using sample-accurate envelope detection with separate attack and release. Essential for cleaning up noise, tightening drums, and creating rhythmic gating effects.",
1297
+ "categories": [
1298
+ "Dynamics"
1299
+ ],
1300
+ "inputs": {
1301
+ "in": {
1302
+ "signal": "audio",
1303
+ "name": "Audio Input",
1304
+ "description": "Audio signal to be gated.",
1305
+ "target": "AudioNode"
1306
+ }
1307
+ },
1308
+ "outputs": {
1309
+ "out": {
1310
+ "signal": "audio",
1311
+ "name": "Audio Output",
1312
+ "description": "Gated audio - silent when below threshold.",
1313
+ "type": "AudioNode"
1314
+ }
1315
+ },
1316
+ "params": {
1317
+ "threshold": {
1318
+ "name": "Threshold",
1319
+ "description": "Level below which the gate closes and silences audio.",
1320
+ "type": "Decibels",
1321
+ "unit": "dB",
1322
+ "default": -40,
1323
+ "min": -60,
1324
+ "max": 0,
1325
+ "automatable": false
1326
+ },
1327
+ "range": {
1328
+ "name": "Range",
1329
+ "description": "How much the signal is attenuated when gate is closed. 0=full mute, lower=gentler.",
1330
+ "type": "number",
1331
+ "unit": "factor",
1332
+ "default": 0.8,
1333
+ "min": 0,
1334
+ "max": 1,
1335
+ "automatable": false
1336
+ },
1337
+ "attack": {
1338
+ "name": "Attack",
1339
+ "description": "How fast the gate opens when signal exceeds threshold. Short = tight, long = gentle fade-in.",
1340
+ "type": "Seconds",
1341
+ "unit": "s",
1342
+ "default": 0.005,
1343
+ "min": 0.001,
1344
+ "max": 0.05,
1345
+ "scale": "log",
1346
+ "automatable": true
1347
+ },
1348
+ "release": {
1349
+ "name": "Release",
1350
+ "description": "How fast the gate closes when signal falls below threshold.",
1351
+ "type": "Seconds",
1352
+ "unit": "s",
1353
+ "default": 0.1,
1354
+ "min": 0.01,
1355
+ "max": 0.5,
1356
+ "scale": "log",
1357
+ "automatable": true
1358
+ }
1359
+ }
1360
+ },
1361
+ "Glide": {
1362
+ "name": "Glide",
1363
+ "panel": "GLIDE",
1364
+ "import": "import { Glide } from '@jpdutoit/squelchy';",
1365
+ "summary": "Glide / Portamento",
1366
+ "description": "Slew limiter that smooths CV transitions. Connect a gate signal for legato-only glide: new notes after silence snap to pitch instantly, overlapping notes glide smoothly.",
1367
+ "categories": [
1368
+ "Modulators",
1369
+ "Utility"
1370
+ ],
1371
+ "inputs": {
1372
+ "in": {
1373
+ "signal": "pitch",
1374
+ "name": "Pitch CV In",
1375
+ "description": "Pitch CV to smooth. Works on any CV, but tuned for semitone-space pitch.",
1376
+ "target": "AudioNode"
1377
+ },
1378
+ "gate": {
1379
+ "signal": "gate",
1380
+ "name": "Gate Input",
1381
+ "description": "Gate signal for legato-only glide. New notes snap to pitch; held notes glide. Leave unconnected for always-on glide.",
1382
+ "target": "AudioNode"
1383
+ }
1384
+ },
1385
+ "outputs": {
1386
+ "out": {
1387
+ "signal": "pitch",
1388
+ "name": "Pitch CV Out",
1389
+ "description": "Smoothed pitch CV with portamento. Connect to any V/OCT input.",
1390
+ "type": "Signal<Note>"
1391
+ }
1392
+ },
1393
+ "params": {
1394
+ "time": {
1395
+ "name": "Glide Time",
1396
+ "description": "How long it takes to slide between pitches. Longer = more portamento.",
1397
+ "type": "Seconds",
1398
+ "unit": "s",
1399
+ "default": 0.1,
1400
+ "min": 0.01,
1401
+ "max": 10,
1402
+ "scale": "log",
1403
+ "automatable": true
1404
+ }
1405
+ }
1406
+ },
1407
+ "HaasWidener": {
1408
+ "name": "HaasWidener",
1409
+ "panel": "HAAS",
1410
+ "import": "import { HaasWidener } from '@jpdutoit/squelchy';",
1411
+ "summary": "Haas Stereo Widener",
1412
+ "description": "Uses micro-delays (1-35ms) to create stereo width from mono. The Haas effect tricks the ear into perceiving wider stereo image.",
1413
+ "categories": [
1414
+ "Stereo"
1415
+ ],
1416
+ "inputs": {
1417
+ "in": {
1418
+ "signal": "audio",
1419
+ "name": "Audio Input",
1420
+ "description": "Mono signal to widen using Haas effect.",
1421
+ "target": "AudioNode"
1422
+ }
1423
+ },
1424
+ "outputs": {
1425
+ "out": {
1426
+ "signal": "audio",
1427
+ "name": "Stereo Output",
1428
+ "description": "Stereo-widened audio using micro-delays.",
1429
+ "type": "AudioNode"
1430
+ }
1431
+ },
1432
+ "params": {
1433
+ "delay": {
1434
+ "name": "Micro-Delay",
1435
+ "description": "Delay time in milliseconds (1–35 ms). The Haas effect range.",
1436
+ "type": "Milliseconds",
1437
+ "unit": "ms",
1438
+ "default": 15,
1439
+ "min": 1,
1440
+ "max": 35,
1441
+ "automatable": false
1442
+ },
1443
+ "side": {
1444
+ "name": "Delayed Side",
1445
+ "description": "Which channel receives the delay — left or right.",
1446
+ "type": "\"left\" | \"right\"",
1447
+ "default": "right",
1448
+ "options": [
1449
+ "left",
1450
+ "right"
1451
+ ],
1452
+ "automatable": false
1453
+ },
1454
+ "mix": {
1455
+ "name": "Effect Level",
1456
+ "description": "Amount of stereo widening effect. 0 = mono passthrough, 1 = fully delayed side.",
1457
+ "type": "number",
1458
+ "unit": "factor",
1459
+ "default": 1,
1460
+ "min": 0,
1461
+ "max": 1,
1462
+ "automatable": true
1463
+ }
1464
+ }
1465
+ },
1466
+ "HarmonicTremolo": {
1467
+ "name": "HarmonicTremolo",
1468
+ "panel": "H-TREM",
1469
+ "import": "import { HarmonicTremolo } from '@jpdutoit/squelchy';",
1470
+ "summary": "Harmonic Tremolo",
1471
+ "description": "Fender Brownface-style tremolo that splits signal by frequency. Highs and lows pulse opposite to each other for lush, watery modulation.",
1472
+ "categories": [
1473
+ "Effects"
1474
+ ],
1475
+ "inputs": {
1476
+ "in": {
1477
+ "signal": "audio",
1478
+ "name": "Audio Input",
1479
+ "description": "Audio signal for harmonic tremolo.",
1480
+ "target": "AudioNode"
1481
+ },
1482
+ "modRate": {
1483
+ "signal": "modulation",
1484
+ "name": "Rate CV",
1485
+ "description": "Modulate the tremolo LFO speed.",
1486
+ "target": "AudioParam"
1487
+ },
1488
+ "modCrossover": {
1489
+ "signal": "modulation",
1490
+ "name": "Crossover CV",
1491
+ "description": "Modulate the low/high crossover frequency.",
1492
+ "target": "AudioParam"
1493
+ }
1494
+ },
1495
+ "outputs": {
1496
+ "out": {
1497
+ "signal": "audio",
1498
+ "name": "Audio Output",
1499
+ "description": "Audio with frequency-split tremolo applied.",
1500
+ "type": "AudioNode"
1501
+ }
1502
+ },
1503
+ "params": {
1504
+ "rate": {
1505
+ "name": "Rate",
1506
+ "description": "Tremolo LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam.",
1507
+ "type": "Hz",
1508
+ "unit": "Hz",
1509
+ "default": 4,
1510
+ "min": 1,
1511
+ "max": 10,
1512
+ "automatable": true
1513
+ },
1514
+ "depth": {
1515
+ "name": "Modulation Depth",
1516
+ "description": "Intensity of the volume modulation. Split across the low- and high-band LFO gains, so it is set-only (no single AudioParam carries it).",
1517
+ "type": "number",
1518
+ "unit": "factor",
1519
+ "default": 0.7,
1520
+ "min": 0,
1521
+ "max": 1,
1522
+ "automatable": false
1523
+ },
1524
+ "crossover": {
1525
+ "name": "Crossover Frequency",
1526
+ "description": "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.",
1527
+ "type": "Hz",
1528
+ "unit": "Hz",
1529
+ "default": 800,
1530
+ "min": 200,
1531
+ "max": 2000,
1532
+ "automatable": true
1533
+ }
1534
+ }
1535
+ },
1536
+ "LadderFilter": {
1537
+ "name": "LadderFilter",
1538
+ "panel": "LADDER",
1539
+ "import": "import { LadderFilter } from '@jpdutoit/squelchy';",
1540
+ "summary": "Moog-style Ladder Filter",
1541
+ "description": "True 4-pole transistor-ladder lowpass (24 dB/octave): one saturating feedback loop around four one-pole stages, like the original circuit. At 100% RES it self-oscillates into a playable sine — patch a Pitch CV into V/OCT and play the filter as a voice. DRIVE saturates inside the ladder for that thick, compressed growl.",
1542
+ "categories": [
1543
+ "Filters"
1544
+ ],
1545
+ "inputs": {
1546
+ "in": {
1547
+ "signal": "audio",
1548
+ "name": "Audio Input",
1549
+ "description": "Audio signal to filter through the transistor-ladder model.",
1550
+ "target": "AudioNode"
1551
+ },
1552
+ "modFreq": {
1553
+ "signal": "modulation",
1554
+ "name": "Cutoff V/Oct",
1555
+ "description": "Modulate cutoff in semitones (V/Oct). ±12 = one octave. At full resonance this plays the self-oscillation like an oscillator.",
1556
+ "target": "AudioNode"
1557
+ },
1558
+ "modRes": {
1559
+ "signal": "modulation",
1560
+ "name": "Resonance CV",
1561
+ "description": "Resonance CV: +1 sweeps the full RES range (100% = self-oscillation), adds to the knob, clamped inside the filter.",
1562
+ "target": "AudioParam"
1563
+ }
1564
+ },
1565
+ "outputs": {
1566
+ "out": {
1567
+ "signal": "audio",
1568
+ "name": "Audio Output",
1569
+ "description": "Warm 24 dB/oct lowpass output. Passband thins slightly as resonance rises — authentic ladder behavior.",
1570
+ "type": "AudioNode"
1571
+ }
1572
+ },
1573
+ "params": {
1574
+ "note": {
1575
+ "name": "Cutoff Note",
1576
+ "description": "Filter cutoff as a note (83 ≈ 1 kHz, 69 = 440 Hz). Drives the V/OCT worklet 1:1 — the panel knob shows the equivalent Hz. At full resonance this plays the self-oscillation like an oscillator.",
1577
+ "type": "Note",
1578
+ "unit": "note",
1579
+ "default": 83,
1580
+ "min": 15,
1581
+ "max": 135,
1582
+ "automatable": true
1583
+ },
1584
+ "resonance": {
1585
+ "name": "Resonance",
1586
+ "description": "Feedback around the whole ladder. At 100% the filter self-oscillates into a sine you can play via the V/OCT input.",
1587
+ "type": "number",
1588
+ "unit": "factor",
1589
+ "default": 2.5,
1590
+ "min": 0,
1591
+ "max": 4,
1592
+ "scale": "sqrt",
1593
+ "automatable": false
1594
+ },
1595
+ "drive": {
1596
+ "name": "Input Drive",
1597
+ "description": "Saturation inside the ladder loop — thicker and more compressed as you push it, just like overdriving the original circuit.",
1598
+ "type": "number",
1599
+ "unit": "factor",
1600
+ "default": 0.3,
1601
+ "min": 0,
1602
+ "max": 1,
1603
+ "automatable": true
1604
+ }
1605
+ }
1606
+ },
1607
+ "Lfo": {
1608
+ "name": "Lfo",
1609
+ "panel": "LFO",
1610
+ "import": "import { Lfo } from '@jpdutoit/squelchy';",
1611
+ "summary": "Low Frequency Oscillator",
1612
+ "description": "Generates slow, sub-audio waveforms for modulation. Skew and shape morph continuously between sine, triangle, square and saw. Connect to filter cutoff for wobble, to pitch for vibrato, or to VCA for tremolo.",
1613
+ "categories": [
1614
+ "Modulators"
1615
+ ],
1616
+ "inputs": {
1617
+ "modRate": {
1618
+ "signal": "modulation",
1619
+ "name": "Rate CV",
1620
+ "description": "Modulate the LFO speed.",
1621
+ "target": "AudioParam"
1622
+ },
1623
+ "modAmount": {
1624
+ "signal": "modulation",
1625
+ "name": "Amount CV",
1626
+ "description": "Modulate the LFO output depth.",
1627
+ "target": "AudioParam"
1628
+ },
1629
+ "modSkew": {
1630
+ "signal": "modulation",
1631
+ "name": "Skew Modulation",
1632
+ "description": "Modulate waveshape symmetry.",
1633
+ "target": "AudioParam"
1634
+ },
1635
+ "modShape": {
1636
+ "signal": "modulation",
1637
+ "name": "Shape Modulation",
1638
+ "description": "Modulate waveshape curvature.",
1639
+ "target": "AudioParam"
1640
+ }
1641
+ },
1642
+ "outputs": {
1643
+ "out": {
1644
+ "signal": "modulation",
1645
+ "name": "Modulation Output",
1646
+ "description": "Low frequency oscillation output. Connect to modulation inputs (purple ports) to animate parameters.",
1647
+ "type": "AudioNode"
1648
+ }
1649
+ },
1650
+ "params": {
1651
+ "skew": {
1652
+ "name": "Skew",
1653
+ "description": "Waveform symmetry. 0 = symmetric; ±1 folds the cycle into a rising or falling ramp.",
1654
+ "type": "number",
1655
+ "unit": "factor",
1656
+ "default": 0,
1657
+ "min": -1,
1658
+ "max": 1,
1659
+ "automatable": true
1660
+ },
1661
+ "shape": {
1662
+ "name": "Shape",
1663
+ "description": "Waveform curvature. +1 = sine, 0 = triangle, −1 = exact square. With skew ±1 and shape 0 the output is a saw.",
1664
+ "type": "number",
1665
+ "unit": "factor",
1666
+ "default": 1,
1667
+ "min": -1,
1668
+ "max": 1,
1669
+ "automatable": true
1670
+ },
1671
+ "frequency": {
1672
+ "name": "Frequency",
1673
+ "description": "Base oscillation rate, summed with the modRate input. 0 freezes the phase; negative values run the waveform backwards.",
1674
+ "type": "Hz",
1675
+ "unit": "Hz",
1676
+ "default": 2,
1677
+ "min": -10,
1678
+ "max": 20,
1679
+ "automatable": true
1680
+ },
1681
+ "amount": {
1682
+ "name": "Amount",
1683
+ "description": "Output scale: out swings ±amount (semitones when patched to a V/Oct-style mod input). modAmount is summed onto it.",
1684
+ "type": "Semitones",
1685
+ "unit": "semitone",
1686
+ "default": 12,
1687
+ "min": 0,
1688
+ "max": 500,
1689
+ "scale": "sqrt",
1690
+ "automatable": true
1691
+ }
1692
+ }
1693
+ },
1694
+ "LoFi": {
1695
+ "name": "LoFi",
1696
+ "panel": "LO-FI",
1697
+ "import": "import { LoFi } from '@jpdutoit/squelchy';",
1698
+ "summary": "Lo-Fi Processor",
1699
+ "description": "Lo-fi processor with saturation, lowpass filtering, vinyl noise, and pitch wobble. Perfect for vintage, degraded textures.",
1700
+ "categories": [
1701
+ "Distortion",
1702
+ "Vintage"
1703
+ ],
1704
+ "inputs": {
1705
+ "in": {
1706
+ "signal": "audio",
1707
+ "name": "Audio Input",
1708
+ "description": "Audio signal for vintage degradation.",
1709
+ "target": "AudioNode"
1710
+ },
1711
+ "modCutoff": {
1712
+ "signal": "modulation",
1713
+ "name": "Cutoff CV",
1714
+ "description": "Modulate the lowpass cutoff frequency.",
1715
+ "target": "AudioParam"
1716
+ }
1717
+ },
1718
+ "outputs": {
1719
+ "out": {
1720
+ "signal": "audio",
1721
+ "name": "Audio Output",
1722
+ "description": "Warm, degraded lo-fi audio with vinyl character.",
1723
+ "type": "AudioNode"
1724
+ }
1725
+ },
1726
+ "params": {
1727
+ "drive": {
1728
+ "name": "Saturation",
1729
+ "description": "Amount of warm tape-like saturation and compression. Rebuilds the waveshaper curve, so it is set-only (no single AudioParam carries it).",
1730
+ "type": "number",
1731
+ "unit": "factor",
1732
+ "default": 0.3,
1733
+ "min": 0,
1734
+ "max": 1,
1735
+ "automatable": false
1736
+ },
1737
+ "cutoff": {
1738
+ "name": "Cutoff",
1739
+ "description": "Lowpass filter frequency. Lower = more muffled, vintage sound.",
1740
+ "type": "Hz",
1741
+ "unit": "Hz",
1742
+ "default": 4000,
1743
+ "min": 500,
1744
+ "max": 8000,
1745
+ "automatable": true
1746
+ },
1747
+ "noise": {
1748
+ "name": "Vinyl Noise",
1749
+ "description": "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).",
1750
+ "type": "number",
1751
+ "unit": "factor",
1752
+ "default": 0.2,
1753
+ "min": 0,
1754
+ "max": 1,
1755
+ "automatable": false
1756
+ },
1757
+ "wobble": {
1758
+ "name": "Wobble",
1759
+ "description": "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).",
1760
+ "type": "number",
1761
+ "unit": "factor",
1762
+ "default": 0.1,
1763
+ "min": 0,
1764
+ "max": 1,
1765
+ "automatable": false
1766
+ }
1767
+ }
1768
+ },
1769
+ "MidSide": {
1770
+ "name": "MidSide",
1771
+ "panel": "M/S",
1772
+ "import": "import { MidSide } from '@jpdutoit/squelchy';",
1773
+ "summary": "Mid-Side Processor",
1774
+ "description": "Encodes stereo into mid (center) and side (edges) components. Adjust balance for mono compatibility or extreme widening. Essential mastering tool.",
1775
+ "categories": [
1776
+ "Stereo"
1777
+ ],
1778
+ "inputs": {
1779
+ "in": {
1780
+ "signal": "audio",
1781
+ "name": "Stereo Input",
1782
+ "description": "Stereo audio signal for M/S processing.",
1783
+ "target": "AudioNode"
1784
+ }
1785
+ },
1786
+ "outputs": {
1787
+ "out": {
1788
+ "signal": "audio",
1789
+ "name": "Stereo Output",
1790
+ "description": "Processed stereo audio with adjusted M/S balance.",
1791
+ "type": "AudioNode"
1792
+ }
1793
+ },
1794
+ "params": {
1795
+ "midGain": {
1796
+ "name": "Mid Gain",
1797
+ "description": "Controls the center/mono content of the stereo image.",
1798
+ "type": "number",
1799
+ "unit": "factor",
1800
+ "default": 1,
1801
+ "min": 0,
1802
+ "max": 2,
1803
+ "automatable": true
1804
+ },
1805
+ "sideGain": {
1806
+ "name": "Side Gain",
1807
+ "description": "Controls the stereo edges/differences between left and right.",
1808
+ "type": "number",
1809
+ "unit": "factor",
1810
+ "default": 1,
1811
+ "min": 0,
1812
+ "max": 2,
1813
+ "automatable": true
1814
+ }
1815
+ }
1816
+ },
1817
+ "Noise": {
1818
+ "name": "Noise",
1819
+ "panel": "NOISE",
1820
+ "import": "import { Noise } from '@jpdutoit/squelchy';",
1821
+ "summary": "Noise Generator",
1822
+ "description": "Produces random audio (white, pink, brown noise). Use for percussion, wind effects, or filter sweep textures.",
1823
+ "categories": [
1824
+ "Sources"
1825
+ ],
1826
+ "inputs": {
1827
+ "modLevel": {
1828
+ "signal": "modulation",
1829
+ "name": "Level CV",
1830
+ "description": "Modulate output level. Connect an envelope for amplitude shaping or an LFO for tremolo.",
1831
+ "target": "AudioParam"
1832
+ }
1833
+ },
1834
+ "outputs": {
1835
+ "out": {
1836
+ "signal": "audio",
1837
+ "name": "Noise Output",
1838
+ "description": "White, pink, or brown noise output.",
1839
+ "type": "AudioNode"
1840
+ }
1841
+ },
1842
+ "params": {
1843
+ "noiseType": {
1844
+ "name": "Noise Color",
1845
+ "description": "White, pink, or brown noise spectrum.",
1846
+ "type": "\"white\" | \"pink\" | \"brown\"",
1847
+ "default": "white",
1848
+ "options": [
1849
+ "white",
1850
+ "pink",
1851
+ "brown"
1852
+ ],
1853
+ "automatable": false
1854
+ },
1855
+ "gain": {
1856
+ "name": "Noise Level",
1857
+ "description": "Output amplitude of the noise generator.",
1858
+ "type": "number",
1859
+ "unit": "factor",
1860
+ "default": 0.3,
1861
+ "min": 0,
1862
+ "max": 1,
1863
+ "automatable": true
1864
+ }
1865
+ }
1866
+ },
1867
+ "Octaver": {
1868
+ "name": "Octaver",
1869
+ "panel": "OCTAVE",
1870
+ "import": "import { Octaver } from '@jpdutoit/squelchy';",
1871
+ "summary": "Analog Octaver",
1872
+ "description": "Classic analog-style octave effect. Zero-crossing flip-flop frequency division gives true -1 and -2 octave square waves (as in a Boss OC-2), while the +1 octave comes from full-wave rectification through a bandpass that tracks the detected fundamental. Monophonic, like the hardware.",
1873
+ "categories": [
1874
+ "Effects"
1875
+ ],
1876
+ "inputs": {
1877
+ "in": {
1878
+ "signal": "audio",
1879
+ "name": "Audio Input",
1880
+ "description": "Monophonic audio signal for octave processing.",
1881
+ "target": "AudioNode"
1882
+ }
1883
+ },
1884
+ "outputs": {
1885
+ "out": {
1886
+ "signal": "audio",
1887
+ "name": "Audio Output",
1888
+ "description": "Dry signal blended with true divided sub-octaves and a tracked octave-up.",
1889
+ "type": "AudioNode"
1890
+ }
1891
+ },
1892
+ "params": {
1893
+ "octDown2": {
1894
+ "name": "Two Octaves Down",
1895
+ "description": "Level of the ÷4 divided square wave — two octaves below the input.",
1896
+ "type": "number",
1897
+ "unit": "factor",
1898
+ "default": 0.3,
1899
+ "min": 0,
1900
+ "max": 1,
1901
+ "automatable": true
1902
+ },
1903
+ "octDown1": {
1904
+ "name": "One Octave Down",
1905
+ "description": "Level of the ÷2 divided square wave — one octave below the input.",
1906
+ "type": "number",
1907
+ "unit": "factor",
1908
+ "default": 0.5,
1909
+ "min": 0,
1910
+ "max": 1,
1911
+ "automatable": true
1912
+ },
1913
+ "dry": {
1914
+ "name": "Dry Level",
1915
+ "description": "Level of the original unprocessed signal.",
1916
+ "type": "number",
1917
+ "unit": "factor",
1918
+ "default": 0.7,
1919
+ "min": 0,
1920
+ "max": 1,
1921
+ "automatable": true
1922
+ },
1923
+ "octUp": {
1924
+ "name": "One Octave Up",
1925
+ "description": "Level of the rectified octave-up voice, bandpassed around the tracked fundamental.",
1926
+ "type": "number",
1927
+ "unit": "factor",
1928
+ "default": 0,
1929
+ "min": 0,
1930
+ "max": 1,
1931
+ "automatable": true
1932
+ }
1933
+ }
1934
+ },
1935
+ "Phaser": {
1936
+ "name": "Phaser",
1937
+ "panel": "PHASER",
1938
+ "import": "import { Phaser } from '@jpdutoit/squelchy';",
1939
+ "summary": "Phaser Effect",
1940
+ "description": "Creates swooshing, jet-like sweeps by splitting signal through allpass filters. Rate controls speed, depth the intensity, feedback adds resonance.",
1941
+ "categories": [
1942
+ "Time",
1943
+ "Effects"
1944
+ ],
1945
+ "inputs": {
1946
+ "in": {
1947
+ "signal": "audio",
1948
+ "name": "Audio Input",
1949
+ "description": "Audio signal for phase-shifting effect.",
1950
+ "target": "AudioNode"
1951
+ },
1952
+ "modRate": {
1953
+ "signal": "modulation",
1954
+ "name": "Rate CV",
1955
+ "description": "Modulate the phaser sweep speed.",
1956
+ "target": "AudioParam"
1957
+ },
1958
+ "modFeedback": {
1959
+ "signal": "modulation",
1960
+ "name": "Feedback CV",
1961
+ "description": "Modulate the resonance feedback amount.",
1962
+ "target": "AudioParam"
1963
+ },
1964
+ "modMix": {
1965
+ "signal": "modulation",
1966
+ "name": "Mix CV",
1967
+ "description": "Modulate the dry/wet balance.",
1968
+ "target": "AudioParam"
1969
+ }
1970
+ },
1971
+ "outputs": {
1972
+ "out": {
1973
+ "signal": "audio",
1974
+ "name": "Audio Output",
1975
+ "description": "Swooshing, jet-like phased audio output.",
1976
+ "type": "AudioNode"
1977
+ }
1978
+ },
1979
+ "params": {
1980
+ "rate": {
1981
+ "name": "Rate",
1982
+ "description": "Phaser sweep LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam.",
1983
+ "type": "Hz",
1984
+ "unit": "Hz",
1985
+ "default": 0.5,
1986
+ "min": 0.1,
1987
+ "max": 10,
1988
+ "automatable": true
1989
+ },
1990
+ "depth": {
1991
+ "name": "Modulation Depth",
1992
+ "description": "Intensity of the phase shifting effect. Split proportionally across the four allpass stage gains, so it is set-only (no single AudioParam carries it).",
1993
+ "type": "number",
1994
+ "unit": "factor",
1995
+ "default": 0.7,
1996
+ "min": 0,
1997
+ "max": 1,
1998
+ "automatable": false
1999
+ },
2000
+ "feedback": {
2001
+ "name": "Feedback",
2002
+ "description": "Resonance amount. Higher values create more pronounced, whistling sweeps. modFeedback sums into the same AudioParam.",
2003
+ "type": "number",
2004
+ "unit": "factor",
2005
+ "default": 0.6,
2006
+ "min": 0,
2007
+ "max": 0.9,
2008
+ "automatable": true
2009
+ },
2010
+ "mix": {
2011
+ "name": "Dry/Wet Mix",
2012
+ "description": "Balance between original and phased signal, driven by one ConstantSource (linear law: dry = 1 − mix, wet = mix).",
2013
+ "type": "number",
2014
+ "unit": "factor",
2015
+ "default": 0.5,
2016
+ "min": 0,
2017
+ "max": 1,
2018
+ "automatable": true
2019
+ }
2020
+ }
2021
+ },
2022
+ "PingPong": {
2023
+ "name": "PingPong",
2024
+ "panel": "PING",
2025
+ "import": "import { PingPong } from '@jpdutoit/squelchy';",
2026
+ "summary": "Ping Pong Delay",
2027
+ "description": "Stereo delay that bounces between left and right channels. Creates wide, rhythmic echoes. Spread controls how far apart the bounces are panned.",
2028
+ "categories": [
2029
+ "Time"
2030
+ ],
2031
+ "inputs": {
2032
+ "in": {
2033
+ "signal": "audio",
2034
+ "name": "Audio Input",
2035
+ "description": "Audio signal for ping-pong delay.",
2036
+ "target": "AudioNode"
2037
+ }
2038
+ },
2039
+ "outputs": {
2040
+ "out": {
2041
+ "signal": "audio",
2042
+ "name": "Stereo Output",
2043
+ "description": "Stereo delay with bouncing echoes.",
2044
+ "type": "AudioNode"
2045
+ }
2046
+ },
2047
+ "params": {
2048
+ "time": {
2049
+ "name": "Delay Time",
2050
+ "description": "Time between each stereo bounce.",
2051
+ "type": "Seconds",
2052
+ "unit": "s",
2053
+ "default": 0.3,
2054
+ "min": 0.1,
2055
+ "max": 1,
2056
+ "scale": "log",
2057
+ "automatable": true
2058
+ },
2059
+ "feedback": {
2060
+ "name": "Feedback",
2061
+ "description": "How much delayed signal feeds back for more repeats.",
2062
+ "type": "number",
2063
+ "unit": "factor",
2064
+ "default": 0.4,
2065
+ "min": 0,
2066
+ "max": 0.9,
2067
+ "automatable": true
2068
+ },
2069
+ "spread": {
2070
+ "name": "Stereo Spread",
2071
+ "description": "Controls how far left/right the bounces are panned. 0% = mono center, 100% = full stereo.",
2072
+ "type": "number",
2073
+ "unit": "factor",
2074
+ "default": 1,
2075
+ "min": 0,
2076
+ "max": 1,
2077
+ "automatable": false
2078
+ },
2079
+ "mix": {
2080
+ "name": "Dry/Wet Mix",
2081
+ "description": "Balance between original and delayed signal.",
2082
+ "type": "number",
2083
+ "unit": "factor",
2084
+ "default": 0.5,
2085
+ "min": 0,
2086
+ "max": 1,
2087
+ "automatable": true
2088
+ }
2089
+ }
2090
+ },
2091
+ "Resonator": {
2092
+ "name": "Resonator",
2093
+ "panel": "RESO",
2094
+ "import": "import { Resonator } from '@jpdutoit/squelchy';",
2095
+ "summary": "Resonator",
2096
+ "description": "Modal resonator: five tuned second-order modes that ring when struck. The whole partial series tracks the root note and the V/OCT input exponentially; STRUCT sets the spacing, DAMP the decay time.",
2097
+ "categories": [
2098
+ "Filters"
2099
+ ],
2100
+ "inputs": {
2101
+ "in": {
2102
+ "signal": "audio",
2103
+ "name": "Audio Input",
2104
+ "description": "Audio signal to excite the resonator.",
2105
+ "target": "AudioNode"
2106
+ },
2107
+ "voct": {
2108
+ "signal": "pitch",
2109
+ "name": "Root V/Oct",
2110
+ "description": "Pitch CV from a keyboard or sequencer — every partial plays the incoming notes.",
2111
+ "target": "AudioNode"
2112
+ },
2113
+ "modFreq": {
2114
+ "signal": "modulation",
2115
+ "name": "Root Modulation",
2116
+ "description": "Sweeps every partial in semitones, ±12 = one octave. Patch an LFO here for vowel-like wobbles.",
2117
+ "target": "AudioNode"
2118
+ }
2119
+ },
2120
+ "outputs": {
2121
+ "out": {
2122
+ "signal": "audio",
2123
+ "name": "Audio Output",
2124
+ "description": "Resonant, pitched harmonics from the input.",
2125
+ "type": "AudioNode"
2126
+ }
2127
+ },
2128
+ "params": {
2129
+ "offset": {
2130
+ "name": "Root Pitch Offset",
2131
+ "description": "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.",
2132
+ "type": "Semitones",
2133
+ "unit": "semitone",
2134
+ "default": 57,
2135
+ "min": -48,
2136
+ "max": 108,
2137
+ "automatable": true
2138
+ },
2139
+ "structure": {
2140
+ "name": "Structure",
2141
+ "description": "Harmonic spacing of the resonator partials. Left = standard harmonic series, center = bell-like, right = metallic/inharmonic.",
2142
+ "type": "number",
2143
+ "unit": "factor",
2144
+ "default": 0,
2145
+ "min": 0,
2146
+ "max": 1,
2147
+ "automatable": false
2148
+ },
2149
+ "damping": {
2150
+ "name": "Damping",
2151
+ "description": "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.",
2152
+ "type": "number",
2153
+ "unit": "factor",
2154
+ "default": 0.5,
2155
+ "min": 0,
2156
+ "max": 1,
2157
+ "automatable": false
2158
+ },
2159
+ "mix": {
2160
+ "name": "Dry/Wet Mix",
2161
+ "description": "Balance between original and resonated signal.",
2162
+ "type": "number",
2163
+ "unit": "factor",
2164
+ "default": 0.5,
2165
+ "min": 0,
2166
+ "max": 1,
2167
+ "automatable": true
2168
+ }
2169
+ }
2170
+ },
2171
+ "Reverb": {
2172
+ "name": "Reverb",
2173
+ "panel": "REVERB",
2174
+ "import": "import { Reverb } from '@jpdutoit/squelchy';",
2175
+ "summary": "Reverb Effect",
2176
+ "description": "Algorithmic Schroeder/FDN reverb: four damped comb filters cross-mixed through a Hadamard matrix, with separate mid and side output taps — a stereo tail that stays exactly mono-compatible, and a stereo input keeps its image. Decay sets RT60 and updates smoothly — nothing is re-rendered when you turn a knob.",
2177
+ "categories": [
2178
+ "Time"
2179
+ ],
2180
+ "inputs": {
2181
+ "in": {
2182
+ "signal": "audio",
2183
+ "name": "Audio Input",
2184
+ "description": "Audio signal to add reverb to.",
2185
+ "target": "AudioNode"
2186
+ }
2187
+ },
2188
+ "outputs": {
2189
+ "out": {
2190
+ "signal": "audio",
2191
+ "name": "Audio Output",
2192
+ "description": "Reverberant audio signal mixed with dry signal.",
2193
+ "type": "AudioNode"
2194
+ }
2195
+ },
2196
+ "params": {
2197
+ "decay": {
2198
+ "name": "Decay Time (RT60)",
2199
+ "description": "How long the tail takes to fall 60 dB. Short = room, long = hall or cathedral.",
2200
+ "type": "Seconds",
2201
+ "unit": "s",
2202
+ "default": 2,
2203
+ "min": 0.1,
2204
+ "max": 8,
2205
+ "scale": "log",
2206
+ "automatable": true
2207
+ },
2208
+ "mix": {
2209
+ "name": "Dry/Wet Mix",
2210
+ "description": "Equal-power balance between original (dry) and reverberant (wet) signal.",
2211
+ "type": "number",
2212
+ "unit": "factor",
2213
+ "default": 0.3,
2214
+ "min": 0,
2215
+ "max": 1,
2216
+ "automatable": true
2217
+ }
2218
+ }
2219
+ },
2220
+ "RingModulator": {
2221
+ "name": "RingModulator",
2222
+ "panel": "RING",
2223
+ "import": "import { RingModulator } from '@jpdutoit/squelchy';",
2224
+ "summary": "Ring Modulator",
2225
+ "description": "Multiplies input with an internal carrier oscillator, creating metallic, bell-like, and robotic tones. Classic Dalek voice effect!",
2226
+ "categories": [
2227
+ "Effects"
2228
+ ],
2229
+ "inputs": {
2230
+ "in": {
2231
+ "signal": "audio",
2232
+ "name": "Audio Input",
2233
+ "description": "Audio signal for ring modulation.",
2234
+ "target": "AudioNode"
2235
+ },
2236
+ "voct": {
2237
+ "signal": "pitch",
2238
+ "name": "Carrier Pitch CV",
2239
+ "description": "Pitch CV from a keyboard or sequencer — the carrier plays the incoming notes.",
2240
+ "target": "AudioNode"
2241
+ },
2242
+ "modFreq": {
2243
+ "signal": "modulation",
2244
+ "name": "Carrier Modulation",
2245
+ "description": "Sweeps the carrier in semitones, ±12 = one octave. Patch an LFO here for gliding sci-fi sidebands.",
2246
+ "target": "AudioNode"
2247
+ }
2248
+ },
2249
+ "outputs": {
2250
+ "out": {
2251
+ "signal": "audio",
2252
+ "name": "Audio Output",
2253
+ "description": "Metallic, bell-like ring-modulated audio output.",
2254
+ "type": "AudioNode"
2255
+ }
2256
+ },
2257
+ "params": {
2258
+ "offset": {
2259
+ "name": "Carrier Pitch Offset",
2260
+ "description": "Semitones added to the V/OCT input. Unpatched the input is silent, so this is the carrier note itself: 69 = 440 Hz. Driven by a keyboard or sequencer, 0 tracks the incoming notes.",
2261
+ "type": "Semitones",
2262
+ "unit": "semitone",
2263
+ "default": 69,
2264
+ "min": -48,
2265
+ "max": 108,
2266
+ "automatable": true
2267
+ },
2268
+ "mix": {
2269
+ "name": "Dry/Wet Mix",
2270
+ "description": "Balance between original and ring-modulated signal.",
2271
+ "type": "number",
2272
+ "unit": "factor",
2273
+ "default": 0.5,
2274
+ "min": 0,
2275
+ "max": 1,
2276
+ "automatable": false
2277
+ }
2278
+ }
2279
+ },
2280
+ "Rotary": {
2281
+ "name": "Rotary",
2282
+ "panel": "ROTARY",
2283
+ "import": "import { Rotary } from '@jpdutoit/squelchy';",
2284
+ "summary": "Rotary Speaker",
2285
+ "description": "Two-rotor Leslie cabinet: 800 Hz crossover into a treble horn and bass drum, each with its own speed, inertia, Doppler and directivity, picked up by a stereo mic pair. Switching SLOW↔FAST ramps the rotors like the real thing — the horn in about a second, the drum over several.",
2286
+ "categories": [
2287
+ "Effects",
2288
+ "Vintage"
2289
+ ],
2290
+ "inputs": {
2291
+ "in": {
2292
+ "signal": "audio",
2293
+ "name": "Audio Input",
2294
+ "description": "Audio signal for Leslie cabinet simulation.",
2295
+ "target": "AudioNode"
2296
+ },
2297
+ "modMix": {
2298
+ "signal": "modulation",
2299
+ "name": "Mix CV",
2300
+ "description": "Modulate the dry/wet balance.",
2301
+ "target": "AudioParam"
2302
+ }
2303
+ },
2304
+ "outputs": {
2305
+ "out": {
2306
+ "signal": "audio",
2307
+ "name": "Audio Output",
2308
+ "description": "Stereo rotary output: Doppler and tremolo swirling between the two mics.",
2309
+ "type": "AudioNode"
2310
+ }
2311
+ },
2312
+ "params": {
2313
+ "speed": {
2314
+ "name": "Speed Mode",
2315
+ "description": "Toggle between slow \"chorale\" and fast \"tremolo\". The rotors ramp between speeds with inertia — horn in ~1 s, drum in ~4–5 s — so this is a mode switch, not a continuous rate.",
2316
+ "type": "\"slow\" | \"fast\"",
2317
+ "default": "slow",
2318
+ "options": [
2319
+ "slow",
2320
+ "fast"
2321
+ ],
2322
+ "automatable": false
2323
+ },
2324
+ "slowRate": {
2325
+ "name": "Slow Rate",
2326
+ "description": "Horn speed in chorale mode (the drum turns at 0.85× this). Applied via an inertia ramp, so it is set-only.",
2327
+ "type": "Hz",
2328
+ "unit": "Hz",
2329
+ "default": 0.8,
2330
+ "min": 0.5,
2331
+ "max": 2,
2332
+ "automatable": false
2333
+ },
2334
+ "fastRate": {
2335
+ "name": "Fast Rate",
2336
+ "description": "Horn speed in tremolo mode (the drum turns at 0.85× this). Applied via an inertia ramp, so it is set-only.",
2337
+ "type": "Hz",
2338
+ "unit": "Hz",
2339
+ "default": 6,
2340
+ "min": 4,
2341
+ "max": 8,
2342
+ "automatable": false
2343
+ },
2344
+ "mix": {
2345
+ "name": "Dry/Wet Mix",
2346
+ "description": "Balance between original and rotary speaker signal, driven by one ConstantSource (linear law: dry = 1 − mix, wet = mix).",
2347
+ "type": "number",
2348
+ "unit": "factor",
2349
+ "default": 0.7,
2350
+ "min": 0,
2351
+ "max": 1,
2352
+ "automatable": true
2353
+ }
2354
+ }
2355
+ },
2356
+ "Saturator": {
2357
+ "name": "Saturator",
2358
+ "panel": "SAT",
2359
+ "import": "import { Saturator } from '@jpdutoit/squelchy';",
2360
+ "summary": "Tape Saturator",
2361
+ "description": "Adds warm analog-style harmonic saturation. Drive pushes into soft clipping, warmth adds low-end emphasis. Subtle grit to heavy crunch.",
2362
+ "categories": [
2363
+ "Distortion"
2364
+ ],
2365
+ "inputs": {
2366
+ "in": {
2367
+ "signal": "audio",
2368
+ "name": "Audio Input",
2369
+ "description": "Audio signal for warm saturation.",
2370
+ "target": "AudioNode"
2371
+ }
2372
+ },
2373
+ "outputs": {
2374
+ "out": {
2375
+ "signal": "audio",
2376
+ "name": "Audio Output",
2377
+ "description": "Warm, harmonically-rich saturated audio output.",
2378
+ "type": "AudioNode"
2379
+ }
2380
+ },
2381
+ "params": {
2382
+ "drive": {
2383
+ "name": "Drive",
2384
+ "description": "How hard to push into saturation. Adds harmonics and soft compression.",
2385
+ "type": "number",
2386
+ "unit": "factor",
2387
+ "default": 0.5,
2388
+ "min": 0,
2389
+ "max": 1,
2390
+ "automatable": false
2391
+ },
2392
+ "warmth": {
2393
+ "name": "Warmth",
2394
+ "description": "Low frequency emphasis for a thicker, analog-like tone.",
2395
+ "type": "number",
2396
+ "unit": "factor",
2397
+ "default": 0.5,
2398
+ "min": 0,
2399
+ "max": 1,
2400
+ "automatable": false
2401
+ },
2402
+ "mix": {
2403
+ "name": "Dry/Wet Mix",
2404
+ "description": "Balance between clean and saturated signal.",
2405
+ "type": "number",
2406
+ "unit": "factor",
2407
+ "default": 1,
2408
+ "min": 0,
2409
+ "max": 1,
2410
+ "automatable": true
2411
+ }
2412
+ }
2413
+ },
2414
+ "Shimmer": {
2415
+ "name": "Shimmer",
2416
+ "panel": "SHIMMER",
2417
+ "import": "import { Shimmer } from '@jpdutoit/squelchy';",
2418
+ "summary": "Shimmer Reverb",
2419
+ "description": "A real shimmer: a Schroeder/FDN reverb tank whose feedback path runs through a granular pitch shifter, so every pass through the tank is transposed again and the tail climbs as it decays. Fully stereo: the tank keeps a stereo input's image, and each channel has its own pitch shifter in the feedback loop so the rising tail stays wide. +12 = octave up, +7 = fifth.",
2420
+ "categories": [
2421
+ "Time"
2422
+ ],
2423
+ "inputs": {
2424
+ "in": {
2425
+ "signal": "audio",
2426
+ "name": "Audio Input",
2427
+ "description": "Audio signal for shimmer reverb processing.",
2428
+ "target": "AudioNode"
2429
+ }
2430
+ },
2431
+ "outputs": {
2432
+ "out": {
2433
+ "signal": "audio",
2434
+ "name": "Audio Output",
2435
+ "description": "Ethereal, pitch-shifted reverb output.",
2436
+ "type": "AudioNode"
2437
+ }
2438
+ },
2439
+ "params": {
2440
+ "decay": {
2441
+ "name": "Reverb Decay",
2442
+ "description": "RT60 of the reverb tank in seconds.",
2443
+ "type": "Seconds",
2444
+ "unit": "s",
2445
+ "default": 3,
2446
+ "min": 0.5,
2447
+ "max": 10,
2448
+ "scale": "log",
2449
+ "automatable": false
2450
+ },
2451
+ "pitch": {
2452
+ "name": "Pitch Shift",
2453
+ "description": "Transposition applied by the granular pitch shifter on every trip round the feedback loop (12 = one octave). +12 = octave up, +7 = fifth up, -12 = octave down.",
2454
+ "type": "Semitones",
2455
+ "unit": "semitone",
2456
+ "default": 12,
2457
+ "min": -12,
2458
+ "max": 24,
2459
+ "automatable": false
2460
+ },
2461
+ "mix": {
2462
+ "name": "Dry/Wet Mix",
2463
+ "description": "Equal-power balance between dry signal and shimmer output — independent of the regen amount.",
2464
+ "type": "number",
2465
+ "unit": "factor",
2466
+ "default": 0.5,
2467
+ "min": 0,
2468
+ "max": 1,
2469
+ "automatable": true
2470
+ },
2471
+ "shimmer": {
2472
+ "name": "Shimmer Regen",
2473
+ "description": "How much pitch-shifted signal is fed back into the tank. High = endless rising choir.",
2474
+ "type": "number",
2475
+ "unit": "factor",
2476
+ "default": 0.5,
2477
+ "min": 0,
2478
+ "max": 0.95,
2479
+ "automatable": true
2480
+ }
2481
+ }
2482
+ },
2483
+ "SoftLimiter": {
2484
+ "name": "SoftLimiter",
2485
+ "panel": "LIMIT",
2486
+ "import": "import { SoftLimiter } from '@jpdutoit/squelchy';",
2487
+ "summary": "Soft Limiter",
2488
+ "description": "Gentle brickwall limiting with soft knee. Prevents clipping while preserving dynamics. Use ceiling control to set maximum output level.",
2489
+ "categories": [
2490
+ "Dynamics"
2491
+ ],
2492
+ "inputs": {
2493
+ "in": {
2494
+ "signal": "audio",
2495
+ "name": "Audio Input",
2496
+ "description": "Audio signal to be limited.",
2497
+ "target": "AudioNode"
2498
+ }
2499
+ },
2500
+ "outputs": {
2501
+ "out": {
2502
+ "signal": "audio",
2503
+ "name": "Audio Output",
2504
+ "description": "Limited audio with controlled peaks.",
2505
+ "type": "AudioNode"
2506
+ }
2507
+ },
2508
+ "params": {
2509
+ "drive": {
2510
+ "name": "Input Drive",
2511
+ "description": "Pushes signal into the limiter for more saturation and loudness.",
2512
+ "type": "number",
2513
+ "unit": "factor",
2514
+ "default": 0.5,
2515
+ "min": 0,
2516
+ "max": 1,
2517
+ "automatable": false
2518
+ },
2519
+ "knee": {
2520
+ "name": "Soft Knee",
2521
+ "description": "How gradually limiting kicks in. Higher = softer, more transparent.",
2522
+ "type": "number",
2523
+ "unit": "factor",
2524
+ "default": 0.5,
2525
+ "min": 0,
2526
+ "max": 1,
2527
+ "automatable": false
2528
+ },
2529
+ "ceiling": {
2530
+ "name": "Ceiling",
2531
+ "description": "Maximum output level in dB. Prevents clipping above this level.",
2532
+ "type": "Decibels",
2533
+ "unit": "dB",
2534
+ "default": -0.5,
2535
+ "min": -12,
2536
+ "max": 0,
2537
+ "automatable": false
2538
+ }
2539
+ }
2540
+ },
2541
+ "SpringReverb": {
2542
+ "name": "SpringReverb",
2543
+ "panel": "SPRING",
2544
+ "import": "import { SpringReverb } from '@jpdutoit/squelchy';",
2545
+ "summary": "Spring Tank Reverb",
2546
+ "description": "A modeled spring tank: dispersive spring lines turn transients into the classic descending \"boing\", the tail darkens with every pass, and KNOCK whacks the tank for the kicked-amp crash.",
2547
+ "categories": [
2548
+ "Time",
2549
+ "Vintage"
2550
+ ],
2551
+ "inputs": {
2552
+ "in": {
2553
+ "signal": "audio",
2554
+ "name": "Audio Input",
2555
+ "description": "Audio driven into the spring tank. Hit it hard and the springs overload into a crash.",
2556
+ "target": "AudioNode"
2557
+ },
2558
+ "knock": {
2559
+ "signal": "gate",
2560
+ "name": "Knock Trigger",
2561
+ "description": "Rising edge whacks the tank — a mechanical thump straight into the springs, like kicking the amp. Patch a clock for rhythmic dub crashes.",
2562
+ "target": "AudioNode"
2563
+ }
2564
+ },
2565
+ "outputs": {
2566
+ "out": {
2567
+ "signal": "audio",
2568
+ "name": "Audio Output",
2569
+ "description": "Dry/wet blend of the spring tank — dispersive boing, flutter echoes and all.",
2570
+ "type": "AudioNode"
2571
+ }
2572
+ },
2573
+ "params": {
2574
+ "mix": {
2575
+ "name": "Dry/Wet Mix",
2576
+ "description": "Equal-power blend of dry signal and spring output.",
2577
+ "type": "number",
2578
+ "unit": "factor",
2579
+ "default": 0.35,
2580
+ "min": 0,
2581
+ "max": 1,
2582
+ "automatable": true
2583
+ },
2584
+ "decay": {
2585
+ "name": "Reverb Decay",
2586
+ "description": "Stretch/sag of the spring's dispersion — higher values ring longer and smear more.",
2587
+ "type": "Seconds",
2588
+ "unit": "s",
2589
+ "default": 1.5,
2590
+ "min": 0.3,
2591
+ "max": 4,
2592
+ "scale": "log",
2593
+ "automatable": true
2594
+ },
2595
+ "tone": {
2596
+ "name": "Tone",
2597
+ "description": "Brightness of the spring output: darkens the rattly top end as it falls.",
2598
+ "type": "number",
2599
+ "unit": "factor",
2600
+ "default": 0.6,
2601
+ "min": 0,
2602
+ "max": 1,
2603
+ "automatable": true
2604
+ },
2605
+ "drip": {
2606
+ "name": "Drip",
2607
+ "description": "Spring bounce character — how much the delayed tail drips and boings.",
2608
+ "type": "number",
2609
+ "unit": "factor",
2610
+ "default": 0.5,
2611
+ "min": 0,
2612
+ "max": 1,
2613
+ "automatable": true
2614
+ }
2615
+ }
2616
+ },
2617
+ "StereoSpread": {
2618
+ "name": "StereoSpread",
2619
+ "panel": "SPREAD",
2620
+ "import": "import { StereoSpread } from '@jpdutoit/squelchy';",
2621
+ "summary": "Stereo Spreader",
2622
+ "description": "Frequency-dependent stereo widening using the Haas effect. Highs above the crossover are split into two paths with micro-delay for real psychoacoustic width. Lows stay mono and centered.",
2623
+ "categories": [
2624
+ "Stereo"
2625
+ ],
2626
+ "inputs": {
2627
+ "in": {
2628
+ "signal": "audio",
2629
+ "name": "Audio Input",
2630
+ "description": "Audio signal for stereo spreading.",
2631
+ "target": "AudioNode"
2632
+ }
2633
+ },
2634
+ "outputs": {
2635
+ "out": {
2636
+ "signal": "audio",
2637
+ "name": "Audio Output",
2638
+ "description": "Wide stereo audio with frequency-dependent Haas widening.",
2639
+ "type": "AudioNode"
2640
+ }
2641
+ },
2642
+ "params": {
2643
+ "spread": {
2644
+ "name": "Spread Amount",
2645
+ "description": "Controls the micro-delay time for Haas widening (0–5ms). More spread = wider perceived stereo image.",
2646
+ "type": "number",
2647
+ "unit": "factor",
2648
+ "default": 0.7,
2649
+ "min": 0,
2650
+ "max": 1,
2651
+ "automatable": false
2652
+ },
2653
+ "center": {
2654
+ "name": "Crossover Frequency",
2655
+ "description": "Frequency above which Haas spreading is applied. Lows below this stay centered for mono compatibility.",
2656
+ "type": "Hz",
2657
+ "unit": "Hz",
2658
+ "default": 800,
2659
+ "min": 200,
2660
+ "max": 2000,
2661
+ "scale": "log",
2662
+ "automatable": false
2663
+ }
2664
+ }
2665
+ },
2666
+ "Subharmonic": {
2667
+ "name": "Subharmonic",
2668
+ "panel": "SUB OCT",
2669
+ "import": "import { Subharmonic } from '@jpdutoit/squelchy';",
2670
+ "summary": "Sub Octave Generator",
2671
+ "description": "Generates square waves one and two octaves below the input using zero-crossing frequency division, like classic analog octave pedals.",
2672
+ "categories": [
2673
+ "Sources"
2674
+ ],
2675
+ "inputs": {
2676
+ "in": {
2677
+ "signal": "audio",
2678
+ "name": "Audio Input",
2679
+ "description": "Audio signal for sub-octave generation.",
2680
+ "target": "AudioNode"
2681
+ }
2682
+ },
2683
+ "outputs": {
2684
+ "out": {
2685
+ "signal": "audio",
2686
+ "name": "Audio Output",
2687
+ "description": "Audio with added sub-octave content.",
2688
+ "type": "AudioNode"
2689
+ }
2690
+ },
2691
+ "params": {
2692
+ "direct": {
2693
+ "name": "Direct Level",
2694
+ "description": "Level of the dry input signal passed through to the output.",
2695
+ "type": "number",
2696
+ "unit": "factor",
2697
+ "default": 1,
2698
+ "min": 0,
2699
+ "max": 1,
2700
+ "automatable": true
2701
+ },
2702
+ "octave1": {
2703
+ "name": "Octave Down",
2704
+ "description": "Level of the first sub-octave (one octave below input via ÷2 frequency division).",
2705
+ "type": "number",
2706
+ "unit": "factor",
2707
+ "default": 0.5,
2708
+ "min": 0,
2709
+ "max": 1,
2710
+ "automatable": true
2711
+ },
2712
+ "octave2": {
2713
+ "name": "Two Octaves Down",
2714
+ "description": "Level of the second sub-octave (two octaves below input via ÷4 frequency division).",
2715
+ "type": "number",
2716
+ "unit": "factor",
2717
+ "default": 0.3,
2718
+ "min": 0,
2719
+ "max": 1,
2720
+ "automatable": true
2721
+ }
2722
+ }
2723
+ },
2724
+ "TapeDelay": {
2725
+ "name": "TapeDelay",
2726
+ "panel": "TAPE",
2727
+ "import": "import { TapeDelay } from '@jpdutoit/squelchy';",
2728
+ "summary": "Tape Echo",
2729
+ "description": "Vintage-style delay with analog warmth. Repeats darken like real tape, wow and flutter add speed wobble, saturation adds harmonic richness, and the TIME knob bends pitch like a varispeed motor.",
2730
+ "categories": [
2731
+ "Time",
2732
+ "Vintage"
2733
+ ],
2734
+ "inputs": {
2735
+ "in": {
2736
+ "signal": "audio",
2737
+ "name": "Audio Input",
2738
+ "description": "Audio signal for warm tape echo processing.",
2739
+ "target": "AudioNode"
2740
+ }
2741
+ },
2742
+ "outputs": {
2743
+ "out": {
2744
+ "signal": "audio",
2745
+ "name": "Audio Output",
2746
+ "description": "Lush tape delay with wow, flutter, per-repeat darkening, and saturation.",
2747
+ "type": "AudioNode"
2748
+ }
2749
+ },
2750
+ "params": {
2751
+ "time": {
2752
+ "name": "Delay Time",
2753
+ "description": "Echo time. Changes glide with a tape-style pitch bend instead of jumping.",
2754
+ "type": "Seconds",
2755
+ "unit": "s",
2756
+ "default": 0.375,
2757
+ "min": 0.05,
2758
+ "max": 1.5,
2759
+ "scale": "log",
2760
+ "automatable": true
2761
+ },
2762
+ "feedback": {
2763
+ "name": "Feedback",
2764
+ "description": "Repeat intensity. High values create dreamy, degrading echoes.",
2765
+ "type": "number",
2766
+ "unit": "factor",
2767
+ "default": 0.5,
2768
+ "min": 0,
2769
+ "max": 0.95,
2770
+ "automatable": true
2771
+ },
2772
+ "mix": {
2773
+ "name": "Dry/Wet Mix",
2774
+ "description": "Balance between original and delayed signal.",
2775
+ "type": "number",
2776
+ "unit": "factor",
2777
+ "default": 0.4,
2778
+ "min": 0,
2779
+ "max": 1,
2780
+ "automatable": true
2781
+ },
2782
+ "flutter": {
2783
+ "name": "Wow & Flutter",
2784
+ "description": "Slow wow plus fast flutter — tape transport speed wobble, proportional to delay time.",
2785
+ "type": "number",
2786
+ "unit": "factor",
2787
+ "default": 0.3,
2788
+ "min": 0,
2789
+ "max": 1,
2790
+ "automatable": true
2791
+ },
2792
+ "saturation": {
2793
+ "name": "Saturation",
2794
+ "description": "Tape saturation warmth and subtle compression, applied on every pass.",
2795
+ "type": "number",
2796
+ "unit": "factor",
2797
+ "default": 0.4,
2798
+ "min": 0,
2799
+ "max": 1,
2800
+ "automatable": true
2801
+ }
2802
+ }
2803
+ },
2804
+ "TapeStop": {
2805
+ "name": "TapeStop",
2806
+ "panel": "TAPE STOP",
2807
+ "import": "import { TapeStop } from '@jpdutoit/squelchy';",
2808
+ "summary": "Tape Stop Effect",
2809
+ "description": "Classic DJ/producer tape-stop effect with real pitch-dropping slowdown via ring-buffer resampling. Trigger to toggle between stopped and playing.",
2810
+ "categories": [
2811
+ "Time"
2812
+ ],
2813
+ "inputs": {
2814
+ "in": {
2815
+ "signal": "audio",
2816
+ "name": "Audio Input",
2817
+ "description": "Audio signal to apply tape stop effect.",
2818
+ "target": "AudioNode"
2819
+ },
2820
+ "trigger": {
2821
+ "signal": "gate",
2822
+ "name": "Trigger Input",
2823
+ "description": "Rising edge toggles between stop and start. Works with clock or audio-rate triggers.",
2824
+ "target": "AudioNode"
2825
+ }
2826
+ },
2827
+ "outputs": {
2828
+ "out": {
2829
+ "signal": "audio",
2830
+ "name": "Audio Output",
2831
+ "description": "Audio with tape stop/start effect applied.",
2832
+ "type": "AudioNode"
2833
+ }
2834
+ },
2835
+ "params": {
2836
+ "time": {
2837
+ "name": "Stop/Start Time",
2838
+ "description": "Duration of the tape deceleration or acceleration ramp.",
2839
+ "type": "Seconds",
2840
+ "unit": "s",
2841
+ "default": 0.5,
2842
+ "min": 0.01,
2843
+ "max": 4,
2844
+ "scale": "log",
2845
+ "automatable": true
2846
+ },
2847
+ "mix": {
2848
+ "name": "Dry/Wet Mix",
2849
+ "description": "Balance between original signal and tape-stopped signal.",
2850
+ "type": "number",
2851
+ "unit": "factor",
2852
+ "default": 1,
2853
+ "min": 0,
2854
+ "max": 1,
2855
+ "automatable": true
2856
+ }
2857
+ }
2858
+ },
2859
+ "Tilt": {
2860
+ "name": "Tilt",
2861
+ "panel": "TILT",
2862
+ "import": "import { Tilt } from '@jpdutoit/squelchy';",
2863
+ "summary": "Tilt EQ",
2864
+ "description": "Single-knob tone control that tilts the frequency balance around a pivot point. Positive = brighter, negative = darker. Simple but powerful.",
2865
+ "categories": [
2866
+ "Filters"
2867
+ ],
2868
+ "inputs": {
2869
+ "in": {
2870
+ "signal": "audio",
2871
+ "name": "Audio Input",
2872
+ "description": "Audio signal for tilt EQ processing.",
2873
+ "target": "AudioNode"
2874
+ }
2875
+ },
2876
+ "outputs": {
2877
+ "out": {
2878
+ "signal": "audio",
2879
+ "name": "Audio Output",
2880
+ "description": "Frequency-tilted audio output.",
2881
+ "type": "AudioNode"
2882
+ }
2883
+ },
2884
+ "params": {
2885
+ "tilt": {
2886
+ "name": "Tilt Amount",
2887
+ "description": "Positive tilts towards highs (brighter), negative towards lows (darker). Drives the low shelf (inverted) and high shelf gains.",
2888
+ "type": "Decibels",
2889
+ "unit": "dB",
2890
+ "default": 0,
2891
+ "min": -12,
2892
+ "max": 12,
2893
+ "automatable": false
2894
+ },
2895
+ "frequency": {
2896
+ "name": "Pivot Frequency",
2897
+ "description": "Center frequency around which the tilt occurs, shared by both the low and high shelf filters.",
2898
+ "type": "Hz",
2899
+ "unit": "Hz",
2900
+ "default": 1000,
2901
+ "min": 200,
2902
+ "max": 5000,
2903
+ "automatable": false
2904
+ }
2905
+ }
2906
+ },
2907
+ "Tremolo": {
2908
+ "name": "Tremolo",
2909
+ "panel": "TREMOLO",
2910
+ "import": "import { Tremolo } from '@jpdutoit/squelchy';",
2911
+ "summary": "Tremolo Effect",
2912
+ "description": "Classic amplitude modulation found in vintage amps. Creates pulsing, rhythmic volume changes. Square wave shape gives choppy helicopter effect.",
2913
+ "categories": [
2914
+ "Effects"
2915
+ ],
2916
+ "inputs": {
2917
+ "in": {
2918
+ "signal": "audio",
2919
+ "name": "Audio Input",
2920
+ "description": "Audio signal for amplitude modulation.",
2921
+ "target": "AudioNode"
2922
+ },
2923
+ "modRate": {
2924
+ "signal": "modulation",
2925
+ "name": "Rate CV",
2926
+ "description": "Modulate the tremolo LFO speed.",
2927
+ "target": "AudioParam"
2928
+ }
2929
+ },
2930
+ "outputs": {
2931
+ "out": {
2932
+ "signal": "audio",
2933
+ "name": "Audio Output",
2934
+ "description": "Pulsing, rhythmic tremolo audio output.",
2935
+ "type": "AudioNode"
2936
+ }
2937
+ },
2938
+ "params": {
2939
+ "rate": {
2940
+ "name": "Rate",
2941
+ "description": "Amplitude-modulation LFO speed, driven directly by the oscillator frequency. modRate sums into the same AudioParam.",
2942
+ "type": "Hz",
2943
+ "unit": "Hz",
2944
+ "default": 5,
2945
+ "min": 0.5,
2946
+ "max": 20,
2947
+ "automatable": true
2948
+ },
2949
+ "depth": {
2950
+ "name": "Modulation Depth",
2951
+ "description": "How much the volume varies. 100% goes from silence to full volume. Split across a depth gain and a DC offset, so it is set-only (no single AudioParam carries it).",
2952
+ "type": "number",
2953
+ "unit": "factor",
2954
+ "default": 0.5,
2955
+ "min": 0,
2956
+ "max": 1,
2957
+ "automatable": false
2958
+ },
2959
+ "shape": {
2960
+ "name": "LFO Shape",
2961
+ "description": "Waveform shape: sine for smooth, triangle for linear, square for choppy.",
2962
+ "type": "\"sine\" | \"triangle\" | \"square\"",
2963
+ "default": "sine",
2964
+ "options": [
2965
+ "sine",
2966
+ "triangle",
2967
+ "square"
2968
+ ],
2969
+ "automatable": false
2970
+ }
2971
+ }
2972
+ },
2973
+ "Vca": {
2974
+ "name": "Vca",
2975
+ "panel": "VCA",
2976
+ "import": "import { Vca } from '@jpdutoit/squelchy';",
2977
+ "summary": "Voltage Controlled Amplifier",
2978
+ "description": "Controls signal level. GAIN sets the resting level, CV AMT scales (or inverts) the control voltage. Gain is clamped at zero, so deep CV closes the VCA instead of flipping phase.",
2979
+ "categories": [
2980
+ "Dynamics"
2981
+ ],
2982
+ "inputs": {
2983
+ "in": {
2984
+ "signal": "audio",
2985
+ "name": "Audio Input",
2986
+ "description": "Audio signal to be amplified.",
2987
+ "target": "AudioNode"
2988
+ },
2989
+ "modGain": {
2990
+ "signal": "modulation",
2991
+ "name": "Gain CV",
2992
+ "description": "Modulate the level. Scaled by CV AMT and added to GAIN, then clamped to 0–2. Envelope for volume shaping, LFO for tremolo.",
2993
+ "target": "AudioParam"
2994
+ }
2995
+ },
2996
+ "outputs": {
2997
+ "out": {
2998
+ "signal": "audio",
2999
+ "name": "Audio Output",
3000
+ "description": "Amplified audio signal output.",
3001
+ "type": "AudioNode"
3002
+ }
3003
+ },
3004
+ "params": {
3005
+ "gain": {
3006
+ "name": "Resting level",
3007
+ "description": "Sets the level when no CV is patched, and the offset the CV rides on. Leave at 0 for envelope-gated patches so the VCA fully closes.",
3008
+ "type": "number",
3009
+ "unit": "factor",
3010
+ "default": 0.5,
3011
+ "min": 0,
3012
+ "max": 2,
3013
+ "automatable": true
3014
+ },
3015
+ "cvAmount": {
3016
+ "name": "CV attenuverter",
3017
+ "description": "Scales the control voltage from the CV input. Negative values invert it, so the signal ducks instead of swelling.",
3018
+ "type": "number",
3019
+ "unit": "factor",
3020
+ "default": 1,
3021
+ "min": -1,
3022
+ "max": 1,
3023
+ "automatable": true
3024
+ }
3025
+ }
3026
+ },
3027
+ "Vcf": {
3028
+ "name": "Vcf",
3029
+ "panel": "VCF",
3030
+ "import": "import { Vcf } from '@jpdutoit/squelchy';",
3031
+ "summary": "Voltage Controlled Filter",
3032
+ "description": "SEM-style multimode filter (12 dB/oct lowpass, highpass, bandpass, notch). Cutoff modulation is exponential (V/Oct) — ±12 = one octave. RES is true filter Q in every mode; like the SEM it stays clean and never self-oscillates — reach for LADDER when you want scream.",
3033
+ "categories": [
3034
+ "Filters"
3035
+ ],
3036
+ "inputs": {
3037
+ "in": {
3038
+ "signal": "audio",
3039
+ "name": "Audio Input",
3040
+ "description": "Audio signal to be filtered.",
3041
+ "target": "AudioNode"
3042
+ },
3043
+ "modFreq": {
3044
+ "signal": "modulation",
3045
+ "name": "Cutoff V/Oct",
3046
+ "description": "Modulate cutoff in semitones (V/Oct). ±12 = one octave. Connect an LFO or envelope for musical sweeps.",
3047
+ "target": "AudioNode"
3048
+ },
3049
+ "modQ": {
3050
+ "signal": "modulation",
3051
+ "name": "Resonance CV",
3052
+ "description": "Resonance CV: +1 sweeps the full RES range (Q 0.1–20), adds to the knob, clamped. Same true-Q behavior in every filter mode.",
3053
+ "target": "AudioNode"
3054
+ }
3055
+ },
3056
+ "outputs": {
3057
+ "out": {
3058
+ "signal": "audio",
3059
+ "name": "Audio Output",
3060
+ "description": "Filtered audio signal output.",
3061
+ "type": "AudioNode"
3062
+ }
3063
+ },
3064
+ "params": {
3065
+ "filterType": {
3066
+ "name": "Filter Type",
3067
+ "description": "Selects lowpass, highpass, bandpass, or notch response.",
3068
+ "type": "\"lowpass\" | \"highpass\" | \"bandpass\" | \"notch\"",
3069
+ "default": "lowpass",
3070
+ "options": [
3071
+ "lowpass",
3072
+ "highpass",
3073
+ "bandpass",
3074
+ "notch"
3075
+ ],
3076
+ "automatable": false
3077
+ },
3078
+ "note": {
3079
+ "name": "Cutoff Note",
3080
+ "description": "Filter cutoff as a note (83 ≈ 1 kHz, 69 = 440 Hz). Drives the V/OCT worklet 1:1 — the panel knob shows the equivalent Hz.",
3081
+ "type": "Note",
3082
+ "unit": "note",
3083
+ "default": 83,
3084
+ "min": 15,
3085
+ "max": 135,
3086
+ "automatable": true
3087
+ },
3088
+ "resonance": {
3089
+ "name": "Resonance (Q)",
3090
+ "description": "True filter Q, identical in every mode: Q 0.707 is maximally flat, Q 8 peaks ~+18 dB in lowpass and narrows bandpass to f/8.",
3091
+ "type": "number",
3092
+ "unit": "factor",
3093
+ "default": 1,
3094
+ "min": 0.1,
3095
+ "max": 20,
3096
+ "scale": "sqrt",
3097
+ "automatable": false
3098
+ }
3099
+ }
3100
+ },
3101
+ "Vco": {
3102
+ "name": "Vco",
3103
+ "panel": "VCO",
3104
+ "import": "import { Vco } from '@jpdutoit/squelchy';",
3105
+ "summary": "Voltage Controlled Oscillator",
3106
+ "description": "Continuously morphable waveform generator. The X-Y pad controls waveshape: X = skew (symmetry), Y = shape (curvature). Covers sine, triangle, square, sawtooth, and everything in between.",
3107
+ "categories": [
3108
+ "Sources"
3109
+ ],
3110
+ "inputs": {
3111
+ "voct": {
3112
+ "signal": "pitch",
3113
+ "name": "Pitch CV",
3114
+ "description": "Pitch CV input — plays the oscillator chromatically from keyboard or sequencer CV.",
3115
+ "target": "AudioNode"
3116
+ },
3117
+ "modSkew": {
3118
+ "signal": "modulation",
3119
+ "name": "Skew Modulation",
3120
+ "description": "Modulate waveshape symmetry. At center = symmetric, fully right = sawtooth.",
3121
+ "target": "AudioParam"
3122
+ },
3123
+ "modShape": {
3124
+ "signal": "modulation",
3125
+ "name": "Shape Modulation",
3126
+ "description": "Modulate waveshape curvature. Bottom = square, middle = triangle, top = sine.",
3127
+ "target": "AudioParam"
3128
+ },
3129
+ "modDetune": {
3130
+ "signal": "modulation",
3131
+ "name": "Detune Modulation",
3132
+ "description": "Modulate fine pitch in semitones. Connect an LFO for vibrato (amount ~0.1–0.3).",
3133
+ "target": "AudioParam"
3134
+ }
3135
+ },
3136
+ "outputs": {
3137
+ "out": {
3138
+ "signal": "audio",
3139
+ "name": "Audio Output",
3140
+ "description": "Main audio signal output from the oscillator.",
3141
+ "type": "AudioNode"
3142
+ }
3143
+ },
3144
+ "params": {
3145
+ "skew": {
3146
+ "name": "Waveshape Skew",
3147
+ "description": "Symmetry of the waveform: −1 reversed sawtooth, 0 symmetric, +1 sawtooth.",
3148
+ "type": "number",
3149
+ "unit": "factor",
3150
+ "default": 1,
3151
+ "min": -1,
3152
+ "max": 1,
3153
+ "automatable": true
3154
+ },
3155
+ "shape": {
3156
+ "name": "Waveshape Curvature",
3157
+ "description": "Curvature of the waveform: −1 square, 0 triangle, +1 sine.",
3158
+ "type": "number",
3159
+ "unit": "factor",
3160
+ "default": 0,
3161
+ "min": -1,
3162
+ "max": 1,
3163
+ "automatable": true
3164
+ },
3165
+ "offset": {
3166
+ "name": "Pitch Offset",
3167
+ "description": "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.",
3168
+ "type": "Semitones",
3169
+ "unit": "semitone",
3170
+ "default": 69,
3171
+ "min": -48,
3172
+ "max": 108,
3173
+ "automatable": true
3174
+ },
3175
+ "detune": {
3176
+ "name": "Detune",
3177
+ "description": "Fine pitch offset in semitones; ±1 = ±100 cents. Use for detuning oscillators against each other.",
3178
+ "type": "Semitones",
3179
+ "unit": "semitone",
3180
+ "default": 0,
3181
+ "min": -1,
3182
+ "max": 1,
3183
+ "automatable": true
3184
+ },
3185
+ "gain": {
3186
+ "name": "Output Level",
3187
+ "description": "Amplitude of the oscillator output signal.",
3188
+ "type": "number",
3189
+ "unit": "factor",
3190
+ "default": 0.5,
3191
+ "min": 0,
3192
+ "max": 1,
3193
+ "automatable": true
3194
+ }
3195
+ }
3196
+ },
3197
+ "Wah": {
3198
+ "name": "Wah",
3199
+ "panel": "WAH",
3200
+ "import": "import { Wah } from '@jpdutoit/squelchy';",
3201
+ "summary": "Auto-Wah",
3202
+ "description": "Classic wah-wah filter: a resonant bandpass swept by an internal LFO, with exponential (V/Oct) frequency response. Like a real pedal it boosts at the resonant peak, so RES changes the vocal character rather than the volume. Patch an envelope follower into V/OCT for auto-wah.",
3203
+ "categories": [
3204
+ "Filters",
3205
+ "Effects"
3206
+ ],
3207
+ "inputs": {
3208
+ "in": {
3209
+ "signal": "audio",
3210
+ "name": "Audio Input",
3211
+ "description": "Audio signal for wah effect processing.",
3212
+ "target": "AudioNode"
3213
+ },
3214
+ "modFreq": {
3215
+ "signal": "modulation",
3216
+ "name": "Frequency V/Oct",
3217
+ "description": "Modulate center frequency in semitones (V/Oct). Connect an envelope follower for auto-wah.",
3218
+ "target": "AudioNode"
3219
+ }
3220
+ },
3221
+ "outputs": {
3222
+ "out": {
3223
+ "signal": "audio",
3224
+ "name": "Audio Output",
3225
+ "description": "Funky, vocal-like wah audio output.",
3226
+ "type": "AudioNode"
3227
+ }
3228
+ },
3229
+ "params": {
3230
+ "note": {
3231
+ "name": "Center Note",
3232
+ "description": "Wah center frequency as a note (79 ≈ 800 Hz, 69 = 440 Hz). Drives the V/OCT worklet 1:1 — the panel knob shows the equivalent Hz.",
3233
+ "type": "Note",
3234
+ "unit": "note",
3235
+ "default": 79,
3236
+ "min": 55,
3237
+ "max": 95,
3238
+ "automatable": true
3239
+ },
3240
+ "resonance": {
3241
+ "name": "Resonance",
3242
+ "description": "How pronounced and vocal the wah peak sounds.",
3243
+ "type": "number",
3244
+ "unit": "factor",
3245
+ "default": 8,
3246
+ "min": 1,
3247
+ "max": 20,
3248
+ "scale": "log",
3249
+ "automatable": false
3250
+ },
3251
+ "rate": {
3252
+ "name": "Auto-Wah Rate",
3253
+ "description": "Speed of the automatic wah sweep in Hz.",
3254
+ "type": "Hz",
3255
+ "unit": "Hz",
3256
+ "default": 1,
3257
+ "min": 0.1,
3258
+ "max": 10,
3259
+ "scale": "log",
3260
+ "automatable": true
3261
+ },
3262
+ "depth": {
3263
+ "name": "Modulation Depth",
3264
+ "description": "How much the frequency sweeps. Full depth ≈ 3 octaves.",
3265
+ "type": "number",
3266
+ "unit": "factor",
3267
+ "default": 0.6,
3268
+ "min": 0,
3269
+ "max": 1,
3270
+ "automatable": false
3271
+ }
3272
+ }
3273
+ },
3274
+ "Wavefolder": {
3275
+ "name": "Wavefolder",
3276
+ "panel": "FOLD",
3277
+ "import": "import { Wavefolder } from '@jpdutoit/squelchy';",
3278
+ "summary": "Wavefolder",
3279
+ "description": "West Coast synthesis classic. Folds waveform peaks back on themselves, adding rich harmonics. Essential for complex timbres from simple waves.",
3280
+ "categories": [
3281
+ "Distortion"
3282
+ ],
3283
+ "inputs": {
3284
+ "in": {
3285
+ "signal": "audio",
3286
+ "name": "Audio Input",
3287
+ "description": "Audio signal for waveshaping/folding.",
3288
+ "target": "AudioNode"
3289
+ }
3290
+ },
3291
+ "outputs": {
3292
+ "out": {
3293
+ "signal": "audio",
3294
+ "name": "Audio Output",
3295
+ "description": "Harmonically rich wavefolded audio output.",
3296
+ "type": "AudioNode"
3297
+ }
3298
+ },
3299
+ "params": {
3300
+ "folds": {
3301
+ "name": "Fold Amount",
3302
+ "description": "How many times the waveform folds back. More folds = richer harmonics.",
3303
+ "type": "number",
3304
+ "unit": "factor",
3305
+ "default": 2,
3306
+ "min": 1,
3307
+ "max": 10,
3308
+ "automatable": false
3309
+ },
3310
+ "symmetry": {
3311
+ "name": "Symmetry",
3312
+ "description": "Asymmetric folding creates even harmonics for different timbres.",
3313
+ "type": "number",
3314
+ "unit": "factor",
3315
+ "default": 0,
3316
+ "min": -1,
3317
+ "max": 1,
3318
+ "automatable": false
3319
+ },
3320
+ "mix": {
3321
+ "name": "Dry/Wet Mix",
3322
+ "description": "Balance between original and wavefolded signal.",
3323
+ "type": "number",
3324
+ "unit": "factor",
3325
+ "default": 1,
3326
+ "min": 0,
3327
+ "max": 1,
3328
+ "automatable": true
3329
+ }
3330
+ }
3331
+ }
3332
+ }