at.atmosynth.module
Schema Diff
+17 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 7 non-breaking changes.
Non-Breaking Changes (7)
- AddedVertex AddedVertex { vertex_id: "at.atmosynth.module:body.noteOutputs" }
- AddedVertex AddedVertex { vertex_id: "at.atmosynth.module:body.noteOutputs:items" }
- AddedVertex AddedVertex { vertex_id: "at.atmosynth.module:body.noteSource" }
- AddedEdge AddedEdge { src: "at.atmosynth.module:body", tgt: "at.atmosynth.module:body.noteOutputs", kind: "prop", name: Some("noteOutputs") }
- AddedEdge AddedEdge { src: "at.atmosynth.module:body", tgt: "at.atmosynth.module:body.noteSource", kind: "prop", name: Some("noteSource") }
- AddedEdge AddedEdge { src: "at.atmosynth.module:body.noteOutputs", tgt: "at.atmosynth.module:body.noteOutputs:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "at.atmosynth.module:body.noteOutputs:items", tgt: "at.atmosynth.module#port", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "at.atmosynth.module:body.noteOutputs" }AddedVertex { vertex_id: "at.atmosynth.module:body.noteOutputs:items" }AddedVertex { vertex_id: "at.atmosynth.module:body.noteSource" }
Additional Notes
- Non-breaking: AddedEdge { src: "at.atmosynth.module:body", tgt: "at.atmosynth.module:body.noteOutputs", kind: "prop", name: Some("noteOutputs") }
- Non-breaking: AddedEdge { src: "at.atmosynth.module:body", tgt: "at.atmosynth.module:body.noteSource", kind: "prop", name: Some("noteSource") }
- Non-breaking: AddedEdge { src: "at.atmosynth.module:body.noteOutputs", tgt: "at.atmosynth.module:body.noteOutputs:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "at.atmosynth.module:body.noteOutputs:items", tgt: "at.atmosynth.module#port", kind: "ref", name: None }
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. A number that is not a whole number is carried as its decimal string — \"0.5\", not 0.5 — because the ATproto data model has no floating-point type and a PDS refuses one. A whole number is an ordinary integer, and a reader turns such a string back into a number.",
59
59
"type": "unknown"
60
60
}
61
61
},
62
62
"required": [
63
63
"time",
64
64
"value"
65
65
],
66
66
"type": "object"
67
67
},
68
68
"connection": {
69
69
"description": "An audio connection from a node output to either an audio input or a named AudioParam.",
70
70
"properties": {
71
71
"from": {
72
72
"ref": "#source",
73
73
"type": "ref"
74
74
},
75
75
"to": {
76
76
"ref": "#target",
77
77
"type": "ref"
78
78
}
79
79
},
80
80
"required": [
81
81
"from",
82
82
"to"
83
83
],
84
84
"type": "object"
85
85
},
86
86
"lineage": {
87
87
"description": "The module this one was forked from, and its author.",
88
88
"properties": {
89
89
"authorDid": {
90
90
"format": "did",
91
91
"type": "string"
92
92
},
93
93
"moduleId": {
94
94
"maxLength": 128,
95
95
"type": "string"
96
96
},
97
97
"uri": {
98
98
"format": "at-uri",
99
99
"type": "string"
100
100
}
101
101
},
102
102
"required": [
103
103
"uri",
104
104
"authorDid"
105
105
],
106
106
"type": "object"
107
107
},
108
108
"main": {
109
109
"description": "A module, held in its author's own repository.",
110
110
"key": "tid",
111
111
"record": {
112
112
"properties": {
113
113
"audioInputs": {
114
114
"description": "Zero or more individually identified audio inputs.",
115
115
"items": {
116
116
"ref": "#port",
117
117
"type": "ref"
118
118
},
119
119
"type": "array"
120
120
},
121
121
"audioOutputs": {
122
122
"items": {
123
123
"ref": "#port",
124
124
"type": "ref"
125
125
},
126
126
"type": "array"
127
127
},
128
128
"automation": {
129
129
"description": "Scheduled AudioParam envelopes. Web Audio has no envelope node, so these are their own structure.",
130
130
"items": {
131
131
"ref": "#automation",
132
132
"type": "ref"
133
133
},
134
134
"type": "array"
135
135
},
136
136
"connections": {
137
137
"items": {
138
138
"ref": "#connection",
139
139
"type": "ref"
140
140
},
141
141
"type": "array"
142
142
},
143
143
"createdAt": {
144
144
"format": "datetime",
145
145
"type": "string"
146
146
},
147
147
"description": {
148
148
"maxLength": 3000,
149
149
"type": "string"
150
150
},
151
151
"descriptionVersion": {
152
152
"description": "Version of the module description this record follows. A reader accepts any version at or below its own.",
153
153
"minimum": 1,
154
154
"type": "integer"
155
155
},
156
156
"forkedFrom": {
157
157
"ref": "#lineage",
158
158
"type": "ref"
159
159
},
160
160
"midiInputs": {
161
161
"items": {
162
162
"ref": "#port",
163
163
"type": "ref"
164
164
},
165
165
"type": "array"
166
166
},
167
167
"moduleId": {
168
168
"description": "Stable identity shared by every published version of this module.",
169
169
"maxLength": 128,
170
170
"type": "string"
171
171
},
172
172
"name": {
173
173
"maxLength": 200,
174
174
"minLength": 1,
175
175
"type": "string"
176
176
},
177
177
"nodes": {
178
178
"items": {
179
179
"ref": "#node",
180
180
"type": "ref"
181
181
},
182
182
"type": "array"
183
183
},
184
+
"noteOutputs": {
185
+
"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.",
186
+
"items": {
187
+
"ref": "#port",
188
+
"type": "ref"
189
+
},
190
+
"type": "array"
191
+
},
192
+
"noteSource": {
193
+
"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.",
194
+
"knownValues": [
195
+
"keyboard",
196
+
"sequencer"
197
+
],
198
+
"maxLength": 64,
199
+
"type": "string"
200
+
},
184
201
"parameters": {
185
202
"items": {
186
203
"ref": "#parameter",
187
204
"type": "ref"
188
205
},
189
206
"type": "array"
190
207
},
191
208
"sampleSlots": {
192
209
"items": {
193
210
"ref": "#sampleSlot",
194
211
"type": "ref"
195
212
},
196
213
"type": "array"
197
214
},
198
215
"versionKey": {
199
216
"description": "This record's own key within the series. Informational; the record key is authoritative.",
200
217
"maxLength": 128,
201
218
"type": "string"
202
219
}
203
220
},
204
221
"required": [
205
222
"descriptionVersion",
206
223
"moduleId",
207
224
"name",
208
225
"description",
209
226
"audioInputs",
210
227
"audioOutputs",
211
228
"midiInputs",
212
229
"nodes",
213
230
"connections",
214
231
"createdAt"
215
232
],
216
233
"type": "object"
217
234
},
218
235
"type": "record"
219
236
},
220
237
"node": {
221
238
"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.",
222
239
"properties": {
223
240
"id": {
224
241
"maxLength": 64,
225
242
"minLength": 1,
226
243
"type": "string"
227
244
},
228
245
"kind": {
229
246
"maxLength": 64,
230
247
"minLength": 1,
231
248
"type": "string"
232
249
},
233
250
"options": {
234
251
"description": "The node's settings, as its kind defines them. A number that is not a whole number is carried as its decimal string — \"0.5\", not 0.5 — because the ATproto data model has no floating-point type and a PDS refuses one. A whole number is an ordinary integer, and a reader turns such a string back into a number.",
235
252
"type": "unknown"
236
253
}
237
254
},
238
255
"required": [
239
256
"id",
240
257
"kind"
241
258
],
242
259
"type": "object"
243
260
},
244
261
"paramTarget": {
245
262
"properties": {
246
263
"node": {
247
264
"maxLength": 64,
248
265
"minLength": 1,
249
266
"type": "string"
250
267
},
251
268
"param": {
252
269
"maxLength": 64,
253
270
"minLength": 1,
254
271
"type": "string"
255
272
}
256
273
},
257
274
"required": [
258
275
"node",
259
276
"param"
260
277
],
261
278
"type": "object"
262
279
},
263
280
"parameter": {
264
281
"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.",
265
282
"properties": {
266
283
"default": {
267
284
"description": "The value used where a patch sets none. A number that is not a whole number is carried as its decimal string — \"0.5\", not 0.5 — because the ATproto data model has no floating-point type and a PDS refuses one. A whole number is an ordinary integer, and a reader turns such a string back into a number. Where this parameter declares a closed value set, it is one of those strings.",
268
285
"type": "unknown"
269
286
},
270
287
"id": {
271
288
"maxLength": 64,
272
289
"minLength": 1,
273
290
"type": "string"
274
291
},
275
292
"label": {
276
293
"maxLength": 200,
277
294
"minLength": 1,
278
295
"type": "string"
279
296
},
280
297
"range": {
281
298
"ref": "#range",
282
299
"type": "ref"
283
300
},
284
301
"targets": {
285
302
"items": {
286
303
"ref": "#parameterTarget",
287
304
"type": "ref"
288
305
},
289
306
"minLength": 1,
290
307
"type": "array"
291
308
},
292
309
"values": {
293
310
"description": "A closed value set, where the parameter is not numeric.",
294
311
"items": {
295
312
"maxLength": 200,
296
313
"type": "string"
297
314
},
298
315
"type": "array"
299
316
}
300
317
},
301
318
"required": [
302
319
"id",
303
320
"label",
304
321
"targets"
305
322
],
306
323
"type": "object"
307
324
},
308
325
"parameterTarget": {
309
326
"description": "One of: {node, param}, {node, option}, or {automation, breakpoint, field}.",
310
327
"properties": {
311
328
"automation": {
312
329
"maxLength": 64,
313
330
"type": "string"
314
331
},
315
332
"breakpoint": {
316
333
"minimum": 0,
317
334
"type": "integer"
318
335
},
319
336
"field": {
320
337
"knownValues": [
321
338
"time",
322
339
"value"
323
340
],
324
341
"type": "string"
325
342
},
326
343
"node": {
327
344
"maxLength": 64,
328
345
"type": "string"
329
346
},
330
347
"option": {
331
348
"maxLength": 64,
332
349
"type": "string"
333
350
},
334
351
"param": {
335
352
"maxLength": 64,
336
353
"type": "string"
337
354
}
338
355
},
339
356
"type": "object"
340
357
},
341
358
"port": {
342
359
"description": "One individually identified audio or MIDI boundary of the module.",
343
360
"properties": {
344
361
"id": {
345
362
"maxLength": 64,
346
363
"minLength": 1,
347
364
"type": "string"
348
365
},
349
366
"label": {
350
367
"maxLength": 200,
351
368
"type": "string"
352
369
}
353
370
},
354
371
"required": [
355
372
"id"
356
373
],
357
374
"type": "object"
358
375
},
359
376
"range": {
360
377
"properties": {
361
378
"max": {
362
379
"description": "The high bound. A number that is not a whole number is carried as its decimal string — \"0.5\", not 0.5 — because the ATproto data model has no floating-point type and a PDS refuses one. A whole number is an ordinary integer, and a reader turns such a string back into a number.",
363
380
"type": "unknown"
364
381
},
365
382
"min": {
366
383
"description": "The low bound. A number that is not a whole number is carried as its decimal string — \"0.5\", not 0.5 — because the ATproto data model has no floating-point type and a PDS refuses one. A whole number is an ordinary integer, and a reader turns such a string back into a number.",
367
384
"type": "unknown"
368
385
}
369
386
},
370
387
"required": [
371
388
"min",
372
389
"max"
373
390
],
374
391
"type": "object"
375
392
},
376
393
"sampleRef": {
377
394
"description": "A sample blob and the account that holds it.",
378
395
"properties": {
379
396
"blob": {
380
397
"accept": [
381
398
"audio/wav"
382
399
],
383
400
"maxSize": 2097152,
384
401
"type": "blob"
385
402
},
386
403
"ownerDid": {
387
404
"format": "did",
388
405
"type": "string"
389
406
}
390
407
},
391
408
"required": [
392
409
"blob",
393
410
"ownerDid"
394
411
],
395
412
"type": "object"
396
413
},
397
414
"sampleSlot": {
398
415
"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.",
399
416
"properties": {
400
417
"default": {
401
418
"ref": "#sampleRef",
402
419
"type": "ref"
403
420
},
404
421
"id": {
405
422
"maxLength": 64,
406
423
"minLength": 1,
407
424
"type": "string"
408
425
},
409
426
"label": {
410
427
"maxLength": 200,
411
428
"type": "string"
412
429
},
413
430
"node": {
414
431
"maxLength": 64,
415
432
"minLength": 1,
416
433
"type": "string"
417
434
},
418
435
"property": {
419
436
"knownValues": [
420
437
"buffer"
421
438
],
422
439
"type": "string"
423
440
}
424
441
},
425
442
"required": [
426
443
"id",
427
444
"node",
428
445
"property"
429
446
],
430
447
"type": "object"
431
448
},
432
449
"source": {
433
450
"properties": {
434
451
"node": {
435
452
"maxLength": 64,
436
453
"minLength": 1,
437
454
"type": "string"
438
455
},
439
456
"output": {
440
457
"minimum": 0,
441
458
"type": "integer"
442
459
}
443
460
},
444
461
"required": [
445
462
"node"
446
463
],
447
464
"type": "object"
448
465
},
449
466
"target": {
450
467
"description": "Exactly one of `input` or `param` is present. `param` is modulation: a node output reaching a named AudioParam.",
451
468
"properties": {
452
469
"input": {
453
470
"minimum": 0,
454
471
"type": "integer"
455
472
},
456
473
"node": {
457
474
"maxLength": 64,
458
475
"minLength": 1,
459
476
"type": "string"
460
477
},
461
478
"param": {
462
479
"maxLength": 64,
463
480
"type": "string"
464
481
}
465
482
},
466
483
"required": [
467
484
"node"
468
485
],
469
486
"type": "object"
470
487
}
471
488
},
472
489
"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.",
473
490
"id": "at.atmosynth.module",
474
491
"lexicon": 1
475
492
}