@audiofab-io/fv1-core 0.6.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/package.json +2 -2
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
---
|
|
2
|
-
{
|
|
3
|
-
"type": "fx.sub_octave",
|
|
4
|
-
"name": "Sub-Octave Synth",
|
|
5
|
-
"category": "Effects",
|
|
6
|
-
"subcategory": "Pitch",
|
|
7
|
-
"description": "Clean -1 octave generator with an integrated lowpass filter to remove pitch-shifting artifacts.",
|
|
8
|
-
"color": "#fcba03",
|
|
9
|
-
"width": 180,
|
|
10
|
-
"inputs": [
|
|
11
|
-
{
|
|
12
|
-
"id": "in",
|
|
13
|
-
"name": "Input",
|
|
14
|
-
"type": "audio",
|
|
15
|
-
"required": true
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"outputs": [
|
|
19
|
-
{
|
|
20
|
-
"id": "out",
|
|
21
|
-
"name": "Output",
|
|
22
|
-
"type": "audio"
|
|
23
|
-
}
|
|
24
|
-
],
|
|
25
|
-
"parameters": [
|
|
26
|
-
{
|
|
27
|
-
"id": "sub_level",
|
|
28
|
-
"name": "Sub Level",
|
|
29
|
-
"type": "number",
|
|
30
|
-
"default": 1.0,
|
|
31
|
-
"min": 0.0,
|
|
32
|
-
"max": 1.5,
|
|
33
|
-
"step": 0.05
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"id": "filter_freq",
|
|
37
|
-
"name": "Filter Frequency",
|
|
38
|
-
"type": "number",
|
|
39
|
-
"default": 250,
|
|
40
|
-
"min": 80,
|
|
41
|
-
"max": 800,
|
|
42
|
-
"step": 10,
|
|
43
|
-
"conversion": "SVFFREQ",
|
|
44
|
-
"description": "Frequency cutoff to remove digital fuzz from the pitch shifted signal."
|
|
45
|
-
}
|
|
46
|
-
],
|
|
47
|
-
"memories": [
|
|
48
|
-
{
|
|
49
|
-
"id": "buffer",
|
|
50
|
-
"size": 4096
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"id": "temp",
|
|
54
|
-
"size": 1
|
|
55
|
-
}
|
|
56
|
-
],
|
|
57
|
-
"registers": [
|
|
58
|
-
"lps",
|
|
59
|
-
"lp2"
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
---
|
|
63
|
-
@section init
|
|
64
|
-
; Initialize Ramp LFO for EXACTLY -1 Octave (rate -8192 = 0.5x speed)
|
|
65
|
-
skp run, init_sub
|
|
66
|
-
wldr RMP0, -8192, 4096
|
|
67
|
-
init_sub:
|
|
68
|
-
|
|
69
|
-
@section main
|
|
70
|
-
; Write input to delay buffer
|
|
71
|
-
rdax ${input.in}, 1.0
|
|
72
|
-
wra ${mem.buffer}, 0.0
|
|
73
|
-
|
|
74
|
-
; Read Pitch -1 Octave
|
|
75
|
-
cho rda, RMP0, REG | COMPC, ${mem.buffer}
|
|
76
|
-
cho rda, RMP0, 0, ${mem.buffer} + 1
|
|
77
|
-
wra ${mem.temp}, 0.0
|
|
78
|
-
cho rda, RMP0, RPTR2 | COMPC, ${mem.buffer}
|
|
79
|
-
cho rda, RMP0, RPTR2, ${mem.buffer} + 1
|
|
80
|
-
cho sof, RMP0, NA | COMPC, 0.0
|
|
81
|
-
cho rda, RMP0, NA, ${mem.temp}
|
|
82
|
-
|
|
83
|
-
; ACC now contains the raw -1 octave signal
|
|
84
|
-
; Apply 2-Pole Lowpass filter to clean it up into a synth sine wave
|
|
85
|
-
|
|
86
|
-
; Pole 1
|
|
87
|
-
rdax ${reg.lps}, -1.0
|
|
88
|
-
sof ${param.filter_freq}, 0.0
|
|
89
|
-
rdax ${reg.lps}, 1.0
|
|
90
|
-
wrax ${reg.lps}, 1.0
|
|
91
|
-
|
|
92
|
-
; Pole 2
|
|
93
|
-
rdax ${reg.lp2}, -1.0
|
|
94
|
-
sof ${param.filter_freq}, 0.0
|
|
95
|
-
rdax ${reg.lp2}, 1.0
|
|
96
|
-
wrax ${reg.lp2}, 1.0
|
|
97
|
-
|
|
98
|
-
; Gain
|
|
99
|
-
sof ${param.sub_level}, 0.0
|
|
100
|
-
wrax ${output.out}, 0.0
|
|
1
|
+
---
|
|
2
|
+
{
|
|
3
|
+
"type": "fx.sub_octave",
|
|
4
|
+
"name": "Sub-Octave Synth",
|
|
5
|
+
"category": "Effects",
|
|
6
|
+
"subcategory": "Pitch",
|
|
7
|
+
"description": "Clean -1 octave generator with an integrated lowpass filter to remove pitch-shifting artifacts.",
|
|
8
|
+
"color": "#fcba03",
|
|
9
|
+
"width": 180,
|
|
10
|
+
"inputs": [
|
|
11
|
+
{
|
|
12
|
+
"id": "in",
|
|
13
|
+
"name": "Input",
|
|
14
|
+
"type": "audio",
|
|
15
|
+
"required": true
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"outputs": [
|
|
19
|
+
{
|
|
20
|
+
"id": "out",
|
|
21
|
+
"name": "Output",
|
|
22
|
+
"type": "audio"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"parameters": [
|
|
26
|
+
{
|
|
27
|
+
"id": "sub_level",
|
|
28
|
+
"name": "Sub Level",
|
|
29
|
+
"type": "number",
|
|
30
|
+
"default": 1.0,
|
|
31
|
+
"min": 0.0,
|
|
32
|
+
"max": 1.5,
|
|
33
|
+
"step": 0.05
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "filter_freq",
|
|
37
|
+
"name": "Filter Frequency",
|
|
38
|
+
"type": "number",
|
|
39
|
+
"default": 250,
|
|
40
|
+
"min": 80,
|
|
41
|
+
"max": 800,
|
|
42
|
+
"step": 10,
|
|
43
|
+
"conversion": "SVFFREQ",
|
|
44
|
+
"description": "Frequency cutoff to remove digital fuzz from the pitch shifted signal."
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"memories": [
|
|
48
|
+
{
|
|
49
|
+
"id": "buffer",
|
|
50
|
+
"size": 4096
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "temp",
|
|
54
|
+
"size": 1
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"registers": [
|
|
58
|
+
"lps",
|
|
59
|
+
"lp2"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
---
|
|
63
|
+
@section init
|
|
64
|
+
; Initialize Ramp LFO for EXACTLY -1 Octave (rate -8192 = 0.5x speed)
|
|
65
|
+
skp run, init_sub
|
|
66
|
+
wldr RMP0, -8192, 4096
|
|
67
|
+
init_sub:
|
|
68
|
+
|
|
69
|
+
@section main
|
|
70
|
+
; Write input to delay buffer
|
|
71
|
+
rdax ${input.in}, 1.0
|
|
72
|
+
wra ${mem.buffer}, 0.0
|
|
73
|
+
|
|
74
|
+
; Read Pitch -1 Octave
|
|
75
|
+
cho rda, RMP0, REG | COMPC, ${mem.buffer}
|
|
76
|
+
cho rda, RMP0, 0, ${mem.buffer} + 1
|
|
77
|
+
wra ${mem.temp}, 0.0
|
|
78
|
+
cho rda, RMP0, RPTR2 | COMPC, ${mem.buffer}
|
|
79
|
+
cho rda, RMP0, RPTR2, ${mem.buffer} + 1
|
|
80
|
+
cho sof, RMP0, NA | COMPC, 0.0
|
|
81
|
+
cho rda, RMP0, NA, ${mem.temp}
|
|
82
|
+
|
|
83
|
+
; ACC now contains the raw -1 octave signal
|
|
84
|
+
; Apply 2-Pole Lowpass filter to clean it up into a synth sine wave
|
|
85
|
+
|
|
86
|
+
; Pole 1
|
|
87
|
+
rdax ${reg.lps}, -1.0
|
|
88
|
+
sof ${param.filter_freq}, 0.0
|
|
89
|
+
rdax ${reg.lps}, 1.0
|
|
90
|
+
wrax ${reg.lps}, 1.0
|
|
91
|
+
|
|
92
|
+
; Pole 2
|
|
93
|
+
rdax ${reg.lp2}, -1.0
|
|
94
|
+
sof ${param.filter_freq}, 0.0
|
|
95
|
+
rdax ${reg.lp2}, 1.0
|
|
96
|
+
wrax ${reg.lp2}, 1.0
|
|
97
|
+
|
|
98
|
+
; Gain
|
|
99
|
+
sof ${param.sub_level}, 0.0
|
|
100
|
+
wrax ${output.out}, 0.0
|
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
---
|
|
2
|
-
{
|
|
3
|
-
"type": "fx.ducking_reverb",
|
|
4
|
-
"name": "Ducking Reverb",
|
|
5
|
-
"category": "Effects",
|
|
6
|
-
"subcategory": "Reverb",
|
|
7
|
-
"description": "Reverb that automatically ducks in volume while you are playing.",
|
|
8
|
-
"color": "#7100fc",
|
|
9
|
-
"width": 180,
|
|
10
|
-
"inputs": [
|
|
11
|
-
{
|
|
12
|
-
"id": "in",
|
|
13
|
-
"name": "Audio Input",
|
|
14
|
-
"type": "audio",
|
|
15
|
-
"required": true
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "decay_cv",
|
|
19
|
-
"name": "Decay",
|
|
20
|
-
"type": "control",
|
|
21
|
-
"required": false,
|
|
22
|
-
"parameter": "decay"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"id": "duck_sens_cv",
|
|
26
|
-
"name": "Sensitivity",
|
|
27
|
-
"type": "control",
|
|
28
|
-
"required": false,
|
|
29
|
-
"parameter": "duck_sens"
|
|
30
|
-
}
|
|
31
|
-
],
|
|
32
|
-
"outputs": [
|
|
33
|
-
{
|
|
34
|
-
"id": "out",
|
|
35
|
-
"name": "Audio Output",
|
|
36
|
-
"type": "audio"
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"parameters": [
|
|
40
|
-
{
|
|
41
|
-
"id": "decay",
|
|
42
|
-
"name": "Reverb Decay",
|
|
43
|
-
"type": "number",
|
|
44
|
-
"default": 0.85,
|
|
45
|
-
"min": 0,
|
|
46
|
-
"max": 0.99,
|
|
47
|
-
"step": 0.01,
|
|
48
|
-
"description": "Length of the reverb tail."
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": "duck_sens",
|
|
52
|
-
"name": "Ducking Sensitivity",
|
|
53
|
-
"type": "number",
|
|
54
|
-
"default": 2.0,
|
|
55
|
-
"min": 0.0,
|
|
56
|
-
"max": 10.0,
|
|
57
|
-
"step": 0.1,
|
|
58
|
-
"description": "How hard the reverb ducks when you play."
|
|
59
|
-
}
|
|
60
|
-
],
|
|
61
|
-
"memories": [
|
|
62
|
-
{ "id": "ap1", "size": 142 },
|
|
63
|
-
{ "id": "ap2", "size": 379 },
|
|
64
|
-
{ "id": "ap3", "size": 842 },
|
|
65
|
-
{ "id": "ap4", "size": 1111 },
|
|
66
|
-
{ "id": "del1", "size": 4012 },
|
|
67
|
-
{ "id": "del2", "size": 5211 }
|
|
68
|
-
],
|
|
69
|
-
"registers": [
|
|
70
|
-
"env",
|
|
71
|
-
"gain",
|
|
72
|
-
"apout",
|
|
73
|
-
"duck_sens_val",
|
|
74
|
-
"decay_val"
|
|
75
|
-
]
|
|
76
|
-
}
|
|
77
|
-
---
|
|
78
|
-
@section main
|
|
79
|
-
@equals kap 0.5
|
|
80
|
-
|
|
81
|
-
; Evaluate CVs
|
|
82
|
-
@cv duck_sens_cv
|
|
83
|
-
wrax ${reg.duck_sens_val}, 0.0
|
|
84
|
-
@cv decay_cv
|
|
85
|
-
wrax ${reg.decay_val}, 0.0
|
|
86
|
-
|
|
87
|
-
; 1. Envelope Follower (Fast Attack, Slow Release)
|
|
88
|
-
rdax ${input.in}, 1.0
|
|
89
|
-
absa
|
|
90
|
-
rdax ${reg.env}, -1.0 ; ACC = |IN| - ENV
|
|
91
|
-
skp gez, attack
|
|
92
|
-
; Release path
|
|
93
|
-
sof 0.005, 0.0 ; Slow release
|
|
94
|
-
skp run, update_env
|
|
95
|
-
attack:
|
|
96
|
-
sof 0.5, 0.0 ; Fast attack
|
|
97
|
-
update_env:
|
|
98
|
-
rdax ${reg.env}, 1.0 ; ACC = Delta + ENV
|
|
99
|
-
wrax ${reg.env}, 1.0 ; Update ENV register, keeping ENV in ACC
|
|
100
|
-
|
|
101
|
-
; 2. Calculate Ducking Gain (Gain = 1.0 - Sens * ENV)
|
|
102
|
-
; Limit Gain from dropping below 0
|
|
103
|
-
rdax ${reg.env}, -0.25 ; ACC = -ENV/4 (Scale down env impact to allow high sens numbers)
|
|
104
|
-
mulx ${reg.duck_sens_val} ; ACC = -ENV/4 * Sens
|
|
105
|
-
sof 1.0, 1.0 ; ACC = 1.0 - (ENV/4 * Sens)
|
|
106
|
-
|
|
107
|
-
; Clamp Gain to positive values
|
|
108
|
-
skp gez, no_clamp
|
|
109
|
-
sof 0.0, 0.0
|
|
110
|
-
no_clamp:
|
|
111
|
-
wrax ${reg.gain}, 0.0 ; Save final Ducking Gain
|
|
112
|
-
|
|
113
|
-
; 3. Reverb Input scaling (Wet signal only)
|
|
114
|
-
rdax ${input.in}, 0.25
|
|
115
|
-
mulx ${reg.gain} ; ACC = Input * DuckingGain
|
|
116
|
-
|
|
117
|
-
; 4. Reverb Processing (Minimal 4 Allpass, 2 Delay Network)
|
|
118
|
-
rda ${mem.ap1}#, ${kap}
|
|
119
|
-
wrap ${mem.ap1}, -1.0
|
|
120
|
-
rda ${mem.ap2}#, ${kap}
|
|
121
|
-
wrap ${mem.ap2}, -1.0
|
|
122
|
-
rda ${mem.ap3}#, ${kap}
|
|
123
|
-
wrap ${mem.ap3}, -1.0
|
|
124
|
-
rda ${mem.ap4}#, ${kap}
|
|
125
|
-
wrap ${mem.ap4}, -1.0
|
|
126
|
-
|
|
127
|
-
; Saving Allpass Output to write into the reverb tank
|
|
128
|
-
wrax ${reg.apout}, 0.0
|
|
129
|
-
|
|
130
|
-
; Delay Loop 1 (Tank Left)
|
|
131
|
-
rdax ${reg.apout}, 1.0
|
|
132
|
-
rda ${mem.del2}#, 1.0
|
|
133
|
-
mulx ${reg.decay_val}
|
|
134
|
-
wra ${mem.del1}, 0.0
|
|
135
|
-
|
|
136
|
-
; Delay Loop 2 (Tank Right)
|
|
137
|
-
rdax ${reg.apout}, 1.0
|
|
138
|
-
rda ${mem.del1}#, 1.0
|
|
139
|
-
mulx ${reg.decay_val}
|
|
140
|
-
wra ${mem.del2}, 0.0
|
|
141
|
-
|
|
142
|
-
; 5. Output
|
|
143
|
-
rda ${mem.del1}#, 1.0
|
|
144
|
-
rda ${mem.del2}#, 1.0
|
|
145
|
-
wrax ${output.out}, 0.0
|
|
1
|
+
---
|
|
2
|
+
{
|
|
3
|
+
"type": "fx.ducking_reverb",
|
|
4
|
+
"name": "Ducking Reverb",
|
|
5
|
+
"category": "Effects",
|
|
6
|
+
"subcategory": "Reverb",
|
|
7
|
+
"description": "Reverb that automatically ducks in volume while you are playing.",
|
|
8
|
+
"color": "#7100fc",
|
|
9
|
+
"width": 180,
|
|
10
|
+
"inputs": [
|
|
11
|
+
{
|
|
12
|
+
"id": "in",
|
|
13
|
+
"name": "Audio Input",
|
|
14
|
+
"type": "audio",
|
|
15
|
+
"required": true
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "decay_cv",
|
|
19
|
+
"name": "Decay",
|
|
20
|
+
"type": "control",
|
|
21
|
+
"required": false,
|
|
22
|
+
"parameter": "decay"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "duck_sens_cv",
|
|
26
|
+
"name": "Sensitivity",
|
|
27
|
+
"type": "control",
|
|
28
|
+
"required": false,
|
|
29
|
+
"parameter": "duck_sens"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"outputs": [
|
|
33
|
+
{
|
|
34
|
+
"id": "out",
|
|
35
|
+
"name": "Audio Output",
|
|
36
|
+
"type": "audio"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"parameters": [
|
|
40
|
+
{
|
|
41
|
+
"id": "decay",
|
|
42
|
+
"name": "Reverb Decay",
|
|
43
|
+
"type": "number",
|
|
44
|
+
"default": 0.85,
|
|
45
|
+
"min": 0,
|
|
46
|
+
"max": 0.99,
|
|
47
|
+
"step": 0.01,
|
|
48
|
+
"description": "Length of the reverb tail."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "duck_sens",
|
|
52
|
+
"name": "Ducking Sensitivity",
|
|
53
|
+
"type": "number",
|
|
54
|
+
"default": 2.0,
|
|
55
|
+
"min": 0.0,
|
|
56
|
+
"max": 10.0,
|
|
57
|
+
"step": 0.1,
|
|
58
|
+
"description": "How hard the reverb ducks when you play."
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"memories": [
|
|
62
|
+
{ "id": "ap1", "size": 142 },
|
|
63
|
+
{ "id": "ap2", "size": 379 },
|
|
64
|
+
{ "id": "ap3", "size": 842 },
|
|
65
|
+
{ "id": "ap4", "size": 1111 },
|
|
66
|
+
{ "id": "del1", "size": 4012 },
|
|
67
|
+
{ "id": "del2", "size": 5211 }
|
|
68
|
+
],
|
|
69
|
+
"registers": [
|
|
70
|
+
"env",
|
|
71
|
+
"gain",
|
|
72
|
+
"apout",
|
|
73
|
+
"duck_sens_val",
|
|
74
|
+
"decay_val"
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
---
|
|
78
|
+
@section main
|
|
79
|
+
@equals kap 0.5
|
|
80
|
+
|
|
81
|
+
; Evaluate CVs
|
|
82
|
+
@cv duck_sens_cv
|
|
83
|
+
wrax ${reg.duck_sens_val}, 0.0
|
|
84
|
+
@cv decay_cv
|
|
85
|
+
wrax ${reg.decay_val}, 0.0
|
|
86
|
+
|
|
87
|
+
; 1. Envelope Follower (Fast Attack, Slow Release)
|
|
88
|
+
rdax ${input.in}, 1.0
|
|
89
|
+
absa
|
|
90
|
+
rdax ${reg.env}, -1.0 ; ACC = |IN| - ENV
|
|
91
|
+
skp gez, attack
|
|
92
|
+
; Release path
|
|
93
|
+
sof 0.005, 0.0 ; Slow release
|
|
94
|
+
skp run, update_env
|
|
95
|
+
attack:
|
|
96
|
+
sof 0.5, 0.0 ; Fast attack
|
|
97
|
+
update_env:
|
|
98
|
+
rdax ${reg.env}, 1.0 ; ACC = Delta + ENV
|
|
99
|
+
wrax ${reg.env}, 1.0 ; Update ENV register, keeping ENV in ACC
|
|
100
|
+
|
|
101
|
+
; 2. Calculate Ducking Gain (Gain = 1.0 - Sens * ENV)
|
|
102
|
+
; Limit Gain from dropping below 0
|
|
103
|
+
rdax ${reg.env}, -0.25 ; ACC = -ENV/4 (Scale down env impact to allow high sens numbers)
|
|
104
|
+
mulx ${reg.duck_sens_val} ; ACC = -ENV/4 * Sens
|
|
105
|
+
sof 1.0, 1.0 ; ACC = 1.0 - (ENV/4 * Sens)
|
|
106
|
+
|
|
107
|
+
; Clamp Gain to positive values
|
|
108
|
+
skp gez, no_clamp
|
|
109
|
+
sof 0.0, 0.0
|
|
110
|
+
no_clamp:
|
|
111
|
+
wrax ${reg.gain}, 0.0 ; Save final Ducking Gain
|
|
112
|
+
|
|
113
|
+
; 3. Reverb Input scaling (Wet signal only)
|
|
114
|
+
rdax ${input.in}, 0.25
|
|
115
|
+
mulx ${reg.gain} ; ACC = Input * DuckingGain
|
|
116
|
+
|
|
117
|
+
; 4. Reverb Processing (Minimal 4 Allpass, 2 Delay Network)
|
|
118
|
+
rda ${mem.ap1}#, ${kap}
|
|
119
|
+
wrap ${mem.ap1}, -1.0
|
|
120
|
+
rda ${mem.ap2}#, ${kap}
|
|
121
|
+
wrap ${mem.ap2}, -1.0
|
|
122
|
+
rda ${mem.ap3}#, ${kap}
|
|
123
|
+
wrap ${mem.ap3}, -1.0
|
|
124
|
+
rda ${mem.ap4}#, ${kap}
|
|
125
|
+
wrap ${mem.ap4}, -1.0
|
|
126
|
+
|
|
127
|
+
; Saving Allpass Output to write into the reverb tank
|
|
128
|
+
wrax ${reg.apout}, 0.0
|
|
129
|
+
|
|
130
|
+
; Delay Loop 1 (Tank Left)
|
|
131
|
+
rdax ${reg.apout}, 1.0
|
|
132
|
+
rda ${mem.del2}#, 1.0
|
|
133
|
+
mulx ${reg.decay_val}
|
|
134
|
+
wra ${mem.del1}, 0.0
|
|
135
|
+
|
|
136
|
+
; Delay Loop 2 (Tank Right)
|
|
137
|
+
rdax ${reg.apout}, 1.0
|
|
138
|
+
rda ${mem.del1}#, 1.0
|
|
139
|
+
mulx ${reg.decay_val}
|
|
140
|
+
wra ${mem.del2}, 0.0
|
|
141
|
+
|
|
142
|
+
; 5. Output
|
|
143
|
+
rda ${mem.del1}#, 1.0
|
|
144
|
+
rda ${mem.del2}#, 1.0
|
|
145
|
+
wrax ${output.out}, 0.0
|