@audiofab-io/fv1-core 0.5.0 → 0.6.1
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.
- package/blocks/ATL_DEVELOPER_REFERENCE.md +156 -156
- package/blocks/control/constant.atl +36 -36
- package/blocks/control/entropy_lfo.atl +74 -74
- package/blocks/control/envelope.atl +120 -120
- package/blocks/control/invert.atl +33 -33
- package/blocks/control/pot.atl +149 -149
- package/blocks/control/power.atl +76 -76
- package/blocks/control/ramp_lfo.atl +122 -122
- package/blocks/control/scale_offset.atl +84 -84
- package/blocks/control/sincos_lfo.atl +126 -126
- package/blocks/control/smoother.atl +48 -48
- package/blocks/control/tremolizer.atl +54 -54
- package/blocks/effects/delay/micro_stutter.atl +77 -77
- package/blocks/effects/delay/mn3011.atl +280 -280
- package/blocks/effects/delay/simple_delay.atl +96 -96
- package/blocks/effects/delay/triple_tap_delay.atl +176 -176
- package/blocks/effects/lo-fi/bit_mangler.atl +74 -74
- package/blocks/effects/lo-fi/chiptune.atl +311 -311
- package/blocks/effects/lo-fi/tape_degrade.atl +181 -181
- package/blocks/effects/modulation/chorus.atl +141 -141
- package/blocks/effects/modulation/chorus_4voice.atl +188 -188
- package/blocks/effects/modulation/flanger.atl +184 -184
- package/blocks/effects/modulation/harmonic_trem.atl +129 -129
- package/blocks/effects/modulation/phaser.atl +299 -299
- package/blocks/effects/pitch/octave_up_down.atl +80 -80
- package/blocks/effects/pitch/pitch_offset.atl +149 -149
- package/blocks/effects/pitch/pitch_offset_dual.atl +197 -197
- package/blocks/effects/pitch/pitch_shift.atl +115 -115
- package/blocks/effects/pitch/sub_octave.atl +100 -100
- package/blocks/effects/reverb/ducking_reverb.atl +145 -145
- package/blocks/effects/reverb/min_reverb.atl +132 -132
- package/blocks/effects/reverb/plate_reverb.atl +344 -344
- package/blocks/effects/reverb/room_reverb.atl +293 -293
- package/blocks/effects/reverb/smear.atl +90 -90
- package/blocks/effects/reverb/spring_reverb.atl +353 -353
- package/blocks/filter/1p_high_pass.atl +62 -62
- package/blocks/filter/1p_low_pass.atl +58 -58
- package/blocks/filter/auto_wah.atl +207 -207
- package/blocks/filter/bbd_loss.atl +79 -79
- package/blocks/filter/shelving_high_pass.atl +76 -76
- package/blocks/filter/shelving_low_pass.atl +76 -76
- package/blocks/filter/svf_2p.atl +116 -116
- package/blocks/gain_mix/crossfade.atl +93 -93
- package/blocks/gain_mix/crossfade2.atl +86 -86
- package/blocks/gain_mix/crossfade3.atl +71 -71
- package/blocks/gain_mix/gainboost.atl +54 -54
- package/blocks/gain_mix/mixer2.atl +76 -76
- package/blocks/gain_mix/mixer3.atl +109 -109
- package/blocks/gain_mix/mixer4.atl +151 -151
- package/blocks/gain_mix/volume.atl +50 -50
- package/blocks/io/adc.atl +53 -53
- package/blocks/io/dac.atl +61 -61
- package/blocks/other/stickynote.atl +24 -24
- package/blocks/other/tone_gen_adjustable.atl +137 -137
- package/blocks/other/tone_gen_fixed.atl +109 -109
- package/dist/blockDiagram/builtinBlocks.js +107 -107
- package/dist/blockDiagram/builtinBlocks.js.map +1 -1
- package/dist/blockDiagram/compiler/BlockTemplate.d.ts.map +1 -1
- package/dist/blockDiagram/compiler/BlockTemplate.js +18 -0
- package/dist/blockDiagram/compiler/BlockTemplate.js.map +1 -1
- package/dist/spnbank/index.d.ts +49 -7
- package/dist/spnbank/index.d.ts.map +1 -1
- package/dist/spnbank/index.js +99 -15
- package/dist/spnbank/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -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
|