#------------------------------------------------------------------------
# $File: sysex,v 1.12 2022/10/31 13:22:26 christos Exp $
# sysex: file(1) magic for MIDI sysex files
#
# GRR: original 1 byte test at offset was too general as it catches also many FATs of DOS filesystems
# where real SYStem EXclusive messages at offset 1 are limited to seven bits
# https://en.wikipedia.org/wiki/MIDI
# test for StartSysEx byte and upper unsed bit of vendor ID
0       ubeshort&0xFF80         0xF000
# MIDI System Exclusive (SysEx) messages (strength=50) after Microsoft Visual C library (strength=70)
#!:strength +0
# skip Microsoft Visual C library with page size 16 misidentified as ADA and
# page size 32 misidentified as Inventronics by looking for terminating End Of eXclusive byte (EOX)
>2              search/12       \xF7
>>0     use     midi-sysex
#       display information about MIDI System Exclusive (SysEx) messages
0       name            midi-sysex
# https://fileinfo.com/extension/syx
>1      ubyte                   x               MIDI audio System Exclusive (SysEx) message -
# Note: file (version 5.41) labeled the above entry as "SysEx File"
#!:mime application/octet-stream
!:mime  audio/x-syx
# https://onsongapp.com/docs/features/formats/sysex
!:ext   syx/sysex
# https://www.midi.org/specifications-old/item/manufacturer-id-numbers
# https://raw.githubusercontent.com/insolace/MIDI-Sysex-MFG-IDs/master/Sysex%20ID%20Tables/MIDI%20Sysex%20MFG%20IDs.csv
# SysEx manufacturer ID; originally one byte, but now 0 is used as an escapement to reach the next two
# North American Group
#>1     byte                    0x01            Sequential
>1      byte                    0x01            Sequential Circuits
>1      byte                    0x02            IDP
#>1     byte                    0x03            OctavePlateau
>1      byte                    0x03            Voyetra Turtle Beach
>1      byte                    0x04            Moog
#>1     byte                    0x05            Passport
>1      byte                    0x05            Passport Designs
#>1     byte                    0x06            Lexicon
>1      byte                    0x06            Lexicon Inc.
>1      byte                    0x07            Kurzweil/Future Retro
>>3     byte                    0x77            777
>>4     byte                    0x00            Bank
>>4     byte                    0x01            Song
>>5     byte                    0x0f            16
>>5     byte                    0x0e            15
>>5     byte                    0x0d            14
>>5     byte                    0x0c            13
>>5     byte                    0x0b            12
>>5     byte                    0x0a            11
>>5     byte                    0x09            10
>>5     byte                    0x08            9
>>5     byte                    0x07            8
>>5     byte                    0x06            7
>>5     byte                    0x05            6
>>5     byte                    0x04            5
>>5     byte                    0x03            4
>>5     byte                    0x02            3
>>5     byte                    0x01            2
>>5     byte                    0x00            1
>>5     byte                    0x10            (ALL)
>>2     byte                    x                       \b, Channel %d
>1      byte                    0x08            Fender
#>1     byte                    0x09            Gulbransen
>1      byte                    0x09            MIDI9
#>1     byte                    0x0a            AKG
>1      byte                    0x0a            AKG Acoustics
>1      byte                    0x0b            Voyce
>1      byte                    0x0c            Waveframe
# not ADA programming language
#>1     byte                    0x0d            ADA
>1      byte                    0x0d            ADA Signal Processors Inc.
#>1     byte                    0x0e            Garfield
>1      byte                    0x0e            Garfield Electronics
>1      byte                    0x0f            Ensoniq
>1      byte                    0x10            Oberheim
>>2     byte                    0x06            Matrix 6 series
>>3     byte                    0x0A            Dump (All)
>>3     byte                    0x01            Dump (Bank)
>>4 belong                      0x0002040E              Matrix 1000
>>>11 byte                      <2                      User bank %d
>>>11 byte                      >1                      Preset bank %d
>1      byte                    0x11            Apple
>1      byte                    0x12            GreyMatter
>1      byte                    0x14            PalmTree
>1      byte                    0x15            JLCooper
>1      byte                    0x16            Lowrey
>1      byte                    0x17            AdamsSmith
>1      byte                    0x18            E-mu
#>1     byte                    0x19            Harmony
>1      byte                    0x19            Harmony Systems
>1      byte                    0x1a            ART
>1      byte                    0x1b            Baldwin
>1      byte                    0x1c            Eventide
>1      byte                    0x1d            Inventronics
>1      byte                    0x1f            Clarity

# European Group
#>1     byte                    0x21            SIEL
>1      byte                    0x21            Proel Labs (SIEL)
>1      byte                    0x22            Synthaxe
>1      byte                    0x24            Hohner
>1      byte                    0x25            Twister
#>1     byte                    0x26            Solton
>1      byte                    0x26            Ketron s.r.l.
>1      byte                    0x27            Jellinghaus
>1      byte                    0x28            Southworth
>1      byte                    0x29            PPG
>1      byte                    0x2a            JEN
#>1     byte                    0x2b            SSL
>1      byte                    0x2b            Solid State Logic Organ Systems
#>1     byte                    0x2c            AudioVertrieb
>1      byte                    0x2c            Audio Veritrieb-P. Struven

>1      byte                    0x2f            ELKA
>>3     byte                    0x09            EK-44

>1      byte                    0x30            Dynacord
#>1     byte                    0x31            Jomox
>1      byte                    0x31            Viscount International Spa
>1      byte                    0x33            Clavia
>1      byte                    0x39            Soundcraft
# Some Waldorf info from http://Stromeko.Synth.net/Downloads#WaldorfDocs
>1      byte                    0x3e            Waldorf
>>2     byte                    0x00            microWave
>>2     byte                    0x0E            microwave2 / XT
>>2     byte                    0x0F            Q / Q+
>>3     byte                    =0                      (default id)
>>3 byte                        >0                      (
>>>3 byte                       <0x7F           \bdevice %d)
>>>3 byte                       =0x7F           \bbroadcast id)
>>3     byte                    0x7f            Microwave I
>>>4    byte                    0x00            SNDR (Sound Request)
>>>4    byte                    0x10            SNDD (Sound Dump)
>>>4    byte                    0x20            SNDP (Sound Parameter Change)
>>>4    byte                    0x30            SNDQ (Sound Parameter Inquiry)
>>>4    byte                    0x70            BOOT (Sound Reserved)
>>>4    byte                    0x01            MULR (Multi Request)
>>>4    byte                    0x11            MULD (Multi Dump)
>>>4    byte                    0x21            MULP (Multi Parameter Change)
>>>4    byte                    0x31            MULQ (Multi Parameter Inquiry)
>>>4    byte                    0x71            OS (Multi Reserved)
>>>4    byte                    0x02            DRMR (Drum Map Request)
>>>4    byte                    0x12            DRMD (Drum Map Dump)
>>>4    byte                    0x22            DRMP (Drum Map Parameter Change)
>>>4    byte                    0x32            DRMQ (Drum Map Parameter Inquiry)
>>>4    byte                    0x72            BIN (Drum Map Reserved)
>>>4    byte                    0x03            PATR (Sequencer Pattern Request)
>>>4    byte                    0x13            PATD (Sequencer Pattern Dump)
>>>4    byte                    0x23            PATP (Sequencer Pattern Parameter Change)
>>>4    byte                    0x33            PATQ (Sequencer Pattern Parameter Inquiry)
>>>4    byte                    0x73            AFM (Sequencer Pattern Reserved)
>>>4    byte                    0x04            GLBR (Global Parameter Request)
>>>4    byte                    0x14            GLBD (Global Parameter Dump)
>>>4    byte                    0x24            GLBP (Global Parameter Parameter Change)
>>>4    byte                    0x34            GLBQ (Global Parameter Parameter Inquiry)
>>>4    byte                    0x07            MODR (Mode Parameter Request)
>>>4    byte                    0x17            MODD (Mode Parameter Dump)
>>>4    byte                    0x27            MODP (Mode Parameter Parameter Change)
>>>4    byte                    0x37            MODQ (Mode Parameter Parameter Inquiry)
>>2     byte                    0x10            microQ
>>>4    byte                    0x00            SNDR (Sound Request)
>>>4    byte                    0x10            SNDD (Sound Dump)
>>>4    byte                    0x20            SNDP (Sound Parameter Change)
>>>4    byte                    0x30            SNDQ (Sound Parameter Inquiry)
>>>4    byte                    0x70            (Sound Reserved)
>>>4    byte                    0x01            MULR (Multi Request)
>>>4    byte                    0x11            MULD (Multi Dump)
>>>4    byte                    0x21            MULP (Multi Parameter Change)
>>>4    byte                    0x31            MULQ (Multi Parameter Inquiry)
>>>4    byte                    0x71            OS (Multi Reserved)
>>>4    byte                    0x02            DRMR (Drum Map Request)
>>>4    byte                    0x12            DRMD (Drum Map Dump)
>>>4    byte                    0x22            DRMP (Drum Map Parameter Change)
>>>4    byte                    0x32            DRMQ (Drum Map Parameter Inquiry)
>>>4    byte                    0x72            BIN (Drum Map Reserved)
>>>4    byte                    0x04            GLBR (Global Parameter Request)
>>>4    byte                    0x14            GLBD (Global Parameter Dump)
>>>4    byte                    0x24            GLBP (Global Parameter Parameter Change)
>>>4    byte                    0x34            GLBQ (Global Parameter Parameter Inquiry)
>>2     byte                    0x11            rackAttack
>>>4    byte                    0x00            SNDR (Sound Parameter Request)
>>>4    byte                    0x10            SNDD (Sound Parameter Dump)
>>>4    byte                    0x20            SNDP (Sound Parameter Parameter Change)
>>>4    byte                    0x30            SNDQ (Sound Parameter Parameter Inquiry)
>>>4    byte                    0x01            PRGR (Program Parameter Request)
>>>4    byte                    0x11            PRGD (Program Parameter Dump)
>>>4    byte                    0x21            PRGP (Program Parameter Parameter Change)
>>>4    byte                    0x31            PRGQ (Program Parameter Parameter Inquiry)
>>>4    byte                    0x71            OS (Program Parameter Reserved)
>>>4    byte                    0x03            PATR (Pattern Parameter Request)
>>>4    byte                    0x13            PATD (Pattern Parameter Dump)
>>>4    byte                    0x23            PATP (Pattern Parameter Parameter Change)
>>>4    byte                    0x33            PATQ (Pattern Parameter Parameter Inquiry)
>>>4    byte                    0x04            GLBR (Global Parameter Request)
>>>4    byte                    0x14            GLBD (Global Parameter Dump)
>>>4    byte                    0x24            GLBP (Global Parameter Parameter Change)
>>>4    byte                    0x34            GLBQ (Global Parameter Parameter Inquiry)
>>>4    byte                    0x05            EFXR (FX Parameter Request)
>>>4    byte                    0x15            EFXD (FX Parameter Dump)
>>>4    byte                    0x25            EFXP (FX Parameter Parameter Change)
>>>4    byte                    0x35            EFXQ (FX Parameter Parameter Inquiry)
>>>4    byte                    0x07            MODR (Mode Command Request)
>>>4    byte                    0x17            MODD (Mode Command Dump)
>>>4    byte                    0x27            MODP (Mode Command Parameter Change)
>>>4    byte                    0x37            MODQ (Mode Command Parameter Inquiry)
>>2     byte                    0x03            Wave
>>>4    byte                    0x00            SBPR (Soundprogram)
>>>4    byte                    0x01            SAPR (Performance)
>>>4    byte                    0x02            SWAVE (Wave)
>>>4    byte                    0x03            SWTBL (Wave control table)
>>>4    byte                    0x04            SVT (Velocity Curve)
>>>4    byte                    0x05            STT (Tuning Table)
>>>4    byte                    0x06            SGLB (Global Parameters)
>>>4    byte                    0x07            SARRMAP (Performance Program Change Map)
>>>4    byte                    0x08            SBPRMAP (Sound Program Change Map)
>>>4    byte                    0x09            SBPRPAR (Sound Parameter)
>>>4    byte                    0x0A            SARRPAR (Performance Parameter)
>>>4    byte                    0x0B            SINSPAR (Instrument/External Parameter)
>>>4    byte                    0x0F            SBULK (Bulk Switch on/off)

# Japanese Group
>1      byte                    0x40            Kawai
>>3     byte                    0x20            K1
>>3     byte                    0x22            K4

>1      byte                    0x41            Roland
>>3     byte                    0x14            D-50
>>3     byte                    0x2b            U-220
>>3     byte                    0x02            TR-707

>1      byte                    0x42            Korg
>>3     byte                    0x19            M1

>1      byte                    0x43            Yamaha
>1      byte                    0x44            Casio
>1      byte                    0x46            Kamiya
>1      byte                    0x47            Akai
#>1     byte                    0x48            Victor
>1      byte                    0x48            Victor Company of Japan. Ltd.
>1      byte                    0x49            Mesosha
>1      byte                    0x4b            Fujitsu
>1      byte                    0x4c            Sony
>1      byte                    0x4e            Teac
>1      byte                    0x50            Matsushita
>1      byte                    0x51            Fostex
#>1     byte                    0x52            Zoom
>1      byte                    0x52            Zoom Corporation
>1      byte                    0x54            Matsushita
>1      byte                    0x57            Acoustic tech. lab.
# https://www.midi.org/techspecs/manid.php
>1      belong&0xffffff00       0x00007400      Ta Horng
>1      belong&0xffffff00       0x00007500      e-Tek
>1      belong&0xffffff00       0x00007600      E-Voice
>1      belong&0xffffff00       0x00007700      Midisoft
>1      belong&0xffffff00       0x00007800      Q-Sound
>1      belong&0xffffff00       0x00007900      Westrex
>1      belong&0xffffff00       0x00007a00      Nvidia*
>1      belong&0xffffff00       0x00007b00      ESS
>1      belong&0xffffff00       0x00007c00      Mediatrix
>1      belong&0xffffff00       0x00007d00      Brooktree
>1      belong&0xffffff00       0x00007e00      Otari
>1      belong&0xffffff00       0x00007f00      Key Electronics
>1      belong&0xffffff00       0x00010000      Shure
>1      belong&0xffffff00       0x00010100      AuraSound
>1      belong&0xffffff00       0x00010200      Crystal
>1      belong&0xffffff00       0x00010300      Rockwell
>1      belong&0xffffff00       0x00010400      Silicon Graphics
>1      belong&0xffffff00       0x00010500      Midiman
>1      belong&0xffffff00       0x00010600      PreSonus
>1      belong&0xffffff00       0x00010800      Topaz
>1      belong&0xffffff00       0x00010900      Cast Lightning
>1      belong&0xffffff00       0x00010a00      Microsoft
>1      belong&0xffffff00       0x00010b00      Sonic Foundry
>1      belong&0xffffff00       0x00010c00      Line 6
>1      belong&0xffffff00       0x00010d00      Beatnik Inc.
>1      belong&0xffffff00       0x00010e00      Van Koerving
>1      belong&0xffffff00       0x00010f00      Altech Systems
>1      belong&0xffffff00       0x00011000      S & S Research
>1      belong&0xffffff00       0x00011100      VLSI Technology
>1      belong&0xffffff00       0x00011200      Chromatic
>1      belong&0xffffff00       0x00011300      Sapphire
>1      belong&0xffffff00       0x00011400      IDRC
>1      belong&0xffffff00       0x00011500      Justonic Tuning
>1      belong&0xffffff00       0x00011600      TorComp
>1      belong&0xffffff00       0x00011700      Newtek Inc.
>1      belong&0xffffff00       0x00011800      Sound Sculpture
>1      belong&0xffffff00       0x00011900      Walker Technical
>1      belong&0xffffff00       0x00011a00      Digital Harmony
>1      belong&0xffffff00       0x00011b00      InVision
>1      belong&0xffffff00       0x00011c00      T-Square
>1      belong&0xffffff00       0x00011d00      Nemesys
>1      belong&0xffffff00       0x00011e00      DBX
>1      belong&0xffffff00       0x00011f00      Syndyne
>1      belong&0xffffff00       0x00012000      Bitheadz
>1      belong&0xffffff00       0x00012100      Cakewalk
>1      belong&0xffffff00       0x00012200      Staccato
>1      belong&0xffffff00       0x00012300      National Semicon.
>1      belong&0xffffff00       0x00012400      Boom Theory
>1      belong&0xffffff00       0x00012500      Virtual DSP Corp
>1      belong&0xffffff00       0x00012600      Antares
>1      belong&0xffffff00       0x00012700      Angel Software
>1      belong&0xffffff00       0x00012800      St Louis Music
>1      belong&0xffffff00       0x00012900      Lyrrus dba G-VOX
>1      belong&0xffffff00       0x00012a00      Ashley Audio
>1      belong&0xffffff00       0x00012b00      Vari-Lite
>1      belong&0xffffff00       0x00012c00      Summit Audio
>1      belong&0xffffff00       0x00012d00      Aureal Semicon.
>1      belong&0xffffff00       0x00012e00      SeaSound
>1      belong&0xffffff00       0x00012f00      U.S. Robotics
>1      belong&0xffffff00       0x00013000      Aurisis
>1      belong&0xffffff00       0x00013100      Nearfield Multimedia
>1      belong&0xffffff00       0x00013200      FM7 Inc.
>1      belong&0xffffff00       0x00013300      Swivel Systems
>1      belong&0xffffff00       0x00013400      Hyperactive
>1      belong&0xffffff00       0x00013500      MidiLite
>1      belong&0xffffff00       0x00013600      Radical
>1      belong&0xffffff00       0x00013700      Roger Linn
>1      belong&0xffffff00       0x00013800      Helicon
>1      belong&0xffffff00       0x00013900      Event
>1      belong&0xffffff00       0x00013a00      Sonic Network
>1      belong&0xffffff00       0x00013b00      Realtime Music
>1      belong&0xffffff00       0x00013c00      Apogee Digital

>1      belong&0xffffff00       0x00202b00      Medeli Electronics
>1      belong&0xffffff00       0x00202c00      Charlie Lab
>1      belong&0xffffff00       0x00202d00      Blue Chip Music
>1      belong&0xffffff00       0x00202e00      BEE OH Corp
>1      belong&0xffffff00       0x00202f00      LG Semicon America
>1      belong&0xffffff00       0x00203000      TESI
>1      belong&0xffffff00       0x00203100      EMAGIC
>1      belong&0xffffff00       0x00203200      Behringer
>1      belong&0xffffff00       0x00203300      Access Music
>1      belong&0xffffff00       0x00203400      Synoptic
>1      belong&0xffffff00       0x00203500      Hanmesoft Corp
>1      belong&0xffffff00       0x00203600      Terratec
>1      belong&0xffffff00       0x00203700      Proel SpA
>1      belong&0xffffff00       0x00203800      IBK MIDI
>1      belong&0xffffff00       0x00203900      IRCAM
>1      belong&0xffffff00       0x00203a00      Propellerhead Software
>1      belong&0xffffff00       0x00203b00      Red Sound Systems
>1      belong&0xffffff00       0x00203c00      Electron ESI AB
>1      belong&0xffffff00       0x00203d00      Sintefex Audio
>1      belong&0xffffff00       0x00203e00      Music and More
>1      belong&0xffffff00       0x00203f00      Amsaro
>1      belong&0xffffff00       0x00204000      CDS Advanced Technology
>1      belong&0xffffff00       0x00204100      Touched by Sound
>1      belong&0xffffff00       0x00204200      DSP Arts
>1      belong&0xffffff00       0x00204300      Phil Rees Music
>1      belong&0xffffff00       0x00204400      Stamer Musikanlagen GmbH
>1      belong&0xffffff00       0x00204500      Soundart
>1      belong&0xffffff00       0x00204600      C-Mexx Software
>1      belong&0xffffff00       0x00204700      Klavis Tech.
>1      belong&0xffffff00       0x00204800      Noteheads AB

# Update:       Joerg Jenderek; January 2022
>1      byte                    0x00            ID EXTENSIONS
>1      byte                    0x13            Digidesign Inc.
>1      byte                    0x1e            Key Concepts
>1      byte                    0x20            Passac
>1      byte                    0x23            Stepp
>1      byte                    0x2d            Neve
>1      byte                    0x2e            Soundtracs Ltd.
>1      byte                    0x32            Drawmer
>1      byte                    0x34            Audio Architecture
>1      byte                    0x35            Generalmusic Corp SpA
>1      byte                    0x36            Cheetah Marketing
>1      byte                    0x37            C.T.M.
>1      byte                    0x38            Simmons UK
>1      byte                    0x3a            Steinberg
>1      byte                    0x3b            Wersi GmbH
>1      byte                    0x3c            AVAB Niethammer AB
>1      byte                    0x3d            Digigram
>1      byte                    0x3f            Quasimidi
#
>1      byte                    0x40            Kawai Musical Instruments MFG. CO. Ltd
#>1     byte                    0x45            foo
#>1     byte                    0x4a            foo
#>1     byte                    0x4d            foo
#>1     byte                    0x4f            foo
#>1     byte                    0x53            foo
>1      byte                    0x55            Suzuki Musical Instruments MFG. Co. Ltd.
>1      byte                    0x56            Fuji Sound Corporation Ltd.
#>1     byte                    0x58            foo
>1      byte                    0x59            Faith. Inc.
>1      byte                    0x5a            Internet Corporation
#>1     byte                    0x5b            foo
>1      byte                    0x5c            Seekers Co. Ltd.
#>1     byte                    0x5d            foo
#>1     byte                    0x5e            foo
>1      byte                    0x5f            SD Card Association
# Reserved for other uses for 60H to 7FH
# URL:          https://www.philscomputerlab.com/roland-midi-emulator-project-20.html
# Reference:    http://mark0.net/download/triddefs_xml.7z/defs/s/syx--midiemu.trid.xml
# Note:         called by TrID "MIDI Emulator Project SysEx preset command"
>1      byte                    0x66            MIDI Emulator
# https://electronicmusic.fandom.com/wiki/List_of_MIDI_Manufacturer_IDs
# Educational, prototyping, test, private use and experimentation
>1      byte                    0x7D            PROTOTYPING
# universal non-real-time (sample dump, tuning table, etc.)
>1      byte                    0x7E            UNIVERSAL
# universal real time (MIDI time code, MIDI Machine control, etc.)
>1      byte                    0x7F            universal real time
# display information about End Of eXclusive byte (EOX=F7)
#>2     ubyte                   0xF7            \b, at 2 EOX
#>3     ubyte                   0xF7            \b, at 3 EOX
# https://tttapa.github.io/Control-Surface-doc/new-input/Doxygen/d2/d93/SysEx-Send-Receive_8ino-example.html
>4      ubyte                   0xF7            \b, at 4 EOX
# http://www.1manband.nl/tutorials2/sysex.htm
>5      ubyte                   0xF7            \b, at 5 EOX
# http://www.somascape.org/midi/tech/mfile.html#sysex
>6      ubyte                   0xF7            \b, at 6 EOX
#
>7      ubyte                   0xF7            \b, at 7 EOX
# https://webmidijs.org/forum/discussion/34/how-to-send-or-receive-system-exclusive-messages
>8      ubyte                   0xF7            \b, at 8 EOX
#
>9      ubyte                   0xF7            \b, at 9 EOX
# https://www.chd-el.cz/wp-content/uploads/845010_syxcom.pdf
>10     ubyte                   0xF7            \b, at 10 EOX
# https://stackoverflow.com/questions/52906076/handling-midi-the-input-of-multiple-system-exclusive-messages-in-vb
>11     ubyte                   0xF7            \b, at 11 EOX
# https://www.2writers.com/eddie/TutSysEx.htm
>12     ubyte                   0xF7            \b, at 12 EOX
>13     ubyte                   0xF7            \b, at 13 EOX
# http://www.chromakinetics.com/handsonic/rolSysEx.htm
>14     ubyte                   0xF7            \b, at 14 EOX
#>15    ubyte                   0xF7            \b, at 15 EOX

0       string                  T707            Roland TR-707 Data