at.atmosynth.module

atmosynth.at

Schema Diff

+9 -5

From

CID
bafyreibwkmr5b32...
Indexed At
2026-08-31 13:27 UTC
View this version

To

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

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
}

Compare Other Versions

Lexicon Garden

@