at.atmosynth.module

A module, held in its author's own repository.

Repository @atmosynth.at did:plc:fzjkahpwapmoqxybwdjb6ysf namespace authority
Details · record, key tid
Kindrecord
Record keytid
Authorityatmosynth.at
Indexed

Record

record · key tid

Properties

audioInputs

requiredarray

Zero or more individually identified audio inputs.

itemsref
Reference

audioOutputs

requiredarray
itemsref
Reference

Scheduled AudioParam envelopes. Web Audio has no envelope node, so these are their own structure.

itemsref
Reference

connections

requiredarray
itemsref
Reference

createdAt

requiredstring · datetime

description

requiredstring
  • maxLength: 3000

descriptionVersion

requiredinteger

Version of the module description this record follows. A reader accepts any version at or below its own.

  • minimum: 1
Reference

midiInputs

requiredarray

Zero or more note inputs. A note input carries note events — what is played, and when — from any note source: a sequencer's note output, or the player, which is the on-screen keys, the computer keyboard and every MIDI device at once. "MIDI" is the historical name; nothing arriving here need have come from MIDI.

itemsref
Reference

moduleId

requiredstring

Stable identity shared by every published version of this module.

  • maxLength: 128

name

requiredstring
  • minLength: 1
  • maxLength: 200

nodes

requiredarray
itemsref
Reference

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 note input (`midiInputs`) 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.

itemsref
Reference

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. `range` emits none of its own: it passes on the notes wired into its input that fall inside the range its instance names (`noteRange` on the patch's instance), each still the note of whatever played it. `transpose` and `assign` emit none of their own either: they pass on every note wired into their input at another pitch — moved by the semitones the instance names (`transpose`), or at the one note it names (`assignedNote`) — each still the note of whatever played it, and starting and stopping when it did. `oneshot` emits none of its own either: it passes on every note wired into its input lasting as many milliseconds as the instance names (`noteLength`), however long whatever played it held it — each still the note of whatever played it, at its own pitch, and starting when it did. A reader that does not know the named behaviour cannot run the module, and says so rather than guessing.

  • maxLength: 64
  • knownValues: keyboard | sequencer | range | transpose | assign | oneshot
itemsref
Reference

What this module chooses a sequencer's patterns by, where it is not made of Web Audio nodes at all. A pattern source emits neither sound nor notes: it is wired to a sequencer's pattern input and decides which of that sequencer's patterns is played, and when. Like a note source it has no `nodes` and no `connections`, and its behaviour is named here rather than described. A module is a note source or a pattern source, never both. A reader that does not know the named behaviour cannot run the module, and says so rather than guessing.

  • maxLength: 64
  • knownValues: arranger | scenes
itemsref
Reference

The record key this version is published under, repeated in the record so a reader holding only the record knows which version it is. A patch's `moduleRef.versionKey` is this value, and it is the record key a reader fetches: a record whose `versionKey` differs from its own key is pinned by the key and misdescribed by this field.

  • maxLength: 128

#automation

object

A breakpoint envelope scheduled onto an AudioParam. Breakpoints up to and including sustainAt are scheduled on note-on; those after it on note-off.

Properties

breakpoints

requiredarray
  • minLength: 1
itemsref
Reference

id

requiredstring
  • minLength: 1
  • maxLength: 64

label

string
  • maxLength: 200

sustainAt

integer

Index into breakpoints where the value holds while a note is held. Absent means a one-shot.

  • minimum: 0

target

requiredref
Reference

#breakpoint

object

Properties

curve

string

How the value travels from the previous breakpoint.

  • knownValues: step | linear | exponential

time

requiredinteger

Milliseconds from the trigger.

  • minimum: 0

value

requiredstring

The param's value at this instant, as its decimal form — "0.25", "1" — because the ATproto data model has no floating-point type and a PDS refuses one. An automation is numeric by definition, so a reader turns it back into a number without asking anything else.

  • maxLength: 200

#connection

object

An audio connection from a node output to either an audio input or a named AudioParam.

Properties

from

requiredref
Reference

to

requiredref
Reference

#lineage

object

The module this one was forked from, and its author.

Properties

authorDid

requiredstring · did

moduleId

string
  • maxLength: 128

uri

requiredstring · at-uri

#node

object

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. A `dsp` node is the one kind made of code its author wrote in DSP JS, a subset of JavaScript that plays the same in a browser and in a DAW: its options are `code`, the source as its author wrote it, and `tail`, a switch saying that what it is handed is still heard after the note that made it has ended. Its inputs, its outputs, its parameters and the samples it reads are what the source declares (`static inputs`, `static outputs`, `static params`, `sample("…")`), and nothing in the record repeats them: a connection into one of its parameters, or a `param` target, names a key of its `static params`, and a connection's `input` or `output` counts its buses. Each sample its source reads is filled through exactly one of the module's `sampleSlots`, which names the node and has the name the source reads as its `property`. A module holds at most four `dsp` nodes, each of at most 65536 bytes of source; one whose source is not DSP JS cannot be played. `audioWorklet`, the kind code was carried in before DSP JS, is no longer in the vocabulary and is refused as any unknown kind is.

Properties

id

requiredstring
  • minLength: 1
  • maxLength: 64

kind

requiredstring
  • minLength: 1
  • maxLength: 64

options

unknown

The node's settings, as its kind defines them. This is an object — which is the whole of what `unknown` means here — so the data model applies inside it: a whole number is an ordinary integer, and a number that is not a whole number is carried as its decimal string, "0.5" rather than 0.5, because the ATproto data model has no floating-point type and a PDS refuses one. That is the one difference from the fields this description types as strings, which have nowhere to put an integer.

#paramTarget

object

Properties

node

requiredstring
  • minLength: 1
  • maxLength: 64

param

requiredstring
  • minLength: 1
  • maxLength: 64

#parameter

object

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.

Properties

default

string

The value used where a patch sets none, always as text. A number is its decimal form — "0.5", and "2" for a whole one — because the ATproto data model has no floating-point type and a string is the only type that carries both a number and a word. Where this parameter declares a closed value set, it is one of those strings instead, and a label that looks like a number stays the label it is.

  • maxLength: 200

id

requiredstring
  • minLength: 1
  • maxLength: 64

label

requiredstring
  • minLength: 1
  • maxLength: 200
Reference

scale

string

How a slider or a MIDI control moves through the range. linear moves by equal differences; log moves by equal ratios, which is how a frequency is heard, so the middle of a 20 to 20000 sweep is about 632 rather than about 10000. log needs a range above zero at both ends. Absent is linear. A parameter with a closed value set has no scale.

  • knownValues: linear | log

targets

requiredarray
  • minLength: 1
itemsref
Reference

values

array

A closed value set, where the parameter is not numeric. A construction option the parameter targets is given the chosen value itself; an AudioParam it targets is given the chosen value's position in this set, counting from zero, which is how a `dsp` node offers a choice its own code interprets.

itemsstring
  • maxLength: 200

#parameterTarget

object

One of: {node, param}, {node, option}, or {automation, breakpoint, field}.

Properties

  • maxLength: 64

breakpoint

integer
  • minimum: 0

field

string

Which field of the breakpoint the parameter sets. `time` is milliseconds from the trigger; `duration` is milliseconds from the breakpoint before this one, so a later stage keeps its length when an earlier one is made longer, and is never set on breakpoint 0. `value` is the level travelled to. `curve` is how it travels there, and the parameter then declares a closed value set drawn from the breakpoint's own curves.

  • knownValues: time | duration | value | curve

node

string
  • maxLength: 64

option

string
  • maxLength: 64

param

string
  • maxLength: 64

#port

object

One individually identified audio or MIDI boundary of the module.

Properties

id

requiredstring
  • minLength: 1
  • maxLength: 64

label

string
  • maxLength: 200

#range

object

Properties

max

requiredstring

The high bound, as its decimal form — "20000", "0.5" — because the ATproto data model has no floating-point type and a PDS refuses one. A range is numeric by definition, so a reader turns it back into a number without asking anything else.

  • maxLength: 200

min

requiredstring

The low bound, as its decimal form — "0.0001", "-1" — because the ATproto data model has no floating-point type and a PDS refuses one. A range is numeric by definition, so a reader turns it back into a number without asking anything else.

  • maxLength: 200

#sampleRef

object

A sample blob and the account that holds it.

Properties

blob

requiredblob
  • maxSize: 10485760
  • accept: audio/wav, audio/flac

ownerDid

requiredstring · did

#sampleSlot

object

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. On a `dsp` node, `property` is a name its source passes to `sample()`: each such name has exactly one slot, so two DSP JS nodes reading the same name are two slots, each filled and defaulted on its own, and a slot naming something the source never reads cannot be played.

Properties

Reference

id

requiredstring
  • minLength: 1
  • maxLength: 64

label

string
  • maxLength: 200

node

requiredstring
  • minLength: 1
  • maxLength: 64

property

requiredstring

What the sample feeds: `buffer` on a node that plays one sample, or, on a `dsp` node, the name its source reads the sample by.

  • knownValues: buffer

#source

object

Properties

node

requiredstring
  • minLength: 1
  • maxLength: 64

output

integer
  • minimum: 0

#target

object

Exactly one of `input` or `param` is present. `param` is modulation: a node output reaching a named AudioParam.

Properties

input

integer
  • minimum: 0

node

requiredstring
  • minLength: 1
  • maxLength: 64

param

string
  • maxLength: 64

Similar lexicons

semantic match

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

  • 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.