{ "$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; 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 } } }