Files
XZBT/schema/xzbt-0.1.schema.json
T
LabyricornandClaude Opus 5 c4332363a9 docs: raise the format specification to revision 0.9 and land the reconciliation
Revision 0.9 adds section 20, the cadence and event subsystems contract, and
carries two corrections the implementation forced. Section 6.1 now states that a
duration is the authored literal or a non-negative finite number already in
milliseconds, since a DurationSpec may be the resolved output of a ValueSpec or
a bounded TimeSpec, with the one documented exception of an automation track's
`at`, which 19.1 keeps literal-only so that point ordering stays decidable at
import. Section 20.11 documents the rejection of an undeclared input name in an
event action's `with` map as ERR_UNKNOWN_FIELD — the section's own convention
for that shape of error, replacing an invented code that appeared nowhere in the
registry.

The review record is committed with the code it describes: the two code triages
that found these defects, the reconciliation plan that sequenced the fixes, and
a follow-up debt record listing what was deliberately left open — the unchecked
JSON Schema artifact, degenerate path arcs, post-effect transient allocation,
the window-traffic fixture's per-copy wrap bounds, and the unstated
`ownership: "persistent"` value on a sound action. None of the five blocks phase
6; all five are written down rather than dropped.

Devlog entries are backfilled for the two milestones that had none: phase 3c
slice 2, the audio lifecycle and voice ceilings, and slice 4d, the renderer
core. The implementation status summary now reflects the reconciled state rather
than the in-flight one.

231 tests pass. tools/verify-spec-contract.py reports 46 declared diagnostic
codes with every used code resolving and its two long-standing unresolved
cross-references unchanged.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01ShxxFqFmCUDQnQvFNm4TKy
2026-09-06 21:54:09 +00:00

3654 lines
90 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://xzbt.org/schemas/0.1/exhibit.json",
"title": "XZBT Exhibit Schema 0.1",
"description": "Authoritative structural schema for XZBT 0.1 declarative exhibits.",
"type": "object",
"required": [
"xzbt",
"meta"
],
"additionalProperties": false,
"properties": {
"xzbt": {
"type": "string",
"const": "0.1",
"description": "XZBT format specification version. Must be '0.1'."
},
"meta": {
"type": "object",
"description": "Exhibit metadata and descriptive properties.",
"required": [
"id",
"name"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$",
"maxLength": 64,
"description": "Unique exhibit identifier."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "Human-readable exhibit title."
},
"version": {
"type": "string",
"description": "Exhibit author semantic version string."
},
"author": {
"type": "string",
"maxLength": 128,
"description": "Author or entity attribution."
},
"description": {
"type": "string",
"maxLength": 1024,
"description": "Short description of exhibit behavior and theme."
},
"license": {
"type": "string",
"description": "License or rights attribution."
},
"tags": {
"type": "array",
"maxItems": 16,
"items": {
"type": "string",
"maxLength": 32
}
}
}
},
"runtime": {
"type": "object",
"additionalProperties": false,
"properties": {
"seed": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string",
"const": "random"
}
],
"description": "PRNG seed: integer for deterministic reproduction, or 'random'."
}
}
},
"parameters": {
"type": "object",
"description": "User-tunable exhibit parameters.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"$ref": "#/definitions/ParameterSpec"
}
},
"additionalProperties": false
},
"state": {
"type": "object",
"description": "Simulation-owned runtime state variables.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"$ref": "#/definitions/StateSpec"
}
},
"additionalProperties": false
},
"signals": {
"type": "object",
"description": "Read-only environmental and input signals.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"type": "object"
}
},
"additionalProperties": false
},
"ui": {
"type": "object",
"description": "Generated UI grouping and presentation preferences.",
"additionalProperties": true
},
"components": {
"type": "object",
"description": "Modular audio and visual reusable components.",
"additionalProperties": false,
"properties": {
"audio": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/AudioComponent"
}
},
"visual": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualComponent"
}
}
}
},
"visuals": {
"type": "object",
"additionalProperties": false,
"required": [
"scene"
],
"description": "The visual subsystem (sections 17-19): scene, layers, systems, fields, camera, post-effects, and exhibit-scope automation.",
"properties": {
"scene": {
"type": "object",
"additionalProperties": false,
"properties": {
"coordinateSpace": {
"enum": [
"normalized",
"viewport",
"virtual"
]
},
"width": {
"type": "number",
"minimum": 1,
"maximum": 16384
},
"height": {
"type": "number",
"minimum": 1,
"maximum": 16384
},
"fit": {
"enum": [
"contain",
"cover",
"stretch"
]
},
"background": {
"type": "string",
"description": "Color literal (section 2)."
},
"depthFog": {
"type": "object",
"required": [
"color",
"far"
],
"additionalProperties": false,
"properties": {
"color": {
"type": "string",
"description": "Color literal (section 2)."
},
"near": {
"type": "number"
},
"far": {
"type": "number"
},
"density": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}
},
"layers": {
"type": "object",
"minProperties": 1,
"maxProperties": 16,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"properties": {
"opacity": {
"$ref": "#/definitions/ValueSpec"
},
"blend": {
"enum": [
"normal",
"add",
"screen",
"multiply",
"overlay",
"lighten",
"darken",
"difference"
]
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"parallax": {
"type": "number"
}
}
}
},
"systems": {
"type": "object",
"maxProperties": 64,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualSystem"
}
},
"fields": {
"type": "object",
"maxProperties": 8,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualField"
}
},
"camera": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"zoom": {
"$ref": "#/definitions/ValueSpec"
},
"rotation": {
"$ref": "#/definitions/ValueSpec"
},
"projection": {
"enum": [
"orthographic",
"perspective"
]
},
"focalLength": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"effects": {
"type": "array",
"maxItems": 4,
"items": {
"$ref": "#/definitions/VisualEffect"
}
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
}
}
},
"audio": {
"type": "object",
"description": "Synthesizer graphs, buses, and routing.",
"additionalProperties": false,
"properties": {
"buses": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$",
"not": {
"const": "master"
}
},
"additionalProperties": {
"$ref": "#/definitions/AudioBus"
}
},
"recipes": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/AudioRecipe"
}
}
}
},
"sounds": {
"type": "object",
"description": "Sound definitions separating metadata from synthesis.",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/Sound"
}
},
"cadence": {
"type": "object",
"description": "Procedural rhythm clocks, intensity, and automatic one-shot sound policies (sections 20.3-20.7).",
"additionalProperties": false,
"properties": {
"intensity": {
"$ref": "#/definitions/ValueSpec"
},
"minGap": {
"$ref": "#/definitions/DurationSpec"
},
"clocks": {
"type": "object",
"additionalProperties": false,
"properties": {
"routine": {
"$ref": "#/definitions/CadenceClockRange"
},
"intermittent": {
"$ref": "#/definitions/CadenceClockRange"
},
"occasional": {
"$ref": "#/definitions/CadenceClockRange"
},
"rare": {
"$ref": "#/definitions/CadenceClockRange"
}
}
}
}
},
"modulators": {
"type": "object",
"description": "Continuous LFOs, noise generators, and sample-and-hold signals.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"type": "object"
}
},
"additionalProperties": false
},
"bindings": {
"type": "array",
"description": "Directed value propagation links.",
"items": {
"$ref": "#/definitions/BindingSpec"
}
},
"events": {
"type": "object",
"description": "Discrete lifecycle and state change event triggers (section 20.10, PRD 90).",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/EventDefinition"
}
},
"scenarios": {
"type": "object",
"description": "Autonomous orchestrated scenarios and timelines.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"type": "object"
}
},
"additionalProperties": false
}
},
"definitions": {
"ParameterSpec": {
"type": "object",
"required": [
"type",
"default"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"number",
"integer",
"boolean",
"string",
"color",
"enum"
]
},
"default": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"step": {
"type": "number",
"exclusiveMinimum": 0
},
"values": {
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string",
"maxLength": 128
},
"unit": {
"type": "string",
"maxLength": 16
}
}
},
"StateSpec": {
"type": "object",
"required": [
"type",
"initial"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"number",
"integer",
"boolean",
"string"
]
},
"initial": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
}
}
},
"BindingSpec": {
"type": "object",
"required": [
"source",
"target"
],
"additionalProperties": false,
"properties": {
"source": {
"type": "string",
"description": "Source reference path (e.g. 'parameters.activity')."
},
"target": {
"type": "string",
"description": "Target reference path (e.g. 'audio.buses.ambient.gain')."
},
"scale": {
"type": "number",
"description": "Numeric source multiplier. Defaults to 1."
},
"offset": {
"type": "number",
"description": "Numeric offset applied after scaling. Defaults to 0."
},
"clamp": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {
"type": "number"
},
"description": "Inclusive [minimum, maximum] clamp applied to the transformed binding value."
},
"smoothing": {
"$ref": "#/definitions/DurationSpec",
"description": "Optional smoothing low-pass duration."
},
"when": {
"$ref": "#/definitions/ConditionSpec",
"description": "Optional condition; defaults to true."
}
}
},
"ValueSpec": {
"description": "Universal value expression (literal, reference, random, weighted choice, or operation).",
"oneOf": [
{
"type": "number",
"description": "Literal numeric constant."
},
{
"type": "boolean",
"description": "Literal boolean constant."
},
{
"type": "string",
"description": "Literal string or color constant."
},
{
"type": "object",
"required": [
"ref"
],
"additionalProperties": false,
"properties": {
"ref": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)+$",
"description": "Dot-separated reference path."
}
}
},
{
"type": "object",
"required": [
"random"
],
"additionalProperties": false,
"properties": {
"random": {
"type": "object",
"required": [
"min",
"max"
],
"additionalProperties": false,
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"integer": {
"type": "boolean"
},
"distribution": {
"type": "string",
"enum": [
"uniform",
"gaussian"
]
}
}
}
}
},
{
"type": "object",
"required": [
"choose"
],
"additionalProperties": false,
"properties": {
"choose": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": [
"value",
"weight"
],
"additionalProperties": false,
"properties": {
"value": {},
"weight": {
"type": "number",
"exclusiveMinimum": 0
}
}
}
}
}
},
{
"type": "object",
"required": [
"op",
"args"
],
"additionalProperties": false,
"properties": {
"op": {
"type": "string",
"enum": [
"abs",
"negate",
"round",
"floor",
"ceil",
"add",
"subtract",
"multiply",
"divide",
"min",
"max",
"clamp",
"lerp"
]
},
"args": {
"type": "array",
"items": {
"$ref": "#/definitions/ValueSpec"
}
}
}
}
]
},
"ConditionSpec": {
"description": "Boolean condition expression (comparison, and, or, not).",
"oneOf": [
{
"type": "object",
"required": [
"op",
"left",
"right"
],
"additionalProperties": false,
"properties": {
"op": {
"type": "string",
"enum": [
"eq",
"ne",
"gt",
"gte",
"lt",
"lte"
]
},
"left": {
"$ref": "#/definitions/ValueSpec"
},
"right": {
"$ref": "#/definitions/ValueSpec"
}
}
},
{
"type": "object",
"required": [
"and"
],
"additionalProperties": false,
"properties": {
"and": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ConditionSpec"
}
}
}
},
{
"type": "object",
"required": [
"or"
],
"additionalProperties": false,
"properties": {
"or": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ConditionSpec"
}
}
}
},
{
"type": "object",
"required": [
"not"
],
"additionalProperties": false,
"properties": {
"not": {
"$ref": "#/definitions/ConditionSpec"
}
}
}
]
},
"DurationSpec": {
"type": "string",
"pattern": "^([0-9]+(\\.[0-9]+)?)(ms|s|m|h)$",
"description": "Normalized duration literal string (e.g. '250ms', '4s', '1.5m', '1h')."
},
"AudioPartial": {
"type": "object",
"description": "One custom-waveform partial (Format Specification 14.7).",
"required": [
"ratio",
"gain"
],
"additionalProperties": false,
"properties": {
"ratio": {
"description": "Partial frequency as a multiple of the node frequency.",
"anyOf": [
{
"type": "number",
"minimum": 0.001,
"maximum": 256
},
{
"type": "object"
}
]
},
"gain": {
"description": "Linear amplitude relative to the fundamental.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"phase": {
"description": "Starting phase offset in degrees.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 360
},
{
"type": "object"
}
]
}
}
},
"AudioResonatorMode": {
"type": "object",
"description": "One resonator mode (Format Specification 15.10).",
"additionalProperties": false,
"oneOf": [
{
"required": [
"ratio"
]
},
{
"required": [
"frequency"
]
}
],
"properties": {
"ratio": {
"description": "Mode frequency as a multiple of the fundamental.",
"anyOf": [
{
"type": "number",
"minimum": 0.001,
"maximum": 256
},
{
"type": "object"
}
]
},
"frequency": {
"description": "Absolute mode frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.1,
"maximum": 24000
},
{
"type": "object"
}
]
},
"gain": {
"description": "Linear amplitude of the mode.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"decay": {
"$ref": "#/definitions/DurationSpec"
}
}
},
"AudioNode": {
"type": "object",
"description": "One audio graph node, keyed by node ID (Format Specification 14.3).",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"enum": [
"oscillator",
"noise",
"impulse",
"constant",
"lfo",
"sample-hold",
"gain",
"filter",
"compressor",
"waveshaper",
"delay",
"reverb",
"stereo-pan",
"mixer",
"resonator",
"component"
]
}
},
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "oscillator"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Oscillator (14.7).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"waveform": {
"type": "string",
"enum": [
"sine",
"triangle",
"square",
"sawtooth",
"custom"
]
},
"frequency": {
"description": "Frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.1,
"maximum": 24000
},
{
"type": "object"
}
]
},
"detune": {
"description": "Detune in cents.",
"anyOf": [
{
"type": "number",
"minimum": -4800,
"maximum": 4800
},
{
"type": "object"
}
]
},
"harmonics": {
"type": "array",
"minItems": 1,
"maxItems": 64,
"items": {
"$ref": "#/definitions/AudioPartial"
}
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "noise"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Noise (14.8).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"color": {
"type": "string",
"enum": [
"white",
"pink",
"brown"
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "impulse"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Impulse (14.9).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"color": {
"type": "string",
"enum": [
"white",
"pink",
"brown"
]
},
"duration": {
"$ref": "#/definitions/DurationSpec"
},
"amplitude": {
"description": "Peak amplitude.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"decay": {
"type": "string",
"enum": [
"flat",
"linear",
"exponential"
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "constant"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Constant control source (14.10).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"value": {
"description": "Constant control value.",
"anyOf": [
{
"type": "number",
"minimum": -1000,
"maximum": 1000
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "lfo"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "LFO control source (14.11).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"waveform": {
"type": "string",
"enum": [
"sine",
"triangle",
"square",
"sawtooth"
]
},
"frequency": {
"description": "LFO rate in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.001,
"maximum": 40
},
{
"type": "object"
}
]
},
"amplitude": {
"description": "Output amplitude.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1000
},
{
"type": "object"
}
]
},
"polarity": {
"type": "string",
"enum": [
"bipolar",
"unipolar"
]
},
"phase": {
"description": "Starting phase in degrees.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 360
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "sample-hold"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Sample-and-hold control source (14.12).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"rate": {
"description": "Tick rate in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.01,
"maximum": 100
},
{
"type": "object"
}
]
},
"min": {
"description": "Lower draw bound.",
"anyOf": [
{
"type": "number",
"minimum": -1000,
"maximum": 1000
},
{
"type": "object"
}
]
},
"max": {
"description": "Upper draw bound.",
"anyOf": [
{
"type": "number",
"minimum": -1000,
"maximum": 1000
},
{
"type": "object"
}
]
},
"slew": {
"$ref": "#/definitions/DurationSpec"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "gain"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Gain (15.2).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"gain": {
"description": "Linear gain.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 4
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "filter"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Filter (15.3).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"mode": {
"type": "string",
"enum": [
"lowpass",
"highpass",
"bandpass",
"notch",
"peaking",
"lowshelf",
"highshelf",
"allpass"
]
},
"frequency": {
"description": "Cutoff or center frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 10,
"maximum": 24000
},
{
"type": "object"
}
]
},
"q": {
"description": "Filter Q.",
"anyOf": [
{
"type": "number",
"minimum": 0.0001,
"maximum": 100
},
{
"type": "object"
}
]
},
"gain": {
"description": "Shelf or peak gain in dB.",
"anyOf": [
{
"type": "number",
"minimum": -40,
"maximum": 40
},
{
"type": "object"
}
]
},
"detune": {
"description": "Detune in cents.",
"anyOf": [
{
"type": "number",
"minimum": -4800,
"maximum": 4800
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "compressor"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Compressor (15.4).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"threshold": {
"description": "Threshold in dB.",
"anyOf": [
{
"type": "number",
"minimum": -100,
"maximum": 0
},
{
"type": "object"
}
]
},
"knee": {
"description": "Knee width in dB.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 40
},
{
"type": "object"
}
]
},
"ratio": {
"description": "Compression ratio.",
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 20
},
{
"type": "object"
}
]
},
"attack": {
"$ref": "#/definitions/DurationSpec"
},
"release": {
"$ref": "#/definitions/DurationSpec"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "waveshaper"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Waveshaper (15.5).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"shape": {
"type": "string",
"enum": [
"soft-clip",
"hard-clip",
"saturation"
]
},
"amount": {
"description": "Shaping amount.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"oversample": {
"type": "string",
"enum": [
"none",
"2x",
"4x"
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "delay"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Delay (15.6).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"time": {
"$ref": "#/definitions/DurationSpec"
},
"feedback": {
"description": "Internal feedback amount.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 0.95
},
{
"type": "object"
}
]
},
"mix": {
"description": "Dry/wet blend.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "reverb"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Reverb (15.7).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"size": {
"description": "Perceived space size.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"decay": {
"$ref": "#/definitions/DurationSpec"
},
"damping": {
"description": "High-frequency damping.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"predelay": {
"$ref": "#/definitions/DurationSpec"
},
"mix": {
"description": "Dry/wet blend.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "stereo-pan"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Stereo pan (15.8).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"pan": {
"description": "Stereo position.",
"anyOf": [
{
"type": "number",
"minimum": -1,
"maximum": 1
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "mixer"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Mixer (15.9).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "resonator"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Resonator (15.10).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"fundamental": {
"description": "Fundamental frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.1,
"maximum": 24000
},
{
"type": "object"
}
]
},
"modes": {
"type": "array",
"minItems": 1,
"maxItems": 16,
"items": {
"$ref": "#/definitions/AudioResonatorMode"
}
},
"mix": {
"description": "Dry/wet blend.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
}
},
"required": [
"type",
"modes"
]
}
},
{
"if": {
"properties": {
"type": {
"const": "component"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Component instance (15.11).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"use": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"values": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"required": [
"type",
"use"
]
}
}
]
},
"AudioRoute": {
"type": "object",
"description": "An audio or modulation route (Format Specification 15.12).",
"required": [
"from",
"to"
],
"additionalProperties": false,
"properties": {
"from": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"to": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)?$"
},
"depth": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"AudioNodeMap": {
"type": "object",
"minProperties": 1,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$",
"not": {
"enum": [
"output",
"input"
]
}
},
"additionalProperties": {
"$ref": "#/definitions/AudioNode"
}
},
"AudioRouteList": {
"type": "array",
"items": {
"$ref": "#/definitions/AudioRoute"
}
},
"AudioAutomationList": {
"type": "array",
"maxItems": 64,
"description": "Graph-local tracks (16.1); expanded totals and target capabilities are semantic checks.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"target",
"points"
],
"properties": {
"target": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*\\.[a-z][a-z0-9_-]*$"
},
"mode": {
"enum": [
"absolute",
"offset",
"scale"
],
"default": "absolute"
},
"interpolation": {
"enum": [
"step",
"linear",
"exponential",
"smooth"
],
"default": "linear"
},
"points": {
"type": "array",
"minItems": 2,
"maxItems": 256,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"at",
"value"
],
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"value": {
"allOf": [
{
"$ref": "#/definitions/ValueSpec"
},
{
"type": [
"number",
"object"
]
}
],
"description": "ValueSpec<number>; numeric references and expression leaves are checked semantically."
}
}
}
}
}
}
},
"AudioRecipe": {
"type": "object",
"description": "A recipe graph, or a reference to a shared recipe (15.16).",
"oneOf": [
{
"additionalProperties": false,
"required": [
"nodes"
],
"properties": {
"nodes": {
"$ref": "#/definitions/AudioNodeMap"
},
"routes": {
"$ref": "#/definitions/AudioRouteList"
},
"automation": {
"$ref": "#/definitions/AudioAutomationList"
},
"mode": {
"type": "string",
"enum": [
"oneshot",
"continuous"
]
},
"release": {
"$ref": "#/definitions/DurationSpec"
}
}
},
{
"additionalProperties": false,
"required": [
"use"
],
"properties": {
"use": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
}
}
]
},
"AudioComponent": {
"type": "object",
"description": "A reusable audio component graph (15.15).",
"required": [
"nodes"
],
"additionalProperties": false,
"properties": {
"nodes": {
"$ref": "#/definitions/AudioNodeMap"
},
"routes": {
"$ref": "#/definitions/AudioRouteList"
},
"automation": {
"$ref": "#/definitions/AudioAutomationList"
},
"input": {
"type": "boolean"
},
"parameters": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"const": "number"
},
"default": {
"type": "number"
},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"unit": {
"type": "string"
}
}
}
}
}
},
"AudioBus": {
"type": "object",
"description": "A declared bus (15.17).",
"additionalProperties": false,
"properties": {
"gain": {
"description": "Bus gain in [0, 4].",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 4
},
{
"type": "object"
}
]
}
}
},
"Sound": {
"type": "object",
"description": "A sound definition (15.16).",
"required": [
"name",
"recipe"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"tags": {
"type": "array",
"maxItems": 16,
"items": {
"type": "string",
"maxLength": 32
}
},
"usage": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"enum": [
"automatic",
"manual",
"scenario"
]
}
},
"cadence": {
"$ref": "#/definitions/SoundCadence"
},
"bus": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"recipe": {
"$ref": "#/definitions/AudioRecipe"
}
}
},
"CadenceClockRange": {
"type": "object",
"description": "Interval range for a cadence clock class (section 20.3).",
"required": [
"min",
"max"
],
"additionalProperties": false,
"properties": {
"min": {
"$ref": "#/definitions/DurationSpec"
},
"max": {
"$ref": "#/definitions/DurationSpec"
}
}
},
"SoundCadence": {
"type": "object",
"description": "Cadence configuration for a sound definition (section 20.4).",
"required": [
"class"
],
"additionalProperties": false,
"properties": {
"class": {
"type": "string",
"enum": [
"ambient",
"routine",
"intermittent",
"occasional",
"rare",
"scenario"
]
},
"weight": {
"$ref": "#/definitions/ValueSpec"
},
"cooldown": {
"$ref": "#/definitions/DurationSpec"
},
"overlap": {
"type": "boolean"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
}
}
},
"ActionSpec": {
"type": "object",
"description": "An Action Model 0.1 action (sections 22-30, 20.11-20.12).",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"enum": [
"set",
"override",
"sound",
"event",
"spawn",
"remove",
"control"
]
},
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
},
"chance": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"critical": {
"type": "boolean"
},
"target": {
"type": "string"
},
"value": {
"$ref": "#/definitions/ValueSpec"
},
"sound": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"event": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"command": {
"type": "string",
"enum": [
"start",
"stop",
"enable",
"disable",
"pause",
"resume",
"reset"
]
},
"with": {
"type": "object"
},
"scope": {
"type": "string",
"enum": [
"scenario",
"duration"
]
},
"duration": {
"$ref": "#/definitions/DurationSpec"
},
"lifetime": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"$ref": "#/definitions/ValueSpec"
}
]
},
"ownership": {
"type": "string",
"enum": [
"performance",
"scenario",
"persistent"
]
},
"transition": {
"type": "object"
}
}
},
"EventDefinition": {
"type": "object",
"description": "A reusable named action bundle (section 20.10, PRD 90).",
"required": [
"actions"
],
"additionalProperties": false,
"properties": {
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ParameterSpec"
}
},
"actions": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ActionSpec"
}
}
}
},
"VisualPoint": {
"type": "object",
"additionalProperties": false,
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
}
},
"description": "A geometry point. A point's z offsets the object's depth (17.9) and does not sort independently."
},
"VisualPaint": {
"description": "A flat color ValueSpec, a gradient paint object, or null (17.12).",
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/definitions/ValueSpec"
},
{
"type": "object",
"required": [
"type",
"stops"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"linear-gradient",
"radial-gradient",
"conic-gradient"
]
},
"stops": {
"type": "array",
"minItems": 2,
"maxItems": 16,
"items": {
"type": "object",
"required": [
"offset",
"color"
],
"additionalProperties": false,
"properties": {
"offset": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"color": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"from": {
"$ref": "#/definitions/VisualPoint"
},
"to": {
"$ref": "#/definitions/VisualPoint"
},
"center": {
"$ref": "#/definitions/VisualPoint"
},
"radius": {
"type": "number"
},
"innerRadius": {
"type": "number"
},
"angle": {
"type": "number"
}
}
}
]
},
"VisualStyle": {
"type": "object",
"additionalProperties": false,
"description": "Appearance (17.12). Inherited per field by a group's descendants.",
"properties": {
"fill": {
"$ref": "#/definitions/VisualPaint"
},
"stroke": {
"$ref": "#/definitions/VisualPaint"
},
"strokeWidth": {
"$ref": "#/definitions/ValueSpec"
},
"strokeCap": {
"enum": [
"butt",
"round",
"square"
]
},
"strokeJoin": {
"enum": [
"miter",
"round",
"bevel"
]
},
"strokeDash": {
"type": "array",
"minItems": 1,
"maxItems": 8,
"items": {
"type": "number"
}
},
"strokeDashOffset": {
"$ref": "#/definitions/ValueSpec"
},
"pointSize": {
"$ref": "#/definitions/ValueSpec"
},
"opacity": {
"$ref": "#/definitions/ValueSpec"
},
"blend": {
"enum": [
"normal",
"add",
"screen",
"multiply",
"overlay",
"lighten",
"darken",
"difference"
]
},
"glow": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"color": {
"$ref": "#/definitions/ValueSpec"
},
"radius": {
"type": "number"
},
"strength": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
]
},
"shadow": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"color": {
"$ref": "#/definitions/ValueSpec"
},
"blurRadius": {
"type": "number"
},
"offsetX": {
"type": "number"
},
"offsetY": {
"type": "number"
}
}
}
]
},
"blur": {
"$ref": "#/definitions/ValueSpec"
},
"filters": {
"type": "array",
"maxItems": 4,
"items": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"brightness",
"contrast",
"saturate",
"hue-rotate",
"grayscale",
"sepia",
"invert"
]
},
"amount": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"clip": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"shape",
"x",
"y",
"width",
"height"
],
"additionalProperties": false,
"properties": {
"shape": {
"enum": [
"rectangle",
"ellipse"
]
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
}
}
}
]
},
"mask": {
"type": [
"string",
"null"
]
}
}
},
"VisualTransform": {
"type": "object",
"additionalProperties": false,
"description": "Transform model (17.11). Composition order is normative.",
"properties": {
"translate": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"rotation": {
"$ref": "#/definitions/ValueSpec"
},
"scale": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"skew": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"origin": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
}
}
},
"VisualBehavior": {
"type": "object",
"required": [
"type"
],
"description": "Behavior instance (18.6). Type-specific fields are validated semantically.",
"properties": {
"type": {
"enum": [
"drift",
"rotate",
"oscillate",
"orbit",
"wander",
"follow-path",
"point-wander",
"pulse",
"twinkle",
"noise-displace",
"face-motion",
"wrap",
"bounce",
"attract",
"repel",
"field-follow",
"morph"
]
}
}
},
"VisualDistribution": {
"type": "object",
"required": [
"type"
],
"description": "Placement distribution (18.3). A path distribution carries inline commands; sibling keys have no container at system scope.",
"properties": {
"type": {
"enum": [
"point",
"uniform",
"line",
"rectangle",
"ellipse",
"ring",
"path",
"grid",
"depth"
]
}
}
},
"VisualObject": {
"type": "object",
"required": [
"type"
],
"description": "A visual object: one of the fourteen primitives of Visual Primitive Set 0.1, or the `component` object type of 18.1. Carries no `id`; its key in the containing map is its identity (17.8).",
"properties": {
"type": {
"enum": [
"point",
"line",
"polyline",
"polygon",
"rectangle",
"rounded-rectangle",
"ellipse",
"arc",
"ring",
"path",
"bezier",
"spline",
"text",
"group",
"component"
]
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"z": {
"$ref": "#/definitions/ValueSpec"
},
"size": {
"type": "object",
"additionalProperties": false,
"properties": {
"width": {
"$ref": "#/definitions/ValueSpec"
},
"height": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"transform": {
"$ref": "#/definitions/VisualTransform"
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"to": {
"$ref": "#/definitions/VisualPoint"
},
"c": {
"$ref": "#/definitions/VisualPoint"
},
"c1": {
"$ref": "#/definitions/VisualPoint"
},
"c2": {
"$ref": "#/definitions/VisualPoint"
},
"points": {
"type": "array",
"minItems": 2,
"maxItems": 512,
"items": {
"$ref": "#/definitions/VisualPoint"
}
},
"radius": {},
"innerRadius": {
"type": "number"
},
"startAngle": {
"type": "number"
},
"endAngle": {
"type": "number"
},
"direction": {
"enum": [
"clockwise",
"counter-clockwise"
]
},
"commands": {
"type": "array",
"minItems": 1,
"maxItems": 512,
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"enum": [
"move",
"line",
"quadratic",
"cubic",
"arc",
"close"
]
}
}
}
},
"fillRule": {
"enum": [
"nonzero",
"evenodd"
]
},
"mode": {
"enum": [
"catmull-rom",
"bezier",
"linear"
]
},
"closed": {
"type": "boolean"
},
"tension": {
"$ref": "#/definitions/ValueSpec"
},
"text": {
"$ref": "#/definitions/ValueSpec"
},
"font": {
"enum": [
"sans-serif",
"serif",
"monospace"
]
},
"weight": {
"enum": [
"normal",
"bold"
]
},
"italic": {
"type": "boolean"
},
"align": {
"enum": [
"left",
"center",
"right"
]
},
"baseline": {
"enum": [
"top",
"middle",
"alphabetic",
"bottom"
]
},
"letterSpacing": {
"$ref": "#/definitions/ValueSpec"
},
"maxWidth": {
"$ref": "#/definitions/ValueSpec"
},
"children": {
"type": "object",
"minProperties": 1,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualObject"
}
},
"component": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ValueSpec"
}
},
"trail": false,
"id": false
},
"additionalProperties": false
},
"VisualObjectMap": {
"type": "object",
"minProperties": 1,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualObject"
},
"description": "Visual objects keyed by object ID (17.8)."
},
"VisualComponent": {
"type": "object",
"required": [
"content"
],
"additionalProperties": false,
"description": "Reusable visual sub-assembly (18.1).",
"properties": {
"parameters": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"number",
"boolean",
"string",
"color"
]
},
"default": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"unit": {
"type": "string"
}
}
}
},
"content": {
"$ref": "#/definitions/VisualObjectMap"
},
"transform": {
"$ref": "#/definitions/VisualTransform"
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
}
}
},
"VisualTrail": {
"type": "object",
"additionalProperties": false,
"description": "Trail or ribbon (18.8). Declared on the system, never on a render object.",
"properties": {
"length": {
"type": "integer",
"minimum": 2,
"maximum": 128
},
"interval": {
"$ref": "#/definitions/DurationSpec"
},
"mode": {
"enum": [
"line",
"ribbon",
"points"
]
},
"width": {
"$ref": "#/definitions/ValueSpec"
},
"taper": {
"$ref": "#/definitions/ValueSpec"
},
"fade": {
"$ref": "#/definitions/ValueSpec"
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"curve": {
"enum": [
"linear",
"catmull-rom"
]
}
}
},
"VisualLinks": {
"type": "object",
"additionalProperties": false,
"description": "Distance links (18.8).",
"properties": {
"rule": {
"enum": [
"distance",
"nearest",
"index"
]
},
"maxDistance": {
"$ref": "#/definitions/ValueSpec"
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 8
},
"stride": {
"type": "integer",
"minimum": 1
},
"closed": {
"type": "boolean"
},
"maxLinks": {
"type": "integer",
"minimum": 1,
"maximum": 1024
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"fadeWithDistance": {
"type": "boolean"
}
}
},
"VisualAutomationTrack": {
"type": "object",
"required": [
"target",
"points"
],
"additionalProperties": false,
"description": "Visual automation track (19.1). `at` is a duration literal only.",
"properties": {
"target": {
"type": "string"
},
"mode": {
"enum": [
"absolute",
"offset",
"scale"
]
},
"interpolation": {
"enum": [
"step",
"linear",
"exponential",
"smooth"
]
},
"loop": {
"type": "object",
"required": [
"mode"
],
"additionalProperties": false,
"properties": {
"mode": {
"enum": [
"repeat",
"ping-pong"
]
},
"count": {
"oneOf": [
{
"const": "infinite"
},
{
"type": "integer",
"minimum": 1
}
]
}
}
},
"points": {
"type": "array",
"minItems": 2,
"maxItems": 256,
"items": {
"type": "object",
"required": [
"at",
"value"
],
"additionalProperties": false,
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"value": {
"$ref": "#/definitions/ValueSpec"
}
}
}
}
}
},
"VisualSpawn": {
"type": "object",
"additionalProperties": false,
"description": "Spawned-instance lifecycle configuration (19.2). Its `lifetime` is the instance's, never an item's.",
"properties": {
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"release": {
"$ref": "#/definitions/DurationSpec"
},
"ownership": {
"const": "persistent"
},
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"number",
"boolean",
"string",
"color"
]
},
"default": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"unit": {
"type": "string"
}
}
}
},
"cancelWithScenario": {
"type": "boolean"
}
}
},
"VisualSystem": {
"required": [
"type"
],
"description": "A visual system (17.7). The addressable unit of the visual subsystem.",
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"content"
],
"properties": {
"type": {
"const": "graphic"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"content": {
"$ref": "#/definitions/VisualObjectMap"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"render"
],
"properties": {
"type": {
"const": "particles"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"velocity": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"acceleration": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"drag": {
"$ref": "#/definitions/ValueSpec"
},
"distribution": {
"$ref": "#/definitions/VisualDistribution"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"fields": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"burst": {
"type": "array",
"maxItems": 16,
"items": {
"type": "object",
"required": [
"at",
"count"
],
"additionalProperties": false,
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"count": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"rate": {
"$ref": "#/definitions/ValueSpec"
},
"limit": {
"type": "integer",
"minimum": 1
},
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"render": {
"$ref": "#/definitions/VisualObject"
},
"capacity": {
"type": "integer",
"minimum": 1,
"maximum": 4096
},
"count": {
"$ref": "#/definitions/ValueSpec"
},
"size": {},
"rotation": {
"$ref": "#/definitions/ValueSpec"
},
"angularVelocity": {
"$ref": "#/definitions/ValueSpec"
},
"opacity": {},
"color": {},
"z": {
"$ref": "#/definitions/ValueSpec"
},
"trail": {
"$ref": "#/definitions/VisualTrail"
},
"links": {
"$ref": "#/definitions/VisualLinks"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"emit"
],
"properties": {
"type": {
"const": "emitter"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"velocity": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"acceleration": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"drag": {
"$ref": "#/definitions/ValueSpec"
},
"distribution": {
"$ref": "#/definitions/VisualDistribution"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"fields": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"burst": {
"type": "array",
"maxItems": 16,
"items": {
"type": "object",
"required": [
"at",
"count"
],
"additionalProperties": false,
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"count": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"rate": {
"$ref": "#/definitions/ValueSpec"
},
"limit": {
"type": "integer",
"minimum": 1
},
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"emit": {
"$ref": "#/definitions/VisualObject"
},
"capacity": {
"type": "integer",
"minimum": 1,
"maximum": 512
},
"align": {
"type": "boolean"
},
"trail": {
"$ref": "#/definitions/VisualTrail"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"repeat",
"count"
],
"properties": {
"type": {
"const": "repeater"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"repeat": {
"$ref": "#/definitions/VisualObject"
},
"count": {
"$ref": "#/definitions/ValueSpec"
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"distribution": {
"$ref": "#/definitions/VisualDistribution"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"fields": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"links": {
"$ref": "#/definitions/VisualLinks"
}
}
}
]
},
"VisualField": {
"type": "object",
"required": [
"type"
],
"description": "Procedural field (18.7). Fields draw nothing; systems and behaviors read them.",
"properties": {
"type": {
"enum": [
"directional",
"radial",
"vortex",
"attractor",
"repulsor",
"noise"
]
},
"bounds": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
}
}
},
"enabled": {
"$ref": "#/definitions/ValueSpec"
},
"direction": {
"type": "number"
},
"strength": {
"type": "number"
},
"center": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"falloff": {
"enum": [
"none",
"linear",
"inverse",
"inverse-square"
]
},
"minDistance": {
"type": "number"
},
"maxDistance": {
"type": "number"
},
"scale": {
"type": "number",
"exclusiveMinimum": 0
},
"speed": {
"type": "number"
},
"octaves": {
"type": "integer",
"minimum": 1,
"maximum": 4
},
"persistence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"amplitude": {
"type": "number"
},
"mode": {
"enum": [
"curl",
"gradient",
"value"
]
},
"size": {
"type": "object",
"additionalProperties": false,
"properties": {
"width": {
"$ref": "#/definitions/ValueSpec"
},
"height": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"additionalProperties": false
},
"VisualEffect": {
"type": "object",
"required": [
"type"
],
"description": "Post-effect entry (19.4), applied in normative array order.",
"properties": {
"type": {
"enum": [
"vignette",
"scanlines",
"grain",
"color-adjust",
"blur",
"bloom",
"fade"
]
},
"enabled": {
"$ref": "#/definitions/ValueSpec"
},
"amount": {
"$ref": "#/definitions/ValueSpec"
},
"radius": {
"$ref": "#/definitions/ValueSpec"
},
"softness": {
"$ref": "#/definitions/ValueSpec"
},
"color": {
"type": "string",
"description": "Color literal (section 2)."
},
"spacing": {
"$ref": "#/definitions/ValueSpec"
},
"thickness": {
"$ref": "#/definitions/ValueSpec"
},
"speed": {
"$ref": "#/definitions/ValueSpec"
},
"scale": {
"$ref": "#/definitions/ValueSpec"
},
"brightness": {
"$ref": "#/definitions/ValueSpec"
},
"contrast": {
"$ref": "#/definitions/ValueSpec"
},
"saturation": {
"$ref": "#/definitions/ValueSpec"
},
"hueRotate": {
"$ref": "#/definitions/ValueSpec"
},
"threshold": {
"$ref": "#/definitions/ValueSpec"
},
"intensity": {
"$ref": "#/definitions/ValueSpec"
}
},
"additionalProperties": false
}
}
}