@audiofab-io/fv1-core 0.6.1 → 0.6.3

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 (62) 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.d.ts +12 -0
  59. package/dist/simulator/FV1Simulator.d.ts.map +1 -1
  60. package/dist/simulator/FV1Simulator.js +47 -1
  61. package/dist/simulator/FV1Simulator.js.map +1 -1
  62. package/package.json +1 -1
@@ -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