at.atmosynth.module

atmosynth.at

Schema Diff

+17 -0

From

CID
bafyreif4uicvsyi...
Indexed At
2026-08-31 14:12 UTC
View this version

To

CID
bafyreifevnggceg...
Indexed At
2026-09-08 07:18 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@