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
3654 lines
90 KiB
JSON
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
|
|
}
|
|
}
|
|
}
|