at.atmosynth.module
Schema Diff
+3 -2
Compatibility Analysis
Backward Compatible
No changes detected.
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"automation": {
5
5
"description": "A breakpoint envelope scheduled onto an AudioParam. Breakpoints up to and including sustainAt are scheduled on note-on; those after it on note-off.",
6
6
"properties": {
7
7
"breakpoints": {
8
8
"items": {
9
9
"ref": "#breakpoint",
10
10
"type": "ref"
11
11
},
12
12
"minLength": 1,
13
13
"type": "array"
14
14
},
15
15
"id": {
16
16
"maxLength": 64,
17
17
"minLength": 1,
18
18
"type": "string"
19
19
},
20
20
"label": {
21
21
"maxLength": 200,
22
22
"type": "string"
23
23
},
24
24
"sustainAt": {
25
25
"description": "Index into breakpoints where the value holds while a note is held. Absent means a one-shot.",
26
26
"minimum": 0,
27
27
"type": "integer"
28
28
},
29
29
"target": {
30
30
"ref": "#paramTarget",
31
31
"type": "ref"
32
32
}
33
33
},
34
34
"required": [
35
35
"id",
36
36
"target",
37
37
"breakpoints"
38
38
],
39
39
"type": "object"
40
40
},
41
41
"breakpoint": {
42
42
"properties": {
43
43
"curve": {
44
44
"description": "How the value travels from the previous breakpoint.",
45
45
"knownValues": [
46
46
"step",
47
47
"linear",
48
48
"exponential"
49
49
],
50
50
"type": "string"
51
51
},
52
52
"time": {
53
53
"description": "Milliseconds from the trigger.",
54
54
"minimum": 0,
55
55
"type": "integer"
56
56
},
57
57
"value": {
58
58
"description": "The param's value at this instant, as its decimal form — \"0.25\", \"1\" — because the ATproto data model has no floating-point type and a PDS refuses one. An automation is numeric by definition, so a reader turns it back into a number without asking anything else.",
59
59
"maxLength": 200,
60
60
"type": "string"
61
61
}
62
62
},
63
63
"required": [
64
64
"time",
65
65
"value"
66
66
],
67
67
"type": "object"
68
68
},
69
69
"connection": {
70
70
"description": "An audio connection from a node output to either an audio input or a named AudioParam.",
71
71
"properties": {
72
72
"from": {
73
73
"ref": "#source",
74
74
"type": "ref"
75
75
},
76
76
"to": {
77
77
"ref": "#target",
78
78
"type": "ref"
79
79
}
80
80
},
81
81
"required": [
82
82
"from",
83
83
"to"
84
84
],
85
85
"type": "object"
86
86
},
87
87
"lineage": {
88
88
"description": "The module this one was forked from, and its author.",
89
89
"properties": {
90
90
"authorDid": {
91
91
"format": "did",
92
92
"type": "string"
93
93
},
94
94
"moduleId": {
95
95
"maxLength": 128,
96
96
"type": "string"
97
97
},
98
98
"uri": {
99
99
"format": "at-uri",
100
100
"type": "string"
101
101
}
102
102
},
103
103
"required": [
104
104
"uri",
105
105
"authorDid"
106
106
],
107
107
"type": "object"
108
108
},
109
109
"main": {
110
110
"description": "A module, held in its author's own repository.",
111
111
"key": "tid",
112
112
"record": {
113
113
"properties": {
114
114
"audioInputs": {
115
115
"description": "Zero or more individually identified audio inputs.",
116
116
"items": {
117
117
"ref": "#port",
118
118
"type": "ref"
119
119
},
120
120
"type": "array"
121
121
},
122
122
"audioOutputs": {
123
123
"items": {
124
124
"ref": "#port",
125
125
"type": "ref"
126
126
},
127
127
"type": "array"
128
128
},
129
129
"automation": {
130
130
"description": "Scheduled AudioParam envelopes. Web Audio has no envelope node, so these are their own structure.",
131
131
"items": {
132
132
"ref": "#automation",
133
133
"type": "ref"
134
134
},
135
135
"type": "array"
136
136
},
137
137
"connections": {
138
138
"items": {
139
139
"ref": "#connection",
140
140
"type": "ref"
141
141
},
142
142
"type": "array"
143
143
},
144
144
"createdAt": {
145
145
"format": "datetime",
146
146
"type": "string"
147
147
},
148
148
"description": {
149
149
"maxLength": 3000,
150
150
"type": "string"
151
151
},
152
152
"descriptionVersion": {
153
153
"description": "Version of the module description this record follows. A reader accepts any version at or below its own.",
154
154
"minimum": 1,
155
155
"type": "integer"
156
156
},
157
157
"forkedFrom": {
158
158
"ref": "#lineage",
159
159
"type": "ref"
160
160
},
161
161
"midiInputs": {
162
+
"description": "Zero or more note inputs. A note input carries note events — what is played, and when — from any note source: a sequencer's note output, or the player, which is the on-screen keys, the computer keyboard and every MIDI device at once. \"MIDI\" is the historical name; nothing arriving here need have come from MIDI.",
162
163
"items": {
163
164
"ref": "#port",
164
165
"type": "ref"
165
166
},
166
167
"type": "array"
167
168
},
168
169
"moduleId": {
169
170
"description": "Stable identity shared by every published version of this module.",
170
171
"maxLength": 128,
171
172
"type": "string"
172
173
},
173
174
"name": {
174
175
"maxLength": 200,
175
176
"minLength": 1,
176
177
"type": "string"
177
178
},
178
179
"nodes": {
179
180
"items": {
180
181
"ref": "#node",
181
182
"type": "ref"
182
183
},
183
184
"type": "array"
184
185
},
185
186
"noteOutputs": {
186
-
"description": "Zero or more note outputs. A note output carries note events — what is played, and when — rather than a signal, so it is wired to another instance's MIDI input rather than to an audio input. A module that declares one is a source of what is played; a module that declares none is what plays it.",
187
+
"description": "Zero or more note outputs. A note output carries note events — what is played, and when — rather than a signal, so it is wired to another instance's note input (`midiInputs`) rather than to an audio input. A module that declares one is a source of what is played; a module that declares none is what plays it.",
187
188
"items": {
188
189
"ref": "#port",
189
190
"type": "ref"
190
191
},
191
192
"type": "array"
192
193
},
193
194
"noteSource": {
194
195
"description": "What this module emits notes by, where it is not made of Web Audio nodes at all. A note source has no `nodes` and no `connections`: it produces note events, and the behaviour that produces them is named here rather than described, because there is no vocabulary of nodes for a thing that makes no sound. A reader that does not know the named behaviour cannot run the module, and says so rather than guessing.",
195
196
"knownValues": [
196
197
"keyboard",
197
198
"sequencer"
198
199
],
199
200
"maxLength": 64,
200
201
"type": "string"
201
202
},
202
203
"parameters": {
203
204
"items": {
204
205
"ref": "#parameter",
205
206
"type": "ref"
206
207
},
207
208
"type": "array"
208
209
},
209
210
"sampleSlots": {
210
211
"items": {
211
212
"ref": "#sampleSlot",
212
213
"type": "ref"
213
214
},
214
215
"type": "array"
215
216
},
216
217
"versionKey": {
217
-
"description": "This record's own key within the series. Informational; the record key is authoritative.",
218
+
"description": "The record key this version is published under, repeated in the record so a reader holding only the record knows which version it is. A patch's `moduleRef.versionKey` is this value, and it is the record key a reader fetches: a record whose `versionKey` differs from its own key is pinned by the key and misdescribed by this field.",
218
219
"maxLength": 128,
219
220
"type": "string"
220
221
}
221
222
},
222
223
"required": [
223
224
"descriptionVersion",
224
225
"moduleId",
225
226
"name",
226
227
"description",
227
228
"audioInputs",
228
229
"audioOutputs",
229
230
"midiInputs",
230
231
"nodes",
231
232
"connections",
232
233
"createdAt"
233
234
],
234
235
"type": "object"
235
236
},
236
237
"type": "record"
237
238
},
238
239
"node": {
239
240
"description": "One Web Audio node. `kind` is drawn from a closed vocabulary; `options` are its construction-time settings, which are not AudioParams and cannot be modulated.",
240
241
"properties": {
241
242
"id": {
242
243
"maxLength": 64,
243
244
"minLength": 1,
244
245
"type": "string"
245
246
},
246
247
"kind": {
247
248
"maxLength": 64,
248
249
"minLength": 1,
249
250
"type": "string"
250
251
},
251
252
"options": {
252
253
"description": "The node's settings, as its kind defines them. This is an object — which is the whole of what `unknown` means here — so the data model applies inside it: a whole number is an ordinary integer, and a number that is not a whole number is carried as its decimal string, \"0.5\" rather than 0.5, because the ATproto data model has no floating-point type and a PDS refuses one. That is the one difference from the fields this description types as strings, which have nowhere to put an integer.",
253
254
"type": "unknown"
254
255
}
255
256
},
256
257
"required": [
257
258
"id",
258
259
"kind"
259
260
],
260
261
"type": "object"
261
262
},
262
263
"paramTarget": {
263
264
"properties": {
264
265
"node": {
265
266
"maxLength": 64,
266
267
"minLength": 1,
267
268
"type": "string"
268
269
},
269
270
"param": {
270
271
"maxLength": 64,
271
272
"minLength": 1,
272
273
"type": "string"
273
274
}
274
275
},
275
276
"required": [
276
277
"node",
277
278
"param"
278
279
],
279
280
"type": "object"
280
281
},
281
282
"parameter": {
282
283
"description": "A parameter the module exposes for a patch to set. Each target reaches an AudioParam, a construction option, or one field of an automation breakpoint.",
283
284
"properties": {
284
285
"default": {
285
286
"description": "The value used where a patch sets none, always as text. A number is its decimal form — \"0.5\", and \"2\" for a whole one — because the ATproto data model has no floating-point type and a string is the only type that carries both a number and a word. Where this parameter declares a closed value set, it is one of those strings instead, and a label that looks like a number stays the label it is.",
286
287
"maxLength": 200,
287
288
"type": "string"
288
289
},
289
290
"id": {
290
291
"maxLength": 64,
291
292
"minLength": 1,
292
293
"type": "string"
293
294
},
294
295
"label": {
295
296
"maxLength": 200,
296
297
"minLength": 1,
297
298
"type": "string"
298
299
},
299
300
"range": {
300
301
"ref": "#range",
301
302
"type": "ref"
302
303
},
303
304
"targets": {
304
305
"items": {
305
306
"ref": "#parameterTarget",
306
307
"type": "ref"
307
308
},
308
309
"minLength": 1,
309
310
"type": "array"
310
311
},
311
312
"values": {
312
313
"description": "A closed value set, where the parameter is not numeric.",
313
314
"items": {
314
315
"maxLength": 200,
315
316
"type": "string"
316
317
},
317
318
"type": "array"
318
319
}
319
320
},
320
321
"required": [
321
322
"id",
322
323
"label",
323
324
"targets"
324
325
],
325
326
"type": "object"
326
327
},
327
328
"parameterTarget": {
328
329
"description": "One of: {node, param}, {node, option}, or {automation, breakpoint, field}.",
329
330
"properties": {
330
331
"automation": {
331
332
"maxLength": 64,
332
333
"type": "string"
333
334
},
334
335
"breakpoint": {
335
336
"minimum": 0,
336
337
"type": "integer"
337
338
},
338
339
"field": {
339
340
"knownValues": [
340
341
"time",
341
342
"value"
342
343
],
343
344
"type": "string"
344
345
},
345
346
"node": {
346
347
"maxLength": 64,
347
348
"type": "string"
348
349
},
349
350
"option": {
350
351
"maxLength": 64,
351
352
"type": "string"
352
353
},
353
354
"param": {
354
355
"maxLength": 64,
355
356
"type": "string"
356
357
}
357
358
},
358
359
"type": "object"
359
360
},
360
361
"port": {
361
362
"description": "One individually identified audio or MIDI boundary of the module.",
362
363
"properties": {
363
364
"id": {
364
365
"maxLength": 64,
365
366
"minLength": 1,
366
367
"type": "string"
367
368
},
368
369
"label": {
369
370
"maxLength": 200,
370
371
"type": "string"
371
372
}
372
373
},
373
374
"required": [
374
375
"id"
375
376
],
376
377
"type": "object"
377
378
},
378
379
"range": {
379
380
"properties": {
380
381
"max": {
381
382
"description": "The high bound, as its decimal form — \"20000\", \"0.5\" — because the ATproto data model has no floating-point type and a PDS refuses one. A range is numeric by definition, so a reader turns it back into a number without asking anything else.",
382
383
"maxLength": 200,
383
384
"type": "string"
384
385
},
385
386
"min": {
386
387
"description": "The low bound, as its decimal form — \"0.0001\", \"-1\" — because the ATproto data model has no floating-point type and a PDS refuses one. A range is numeric by definition, so a reader turns it back into a number without asking anything else.",
387
388
"maxLength": 200,
388
389
"type": "string"
389
390
}
390
391
},
391
392
"required": [
392
393
"min",
393
394
"max"
394
395
],
395
396
"type": "object"
396
397
},
397
398
"sampleRef": {
398
399
"description": "A sample blob and the account that holds it.",
399
400
"properties": {
400
401
"blob": {
401
402
"accept": [
402
403
"audio/wav"
403
404
],
404
405
"maxSize": 2097152,
405
406
"type": "blob"
406
407
},
407
408
"ownerDid": {
408
409
"format": "did",
409
410
"type": "string"
410
411
}
411
412
},
412
413
"required": [
413
414
"blob",
414
415
"ownerDid"
415
416
],
416
417
"type": "object"
417
418
},
418
419
"sampleSlot": {
419
420
"description": "A named slot a patch instance may fill with its own sample. `node` names a node in this graph and `property` the thing the sample feeds.",
420
421
"properties": {
421
422
"default": {
422
423
"ref": "#sampleRef",
423
424
"type": "ref"
424
425
},
425
426
"id": {
426
427
"maxLength": 64,
427
428
"minLength": 1,
428
429
"type": "string"
429
430
},
430
431
"label": {
431
432
"maxLength": 200,
432
433
"type": "string"
433
434
},
434
435
"node": {
435
436
"maxLength": 64,
436
437
"minLength": 1,
437
438
"type": "string"
438
439
},
439
440
"property": {
440
441
"knownValues": [
441
442
"buffer"
442
443
],
443
444
"type": "string"
444
445
}
445
446
},
446
447
"required": [
447
448
"id",
448
449
"node",
449
450
"property"
450
451
],
451
452
"type": "object"
452
453
},
453
454
"source": {
454
455
"properties": {
455
456
"node": {
456
457
"maxLength": 64,
457
458
"minLength": 1,
458
459
"type": "string"
459
460
},
460
461
"output": {
461
462
"minimum": 0,
462
463
"type": "integer"
463
464
}
464
465
},
465
466
"required": [
466
467
"node"
467
468
],
468
469
"type": "object"
469
470
},
470
471
"target": {
471
472
"description": "Exactly one of `input` or `param` is present. `param` is modulation: a node output reaching a named AudioParam.",
472
473
"properties": {
473
474
"input": {
474
475
"minimum": 0,
475
476
"type": "integer"
476
477
},
477
478
"node": {
478
479
"maxLength": 64,
479
480
"minLength": 1,
480
481
"type": "string"
481
482
},
482
483
"param": {
483
484
"maxLength": 64,
484
485
"type": "string"
485
486
}
486
487
},
487
488
"required": [
488
489
"node"
489
490
],
490
491
"type": "object"
491
492
}
492
493
},
493
494
"description": "A reusable synth module: Web Audio nodes wired together, with declared audio and MIDI boundaries, exposed parameters, automation and sample slots. Each published version is its own record; records sharing a moduleId form a series.",
494
495
"id": "at.atmosynth.module",
495
496
"lexicon": 1
496
497
}