@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,122 @@
1
+ ---
2
+ {
3
+ "type": "control.ramp_lfo",
4
+ "name": "Ramp LFO",
5
+ "category": "Control",
6
+ "description": "Ramp LFO generator with adjustable rate, amplitude, slope, and dual outputs (Ramp / Triangle).",
7
+ "color": "#f2b824",
8
+ "labelTemplate": "${param.lfoSel == 0 ? 'RMP0' : 'RMP1'}",
9
+ "inputs": [
10
+ {
11
+ "id": "speed",
12
+ "name": "Speed",
13
+ "type": "control"
14
+ },
15
+ {
16
+ "id": "width",
17
+ "name": "Level (Width)",
18
+ "type": "control"
19
+ }
20
+ ],
21
+ "outputs": [
22
+ {
23
+ "id": "ramp",
24
+ "name": "Ramp Out",
25
+ "type": "control"
26
+ },
27
+ {
28
+ "id": "triangle",
29
+ "name": "Triangle Out",
30
+ "type": "control"
31
+ }
32
+ ],
33
+ "parameters": [
34
+ {
35
+ "id": "lfoSel",
36
+ "name": "LFO Selection",
37
+ "type": "select",
38
+ "default": 0,
39
+ "options": [
40
+ { "value": 0, "label": "RMP0" },
41
+ { "value": 1, "label": "RMP1" }
42
+ ],
43
+ "description": "Which LFO oscillator to use (0 or 1)."
44
+ },
45
+ {
46
+ "id": "speed",
47
+ "name": "Speed",
48
+ "type": "number",
49
+ "default": 6.25,
50
+ "min": -32,
51
+ "max": 64,
52
+ "step": 0.01,
53
+ "description": "Base LFO rate (used if Speed control is not connected)."
54
+ },
55
+ {
56
+ "id": "amplitude",
57
+ "name": "Base Amplitude",
58
+ "type": "select",
59
+ "default": 4096,
60
+ "options": [
61
+ { "value": 4096, "label": "Full (4096)" },
62
+ { "value": 2048, "label": "Half (2048)" },
63
+ { "value": 1024, "label": "Quarter (1024)" },
64
+ { "value": 512, "label": "Eighth (512)" }
65
+ ],
66
+ "description": "Internal amplitude limit of the WLDR instruction."
67
+ }
68
+ ]
69
+ }
70
+ ---
71
+ @if ${param.lfoSel} == 0
72
+ @equals lfoNum RMP0
73
+ @equals lfoRateReg RMP0_RATE
74
+ @else
75
+ @equals lfoNum RMP1
76
+ @equals lfoRateReg RMP1_RATE
77
+ @endif
78
+
79
+ ; Ramp LFO generator
80
+ @section init
81
+ ; WLDR accepts discrete amplitudes: 512, 1024, 2048, 4096.
82
+ ; Negative frequencies slope Upwards natively. Positive frequencies slope Downwards.
83
+ wldr ${lfoNum}, ${param.speed} * 512, ${param.amplitude}
84
+
85
+ @section main
86
+
87
+ ; Speed modulation (-1.0 to 1.0 covers -32768 to 32767 natively)
88
+ @if pinConnected(speed)
89
+ rdax ${input.speed}, 1.0
90
+ wrax ${lfoRateReg}, 0.0
91
+ @endif
92
+
93
+ ; Ramp output
94
+ @if pinConnected(ramp)
95
+ cho rdal, ${lfoNum}
96
+
97
+ ; Apply width CV scale if connected
98
+ @if pinConnected(width)
99
+ mulx ${input.width}
100
+ @endif
101
+
102
+ wrax ${output.ramp}, 0.0
103
+ @endif
104
+
105
+ ; Triangle output
106
+ @if pinConnected(triangle)
107
+ cho rdal, ${lfoNum}
108
+
109
+ ; SpinCAD derivation: scale by 1.999 to stretch 0..1 to 0..2
110
+ ; Shift down by exactly half the internal WLDR amplitude ratio
111
+ ; Then apply ABSA to fold it back into a Triangle!
112
+ @equals amp_ratio ${param.amplitude} / 4096.0
113
+ sof 1.999, -0.5 * ${amp_ratio}
114
+ absa
115
+
116
+ ; Apply width CV scale if connected
117
+ @if pinConnected(width)
118
+ mulx ${input.width}
119
+ @endif
120
+
121
+ wrax ${output.triangle}, 0.0
122
+ @endif
@@ -0,0 +1,84 @@
1
+ ---
2
+ {
3
+ "type": "control.scale_offset",
4
+ "name": "Scale/Offset",
5
+ "category": "Control",
6
+ "description": "Scale and offset a control signal to remap input range to output range.",
7
+ "color": "#f2b824",
8
+ "width": 180,
9
+ "inputs": [
10
+ {
11
+ "id": "ctrl_in",
12
+ "name": "Control",
13
+ "type": "control",
14
+ "required": true
15
+ }
16
+ ],
17
+ "outputs": [
18
+ {
19
+ "id": "ctrl_out",
20
+ "name": "Control",
21
+ "type": "control"
22
+ }
23
+ ],
24
+ "parameters": [
25
+ {
26
+ "id": "inLow",
27
+ "name": "Input Low",
28
+ "type": "number",
29
+ "default": 0,
30
+ "min": 0,
31
+ "max": 1,
32
+ "step": 0.01,
33
+ "description": "Minimum value of input range (0.0-1.0)."
34
+ },
35
+ {
36
+ "id": "inHigh",
37
+ "name": "Input High",
38
+ "type": "number",
39
+ "default": 1,
40
+ "min": 0,
41
+ "max": 1,
42
+ "step": 0.01,
43
+ "description": "Maximum value of input range (0.0-1.0)."
44
+ },
45
+ {
46
+ "id": "outLow",
47
+ "name": "Output Low",
48
+ "type": "number",
49
+ "default": 0,
50
+ "min": -2,
51
+ "max": 1,
52
+ "step": 0.01,
53
+ "description": "Minimum value of output range (-2.0 to 1.0)."
54
+ },
55
+ {
56
+ "id": "outHigh",
57
+ "name": "Output High",
58
+ "type": "number",
59
+ "default": 0.75,
60
+ "min": -2,
61
+ "max": 1,
62
+ "step": 0.01,
63
+ "description": "Maximum value of output range (-2.0 to 1.0)."
64
+ }
65
+ ]
66
+ }
67
+ ---
68
+ ; Scale/Offset
69
+ @section main
70
+
71
+ @if pinConnected(ctrl_in)
72
+ @minusDouble outRange outHigh outLow
73
+ @minusDouble inRange inHigh inLow
74
+ @divideDouble scale outRange inRange
75
+ @multiplyDouble inLowScale inLow scale
76
+ @minusDouble offset outLow inLowScale
77
+
78
+ @assert inRange > 0, "Scale/Offset: Input range is invalid."
79
+ @assert outRange > 0, "Scale/Offset: Output range is invalid."
80
+
81
+ rdax ${input.ctrl_in}, 1.0
82
+ sof ${scale}, ${offset}
83
+ wrax ${output.ctrl_out}, 0.0
84
+ @endif
@@ -0,0 +1,126 @@
1
+ ---
2
+ {
3
+ "type": "control.sincos_lfo",
4
+ "name": "Sin/Cos LFO",
5
+ "category": "Control",
6
+ "description": "Sine and cosine LFO generator with adjustable rate and width.",
7
+ "color": "#f2b824",
8
+ "labelTemplate": "${param.lfoSel == 0 ? 'LFO0' : 'LFO1'}",
9
+ "inputs": [
10
+ {
11
+ "id": "speed",
12
+ "name": "Speed",
13
+ "type": "control"
14
+ },
15
+ {
16
+ "id": "width",
17
+ "name": "Width",
18
+ "type": "control"
19
+ }
20
+ ],
21
+ "outputs": [
22
+ {
23
+ "id": "sine",
24
+ "name": "Sine",
25
+ "type": "control"
26
+ },
27
+ {
28
+ "id": "cosine",
29
+ "name": "Cosine",
30
+ "type": "control"
31
+ }
32
+ ],
33
+ "parameters": [
34
+ {
35
+ "id": "lfoSel",
36
+ "name": "LFO Selection",
37
+ "type": "select",
38
+ "default": 0,
39
+ "options": [
40
+ { "value": 0, "label": "LFO0" },
41
+ { "value": 1, "label": "LFO1" }
42
+ ],
43
+ "description": "Which LFO oscillator to use (0 or 1)."
44
+ },
45
+ {
46
+ "id": "speed",
47
+ "name": "Speed (Hz)",
48
+ "type": "number",
49
+ "default": 0.5,
50
+ "min": 0,
51
+ "max": 20,
52
+ "step": 0.01,
53
+ "conversion": "HZ_TO_LFO_RATE",
54
+ "description": "Base LFO rate"
55
+ },
56
+ {
57
+ "id": "width",
58
+ "name": "Width (1.0 equals full swing)",
59
+ "type": "number",
60
+ "default": 0.25,
61
+ "min": 0.0,
62
+ "max": 1.0,
63
+ "step": 0.01,
64
+ "description": "Base LFO width"
65
+ },
66
+ {
67
+ "id": "outputRange",
68
+ "name": "Output Range",
69
+ "type": "select",
70
+ "default": "bipolar",
71
+ "options": [
72
+ { "value": "bipolar", "label": "-1.0 to 1.0" },
73
+ { "value": "unipolar", "label": "0.0 to 1.0" }
74
+ ],
75
+ "description": "Output signal range."
76
+ }
77
+ ]
78
+ }
79
+ ---
80
+ @if ${param.lfoSel} == 0
81
+ @equals lfoNum SIN0
82
+ @equals lfoRateReg SIN0_RATE
83
+ @equals lfoRangeReg SIN0_RANGE
84
+ @equals lfoCos COS0
85
+ @else
86
+ @equals lfoNum SIN1
87
+ @equals lfoRateReg SIN1_RATE
88
+ @equals lfoRangeReg SIN1_RANGE
89
+ @equals lfoCos COS1
90
+ @endif
91
+
92
+ ; Sin/Cos LFO generator
93
+ @section init
94
+ wlds ${lfoNum}, ${param.speed}, ${param.width} * 32767
95
+
96
+ @section main
97
+
98
+ ; Speed modulation (0 to 20 Hz -> 0 to 160 int)
99
+ @if pinConnected(speed)
100
+ rdax ${input.speed}, 160.0 / 512.0
101
+ wrax ${lfoRateReg}, 0.0
102
+ @endif
103
+
104
+ ; Width modulation (0 to 1.0 fullswing)
105
+ @if pinConnected(width)
106
+ rdax ${input.width}, 1.0
107
+ wrax ${lfoRangeReg}, 0.0
108
+ @endif
109
+
110
+ ; Sine output
111
+ @if pinConnected(sine)
112
+ cho rdal, ${lfoNum}
113
+ @if param.outputRange == 'unipolar'
114
+ sof 0.5, 0.5
115
+ @endif
116
+ wrax ${output.sine}, 0.0
117
+ @endif
118
+
119
+ ; Cosine output
120
+ @if pinConnected(cosine)
121
+ cho rdal, ${lfoCos}
122
+ @if param.outputRange == 'unipolar'
123
+ sof 0.5, 0.5
124
+ @endif
125
+ wrax ${output.cosine}, 0.0
126
+ @endif
@@ -0,0 +1,48 @@
1
+ ---
2
+ {
3
+ "type": "control.smoother",
4
+ "category": "Control",
5
+ "name": "Smoother",
6
+ "description": "Applies a simple low pass filter to smooth the control signal",
7
+ "inputs": [
8
+ {
9
+ "id": "input",
10
+ "name": "CV In",
11
+ "type": "control"
12
+ }
13
+ ],
14
+ "outputs": [
15
+ {
16
+ "id": "output",
17
+ "name": "CV Out",
18
+ "type": "control"
19
+ }
20
+ ],
21
+ "parameters": [
22
+ {
23
+ "id": "freq",
24
+ "name": "Frequency",
25
+ "type": "number",
26
+ "default": 1.0,
27
+ "min": 0.5,
28
+ "max": 15.0,
29
+ "step": 0.01,
30
+ "conversion": "LOGFREQ",
31
+ "labelTemplate": "${freq} Hz",
32
+ "description": "Smoother cutoff frequency in Hz. Lower values = slower/smoother response."
33
+ }
34
+ ],
35
+ "color": "#f2f224",
36
+ "registers": []
37
+ }
38
+ ---
39
+ @section header
40
+ @comment "Generated from spincad source file control_smoother.spincad"
41
+ equ filt ${freq}
42
+
43
+ @section main
44
+ @if pinConnected(input)
45
+ rdax ${input.input}, 1.0
46
+ rdfx ${output.output}, filt
47
+ wrax ${output.output}, 0.0
48
+ @endif
@@ -0,0 +1,55 @@
1
+ ---
2
+ {
3
+ "type": "control.tremolizer",
4
+ "category": "Control",
5
+ "name": "Tremolizer",
6
+ "description": "Adjusts the LFO width based on a control signal",
7
+ "inputs": [
8
+ {
9
+ "id": "input",
10
+ "name": "LFO Input",
11
+ "type": "control"
12
+ },
13
+ {
14
+ "id": "width",
15
+ "name": "LFO Width",
16
+ "type": "control"
17
+ }
18
+ ],
19
+ "outputs": [
20
+ {
21
+ "id": "output",
22
+ "name": "Control Output",
23
+ "type": "control"
24
+ }
25
+ ],
26
+ "parameters": [
27
+ {
28
+ "id": "depth",
29
+ "name": "Depth",
30
+ "type": "number",
31
+ "min": 0.0,
32
+ "max": 1.0,
33
+ "default": 0.5,
34
+ "step": 0.01
35
+ }
36
+ ],
37
+ "color": "#f2f224"
38
+ }
39
+ ---
40
+ @section header
41
+ @comment "Generated from spincad source file tremolizer.spincad"
42
+
43
+ @section main
44
+ // This control block takes a signal (usually an LFO) that goes from 0.0 to 1.0 and
45
+ // allows you to adjust the ${input.width} via a control ${input.input}.
46
+ // There is also a control panel setting for maximum ${depth}
47
+ // variable - Name - low - high - multiplier - precision - option
48
+ @if pinConnected(input)
49
+ rdax ${input.input}, ${depth}
50
+ @if pinConnected(width)
51
+ mulx ${input.width}
52
+ @endif
53
+ sof -0.999, 0.999
54
+ wrax ${output.output}, 0.0
55
+ @endif
@@ -0,0 +1,77 @@
1
+ ---
2
+ {
3
+ "type": "fx.micro_stutter",
4
+ "name": "Micro-Stutter",
5
+ "category": "Effects",
6
+ "subcategory": "Lo-Fi",
7
+ "description": "Glitchy frozen grain effect. When triggered, stops incoming audio and continuously loops the last active grain buffer.",
8
+ "color": "#6060c4",
9
+ "width": 180,
10
+ "inputs": [
11
+ {
12
+ "id": "in",
13
+ "name": "Input",
14
+ "type": "audio",
15
+ "required": true
16
+ },
17
+ {
18
+ "id": "freeze_cv",
19
+ "name": "Freeze Trigger",
20
+ "type": "control",
21
+ "required": false,
22
+ "description": "CV input. When value > 0.5, the buffer freezes."
23
+ }
24
+ ],
25
+ "outputs": [
26
+ {
27
+ "id": "out",
28
+ "name": "Output",
29
+ "type": "audio"
30
+ }
31
+ ],
32
+ "parameters": [
33
+ {
34
+ "id": "grain_size",
35
+ "name": "Grain Size (ms)",
36
+ "type": "number",
37
+ "default": 100,
38
+ "min": 10,
39
+ "max": 500,
40
+ "step": 1,
41
+ "conversion": "MS_TO_SAMPLES"
42
+ },
43
+ {
44
+ "id": "level",
45
+ "name": "Wet Level",
46
+ "type": "number",
47
+ "default": 1.0,
48
+ "min": 0.0,
49
+ "max": 1.5,
50
+ "step": 0.05
51
+ }
52
+ ],
53
+ "memories": [
54
+ {
55
+ "id": "grain",
56
+ "size": 16384
57
+ }
58
+ ]
59
+ }
60
+ ---
61
+ @section main
62
+ ; Check Freeze CV status
63
+ @if pinConnected(freeze_cv)
64
+ rdax ${input.freeze_cv}, 1.0
65
+ sof 1.0, -0.5 ; Offset by 0.5
66
+ skp gez, play_grain ; If CV > 0.5, skip the write instruction and just recycle the buffer!
67
+ @endif
68
+
69
+ ; Write to buffer (Only executes if NOT frozen)
70
+ rdax ${input.in}, 1.0
71
+ wra ${mem.grain}, 0.0
72
+
73
+ play_grain:
74
+ ; Read from buffer at Grain Size offset
75
+ @equals offset ${mem.grain} + ${param.grain_size}
76
+ rda ${offset}, ${param.level}
77
+ wrax ${output.out}, 0.0