Fountain Coach Gitowner-controlled · read only

midi2.git · midi2.full.openapi.json

midi2.git / midi2.full.openapi.json

revision c3855377e0f3c2f289d49bbefb1360e47595d9ef · bounded preview

{
  "openapi": "3.1.0",
  "info": {
    "title": "MIDI 2.0 \u2014 Full Spec API (Expanded, Closed)",
    "version": "1.0.0",
    "description": "OpenAPI 3.1 generated from the fully closed, expanded MIDI 2.0 JSON Schema."
  },
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "paths": {
    "/validate/ump": {
      "post": {
        "summary": "Validate a single UMP packet",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UmpPacket"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/ingest/stream": {
      "post": {
        "summary": "Submit an array of UMP packets (stream order)",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/UmpPacket"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "UmpPacket": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/UmpPacket32"
          },
          {
            "$ref": "#/components/schemas/UmpPacket64"
          },
          {
            "$ref": "#/components/schemas/UmpPacket128"
          }
        ],
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP message types and packet sizes",
            "requirement": "ump-packet-structure-umppacket"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UmpPacketsTests.swift"
          }
        ]
      },
      "Uint4": {
        "type": "integer",
        "minimum": 0,
        "maximum": 15,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint4"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint7": {
        "type": "integer",
        "minimum": 0,
        "maximum": 127,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint7"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint8": {
        "type": "integer",
        "minimum": 0,
        "maximum": 255,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint8"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint14": {
        "type": "integer",
        "minimum": 0,
        "maximum": 16383,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint14"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint16": {
        "type": "integer",
        "minimum": 0,
        "maximum": 65535,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint16"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint21": {
        "type": "integer",
        "minimum": 0,
        "maximum": 2097151,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint21"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint28": {
        "type": "integer",
        "minimum": 0,
        "maximum": 268435455,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint28"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Uint32": {
        "type": "integer",
        "minimum": 0,
        "maximum": 4294967295,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-uint32"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "Int32": {
        "type": "integer",
        "minimum": -2147483648,
        "maximum": 2147483647,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-int32"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "ByteArray": {
        "type": "array",
        "items": {
          "$ref": "#/$defs/Uint8"
        },
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP field widths and numeric ranges",
            "requirement": "ump-field-widths-bytearray"
          }
        ],
        "x-verification": [
          {
            "kind": "schema-verifier",
            "id": "Scripts/verify_spec_provenance.py::schema-constraint-validation"
          }
        ]
      },
      "UmpMessageType": {
        "type": "integer",
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          13,
          15
        ],
        "description": "UMP Message Type nibble: 0=Utility,1=System,2=MIDI1 Ch Voice,3=SysEx7,4=MIDI2 Ch Voice,5=SysEx8/MDS,13=Flex,15=Stream.",
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP message types and packet sizes",
            "requirement": "ump-packet-structure-umpmessagetype"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UmpPacketsTests.swift"
          }
        ]
      },
      "Group": {
        "$ref": "#/$defs/Uint4",
        "description": "MIDI Group (0-15). Utility (0x0) and Stream (0xF) are groupless in v1.1+; set 0.",
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 37,
            "section": "Figures 18-23 and stream messages",
            "requirement": "ump-stream-structure-group"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/StreamMappingTests.swift"
          }
        ]
      },
      "UmpHeader32": {
        "type": "object",
        "required": [
          "messageType"
        ],
        "properties": {
          "messageType": {
            "enum": [
              0,
              1,
              2,
              3,
              15
            ]
          },
          "group": {
            "$ref": "#/$defs/Group"
          }
        },
        "description": "Common 32-bit UMP header (messageType + optional group).",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 37,
            "section": "Figures 18-23 and stream messages",
            "requirement": "ump-stream-structure-umpheader32"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/StreamMappingTests.swift"
          }
        ]
      },
      "UmpHeader64": {
        "type": "object",
        "required": [
          "messageType",
          "group",
          "statusNibble",
          "channel"
        ],
        "properties": {
          "messageType": {
            "const": 4
          },
          "group": {
            "$ref": "#/$defs/Group"
          },
          "statusNibble": {
            "type": "integer",
            "minimum": 8,
            "maximum": 15
          },
          "channel": {
            "$ref": "#/$defs/Uint4"
          }
        },
        "description": "64-bit UMP header for MIDI 2.0 Channel Voice.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 37,
            "section": "Figures 18-23 and stream messages",
            "requirement": "ump-stream-structure-umpheader64"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/StreamMappingTests.swift"
          }
        ]
      },
      "UmpHeader128": {
        "type": "object",
        "required": [
          "messageType"
        ],
        "properties": {
          "messageType": {
            "enum": [
              5,
              13
            ]
          },
          "group": {
            "$ref": "#/$defs/Group"
          }
        },
        "description": "128-bit UMP header for Data (SysEx8/MDS) and Flex Data.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 37,
            "section": "Figures 18-23 and stream messages",
            "requirement": "ump-stream-structure-umpheader128"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/StreamMappingTests.swift"
          }
        ]
      },
      "UtilityOpcode": {
        "type": "integer",
        "enum": [
          0,
          1,
          2
        ],
        "description": "0=NOOP,1=JR Clock,2=JR Timestamp",
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 44,
            "section": "Utility and System messages",
            "requirement": "utility-system-structure-utilityopcode"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UtilityBodyTests.swift"
          }
        ]
      },
      "UtilityBody": {
        "type": "object",
        "required": [
          "opcode"
        ],
        "properties": {
          "opcode": {
            "$ref": "#/$defs/UtilityOpcode"
          },
          "jrClock": {
            "type": "object",
            "required": [
              "timestamp32"
            ],
            "properties": {
              "timestamp32": {
                "$ref": "#/$defs/Uint32"
              }
            },
            "description": "Present when opcode=1",
            "additionalProperties": false
          },
          "jrTimestamp": {
            "type": "object",
            "required": [
              "time15"
            ],
            "properties": {
              "time15": {
                "type": "integer",
                "minimum": 0,
                "maximum": 32767
              }
            },
            "description": "Present when opcode=2",
            "additionalProperties": false
          }
        },
        "description": "UMP Type 0x0 Utility messages (groupless).",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 44,
            "section": "Utility and System messages",
            "requirement": "utility-system-structure-utilitybody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UtilityBodyTests.swift"
          }
        ]
      },
      "SystemStatus": {
        "type": "integer",
        "enum": [
          241,
          242,
          243,
          246,
          248,
          250,
          251,
          252,
          254,
          255
        ],
        "description": "MIDI System Common/Real-Time per UMP.",
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 44,
            "section": "Utility and System messages",
            "requirement": "utility-system-structure-systemstatus"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UtilityBodyTests.swift"
          }
        ]
      },
      "SystemCommonRealtimeBody": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "$ref": "#/$defs/SystemStatus"
          },
          "data1": {
            "$ref": "#/$defs/Uint8"
          },
          "data2": {
            "$ref": "#/$defs/Uint8"
          }
        },
        "description": "UMP 0x1 System Common & Real-Time.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 44,
            "section": "Utility and System messages",
            "requirement": "utility-system-structure-systemcommonrealtimebody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UtilityBodyTests.swift"
          }
        ]
      },
      "Midi1StatusNibble": {
        "type": "integer",
        "enum": [
          8,
          9,
          10,
          11,
          12,
          13,
          14
        ],
        "description": "0x8..0xE",
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 52,
            "section": "MIDI 1.0 Channel Voice messages",
            "requirement": "midi1-channel-voice-midi1statusnibble"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi1ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "Midi1ChannelVoiceBody": {
        "type": "object",
        "required": [
          "statusNibble",
          "channel"
        ],
        "properties": {
          "statusNibble": {
            "$ref": "#/$defs/Midi1StatusNibble"
          },
          "channel": {
            "$ref": "#/$defs/Uint4"
          },
          "noteNumber": {
            "$ref": "#/$defs/Uint7"
          },
          "velocity7": {
            "$ref": "#/$defs/Uint7"
          },
          "pressure7": {
            "$ref": "#/$defs/Uint7"
          },
          "control": {
            "$ref": "#/$defs/Uint7"
          },
          "value7": {
            "$ref": "#/$defs/Uint7"
          },
          "program": {
            "$ref": "#/$defs/Uint7"
          },
          "pitchBend14": {
            "$ref": "#/$defs/Uint14"
          }
        },
        "description": "Messages share this body, with relevant fields set based on status.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 52,
            "section": "MIDI 1.0 Channel Voice messages",
            "requirement": "midi1-channel-voice-midi1channelvoicebody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi1ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "SysEx7Packet": {
        "type": "object",
        "required": [
          "streamStatus",
          "payload"
        ],
        "properties": {
          "streamStatus": {
            "type": "string",
            "enum": [
              "single",
              "start",
              "continue",
              "end"
            ]
          },
          "payload": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/Uint8"
            },
            "maxItems": 6,
            "minItems": 0
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 50,
            "section": "SysEx and data messages",
            "requirement": "data-message-structure-sysex7packet"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/DataMessageBodyTests.swift"
          }
        ]
      },
      "SysEx7Body": {
        "type": "object",
        "required": [
          "manufacturerId",
          "packets"
        ],
        "properties": {
          "manufacturerId": {
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/Uint8"
                },
                "minItems": 1,
                "maxItems": 1
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/Uint8"
                },
                "minItems": 3,
                "maxItems": 3
              }
            ]
          },
          "packets": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/SysEx7Packet"
            },
            "minItems": 1
          }
        },
        "description": "7-bit clean stream framed in 32-bit UMP words (up to 6 bytes per word).",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 50,
            "section": "SysEx and data messages",
            "requirement": "data-message-structure-sysex7body"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/DataMessageBodyTests.swift"
          }
        ]
      },
      "Midi2StatusNibble": {
        "type": "integer",
        "enum": [
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15
        ],
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 56,
            "section": "MIDI 2.0 Channel Voice messages",
            "requirement": "midi2-channel-voice-midi2statusnibble"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi2ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "NoteAttributeType": {
        "type": "integer",
        "minimum": 0,
        "maximum": 255,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 56,
            "section": "MIDI 2.0 Channel Voice messages",
            "requirement": "midi2-channel-voice-noteattributetype"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi2ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "Midi2ChannelVoiceBody": {
        "type": "object",
        "required": [
          "statusNibble",
          "channel"
        ],
        "properties": {
          "statusNibble": {
            "$ref": "#/$defs/Midi2StatusNibble"
          },
          "channel": {
            "$ref": "#/$defs/Uint4"
          },
          "noteNumber": {
            "$ref": "#/$defs/Uint7"
          },
          "velocity16": {
            "$ref": "#/$defs/Uint16"
          },
          "attributeType": {
            "$ref": "#/$defs/NoteAttributeType"
          },
          "attributeData16": {
            "$ref": "#/$defs/Uint16"
          },
          "polyPressure32": {
            "$ref": "#/$defs/Uint32"
          },
          "control": {
            "$ref": "#/$defs/Uint7"
          },
          "controlValue32": {
            "$ref": "#/$defs/Uint32"
          },
          "program": {
            "$ref": "#/$defs/Uint7"
          },
          "bankMsb": {
            "$ref": "#/$defs/Uint7"
          },
          "bankLsb": {
            "$ref": "#/$defs/Uint7"
          },
          "bankValid": {
            "type": "boolean"
          },
          "channelPressure32": {
            "$ref": "#/$defs/Uint32"
          },
          "pitchBend32": {
            "$ref": "#/$defs/Uint32"
          },
          "rpnIndexMsb": {
            "$ref": "#/$defs/Uint7"
          },
          "rpnIndexLsb": {
            "$ref": "#/$defs/Uint7"
          },
          "rpnData32": {
            "$ref": "#/$defs/Uint32"
          },
          "nrpnIndexMsb": {
            "$ref": "#/$defs/Uint7"
          },
          "nrpnIndexLsb": {
            "$ref": "#/$defs/Uint7"
          },
          "nrpnData32": {
            "$ref": "#/$defs/Uint32"
          },
          "rpnDelta32": {
            "$ref": "#/$defs/Int32"
          },
          "nrpnDelta32": {
            "$ref": "#/$defs/Int32"
          },
          "perNoteMgmt": {
            "type": "object",
            "properties": {
              "noteNumber": {
                "$ref": "#/$defs/Uint7"
              },
              "detach": {
                "type": "boolean",
                "description": "D bit"
              },
              "reset": {
                "type": "boolean",
                "description": "S bit"
              }
            },
            "additionalProperties": false
          },
          "regPerNoteCtrlIndex": {
            "$ref": "#/$defs/Uint8"
          },
          "regPerNoteCtrlValue32": {
            "$ref": "#/$defs/Uint32"
          },
          "assignPerNoteCtrlIndex": {
            "$ref": "#/$defs/Uint8"
          },
          "assignPerNoteCtrlValue32": {
            "$ref": "#/$defs/Uint32"
          }
        },
        "description": "Only fields relevant to the specific status are present.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 56,
            "section": "MIDI 2.0 Channel Voice messages",
            "requirement": "midi2-channel-voice-midi2channelvoicebody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi2ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "DataMessageKind": {
        "type": "string",
        "enum": [
          "sysex8",
          "mds"
        ],
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 50,
            "section": "SysEx and data messages",
            "requirement": "data-message-structure-datamessagekind"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/DataMessageBodyTests.swift"
          }
        ]
      },
      "DataMessageBody": {
        "type": "object",
        "required": [
          "kind"
        ],
        "properties": {
          "kind": {
            "$ref": "#/$defs/DataMessageKind"
          },
          "sysex8": {
            "type": "object",
            "required": [
              "manufacturerId",
              "length",
              "data"
            ],
            "properties": {
              "manufacturerId": {
                "oneOf": [
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/$defs/Uint8"
                    },
                    "minItems": 1,
                    "maxItems": 1
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/$defs/Uint8"
                    },
                    "minItems": 3,
                    "maxItems": 3
                  }
                ]
              },
              "length": {
                "$ref": "#/$defs/Uint28"
              },
              "data": {
                "$ref": "#/$defs/ByteArray"
              }
            },
            "description": "8-bit clean SysEx8 payload",
            "additionalProperties": false
          },
          "mds": {
            "type": "object",
            "required": [
              "messageId",
              "totalChunks",
              "chunks"
            ],
            "properties": {
              "messageId": {
                "$ref": "#/$defs/Uint16"
              },
              "totalChunks": {
                "$ref": "#/$defs/Uint16"
              },
              "chunks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "index",
                    "validByteCount",
                    "payload"
                  ],
                  "properties": {
                    "index": {
                      "$ref": "#/$defs/Uint16"
                    },
                    "validByteCount": {
                      "$ref": "#/$defs/Uint8"
                    },
                    "payload": {
                      "type": "array",
                      "items": {
                        "$ref": "#/$defs/Uint8"
                      },
                      "maxItems": 14
                    }
                  },
                  "additionalProperties": false
                }
              }
            },
            "description": "Mixed Data Set chunking for large transfers",
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 50,
            "section": "SysEx and data messages",
            "requirement": "data-message-structure-datamessagebody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/DataMessageBodyTests.swift"
          }
        ]
      },
      "FlexDataBody": {
        "oneOf": [
          {
            "$ref": "#/$defs/Flex.Tempo"
          },
          {
            "$ref": "#/$defs/Flex.TimeSignature"
          },
          {
            "$ref": "#/$defs/Flex.Metronome"
          },
          {
            "$ref": "#/$defs/Flex.KeySignature"
          },
          {
            "$ref": "#/$defs/Flex.ChordName"
          },
          {
            "$ref": "#/$defs/Flex.Text"
          },
          {
            "$ref": "#/$defs/Flex.Lyric"
          },
          {
            "$ref": "#/$defs/Flex.Ruby"
          }
        ],
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 89,
            "section": "Flex Data messages",
            "requirement": "flex-data-structure-flexdatabody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/FlexDataBodyTests.swift"
          }
        ]
      },
      "StreamOpcode": {
        "type": "integer",
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          16,
          17,
          18,
          32,
          33
        ],
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 37,
            "section": "Figures 18-23 and stream messages",
            "requirement": "ump-stream-structure-streamopcode"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/StreamMappingTests.swift"
          }
        ]
      },
      "StreamBody": {
        "type": "object",
        "required": [
          "opcode"
        ],
        "properties": {
          "opcode": {
            "$ref": "#/$defs/StreamOpcode"
          },
          "endpointDiscovery": {
            "type": "object",
            "properties": {
              "majorVersion": {
                "$ref": "#/$defs/Uint8"
              },
              "minorVersion": {
                "$ref": "#/$defs/Uint8"
              },
              "maxGroups": {
                "$ref": "#/$defs/Uint4"
              },
              "filter": {
                "type": "object",
                "description": "Filter bitmap (Figure 12, M2-104-UM v1.1.2 p.33)",
                "properties": {
                  "endpointInfo": {
                    "type": "boolean",
                    "description": "Request Endpoint Info Notification"
                  },
                  "deviceIdentity": {
                    "type": "boolean",
                    "description": "Request Device Identity Notification"
                  },
                  "endpointName": {
                    "type": "boolean",
                    "description": "Request Endpoint Name Notification"
                  },
                  "productInstanceId": {
                    "type": "boolean",
                    "description": "Request Product Instance ID Notification"
                  },
                  "streamConfig": {
                    "type": "boolean",
                    "description": "Request Stream Configuration Notification"
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "endpointInfoNotification": {
            "type": "object",
            "properties": {
              "staticFunctionBlocks": {
                "type": "boolean",
                "description": "S bit; when true Function Blocks are static and do not change after discovery (Figure 13, M2-104-UM v1.1.2 p.33)"
              },
              "numberOfFunctionBlocks": {
                "type": "integer",
                "minimum": 0,
                "maximum": 32,
                "description": "Number of Function Blocks (0x00 = none, 0x01\u20130x20 = count, 0x21\u20130x7F reserved) (Figure 13, p.33)"
              },
              "umpVersionMajor": {
                "$ref": "#/$defs/Uint8"
              },
              "umpVersionMinor": {
                "$ref": "#/$defs/Uint8"
              },
              "midi2Supported": {
                "type": "boolean",
                "description": "M2 capability flag"
              },
              "midi1Supported": {
                "type": "boolean",
                "description": "M1 capability flag"
              },
              "jrTimestampsRx": {
                "type": "boolean",
                "description": "RXJR capability flag"
              },
              "jrTimestampsTx": {
                "type": "boolean",
                "description": "TXJR capability flag"
              }
            },
            "additionalProperties": false
          },
          "deviceIdentityNotification": {
            "type": "object",
            "properties": {
              "manufacturerId": {
                "oneOf": [
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/$defs/Uint8"
                    },
                    "minItems": 1,
                    "maxItems": 1
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/$defs/Uint8"
                    },
                    "minItems": 3,
                    "maxItems": 3
                  }
                ],
                "description": "SysEx manufacturer ID (1-byte or 3-byte, pad with zeros when 1-byte) (Figure 14, M2-104-UM v1.1.2 p.34)"
              },
              "deviceFamily": {
                "$ref": "#/$defs/Uint16",
                "description": "Device family (SysEx Device Inquiry)"
              },
              "deviceModel": {
                "$ref": "#/$defs/Uint16",
                "description": "Device family model number"
              },
              "softwareRevision": {
                "$ref": "#/$defs/Uint32",
                "description": "Software revision level"
              }
            },
            "additionalProperties": false
          },
          "endpointNameNotification": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 98,
                "description": "UTF-8 endpoint name; up to 98 bytes across Complete/Start/Continue/End forms (Figure 15, M2-104-UM v1.1.2 p.35)"
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          },
          "productInstanceIdNotification": {
            "type": "object",
            "properties": {
              "productInstanceId": {
                "type": "string",
                "maxLength": 42,
                "description": "ASCII 0x20\u20130x7E Product Instance Id, up to 42 bytes across Complete/Start/Continue/End forms (Figure 16, M2-104-UM v1.1.2 p.35)"
              }
            },
            "required": [
              "productInstanceId"
            ],
            "additionalProperties": false
          },
          "streamConfigRequest": {
            "type": "object",
            "properties": {
              "protocol": {
                "type": "string",
                "enum": [
                  "midi1",
                  "midi2"
                ]
              },
              "jrTimestampsTx": {
                "type": "boolean",
                "description": "JR Transmit requested; if unsupported, receiver should send Stream Config Notification to switch protocol without JR (Section 7.2.2.3)"
              },
              "jrTimestampsRx": {
                "type": "boolean",
                "description": "JR Receive requested; if unsupported, receiver should send Stream Config Notification to switch protocol without JR (Section 7.2.2.3)"
              }
            },
            "additionalProperties": false
          },
          "streamConfigNotification": {
            "type": "object",
            "properties": {
              "protocol": {
                "type": "string",
                "enum": [
                  "midi1",
                  "midi2"
                ]
              },
              "jrTimestampsTx": {
                "type": "boolean"
              },
              "jrTimestampsRx": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "functionBlockDiscovery": {
            "type": "object",
            "properties": {
              "filterBitmap": {
                "$ref": "#/$defs/Uint32"
              }
            },
            "additionalProperties": false
          },
          "functionBlockInfo": {
            "type": "object",
            "properties": {
              "index": {
                "$ref": "#/$defs/Uint8"
              },
              "firstGroup": {
                "$ref": "#/$defs/Uint4"
              },
              "groupCount": {
                "$ref": "#/$defs/Uint4"
              },
              "active": {
                "type": "boolean",
                "description": "Function Block active flag (Figure 22, M2-104-UM v1.1.2 p.40)"
              },
              "direction": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3
                ],
                "description": "0=reserved, 1=input only, 2=output only, 3=bidirectional (Figure 22, p.40)"
              },
              "midi1Bandwidth": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2
                ],
                "description": "MIDI 1.0 bandwidth: 0=not MIDI1, 1=do not restrict, 2=restrict to 31.25 kbps (Figure 22, p.40)"
              }
            },
            "additionalProperties": false
          },
          "processInquiry": {
            "type": "object",
            "properties": {
              "functionBlock": {
                "$ref": "#/components/schemas/Uint7"
              },
              "part": {
                "$ref": "#/components/schemas/Uint4"
              }
            },
            "additionalProperties": false
          },
          "processInquiryReply": {
            "type": "object",
            "properties": {
              "functionBlock": {
                "$ref": "#/components/schemas/Uint7"
              },
              "part": {
                "$ref": "#/components/schemas/Uint4"
              }
            },
            "additionalProperties": false
          }
        },
        "description": "Endpoint discovery, protocol selection, and FB info.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 37,
            "section": "Figures 18-23 and stream messages",
            "requirement": "ump-stream-structure-streambody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/StreamMappingTests.swift"
          }
        ]
      },
      "DeltaClockstampConfig": {
        "type": "object",
        "properties": {
          "dctpq": {
            "$ref": "#/$defs/Uint16",
            "description": "Ticks per quarter note"
          },
          "initialTempoMicrosecPerQN": {
            "$ref": "#/$defs/Uint32"
          },
          "timeSignature": {
            "type": "object",
            "properties": {
              "numerator": {
                "type": "integer",
                "minimum": 1
              },
              "denominatorPow2": {
                "type": "integer",
                "minimum": 0
              }
            },
            "additionalProperties": false
          }
        },
        "description": "Clip configuration timing as used in MIDI Clip Files.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 44,
            "section": "Utility and System messages",
            "requirement": "utility-system-structure-deltaclockstampconfig"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UtilityBodyTests.swift"
          }
        ]
      },
      "ClipEnvelope": {
        "type": "object",
        "properties": {
          "startOfClip": {
            "type": "boolean"
          },
          "endOfClip": {
            "type": "boolean"
          },
          "pickupBars": {
            "type": "number"
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-116-U",
            "version": "1.0",
            "page": 12,
            "section": "MIDI Clip message envelope",
            "requirement": "clip-envelope-clipenvelope"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/ClipEnvelopeTests.swift"
          }
        ]
      },
      "MidiCiEnvelope": {
        "type": "object",
        "required": [
          "scope",
          "subId1",
          "subId2",
          "version",
          "body"
        ],
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "nonRealtime",
              "realtime"
            ],
            "description": "0x7E or 0x7F"
          },
          "subId1": {
            "const": 13
          },
          "subId2": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255
          },
          "version": {
            "$ref": "#/$defs/Uint8"
          },
          "body": {
            "oneOf": [
              {
                "$ref": "#/$defs/MidiCiDiscoveryBody"
              },
              {
                "$ref": "#/$defs/MidiCiProfilesBody"
              },
              {
                "$ref": "#/$defs/MidiCiPropertyExchangeBody"
              },
              {
                "$ref": "#/$defs/MidiCiProcessInquiryBody"
              },
              {
                "$ref": "#/$defs/MidiCiAckNakBody"
              }
            ]
          }
        },
        "description": "SysEx(7/8) payload for MIDI-CI transactions.",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-101-UM",
            "version": "1.2",
            "page": 45,
            "section": "MIDI-CI message envelopes",
            "requirement": "midi-ci-envelope-midicienvelope"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/MidiCiEnvelopeTests.swift"
          }
        ]
      },
      "MidiCiDiscoveryBody": {
        "type": "object",
        "properties": {
          "muid": {
            "$ref": "#/$defs/Uint32"
          },
          "manufacturerId": {
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/Uint8"
                },
                "minItems": 1,
                "maxItems": 1
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/Uint8"
                },
                "minItems": 3,
                "maxItems": 3
              }
            ]
          },
          "deviceFamily": {
            "$ref": "#/$defs/Uint16"
          },
          "deviceModel": {
            "$ref": "#/$defs/Uint16"
          },
          "softwareRev": {
            "$ref": "#/$defs/Uint32"
          },
          "categories": {
            "type": "object",
            "properties": {
              "profiles": {
                "type": "boolean"
              },
              "propertyExchange": {
                "type": "boolean"
              },
              "processInquiry": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "maxSysEx": {
            "$ref": "#/$defs/Uint32"
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-101-UM",
            "version": "1.2",
            "page": 45,
            "section": "MIDI-CI message envelopes",
            "requirement": "midi-ci-envelope-midicidiscoverybody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/MidiCiEnvelopeTests.swift"
          }
        ]
      },
      "MidiCiAckNakBody": {
        "type": "object",
        "properties": {
          "ack": {
            "type": "boolean"
          },
          "statusCode": {
            "$ref": "#/$defs/Uint8"
          },
          "message": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-101-UM",
            "version": "1.2",
            "page": 45,
            "section": "MIDI-CI message envelopes",
            "requirement": "midi-ci-envelope-midiciacknakbody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/MidiCiEnvelopeTests.swift"
          }
        ]
      },
      "MidiCiProfilesBody": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string",
            "enum": [
              "inquiry",
              "reply",
              "addedReport",
              "removedReport",
              "setOn",
              "setOff",
              "enabledReport",
              "disabledReport",
              "detailsInquiry",
              "detailsReply",
              "profileSpecificData"
            ]
          },
          "profileId": {
            "type": "string",
            "description": "As per MA/AMEI allocation"
          },
          "target": {
            "type": "string",
            "enum": [
              "channel",
              "group",
              "functionBlock"
            ]
          },
          "channels": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/Uint4"
            }
          },
          "details": {
            "type": "object",
            "description": "Profile Details / Reports (e.g., channel mask bits cmL/cmH, ok flags)",
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-102-U",
            "version": "1.1",
            "page": 15,
            "section": "Table 6",
            "requirement": "profiles-structure-midiciprofilesbody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/MidiCiProfilesBodyTests.swift"
          }
        ]
      },
      "MidiCiPropertyExchangeBody": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string",
            "enum": [
              "capInquiry",
              "capReply",
              "get",
              "getReply",
              "set",
              "setReply",
              "subscribe",
              "subscribeReply",
              "notify",
              "terminate"
            ]
          },
          "subscriptionId": {
            "type": "string",
            "maxLength": 64,
            "description": "Subscription identifier used in PE subscription flows (e.g., sub3221)"
          },
          "requestId": {
            "$ref": "#/$defs/Uint32"
          },
          "encoding": {
            "type": "string",
            "enum": [
              "json",
              "binary",
              "json+zlib",
              "binary+zlib",
              "mcoded7"
            ]
          },
          "header": {
            "type": "object",
            "properties": {
              "resource": {
                "type": "string",
                "maxLength": 36,
                "description": "Targeted resource (ASCII alphanumeric)"
              },
              "resId": {
                "$ref": "#/components/schemas/Uint32"
              },
              "encoding": {
                "type": "string",
                "enum": [
                  "json",
                  "binary",
                  "json+zlib",
                  "binary+zlib",
                  "mcoded7"
                ]
              },
              "flowControl": {
                "type": "boolean",
                "description": "Flow Control flag for Inquiry: Get Property Data (Table 13, M2-103-UM v1.2 p.28)"
              },
              "status": {
                "type": "integer",
                "minimum": 100,
                "maximum": 999,
                "description": "Reply status (HTTP-like codes per Table 15, M2-103-UM v1.2 p.29)"
              },
              "message": {
                "type": "string",
                "maxLength": 512,
                "description": "Optional explanatory message in reply"
              },
              "cacheTime": {
                "type": "integer",
                "minimum": 0,
                "description": "Seconds the document may be cached"
              },
              "mediaType": {
                "type": "string",
                "maxLength": 75,
                "description": "MIME type for non-JSON Property Data (Table 16, M2-103-UM v1.2 p.31)"
              }
            },
            "additionalProperties": false
          },
          "data": {
            "description": "JSON or encoded non-JSON; when JSON, schema may be referenced via header.schema",
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false
              },
              {
                "$ref": "#/$defs/ByteArray"
              }
            ]
          },
          "statusCodes": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 100,
              "maximum": 599,
              "enum": [
                200,
                201,
                341,
                342,
                343,
                400,
                403,
                404,
                405,
                406,
                407,
                413,
                415,
                445,
                500
              ]
            },
            "description": "Property Exchange reply status codes (Table 15) or notify-only codes (Table 16 timeout wait via ACK)"
          },
          "timeoutStatus": {
            "type": "integer",
            "description": "Deprecated Notify timeout status codes (100, 408) for backward compatibility per M2-103-UM v1.2 p.49",
            "enum": [
              100,
              408
            ]
          },
          "flowControlError": {
            "type": "integer",
            "description": "Status to return when flowControl is requested but unsupported (406/407 per M2-103-UM v1.2 p.69\u201371)",
            "enum": [
              406,
              407
            ]
          },
          "deltaClockstampTicksPerQuarterNote": {
            "type": "integer",
            "minimum": 0,
            "maximum": 65535,
            "description": "DCTPQ for Delta Clockstamp timing (0 reserved; Figure 33, M2-104-UM v1.1.2 p.45)"
          },
          "cacheTime": {
            "type": "integer",
            "minimum": 0,
            "description": "Seconds the Property Data may be cached (Section 7.4.3, M2-103-UM v1.2 p.30\u201331)"
          },
          "flowControlAck": {
            "type": "object",
            "description": "MIDI-CI ACK flow control message (Table 94, M2-103-UM v1.2 p.69)",
            "properties": {
              "requestId": {
                "$ref": "#/$defs/Uint8",
                "description": "PE Request Id (Table 94)"
              },
              "chunkNumber": {
                "$ref": "#/$defs/Uint16",
                "description": "Chunk number (LSB first) in flow-control ACK"
              },
              "messageLength": {
                "$ref": "#/$defs/Uint16",
                "description": "Length of the message (0 when no message; reserved otherwise)"
              },
              "status": {
                "type": "integer",
                "const": 17
              }
            },
            "additionalProperties": false
          },
          "flowControlNak": {
            "type": "object",
            "description": "MIDI-CI NAK flow control retransmit request (Table 97, M2-103-UM v1.2 p.72)",
            "properties": {
              "status": {
                "type": "integer",
                "const": 18
              },
              "chunkNumber": {
                "$ref": "#/$defs/Uint16",
                "description": "Chunk number to retransmit (LSB first)"
              }
            },
            "additionalProperties": false
          },
          "subscriptionCommand": {
            "type": "string",
            "enum": [
              "start",
              "partial",
              "full",
              "notify",
              "end"
            ],
            "description": "Subscription command values per M2-103-UM v1.2 subscription flows"
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-103-UM",
            "version": "1.2",
            "page": 28,
            "section": "Tables 13-16",
            "requirement": "property-exchange-structure-midicipropertyexchangebody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/PropertyExchangeChunkingTests.swift"
          }
        ]
      },
      "MidiCiProcessInquiryBody": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string",
            "enum": [
              "capInquiry",
              "capReply",
              "messageReport",
              "messageReportReply",
              "endReport"
            ]
          },
          "deviceId": {
            "type": "integer",
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              15,
              126,
              127
            ],
            "description": "Device ID for message report scope: 0x00\u20130x0F channel 1\u201316, 0x7E group, 0x7F function block (Table 43/45, M2-101-UM v1.2 p.61\u201363)"
          },
          "messageDataControl": {
            "type": "integer",
            "enum": [
              0,
              1,
              127
            ],
            "description": "Message Data Control (Table 44, M2-101-UM v1.2 p.62): 0x00 begin/end only, 0x01 non-default/active only, 0x7F full report; 0x02\u20130x7E reserved."
          },
          "systemMessages": {
            "type": "object",
            "description": "Bitmap of requested System Messages (Table 43/45, M2-101-UM v1.2 p.61\u201363)",
            "properties": {
              "mtcQuarterFrame": {
                "type": "boolean"
              },
              "songPosition": {
                "type": "boolean"
              },
              "songSelect": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "channelControllerMessages": {
            "type": "object",
            "description": "Bitmap of requested Channel Controller Messages (Table 43/45, M2-101-UM v1.2 p.61\u201363)",
            "properties": {
              "pitchBend": {
                "type": "boolean"
              },
              "controlChange": {
                "type": "boolean"
              },
              "registeredController": {
                "type": "boolean"
              },
              "assignableController": {
                "type": "boolean"
              },
              "programChange": {
                "type": "boolean"
              },
              "channelPressure": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "noteDataMessages": {
            "type": "object",
            "description": "Bitmap of requested Note Data Messages (Table 43/45, M2-101-UM v1.2 p.61\u201363)",
            "properties": {
              "notes": {
                "type": "boolean"
              },
              "polyPressure": {
                "type": "boolean"
              },
              "perNotePitchBend": {
                "type": "boolean"
              },
              "registeredPerNoteController": {
                "type": "boolean"
              },
              "assignablePerNoteController": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "supportedFeatures": {
            "type": "object",
            "description": "Process Inquiry Supported Features bitmap (Table 42, M2-101-UM v1.2 p.60)",
            "properties": {
              "messageReport": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-101-UM",
            "version": "1.2",
            "page": 59,
            "section": "Tables 40-45",
            "requirement": "process-inquiry-structure-midiciprocessinquirybody"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/MidiCiProcessInquiryBodyTests.swift"
          }
        ]
      },
      "UmpPacket32": {
        "type": "object",
        "required": [
          "messageType",
          "body"
        ],
        "properties": {
          "messageType": {
            "enum": [
              0,
              1,
              2,
              3,
              15
            ]
          },
          "group": {
            "$ref": "#/$defs/Group"
          },
          "body": {
            "oneOf": [
              {
                "$ref": "#/$defs/UtilityBody"
              },
              {
                "$ref": "#/$defs/SystemCommonRealtimeBody"
              },
              {
                "$ref": "#/$defs/Midi1ChannelVoiceBody"
              },
              {
                "$ref": "#/$defs/SysEx7Body"
              },
              {
                "$ref": "#/$defs/StreamBody"
              }
            ]
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP message types and packet sizes",
            "requirement": "ump-packet-structure-umppacket32"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UmpPacketsTests.swift"
          }
        ]
      },
      "UmpPacket64": {
        "type": "object",
        "required": [
          "messageType",
          "group",
          "statusNibble",
          "channel",
          "body"
        ],
        "properties": {
          "messageType": {
            "const": 4
          },
          "group": {
            "$ref": "#/$defs/Group"
          },
          "statusNibble": {
            "$ref": "#/$defs/Midi2StatusNibble"
          },
          "channel": {
            "$ref": "#/$defs/Uint4"
          },
          "body": {
            "$ref": "#/$defs/Midi2ChannelVoiceVariants"
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP message types and packet sizes",
            "requirement": "ump-packet-structure-umppacket64"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UmpPacketsTests.swift"
          }
        ]
      },
      "UmpPacket128": {
        "type": "object",
        "required": [
          "messageType",
          "body"
        ],
        "properties": {
          "messageType": {
            "enum": [
              5,
              13
            ]
          },
          "group": {
            "$ref": "#/$defs/Group"
          },
          "body": {
            "oneOf": [
              {
                "$ref": "#/$defs/DataMessageBody"
              },
              {
                "$ref": "#/$defs/FlexDataBody"
              }
            ]
          }
        },
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 20,
            "section": "UMP message types and packet sizes",
            "requirement": "ump-packet-structure-umppacket128"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/UmpPacketsTests.swift"
          }
        ]
      },
      "Midi2.NoteOff": {
        "type": "object",
        "required": [
          "noteNumber",
          "velocity16"
        ],
        "properties": {
          "noteNumber": {
            "$ref": "#/$defs/Uint7"
          },
          "velocity16": {
            "$ref": "#/$defs/Uint16"
          },
          "attributeType": {
            "$ref": "#/$defs/NoteAttributeType"
          },
          "attributeData16": {
            "$ref": "#/$defs/Uint16"
          }
        },
        "description": "Status 0x8 (Note Off).",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 56,
            "section": "MIDI 2.0 Channel Voice messages",
            "requirement": "midi2-channel-voice-midi2-noteoff"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi2ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "Midi2.NoteOn": {
        "type": "object",
        "required": [
          "noteNumber",
          "velocity16"
        ],
        "properties": {
          "noteNumber": {
            "$ref": "#/$defs/Uint7"
          },
          "velocity16": {
            "$ref": "#/$defs/Uint16"
          },
          "attributeType": {
            "$ref": "#/$defs/NoteAttributeType"
          },
          "attributeData16": {
            "$ref": "#/$defs/Uint16"
          }
        },
        "description": "Status 0x9 (Note On).",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 56,
            "section": "MIDI 2.0 Channel Voice messages",
            "requirement": "midi2-channel-voice-midi2-noteon"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests/MIDI2Tests/Midi2ChannelVoiceBodyTests.swift"
          }
        ]
      },
      "Midi2.PolyPressure": {
        "type": "object",
        "required": [
          "noteNumber",
          "polyPressure32"
        ],
        "properties": {
          "noteNumber": {
            "$ref": "#/$defs/Uint7"
          },
          "polyPressure32": {
            "$ref": "#/$defs/Uint32"
          }
        },
        "description": "Status 0xA (Polyphonic Key Pressure).",
        "additionalProperties": false,
        "x-midi-spec": [
          {
            "document": "M2-104-UM",
            "version": "1.1.2",
            "page": 56,
            "section": "MIDI 2.0 Channel Voice messages",
            "requirement": "midi2-channel-voice-midi2-polypressure"
          }
        ],
        "x-verification": [
          {
            "kind": "swift-test-file",
            "id": "Tests