build_audulus_nodes 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f092fa99ca25d2682b4d619fd4a1d67a9712ec49
4
+ data.tar.gz: 3810dd0d5383f0458a3cf7e0024f3c3048a3f2fc
5
+ SHA512:
6
+ metadata.gz: 1aa1f7a24ceb7d76121605805f9cde615882ff3f796605c8bcbabf99a049086ea25d0a8bdacebc9322201cccdc2cac2cc3f40df5a0422cb71637a453ac122ad6
7
+ data.tar.gz: b0f1a140e6343fcfe4f6bfcdc121bb1352cd0fdc3cd7902274222e19877ee5d2618336f31f559d8e37f3dcb6306bfc2a2138ea7d6743da992335955e83a95072
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'command'
4
+ Command.run_build_midi_node(ARGV)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'command'
4
+ Command.run_build_spline_node(ARGV)
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'command'
4
+ Command.run_build_wavetable_node(ARGV)
5
+
@@ -0,0 +1,41 @@
1
+ require 'fftw3'
2
+
3
+ class Antialias
4
+ # sample_rate, Hz, e.g. 44100
5
+ # fundamental, Hz, e.g. 440
6
+ # samples: -1..1
7
+ # The sample_rate gives us the Nyquist limit, and the fundamental
8
+ # tells us how to calculate the partials to find out which ones fall
9
+ # above the Nyquist limit. With this knowledge we dampen those higher
10
+ # partials for the purpose of preventing aliases at that fundamental.
11
+ def self.antialias_for_fundamental(sample_rate, fundamental, samples)
12
+ fft = FFTW3.fft(NArray[samples]).to_a.flatten
13
+ dampened = dampen_higher_partials(sample_rate, fundamental, fft)
14
+ (FFTW3.ifft(NArray[dampened]) / samples.count).real.to_a.flatten
15
+ end
16
+
17
+ # kill everything higher than a scaled nyquist limit
18
+ # ease in/out everything else to minimize partials near nyquist
19
+ def self.dampen_higher_partials(sample_rate, fundamental, fft)
20
+ nyquist = sample_rate.to_f / 2
21
+ sample_fundamental = sample_rate.to_f / fft.count
22
+ scaled_nyquist = nyquist / fundamental * sample_fundamental
23
+ sample_duration = fft.count.to_f / sample_rate
24
+ sub_nyquist_sample_count = scaled_nyquist * sample_duration
25
+ fft.each_with_index.map {|power, i|
26
+ hz = i.to_f / fft.count * sample_rate.to_f
27
+ if hz < scaled_nyquist
28
+ scale_partial(i, sub_nyquist_sample_count, power)
29
+ else
30
+ 0+0i
31
+ end
32
+ }
33
+ end
34
+
35
+ # dampen partials higher than a certain frequency using a smooth
36
+ # "ease-in-out" shape
37
+ def self.scale_partial(partial_index, partial_count, partial_value)
38
+ partial_value * (Math.cos(partial_index.to_f*Math::PI/2/partial_count)**2)
39
+ end
40
+ end
41
+
@@ -0,0 +1,274 @@
1
+ require 'json'
2
+ require 'yaml'
3
+ require 'securerandom'
4
+
5
+ module Audulus
6
+ module_function
7
+
8
+ def uuid?(string)
9
+ string.kind_of?(String) && /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ =~ string
10
+ end
11
+
12
+ # Node -> [ UUID ]
13
+ def scan_uuids(node)
14
+ case node
15
+ when Hash
16
+ node.map {|key, elem|
17
+ if uuid?(elem)
18
+ elem
19
+ else
20
+ scan_uuids(elem)
21
+ end
22
+ }.flatten
23
+ when Array
24
+ node.map {|elem| scan_uuids(elem)}.flatten
25
+ else
26
+ []
27
+ end
28
+ end
29
+
30
+ def build_uuid_map(node)
31
+ existing_uuids = scan_uuids(node)
32
+ existing_uuids.reduce({}) {|h, uuid|
33
+ h[uuid] = SecureRandom.uuid()
34
+ h
35
+ }
36
+ end
37
+
38
+ def clone_node(node)
39
+ uuid_map = build_uuid_map(node)
40
+ clone_node_helper(node, uuid_map)
41
+ end
42
+
43
+ def clone_node_helper(node, uuid_map)
44
+ case node
45
+ when Hash
46
+ Hash[node.map {|key, elem|
47
+ if uuid?(elem)
48
+ [key, uuid_map[elem]]
49
+ else
50
+ [key, clone_node_helper(elem, uuid_map)]
51
+ end
52
+ }]
53
+ when Array
54
+ node.map {|elem|
55
+ clone_node_helper(elem, uuid_map)
56
+ }
57
+ else
58
+ node
59
+ end
60
+ end
61
+
62
+ def add_node(patch, node)
63
+ patch['nodes'] << node
64
+ patch
65
+ end
66
+
67
+ def add_nodes(patch, nodes)
68
+ nodes.each do |node|
69
+ add_node(patch, node)
70
+ end
71
+ end
72
+
73
+ def move_node(node, x, y)
74
+ node['position'] = {
75
+ 'x' => x,
76
+ 'y' => y,
77
+ }
78
+ node
79
+ end
80
+
81
+ def expose_node(node, x, y)
82
+ node['exposedPosition'] = {
83
+ 'x' => x,
84
+ 'y' => y,
85
+ }
86
+ node
87
+ end
88
+
89
+ def wire_output_to_input(patch, source_node, source_output, destination_node, destination_input)
90
+ patch['wires'] << {
91
+ "from" => source_node['id'],
92
+ "output" => source_output,
93
+ "to" => destination_node['id'],
94
+ "input": destination_input
95
+ }
96
+ end
97
+
98
+ def build_init_doc
99
+ result = clone_node(INIT_PATCH)
100
+ result
101
+ end
102
+
103
+ def make_subpatch(subpatch)
104
+ doc = build_init_doc
105
+ patch = doc['patch']
106
+
107
+ subpatch_node = build_subpatch_node
108
+ subpatch_node['subPatch'] = subpatch
109
+ add_node(patch, subpatch_node)
110
+ doc
111
+ end
112
+
113
+ def build_light_node
114
+ clone_node(LIGHT_NODE)
115
+ end
116
+
117
+ def build_trigger_node
118
+ clone_node(TRIGGER_NODE)
119
+ end
120
+
121
+ def build_subpatch_node
122
+ clone_node(SUBPATCH_NODE)
123
+ end
124
+
125
+ # gate output is output 0
126
+ def build_clock_node
127
+ clone_node(CLOCK_NODE)
128
+ end
129
+
130
+ def build_via_node
131
+ clone_node(VIA_NODE)
132
+ end
133
+
134
+ def build_input_node
135
+ clone_node(INPUT_NODE)
136
+ end
137
+
138
+ def build_output_node
139
+ result = build_simple_node("Output")
140
+ result['name'] = "Output"
141
+ result
142
+ end
143
+
144
+ def build_knob_node
145
+ result = build_simple_node("Knob")
146
+ result['knob'] = {
147
+ 'value' => 0.5,
148
+ 'min' => 0.0,
149
+ 'max' => 1.0,
150
+ }
151
+ expose_node(result, 0, 0)
152
+ result
153
+ end
154
+
155
+ def build_sample_and_hold_node
156
+ build_simple_node("Sample & Hold")
157
+ end
158
+
159
+ def build_mux_node
160
+ build_simple_node("Mux8")
161
+ end
162
+
163
+ def build_demux_node
164
+ build_simple_node("Demux8")
165
+ end
166
+
167
+ def build_expr_node(expr)
168
+ result = build_simple_node('Expr')
169
+ result['expr'] = expr
170
+ result
171
+ end
172
+
173
+ def build_text_node(text)
174
+ result = build_simple_node("Text")
175
+ result['text'] = text
176
+ result
177
+ end
178
+
179
+ def build_simple_node(type)
180
+ clone_node({
181
+ "type" => type,
182
+ "id" => "7e5486fc-994c-44f0-ae83-5ebba54d7e3b",
183
+ "position" => {
184
+ "x" => 0,
185
+ "y" => 0
186
+ }
187
+ })
188
+ end
189
+
190
+ XMUX_NODE = JSON.parse(File.read(File.join(File.dirname(__FILE__), 'xmux.audulus')))['patch']['nodes'][0]
191
+ def build_xmux_node
192
+ clone_node(XMUX_NODE)
193
+ end
194
+
195
+ O2HZ_NODE = JSON.parse(File.read(File.join(File.dirname(__FILE__), 'o2Hz.audulus')))['patch']['nodes'][0]
196
+ def build_o2hz_node
197
+ clone_node(O2HZ_NODE)
198
+ end
199
+
200
+ INIT_PATCH = YAML.load <<-YAML
201
+ ---
202
+ version: 1
203
+ patch:
204
+ id: 2aedc73c-4095-4d1b-ab1b-2121ea9ac19d
205
+ pan:
206
+ x: 0.0
207
+ y: 0.0
208
+ zoom: 1.0
209
+ nodes: []
210
+ wires: []
211
+ YAML
212
+
213
+ LIGHT_NODE = YAML.load <<-YAML
214
+ ---
215
+ type: Light
216
+ id: b264602f-365b-48a2-9d25-9b95055a2c34
217
+ position:
218
+ x: 0.0
219
+ y: 0.0
220
+ YAML
221
+
222
+ TRIGGER_NODE = JSON.parse <<-JSON
223
+ {
224
+ "type": "Trigger",
225
+ "id": "3e8e612d-3b7a-4c6d-a2ea-2e5f1a00161d",
226
+ "position": {
227
+ "x": 0,
228
+ "y": 0
229
+ },
230
+ "toggle": false,
231
+ "state": false
232
+ }
233
+ JSON
234
+
235
+ INPUT_NODE = JSON.parse <<-JSON
236
+ {
237
+ "type": "Input",
238
+ "id": "3e8e612d-3b7a-4c6d-a2ea-2e5f1a00161d",
239
+ "position": {
240
+ "x": 0,
241
+ "y": 0
242
+ },
243
+ "exposedPosition": {
244
+ "x": 0,
245
+ "y": 0
246
+ },
247
+ "name": "input"
248
+ }
249
+ JSON
250
+
251
+ SUBPATCH_NODE = JSON.parse <<-JSON
252
+ {
253
+ "type": "Patch",
254
+ "id": "0fe72e0e-2616-4366-8036-f852398d1c73",
255
+ "position": {
256
+ "x": -33.04297,
257
+ "y": -44.77734
258
+ },
259
+ "subPatch": {
260
+ "id": "0e096166-2c2d-4c0e-bce3-f9c5f42ce5c5",
261
+ "pan": {
262
+ "x": 0,
263
+ "y": 0
264
+ },
265
+ "zoom": 1,
266
+ "nodes": [],
267
+ "wires": []
268
+ }
269
+ }
270
+ JSON
271
+
272
+ CLOCK_NODE = JSON.parse(File.read(File.join(File.dirname(__FILE__), 'clock.json')))
273
+ VIA_NODE = JSON.parse(File.read(File.join(File.dirname(__FILE__), 'via.audulus')))['patch']['nodes'][0]
274
+ end
@@ -0,0 +1 @@
1
+ raise "Not suitable for library use yet"
@@ -0,0 +1,2834 @@
1
+ {
2
+ "type": "Patch",
3
+ "id": "edb6cbc0-6124-4e7d-bbe6-aeb5f7eb42ff",
4
+ "position": {
5
+ "x": -42.96497,
6
+ "y": -396.55725
7
+ },
8
+ "subPatch": {
9
+ "id": "2e81e350-4430-4dfb-bf68-b002c70b1878",
10
+ "pan": {
11
+ "x": 670.67206,
12
+ "y": -380.42505
13
+ },
14
+ "zoom": 1.1093,
15
+ "nodes": [
16
+ {
17
+ "type": "Knob",
18
+ "id": "ba85db03-55ac-4a07-b554-ab47f14b6d06",
19
+ "position": {
20
+ "x": -1117.9104,
21
+ "y": 233.38011
22
+ },
23
+ "name": "",
24
+ "knob": {
25
+ "value": 0.3,
26
+ "min": 0,
27
+ "max": 1
28
+ },
29
+ "exposedPosition": {
30
+ "x": -180,
31
+ "y": 5
32
+ }
33
+ },
34
+ {
35
+ "type": "Output",
36
+ "id": "235b9fbc-cb2c-4107-b29f-447446485759",
37
+ "position": {
38
+ "x": -212.83313,
39
+ "y": 131.76987
40
+ },
41
+ "name": "",
42
+ "exposedPosition": {
43
+ "x": -140,
44
+ "y": 40
45
+ }
46
+ },
47
+ {
48
+ "type": "Light",
49
+ "id": "4cfc614e-f0f8-4095-832a-91782b0f4deb",
50
+ "position": {
51
+ "x": -210.81262,
52
+ "y": 175.67537
53
+ },
54
+ "exposedPosition": {
55
+ "x": -140,
56
+ "y": 40
57
+ }
58
+ },
59
+ {
60
+ "type": "Text",
61
+ "id": "e8aa552d-d46e-413c-83df-01b7958221e8",
62
+ "position": {
63
+ "x": -695.22675,
64
+ "y": 802.55615
65
+ },
66
+ "exposedPosition": {
67
+ "x": -195,
68
+ "y": 40
69
+ },
70
+ "text": "Clock",
71
+ "width": 256
72
+ },
73
+ {
74
+ "type": "Text",
75
+ "id": "c4ce158d-3e63-4a78-9907-51ae6df3e2ad",
76
+ "position": {
77
+ "x": -1123.71326,
78
+ "y": 288.55865
79
+ },
80
+ "exposedPosition": {
81
+ "x": -190,
82
+ "y": 5
83
+ },
84
+ "text": "Hz",
85
+ "width": 256
86
+ },
87
+ {
88
+ "type": "Text",
89
+ "id": "48a0fcf5-dfe3-4c73-ba4f-2e97daf9ef6f",
90
+ "position": {
91
+ "x": -113.16809,
92
+ "y": 154.65785
93
+ },
94
+ "exposedPosition": {
95
+ "x": -145,
96
+ "y": 40
97
+ },
98
+ "text": "g",
99
+ "width": 256
100
+ },
101
+ {
102
+ "type": "Input",
103
+ "id": "8212f90f-8b34-483d-92e0-a10425c1e1a6",
104
+ "position": {
105
+ "x": -1138.0603,
106
+ "y": 30.5853
107
+ },
108
+ "name": "",
109
+ "exposedPosition": {
110
+ "x": -220,
111
+ "y": 15
112
+ }
113
+ },
114
+ {
115
+ "type": "Output",
116
+ "id": "d573b08e-39c1-4ca9-8f59-8b635fb4d19b",
117
+ "position": {
118
+ "x": -1135.72522,
119
+ "y": -57.68816
120
+ },
121
+ "name": "",
122
+ "exposedPosition": {
123
+ "x": -140,
124
+ "y": 15
125
+ }
126
+ },
127
+ {
128
+ "type": "Knob",
129
+ "id": "50c9ab77-65d6-48c6-8bfb-f4bc0fc3a98d",
130
+ "position": {
131
+ "x": -569.30945,
132
+ "y": 238.81174
133
+ },
134
+ "name": "",
135
+ "knob": {
136
+ "value": 0.5,
137
+ "min": 0,
138
+ "max": 1
139
+ },
140
+ "exposedPosition": {
141
+ "x": -180,
142
+ "y": -35
143
+ }
144
+ },
145
+ {
146
+ "type": "Knob",
147
+ "id": "53a924cc-72e3-4b89-a9c4-c567241c1ac6",
148
+ "position": {
149
+ "x": -285.05423,
150
+ "y": 241.75757
151
+ },
152
+ "name": "",
153
+ "knob": {
154
+ "value": 0,
155
+ "min": 0,
156
+ "max": 1
157
+ },
158
+ "exposedPosition": {
159
+ "x": -180,
160
+ "y": -75
161
+ }
162
+ },
163
+ {
164
+ "type": "Text",
165
+ "id": "74c82baa-0a7b-4c8c-a4ae-e32a679f6e0a",
166
+ "position": {
167
+ "x": -570.70496,
168
+ "y": 295.74069
169
+ },
170
+ "exposedPosition": {
171
+ "x": -190,
172
+ "y": -35
173
+ },
174
+ "text": "WM",
175
+ "width": 450.41077
176
+ },
177
+ {
178
+ "type": "Patch",
179
+ "id": "b9f02279-7744-49ba-a829-98b06ee72171",
180
+ "position": {
181
+ "x": -899.11414,
182
+ "y": 124.83252
183
+ },
184
+ "subPatch": {
185
+ "id": "1668616f-12a6-454e-9148-7d8fd716ac4f",
186
+ "pan": {
187
+ "x": -89.05923,
188
+ "y": -277.1777
189
+ },
190
+ "zoom": 1.46903,
191
+ "nodes": [
192
+ {
193
+ "type": "Input",
194
+ "id": "644fea30-abe8-46dd-9c3e-be5e844ea51f",
195
+ "position": {
196
+ "x": 430.91446,
197
+ "y": 6.19878
198
+ },
199
+ "name": "",
200
+ "exposedPosition": {
201
+ "x": -225,
202
+ "y": -30
203
+ }
204
+ },
205
+ {
206
+ "type": "Patch",
207
+ "id": "0517a1be-fdb2-48ed-ba2b-0d4d36b06cfa",
208
+ "position": {
209
+ "x": 647.59784,
210
+ "y": 55.16705
211
+ },
212
+ "subPatch": {
213
+ "id": "8301221e-a2fa-4785-930c-bffdaa4cfa5b",
214
+ "pan": {
215
+ "x": 62.09193,
216
+ "y": -256.84473
217
+ },
218
+ "zoom": 1.53148,
219
+ "nodes": [
220
+ {
221
+ "type": "Input",
222
+ "id": "b495ec97-d081-499a-97be-dcdb8d6e1108",
223
+ "position": {
224
+ "x": -181.08688,
225
+ "y": -50.92191
226
+ },
227
+ "name": "",
228
+ "exposedPosition": {
229
+ "x": -215,
230
+ "y": 15
231
+ }
232
+ },
233
+ {
234
+ "type": "Expr",
235
+ "id": "f2aa230a-cf43-49e9-a0e4-a2d0285a28f0",
236
+ "position": {
237
+ "x": -163.10934,
238
+ "y": 58.19318
239
+ },
240
+ "expr": "Knob==0"
241
+ },
242
+ {
243
+ "type": "Input",
244
+ "id": "fd2b08cc-e2a4-4426-907a-e281b0c6bafe",
245
+ "position": {
246
+ "x": -180.39563,
247
+ "y": -7.15953
248
+ },
249
+ "name": "",
250
+ "exposedPosition": {
251
+ "x": -215,
252
+ "y": 40
253
+ }
254
+ },
255
+ {
256
+ "type": "Output",
257
+ "id": "bd213429-06c1-4ac6-ab4c-ff603368ac82",
258
+ "position": {
259
+ "x": 50.31747,
260
+ "y": -15.12192
261
+ },
262
+ "name": "",
263
+ "exposedPosition": {
264
+ "x": -145,
265
+ "y": 40
266
+ }
267
+ },
268
+ {
269
+ "type": "Output",
270
+ "id": "5039abd3-ea6f-4fed-89af-4d664fd192b0",
271
+ "position": {
272
+ "x": 11.62437,
273
+ "y": 59.38879
274
+ },
275
+ "name": "",
276
+ "exposedPosition": {
277
+ "x": -145,
278
+ "y": 65
279
+ }
280
+ },
281
+ {
282
+ "type": "Light",
283
+ "id": "03efacbe-f53d-45e9-b03c-ad0c78d2c0c1",
284
+ "position": {
285
+ "x": 13.89293,
286
+ "y": 102.67181
287
+ },
288
+ "exposedPosition": {
289
+ "x": -145,
290
+ "y": 65
291
+ }
292
+ },
293
+ {
294
+ "type": "Text",
295
+ "id": "3f042565-8261-40f5-b866-0bb4ac9ae749",
296
+ "position": {
297
+ "x": 152.74684,
298
+ "y": 3.9482
299
+ },
300
+ "exposedPosition": {
301
+ "x": -150,
302
+ "y": 40
303
+ },
304
+ "text": ">",
305
+ "width": 256
306
+ },
307
+ {
308
+ "type": "Text",
309
+ "id": "3bed5d2a-ef02-48a3-a9e1-344969e3ecf6",
310
+ "position": {
311
+ "x": -205.47717,
312
+ "y": 14.63011
313
+ },
314
+ "exposedPosition": {
315
+ "x": -220,
316
+ "y": 40
317
+ },
318
+ "text": "A",
319
+ "width": 256
320
+ },
321
+ {
322
+ "type": "Text",
323
+ "id": "fb5fa0fc-9c5f-4415-b87d-9a0d76dee5d6",
324
+ "position": {
325
+ "x": -204.20956,
326
+ "y": -29.24904
327
+ },
328
+ "exposedPosition": {
329
+ "x": -220,
330
+ "y": 15
331
+ },
332
+ "text": "B",
333
+ "width": 256
334
+ },
335
+ {
336
+ "type": "Text",
337
+ "id": "851ccced-852e-4969-a74d-a52b99949574",
338
+ "position": {
339
+ "x": -93.18472,
340
+ "y": 558.2113
341
+ },
342
+ "exposedPosition": {
343
+ "x": -195,
344
+ "y": 55
345
+ },
346
+ "text": "Knob",
347
+ "width": 225.62769
348
+ },
349
+ {
350
+ "type": "Text",
351
+ "id": "1c4fbdcd-5b4b-4dc8-9d90-a631d83be218",
352
+ "position": {
353
+ "x": 111.71043,
354
+ "y": 81.71838
355
+ },
356
+ "exposedPosition": {
357
+ "x": -150,
358
+ "y": 65
359
+ },
360
+ "text": "g",
361
+ "width": 256
362
+ },
363
+ {
364
+ "type": "Input",
365
+ "id": "569dc8dc-b193-4fc4-ae74-fa42770c61f2",
366
+ "position": {
367
+ "x": -258.47925,
368
+ "y": 57.79343
369
+ },
370
+ "name": "",
371
+ "exposedPosition": {
372
+ "x": -215,
373
+ "y": 65
374
+ }
375
+ },
376
+ {
377
+ "type": "Text",
378
+ "id": "c8f4c1bd-8624-4325-946b-a2b7a1e5f032",
379
+ "position": {
380
+ "x": -284.72308,
381
+ "y": 79.47213
382
+ },
383
+ "exposedPosition": {
384
+ "x": -220,
385
+ "y": 65
386
+ },
387
+ "text": "k",
388
+ "width": 256
389
+ },
390
+ {
391
+ "type": "Text",
392
+ "id": "8c07bdc8-e926-4d9b-9ec3-65d41b791ec9",
393
+ "position": {
394
+ "x": -92.41342,
395
+ "y": 534.67877
396
+ },
397
+ "exposedPosition": {
398
+ "x": -195,
399
+ "y": 45
400
+ },
401
+ "text": "Zero",
402
+ "width": 225.62769
403
+ },
404
+ {
405
+ "type": "Text",
406
+ "id": "f798bd3f-f58f-45bd-be25-1ebc66f98e7e",
407
+ "position": {
408
+ "x": -97.44033,
409
+ "y": 511.10059
410
+ },
411
+ "exposedPosition": {
412
+ "x": -200,
413
+ "y": 35
414
+ },
415
+ "text": "Switch",
416
+ "width": 225.62769
417
+ },
418
+ {
419
+ "type": "Patch",
420
+ "id": "c3eea791-8cf8-4e97-86bd-8be878153129",
421
+ "position": {
422
+ "x": -19.67397,
423
+ "y": -45.49535
424
+ },
425
+ "subPatch": {
426
+ "id": "9ec60b9d-4361-4312-b2c1-4758d6ef565f",
427
+ "pan": {
428
+ "x": -80.49748,
429
+ "y": -456.07159
430
+ },
431
+ "zoom": 0.94046,
432
+ "nodes": [
433
+ {
434
+ "type": "Input",
435
+ "id": "83751d01-c97e-4aed-b689-be25e899dee2",
436
+ "position": {
437
+ "x": -24.07651,
438
+ "y": -60.70171
439
+ },
440
+ "name": "",
441
+ "exposedPosition": {
442
+ "x": -45,
443
+ "y": 50
444
+ }
445
+ },
446
+ {
447
+ "type": "Input",
448
+ "id": "e9f59211-f4ba-411f-9cb9-5392fee15ad3",
449
+ "position": {
450
+ "x": -24.48404,
451
+ "y": -16.38181
452
+ },
453
+ "name": "",
454
+ "exposedPosition": {
455
+ "x": -45,
456
+ "y": 25
457
+ }
458
+ },
459
+ {
460
+ "type": "Crossfade",
461
+ "id": "3ece66d7-7e53-48d1-b821-d7c558d37b0f",
462
+ "position": {
463
+ "x": 72.01563,
464
+ "y": -50.16406
465
+ }
466
+ },
467
+ {
468
+ "type": "Output",
469
+ "id": "e2505f5c-9e81-40dc-9692-63c82cdda466",
470
+ "position": {
471
+ "x": 214.53906,
472
+ "y": -50.12109
473
+ },
474
+ "name": "",
475
+ "exposedPosition": {
476
+ "x": 40,
477
+ "y": 50
478
+ }
479
+ },
480
+ {
481
+ "type": "Text",
482
+ "id": "a432a711-8a9e-42e3-8e04-4176613d6250",
483
+ "position": {
484
+ "x": -51.39682,
485
+ "y": -39.13139
486
+ },
487
+ "exposedPosition": {
488
+ "x": -50,
489
+ "y": 50
490
+ },
491
+ "text": "A",
492
+ "width": 256
493
+ },
494
+ {
495
+ "type": "Text",
496
+ "id": "e5e18ee6-e449-44b8-ac46-d6783b66a2c7",
497
+ "position": {
498
+ "x": -53.84732,
499
+ "y": 5.02444
500
+ },
501
+ "exposedPosition": {
502
+ "x": -50,
503
+ "y": 25
504
+ },
505
+ "text": "B",
506
+ "width": 256
507
+ },
508
+ {
509
+ "type": "Text",
510
+ "id": "309626bb-de15-4d89-9c8e-7dd54d6156b7",
511
+ "position": {
512
+ "x": 314.35156,
513
+ "y": -29.33984
514
+ },
515
+ "exposedPosition": {
516
+ "x": 35,
517
+ "y": 50
518
+ },
519
+ "text": ">",
520
+ "width": 256
521
+ },
522
+ {
523
+ "type": "Knob",
524
+ "id": "892b80fe-5301-48e9-b3d2-739b5d68b946",
525
+ "position": {
526
+ "x": -7.40625,
527
+ "y": 71.4375
528
+ },
529
+ "name": "",
530
+ "knob": {
531
+ "value": 0.5,
532
+ "min": 0,
533
+ "max": 1
534
+ },
535
+ "exposedPosition": {
536
+ "x": 0,
537
+ "y": 15
538
+ }
539
+ },
540
+ {
541
+ "type": "Text",
542
+ "id": "df148a8e-15c6-4f8b-8d3b-d1a03e8e3d15",
543
+ "position": {
544
+ "x": -17.77734,
545
+ "y": 129.84766
546
+ },
547
+ "exposedPosition": {
548
+ "x": -10,
549
+ "y": 15
550
+ },
551
+ "text": "A/B",
552
+ "width": 256
553
+ },
554
+ {
555
+ "type": "Text",
556
+ "id": "b1c458fd-b111-4c1b-b704-fc689e4d2756",
557
+ "position": {
558
+ "x": 14.23862,
559
+ "y": 956.90155
560
+ },
561
+ "exposedPosition": {
562
+ "x": -30,
563
+ "y": 50
564
+ },
565
+ "text": "Crossfade",
566
+ "width": 256
567
+ },
568
+ {
569
+ "type": "Text",
570
+ "id": "7aa08a83-41f2-4d95-a75e-7ecbcbfd0c63",
571
+ "position": {
572
+ "x": -333.17654,
573
+ "y": 447.66446
574
+ },
575
+ "text": "------------------------------------------------------------------------------------------------",
576
+ "width": 1162.61182
577
+ },
578
+ {
579
+ "type": "Text",
580
+ "id": "131c5097-1f41-450d-b3ca-64ca82067e58",
581
+ "position": {
582
+ "x": -238.90025,
583
+ "y": 575.33685
584
+ },
585
+ "text": "How do crossfaders work?",
586
+ "width": 256
587
+ },
588
+ {
589
+ "type": "Text",
590
+ "id": "4c2a0d01-b369-401a-8795-33d664059ef8",
591
+ "position": {
592
+ "x": -322.84973,
593
+ "y": 712.02771
594
+ },
595
+ "text": "------------------------------------------------------------------------------------------------",
596
+ "width": 1162.61182
597
+ },
598
+ {
599
+ "type": "Text",
600
+ "id": "2aec4f48-0089-4796-a3f5-acb6b895d114",
601
+ "position": {
602
+ "x": -210.93602,
603
+ "y": 850.84802
604
+ },
605
+ "text": "What is a crossfader?",
606
+ "width": 256
607
+ },
608
+ {
609
+ "type": "Text",
610
+ "id": "4b0494aa-aba5-4d72-bf43-edc13465c603",
611
+ "position": {
612
+ "x": -35.23831,
613
+ "y": 355.77789
614
+ },
615
+ "text": "The Crossfade module is a repackaging of the Crossfade node. This Crossfader is a linear crossfader. It makes an excellent switch and a great crossfader for mixing m (modulation) signals together. However, it is not suitable for audio crossfading by itself. If you wish to crossfade between audio signals, use the Equal Power Crossfader. That module takes into account the logarithmic nature of our hearing, which requires a logarithmic rather than linear crossfader.",
616
+ "width": 256
617
+ },
618
+ {
619
+ "type": "Text",
620
+ "id": "8c042a20-d9fe-4918-bd14-b6b46b179734",
621
+ "position": {
622
+ "x": -37.70775,
623
+ "y": 648.23523
624
+ },
625
+ "text": "A crossfader basically has two volume controls - one for each signal. The crossfader itself (a knob, or often a sliding potentiometer) increases the volume of one signal when turned up while decreasing the other signal. When the knob or slide is turned the other way, the first signal decreases in volume while the other increases. These two signals are then summed (added) together at the output of the crossfader.",
626
+ "width": 256
627
+ },
628
+ {
629
+ "type": "Text",
630
+ "id": "a087eb88-8dfe-411c-9418-1f60da6dfd01",
631
+ "position": {
632
+ "x": -45.6703,
633
+ "y": 908.47998
634
+ },
635
+ "text": "Crossfaders take two inputs and transition between them using a control like a knob or slider. Crossfaders are an essential part of DJing, where they are used creatively to mix two records together. Crossfades are often automatically applied in DAWs to prevent popping during looping. Audulus itself crossfades connections to allow for live patching without introducing popping noises similar to when you unplug a guitar with the amp still on.",
636
+ "width": 256
637
+ },
638
+ {
639
+ "type": "Text",
640
+ "id": "1576a635-5bb7-484f-8f03-36ec74e1052b",
641
+ "position": {
642
+ "x": -275.76984,
643
+ "y": 301.0882
644
+ },
645
+ "text": "How does this crossfader work?",
646
+ "width": 256
647
+ }
648
+ ],
649
+ "wires": [
650
+ {
651
+ "from": "83751d01-c97e-4aed-b689-be25e899dee2",
652
+ "output": 0,
653
+ "to": "3ece66d7-7e53-48d1-b821-d7c558d37b0f",
654
+ "input": 0
655
+ },
656
+ {
657
+ "from": "e9f59211-f4ba-411f-9cb9-5392fee15ad3",
658
+ "output": 0,
659
+ "to": "3ece66d7-7e53-48d1-b821-d7c558d37b0f",
660
+ "input": 1
661
+ },
662
+ {
663
+ "from": "892b80fe-5301-48e9-b3d2-739b5d68b946",
664
+ "output": 0,
665
+ "to": "3ece66d7-7e53-48d1-b821-d7c558d37b0f",
666
+ "input": 2
667
+ },
668
+ {
669
+ "from": "3ece66d7-7e53-48d1-b821-d7c558d37b0f",
670
+ "output": 0,
671
+ "to": "e2505f5c-9e81-40dc-9692-63c82cdda466",
672
+ "input": 0
673
+ }
674
+ ]
675
+ }
676
+ },
677
+ {
678
+ "type": "Text",
679
+ "id": "be3fb349-8edb-4712-9a1d-bfbe1cf1c320",
680
+ "position": {
681
+ "x": -136.67323,
682
+ "y": 316.05701
683
+ },
684
+ "text": "How does this Brick work?",
685
+ "width": 256
686
+ },
687
+ {
688
+ "type": "Text",
689
+ "id": "4f64c0a8-21c5-4076-9de3-c4eff706e847",
690
+ "position": {
691
+ "x": -186.13654,
692
+ "y": 275.20831
693
+ },
694
+ "text": "The incoming k (knob) signal is fed into the Knob==0 equality expression. This expression is true (outputs a 1) only when the k signal is exactly equal to (==) 0. When the k signal is 0, the Crossfade module switches from signal A to signal B. The g (gate) output is useful as an indicator light when the zero switch is engaged.",
695
+ "width": 256
696
+ },
697
+ {
698
+ "type": "Text",
699
+ "id": "6331b6c6-55d5-453e-9c05-5c03571c1af1",
700
+ "position": {
701
+ "x": -113.5871,
702
+ "y": 460.2887
703
+ },
704
+ "text": "What is this Brick?",
705
+ "width": 256
706
+ },
707
+ {
708
+ "type": "Text",
709
+ "id": "029a084c-f0a3-48eb-a803-862d0c4f3e96",
710
+ "position": {
711
+ "x": -177.74719,
712
+ "y": 416.63
713
+ },
714
+ "text": "The Knob Zero Switch adds switching functionality to a knob. When the knob is turned all the way down, the knob switches itself out in favor of another incoming signal. It allows you to sync multiple modules together in interesting ways.",
715
+ "width": 256
716
+ }
717
+ ],
718
+ "wires": [
719
+ {
720
+ "from": "569dc8dc-b193-4fc4-ae74-fa42770c61f2",
721
+ "output": 0,
722
+ "to": "f2aa230a-cf43-49e9-a0e4-a2d0285a28f0",
723
+ "input": 0
724
+ },
725
+ {
726
+ "from": "c3eea791-8cf8-4e97-86bd-8be878153129",
727
+ "output": 0,
728
+ "to": "bd213429-06c1-4ac6-ab4c-ff603368ac82",
729
+ "input": 0
730
+ },
731
+ {
732
+ "from": "f2aa230a-cf43-49e9-a0e4-a2d0285a28f0",
733
+ "output": 0,
734
+ "to": "5039abd3-ea6f-4fed-89af-4d664fd192b0",
735
+ "input": 0
736
+ },
737
+ {
738
+ "from": "f2aa230a-cf43-49e9-a0e4-a2d0285a28f0",
739
+ "output": 0,
740
+ "to": "03efacbe-f53d-45e9-b03c-ad0c78d2c0c1",
741
+ "input": 0
742
+ },
743
+ {
744
+ "from": "fd2b08cc-e2a4-4426-907a-e281b0c6bafe",
745
+ "output": 0,
746
+ "to": "c3eea791-8cf8-4e97-86bd-8be878153129",
747
+ "input": 0
748
+ },
749
+ {
750
+ "from": "b495ec97-d081-499a-97be-dcdb8d6e1108",
751
+ "output": 0,
752
+ "to": "c3eea791-8cf8-4e97-86bd-8be878153129",
753
+ "input": 1
754
+ },
755
+ {
756
+ "from": "f2aa230a-cf43-49e9-a0e4-a2d0285a28f0",
757
+ "output": 0,
758
+ "to": "c3eea791-8cf8-4e97-86bd-8be878153129",
759
+ "input": 2
760
+ }
761
+ ]
762
+ }
763
+ },
764
+ {
765
+ "type": "Input",
766
+ "id": "e5b315b6-94a4-490a-8628-29175d3bd9c7",
767
+ "position": {
768
+ "x": -447.64566,
769
+ "y": 98.56901
770
+ },
771
+ "name": "",
772
+ "exposedPosition": {
773
+ "x": -225,
774
+ "y": 45
775
+ }
776
+ },
777
+ {
778
+ "type": "Output",
779
+ "id": "a417f468-20d2-4815-84b5-af83862531fd",
780
+ "position": {
781
+ "x": 537.70612,
782
+ "y": 101.23447
783
+ },
784
+ "name": "",
785
+ "exposedPosition": {
786
+ "x": -160,
787
+ "y": 20
788
+ }
789
+ },
790
+ {
791
+ "type": "Output",
792
+ "id": "dee29f7c-fb5c-442e-9373-5eff51ef8f2b",
793
+ "position": {
794
+ "x": 539.38037,
795
+ "y": 57.7056
796
+ },
797
+ "name": "",
798
+ "exposedPosition": {
799
+ "x": -160,
800
+ "y": 45
801
+ }
802
+ },
803
+ {
804
+ "type": "Input",
805
+ "id": "4bbdf59d-6bf1-451a-b0c3-a28852c9f8ff",
806
+ "position": {
807
+ "x": 67.72413,
808
+ "y": -10.93362
809
+ },
810
+ "name": "",
811
+ "exposedPosition": {
812
+ "x": -225,
813
+ "y": 20
814
+ }
815
+ },
816
+ {
817
+ "type": "Input",
818
+ "id": "48e967e3-3c82-47fd-9f12-a4b53236172c",
819
+ "position": {
820
+ "x": 66.91001,
821
+ "y": -53.65267
822
+ },
823
+ "name": "",
824
+ "exposedPosition": {
825
+ "x": -225,
826
+ "y": -5
827
+ }
828
+ },
829
+ {
830
+ "type": "Patch",
831
+ "id": "11b0a97a-97f0-4954-9698-c464e14b1b5d",
832
+ "position": {
833
+ "x": 302.63693,
834
+ "y": 105.53316
835
+ },
836
+ "subPatch": {
837
+ "id": "4271cc94-0510-46b4-8d7d-9ef2cb1e5459",
838
+ "pan": {
839
+ "x": -183.57681,
840
+ "y": -275.64273
841
+ },
842
+ "zoom": 1.66288,
843
+ "nodes": [
844
+ {
845
+ "type": "Expr",
846
+ "id": "31a6cdfd-aa35-4ed6-ab21-50b7ca7728ef",
847
+ "position": {
848
+ "x": -4.04594,
849
+ "y": 0.02754
850
+ },
851
+ "expr": "H-L"
852
+ },
853
+ {
854
+ "type": "Input",
855
+ "id": "2ec2b486-c6c3-4484-b0e4-a461167ad1c1",
856
+ "position": {
857
+ "x": -118.01053,
858
+ "y": 44.36736
859
+ },
860
+ "name": "",
861
+ "exposedPosition": {
862
+ "x": -225,
863
+ "y": -55
864
+ }
865
+ },
866
+ {
867
+ "type": "Input",
868
+ "id": "6d4e4886-21b1-4ded-b9f4-cca406bedecb",
869
+ "position": {
870
+ "x": -116.6965,
871
+ "y": 0.49982
872
+ },
873
+ "name": "",
874
+ "exposedPosition": {
875
+ "x": -225,
876
+ "y": -30
877
+ }
878
+ },
879
+ {
880
+ "type": "Text",
881
+ "id": "513eee67-f4f8-49a6-9427-a634da169e3c",
882
+ "position": {
883
+ "x": -135.95528,
884
+ "y": 20.19753
885
+ },
886
+ "exposedPosition": {
887
+ "x": -230,
888
+ "y": -30
889
+ },
890
+ "text": "H",
891
+ "width": 256
892
+ },
893
+ {
894
+ "type": "Text",
895
+ "id": "1f244195-268c-4f73-89af-eeca84b81cd5",
896
+ "position": {
897
+ "x": -135.61598,
898
+ "y": 62.46148
899
+ },
900
+ "exposedPosition": {
901
+ "x": -230,
902
+ "y": -55
903
+ },
904
+ "text": "L",
905
+ "width": 256
906
+ },
907
+ {
908
+ "type": "Input",
909
+ "id": "e2428fdc-6bdc-413d-badf-35d5fa3b81aa",
910
+ "position": {
911
+ "x": 147.71793,
912
+ "y": -16.07549
913
+ },
914
+ "name": "",
915
+ "exposedPosition": {
916
+ "x": -225,
917
+ "y": -5
918
+ }
919
+ },
920
+ {
921
+ "type": "Text",
922
+ "id": "47bcaf90-7248-41f4-88c6-1d615171934c",
923
+ "position": {
924
+ "x": 133.87654,
925
+ "y": 5.30763
926
+ },
927
+ "exposedPosition": {
928
+ "x": -230,
929
+ "y": -5
930
+ },
931
+ "text": "k",
932
+ "width": 256
933
+ },
934
+ {
935
+ "type": "Expr",
936
+ "id": "878f0810-6a76-4a34-b7f4-b50093f50222",
937
+ "position": {
938
+ "x": 250.34554,
939
+ "y": -16.62083
940
+ },
941
+ "expr": "k*H+L"
942
+ },
943
+ {
944
+ "type": "Output",
945
+ "id": "a9c190c4-f150-4209-9958-9e9dcd95ed04",
946
+ "position": {
947
+ "x": 393.93756,
948
+ "y": 14.30188
949
+ },
950
+ "name": "",
951
+ "exposedPosition": {
952
+ "x": -165,
953
+ "y": -5
954
+ }
955
+ },
956
+ {
957
+ "type": "Text",
958
+ "id": "75b9d0e2-0fdc-486c-8606-d79798c7d2f3",
959
+ "position": {
960
+ "x": 494.67535,
961
+ "y": 33.81485
962
+ },
963
+ "exposedPosition": {
964
+ "x": -170,
965
+ "y": -5
966
+ },
967
+ "text": "#",
968
+ "width": 256
969
+ },
970
+ {
971
+ "type": "Text",
972
+ "id": "073534d4-e899-4f00-83cc-3b90ee85d40d",
973
+ "position": {
974
+ "x": 169.8968,
975
+ "y": 551.91284
976
+ },
977
+ "exposedPosition": {
978
+ "x": -210,
979
+ "y": -5
980
+ },
981
+ "text": "Hi/Lo",
982
+ "width": 256
983
+ },
984
+ {
985
+ "type": "Text",
986
+ "id": "7d04cdad-4c47-4641-aca2-cca31eb52f9b",
987
+ "position": {
988
+ "x": 306.06668,
989
+ "y": 260.52588
990
+ },
991
+ "text": "Step 2",
992
+ "width": 256
993
+ },
994
+ {
995
+ "type": "Text",
996
+ "id": "2b41421d-a368-4975-b9d5-1806b7ab2363",
997
+ "position": {
998
+ "x": 2.71334,
999
+ "y": 253.84799
1000
+ },
1001
+ "text": "Step 1",
1002
+ "width": 256
1003
+ },
1004
+ {
1005
+ "type": "Text",
1006
+ "id": "a139b66e-4636-4148-b1a0-5c66991b430c",
1007
+ "position": {
1008
+ "x": 135.83546,
1009
+ "y": 339.0455
1010
+ },
1011
+ "text": "How does this Brick work?",
1012
+ "width": 256
1013
+ },
1014
+ {
1015
+ "type": "Text",
1016
+ "id": "a04e81b8-9b17-4814-8a8b-145926eca31b",
1017
+ "position": {
1018
+ "x": 221.94551,
1019
+ "y": 227.58778
1020
+ },
1021
+ "text": "The incoming k (knob) signal is multiplied by the result of the H-L expression, and then the L value is added back in. To understand how this works, imagine these two scenarios: L signal is 0, H signal is 10. k*10+0 = 0-10; L signal is 10, H signal is 100. k*(100-10)+10 = 10-100. The output of this expression is passed on as a # signal.",
1022
+ "width": 256
1023
+ },
1024
+ {
1025
+ "type": "Text",
1026
+ "id": "ae6f3935-7ba5-4095-9271-af1ef16498f8",
1027
+ "position": {
1028
+ "x": -88.25612,
1029
+ "y": 217.60141
1030
+ },
1031
+ "text": "The H (high) and L (low) signals enter and the L signal is subtracted from the H signal.",
1032
+ "width": 256
1033
+ },
1034
+ {
1035
+ "type": "Text",
1036
+ "id": "1cbd2e32-a95a-4c71-983d-ad96e0f4ab7c",
1037
+ "position": {
1038
+ "x": 141.58167,
1039
+ "y": 503.259
1040
+ },
1041
+ "text": "What is this Brick?",
1042
+ "width": 256
1043
+ },
1044
+ {
1045
+ "type": "Text",
1046
+ "id": "5b8498e8-040b-4e1f-9813-2902c31edda3",
1047
+ "position": {
1048
+ "x": 68.9017,
1049
+ "y": 467.75836
1050
+ },
1051
+ "text": "This Hi/Lo brick scales a 0-1 k (knob) signal between any low and high value. Using this brick allows you to keep all of your knobs 0-1, which make them easier to modulate. Also, with multiple Hi/Lo bricks, you can use one k signal that scales to multiple high and low points.",
1052
+ "width": 256
1053
+ }
1054
+ ],
1055
+ "wires": [
1056
+ {
1057
+ "from": "6d4e4886-21b1-4ded-b9f4-cca406bedecb",
1058
+ "output": 0,
1059
+ "to": "31a6cdfd-aa35-4ed6-ab21-50b7ca7728ef",
1060
+ "input": 0
1061
+ },
1062
+ {
1063
+ "from": "2ec2b486-c6c3-4484-b0e4-a461167ad1c1",
1064
+ "output": 0,
1065
+ "to": "31a6cdfd-aa35-4ed6-ab21-50b7ca7728ef",
1066
+ "input": 1
1067
+ },
1068
+ {
1069
+ "from": "e2428fdc-6bdc-413d-badf-35d5fa3b81aa",
1070
+ "output": 0,
1071
+ "to": "878f0810-6a76-4a34-b7f4-b50093f50222",
1072
+ "input": 0
1073
+ },
1074
+ {
1075
+ "from": "31a6cdfd-aa35-4ed6-ab21-50b7ca7728ef",
1076
+ "output": 0,
1077
+ "to": "878f0810-6a76-4a34-b7f4-b50093f50222",
1078
+ "input": 1
1079
+ },
1080
+ {
1081
+ "from": "2ec2b486-c6c3-4484-b0e4-a461167ad1c1",
1082
+ "output": 0,
1083
+ "to": "878f0810-6a76-4a34-b7f4-b50093f50222",
1084
+ "input": 2
1085
+ },
1086
+ {
1087
+ "from": "878f0810-6a76-4a34-b7f4-b50093f50222",
1088
+ "output": 0,
1089
+ "to": "a9c190c4-f150-4209-9958-9e9dcd95ed04",
1090
+ "input": 0
1091
+ }
1092
+ ]
1093
+ }
1094
+ },
1095
+ {
1096
+ "type": "Text",
1097
+ "id": "2edef151-a7bc-4210-934b-c932de99934f",
1098
+ "position": {
1099
+ "x": 44.499,
1100
+ "y": 10.20201
1101
+ },
1102
+ "exposedPosition": {
1103
+ "x": -230,
1104
+ "y": 20
1105
+ },
1106
+ "text": "H",
1107
+ "width": 256
1108
+ },
1109
+ {
1110
+ "type": "Text",
1111
+ "id": "1068151d-2245-4334-8486-e78a773e76b1",
1112
+ "position": {
1113
+ "x": 45.61478,
1114
+ "y": -32.42736
1115
+ },
1116
+ "exposedPosition": {
1117
+ "x": -230,
1118
+ "y": -5
1119
+ },
1120
+ "text": "L",
1121
+ "width": 256
1122
+ },
1123
+ {
1124
+ "type": "Text",
1125
+ "id": "16778fa8-07f8-459f-b8e1-c18492b463a8",
1126
+ "position": {
1127
+ "x": -469.63461,
1128
+ "y": 121.2382
1129
+ },
1130
+ "exposedPosition": {
1131
+ "x": -230,
1132
+ "y": 45
1133
+ },
1134
+ "text": "k",
1135
+ "width": 256
1136
+ },
1137
+ {
1138
+ "type": "Text",
1139
+ "id": "84770ca7-a5a4-4ad6-990f-81610de5e476",
1140
+ "position": {
1141
+ "x": 640.27026,
1142
+ "y": 78.31544
1143
+ },
1144
+ "exposedPosition": {
1145
+ "x": -165,
1146
+ "y": 45
1147
+ },
1148
+ "text": ">",
1149
+ "width": 256
1150
+ },
1151
+ {
1152
+ "type": "Text",
1153
+ "id": "cfbdee5d-0b4e-4bf7-b8ac-840824c9ee5c",
1154
+ "position": {
1155
+ "x": 417.58157,
1156
+ "y": 25.14512
1157
+ },
1158
+ "exposedPosition": {
1159
+ "x": -230,
1160
+ "y": -30
1161
+ },
1162
+ "text": "#",
1163
+ "width": 256
1164
+ },
1165
+ {
1166
+ "type": "Text",
1167
+ "id": "4ebe19d3-c73f-45b7-baa0-604795805753",
1168
+ "position": {
1169
+ "x": 639.1839,
1170
+ "y": 121.75219
1171
+ },
1172
+ "exposedPosition": {
1173
+ "x": -165,
1174
+ "y": 20
1175
+ },
1176
+ "text": "g",
1177
+ "width": 256
1178
+ },
1179
+ {
1180
+ "type": "Text",
1181
+ "id": "d1e0f31a-6436-47eb-8d9e-b05c57bd4e78",
1182
+ "position": {
1183
+ "x": 443.54138,
1184
+ "y": 323.92554
1185
+ },
1186
+ "text": "Step 3",
1187
+ "width": 256
1188
+ },
1189
+ {
1190
+ "type": "Text",
1191
+ "id": "e12a68f6-fc70-43ba-9d4f-1b6cbad30c91",
1192
+ "position": {
1193
+ "x": 88.07638,
1194
+ "y": 322.24707
1195
+ },
1196
+ "text": "Step 2",
1197
+ "width": 256
1198
+ },
1199
+ {
1200
+ "type": "Text",
1201
+ "id": "fed46723-5615-45de-b344-240e3970dadf",
1202
+ "position": {
1203
+ "x": 367.61896,
1204
+ "y": 287.83728
1205
+ },
1206
+ "text": "The scaled signal from the Hi/Lo brick is fed into input A of the Knob Zero Switch. If the k signal is greater than zero, the A signal passes to the > (throughput) output. Also, the k signal from the Curve brick is fed into the k input of the Knob Zero Switch. When the k input is exactly equal to 0, the Knob Zero Switch sends signal B to the > output and the g (gate) output goes high (outputs a 1). The g output is typically used to drive an indicator light.",
1207
+ "width": 256
1208
+ },
1209
+ {
1210
+ "type": "Text",
1211
+ "id": "2ad9c71d-0742-4026-a4f0-32936bb44979",
1212
+ "position": {
1213
+ "x": 3.95522,
1214
+ "y": 289.30896
1215
+ },
1216
+ "text": "The k output of the Curve brick is scaled into a user-defined range with the Hi/Lo brick.",
1217
+ "width": 256
1218
+ },
1219
+ {
1220
+ "type": "Text",
1221
+ "id": "e72d8ab4-17a5-4639-8804-1ddd060fe8ab",
1222
+ "position": {
1223
+ "x": -225.91557,
1224
+ "y": 324.6655
1225
+ },
1226
+ "text": "Step 1",
1227
+ "width": 256
1228
+ },
1229
+ {
1230
+ "type": "Text",
1231
+ "id": "8b5d53e1-5e9a-42ff-bb1c-9fb421fb4123",
1232
+ "position": {
1233
+ "x": 51.66309,
1234
+ "y": 512.91589
1235
+ },
1236
+ "text": "What is this Brick?",
1237
+ "width": 256
1238
+ },
1239
+ {
1240
+ "type": "Text",
1241
+ "id": "3efd32bd-3ffb-4b4b-b277-c37fcf4cfc29",
1242
+ "position": {
1243
+ "x": -313.27121,
1244
+ "y": 289.71173
1245
+ },
1246
+ "text": "The incoming k (knob) signal is fed into the Curve brick, which gives the normally linear k signal a strong exponential curve.",
1247
+ "width": 256
1248
+ },
1249
+ {
1250
+ "type": "Text",
1251
+ "id": "7d6d9b76-414e-42b8-81f6-4bb05402cfd6",
1252
+ "position": {
1253
+ "x": -16.12125,
1254
+ "y": 473.20767
1255
+ },
1256
+ "text": "The Knob Mod brick is a convenient package of tools to translate and bend a 0-1 k (knob) signal to fit your needs. It also includes a special switch that is activated when the knob is turned all the way down to 0.",
1257
+ "width": 256
1258
+ },
1259
+ {
1260
+ "type": "Text",
1261
+ "id": "b3dcbf1c-9021-4d1b-b13d-f15b6599448e",
1262
+ "position": {
1263
+ "x": 38.45838,
1264
+ "y": 372.72192
1265
+ },
1266
+ "text": "How does this Brick work?",
1267
+ "width": 256
1268
+ },
1269
+ {
1270
+ "type": "Text",
1271
+ "id": "1d56a5d4-2d5a-4439-bcaa-1d56de65a827",
1272
+ "position": {
1273
+ "x": 76.4886,
1274
+ "y": 592.02197
1275
+ },
1276
+ "exposedPosition": {
1277
+ "x": -205,
1278
+ "y": 45
1279
+ },
1280
+ "text": "Knob",
1281
+ "width": 256
1282
+ },
1283
+ {
1284
+ "type": "Text",
1285
+ "id": "599a1503-57dc-4b2d-95b0-2cada3250bb6",
1286
+ "position": {
1287
+ "x": 78.60677,
1288
+ "y": 575.29419
1289
+ },
1290
+ "exposedPosition": {
1291
+ "x": -205,
1292
+ "y": 30
1293
+ },
1294
+ "text": "Mod",
1295
+ "width": 256
1296
+ },
1297
+ {
1298
+ "type": "Patch",
1299
+ "id": "0c0bd64c-ff5f-4e5a-a593-2b92ef34fa6a",
1300
+ "position": {
1301
+ "x": -216.117,
1302
+ "y": 148.31168
1303
+ },
1304
+ "subPatch": {
1305
+ "id": "94d06e44-013e-4f6f-8760-e8c79b45314f",
1306
+ "pan": {
1307
+ "x": 210.39281,
1308
+ "y": -72.99085
1309
+ },
1310
+ "zoom": 1.60444,
1311
+ "nodes": [
1312
+ {
1313
+ "type": "Expr",
1314
+ "id": "c8384382-4f41-4fa7-b210-2973e981c935",
1315
+ "position": {
1316
+ "x": -314.67017,
1317
+ "y": -78.85876
1318
+ },
1319
+ "expr": "pow(10,ExpLog)"
1320
+ },
1321
+ {
1322
+ "type": "Knob",
1323
+ "id": "495f2e35-7738-46c4-97c9-8f69605389f4",
1324
+ "position": {
1325
+ "x": -582.09314,
1326
+ "y": -58.95003
1327
+ },
1328
+ "name": "",
1329
+ "knob": {
1330
+ "value": 0.23931,
1331
+ "min": 0,
1332
+ "max": 1
1333
+ },
1334
+ "exposedPosition": {
1335
+ "x": 0,
1336
+ "y": -65
1337
+ }
1338
+ },
1339
+ {
1340
+ "type": "Expr",
1341
+ "id": "4ae1329e-c47a-4d83-a978-af14b868855e",
1342
+ "position": {
1343
+ "x": -88.64658,
1344
+ "y": -125.22531
1345
+ },
1346
+ "expr": "pow(k,Curve)"
1347
+ },
1348
+ {
1349
+ "type": "Expr",
1350
+ "id": "f75cf4b7-7152-495e-9560-9f0d16efcb8c",
1351
+ "position": {
1352
+ "x": -503.07092,
1353
+ "y": -78.97337
1354
+ },
1355
+ "expr": "Knob*-2+1"
1356
+ },
1357
+ {
1358
+ "type": "Input",
1359
+ "id": "9a65b31c-a75e-4d2c-9a4d-db7d37d7777d",
1360
+ "position": {
1361
+ "x": -187.7854,
1362
+ "y": -125.07133
1363
+ },
1364
+ "name": "",
1365
+ "exposedPosition": {
1366
+ "x": -40,
1367
+ "y": -30
1368
+ }
1369
+ },
1370
+ {
1371
+ "type": "Output",
1372
+ "id": "373c1bd5-813a-4ee5-b88d-d995cb681170",
1373
+ "position": {
1374
+ "x": 114.83595,
1375
+ "y": -110.32617
1376
+ },
1377
+ "name": "",
1378
+ "exposedPosition": {
1379
+ "x": 40,
1380
+ "y": -30
1381
+ }
1382
+ },
1383
+ {
1384
+ "type": "RGBLight",
1385
+ "id": "58271c77-e7c1-4265-a409-4bb3002bf58b",
1386
+ "position": {
1387
+ "x": -183.76288,
1388
+ "y": -229.91824
1389
+ },
1390
+ "exposedPosition": {
1391
+ "x": -40,
1392
+ "y": -30
1393
+ }
1394
+ },
1395
+ {
1396
+ "type": "Text",
1397
+ "id": "82511a88-13ec-46b6-a55b-67121176fbb3",
1398
+ "position": {
1399
+ "x": -187.19937,
1400
+ "y": 359.92432
1401
+ },
1402
+ "exposedPosition": {
1403
+ "x": -15,
1404
+ "y": -30
1405
+ },
1406
+ "text": "Curve",
1407
+ "width": 256
1408
+ },
1409
+ {
1410
+ "type": "RGBLight",
1411
+ "id": "34a2c969-9fce-4505-a9ee-ffd255aaf4ea",
1412
+ "position": {
1413
+ "x": 116.94739,
1414
+ "y": -215.44177
1415
+ },
1416
+ "exposedPosition": {
1417
+ "x": 40,
1418
+ "y": -30
1419
+ }
1420
+ },
1421
+ {
1422
+ "type": "Text",
1423
+ "id": "6bbba8b0-05e7-4eb8-a2c3-7beb04d13a25",
1424
+ "position": {
1425
+ "x": -213.85751,
1426
+ "y": -103.95676
1427
+ },
1428
+ "exposedPosition": {
1429
+ "x": -45,
1430
+ "y": -30
1431
+ },
1432
+ "text": "k",
1433
+ "width": 256
1434
+ },
1435
+ {
1436
+ "type": "Text",
1437
+ "id": "5ae7a6cb-3a87-4772-96b0-3ca0def17ba9",
1438
+ "position": {
1439
+ "x": 216.11874,
1440
+ "y": -88.11618
1441
+ },
1442
+ "exposedPosition": {
1443
+ "x": 35,
1444
+ "y": -30
1445
+ },
1446
+ "text": "k",
1447
+ "width": 256
1448
+ },
1449
+ {
1450
+ "type": "Text",
1451
+ "id": "ce82232b-f9e1-4007-8b70-a29f9d4056df",
1452
+ "position": {
1453
+ "x": -643.40833,
1454
+ "y": -119.5399
1455
+ },
1456
+ "exposedPosition": {
1457
+ "x": -45,
1458
+ "y": -75
1459
+ },
1460
+ "text": "Exp",
1461
+ "width": 256
1462
+ },
1463
+ {
1464
+ "type": "Text",
1465
+ "id": "7fa05713-d8ec-402d-91a4-9eacf32f24e9",
1466
+ "position": {
1467
+ "x": -537.34583,
1468
+ "y": -119.58257
1469
+ },
1470
+ "exposedPosition": {
1471
+ "x": 25,
1472
+ "y": -75
1473
+ },
1474
+ "text": "Log",
1475
+ "width": 256
1476
+ },
1477
+ {
1478
+ "type": "Text",
1479
+ "id": "9c8b4535-7d3f-4a7b-9d8e-037f0da33fe6",
1480
+ "position": {
1481
+ "x": 38.55305,
1482
+ "y": 77.60813
1483
+ },
1484
+ "text": "Step 3",
1485
+ "width": 256
1486
+ },
1487
+ {
1488
+ "type": "Text",
1489
+ "id": "3376d6be-9474-4476-9d9c-12b7f00fbdf4",
1490
+ "position": {
1491
+ "x": -37.36937,
1492
+ "y": 41.51987
1493
+ },
1494
+ "text": "The response of the k signal is altered by taking it to the power of the Curve signal, which ranges from 10 (Exponential) to .1 (Logarithmic).",
1495
+ "width": 256
1496
+ },
1497
+ {
1498
+ "type": "Text",
1499
+ "id": "335ebfd3-1660-4359-be2e-e24b9c5ac773",
1500
+ "position": {
1501
+ "x": -230.35748,
1502
+ "y": 69.56989
1503
+ },
1504
+ "text": "Step 2",
1505
+ "width": 256
1506
+ },
1507
+ {
1508
+ "type": "Text",
1509
+ "id": "4a459b64-5105-450e-9b3c-ca25c2cec5b3",
1510
+ "position": {
1511
+ "x": -219.54355,
1512
+ "y": 159.35477
1513
+ },
1514
+ "text": "How does this Brick work?",
1515
+ "width": 256
1516
+ },
1517
+ {
1518
+ "type": "Text",
1519
+ "id": "20827fb1-d258-4b84-a6ae-83b8b0c5bd44",
1520
+ "position": {
1521
+ "x": -585.85608,
1522
+ "y": 36.42203
1523
+ },
1524
+ "text": "This expression translates the Exponential-Logarithmic knob to a range of -1 to 1.",
1525
+ "width": 256
1526
+ },
1527
+ {
1528
+ "type": "Text",
1529
+ "id": "92c453ba-a0da-4d5b-ae23-92a9778b5067",
1530
+ "position": {
1531
+ "x": -498.50046,
1532
+ "y": 71.37579
1533
+ },
1534
+ "text": "Step 1",
1535
+ "width": 256
1536
+ },
1537
+ {
1538
+ "type": "Text",
1539
+ "id": "885d079b-1c24-4100-85b8-4a2c0c6cd65c",
1540
+ "position": {
1541
+ "x": -314.47864,
1542
+ "y": 36.63178
1543
+ },
1544
+ "text": "This expression outputs 10 to the power of the ExpLog signal.",
1545
+ "width": 282.83118
1546
+ },
1547
+ {
1548
+ "type": "Text",
1549
+ "id": "b8d169a7-adf1-449c-aeb8-04f77a3e2862",
1550
+ "position": {
1551
+ "x": -274.12317,
1552
+ "y": 259.09372
1553
+ },
1554
+ "text": "The Curve brick can give a linear k (knob) signal an exponential or logarithmic response. This is useful for tuning frequencies for filters or fading audio. It can also be used to shape the waves of m (modulation) signals.",
1555
+ "width": 256
1556
+ },
1557
+ {
1558
+ "type": "Text",
1559
+ "id": "92978b2c-3016-4583-9c4c-c3ae06f3afeb",
1560
+ "position": {
1561
+ "x": -206.33884,
1562
+ "y": 299.54871
1563
+ },
1564
+ "text": "What is this Brick?",
1565
+ "width": 256
1566
+ }
1567
+ ],
1568
+ "wires": [
1569
+ {
1570
+ "from": "f75cf4b7-7152-495e-9560-9f0d16efcb8c",
1571
+ "output": 0,
1572
+ "to": "c8384382-4f41-4fa7-b210-2973e981c935",
1573
+ "input": 0
1574
+ },
1575
+ {
1576
+ "from": "9a65b31c-a75e-4d2c-9a4d-db7d37d7777d",
1577
+ "output": 0,
1578
+ "to": "4ae1329e-c47a-4d83-a978-af14b868855e",
1579
+ "input": 0
1580
+ },
1581
+ {
1582
+ "from": "c8384382-4f41-4fa7-b210-2973e981c935",
1583
+ "output": 0,
1584
+ "to": "4ae1329e-c47a-4d83-a978-af14b868855e",
1585
+ "input": 1
1586
+ },
1587
+ {
1588
+ "from": "495f2e35-7738-46c4-97c9-8f69605389f4",
1589
+ "output": 0,
1590
+ "to": "f75cf4b7-7152-495e-9560-9f0d16efcb8c",
1591
+ "input": 0
1592
+ },
1593
+ {
1594
+ "from": "4ae1329e-c47a-4d83-a978-af14b868855e",
1595
+ "output": 0,
1596
+ "to": "373c1bd5-813a-4ee5-b88d-d995cb681170",
1597
+ "input": 0
1598
+ },
1599
+ {
1600
+ "from": "9a65b31c-a75e-4d2c-9a4d-db7d37d7777d",
1601
+ "output": 0,
1602
+ "to": "58271c77-e7c1-4265-a409-4bb3002bf58b",
1603
+ "input": 0
1604
+ },
1605
+ {
1606
+ "from": "4ae1329e-c47a-4d83-a978-af14b868855e",
1607
+ "output": 0,
1608
+ "to": "34a2c969-9fce-4505-a9ee-ffd255aaf4ea",
1609
+ "input": 0
1610
+ }
1611
+ ]
1612
+ }
1613
+ }
1614
+ ],
1615
+ "wires": [
1616
+ {
1617
+ "from": "644fea30-abe8-46dd-9c3e-be5e844ea51f",
1618
+ "output": 0,
1619
+ "to": "0517a1be-fdb2-48ed-ba2b-0d4d36b06cfa",
1620
+ "input": 0
1621
+ },
1622
+ {
1623
+ "from": "11b0a97a-97f0-4954-9698-c464e14b1b5d",
1624
+ "output": 0,
1625
+ "to": "0517a1be-fdb2-48ed-ba2b-0d4d36b06cfa",
1626
+ "input": 1
1627
+ },
1628
+ {
1629
+ "from": "0c0bd64c-ff5f-4e5a-a593-2b92ef34fa6a",
1630
+ "output": 0,
1631
+ "to": "0517a1be-fdb2-48ed-ba2b-0d4d36b06cfa",
1632
+ "input": 2
1633
+ },
1634
+ {
1635
+ "from": "0517a1be-fdb2-48ed-ba2b-0d4d36b06cfa",
1636
+ "output": 1,
1637
+ "to": "a417f468-20d2-4815-84b5-af83862531fd",
1638
+ "input": 0
1639
+ },
1640
+ {
1641
+ "from": "0517a1be-fdb2-48ed-ba2b-0d4d36b06cfa",
1642
+ "output": 0,
1643
+ "to": "dee29f7c-fb5c-442e-9373-5eff51ef8f2b",
1644
+ "input": 0
1645
+ },
1646
+ {
1647
+ "from": "48e967e3-3c82-47fd-9f12-a4b53236172c",
1648
+ "output": 0,
1649
+ "to": "11b0a97a-97f0-4954-9698-c464e14b1b5d",
1650
+ "input": 0
1651
+ },
1652
+ {
1653
+ "from": "4bbdf59d-6bf1-451a-b0c3-a28852c9f8ff",
1654
+ "output": 0,
1655
+ "to": "11b0a97a-97f0-4954-9698-c464e14b1b5d",
1656
+ "input": 1
1657
+ },
1658
+ {
1659
+ "from": "0c0bd64c-ff5f-4e5a-a593-2b92ef34fa6a",
1660
+ "output": 0,
1661
+ "to": "11b0a97a-97f0-4954-9698-c464e14b1b5d",
1662
+ "input": 2
1663
+ },
1664
+ {
1665
+ "from": "e5b315b6-94a4-490a-8628-29175d3bd9c7",
1666
+ "output": 0,
1667
+ "to": "0c0bd64c-ff5f-4e5a-a593-2b92ef34fa6a",
1668
+ "input": 1
1669
+ }
1670
+ ]
1671
+ }
1672
+ },
1673
+ {
1674
+ "type": "Expr",
1675
+ "id": "8893251e-d87c-4dca-9654-afa4e4af335e",
1676
+ "position": {
1677
+ "x": -1245.31885,
1678
+ "y": 124.85471
1679
+ },
1680
+ "expr": "100"
1681
+ },
1682
+ {
1683
+ "type": "Light",
1684
+ "id": "ffec14b7-5b57-482d-9bf3-c86375271fab",
1685
+ "position": {
1686
+ "x": -1135.34302,
1687
+ "y": -12.87134
1688
+ },
1689
+ "exposedPosition": {
1690
+ "x": -220,
1691
+ "y": 15
1692
+ }
1693
+ },
1694
+ {
1695
+ "type": "Text",
1696
+ "id": "52709a91-897a-473a-a071-bfd5fe9e8f76",
1697
+ "position": {
1698
+ "x": -1161.56323,
1699
+ "y": 52.44754
1700
+ },
1701
+ "exposedPosition": {
1702
+ "x": -225,
1703
+ "y": 15
1704
+ },
1705
+ "text": "Hz",
1706
+ "width": 256
1707
+ },
1708
+ {
1709
+ "type": "Text",
1710
+ "id": "7ab8443a-f7c4-4e90-8790-adedeb3c2353",
1711
+ "position": {
1712
+ "x": -1161.51965,
1713
+ "y": -36.36823
1714
+ },
1715
+ "exposedPosition": {
1716
+ "x": -145,
1717
+ "y": 15
1718
+ },
1719
+ "text": "Hz",
1720
+ "width": 256
1721
+ },
1722
+ {
1723
+ "type": "Patch",
1724
+ "id": "da311857-375b-463b-a247-ccfc4f409a1f",
1725
+ "position": {
1726
+ "x": -809.57056,
1727
+ "y": 178.86053
1728
+ },
1729
+ "subPatch": {
1730
+ "id": "f63c8e21-bcd4-4da1-ade4-3d0eae27ef81",
1731
+ "pan": {
1732
+ "x": -182.96567,
1733
+ "y": -299.81015
1734
+ },
1735
+ "zoom": 1.61124,
1736
+ "nodes": [
1737
+ {
1738
+ "type": "Phasor",
1739
+ "id": "dbbd376f-7704-466c-82d6-0bd61d89e41a",
1740
+ "position": {
1741
+ "x": -56.30605,
1742
+ "y": 0.43404
1743
+ }
1744
+ },
1745
+ {
1746
+ "type": "Input",
1747
+ "id": "8f444c00-7e1e-4ad7-a3fc-a91ad0f9cc25",
1748
+ "position": {
1749
+ "x": -149.1993,
1750
+ "y": 45.1263
1751
+ },
1752
+ "name": "",
1753
+ "exposedPosition": {
1754
+ "x": -30,
1755
+ "y": -20
1756
+ }
1757
+ },
1758
+ {
1759
+ "type": "Input",
1760
+ "id": "d0f23637-0f1e-40c8-8fb2-532e90e0b94a",
1761
+ "position": {
1762
+ "x": -150.08768,
1763
+ "y": 0.07003
1764
+ },
1765
+ "name": "",
1766
+ "exposedPosition": {
1767
+ "x": -30,
1768
+ "y": -40
1769
+ }
1770
+ },
1771
+ {
1772
+ "type": "Expr",
1773
+ "id": "62a5c8e6-3fc1-4532-b766-1b7938da807b",
1774
+ "position": {
1775
+ "x": 165.37274,
1776
+ "y": -0.5981
1777
+ },
1778
+ "expr": "Phasor/(2*pi)"
1779
+ },
1780
+ {
1781
+ "type": "Output",
1782
+ "id": "0a07f3a4-9f08-4ae3-a7db-80c7d608720e",
1783
+ "position": {
1784
+ "x": 433.84253,
1785
+ "y": -1.83641
1786
+ },
1787
+ "name": "",
1788
+ "exposedPosition": {
1789
+ "x": -10,
1790
+ "y": -30
1791
+ }
1792
+ },
1793
+ {
1794
+ "type": "Text",
1795
+ "id": "784fc301-3ce5-4c8f-a099-7a23d5926d95",
1796
+ "position": {
1797
+ "x": -173.73087,
1798
+ "y": 19.82549
1799
+ },
1800
+ "exposedPosition": {
1801
+ "x": -35,
1802
+ "y": -40
1803
+ },
1804
+ "text": "#",
1805
+ "width": 256
1806
+ },
1807
+ {
1808
+ "type": "Light",
1809
+ "id": "c0fc65ac-9824-469f-925f-c566c6780fb7",
1810
+ "position": {
1811
+ "x": -147.27597,
1812
+ "y": 88.61793
1813
+ },
1814
+ "exposedPosition": {
1815
+ "x": -30,
1816
+ "y": -20
1817
+ }
1818
+ },
1819
+ {
1820
+ "type": "Text",
1821
+ "id": "d45ada02-95ad-4ec7-9102-9fd627f0f954",
1822
+ "position": {
1823
+ "x": -174.99625,
1824
+ "y": 67.35455
1825
+ },
1826
+ "exposedPosition": {
1827
+ "x": -35,
1828
+ "y": -20
1829
+ },
1830
+ "text": "g",
1831
+ "width": 256
1832
+ },
1833
+ {
1834
+ "type": "RGBLight",
1835
+ "id": "c5751108-13aa-4ffe-892c-1a470a93b484",
1836
+ "position": {
1837
+ "x": 438.00778,
1838
+ "y": 42.868
1839
+ },
1840
+ "exposedPosition": {
1841
+ "x": -10,
1842
+ "y": -30
1843
+ }
1844
+ },
1845
+ {
1846
+ "type": "Text",
1847
+ "id": "61133f24-5e2d-4a41-ad50-6bc7df8c7c51",
1848
+ "position": {
1849
+ "x": 531.65631,
1850
+ "y": 19.62299
1851
+ },
1852
+ "exposedPosition": {
1853
+ "x": -15,
1854
+ "y": -30
1855
+ },
1856
+ "text": "m",
1857
+ "width": 256
1858
+ },
1859
+ {
1860
+ "type": "Text",
1861
+ "id": "3872453c-829a-4c1b-98a7-6aa912128ac8",
1862
+ "position": {
1863
+ "x": -127.07753,
1864
+ "y": 286.95117
1865
+ },
1866
+ "text": "The Phasor node outputs a saw wave that ranges from 0-2pi. This means once it reaches 2pi, it starts back at 0 and counts up again. The frequency of the Phasor node is determined by whatever number appears at its frequency input. When the sync input is pulsed, the phasor restarts from 0.",
1867
+ "width": 256
1868
+ },
1869
+ {
1870
+ "type": "Text",
1871
+ "id": "53101877-6f6f-4961-9dc7-dad016599f5b",
1872
+ "position": {
1873
+ "x": 173.62094,
1874
+ "y": 284.25687
1875
+ },
1876
+ "text": "This expression divides the output of the phasor by 2pi, which scales the phasor from 0-2pi to 0-1. The maximum of the Phasor node is 2pi, and 2pi/2pi = 1.",
1877
+ "width": 256
1878
+ },
1879
+ {
1880
+ "type": "Text",
1881
+ "id": "b8ea8511-c5d6-4aac-b71c-0023f7fad522",
1882
+ "position": {
1883
+ "x": -45.54427,
1884
+ "y": 321.61597
1885
+ },
1886
+ "text": "Step 1",
1887
+ "width": 256
1888
+ },
1889
+ {
1890
+ "type": "Text",
1891
+ "id": "61f4a9e8-ee9e-4c8c-ad3e-5709d8237810",
1892
+ "position": {
1893
+ "x": 260.16431,
1894
+ "y": 323.35507
1895
+ },
1896
+ "text": "Step 2",
1897
+ "width": 256
1898
+ },
1899
+ {
1900
+ "type": "Text",
1901
+ "id": "dd129dc4-1860-4b94-a2ed-085d56d090ae",
1902
+ "position": {
1903
+ "x": 93.6355,
1904
+ "y": 378.61615
1905
+ },
1906
+ "text": "How does this Brick work?",
1907
+ "width": 256
1908
+ },
1909
+ {
1910
+ "type": "Text",
1911
+ "id": "90dcd31f-3455-4c48-bc92-89645fad16de",
1912
+ "position": {
1913
+ "x": 39.75943,
1914
+ "y": 503.00458
1915
+ },
1916
+ "text": "The 0-1 Saw brick is used to create m (modulation) signals. These m signals are standardized to work in a 0-1 range so that they interface easily with 0-1 k (knob) signals. This type of wave is referred to as a saw wave because its waveform looks like the jagged blade of a saw.",
1917
+ "width": 256
1918
+ },
1919
+ {
1920
+ "type": "Text",
1921
+ "id": "177903e0-2337-4d05-aecd-cb1e549362ba",
1922
+ "position": {
1923
+ "x": 108.9712,
1924
+ "y": 585.51306
1925
+ },
1926
+ "exposedPosition": {
1927
+ "x": -45,
1928
+ "y": 0
1929
+ },
1930
+ "text": "0-1 Saw",
1931
+ "width": 256
1932
+ },
1933
+ {
1934
+ "type": "Text",
1935
+ "id": "d2d46eb1-9938-4601-91ea-d79e4a023f13",
1936
+ "position": {
1937
+ "x": 95.60281,
1938
+ "y": 535.76917
1939
+ },
1940
+ "text": "What is this Brick?",
1941
+ "width": 256
1942
+ }
1943
+ ],
1944
+ "wires": [
1945
+ {
1946
+ "from": "d0f23637-0f1e-40c8-8fb2-532e90e0b94a",
1947
+ "output": 0,
1948
+ "to": "dbbd376f-7704-466c-82d6-0bd61d89e41a",
1949
+ "input": 0
1950
+ },
1951
+ {
1952
+ "from": "8f444c00-7e1e-4ad7-a3fc-a91ad0f9cc25",
1953
+ "output": 0,
1954
+ "to": "dbbd376f-7704-466c-82d6-0bd61d89e41a",
1955
+ "input": 1
1956
+ },
1957
+ {
1958
+ "from": "dbbd376f-7704-466c-82d6-0bd61d89e41a",
1959
+ "output": 0,
1960
+ "to": "62a5c8e6-3fc1-4532-b766-1b7938da807b",
1961
+ "input": 0
1962
+ },
1963
+ {
1964
+ "from": "62a5c8e6-3fc1-4532-b766-1b7938da807b",
1965
+ "output": 0,
1966
+ "to": "0a07f3a4-9f08-4ae3-a7db-80c7d608720e",
1967
+ "input": 0
1968
+ },
1969
+ {
1970
+ "from": "8f444c00-7e1e-4ad7-a3fc-a91ad0f9cc25",
1971
+ "output": 0,
1972
+ "to": "c0fc65ac-9824-469f-925f-c566c6780fb7",
1973
+ "input": 0
1974
+ },
1975
+ {
1976
+ "from": "62a5c8e6-3fc1-4532-b766-1b7938da807b",
1977
+ "output": 0,
1978
+ "to": "c5751108-13aa-4ffe-892c-1a470a93b484",
1979
+ "input": 0
1980
+ }
1981
+ ]
1982
+ }
1983
+ },
1984
+ {
1985
+ "type": "Input",
1986
+ "id": "2f0c18b5-082a-406b-a445-574e154dd6d3",
1987
+ "position": {
1988
+ "x": -871.07025,
1989
+ "y": 198.27652
1990
+ },
1991
+ "name": "",
1992
+ "exposedPosition": {
1993
+ "x": -220,
1994
+ "y": 40
1995
+ }
1996
+ },
1997
+ {
1998
+ "type": "Light",
1999
+ "id": "81cc2b23-b6a5-413d-9e9a-fcdc0c924033",
2000
+ "position": {
2001
+ "x": -869.18201,
2002
+ "y": 241.20714
2003
+ },
2004
+ "exposedPosition": {
2005
+ "x": -220,
2006
+ "y": 40
2007
+ }
2008
+ },
2009
+ {
2010
+ "type": "Text",
2011
+ "id": "f980ff93-6b73-4364-a5b3-f142446e1bba",
2012
+ "position": {
2013
+ "x": -888.30432,
2014
+ "y": 217.89735
2015
+ },
2016
+ "exposedPosition": {
2017
+ "x": -225,
2018
+ "y": 40
2019
+ },
2020
+ "text": "g",
2021
+ "width": 256
2022
+ },
2023
+ {
2024
+ "type": "Patch",
2025
+ "id": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2026
+ "position": {
2027
+ "x": -49.03558,
2028
+ "y": 95.22319
2029
+ },
2030
+ "subPatch": {
2031
+ "id": "a693c8fa-6217-4dd4-9931-59f71798c495",
2032
+ "pan": {
2033
+ "x": 99.21249,
2034
+ "y": -245.82503
2035
+ },
2036
+ "zoom": 1.75487,
2037
+ "nodes": [
2038
+ {
2039
+ "type": "Output",
2040
+ "id": "3815edc6-e352-45c7-956a-5e438c1d7f15",
2041
+ "position": {
2042
+ "x": 92.28313,
2043
+ "y": 123.49687
2044
+ },
2045
+ "name": "",
2046
+ "exposedPosition": {
2047
+ "x": -210,
2048
+ "y": 35
2049
+ }
2050
+ },
2051
+ {
2052
+ "type": "Input",
2053
+ "id": "e238c742-9278-4339-8974-465cb067796c",
2054
+ "position": {
2055
+ "x": -377.17743,
2056
+ "y": 124.20877
2057
+ },
2058
+ "name": "",
2059
+ "exposedPosition": {
2060
+ "x": -230,
2061
+ "y": 65
2062
+ }
2063
+ },
2064
+ {
2065
+ "type": "Output",
2066
+ "id": "520fa409-09a3-43ef-a2a9-367ce9eb96d3",
2067
+ "position": {
2068
+ "x": 92.84564,
2069
+ "y": 38.11519
2070
+ },
2071
+ "name": "",
2072
+ "exposedPosition": {
2073
+ "x": -210,
2074
+ "y": 15
2075
+ }
2076
+ },
2077
+ {
2078
+ "type": "Text",
2079
+ "id": "d2792a5e-c610-4172-a241-40aaf7d39d6b",
2080
+ "position": {
2081
+ "x": -397.93744,
2082
+ "y": 145.93956
2083
+ },
2084
+ "exposedPosition": {
2085
+ "x": -235,
2086
+ "y": 65
2087
+ },
2088
+ "text": "k",
2089
+ "width": 316.98688
2090
+ },
2091
+ {
2092
+ "type": "Text",
2093
+ "id": "11e4e19f-3cb8-4a44-b91d-4d0bf4a0498f",
2094
+ "position": {
2095
+ "x": -131.09334,
2096
+ "y": 506.76831
2097
+ },
2098
+ "exposedPosition": {
2099
+ "x": -240,
2100
+ "y": 85
2101
+ },
2102
+ "text": "On/Off",
2103
+ "width": 256
2104
+ },
2105
+ {
2106
+ "type": "Input",
2107
+ "id": "0b302ed0-b90e-4339-92bd-9f9d32f15f4a",
2108
+ "position": {
2109
+ "x": -109.95834,
2110
+ "y": -29.46622
2111
+ },
2112
+ "name": "",
2113
+ "exposedPosition": {
2114
+ "x": -230,
2115
+ "y": 45
2116
+ }
2117
+ },
2118
+ {
2119
+ "type": "Output",
2120
+ "id": "0c90ac8e-21f1-45b9-b30d-b46aed6150ad",
2121
+ "position": {
2122
+ "x": 92.73146,
2123
+ "y": -6.813
2124
+ },
2125
+ "name": "",
2126
+ "exposedPosition": {
2127
+ "x": -210,
2128
+ "y": 55
2129
+ }
2130
+ },
2131
+ {
2132
+ "type": "Text",
2133
+ "id": "95d601dc-e8ef-4e09-9aa6-519b2b3183d1",
2134
+ "position": {
2135
+ "x": 190.99115,
2136
+ "y": 14.80763
2137
+ },
2138
+ "exposedPosition": {
2139
+ "x": -215,
2140
+ "y": 55
2141
+ },
2142
+ "text": ">",
2143
+ "width": 256
2144
+ },
2145
+ {
2146
+ "type": "Text",
2147
+ "id": "37befff0-7d27-426e-a3cb-e9e3cd4d7605",
2148
+ "position": {
2149
+ "x": -133.25748,
2150
+ "y": -8.42215
2151
+ },
2152
+ "exposedPosition": {
2153
+ "x": -235,
2154
+ "y": 45
2155
+ },
2156
+ "text": ">",
2157
+ "width": 256
2158
+ },
2159
+ {
2160
+ "type": "Light",
2161
+ "id": "94de823f-2b89-4145-86be-799c1e1e10e7",
2162
+ "position": {
2163
+ "x": 94.80925,
2164
+ "y": 167.90683
2165
+ },
2166
+ "exposedPosition": {
2167
+ "x": -210,
2168
+ "y": 35
2169
+ }
2170
+ },
2171
+ {
2172
+ "type": "Light",
2173
+ "id": "5c4db8ce-77d0-468d-aa84-9cfc68d3278a",
2174
+ "position": {
2175
+ "x": 94.39101,
2176
+ "y": 81.77975
2177
+ },
2178
+ "exposedPosition": {
2179
+ "x": -210,
2180
+ "y": 15
2181
+ }
2182
+ },
2183
+ {
2184
+ "type": "Text",
2185
+ "id": "8e207458-38c6-421c-b7b6-a2a51c6795ad",
2186
+ "position": {
2187
+ "x": 193.22667,
2188
+ "y": 144.74005
2189
+ },
2190
+ "exposedPosition": {
2191
+ "x": -215,
2192
+ "y": 35
2193
+ },
2194
+ "text": "g",
2195
+ "width": 256
2196
+ },
2197
+ {
2198
+ "type": "Text",
2199
+ "id": "fb99cfed-0761-4424-9417-a038cb4c144b",
2200
+ "position": {
2201
+ "x": 191.47281,
2202
+ "y": 61.15984
2203
+ },
2204
+ "exposedPosition": {
2205
+ "x": -215,
2206
+ "y": 15
2207
+ },
2208
+ "text": "g",
2209
+ "width": 256
2210
+ },
2211
+ {
2212
+ "type": "Text",
2213
+ "id": "881957e4-1c48-44bd-9bab-71f6ef116b03",
2214
+ "position": {
2215
+ "x": -204.15366,
2216
+ "y": 429.75067
2217
+ },
2218
+ "text": "The On/Off brick turns a k (knob) signal into an on/off switch. It's useful to use k signals as on/off switches because you can modulate them with m (modulation) or g (gate) signals directly.",
2219
+ "width": 256
2220
+ },
2221
+ {
2222
+ "type": "Text",
2223
+ "id": "4c023c21-9af0-498d-a910-3566899e7f89",
2224
+ "position": {
2225
+ "x": -202.97633,
2226
+ "y": 316.71936
2227
+ },
2228
+ "text": "The incoming k (knob) signal is fed to the k>.5 expression. When the k signal is greater than .5, the expression is true, and so it outputs a 1. When the k signal is less than or equal to .5, the expression is false, and outputs a 0. The output of this expression is fed to a Multiply node. When the > (throughput) signal is multiplied by 1, the signal passes. When it is multiplied by 0, it does not pass. The 1-Signal expression inverts the output of the logic expression to provide an \"Off\" g indicator signal.",
2229
+ "width": 256
2230
+ },
2231
+ {
2232
+ "type": "Text",
2233
+ "id": "ec8c5345-50e8-40a6-9482-bb40e246c2d9",
2234
+ "position": {
2235
+ "x": -145.57799,
2236
+ "y": 352.35162
2237
+ },
2238
+ "text": "How does this Brick work?",
2239
+ "width": 256
2240
+ },
2241
+ {
2242
+ "type": "Text",
2243
+ "id": "86c70187-30bc-4f6c-8462-bd5e89a57837",
2244
+ "position": {
2245
+ "x": -143.23906,
2246
+ "y": 467.40332
2247
+ },
2248
+ "text": "What is this Brick?",
2249
+ "width": 256
2250
+ },
2251
+ {
2252
+ "type": "Expr",
2253
+ "id": "ac187b91-ccf4-4b5c-8357-bb8886a925d7",
2254
+ "position": {
2255
+ "x": -264.77454,
2256
+ "y": 124.23103
2257
+ },
2258
+ "expr": "k>.5"
2259
+ },
2260
+ {
2261
+ "type": "Expr",
2262
+ "id": "268b297a-905c-42fe-a8b0-66eccdf029c3",
2263
+ "position": {
2264
+ "x": -133.40952,
2265
+ "y": 124.99057
2266
+ },
2267
+ "expr": "1-Signal"
2268
+ },
2269
+ {
2270
+ "type": "Mult",
2271
+ "id": "2b6c6f3c-6719-4709-930e-b0c965e3878d",
2272
+ "position": {
2273
+ "x": 35.51716,
2274
+ "y": 13.8818
2275
+ }
2276
+ }
2277
+ ],
2278
+ "wires": [
2279
+ {
2280
+ "from": "268b297a-905c-42fe-a8b0-66eccdf029c3",
2281
+ "output": 0,
2282
+ "to": "3815edc6-e352-45c7-956a-5e438c1d7f15",
2283
+ "input": 0
2284
+ },
2285
+ {
2286
+ "from": "ac187b91-ccf4-4b5c-8357-bb8886a925d7",
2287
+ "output": 0,
2288
+ "to": "520fa409-09a3-43ef-a2a9-367ce9eb96d3",
2289
+ "input": 0
2290
+ },
2291
+ {
2292
+ "from": "2b6c6f3c-6719-4709-930e-b0c965e3878d",
2293
+ "output": 0,
2294
+ "to": "0c90ac8e-21f1-45b9-b30d-b46aed6150ad",
2295
+ "input": 0
2296
+ },
2297
+ {
2298
+ "from": "268b297a-905c-42fe-a8b0-66eccdf029c3",
2299
+ "output": 0,
2300
+ "to": "94de823f-2b89-4145-86be-799c1e1e10e7",
2301
+ "input": 0
2302
+ },
2303
+ {
2304
+ "from": "ac187b91-ccf4-4b5c-8357-bb8886a925d7",
2305
+ "output": 0,
2306
+ "to": "5c4db8ce-77d0-468d-aa84-9cfc68d3278a",
2307
+ "input": 0
2308
+ },
2309
+ {
2310
+ "from": "e238c742-9278-4339-8974-465cb067796c",
2311
+ "output": 0,
2312
+ "to": "ac187b91-ccf4-4b5c-8357-bb8886a925d7",
2313
+ "input": 0
2314
+ },
2315
+ {
2316
+ "from": "ac187b91-ccf4-4b5c-8357-bb8886a925d7",
2317
+ "output": 0,
2318
+ "to": "268b297a-905c-42fe-a8b0-66eccdf029c3",
2319
+ "input": 0
2320
+ },
2321
+ {
2322
+ "from": "ac187b91-ccf4-4b5c-8357-bb8886a925d7",
2323
+ "output": 0,
2324
+ "to": "2b6c6f3c-6719-4709-930e-b0c965e3878d",
2325
+ "input": 0
2326
+ },
2327
+ {
2328
+ "from": "0b302ed0-b90e-4339-92bd-9f9d32f15f4a",
2329
+ "output": 0,
2330
+ "to": "2b6c6f3c-6719-4709-930e-b0c965e3878d",
2331
+ "input": 1
2332
+ }
2333
+ ]
2334
+ }
2335
+ },
2336
+ {
2337
+ "type": "Text",
2338
+ "id": "fe311cd5-1b7a-4916-8226-5f3bc25966ac",
2339
+ "position": {
2340
+ "x": -117.23465,
2341
+ "y": 66.3215
2342
+ },
2343
+ "exposedPosition": {
2344
+ "x": -220,
2345
+ "y": -70
2346
+ },
2347
+ "text": "x",
2348
+ "width": 256
2349
+ },
2350
+ {
2351
+ "type": "Light",
2352
+ "id": "6f280804-847b-4b5a-9723-687dc232128b",
2353
+ "position": {
2354
+ "x": -212.29056,
2355
+ "y": 44.83344
2356
+ },
2357
+ "exposedPosition": {
2358
+ "x": -225,
2359
+ "y": -70
2360
+ }
2361
+ },
2362
+ {
2363
+ "type": "Text",
2364
+ "id": "f813f80d-895d-4fc5-bcbd-87aa5a341f8f",
2365
+ "position": {
2366
+ "x": -118.78494,
2367
+ "y": 108.95134
2368
+ },
2369
+ "exposedPosition": {
2370
+ "x": -220,
2371
+ "y": -80
2372
+ },
2373
+ "text": ">",
2374
+ "width": 256
2375
+ },
2376
+ {
2377
+ "type": "Light",
2378
+ "id": "319e1249-b7a5-4575-8c4c-dd6e0c0ac3c4",
2379
+ "position": {
2380
+ "x": -213.33621,
2381
+ "y": 87.89703
2382
+ },
2383
+ "exposedPosition": {
2384
+ "x": -225,
2385
+ "y": -80
2386
+ }
2387
+ },
2388
+ {
2389
+ "type": "Text",
2390
+ "id": "414ffe82-7b7f-40b0-8fe6-cb3f32412e76",
2391
+ "position": {
2392
+ "x": -1110.75024,
2393
+ "y": 505.59717
2394
+ },
2395
+ "text": "Step 1",
2396
+ "width": 256
2397
+ },
2398
+ {
2399
+ "type": "Text",
2400
+ "id": "2d7829ff-eeb4-4d99-8099-acc95a722433",
2401
+ "position": {
2402
+ "x": -842.47223,
2403
+ "y": 510.3024
2404
+ },
2405
+ "text": "Step 2",
2406
+ "width": 256
2407
+ },
2408
+ {
2409
+ "type": "Text",
2410
+ "id": "396b77bf-82d0-4ed7-9577-178206be2f87",
2411
+ "position": {
2412
+ "x": -567.96539,
2413
+ "y": 513.18884
2414
+ },
2415
+ "text": "Step 3",
2416
+ "width": 256
2417
+ },
2418
+ {
2419
+ "type": "Text",
2420
+ "id": "b7eed6c3-514c-4e8b-88d4-4628cb11f0ae",
2421
+ "position": {
2422
+ "x": -282.17966,
2423
+ "y": 514.21112
2424
+ },
2425
+ "text": "Step 4",
2426
+ "width": 256
2427
+ },
2428
+ {
2429
+ "type": "Patch",
2430
+ "id": "1501e3c7-f069-405a-97b1-d2eb0e250bc4",
2431
+ "position": {
2432
+ "x": -516.61938,
2433
+ "y": 193.78889
2434
+ },
2435
+ "subPatch": {
2436
+ "id": "7c614633-2e50-40ed-9491-61d1383e2e8e",
2437
+ "pan": {
2438
+ "x": -104.33646,
2439
+ "y": -147.93251
2440
+ },
2441
+ "zoom": 1.56185,
2442
+ "nodes": [
2443
+ {
2444
+ "type": "Expr",
2445
+ "id": "d656e4cc-32c4-45fc-8f4b-d6e107350762",
2446
+ "position": {
2447
+ "x": 46.466,
2448
+ "y": -89.00117
2449
+ },
2450
+ "expr": "A>=B"
2451
+ },
2452
+ {
2453
+ "type": "Input",
2454
+ "id": "b370ac6b-607a-4d19-9235-bdb74af5a585",
2455
+ "position": {
2456
+ "x": -65.52438,
2457
+ "y": -12.23868
2458
+ },
2459
+ "name": "",
2460
+ "exposedPosition": {
2461
+ "x": -40,
2462
+ "y": -55
2463
+ }
2464
+ },
2465
+ {
2466
+ "type": "Output",
2467
+ "id": "f1b48ef8-5054-44cb-855d-d4e723ba3d2a",
2468
+ "position": {
2469
+ "x": 186.59073,
2470
+ "y": -93.63498
2471
+ },
2472
+ "name": "",
2473
+ "exposedPosition": {
2474
+ "x": -20,
2475
+ "y": -45
2476
+ }
2477
+ },
2478
+ {
2479
+ "type": "Light",
2480
+ "id": "fe451c37-dc62-4d0b-9277-030a31fa8093",
2481
+ "position": {
2482
+ "x": 189.93141,
2483
+ "y": -49.80119
2484
+ },
2485
+ "exposedPosition": {
2486
+ "x": -20,
2487
+ "y": -45
2488
+ }
2489
+ },
2490
+ {
2491
+ "type": "Text",
2492
+ "id": "b5b48c50-c2c3-467a-9c25-55d1a3ef86e9",
2493
+ "position": {
2494
+ "x": 289.67667,
2495
+ "y": -71.31857
2496
+ },
2497
+ "exposedPosition": {
2498
+ "x": -25,
2499
+ "y": -45
2500
+ },
2501
+ "text": "g",
2502
+ "width": 256
2503
+ },
2504
+ {
2505
+ "type": "Text",
2506
+ "id": "0d2472d6-4c98-47c2-9205-7779789b3796",
2507
+ "position": {
2508
+ "x": 95.65881,
2509
+ "y": 443.15259
2510
+ },
2511
+ "exposedPosition": {
2512
+ "x": -40,
2513
+ "y": -15
2514
+ },
2515
+ "text": ">=g",
2516
+ "width": 256
2517
+ },
2518
+ {
2519
+ "type": "Input",
2520
+ "id": "b5276e34-79a0-4e05-8ba6-6ecc92e6e1d2",
2521
+ "position": {
2522
+ "x": -66.3927,
2523
+ "y": -163.24899
2524
+ },
2525
+ "name": "",
2526
+ "exposedPosition": {
2527
+ "x": -40,
2528
+ "y": -35
2529
+ }
2530
+ },
2531
+ {
2532
+ "type": "RGBLight",
2533
+ "id": "45c51aea-efa3-4a9d-b8eb-a94d539ac26e",
2534
+ "position": {
2535
+ "x": -63.8792,
2536
+ "y": -116.82565
2537
+ },
2538
+ "exposedPosition": {
2539
+ "x": -40,
2540
+ "y": -35
2541
+ }
2542
+ },
2543
+ {
2544
+ "type": "Text",
2545
+ "id": "0647d206-0826-4c53-b38d-1f736cb8d846",
2546
+ "position": {
2547
+ "x": -86.79595,
2548
+ "y": -142.85893
2549
+ },
2550
+ "exposedPosition": {
2551
+ "x": -45,
2552
+ "y": -35
2553
+ },
2554
+ "text": "A",
2555
+ "width": 256
2556
+ },
2557
+ {
2558
+ "type": "RGBLight",
2559
+ "id": "016c0057-a7d2-4206-8da7-1061e0ae0989",
2560
+ "position": {
2561
+ "x": -64.9085,
2562
+ "y": 32.90471
2563
+ },
2564
+ "exposedPosition": {
2565
+ "x": -40,
2566
+ "y": -55
2567
+ }
2568
+ },
2569
+ {
2570
+ "type": "Text",
2571
+ "id": "26ac8d6c-1594-44a6-bba9-833f5e4ebcb9",
2572
+ "position": {
2573
+ "x": -83.56738,
2574
+ "y": 10.64859
2575
+ },
2576
+ "exposedPosition": {
2577
+ "x": -45,
2578
+ "y": -55
2579
+ },
2580
+ "text": "B",
2581
+ "width": 256
2582
+ },
2583
+ {
2584
+ "type": "Text",
2585
+ "id": "1b1465dd-e418-4791-b170-6e6f4e4aba37",
2586
+ "position": {
2587
+ "x": 5.18266,
2588
+ "y": 231.13565
2589
+ },
2590
+ "text": "This expression module compares its two inputs with the logic expression \">=.\" The semantic equivalent of this expression is \"If signal A is greater than or equal to signal B, output a 1; otherwise, output a 0.\"",
2591
+ "width": 256
2592
+ },
2593
+ {
2594
+ "type": "Text",
2595
+ "id": "30479154-5687-4ffa-b2e5-c4f8d8b0bf01",
2596
+ "position": {
2597
+ "x": 36.1156,
2598
+ "y": 266.97015
2599
+ },
2600
+ "text": "How does this Module work?",
2601
+ "width": 256
2602
+ },
2603
+ {
2604
+ "type": "Text",
2605
+ "id": "fc832802-3589-45cc-a673-bb33b1b0ece7",
2606
+ "position": {
2607
+ "x": 59.768,
2608
+ "y": 397.13251
2609
+ },
2610
+ "text": "What is this Module?",
2611
+ "width": 256
2612
+ },
2613
+ {
2614
+ "type": "Text",
2615
+ "id": "0c7531fb-543b-47dd-9c73-0e7eea10b629",
2616
+ "position": {
2617
+ "x": -0.27497,
2618
+ "y": 357.9964
2619
+ },
2620
+ "text": "The >=g module (read as \"Greater than or equal to gate\") is a type of comparator that outputs a 1 when signal A is greater than or equal to B. It is useful for creating threshold triggers.",
2621
+ "width": 256
2622
+ }
2623
+ ],
2624
+ "wires": [
2625
+ {
2626
+ "from": "b5276e34-79a0-4e05-8ba6-6ecc92e6e1d2",
2627
+ "output": 0,
2628
+ "to": "d656e4cc-32c4-45fc-8f4b-d6e107350762",
2629
+ "input": 0
2630
+ },
2631
+ {
2632
+ "from": "b370ac6b-607a-4d19-9235-bdb74af5a585",
2633
+ "output": 0,
2634
+ "to": "d656e4cc-32c4-45fc-8f4b-d6e107350762",
2635
+ "input": 1
2636
+ },
2637
+ {
2638
+ "from": "d656e4cc-32c4-45fc-8f4b-d6e107350762",
2639
+ "output": 0,
2640
+ "to": "f1b48ef8-5054-44cb-855d-d4e723ba3d2a",
2641
+ "input": 0
2642
+ },
2643
+ {
2644
+ "from": "d656e4cc-32c4-45fc-8f4b-d6e107350762",
2645
+ "output": 0,
2646
+ "to": "fe451c37-dc62-4d0b-9277-030a31fa8093",
2647
+ "input": 0
2648
+ },
2649
+ {
2650
+ "from": "b5276e34-79a0-4e05-8ba6-6ecc92e6e1d2",
2651
+ "output": 0,
2652
+ "to": "45c51aea-efa3-4a9d-b8eb-a94d539ac26e",
2653
+ "input": 0
2654
+ },
2655
+ {
2656
+ "from": "b370ac6b-607a-4d19-9235-bdb74af5a585",
2657
+ "output": 0,
2658
+ "to": "016c0057-a7d2-4206-8da7-1061e0ae0989",
2659
+ "input": 0
2660
+ }
2661
+ ]
2662
+ }
2663
+ },
2664
+ {
2665
+ "type": "Text",
2666
+ "id": "eaa53d89-858d-4cee-ae65-77c54ecb1a45",
2667
+ "position": {
2668
+ "x": -1199.86206,
2669
+ "y": 464.52179
2670
+ },
2671
+ "text": "The Knob Mod brick takes the 0-1 k (knob) signal and translates it to a 0-100 # (number) signal. This 0-100 range also has an exponential curve applied to it, which means that when the Hz knob is set to .5, the # output is 10, not 50. This allows you to more accurately dial in slow clock tempos for the first half of the knob's turn while providing a large Hz range in the second half of the knob's turn. When the Hz knob is turned all the way down, the Hz input is activated. A g signal lights a Light node to indicate that the Hz input is active. This is so you can sync the module to other modules or directly enter a precise number. The Hz output sends the Hz # signal so that other modules can be synced to this one.",
2672
+ "width": 256
2673
+ },
2674
+ {
2675
+ "type": "Text",
2676
+ "id": "dcb9b4c6-490a-4279-b7aa-69d4c8bf4dd5",
2677
+ "position": {
2678
+ "x": -925.39813,
2679
+ "y": 464.47729
2680
+ },
2681
+ "text": "This brick outputs a 0-1 saw wave. The # input is the Hz (Frequency) value of the oscillator. The g (gate) input resets the wave whenever it goes high (changes from 0 to 1). This allows you to sync clocks of different speeds together.",
2682
+ "width": 256
2683
+ },
2684
+ {
2685
+ "type": "Text",
2686
+ "id": "6b34e8ec-845e-45d4-9b7f-31e2f10609a5",
2687
+ "position": {
2688
+ "x": -646.10089,
2689
+ "y": 463.37112
2690
+ },
2691
+ "text": "This brick compares the values of A and B. When the A signal is greater than or equal to B, the g signal goes high. The WM (width modulation) knob changes the A value, which determines the ratio of on/off time of the g signal. When the knob is set to .5, the g signal is high 50% of the time and low 50% of the time. When the knob is set to .25, the signal is high 25% of the time and low 75% of the time.",
2692
+ "width": 256
2693
+ },
2694
+ {
2695
+ "type": "Text",
2696
+ "id": "494ac339-8621-4d54-80d0-aba613fe6e64",
2697
+ "position": {
2698
+ "x": -363.41238,
2699
+ "y": 460.59384
2700
+ },
2701
+ "text": "The On/Off brick passes the > (throughput) signal if the k signal is greater than .5. If the k signal is less than or equal to .5, the > signal is turned off.",
2702
+ "width": 256
2703
+ },
2704
+ {
2705
+ "type": "Text",
2706
+ "id": "95cbdab7-29f3-4c0c-bbc6-3d2a26221048",
2707
+ "position": {
2708
+ "x": -718.00787,
2709
+ "y": 751.37012
2710
+ },
2711
+ "text": "What is this module?",
2712
+ "width": 256
2713
+ },
2714
+ {
2715
+ "type": "Text",
2716
+ "id": "ca7ebbc3-8222-4f1b-a9ba-cc35c143a173",
2717
+ "position": {
2718
+ "x": -779.38373,
2719
+ "y": 708.94739
2720
+ },
2721
+ "text": "Clocks are the time-keepers or conductors of a modular patch. They are often used to advance sequencer steps or trigger notes. This clock outputs a g (gate) signal, which alternates between low (0) and high (1). Most modules respond to the rising edge of the gate signal, which is the moment the gate changes from low to high. Some modules, like envelopes, also respond to the falling edge, when the gate drops from high to low.",
2722
+ "width": 256
2723
+ },
2724
+ {
2725
+ "type": "Text",
2726
+ "id": "f1200335-324d-4045-b166-cf634e3b675a",
2727
+ "position": {
2728
+ "x": -736.57355,
2729
+ "y": 564.49341
2730
+ },
2731
+ "text": "How does this module work?",
2732
+ "width": 256
2733
+ }
2734
+ ],
2735
+ "wires": [
2736
+ {
2737
+ "from": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2738
+ "output": 2,
2739
+ "to": "235b9fbc-cb2c-4107-b29f-447446485759",
2740
+ "input": 0
2741
+ },
2742
+ {
2743
+ "from": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2744
+ "output": 2,
2745
+ "to": "4cfc614e-f0f8-4095-832a-91782b0f4deb",
2746
+ "input": 0
2747
+ },
2748
+ {
2749
+ "from": "b9f02279-7744-49ba-a829-98b06ee72171",
2750
+ "output": 1,
2751
+ "to": "d573b08e-39c1-4ca9-8f59-8b635fb4d19b",
2752
+ "input": 0
2753
+ },
2754
+ {
2755
+ "from": "8212f90f-8b34-483d-92e0-a10425c1e1a6",
2756
+ "output": 0,
2757
+ "to": "b9f02279-7744-49ba-a829-98b06ee72171",
2758
+ "input": 0
2759
+ },
2760
+ {
2761
+ "from": "ba85db03-55ac-4a07-b554-ab47f14b6d06",
2762
+ "output": 0,
2763
+ "to": "b9f02279-7744-49ba-a829-98b06ee72171",
2764
+ "input": 1
2765
+ },
2766
+ {
2767
+ "from": "8893251e-d87c-4dca-9654-afa4e4af335e",
2768
+ "output": 0,
2769
+ "to": "b9f02279-7744-49ba-a829-98b06ee72171",
2770
+ "input": 2
2771
+ },
2772
+ {
2773
+ "from": "b9f02279-7744-49ba-a829-98b06ee72171",
2774
+ "output": 0,
2775
+ "to": "ffec14b7-5b57-482d-9bf3-c86375271fab",
2776
+ "input": 0
2777
+ },
2778
+ {
2779
+ "from": "2f0c18b5-082a-406b-a445-574e154dd6d3",
2780
+ "output": 0,
2781
+ "to": "da311857-375b-463b-a247-ccfc4f409a1f",
2782
+ "input": 0
2783
+ },
2784
+ {
2785
+ "from": "b9f02279-7744-49ba-a829-98b06ee72171",
2786
+ "output": 1,
2787
+ "to": "da311857-375b-463b-a247-ccfc4f409a1f",
2788
+ "input": 1
2789
+ },
2790
+ {
2791
+ "from": "2f0c18b5-082a-406b-a445-574e154dd6d3",
2792
+ "output": 0,
2793
+ "to": "81cc2b23-b6a5-413d-9e9a-fcdc0c924033",
2794
+ "input": 0
2795
+ },
2796
+ {
2797
+ "from": "53a924cc-72e3-4b89-a9c4-c567241c1ac6",
2798
+ "output": 0,
2799
+ "to": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2800
+ "input": 0
2801
+ },
2802
+ {
2803
+ "from": "1501e3c7-f069-405a-97b1-d2eb0e250bc4",
2804
+ "output": 0,
2805
+ "to": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2806
+ "input": 1
2807
+ },
2808
+ {
2809
+ "from": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2810
+ "output": 1,
2811
+ "to": "6f280804-847b-4b5a-9723-687dc232128b",
2812
+ "input": 0
2813
+ },
2814
+ {
2815
+ "from": "147fb47c-8c2d-4c6e-bcf8-e7de11460f71",
2816
+ "output": 0,
2817
+ "to": "319e1249-b7a5-4575-8c4c-dd6e0c0ac3c4",
2818
+ "input": 0
2819
+ },
2820
+ {
2821
+ "from": "da311857-375b-463b-a247-ccfc4f409a1f",
2822
+ "output": 0,
2823
+ "to": "1501e3c7-f069-405a-97b1-d2eb0e250bc4",
2824
+ "input": 0
2825
+ },
2826
+ {
2827
+ "from": "50c9ab77-65d6-48c6-8bfb-f4bc0fc3a98d",
2828
+ "output": 0,
2829
+ "to": "1501e3c7-f069-405a-97b1-d2eb0e250bc4",
2830
+ "input": 1
2831
+ }
2832
+ ]
2833
+ }
2834
+ }