{
  "_sources": [
    {
      "type": "vendor-doc",
      "url": "https://archive.org/details/manualzilla-id-7332882",
      "notes": "E-mu SP-1200 Owner's Manual: 'MIDI, Sync & SMPTE' (6A, 6D) and 'Appendix J: MIDI Implementation' (chart copyright E-mu Systems 1987, transmitted and received messages, MMA sample dump). Every route comes from these pages.",
      "firmware": "unknown",
      "imported_at": "2026-10-26"
    }
  ],
  "_limitations": "Source: SP-1200 Owner's Manual, Appendix J (1987). Notes 36-67 play the 32 sounds (velocity counts, note-off velocity ignored); a second Note On before the first one's Note Off plays the first sound at the second note's pitch. Which key plays which pad is drawn on a keyboard chart ('Emax keyboard to SP-1200 play buttons', p. 57) that is not readable as text, so no per-pad trigger is listed. Receive channel and Omni/Poly are set in SET-UP 22. Sending a sound to the SP-1200 (dump header then 120-byte packets of 12-bit words, checksum = XOR) is not exposed: it needs the whole sample. No Control Change, Program Change, pitch bend or aftertouch. Untested on hardware.",
  "_coverage": {
    "entries_total": 13,
    "cc_entries": 3,
    "rpn_entries": 0,
    "nrpn_entries": 0,
    "sysex_commands": 4,
    "realtime_commands": 4,
    "channel_and_common_commands": 2,
    "note_triggers": 0,
    "replies": 3
  },
  "device": {
    "name": "SP-1200",
    "vendor": "E-MU",
    "revision": "SP-1200 Owner's Manual, Appendix J MIDI Implementation (1987)",
    "osc_prefix": "/sp_1200",
    "manufacturer_id": [
      24
    ],
    "device_id": []
  },
  "sysex": {
    "header": [],
    "footer": [],
    "_notes": "Empty on purpose: each command frame carries its complete message."
  },
  "midi_out": {
    "default_channel": 0,
    "note_offset": 0
  },
  "midi_in": {
    "note_on": "/note/on {note} {velocity} {channel}",
    "note_off": "/note/off {note} {velocity} {channel}",
    "cc": "/cc/{num} {value} {channel}",
    "program_change": "/program_change {program} {channel}"
  },
  "commands": [
    {
      "osc": "/transport/clock",
      "section": "Sync",
      "args": [],
      "_notes": "Timing Clock (F8H): advances the sequencer by 1/96 note. Followed only when Sync is set to MIDI (SYNC 2).",
      "frame": [
        248
      ]
    },
    {
      "osc": "/transport/start",
      "section": "Sync",
      "args": [],
      "_notes": "Sequencer Start (FAH).",
      "frame": [
        250
      ]
    },
    {
      "osc": "/transport/stop",
      "section": "Sync",
      "args": [],
      "_notes": "Sequencer Stop (FCH).",
      "frame": [
        252
      ]
    },
    {
      "osc": "/transport/continue",
      "section": "Sync",
      "args": [],
      "_notes": "Continue (FBH): after a Song Position Pointer the SP-1200 waits for Continue then clocks before playing.",
      "frame": [
        251
      ]
    },
    {
      "osc": "/song/position",
      "section": "Sync",
      "args": [
        {
          "name": "beats",
          "type": "u14",
          "range": [
            0,
            16383
          ]
        }
      ],
      "_notes": "Song Position Pointer (F2H), in MIDI beats (sixteenth notes). The SP-1200 fast-forwards to that spot of the current song or segment. Followed only when Sync is set to MIDI (SYNC 2).",
      "frame": [
        242,
        "{beats:u14_lsb}",
        "{beats:u14_msb}"
      ]
    },
    {
      "osc": "/song/select",
      "section": "Sync",
      "args": [
        {
          "name": "song",
          "type": "u7",
          "range": [
            0,
            99
          ]
        }
      ],
      "_notes": "Song Select (F3H). Song Select (F3H) selects sequence 0-99.",
      "frame": [
        243,
        "{song}"
      ]
    },
    {
      "osc": "/sample_dump/request",
      "section": "Sample dump",
      "args": [
        {
          "name": "sound",
          "type": "u7",
          "range": [
            0,
            31
          ]
        }
      ],
      "_notes": "MMA Sample Dump Request for sound 0-31 (0 = A1 ... 31 = D8); the base channel is ignored. The SP-1200 stops and sends the sound as an MMA dump (header, then 120-byte packets) if it exists; answer each packet with ACK.",
      "frame": [
        240,
        126,
        0,
        3,
        "{sound}",
        0,
        247
      ]
    },
    {
      "osc": "/sample_dump/ack",
      "section": "Sample dump",
      "args": [
        {
          "name": "packet",
          "type": "u7",
          "range": [
            0,
            127
          ]
        }
      ],
      "_notes": "MMA ACK for packet 0-127: the SP-1200 sends the next one.",
      "frame": [
        240,
        126,
        0,
        127,
        "{packet}",
        247
      ]
    },
    {
      "osc": "/sample_dump/nak",
      "section": "Sample dump",
      "args": [
        {
          "name": "packet",
          "type": "u7",
          "range": [
            0,
            127
          ]
        }
      ],
      "_notes": "MMA NAK: the SP-1200 sends the same packet again.",
      "frame": [
        240,
        126,
        0,
        126,
        "{packet}",
        247
      ]
    },
    {
      "osc": "/sample_dump/cancel",
      "section": "Sample dump",
      "args": [
        {
          "name": "packet",
          "type": "u7",
          "range": [
            0,
            127
          ]
        }
      ],
      "_notes": "MMA CANCEL: aborts the dump.",
      "frame": [
        240,
        126,
        0,
        125,
        "{packet}",
        247
      ]
    }
  ],
  "cc_params": {
    "channel": 0,
    "_source": "",
    "entries": [
      {
        "osc": "/all_notes_off",
        "cc": 123,
        "range": [
          0,
          0
        ],
        "expects": "trigger",
        "section": "Channel mode",
        "_usage": "All Notes Off: turns off notes whose source was MIDI."
      },
      {
        "osc": "/omni_off",
        "cc": 124,
        "range": [
          0,
          0
        ],
        "expects": "trigger",
        "section": "Channel mode",
        "_usage": "Mode 124: notes off and POLY mode (the SP-1200 plays only its basic channel)."
      },
      {
        "osc": "/omni_on",
        "cc": 125,
        "range": [
          0,
          0
        ],
        "expects": "trigger",
        "section": "Channel mode",
        "_usage": "Mode 125: notes off and OMNI mode (plays notes from any channel)."
      }
    ]
  },
  "replies": [
    {
      "match_frame": [
        240,
        126,
        "{ch}",
        1,
        "{sound}",
        0,
        12,
        2,
        44,
        2,
        "{l0}",
        "{l1}",
        "{l2}",
        "{s0}",
        "{s1}",
        "{s2}",
        "{e0}",
        "{e1}",
        "{e2}",
        0,
        247
      ],
      "emit_osc": "/sample_dump/header {sound} {l0} {l1} {l2}",
      "_notes": "MMA Sample Dump Header: sound number, 12 bits, period 02 2C 02 (as printed), length in words (lsb first); loop start/end follow."
    },
    {
      "match_frame": [
        240,
        126,
        "{ch}",
        127,
        "{packet}",
        247
      ],
      "emit_osc": "/sample_dump/ack {packet}",
      "_notes": "ACK from the SP-1200 while receiving a dump."
    },
    {
      "match_frame": [
        240,
        126,
        "{ch}",
        125,
        "{packet}",
        247
      ],
      "emit_osc": "/sample_dump/cancel {packet}",
      "_notes": "CANCEL: the SP-1200 aborted the dump."
    }
  ]
}
