@audiofab-io/fv1-core 0.6.1 → 0.6.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.
Files changed (59) hide show
  1. package/blocks/ATL_DEVELOPER_REFERENCE.md +156 -156
  2. package/blocks/control/constant.atl +36 -36
  3. package/blocks/control/entropy_lfo.atl +74 -74
  4. package/blocks/control/envelope.atl +120 -120
  5. package/blocks/control/invert.atl +33 -33
  6. package/blocks/control/pot.atl +149 -149
  7. package/blocks/control/power.atl +76 -76
  8. package/blocks/control/ramp_lfo.atl +122 -122
  9. package/blocks/control/scale_offset.atl +84 -84
  10. package/blocks/control/sincos_lfo.atl +126 -126
  11. package/blocks/control/smoother.atl +48 -48
  12. package/blocks/control/tremolizer.atl +54 -54
  13. package/blocks/effects/delay/micro_stutter.atl +77 -77
  14. package/blocks/effects/delay/mn3011.atl +280 -280
  15. package/blocks/effects/delay/simple_delay.atl +96 -96
  16. package/blocks/effects/delay/triple_tap_delay.atl +176 -176
  17. package/blocks/effects/lo-fi/bit_mangler.atl +74 -74
  18. package/blocks/effects/lo-fi/chiptune.atl +311 -311
  19. package/blocks/effects/lo-fi/tape_degrade.atl +181 -181
  20. package/blocks/effects/modulation/chorus.atl +141 -141
  21. package/blocks/effects/modulation/chorus_4voice.atl +188 -188
  22. package/blocks/effects/modulation/flanger.atl +184 -184
  23. package/blocks/effects/modulation/harmonic_trem.atl +129 -129
  24. package/blocks/effects/modulation/phaser.atl +299 -299
  25. package/blocks/effects/pitch/octave_up_down.atl +80 -80
  26. package/blocks/effects/pitch/pitch_offset.atl +149 -149
  27. package/blocks/effects/pitch/pitch_offset_dual.atl +197 -197
  28. package/blocks/effects/pitch/pitch_shift.atl +115 -115
  29. package/blocks/effects/pitch/sub_octave.atl +100 -100
  30. package/blocks/effects/reverb/ducking_reverb.atl +145 -145
  31. package/blocks/effects/reverb/min_reverb.atl +132 -132
  32. package/blocks/effects/reverb/plate_reverb.atl +344 -344
  33. package/blocks/effects/reverb/room_reverb.atl +293 -293
  34. package/blocks/effects/reverb/smear.atl +90 -90
  35. package/blocks/effects/reverb/spring_reverb.atl +353 -353
  36. package/blocks/filter/1p_high_pass.atl +62 -62
  37. package/blocks/filter/1p_low_pass.atl +58 -58
  38. package/blocks/filter/auto_wah.atl +207 -207
  39. package/blocks/filter/bbd_loss.atl +79 -79
  40. package/blocks/filter/shelving_high_pass.atl +76 -76
  41. package/blocks/filter/shelving_low_pass.atl +76 -76
  42. package/blocks/filter/svf_2p.atl +116 -116
  43. package/blocks/gain_mix/crossfade.atl +93 -93
  44. package/blocks/gain_mix/crossfade2.atl +86 -86
  45. package/blocks/gain_mix/crossfade3.atl +71 -71
  46. package/blocks/gain_mix/gainboost.atl +54 -54
  47. package/blocks/gain_mix/mixer2.atl +76 -76
  48. package/blocks/gain_mix/mixer3.atl +109 -109
  49. package/blocks/gain_mix/mixer4.atl +151 -151
  50. package/blocks/gain_mix/volume.atl +50 -50
  51. package/blocks/io/adc.atl +53 -53
  52. package/blocks/io/dac.atl +61 -61
  53. package/blocks/other/stickynote.atl +24 -24
  54. package/blocks/other/tone_gen_adjustable.atl +137 -137
  55. package/blocks/other/tone_gen_fixed.atl +109 -109
  56. package/dist/blockDiagram/builtinBlocks.js +107 -107
  57. package/dist/blockDiagram/builtinBlocks.js.map +1 -1
  58. package/dist/simulator/FV1Simulator.js +1 -1
  59. package/package.json +1 -1
@@ -1,184 +1,184 @@
1
- ---
2
- {
3
- "type": "effects.modulation.flanger",
4
- "name": "Flanger",
5
- "category": "Effects",
6
- "subcategory": "Modulation",
7
- "description": "Classic flanger effect with LFO modulation",
8
- "color": "#24F2F2",
9
- "width": 180,
10
- "inputs": [
11
- {
12
- "id": "input",
13
- "name": "Input",
14
- "type": "audio",
15
- "required": true
16
- },
17
- {
18
- "id": "feedbackIn",
19
- "name": "Feedback In",
20
- "type": "audio",
21
- "required": false
22
- },
23
- {
24
- "id": "rateIn",
25
- "name": "LFO Rate",
26
- "type": "control",
27
- "required": false
28
- },
29
- {
30
- "id": "widthIn",
31
- "name": "LFO Width",
32
- "type": "control",
33
- "required": false
34
- },
35
- {
36
- "id": "fbk",
37
- "name": "Feedback Gain",
38
- "type": "control",
39
- "required": false
40
- }
41
- ],
42
- "outputs": [
43
- {
44
- "id": "output",
45
- "name": "Output",
46
- "type": "audio"
47
- },
48
- {
49
- "id": "tap",
50
- "name": "Tap",
51
- "type": "audio"
52
- }
53
- ],
54
- "parameters": [
55
- {
56
- "id": "inputGain",
57
- "name": "Input Gain",
58
- "type": "number",
59
- "default": 0,
60
- "min": -24,
61
- "max": 0,
62
- "conversion": "DBLEVEL",
63
- "step": 0.01
64
- },
65
- {
66
- "id": "fbkGain",
67
- "name": "Feedback Gain",
68
- "type": "number",
69
- "default": -6,
70
- "min": -24,
71
- "max": 0,
72
- "conversion": "DBLEVEL",
73
- "step": 0.01
74
- },
75
- {
76
- "id": "baseDelay",
77
- "name": "Base Delay (ms)",
78
- "type": "number",
79
- "default": 1,
80
- "min": 0.1,
81
- "max": 10,
82
- "conversion": "MS_TO_SAMPLES",
83
- "description": "The center point of the flange modulation in ms.",
84
- "step": 0.1
85
- },
86
- {
87
- "id": "rate",
88
- "name": "LFO Rate (Hz)",
89
- "type": "number",
90
- "default": 1,
91
- "min": 0.05,
92
- "max": 10,
93
- "conversion": "HZ_TO_LFO_RATE",
94
- "description": "Frequency of the flange modulation in Hz.",
95
- "step": 0.01
96
- },
97
- {
98
- "id": "width",
99
- "name": "LFO Depth (ms)",
100
- "type": "number",
101
- "default": 1,
102
- "min": 0,
103
- "max": 10,
104
- "conversion": "MS_TO_LFO_RANGE",
105
- "description": "The depth of the flange sweep in ms.",
106
- "step": 0.1
107
- },
108
- {
109
- "id": "lfoSel",
110
- "name": "LFO Select",
111
- "type": "select",
112
- "default": 0,
113
- "options": [
114
- {
115
- "label": "LFO 0",
116
- "value": 0
117
- },
118
- {
119
- "label": "LFO 1",
120
- "value": 1
121
- }
122
- ]
123
- }
124
- ],
125
- "memories": [
126
- {
127
- "id": "delayl",
128
- "size": 1024
129
- }
130
- ]
131
- }
132
- ---
133
- @if isequalto lfoSel 0
134
- @equals lfoNum SIN0
135
- @equals lfoRateReg SIN0_RATE
136
- @equals lfoRange SIN0_RANGE
137
- @else
138
- @equals lfoNum SIN1
139
- @equals lfoRateReg SIN1_RATE
140
- @equals lfoRange SIN1_RANGE
141
- @endif
142
-
143
- @section init
144
- ; Flanger LFO init
145
- skp run, done_lfo
146
- wlds ${lfoNum}, ${rate}, ${width}
147
- done_lfo:
148
-
149
- @section main
150
- ; Flanger
151
- @if pinConnected(rateIn)
152
- rdax ${input.rateIn}, ${param.rate.max} / 511.0
153
- sof 1.0, ${param.rate.min} / 511.0
154
- wrax ${lfoRateReg}, 0.0
155
- @endif
156
-
157
- @if pinConnected(widthIn)
158
- rdax ${input.widthIn}, ${param.width.max} / 32767.0
159
- sof 1.0, ${param.width.min} / 32767.0
160
- wrax ${lfoRange}, 0.0
161
- @endif
162
-
163
- @if pinConnected(feedbackIn)
164
- rdax ${input.feedbackIn}, ${fbkGain}
165
- @if pinConnected(fbk)
166
- mulx ${input.fbk}
167
- @endif
168
- @endif
169
-
170
- rdax ${input.input}, ${inputGain}
171
- wra ${mem.delayl}, 0.0
172
-
173
- ; tapCenter
174
- @equals center ${mem.delayl} + ${baseDelay}
175
- cho rda, ${lfoNum}, SIN | REG | COMPC, ${center}
176
- cho rda, ${lfoNum}, SIN, ${center} + 1
177
- wrax ${output.output}, 0.0
178
-
179
- @if pinConnected(tap)
180
- ; dry/max tap
181
- rda ${mem.delayl} + 1023, 1.0
182
- wrax ${output.tap}, 0.0
183
- @endif
184
-
1
+ ---
2
+ {
3
+ "type": "effects.modulation.flanger",
4
+ "name": "Flanger",
5
+ "category": "Effects",
6
+ "subcategory": "Modulation",
7
+ "description": "Classic flanger effect with LFO modulation",
8
+ "color": "#24F2F2",
9
+ "width": 180,
10
+ "inputs": [
11
+ {
12
+ "id": "input",
13
+ "name": "Input",
14
+ "type": "audio",
15
+ "required": true
16
+ },
17
+ {
18
+ "id": "feedbackIn",
19
+ "name": "Feedback In",
20
+ "type": "audio",
21
+ "required": false
22
+ },
23
+ {
24
+ "id": "rateIn",
25
+ "name": "LFO Rate",
26
+ "type": "control",
27
+ "required": false
28
+ },
29
+ {
30
+ "id": "widthIn",
31
+ "name": "LFO Width",
32
+ "type": "control",
33
+ "required": false
34
+ },
35
+ {
36
+ "id": "fbk",
37
+ "name": "Feedback Gain",
38
+ "type": "control",
39
+ "required": false
40
+ }
41
+ ],
42
+ "outputs": [
43
+ {
44
+ "id": "output",
45
+ "name": "Output",
46
+ "type": "audio"
47
+ },
48
+ {
49
+ "id": "tap",
50
+ "name": "Tap",
51
+ "type": "audio"
52
+ }
53
+ ],
54
+ "parameters": [
55
+ {
56
+ "id": "inputGain",
57
+ "name": "Input Gain",
58
+ "type": "number",
59
+ "default": 0,
60
+ "min": -24,
61
+ "max": 0,
62
+ "conversion": "DBLEVEL",
63
+ "step": 0.01
64
+ },
65
+ {
66
+ "id": "fbkGain",
67
+ "name": "Feedback Gain",
68
+ "type": "number",
69
+ "default": -6,
70
+ "min": -24,
71
+ "max": 0,
72
+ "conversion": "DBLEVEL",
73
+ "step": 0.01
74
+ },
75
+ {
76
+ "id": "baseDelay",
77
+ "name": "Base Delay (ms)",
78
+ "type": "number",
79
+ "default": 1,
80
+ "min": 0.1,
81
+ "max": 10,
82
+ "conversion": "MS_TO_SAMPLES",
83
+ "description": "The center point of the flange modulation in ms.",
84
+ "step": 0.1
85
+ },
86
+ {
87
+ "id": "rate",
88
+ "name": "LFO Rate (Hz)",
89
+ "type": "number",
90
+ "default": 1,
91
+ "min": 0.05,
92
+ "max": 10,
93
+ "conversion": "HZ_TO_LFO_RATE",
94
+ "description": "Frequency of the flange modulation in Hz.",
95
+ "step": 0.01
96
+ },
97
+ {
98
+ "id": "width",
99
+ "name": "LFO Depth (ms)",
100
+ "type": "number",
101
+ "default": 1,
102
+ "min": 0,
103
+ "max": 10,
104
+ "conversion": "MS_TO_LFO_RANGE",
105
+ "description": "The depth of the flange sweep in ms.",
106
+ "step": 0.1
107
+ },
108
+ {
109
+ "id": "lfoSel",
110
+ "name": "LFO Select",
111
+ "type": "select",
112
+ "default": 0,
113
+ "options": [
114
+ {
115
+ "label": "LFO 0",
116
+ "value": 0
117
+ },
118
+ {
119
+ "label": "LFO 1",
120
+ "value": 1
121
+ }
122
+ ]
123
+ }
124
+ ],
125
+ "memories": [
126
+ {
127
+ "id": "delayl",
128
+ "size": 1024
129
+ }
130
+ ]
131
+ }
132
+ ---
133
+ @if isequalto lfoSel 0
134
+ @equals lfoNum SIN0
135
+ @equals lfoRateReg SIN0_RATE
136
+ @equals lfoRange SIN0_RANGE
137
+ @else
138
+ @equals lfoNum SIN1
139
+ @equals lfoRateReg SIN1_RATE
140
+ @equals lfoRange SIN1_RANGE
141
+ @endif
142
+
143
+ @section init
144
+ ; Flanger LFO init
145
+ skp run, done_lfo
146
+ wlds ${lfoNum}, ${rate}, ${width}
147
+ done_lfo:
148
+
149
+ @section main
150
+ ; Flanger
151
+ @if pinConnected(rateIn)
152
+ rdax ${input.rateIn}, ${param.rate.max} / 511.0
153
+ sof 1.0, ${param.rate.min} / 511.0
154
+ wrax ${lfoRateReg}, 0.0
155
+ @endif
156
+
157
+ @if pinConnected(widthIn)
158
+ rdax ${input.widthIn}, ${param.width.max} / 32767.0
159
+ sof 1.0, ${param.width.min} / 32767.0
160
+ wrax ${lfoRange}, 0.0
161
+ @endif
162
+
163
+ @if pinConnected(feedbackIn)
164
+ rdax ${input.feedbackIn}, ${fbkGain}
165
+ @if pinConnected(fbk)
166
+ mulx ${input.fbk}
167
+ @endif
168
+ @endif
169
+
170
+ rdax ${input.input}, ${inputGain}
171
+ wra ${mem.delayl}, 0.0
172
+
173
+ ; tapCenter
174
+ @equals center ${mem.delayl} + ${baseDelay}
175
+ cho rda, ${lfoNum}, SIN | REG | COMPC, ${center}
176
+ cho rda, ${lfoNum}, SIN, ${center} + 1
177
+ wrax ${output.output}, 0.0
178
+
179
+ @if pinConnected(tap)
180
+ ; dry/max tap
181
+ rda ${mem.delayl} + 1023, 1.0
182
+ wrax ${output.tap}, 0.0
183
+ @endif
184
+
@@ -1,129 +1,129 @@
1
- ---
2
- {
3
- "type": "fx.harmonic_tremolo",
4
- "name": "Harmonic Tremolo",
5
- "category": "Effects",
6
- "subcategory": "Modulation",
7
- "description": "True vintage harmonic tremolo using a crossover.",
8
- "color": "#24F2F2",
9
- "width": 180,
10
- "inputs": [
11
- {
12
- "id": "in",
13
- "name": "Input",
14
- "type": "audio",
15
- "required": true
16
- },
17
- {
18
- "id": "rate_cv",
19
- "name": "Rate",
20
- "type": "control",
21
- "required": false,
22
- "parameter": "rate"
23
- },
24
- {
25
- "id": "depth_cv",
26
- "name": "Depth",
27
- "type": "control",
28
- "required": false,
29
- "parameter": "depth"
30
- }
31
- ],
32
- "outputs": [
33
- {
34
- "id": "out",
35
- "name": "Output",
36
- "type": "audio"
37
- }
38
- ],
39
- "parameters": [
40
- {
41
- "id": "rate",
42
- "name": "Tremolo Rate (Hz)",
43
- "type": "number",
44
- "default": 3.0,
45
- "min": 0.5,
46
- "max": 12.0,
47
- "step": 0.1,
48
- "conversion": "HZ_TO_LFO_RATE"
49
- },
50
- {
51
- "id": "depth",
52
- "name": "Depth",
53
- "type": "number",
54
- "default": 1.0,
55
- "min": 0.0,
56
- "max": 1.0,
57
- "step": 0.01,
58
- "description": "Intensity of the tremolo effect."
59
- },
60
- {
61
- "id": "crossover",
62
- "name": "Crossover Freq",
63
- "type": "number",
64
- "default": 600,
65
- "min": 100,
66
- "max": 2000,
67
- "step": 10,
68
- "conversion": "SVFFREQ",
69
- "description": "Frequency split for the two bands."
70
- }
71
- ],
72
- "registers": [
73
- "lpf_state",
74
- "lfo_val",
75
- "lfo_inv",
76
- "depth_temp"
77
- ]
78
- }
79
- ---
80
- @section init
81
- skp run, init_trem
82
- ; Depth in WLDS is useless for RDAL (RDAL reads raw sine), so max it
83
- wlds SIN0, ${rate}, 32767
84
- init_trem:
85
-
86
- @section main
87
- ; 0. Evaluate Rate CV dynamically (Scaled manually to avoid SOF > 1.99 limits from HZ_TO_LFO_RATE bounds)
88
- @if pinConnected(rate_cv)
89
- rdax ${input.rate_cv}, ${rate} / 511.0
90
- wrax SIN0_RATE, 0.0
91
- @endif
92
-
93
- ; 1. Evaluate Depth CV dynamically
94
- @cv depth_cv ; ACC = Depth (0.0 to 1.0)
95
- sof 0.5, 0.0 ; ACC = Depth / 2
96
- wrax ${reg.depth_temp}, 0.0 ; Save scaled depth
97
-
98
- ; 2. Generate LFO
99
- cho rdal, SIN0 ; ACC = LFO (-1.0 to 1.0)
100
- mulx ${reg.depth_temp} ; ACC = LFO * (Depth / 2)
101
- sof 1.0, 0.5 ; ACC = LFO * (Depth / 2) + 0.5 (Scale to 0.0 - 1.0)
102
- wrax ${reg.lfo_val}, -1.0 ; Save LFO_VAL, ACC = -LFO_VAL
103
- sof 1.0, 1.0 ; ACC = 1.0 - LFO_VAL
104
- wrax ${reg.lfo_inv}, 0.0 ; Save LFO_INV, ACC = 0
105
-
106
- ; 2. Crossover Filter (1-Pole)
107
- ; Lowpass = L_old + F * (Input - L_old)
108
- rdax ${input.in}, 1.0 ; ACC = Input
109
- rdax ${reg.lpf_state}, -1.0 ; ACC = Input - L_old
110
- sof ${param.crossover}, 0.0 ; ACC = F * (Input - L_old)
111
- rdax ${reg.lpf_state}, 1.0 ; ACC = F * (Input - L_old) + L_old
112
- wrax ${reg.lpf_state}, -1.0 ; REG_L = Lowpass, ACC = -Lowpass
113
-
114
- ; Highpass = Input - Lowpass
115
- rdax ${input.in}, 1.0 ; ACC = Input - Lowpass = Highpass
116
-
117
- ; 3. Modulate Highpass
118
- mulx ${reg.lfo_inv} ; ACC = Highpass * LFO_INV
119
-
120
- ; 4. Modulate Lowpass & Mix
121
- ; Need to bring Highpass to a free register, but we can just use lfo_inv as a temp
122
- wrax ${reg.lfo_inv}, 0.0 ; Save modulated Highpass in lfo_inv
123
-
124
- rdax ${reg.lpf_state}, 1.0 ; ACC = Lowpass
125
- mulx ${reg.lfo_val} ; ACC = Lowpass * LFO_VAL
126
- rdax ${reg.lfo_inv}, 1.0 ; ACC = (Lowpass * LFO) + (Highpass * LFO_INV)
127
-
128
- ; 5. Output
129
- wrax ${output.out}, 0.0
1
+ ---
2
+ {
3
+ "type": "fx.harmonic_tremolo",
4
+ "name": "Harmonic Tremolo",
5
+ "category": "Effects",
6
+ "subcategory": "Modulation",
7
+ "description": "True vintage harmonic tremolo using a crossover.",
8
+ "color": "#24F2F2",
9
+ "width": 180,
10
+ "inputs": [
11
+ {
12
+ "id": "in",
13
+ "name": "Input",
14
+ "type": "audio",
15
+ "required": true
16
+ },
17
+ {
18
+ "id": "rate_cv",
19
+ "name": "Rate",
20
+ "type": "control",
21
+ "required": false,
22
+ "parameter": "rate"
23
+ },
24
+ {
25
+ "id": "depth_cv",
26
+ "name": "Depth",
27
+ "type": "control",
28
+ "required": false,
29
+ "parameter": "depth"
30
+ }
31
+ ],
32
+ "outputs": [
33
+ {
34
+ "id": "out",
35
+ "name": "Output",
36
+ "type": "audio"
37
+ }
38
+ ],
39
+ "parameters": [
40
+ {
41
+ "id": "rate",
42
+ "name": "Tremolo Rate (Hz)",
43
+ "type": "number",
44
+ "default": 3.0,
45
+ "min": 0.5,
46
+ "max": 12.0,
47
+ "step": 0.1,
48
+ "conversion": "HZ_TO_LFO_RATE"
49
+ },
50
+ {
51
+ "id": "depth",
52
+ "name": "Depth",
53
+ "type": "number",
54
+ "default": 1.0,
55
+ "min": 0.0,
56
+ "max": 1.0,
57
+ "step": 0.01,
58
+ "description": "Intensity of the tremolo effect."
59
+ },
60
+ {
61
+ "id": "crossover",
62
+ "name": "Crossover Freq",
63
+ "type": "number",
64
+ "default": 600,
65
+ "min": 100,
66
+ "max": 2000,
67
+ "step": 10,
68
+ "conversion": "SVFFREQ",
69
+ "description": "Frequency split for the two bands."
70
+ }
71
+ ],
72
+ "registers": [
73
+ "lpf_state",
74
+ "lfo_val",
75
+ "lfo_inv",
76
+ "depth_temp"
77
+ ]
78
+ }
79
+ ---
80
+ @section init
81
+ skp run, init_trem
82
+ ; Depth in WLDS is useless for RDAL (RDAL reads raw sine), so max it
83
+ wlds SIN0, ${rate}, 32767
84
+ init_trem:
85
+
86
+ @section main
87
+ ; 0. Evaluate Rate CV dynamically (Scaled manually to avoid SOF > 1.99 limits from HZ_TO_LFO_RATE bounds)
88
+ @if pinConnected(rate_cv)
89
+ rdax ${input.rate_cv}, ${rate} / 511.0
90
+ wrax SIN0_RATE, 0.0
91
+ @endif
92
+
93
+ ; 1. Evaluate Depth CV dynamically
94
+ @cv depth_cv ; ACC = Depth (0.0 to 1.0)
95
+ sof 0.5, 0.0 ; ACC = Depth / 2
96
+ wrax ${reg.depth_temp}, 0.0 ; Save scaled depth
97
+
98
+ ; 2. Generate LFO
99
+ cho rdal, SIN0 ; ACC = LFO (-1.0 to 1.0)
100
+ mulx ${reg.depth_temp} ; ACC = LFO * (Depth / 2)
101
+ sof 1.0, 0.5 ; ACC = LFO * (Depth / 2) + 0.5 (Scale to 0.0 - 1.0)
102
+ wrax ${reg.lfo_val}, -1.0 ; Save LFO_VAL, ACC = -LFO_VAL
103
+ sof 1.0, 1.0 ; ACC = 1.0 - LFO_VAL
104
+ wrax ${reg.lfo_inv}, 0.0 ; Save LFO_INV, ACC = 0
105
+
106
+ ; 2. Crossover Filter (1-Pole)
107
+ ; Lowpass = L_old + F * (Input - L_old)
108
+ rdax ${input.in}, 1.0 ; ACC = Input
109
+ rdax ${reg.lpf_state}, -1.0 ; ACC = Input - L_old
110
+ sof ${param.crossover}, 0.0 ; ACC = F * (Input - L_old)
111
+ rdax ${reg.lpf_state}, 1.0 ; ACC = F * (Input - L_old) + L_old
112
+ wrax ${reg.lpf_state}, -1.0 ; REG_L = Lowpass, ACC = -Lowpass
113
+
114
+ ; Highpass = Input - Lowpass
115
+ rdax ${input.in}, 1.0 ; ACC = Input - Lowpass = Highpass
116
+
117
+ ; 3. Modulate Highpass
118
+ mulx ${reg.lfo_inv} ; ACC = Highpass * LFO_INV
119
+
120
+ ; 4. Modulate Lowpass & Mix
121
+ ; Need to bring Highpass to a free register, but we can just use lfo_inv as a temp
122
+ wrax ${reg.lfo_inv}, 0.0 ; Save modulated Highpass in lfo_inv
123
+
124
+ rdax ${reg.lpf_state}, 1.0 ; ACC = Lowpass
125
+ mulx ${reg.lfo_val} ; ACC = Lowpass * LFO_VAL
126
+ rdax ${reg.lfo_inv}, 1.0 ; ACC = (Lowpass * LFO) + (Highpass * LFO_INV)
127
+
128
+ ; 5. Output
129
+ wrax ${output.out}, 0.0