at.atmosynth.module
Schema Diff
+9 -5
Compatibility Analysis
Backward Compatible
No changes detected.
1
1
{
2
2
"id": "at.atmosynth.module",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"descriptionVersion",
11
11
"moduleId",
12
12
"name",
13
13
"description",
14
14
"audioInputs",
15
15
"audioOutputs",
16
16
"midiInputs",
17
17
"nodes",
18
18
"connections",
19
19
"createdAt"
20
20
],
21
21
"properties": {
22
22
"name": {
23
23
"type": "string",
24
24
"maxLength": 200,
25
25
"minLength": 1
26
26
},
27
27
"nodes": {
28
28
"type": "array",
29
29
"items": {
30
30
"ref": "#node",
31
31
"type": "ref"
32
32
}
33
33
},
34
34
"moduleId": {
35
35
"type": "string",
36
36
"maxLength": 128,
37
37
"description": "Stable identity shared by every published version of this module."
38
38
},
39
39
"createdAt": {
40
40
"type": "string",
41
41
"format": "datetime"
42
42
},
43
43
"automation": {
44
44
"type": "array",
45
45
"items": {
46
46
"ref": "#automation",
47
47
"type": "ref"
48
48
},
49
49
"description": "Scheduled AudioParam envelopes. Web Audio has no envelope node, so these are their own structure."
50
50
},
51
51
"forkedFrom": {
52
52
"ref": "#lineage",
53
53
"type": "ref"
54
54
},
55
55
"midiInputs": {
56
56
"type": "array",
57
57
"items": {
58
58
"ref": "#port",
59
59
"type": "ref"
60
60
}
61
61
},
62
62
"parameters": {
63
63
"type": "array",
64
64
"items": {
65
65
"ref": "#parameter",
66
66
"type": "ref"
67
67
}
68
68
},
69
69
"versionKey": {
70
70
"type": "string",
71
71
"maxLength": 128,
72
72
"description": "This record's own key within the series. Informational; the record key is authoritative."
73
73
},
74
74
"audioInputs": {
75
75
"type": "array",
76
76
"items": {
77
77
"ref": "#port",
78
78
"type": "ref"
79
79
},
80
80
"description": "Zero or more individually identified audio inputs."
81
81
},
82
82
"connections": {
83
83
"type": "array",
84
84
"items": {
85
85
"ref": "#connection",
86
86
"type": "ref"
87
87
}
88
88
},
89
89
"description": {
90
90
"type": "string",
91
91
"maxLength": 3000
92
92
},
93
93
"sampleSlots": {
94
94
"type": "array",
95
95
"items": {
96
96
"ref": "#sampleSlot",
97
97
"type": "ref"
98
98
}
99
99
},
100
100
"audioOutputs": {
101
101
"type": "array",
102
102
"items": {
103
103
"ref": "#port",
104
104
"type": "ref"
105
105
}
106
106
},
107
107
"descriptionVersion": {
108
108
"type": "integer",
109
109
"minimum": 1,
110
110
"description": "Version of the module description this record follows. A reader accepts any version at or below its own."
111
111
}
112
112
}
113
113
},
114
114
"description": "A module, held in its author's own repository."
115
115
},
116
116
"node": {
117
117
"type": "object",
118
118
"required": [
119
119
"id",
120
120
"kind"
121
121
],
122
122
"properties": {
123
123
"id": {
124
124
"type": "string",
125
125
"maxLength": 64,
126
126
"minLength": 1
127
127
},
128
128
"kind": {
129
129
"type": "string",
130
130
"maxLength": 64,
131
131
"minLength": 1
132
132
},
133
133
"options": {
134
-
"type": "unknown"
134
+
"type": "unknown",
135
+
"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."
135
136
}
136
137
},
137
138
"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."
138
139
},
139
140
"port": {
140
141
"type": "object",
141
142
"required": [
142
143
"id"
143
144
],
144
145
"properties": {
145
146
"id": {
146
147
"type": "string",
147
148
"maxLength": 64,
148
149
"minLength": 1
149
150
},
150
151
"label": {
151
152
"type": "string",
152
153
"maxLength": 200
153
154
}
154
155
},
155
156
"description": "One individually identified audio or MIDI boundary of the module."
156
157
},
157
158
"range": {
158
159
"type": "object",
159
160
"required": [
160
161
"min",
161
162
"max"
162
163
],
163
164
"properties": {
164
165
"max": {
165
-
"type": "unknown"
166
+
"type": "unknown",
167
+
"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."
166
168
},
167
169
"min": {
168
-
"type": "unknown"
170
+
"type": "unknown",
171
+
"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."
169
172
}
170
173
}
171
174
},
172
175
"source": {
173
176
"type": "object",
174
177
"required": [
175
178
"node"
176
179
],
177
180
"properties": {
178
181
"node": {
179
182
"type": "string",
180
183
"maxLength": 64,
181
184
"minLength": 1
182
185
},
183
186
"output": {
184
187
"type": "integer",
185
188
"minimum": 0
186
189
}
187
190
}
188
191
},
189
192
"target": {
190
193
"type": "object",
191
194
"required": [
192
195
"node"
193
196
],
194
197
"properties": {
195
198
"node": {
196
199
"type": "string",
197
200
"maxLength": 64,
198
201
"minLength": 1
199
202
},
200
203
"input": {
201
204
"type": "integer",
202
205
"minimum": 0
203
206
},
204
207
"param": {
205
208
"type": "string",
206
209
"maxLength": 64
207
210
}
208
211
},
209
212
"description": "Exactly one of `input` or `param` is present. `param` is modulation: a node output reaching a named AudioParam."
210
213
},
211
214
"lineage": {
212
215
"type": "object",
213
216
"required": [
214
217
"uri",
215
218
"authorDid"
216
219
],
217
220
"properties": {
218
221
"uri": {
219
222
"type": "string",
220
223
"format": "at-uri"
221
224
},
222
225
"moduleId": {
223
226
"type": "string",
224
227
"maxLength": 128
225
228
},
226
229
"authorDid": {
227
230
"type": "string",
228
231
"format": "did"
229
232
}
230
233
},
231
234
"description": "The module this one was forked from, and its author."
232
235
},
233
236
"parameter": {
234
237
"type": "object",
235
238
"required": [
236
239
"id",
237
240
"label",
238
241
"targets"
239
242
],
240
243
"properties": {
241
244
"id": {
242
245
"type": "string",
243
246
"maxLength": 64,
244
247
"minLength": 1
245
248
},
246
249
"label": {
247
250
"type": "string",
248
251
"maxLength": 200,
249
252
"minLength": 1
250
253
},
251
254
"range": {
252
255
"ref": "#range",
253
256
"type": "ref"
254
257
},
255
258
"values": {
256
259
"type": "array",
257
260
"items": {
258
261
"type": "string",
259
262
"maxLength": 200
260
263
},
261
264
"description": "A closed value set, where the parameter is not numeric."
262
265
},
263
266
"default": {
264
-
"type": "unknown"
267
+
"type": "unknown",
268
+
"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."
265
269
},
266
270
"targets": {
267
271
"type": "array",
268
272
"items": {
269
273
"ref": "#parameterTarget",
270
274
"type": "ref"
271
275
},
272
276
"minLength": 1
273
277
}
274
278
},
275
279
"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."
276
280
},
277
281
"sampleRef": {
278
282
"type": "object",
279
283
"required": [
280
284
"blob",
281
285
"ownerDid"
282
286
],
283
287
"properties": {
284
288
"blob": {
285
289
"type": "blob",
286
290
"accept": [
287
291
"audio/wav"
288
292
],
289
293
"maxSize": 2097152
290
294
},
291
295
"ownerDid": {
292
296
"type": "string",
293
297
"format": "did"
294
298
}
295
299
},
296
300
"description": "A sample blob and the account that holds it."
297
301
},
298
302
"automation": {
299
303
"type": "object",
300
304
"required": [
301
305
"id",
302
306
"target",
303
307
"breakpoints"
304
308
],
305
309
"properties": {
306
310
"id": {
307
311
"type": "string",
308
312
"maxLength": 64,
309
313
"minLength": 1
310
314
},
311
315
"label": {
312
316
"type": "string",
313
317
"maxLength": 200
314
318
},
315
319
"target": {
316
320
"ref": "#paramTarget",
317
321
"type": "ref"
318
322
},
319
323
"sustainAt": {
320
324
"type": "integer",
321
325
"minimum": 0,
322
326
"description": "Index into breakpoints where the value holds while a note is held. Absent means a one-shot."
323
327
},
324
328
"breakpoints": {
325
329
"type": "array",
326
330
"items": {
327
331
"ref": "#breakpoint",
328
332
"type": "ref"
329
333
},
330
334
"minLength": 1
331
335
}
332
336
},
333
337
"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."
334
338
},
335
339
"breakpoint": {
336
340
"type": "object",
337
341
"required": [
338
342
"time",
339
343
"value"
340
344
],
341
345
"properties": {
342
346
"time": {
343
347
"type": "integer",
344
348
"minimum": 0,
345
349
"description": "Milliseconds from the trigger."
346
350
},
347
351
"curve": {
348
352
"type": "string",
349
353
"description": "How the value travels from the previous breakpoint.",
350
354
"knownValues": [
351
355
"step",
352
356
"linear",
353
357
"exponential"
354
358
]
355
359
},
356
360
"value": {
357
361
"type": "unknown",
358
-
"description": "The param's value at this instant."
362
+
"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."
359
363
}
360
364
}
361
365
},
362
366
"connection": {
363
367
"type": "object",
364
368
"required": [
365
369
"from",
366
370
"to"
367
371
],
368
372
"properties": {
369
373
"to": {
370
374
"ref": "#target",
371
375
"type": "ref"
372
376
},
373
377
"from": {
374
378
"ref": "#source",
375
379
"type": "ref"
376
380
}
377
381
},
378
382
"description": "An audio connection from a node output to either an audio input or a named AudioParam."
379
383
},
380
384
"sampleSlot": {
381
385
"type": "object",
382
386
"required": [
383
387
"id",
384
388
"node",
385
389
"property"
386
390
],
387
391
"properties": {
388
392
"id": {
389
393
"type": "string",
390
394
"maxLength": 64,
391
395
"minLength": 1
392
396
},
393
397
"node": {
394
398
"type": "string",
395
399
"maxLength": 64,
396
400
"minLength": 1
397
401
},
398
402
"label": {
399
403
"type": "string",
400
404
"maxLength": 200
401
405
},
402
406
"default": {
403
407
"ref": "#sampleRef",
404
408
"type": "ref"
405
409
},
406
410
"property": {
407
411
"type": "string",
408
412
"knownValues": [
409
413
"buffer"
410
414
]
411
415
}
412
416
},
413
417
"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."
414
418
},
415
419
"paramTarget": {
416
420
"type": "object",
417
421
"required": [
418
422
"node",
419
423
"param"
420
424
],
421
425
"properties": {
422
426
"node": {
423
427
"type": "string",
424
428
"maxLength": 64,
425
429
"minLength": 1
426
430
},
427
431
"param": {
428
432
"type": "string",
429
433
"maxLength": 64,
430
434
"minLength": 1
431
435
}
432
436
}
433
437
},
434
438
"parameterTarget": {
435
439
"type": "object",
436
440
"properties": {
437
441
"node": {
438
442
"type": "string",
439
443
"maxLength": 64
440
444
},
441
445
"field": {
442
446
"type": "string",
443
447
"knownValues": [
444
448
"time",
445
449
"value"
446
450
]
447
451
},
448
452
"param": {
449
453
"type": "string",
450
454
"maxLength": 64
451
455
},
452
456
"option": {
453
457
"type": "string",
454
458
"maxLength": 64
455
459
},
456
460
"automation": {
457
461
"type": "string",
458
462
"maxLength": 64
459
463
},
460
464
"breakpoint": {
461
465
"type": "integer",
462
466
"minimum": 0
463
467
}
464
468
},
465
469
"description": "One of: {node, param}, {node, option}, or {automation, breakpoint, field}."
466
470
}
467
471
},
468
472
"$type": "com.atproto.lexicon.schema",
469
473
"lexicon": 1,
470
474
"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."
471
475
}