Stage 0 of the five-stage plan in reviews/02-application-code-triage.md: the shared pre-renderer alignment that has to land before slice 4d writes renderer code, so the runtime foundation and Format Specification revision 0.8 cannot drift while three slices are built on top of them. Nothing here draws. The JSON Schema's `visuals` definition was a Phase 0 stub of `camera`, `systems`, and `passes`. It is replaced by the real container - scene, layers, systems, fields, camera, effects, and the exhibit-scope `automation` array that 17.3 previously rejected while 19.1 authorized. Fourteen new definitions cover visual objects, paints, styles, transforms, behaviors, distributions, trails, links, automation tracks, the spawn container, and visual components, and `components.visual` is no longer an unconstrained object. Structural exclusions carry the contract's own prohibitions: no `id` on a visual object, no `links` on an emitter, no `trail` on a render object, and none of the four spawn-only lifecycle names at a system's top level. src/runtime/visual-contract.js is new and plays the role audio-contract.js plays for sections 14-16: the primitive, system, behavior, field, distribution, blend, filter, and post-effect vocabularies; the post-effect parameter tables with their ranges and pass costs; the centralized ceiling table of 19.5 split into authoring bounds and runtime ceilings; and matchVisualTarget, which resolves a path against the four section 8.1 visual target families and distinguishes a dangling reference from a target that exposes no capability. src/runtime/visual-validation.js is new and validates the shared surface: the visuals container, the scene model including the conditional viewport `fit` rule, layers including the rule that a present layer map makes a system's `layer` required, the common system fields and the `spawn` container, procedural fields including the conditional noise `direction`, the post-effect chain, and visual automation with its two declaration scopes, its automatable registry, its loop modes, and its authoring bound. Type-specific system fields are carried through unvalidated and are tightened by 4d, 4e, and 4f. The resolution engine now exposes the four visual families. `target()` returns a capability record with a per-family stage table, replacing the hardcoded `namespace === 'buses'` test for the automation and modulation stages, so a boolean system `visible` correctly has neither. Visual bases sample once from the `visual` stream domain at the exhibit-scope instantiation boundary, fall back to their documented defaults - including the scene center for an unauthored camera position - and clamp through the shared 8.1 safety stage, so a `focalLength` that resolves below 1 becomes 1 rather than dividing by zero. `requireAudioStage` becomes `requireStage(path, stage)` with the old name kept as its automation wrapper. The validator's binding-target check is no longer a regex over two families. It reports ERR_INVALID_REFERENCE for an undeclared layer, system, or effect index and ERR_UNSUPPORTED_TARGET for everything outside the four rows - per-object properties, field strengths, emitter rates - which is the distinction trace 14 of 17.16 and trace 4 of 19.7 both check. exhibits/minimal-visual.xzbt is a new fixture exercising the aligned surface: two layers, a graphic system with system-scope automation, a repeater over a component, a particle system reading a declared field, a spawned emitter with its spawn container, two post-effects, and three bindings reaching three of the four target families. test/phase4-visual-contract.test.mjs adds 29 tests. `npm test` goes from 102 to 131 passing with zero failures; no existing test changed. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0162Jb1J36judZNT8fHabGVt
3486 lines
86 KiB
JSON
3486 lines
86 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 and pulse pools.",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"clocks": {
|
|
"type": "object"
|
|
},
|
|
"pools": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
},
|
|
"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.",
|
|
"patternProperties": {
|
|
"^[a-z][a-z0-9_-]*$": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"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": {
|
|
"type": "object"
|
|
},
|
|
"bus": {
|
|
"type": "string",
|
|
"pattern": "^[a-z][a-z0-9_-]*$"
|
|
},
|
|
"recipe": {
|
|
"$ref": "#/definitions/AudioRecipe"
|
|
}
|
|
}
|
|
},
|
|
"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"
|
|
},
|
|
"release": false,
|
|
"ownership": false,
|
|
"inputs": false,
|
|
"cancelWithScenario": false,
|
|
"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"
|
|
},
|
|
"release": false,
|
|
"ownership": false,
|
|
"inputs": false,
|
|
"cancelWithScenario": false,
|
|
"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"
|
|
},
|
|
"release": false,
|
|
"ownership": false,
|
|
"inputs": false,
|
|
"cancelWithScenario": false,
|
|
"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"
|
|
},
|
|
"links": false
|
|
}
|
|
},
|
|
{
|
|
"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"
|
|
},
|
|
"release": false,
|
|
"ownership": false,
|
|
"inputs": false,
|
|
"cancelWithScenario": false,
|
|
"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"
|
|
},
|
|
"rate": false,
|
|
"burst": false,
|
|
"limit": false,
|
|
"capacity": false,
|
|
"lifetime": false
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"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
|
|
}
|
|
}
|
|
}
|