@audiofab-io/fv1-core 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/blocks/ATL_DEVELOPER_REFERENCE.md +156 -0
  2. package/blocks/control/constant.atl +36 -0
  3. package/blocks/control/entropy_lfo.atl +74 -0
  4. package/blocks/control/envelope.atl +121 -0
  5. package/blocks/control/invert.atl +33 -0
  6. package/blocks/control/pot.atl +150 -0
  7. package/blocks/control/power.atl +77 -0
  8. package/blocks/control/ramp_lfo.atl +122 -0
  9. package/blocks/control/scale_offset.atl +84 -0
  10. package/blocks/control/sincos_lfo.atl +126 -0
  11. package/blocks/control/smoother.atl +48 -0
  12. package/blocks/control/tremolizer.atl +55 -0
  13. package/blocks/effects/delay/micro_stutter.atl +77 -0
  14. package/blocks/effects/delay/mn3011.atl +281 -0
  15. package/blocks/effects/delay/simple_delay.atl +96 -0
  16. package/blocks/effects/delay/triple_tap_delay.atl +176 -0
  17. package/blocks/effects/lo-fi/bit_mangler.atl +74 -0
  18. package/blocks/effects/lo-fi/chiptune.atl +311 -0
  19. package/blocks/effects/lo-fi/tape_degrade.atl +181 -0
  20. package/blocks/effects/modulation/chorus.atl +141 -0
  21. package/blocks/effects/modulation/chorus_4voice.atl +188 -0
  22. package/blocks/effects/modulation/flanger.atl +184 -0
  23. package/blocks/effects/modulation/guitar_synth.atl +350 -0
  24. package/blocks/effects/modulation/harmonic_trem.atl +129 -0
  25. package/blocks/effects/modulation/organ_synth.atl +326 -0
  26. package/blocks/effects/modulation/phaser.atl +300 -0
  27. package/blocks/effects/pitch/octave_up_down.atl +80 -0
  28. package/blocks/effects/pitch/pitch_offset.atl +149 -0
  29. package/blocks/effects/pitch/pitch_offset_dual.atl +197 -0
  30. package/blocks/effects/pitch/pitch_shift.atl +115 -0
  31. package/blocks/effects/pitch/sub_octave.atl +100 -0
  32. package/blocks/effects/reverb/ducking_reverb.atl +145 -0
  33. package/blocks/effects/reverb/min_reverb.atl +132 -0
  34. package/blocks/effects/reverb/plate_reverb.atl +344 -0
  35. package/blocks/effects/reverb/room_reverb.atl +293 -0
  36. package/blocks/effects/reverb/smear.atl +90 -0
  37. package/blocks/effects/reverb/spring_reverb.atl +353 -0
  38. package/blocks/filter/1p_high_pass.atl +63 -0
  39. package/blocks/filter/1p_low_pass.atl +59 -0
  40. package/blocks/filter/auto_wah.atl +207 -0
  41. package/blocks/filter/bbd_loss.atl +79 -0
  42. package/blocks/filter/shelving_high_pass.atl +76 -0
  43. package/blocks/filter/shelving_low_pass.atl +76 -0
  44. package/blocks/filter/svf_2p.atl +116 -0
  45. package/blocks/gain_mix/crossfade.atl +93 -0
  46. package/blocks/gain_mix/crossfade2.atl +86 -0
  47. package/blocks/gain_mix/crossfade3.atl +71 -0
  48. package/blocks/gain_mix/gainboost.atl +54 -0
  49. package/blocks/gain_mix/mixer2.atl +76 -0
  50. package/blocks/gain_mix/mixer3.atl +109 -0
  51. package/blocks/gain_mix/mixer4.atl +152 -0
  52. package/blocks/gain_mix/volume.atl +51 -0
  53. package/blocks/io/adc.atl +53 -0
  54. package/blocks/io/dac.atl +61 -0
  55. package/blocks/other/stickynote.atl +24 -0
  56. package/blocks/other/tone_gen_adjustable.atl +137 -0
  57. package/blocks/other/tone_gen_fixed.atl +109 -0
  58. package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts +13 -0
  59. package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts.map +1 -0
  60. package/dist/blockDiagram/blocks/BlockDirectoryLoader.js +44 -0
  61. package/dist/blockDiagram/blocks/BlockDirectoryLoader.js.map +1 -0
  62. package/dist/blockDiagram/blocks/BlockRegistry.d.ts +48 -0
  63. package/dist/blockDiagram/blocks/BlockRegistry.d.ts.map +1 -0
  64. package/dist/blockDiagram/blocks/BlockRegistry.js +109 -0
  65. package/dist/blockDiagram/blocks/BlockRegistry.js.map +1 -0
  66. package/dist/blockDiagram/blocks/TemplateBlock.d.ts +20 -0
  67. package/dist/blockDiagram/blocks/TemplateBlock.d.ts.map +1 -0
  68. package/dist/blockDiagram/blocks/TemplateBlock.js +82 -0
  69. package/dist/blockDiagram/blocks/TemplateBlock.js.map +1 -0
  70. package/dist/blockDiagram/blocks/base/BaseBlock.d.ts +248 -0
  71. package/dist/blockDiagram/blocks/base/BaseBlock.d.ts.map +1 -0
  72. package/dist/blockDiagram/blocks/base/BaseBlock.js +402 -0
  73. package/dist/blockDiagram/blocks/base/BaseBlock.js.map +1 -0
  74. package/dist/blockDiagram/builtinBlocks.d.ts +9 -0
  75. package/dist/blockDiagram/builtinBlocks.d.ts.map +1 -0
  76. package/dist/blockDiagram/builtinBlocks.js +4912 -0
  77. package/dist/blockDiagram/builtinBlocks.js.map +1 -0
  78. package/dist/blockDiagram/compiler/BlockTemplate.d.ts +37 -0
  79. package/dist/blockDiagram/compiler/BlockTemplate.d.ts.map +1 -0
  80. package/dist/blockDiagram/compiler/BlockTemplate.js +860 -0
  81. package/dist/blockDiagram/compiler/BlockTemplate.js.map +1 -0
  82. package/dist/blockDiagram/compiler/CodeOptimizer.d.ts +75 -0
  83. package/dist/blockDiagram/compiler/CodeOptimizer.d.ts.map +1 -0
  84. package/dist/blockDiagram/compiler/CodeOptimizer.js +443 -0
  85. package/dist/blockDiagram/compiler/CodeOptimizer.js.map +1 -0
  86. package/dist/blockDiagram/compiler/GraphCompiler.d.ts +63 -0
  87. package/dist/blockDiagram/compiler/GraphCompiler.d.ts.map +1 -0
  88. package/dist/blockDiagram/compiler/GraphCompiler.js +656 -0
  89. package/dist/blockDiagram/compiler/GraphCompiler.js.map +1 -0
  90. package/dist/blockDiagram/compiler/TopologicalSort.d.ts +63 -0
  91. package/dist/blockDiagram/compiler/TopologicalSort.d.ts.map +1 -0
  92. package/dist/blockDiagram/compiler/TopologicalSort.js +268 -0
  93. package/dist/blockDiagram/compiler/TopologicalSort.js.map +1 -0
  94. package/dist/blockDiagram/index.d.ts +30 -0
  95. package/dist/blockDiagram/index.d.ts.map +1 -0
  96. package/dist/blockDiagram/index.js +29 -0
  97. package/dist/blockDiagram/index.js.map +1 -0
  98. package/dist/blockDiagram/types/Block.d.ts +178 -0
  99. package/dist/blockDiagram/types/Block.d.ts.map +1 -0
  100. package/dist/blockDiagram/types/Block.js +5 -0
  101. package/dist/blockDiagram/types/Block.js.map +1 -0
  102. package/dist/blockDiagram/types/CodeGenContext.d.ts +235 -0
  103. package/dist/blockDiagram/types/CodeGenContext.d.ts.map +1 -0
  104. package/dist/blockDiagram/types/CodeGenContext.js +554 -0
  105. package/dist/blockDiagram/types/CodeGenContext.js.map +1 -0
  106. package/dist/blockDiagram/types/Connection.d.ts +17 -0
  107. package/dist/blockDiagram/types/Connection.d.ts.map +1 -0
  108. package/dist/blockDiagram/types/Connection.js +5 -0
  109. package/dist/blockDiagram/types/Connection.js.map +1 -0
  110. package/dist/blockDiagram/types/Graph.d.ts +28 -0
  111. package/dist/blockDiagram/types/Graph.d.ts.map +1 -0
  112. package/dist/blockDiagram/types/Graph.js +24 -0
  113. package/dist/blockDiagram/types/Graph.js.map +1 -0
  114. package/dist/blockDiagram/types/IR.d.ts +79 -0
  115. package/dist/blockDiagram/types/IR.d.ts.map +1 -0
  116. package/dist/blockDiagram/types/IR.js +6 -0
  117. package/dist/blockDiagram/types/IR.js.map +1 -0
  118. package/dist/blockDiagram/utils/SpinCADConverter.d.ts +17 -0
  119. package/dist/blockDiagram/utils/SpinCADConverter.d.ts.map +1 -0
  120. package/dist/blockDiagram/utils/SpinCADConverter.js +307 -0
  121. package/dist/blockDiagram/utils/SpinCADConverter.js.map +1 -0
  122. package/dist/effect/compileEffect.d.ts +51 -0
  123. package/dist/effect/compileEffect.d.ts.map +1 -0
  124. package/dist/effect/compileEffect.js +133 -0
  125. package/dist/effect/compileEffect.js.map +1 -0
  126. package/dist/index.d.ts +2 -0
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +2 -0
  129. package/dist/index.js.map +1 -1
  130. package/package.json +17 -5
@@ -0,0 +1,353 @@
1
+ ---
2
+ {
3
+ "type": "effects.springreverb",
4
+ "category": "Effects",
5
+ "subcategory": "Reverb",
6
+ "name": "Spring Reverb",
7
+ "description": "Fender-style spring reverb with RS127 filtering",
8
+ "color": "#7100FC",
9
+ "inputs": [
10
+ { "id": "in", "name": "Input", "type": "audio" },
11
+ { "id": "toneCV", "name": "Tone", "type": "control", "required": false },
12
+ { "id": "reverbTimeCV", "name": "Reverb Time", "type": "control", "required": false }
13
+ ],
14
+ "outputs": [
15
+ { "id": "out", "name": "Output", "type": "audio" }
16
+ ],
17
+ "parameters": [
18
+ {
19
+ "id": "tone",
20
+ "name": "Tone",
21
+ "type": "number",
22
+ "default": 0.5,
23
+ "min": 0,
24
+ "max": 1,
25
+ "step": 0.01
26
+ },
27
+ {
28
+ "id": "reverbTime",
29
+ "name": "Reverb Time",
30
+ "type": "number",
31
+ "default": 0.775,
32
+ "min": 0.7,
33
+ "max": 0.85,
34
+ "step": 0.01
35
+ },
36
+ {
37
+ "id": "chirpFilters",
38
+ "name": "Chirp Filters",
39
+ "type": "number",
40
+ "default": 37,
41
+ "min": 7,
42
+ "max": 41,
43
+ "step": 1
44
+ }
45
+ ],
46
+ "memories": [
47
+ { "id": "lap1a", "size": 404 },
48
+ { "id": "lap1b", "size": 967 },
49
+ { "id": "d1", "size": 1445 },
50
+ { "id": "lap2a", "size": 608 },
51
+ { "id": "lap2b", "size": 893 },
52
+ { "id": "d2", "size": 1013 },
53
+ { "id": "ap1", "size": 5 },
54
+ { "id": "ap2", "size": 5 },
55
+ { "id": "ap3", "size": 5 },
56
+ { "id": "ap4", "size": 5 },
57
+ { "id": "ap5", "size": 5 },
58
+ { "id": "ap6", "size": 5 },
59
+ { "id": "ap7", "size": 5 },
60
+ { "id": "ap8", "size": 6 },
61
+ { "id": "ap9", "size": 6 },
62
+ { "id": "ap10", "size": 6 },
63
+ { "id": "ap11", "size": 6 },
64
+ { "id": "ap12", "size": 6 },
65
+ { "id": "ap13", "size": 6 },
66
+ { "id": "ap14", "size": 6 },
67
+ { "id": "ap15", "size": 6 },
68
+ { "id": "ap16", "size": 6 },
69
+ { "id": "ap17", "size": 6 },
70
+ { "id": "ap18", "size": 6 },
71
+ { "id": "ap19", "size": 6 },
72
+ { "id": "ap20", "size": 6 },
73
+ { "id": "ap21", "size": 6 },
74
+ { "id": "ap22", "size": 7 },
75
+ { "id": "ap23", "size": 7 },
76
+ { "id": "ap24", "size": 7 },
77
+ { "id": "ap25", "size": 7 },
78
+ { "id": "ap26", "size": 7 },
79
+ { "id": "ap27", "size": 7 },
80
+ { "id": "ap28", "size": 7 },
81
+ { "id": "ap29", "size": 7 },
82
+ { "id": "ap30", "size": 7 },
83
+ { "id": "ap31", "size": 7 },
84
+ { "id": "ap32", "size": 7 },
85
+ { "id": "ap33", "size": 7 },
86
+ { "id": "ap34", "size": 7 },
87
+ { "id": "ap35", "size": 7 },
88
+ { "id": "ap36", "size": 8 },
89
+ { "id": "ap37", "size": 8 },
90
+ { "id": "ap38", "size": 8 },
91
+ { "id": "ap39", "size": 8 },
92
+ { "id": "ap40", "size": 8 },
93
+ { "id": "ap41", "size": 8 }
94
+ ],
95
+ "registers": [
96
+ "mono", "lp1", "lp2", "KRT", "revin", "kfil", "lpf1", "hpf1", "spring", "temp"
97
+ ]
98
+ }
99
+ ---
100
+ @section init
101
+ ; Spring Reverb
102
+ skp RUN, springreverb_init_end
103
+ wlds SIN0, 15, 40 ; LFO for reverb smoothing
104
+ springreverb_init_end:
105
+
106
+ @section main
107
+ ; Spring Reverb
108
+
109
+ ; Calculate tone coefficient (kfil) from CV input or parameter
110
+ @if pinConnected(toneCV)
111
+ rdax ${input.toneCV}, 1.0 ; Read tone from CV input
112
+ sof 0.4, 0.1 ; Map [0,1] to [0.1,0.5]
113
+ @else
114
+ sof 0.0, ${tone} ; Read tone from parameter
115
+ @endif
116
+ wrax ${reg.kfil}, 0.0 ; Write tone coefficient
117
+
118
+ ; Calculate reverb time (KRT) from CV input or parameter
119
+ @if pinConnected(reverbTimeCV)
120
+ rdax ${input.reverbTimeCV}, 1.0 ; Read reverb time from CV input
121
+ sof 0.15, 0.7 ; Map [0,1] to [0.7,0.85]
122
+ @else
123
+ sof 0.0, ${reverbTime} ; Read reverb time from parameter
124
+ @endif
125
+ wrax ${reg.KRT}, 0.0 ; Write reverb time
126
+
127
+ ; Sum inputs to mono
128
+ @if pinConnected(in)
129
+ rdax ${input.in}, 1.0
130
+ @else
131
+ sof 0.0, 0.0
132
+ @endif
133
+ wrax ${reg.mono}, 1.0 ; Save and keep in ACC
134
+
135
+ ; Abbey Road EMI RS127 pre-reverb filter
136
+ rdfx ${reg.lpf1}, 0.853 ; 10kHz LPF
137
+ wrlx ${reg.lpf1}, -0.5 ; Shelving LPF
138
+ rdfx ${reg.hpf1}, 0.109 ; 600Hz HPF
139
+ wrhx ${reg.hpf1}, -0.5 ; Shelving HPF
140
+ wrax ${reg.revin}, 1.0 ; Save filtered signal
141
+
142
+ ; Reverb loop 1
143
+ rda ${mem.d1}#, 1.0 ; Get 1st delay output
144
+ mulx ${reg.KRT} ; Apply reverb time
145
+ rdfx ${reg.lp1}, 0.55 ; Shelving lowpass
146
+ wrlx ${reg.lp1}, -1.0
147
+ rda ${mem.lap1a}#, 0.6 ; Reverb allpass 1a
148
+ wrap ${mem.lap1a}, -0.6
149
+ rda ${mem.lap1b}#, 0.6 ; Reverb allpass 1b
150
+ wrap ${mem.lap1b}, -0.6
151
+ rdax ${reg.revin}, 1.0 ; Add filtered input
152
+ wra ${mem.d2}, 0.0 ; Put in 2nd spring delay
153
+
154
+ ; Reverb loop 2
155
+ rda ${mem.d2}#, 1.0 ; Get 2nd delay output
156
+ mulx ${reg.KRT} ; Apply reverb time
157
+ rdfx ${reg.lp2}, 0.55 ; Shelving lowpass
158
+ wrlx ${reg.lp2}, -1.0
159
+ rda ${mem.lap2a}#, 0.6 ; Reverb allpass 2a
160
+ wrap ${mem.lap2a}, -0.6
161
+ rda ${mem.lap2b}#, 0.6 ; Reverb allpass 2b
162
+ wrap ${mem.lap2b}, -0.6
163
+ rdax ${reg.revin}, 1.0 ; Add filtered input
164
+ wra ${mem.d1}, 0.0 ; Put in 1st spring delay
165
+
166
+ ; Chirp filter (spring dispersion)
167
+ rdax ${reg.lp1}, 1.0
168
+ rdax ${reg.lp2}, 1.0
169
+
170
+ ; Generated chirp allpass filters
171
+ @if ${chirpFilters} > 0
172
+ rda ${mem.ap1}^, -0.6
173
+ wrap ${mem.ap1}, 0.6
174
+ @endif
175
+ @if ${chirpFilters} > 1
176
+ rda ${mem.ap2}^, -0.6
177
+ wrap ${mem.ap2}, 0.6
178
+ @endif
179
+ @if ${chirpFilters} > 2
180
+ rda ${mem.ap3}^, -0.6
181
+ wrap ${mem.ap3}, 0.6
182
+ @endif
183
+ @if ${chirpFilters} > 3
184
+ rda ${mem.ap4}^, -0.6
185
+ wrap ${mem.ap4}, 0.6
186
+ @endif
187
+ @if ${chirpFilters} > 4
188
+ rda ${mem.ap5}^, -0.6
189
+ wrap ${mem.ap5}, 0.6
190
+ @endif
191
+ @if ${chirpFilters} > 5
192
+ rda ${mem.ap6}^, -0.6
193
+ wrap ${mem.ap6}, 0.6
194
+ @endif
195
+ @if ${chirpFilters} > 6
196
+ rda ${mem.ap7}^, -0.6
197
+ wrap ${mem.ap7}, 0.6
198
+ @endif
199
+ @if ${chirpFilters} > 7
200
+ rda ${mem.ap8}^, -0.6
201
+ wrap ${mem.ap8}, 0.6
202
+ @endif
203
+ @if ${chirpFilters} > 8
204
+ rda ${mem.ap9}^, -0.6
205
+ wrap ${mem.ap9}, 0.6
206
+ @endif
207
+ @if ${chirpFilters} > 9
208
+ rda ${mem.ap10}^, -0.6
209
+ wrap ${mem.ap10}, 0.6
210
+ @endif
211
+ @if ${chirpFilters} > 10
212
+ rda ${mem.ap11}^, -0.6
213
+ wrap ${mem.ap11}, 0.6
214
+ @endif
215
+ @if ${chirpFilters} > 11
216
+ rda ${mem.ap12}^, -0.6
217
+ wrap ${mem.ap12}, 0.6
218
+ @endif
219
+ @if ${chirpFilters} > 12
220
+ rda ${mem.ap13}^, -0.6
221
+ wrap ${mem.ap13}, 0.6
222
+ @endif
223
+ @if ${chirpFilters} > 13
224
+ rda ${mem.ap14}^, -0.6
225
+ wrap ${mem.ap14}, 0.6
226
+ @endif
227
+ @if ${chirpFilters} > 14
228
+ rda ${mem.ap15}^, -0.6
229
+ wrap ${mem.ap15}, 0.6
230
+ @endif
231
+ @if ${chirpFilters} > 15
232
+ rda ${mem.ap16}^, -0.6
233
+ wrap ${mem.ap16}, 0.6
234
+ @endif
235
+ @if ${chirpFilters} > 16
236
+ rda ${mem.ap17}^, -0.6
237
+ wrap ${mem.ap17}, 0.6
238
+ @endif
239
+ @if ${chirpFilters} > 17
240
+ rda ${mem.ap18}^, -0.6
241
+ wrap ${mem.ap18}, 0.6
242
+ @endif
243
+ @if ${chirpFilters} > 18
244
+ rda ${mem.ap19}^, -0.6
245
+ wrap ${mem.ap19}, 0.6
246
+ @endif
247
+ @if ${chirpFilters} > 19
248
+ rda ${mem.ap20}^, -0.6
249
+ wrap ${mem.ap20}, 0.6
250
+ @endif
251
+ @if ${chirpFilters} > 20
252
+ rda ${mem.ap21}^, -0.6
253
+ wrap ${mem.ap21}, 0.6
254
+ @endif
255
+ @if ${chirpFilters} > 21
256
+ rda ${mem.ap22}^, -0.6
257
+ wrap ${mem.ap22}, 0.6
258
+ @endif
259
+ @if ${chirpFilters} > 22
260
+ rda ${mem.ap23}^, -0.6
261
+ wrap ${mem.ap23}, 0.6
262
+ @endif
263
+ @if ${chirpFilters} > 23
264
+ rda ${mem.ap24}^, -0.6
265
+ wrap ${mem.ap24}, 0.6
266
+ @endif
267
+ @if ${chirpFilters} > 24
268
+ rda ${mem.ap25}^, -0.6
269
+ wrap ${mem.ap25}, 0.6
270
+ @endif
271
+ @if ${chirpFilters} > 25
272
+ rda ${mem.ap26}^, -0.6
273
+ wrap ${mem.ap26}, 0.6
274
+ @endif
275
+ @if ${chirpFilters} > 26
276
+ rda ${mem.ap27}^, -0.6
277
+ wrap ${mem.ap27}, 0.6
278
+ @endif
279
+ @if ${chirpFilters} > 27
280
+ rda ${mem.ap28}^, -0.6
281
+ wrap ${mem.ap28}, 0.6
282
+ @endif
283
+ @if ${chirpFilters} > 28
284
+ rda ${mem.ap29}^, -0.6
285
+ wrap ${mem.ap29}, 0.6
286
+ @endif
287
+ @if ${chirpFilters} > 29
288
+ rda ${mem.ap30}^, -0.6
289
+ wrap ${mem.ap30}, 0.6
290
+ @endif
291
+ @if ${chirpFilters} > 30
292
+ rda ${mem.ap31}^, -0.6
293
+ wrap ${mem.ap31}, 0.6
294
+ @endif
295
+ @if ${chirpFilters} > 31
296
+ rda ${mem.ap32}^, -0.6
297
+ wrap ${mem.ap32}, 0.6
298
+ @endif
299
+ @if ${chirpFilters} > 32
300
+ rda ${mem.ap33}^, -0.6
301
+ wrap ${mem.ap33}, 0.6
302
+ @endif
303
+ @if ${chirpFilters} > 33
304
+ rda ${mem.ap34}^, -0.6
305
+ wrap ${mem.ap34}, 0.6
306
+ @endif
307
+ @if ${chirpFilters} > 34
308
+ rda ${mem.ap35}^, -0.6
309
+ wrap ${mem.ap35}, 0.6
310
+ @endif
311
+ @if ${chirpFilters} > 35
312
+ rda ${mem.ap36}^, -0.6
313
+ wrap ${mem.ap36}, 0.6
314
+ @endif
315
+ @if ${chirpFilters} > 36
316
+ rda ${mem.ap37}^, -0.6
317
+ wrap ${mem.ap37}, 0.6
318
+ @endif
319
+ @if ${chirpFilters} > 37
320
+ rda ${mem.ap38}^, -0.6
321
+ wrap ${mem.ap38}, 0.6
322
+ @endif
323
+ @if ${chirpFilters} > 38
324
+ rda ${mem.ap39}^, -0.6
325
+ wrap ${mem.ap39}, 0.6
326
+ @endif
327
+ @if ${chirpFilters} > 39
328
+ rda ${mem.ap40}^, -0.6
329
+ wrap ${mem.ap40}, 0.6
330
+ @endif
331
+ @if ${chirpFilters} > 40
332
+ rda ${mem.ap41}^, -0.6
333
+ wrap ${mem.ap41}, 0.6
334
+ @endif
335
+
336
+ ; Post-reverb tone shaping
337
+ rdax ${reg.temp}, -1.0
338
+ mulx ${reg.kfil}
339
+ rdax ${reg.temp}, 1.0
340
+ wrax ${reg.temp}, 1.0
341
+ wrax ${reg.spring}, 0.0
342
+
343
+ ; Output 100% wet signal
344
+ rdax ${reg.spring}, 1.0
345
+ wrax ${output.out}, 0.0
346
+
347
+ ; Smooth reverb with LFO modulation
348
+ cho RDA, SIN0, SIN|REG|COMPC, ${mem.lap1b}+25
349
+ cho RDA, SIN0, SIN, ${mem.lap1b}+26
350
+ wra ${mem.lap1b}+50, 0.0
351
+ cho RDA, SIN0, COS|REG|COMPC, ${mem.lap2b}+25
352
+ cho RDA, SIN0, COS, ${mem.lap2b}+26
353
+ wra ${mem.lap2b}+50, 0.0
@@ -0,0 +1,63 @@
1
+ ---
2
+ {
3
+ "type": "filter.hpf_1p",
4
+ "category": "Filter",
5
+ "name": "1P HPF",
6
+ "description": "1-pole high pass filter",
7
+ "inputs": [
8
+ {
9
+ "id": "input",
10
+ "name": "Input",
11
+ "type": "audio"
12
+ },
13
+ {
14
+ "id": "freqControl",
15
+ "name": "Frequency",
16
+ "type": "control"
17
+ }
18
+ ],
19
+ "outputs": [
20
+ {
21
+ "id": "output",
22
+ "name": "Output",
23
+ "type": "audio"
24
+ }
25
+ ],
26
+ "parameters": [
27
+ {
28
+ "id": "freq",
29
+ "name": "Frequency",
30
+ "type": "number",
31
+ "min": 40,
32
+ "max": 3500,
33
+ "default": 100,
34
+ "conversion": "LOGFREQ"
35
+ }
36
+ ],
37
+ "color": "#24f26f",
38
+ "registers": [
39
+ "lpf1"
40
+ ]
41
+ }
42
+ ---
43
+ @section header
44
+ @comment "Generated from spincad source file HPF_RDFX.spincad"
45
+
46
+ @section main
47
+ // variable - Name - low - high - multiplier - precision - option
48
+ @if pinConnected(${input.input})
49
+ @if pinConnected(Frequency)
50
+ rdax ${input.input}, ${freq}
51
+ rdax ${reg.lpf1}, -${freq}
52
+ mulx ${input.freqControl}
53
+ rdax ${reg.lpf1}, 1.0
54
+ @else
55
+ rdax ${input.input}, 1.0
56
+ rdfx ${reg.lpf1}, ${freq}
57
+ @endif
58
+ wrax ${reg.lpf1}, -1.0
59
+ // do a lowpass filter then subtract that from the ${input.input}.
60
+ // voila high pass filter!
61
+ rdax ${input.input}, 1.0
62
+ wrax ${output.output}, 0
63
+ @endif
@@ -0,0 +1,59 @@
1
+ ---
2
+ {
3
+ "type": "filter.lpf_1p",
4
+ "category": "Filter",
5
+ "name": "1P LPF",
6
+ "description": "1-pole low pass filter",
7
+ "inputs": [
8
+ {
9
+ "id": "input",
10
+ "name": "Input",
11
+ "type": "audio"
12
+ },
13
+ {
14
+ "id": "freqControl",
15
+ "name": "Frequency",
16
+ "type": "control"
17
+ }
18
+ ],
19
+ "outputs": [
20
+ {
21
+ "id": "lpf1",
22
+ "name": "Output",
23
+ "type": "audio"
24
+ }
25
+ ],
26
+ "parameters": [
27
+ {
28
+ "id": "freq",
29
+ "name": "Frequency",
30
+ "type": "number",
31
+ "min": 80,
32
+ "max": 5000,
33
+ "default": 100,
34
+ "conversion": "LOGFREQ"
35
+ }
36
+ ],
37
+ "color": "#24f26f",
38
+ "registers": [
39
+ "output"
40
+ ]
41
+ }
42
+ ---
43
+ @section header
44
+ @comment "Generated from spincad source file LPF_RDFX.spincad"
45
+
46
+ @section main
47
+ // variable - Name - low - high - multiplier - precision - option
48
+ @if pinConnected(${input.input})
49
+ @if pinConnected(Frequency)
50
+ rdax ${input.input}, ${freq}
51
+ rdax ${output.lpf1}, -${freq}
52
+ mulx ${input.freqControl}
53
+ rdax ${output.lpf1}, 1.0
54
+ @else
55
+ rdax ${input.input}, 1.0
56
+ rdfx ${output.lpf1}, ${freq}
57
+ @endif
58
+ wrax ${output.lpf1}, 0
59
+ @endif
@@ -0,0 +1,207 @@
1
+ ---
2
+ {
3
+ "type": "filter.auto_wah",
4
+ "name": "Auto-Wah",
5
+ "category": "Filter",
6
+ "description": "Envelope-controlled resonant bandpass filter. Pick harder to open the filter — produces the talkbox-like vowel sweep made famous by the Living on a Prayer guitar intro.",
7
+ "color": "#f26724",
8
+ "width": 180,
9
+ "inputs": [
10
+ {
11
+ "id": "in",
12
+ "name": "Input",
13
+ "type": "audio",
14
+ "required": true
15
+ },
16
+ {
17
+ "id": "sensitivity_cv",
18
+ "name": "Sensitivity",
19
+ "type": "control",
20
+ "required": false,
21
+ "parameter": "sensitivity"
22
+ },
23
+ {
24
+ "id": "resonance_cv",
25
+ "name": "Resonance",
26
+ "type": "control",
27
+ "required": false,
28
+ "parameter": "resonance"
29
+ },
30
+ {
31
+ "id": "mix_cv",
32
+ "name": "Mix",
33
+ "type": "control",
34
+ "required": false,
35
+ "parameter": "mix"
36
+ }
37
+ ],
38
+ "outputs": [
39
+ {
40
+ "id": "out",
41
+ "name": "Output",
42
+ "type": "audio"
43
+ }
44
+ ],
45
+ "parameters": [
46
+ {
47
+ "id": "base_freq",
48
+ "name": "Base Freq",
49
+ "type": "number",
50
+ "default": 300,
51
+ "min": 100,
52
+ "max": 1500,
53
+ "step": 10,
54
+ "conversion": "SVFFREQ",
55
+ "description": "Lowest filter frequency (at silence). Sweep rises above this on transients."
56
+ },
57
+ {
58
+ "id": "sensitivity",
59
+ "name": "Sensitivity",
60
+ "type": "number",
61
+ "default": 0.55,
62
+ "min": 0.0,
63
+ "max": 0.6,
64
+ "step": 0.01,
65
+ "description": "How far the envelope opens the filter. Higher = wider vowel sweep."
66
+ },
67
+ {
68
+ "id": "resonance",
69
+ "name": "Resonance",
70
+ "type": "number",
71
+ "default": 0.82,
72
+ "min": 0.0,
73
+ "max": 0.97,
74
+ "step": 0.01,
75
+ "description": "Filter Q / resonant peak. Higher values add the characteristic vowel quack."
76
+ },
77
+ {
78
+ "id": "attack",
79
+ "name": "Attack",
80
+ "type": "number",
81
+ "default": 0.08,
82
+ "min": 0.01,
83
+ "max": 0.5,
84
+ "step": 0.01,
85
+ "description": "Envelope attack speed. Higher = faster response to pick transients."
86
+ },
87
+ {
88
+ "id": "release",
89
+ "name": "Release",
90
+ "type": "number",
91
+ "default": 0.004,
92
+ "min": 0.001,
93
+ "max": 0.05,
94
+ "step": 0.001,
95
+ "description": "Envelope release speed. Lower = slower filter close after note ends."
96
+ },
97
+ {
98
+ "id": "mix",
99
+ "name": "Dry/Wet Mix",
100
+ "type": "number",
101
+ "default": 1.0,
102
+ "min": 0.0,
103
+ "max": 1.0,
104
+ "step": 0.01
105
+ }
106
+ ],
107
+ "registers": [
108
+ "env",
109
+ "bp",
110
+ "lp",
111
+ "freq_reg",
112
+ "damp_reg",
113
+ "sens_reg",
114
+ "mix_reg",
115
+ "dry_val",
116
+ "temp"
117
+ ]
118
+ }
119
+ ---
120
+ @section main
121
+ @if pinConnected(in)
122
+
123
+ ; ======================================================
124
+ ; Stage 0: Save dry signal
125
+ ; ======================================================
126
+ rdax ${input.in}, 1.0
127
+ wrax ${reg.dry_val}, 0.0
128
+
129
+ ; ======================================================
130
+ ; Stage 1: Load CVs
131
+ ; ======================================================
132
+ @cv sensitivity_cv
133
+ wrax ${reg.sens_reg}, 0.0
134
+
135
+ @cv resonance_cv
136
+ sof -1.0, 1.0 ; damp = 1 - resonance (high resonance → low damping)
137
+ wrax ${reg.damp_reg}, 0.0
138
+
139
+ @cv mix_cv
140
+ wrax ${reg.mix_reg}, 0.0
141
+
142
+ ; ======================================================
143
+ ; Stage 2: Envelope Follower (Fast Attack, Slow Release)
144
+ ; ======================================================
145
+ rdax ${input.in}, 1.0
146
+ sof 1.99, 0.0 ; 2x pre-boost for detection only — env reaches higher values at normal guitar levels
147
+ absa
148
+ rdax ${reg.env}, -1.0 ; ACC = |input| - env
149
+ skp gez, ${local.ATK}
150
+ ; Release path
151
+ sof ${param.release}, 0.0
152
+ skp run, ${local.UPD}
153
+ ${local.ATK}:
154
+ sof ${param.attack}, 0.0
155
+ ${local.UPD}:
156
+ rdax ${reg.env}, 1.0 ; ACC = delta + env = new env
157
+ wrax ${reg.env}, 0.0
158
+
159
+ ; ======================================================
160
+ ; Stage 3: Compute Swept Frequency
161
+ ; freq = base_freq + env * sensitivity
162
+ ; ======================================================
163
+ rdax ${reg.env}, 1.0
164
+ mulx ${reg.sens_reg} ; ACC = env * sensitivity
165
+ sof 1.0, ${param.base_freq} ; ACC = base_freq + env * sensitivity
166
+ wrax ${reg.freq_reg}, 0.0
167
+
168
+ ; ======================================================
169
+ ; Stage 4: Chamberlin SVF — Bandpass output
170
+ ; HP = input - lp - damp*bp
171
+ ; bp_new = bp_old + F * HP
172
+ ; lp_new = lp_old + F * bp_new
173
+ ; ======================================================
174
+
175
+ ; Compute (input - lp_old) and save as temp
176
+ rdax ${input.in}, 1.0
177
+ rdax ${reg.lp}, -1.0
178
+ wrax ${reg.temp}, 0.0 ; temp = input - lp_old
179
+
180
+ ; Compute HP = (input - lp_old) - damp * bp_old
181
+ rdax ${reg.bp}, 1.0
182
+ mulx ${reg.damp_reg} ; ACC = damp * bp_old
183
+ rdax ${reg.temp}, -1.0 ; ACC = damp*bp_old - (input - lp_old)
184
+ sof -1.0, 0.0 ; ACC = HP = (input - lp_old) - damp*bp_old
185
+
186
+ ; bp_new = bp_old + F * HP
187
+ mulx ${reg.freq_reg} ; ACC = F * HP
188
+ rdax ${reg.bp}, 1.0 ; ACC = bp_old + F * HP
189
+ wrax ${reg.bp}, 1.0 ; Save bp_new, keep in ACC
190
+
191
+ ; lp_new = lp_old + F * bp_new
192
+ mulx ${reg.freq_reg} ; ACC = F * bp_new
193
+ rdax ${reg.lp}, 1.0 ; ACC = lp_old + F * bp_new
194
+ wrax ${reg.lp}, 0.0 ; Save lp_new
195
+
196
+ ; ======================================================
197
+ ; Stage 5: Dry/Wet Mix
198
+ ; out = dry + (wet - dry) * mix
199
+ ; ======================================================
200
+ rdax ${reg.bp}, 0.7 ; Bandpass: vowel/formant peak (dominant)
201
+ rdax ${reg.lp}, 0.3 ; Lowpass: adds fundamental body — pure BP sounds thin
202
+ rdax ${reg.dry_val}, -1.0 ; ACC = wet - dry
203
+ mulx ${reg.mix_reg} ; ACC = (wet - dry) * mix
204
+ rdax ${reg.dry_val}, 1.0 ; ACC = dry + (wet - dry) * mix
205
+ wrax ${output.out}, 0.0
206
+
207
+ @endif