at.atmosynth.patch

atmosynth.at

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "connection": {
      "description": "An audio connection between two module instances, naming the declared ports at each end.",
      "properties": {
        "from": {
          "ref": "#outputRef",
          "type": "ref"
        },
        "to": {
          "ref": "#inputRef",
          "type": "ref"
        }
      },
      "required": [
        "from",
        "to"
      ],
      "type": "object"
    },
    "inputRef": {
      "properties": {
        "audioInput": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "instanceId": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "instanceId",
        "audioInput"
      ],
      "type": "object"
    },
    "lineage": {
      "description": "The patch this one was forked from, and its creator. Preserved even when the source is later deleted.",
      "properties": {
        "creatorDid": {
          "format": "did",
          "type": "string"
        },
        "patchId": {
          "maxLength": 128,
          "type": "string"
        },
        "uri": {
          "format": "at-uri",
          "type": "string"
        }
      },
      "required": [
        "uri",
        "creatorDid"
      ],
      "type": "object"
    },
    "main": {
      "description": "A patch, held in its creator's own repository.",
      "key": "tid",
      "record": {
        "properties": {
          "connections": {
            "items": {
              "ref": "#connection",
              "type": "ref"
            },
            "type": "array"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "maxLength": 3000,
            "type": "string"
          },
          "descriptionVersion": {
            "description": "Version of the patch description this record follows.",
            "minimum": 1,
            "type": "integer"
          },
          "forkedFrom": {
            "ref": "#lineage",
            "type": "ref"
          },
          "midiRouting": {
            "description": "Which module instances receive MIDI input.",
            "items": {
              "ref": "#midiRoute",
              "type": "ref"
            },
            "type": "array"
          },
          "moduleInstances": {
            "items": {
              "ref": "#moduleInstance",
              "type": "ref"
            },
            "type": "array"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "output": {
            "description": "Which instance reaches the audio output.",
            "ref": "#outputRef",
            "type": "ref"
          },
          "tags": {
            "description": "Freely created tags, lower-cased on write so one hashtag matches one set of patches.",
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "type": "array"
          },
          "types": {
            "description": "Zero or more of the ten fixed types. A patch may carry several.",
            "items": {
              "knownValues": [
                "Lead",
                "Pad",
                "Bass",
                "Plucked",
                "Percussion",
                "Keys",
                "Brass",
                "Strings",
                "Vocal",
                "SFX"
              ],
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "descriptionVersion",
          "name",
          "description",
          "moduleInstances",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "midiControl": {
      "description": "One MIDI control change bound to one of the module's exposed parameters. The controller's 0 to 127 sweeps the parameter across the range the module declares, or, where the module declares a closed value set instead, across those values in order. A control is read from every input on every channel, like every other MIDI message here: there is nothing to configure.",
      "properties": {
        "controller": {
          "description": "The control change number. Five are spoken for by MIDI itself and cannot be bound: 64, the sustain pedal, and 6, 38, 100 and 101, which carry registered-parameter traffic.",
          "maximum": 127,
          "minimum": 0,
          "type": "integer"
        },
        "parameter": {
          "description": "The id of the exposed parameter this control moves. One parameter is moved by at most one controller; one controller may move several parameters.",
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "parameter",
        "controller"
      ],
      "type": "object"
    },
    "midiRoute": {
      "properties": {
        "instanceId": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "midiInput": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "instanceId",
        "midiInput"
      ],
      "type": "object"
    },
    "moduleInstance": {
      "description": "One use of one module version. A patch may use the same module more than once; each instance is separately addressable and carries its own parameter values and slot fills.",
      "properties": {
        "enabled": {
          "description": "Whether this instance does its work. An instance that is switched off makes no sound of its own, and anything reaching its audio inputs leaves its audio outputs unaltered. Optional permanently: an instance that says nothing is on, which is what every record written before this field existed says.",
          "type": "boolean"
        },
        "instanceId": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "midiControls": {
          "description": "Which MIDI control changes move this instance's parameters while it is played. A binding lives here, in the patch, because which knob moves what is a decision about this use of the module and not about the module.",
          "items": {
            "ref": "#midiControl",
            "type": "ref"
          },
          "type": "array"
        },
        "module": {
          "ref": "#moduleRef",
          "type": "ref"
        },
        "parameterValues": {
          "items": {
            "ref": "#parameterValue",
            "type": "ref"
          },
          "type": "array"
        },
        "position": {
          "description": "Where the creator placed this instance in the patch's arrangement, so the arrangement travels with the patch and a fork inherits it. Optional permanently, and the only field in either description that exists for presentation.",
          "ref": "#position",
          "type": "ref"
        },
        "sampleSlotFills": {
          "description": "Samples this instance supplies for the module's declared slots. A fill lives here, in the patch, so writing one never touches the module.",
          "items": {
            "ref": "#sampleSlotFill",
            "type": "ref"
          },
          "type": "array"
        },
        "voiceScope": {
          "description": "Whether this instance is built once for each sounding note or once for the whole patch. Optional permanently: an unset scope is worked out when the patch is played, and is never written on a creator's behalf.",
          "knownValues": [
            "perNote",
            "perPatch"
          ],
          "type": "string"
        }
      },
      "required": [
        "instanceId",
        "module"
      ],
      "type": "object"
    },
    "moduleRef": {
      "description": "A pin to one exact published version of a module. Resolving it fetches that record, whoever authored it.",
      "properties": {
        "authorDid": {
          "format": "did",
          "type": "string"
        },
        "moduleId": {
          "maxLength": 128,
          "minLength": 1,
          "type": "string"
        },
        "versionKey": {
          "maxLength": 128,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "moduleId",
        "versionKey",
        "authorDid"
      ],
      "type": "object"
    },
    "outputRef": {
      "properties": {
        "audioOutput": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "instanceId": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "instanceId",
        "audioOutput"
      ],
      "type": "object"
    },
    "parameterValue": {
      "description": "A value for one of the module's exposed parameters, or an explicit fall-back to the module's declared default.",
      "properties": {
        "id": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "useDefault": {
          "description": "Set where the patch explicitly defers to the module's default rather than recording a value.",
          "type": "boolean"
        },
        "value": {
          "description": "The value this patch sets the parameter to. 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 the module declares a closed set of values instead, this is one of those strings, and a label that looks like a number stays the label it is.",
          "type": "unknown"
        }
      },
      "required": [
        "id"
      ],
      "type": "object"
    },
    "position": {
      "properties": {
        "x": {
          "type": "integer"
        },
        "y": {
          "type": "integer"
        }
      },
      "required": [
        "x",
        "y"
      ],
      "type": "object"
    },
    "sampleSlotFill": {
      "properties": {
        "blob": {
          "accept": [
            "audio/wav"
          ],
          "maxSize": 2097152,
          "type": "blob"
        },
        "ownerDid": {
          "format": "did",
          "type": "string"
        },
        "slotId": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "slotId",
        "blob",
        "ownerDid"
      ],
      "type": "object"
    }
  },
  "description": "A synth patch: which modules it uses, how they are wired, what their parameters are set to, and how it is played. A patch plus the module records it pins is everything needed to reproduce it.",
  "id": "at.atmosynth.patch",
  "lexicon": 1
}

Validate Record

Validate a record against at.atmosynth.patch

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:fzjkahpwapmoqxybwdjb6ysf
CID
bafyreibwpt2pxubutf2e5lsuphukhsd2bwxf4uox6nofwljbulj35tmrfa
Indexed At
2026-09-04 13:59 UTC
AT-URI
at://did:plc:fzjkahpwapmoqxybwdjb6ysf/com.atproto.lexicon.schema/at.atmosynth.patch

Version History (20 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • 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 for…

  • net.anisota.lab.synth recordnot from the namespace authority

    A multitrack composition made in the Anisota Lab's Synth studio and saved to the owner's library. The piece is stored as compact musical event data (not audio), so it can be reloaded into the synth, replayed and edited.…

Lexicon Garden

@