/* packet-sysex.c
 *
 * MIDI SysEx dissector
 * Tomasz Mon 2012
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */


#include "config.h"

#include <epan/packet.h>
#include <epan/conversation.h>
#include <epan/expert.h>

void proto_register_sysex(void);
void proto_reg_handoff_sysex(void);

/* protocols and header fields */
static int proto_sysex = -1;
static int hf_sysex_message_start = -1;
static int hf_sysex_manufacturer_id = -1;
static int hf_sysex_three_byte_manufacturer_id = -1;
static int hf_sysex_message_eox = -1;

static gint ett_sysex = -1;

static dissector_handle_t sysex_digitech_handle;

static expert_field ei_sysex_message_start_byte = EI_INIT;
static expert_field ei_sysex_message_end_byte = EI_INIT;
static expert_field ei_sysex_undecoded = EI_INIT;

#define SYSEX_MANUFACTURER_DOD 0x000010

/* Manufacturer and Extended Manufacturer IDs as of April 2019
 * https://www.midi.org/specifications-old/item/manufacturer-id-numbers
 */
static const value_string sysex_manufacturer_id_vals[] = {
    {0x01, "Sequential"},
    {0x02, "IDP"},
    {0x03, "Voyetra Turtle Beach, Inc."},
    {0x04, "Moog Music"},
    {0x05, "Passport Designs"},
    {0x06, "Lexicon Inc."},
    {0x07, "Kurzweil / Young Chang"},
    {0x08, "Fender"},
    {0x09, "MIDI9"},
    {0x0A, "AKG Acoustics"},
    {0x0B, "Voyce Music"},
    {0x0C, "WaveFrame (Timeline)"},
    {0x0D, "ADA Signal Processors, Inc."},
    {0x0E, "Garfield Electronics"},
    {0x0F, "Ensoniq"},
    {0x10, "Oberheim / Gibson Labs"},
    {0x11, "Apple, Inc."},
    {0x12, "Grey Matter Response"},
    {0x13, "Digidesign Inc."},
    {0x14, "Palmtree Instruments"},
    {0x15, "JLCooper Electronics"},
    {0x16, "Lowrey Organ Company"},
    {0x17, "Adams-Smith"},
    {0x18, "E-mu"},
    {0x19, "Harmony Systems"},
    {0x1A, "ART"},
    {0x1B, "Baldwin"},
    {0x1C, "Eventide"},
    {0x1D, "Inventronics"},
    {0x1E, "Key Concepts"},
    {0x1F, "Clarity"},
    {0x20, "Passac"},
    {0x21, "Proel Labs (SIEL)"},
    {0x22, "Synthaxe (UK)"},
    {0x23, "Stepp"},
    {0x24, "Hohner"},
    {0x25, "Twister"},
    {0x26, "Ketron s.r.l."},
    {0x27, "Jellinghaus MS"},
    {0x28, "Southworth Music Systems"},
    {0x29, "PPG (Germany)"},
    {0x2A, "JEN"},
    {0x2B, "Solid State Logic Organ Systems"},
    {0x2C, "Audio Veritrieb-P. Struven"},
    {0x2D, "Neve"},
    {0x2E, "Soundtracs Ltd."},
    {0x2F, "Elka"},
    {0x30, "Dynacord"},
    {0x31, "Viscount International Spa (Intercontinental Electronics)"},
    {0x32, "Drawmer"},
    {0x33, "Clavia Digital Instruments"},
    {0x34, "Audio Architecture"},
    {0x35, "Generalmusic Corp SpA"},
    {0x36, "Cheetah Marketing"},
    {0x37, "C.T.M."},
    {0x38, "Simmons UK"},
    {0x39, "Soundcraft Electronics"},
    {0x3A, "Steinberg Media Technologies AG"},
    {0x3B, "Wersi Gmbh"},
    {0x3C, "AVAB Niethammer AB"},
    {0x3D, "Digigram"},
    {0x3E, "Waldorf Electronics GmbH"},
    {0x3F, "Quasimidi"},
    {0x40, "Kawai Musical Instruments MFG. CO. Ltd"},
    {0x41, "Roland Corporation"},
    {0x42, "Korg Inc."},
    {0x43, "Yamaha Corporation"},
    {0x44, "Casio Computer Co. Ltd"},
    {0x46, "Kamiya Studio Co. Ltd"},
    {0x47, "Akai Electric Co. Ltd."},
    {0x48, "Victor Company of Japan, Ltd."},
    {0x4B, "Fujitsu Limited"},
    {0x4C, "Sony Corporation"},
    {0x4E, "Teac Corporation"},
    {0x50, "Matsushita Electric Industrial Co. , Ltd"},
    {0x51, "Fostex Corporation"},
    {0x52, "Zoom Corporation"},
    {0x54, "Matsushita Communication Industrial Co., Ltd."},
    {0x55, "Suzuki Musical Instruments MFG. Co., Ltd."},
    {0x56, "Fuji Sound Corporation Ltd."},
    {0x57, "Acoustic Technical Laboratory, Inc."},
    {0x59, "Faith, Inc."},
    {0x5A, "Internet Corporation"},
    {0x5C, "Seekers Co. Ltd."},
    {0x5F, "SD Card Association"},
    /* Three special IDs specified in MIDI 1.0 Detailed Specification */
    {0x7D, "Educational/Non-Commercial Use"},
    {0x7E, "Non-Real Time Universal System Exclusive"},
    {0x7F, "Real Time Universal System Exclusive"},
    {0,NULL}
};
static value_string_ext sysex_manufacturer_id_vals_ext =
    VALUE_STRING_EXT_INIT(sysex_manufacturer_id_vals);

static const value_string sysex_extended_manufacturer_id_vals[] = {
    {0x000001, "Time/Warner Interactive"},
    {0x000002, "Advanced Gravis Comp. Tech Ltd."},
    {0x000003, "Media Vision"},
    {0x000004, "Dornes Research Group"},
    {0x000005, "K-Muse"},
    {0x000006, "Stypher"},
    {0x000007, "Digital Music Corp."},
    {0x000008, "IOTA Systems"},
    {0x000009, "New England Digital"},
    {0x00000A, "Artisyn"},
    {0x00000B, "IVL Technologies Ltd."},
    {0x00000C, "Southern Music Systems"},
    {0x00000D, "Lake Butler Sound Company"},
    {0x00000E, "Alesis Studio Electronics"},
    {0x00000F, "Sound Creation"},
    {0x000010, "DOD Electronics Corp."},
    {0x000011, "Studer-Editech"},
    {0x000012, "Sonus"},
    {0x000013, "Temporal Acuity Products"},
    {0x000014, "Perfect Fretworks"},
    {0x000015, "KAT Inc."},
    {0x000016, "Opcode Systems"},
    {0x000017, "Rane Corporation"},
    {0x000018, "Anadi Electronique"},
    {0x000019, "KMX"},
    {0x00001A, "Allen & Heath Brenell"},
    {0x00001B, "Peavey Electronics"},
    {0x00001C, "360 Systems"},
    {0x00001D, "Spectrum Design and Development"},
    {0x00001E, "Marquis Music"},
    {0x00001F, "Zeta Systems"},
    {0x000020, "Axxes (Brian Parsonett)"},
    {0x000021, "Orban"},
    {0x000022, "Indian Valley Mfg."},
    {0x000023, "Triton"},
    {0x000024, "KTI"},
    {0x000025, "Breakaway Technologies"},
    {0x000026, "Leprecon / CAE Inc."},
    {0x000027, "Harrison Systems Inc."},
    {0x000028, "Future Lab/Mark Kuo"},
    {0x000029, "Rocktron Corporation"},
    {0x00002A, "PianoDisc"},
    {0x00002B, "Cannon Research Group"},
    {0x00002C, "Reserved"},
    {0x00002D, "Rodgers Instrument LLC"},
    {0x00002E, "Blue Sky Logic"},
    {0x00002F, "Encore Electronics"},
    {0x000030, "Uptown"},
    {0x000031, "Voce"},
    {0x000032, "CTI Audio, Inc. (Musically Intel. Devs.)"},
    {0x000033, "S3 Incorporated"},
    {0x000034, "Broderbund / Red Orb"},
    {0x000035, "Allen Organ Co."},
    {0x000036, "Reserved"},
    {0x000037, "Music Quest"},
    {0x000038, "Aphex"},
    {0x000039, "Gallien Krueger"},
    {0x00003A, "IBM"},
    {0x00003B, "Mark Of The Unicorn"},
    {0x00003C, "Hotz Corporation"},
    {0x00003D, "ETA Lighting"},
    {0x00003E, "NSI Corporation"},
    {0x00003F, "Ad Lib, Inc."},
    {0x000040, "Richmond Sound Design"},
    {0x000041, "Microsoft"},
    {0x000042, "Mindscape (Software Toolworks)"},
    {0x000043, "Russ Jones Marketing / Niche"},
    {0x000044, "Intone"},
    {0x000045, "Advanced Remote Technologies"},
    {0x000046, "White Instruments"},
    {0x000047, "GT Electronics/Groove Tubes"},
    {0x000048, "Pacific Research & Engineering"},
    {0x000049, "Timeline Vista, Inc."},
    {0x00004A, "Mesa Boogie Ltd."},
    {0x00004B, "FSLI"},
    {0x00004C, "Sequoia Development Group"},
    {0x00004D, "Studio Electronics"},
    {0x00004E, "Euphonix, Inc"},
    {0x00004F, "InterMIDI, Inc."},
    {0x000050, "MIDI Solutions Inc."},
    {0x000051, "3DO Company"},
    {0x000052, "Lightwave Research / High End Systems"},
    {0x000053, "Micro-W Corporation"},
    {0x000054, "Spectral Synthesis, Inc."},
    {0x000055, "Lone Wolf"},
    {0x000056, "Studio Technologies Inc."},
    {0x000057, "Peterson Electro-Musical Product, Inc."},
    {0x000058, "Atari Corporation"},
    {0x000059, "Marion Systems Corporation"},
    {0x00005A, "Design Event"},
    {0x00005B, "Winjammer Software Ltd."},
    {0x00005C, "AT&T Bell Laboratories"},
    {0x00005D, "Reserved"},
    {0x00005E, "Symetrix"},
    {0x00005F, "MIDI the World"},
    {0x000060, "Spatializer"},
    {0x000061, "Micros 'N MIDI"},
    {0x000062, "Accordians International"},
    {0x000063, "EuPhonics (now 3Com)"},
    {0x000064, "Musonix"},
    {0x000065, "Turtle Beach Systems (Voyetra)"},
    {0x000066, "Loud Technologies / Mackie"},
    {0x000067, "Compuserve"},
    {0x000068, "BEC Technologies"},
    {0x000069, "QRS Music Inc"},
    {0x00006A, "P.G. Music"},
    {0x00006B, "Sierra Semiconductor"},
    {0x00006C, "EpiGraf"},
    {0x00006D, "Electronics Diversified Inc"},
    {0x00006E, "Tune 1000"},
    {0x00006F, "Advanced Micro Devices"},
    {0x000070, "Mediamation"},
    {0x000071, "Sabine Musical Mfg. Co. Inc."},
    {0x000072, "Woog Labs"},
    {0x000073, "Micropolis Corp"},
    {0x000074, "Ta Horng Musical Instrument"},
    {0x000075, "e-Tek Labs (Forte Tech)"},
    {0x000076, "Electro-Voice"},
    {0x000077, "Midisoft Corporation"},
    {0x000078, "QSound Labs"},
    {0x000079, "Westrex"},
    {0x00007A, "Nvidia"},
    {0x00007B, "ESS Technology"},
    {0x00007C, "Media Trix Peripherals"},
    {0x00007D, "Brooktree Corp"},
    {0x00007E, "Otari Corp"},
    {0x00007F, "Key Electronics, Inc."},
    {0x000100, "Shure Incorporated"},
    {0x000101, "AuraSound"},
    {0x000102, "Crystal Semiconductor"},
    {0x000103, "Conexant (Rockwell)"},
    {0x000104, "Silicon Graphics"},
    {0x000105, "M-Audio (Midiman)"},
    {0x000106, "PreSonus"},
    {0x000108, "Topaz Enterprises"},
    {0x000109, "Cast Lighting"},
    {0x00010A, "Microsoft"},
    {0x00010B, "Sonic Foundry"},
    {0x00010C, "Line 6 (Fast Forward) (Yamaha)"},
    {0x00010D, "Beatnik Inc"},
    {0x00010E, "Van Koevering Company"},
    {0x00010F, "Altech Systems"},
    {0x000110, "S & S Research"},
    {0x000111, "VLSI Technology"},
    {0x000112, "Chromatic Research"},
    {0x000113, "Sapphire"},
    {0x000114, "IDRC"},
    {0x000115, "Justonic Tuning"},
    {0x000116, "TorComp Research Inc."},
    {0x000117, "Newtek Inc."},
    {0x000118, "Sound Sculpture"},
    {0x000119, "Walker Technical"},
    {0x00011A, "Digital Harmony (PAVO)"},
    {0x00011B, "InVision Interactive"},
    {0x00011C, "T-Square Design"},
    {0x00011D, "Nemesys Music Technology"},
    {0x00011E, "DBX Professional (Harman Intl)"},
    {0x00011F, "Syndyne Corporation"},
    {0x000120, "Bitheadz"},
    {0x000121, "Cakewalk Music Software"},
    {0x000122, "Analog Devices"},
    {0x000123, "National Semiconductor"},
    {0x000124, "Boom Theory / Adinolfi Alternative Percussion"},
    {0x000125, "Virtual DSP Corporation"},
    {0x000126, "Antares Systems"},
    {0x000127, "Angel Software"},
    {0x000128, "St Louis Music"},
    {0x000129, "Passport Music Software LLC (Gvox)"},
    {0x00012A, "Ashley Audio Inc."},
    {0x00012B, "Vari-Lite Inc."},
    {0x00012C, "Summit Audio Inc."},
    {0x00012D, "Aureal Semiconductor Inc."},
    {0x00012E, "SeaSound LLC"},
    {0x00012F, "U.S. Robotics"},
    {0x000130, "Aurisis Research"},
    {0x000131, "Nearfield Research"},
    {0x000132, "FM7 Inc"},
    {0x000133, "Swivel Systems"},
    {0x000134, "Hyperactive Audio Systems"},
    {0x000135, "MidiLite (Castle Studios Productions)"},
    {0x000136, "Radikal Technologies"},
    {0x000137, "Roger Linn Design"},
    {0x000138, "TC-Helicon Vocal Technologies"},
    {0x000139, "Event Electronics"},
    {0x00013A, "Sonic Network Inc"},
    {0x00013B, "Realtime Music Solutions"},
    {0x00013C, "Apogee Digital"},
    {0x00013D, "Classical Organs, Inc."},
    {0x00013E, "Microtools Inc."},
    {0x00013F, "Numark Industries"},
    {0x000140, "Frontier Design Group, LLC"},
    {0x000141, "Recordare LLC"},
    {0x000142, "Starr Labs"},
    {0x000143, "Voyager Sound Inc."},
    {0x000144, "Manifold Labs"},
    {0x000145, "Aviom Inc."},
    {0x000146, "Mixmeister Technology"},
    {0x000147, "Notation Software"},
    {0x000148, "Mercurial Communications"},
    {0x000149, "Wave Arts"},
    {0x00014A, "Logic Sequencing Devices"},
    {0x00014B, "Axess Electronics"},
    {0x00014C, "Muse Research"},
    {0x00014D, "Open Labs"},
    {0x00014E, "Guillemot Corp"},
    {0x00014F, "Samson Technologies"},
    {0x000150, "Electronic Theatre Controls"},
    {0x000151, "Blackberry (RIM)"},
    {0x000152, "Mobileer"},
    {0x000153, "Synthogy"},
    {0x000154, "Lynx Studio Technology Inc."},
    {0x000155, "Damage Control Engineering LLC"},
    {0x000156, "Yost Engineering, Inc."},
    {0x000157, "Brooks & Forsman Designs LLC / DrumLite"},
    {0x000158, "Infinite Response"},
    {0x000159, "Garritan Corp"},
    {0x00015A, "Plogue Art et Technologie, Inc"},
    {0x00015B, "RJM Music Technology"},
    {0x00015C, "Custom Solutions Software"},
    {0x00015D, "Sonarcana LLC / Highly Liquid"},
    {0x00015E, "Centrance"},
    {0x00015F, "Kesumo LLC"},
    {0x000160, "Stanton (Gibson Brands)"},
    {0x000161, "Livid Instruments"},
    {0x000162, "First Act / 745 Media"},
    {0x000163, "Pygraphics, Inc."},
    {0x000164, "Panadigm Innovations Ltd"},
    {0x000165, "Avedis Zildjian Co"},
    {0x000166, "Auvital Music Corp"},
    {0x000167, "You Rock Guitar (was: Inspired Instruments)"},
    {0x000168, "Chris Grigg Designs"},
    {0x000169, "Slate Digital LLC"},
    {0x00016A, "Mixware"},
    {0x00016B, "Social Entropy"},
    {0x00016C, "Source Audio LLC"},
    {0x00016D, "Ernie Ball / Music Man"},
    {0x00016E, "Fishman"},
    {0x00016F, "Custom Audio Electronics"},
    {0x000170, "American Audio/DJ"},
    {0x000171, "Mega Control Systems"},
    {0x000172, "Kilpatrick Audio"},
    {0x000173, "iConnectivity"},
    {0x000174, "Fractal Audio"},
    {0x000175, "NetLogic Microsystems"},
    {0x000176, "Music Computing"},
    {0x000177, "Nektar Technology Inc"},
    {0x000178, "Zenph Sound Innovations"},
    {0x000179, "DJTechTools.com"},
    {0x00017A, "Rezonance Labs"},
    {0x00017B, "Decibel Eleven"},
    {0x00017C, "CNMAT"},
    {0x00017D, "Media Overkill"},
    {0x00017E, "Confusion Studios"},
    {0x00017F, "moForte Inc"},
    {0x000200, "Miselu Inc"},
    {0x000201, "Amelia's Compass LLC"},
    {0x000202, "Zivix LLC"},
    {0x000203, "Artiphon"},
    {0x000204, "Synclavier Digital"},
    {0x000205, "Light & Sound Control Devices LLC"},
    {0x000206, "Retronyms Inc"},
    {0x000207, "JS Technologies"},
    {0x000208, "Quicco Sound"},
    {0x000209, "A-Designs Audio"},
    {0x00020A, "McCarthy Music Corp"},
    {0x00020B, "Denon DJ"},
    {0x00020C, "Keith Robert Murray"},
    {0x00020D, "Google"},
    {0x00020E, "ISP Technologies"},
    {0x00020F, "Abstrakt Instruments LLC"},
    {0x000210, "Meris LLC"},
    {0x000211, "Sensorpoint LLC"},
    {0x000212, "Hi-Z Labs"},
    {0x000213, "Imitone"},
    {0x000214, "Intellijel Designs Inc."},
    {0x000215, "Dasz Instruments Inc."},
    {0x000216, "Remidi"},
    {0x000217, "Disaster Area Designs LLC"},
    {0x000218, "Universal Audio"},
    {0x000219, "Carter Duncan Corp"},
    {0x00021A, "Essential Technology"},
    {0x00021B, "Cantux Research LLC"},
    {0x00021C, "Hummel Technologies"},
    {0x00021D, "Sensel Inc"},
    {0x00021E, "DBML Group"},
    {0x00021F, "Madrona Labs"},
    {0x000220, "Mesa Boogie"},
    {0x000221, "Effigy Labs"},
    {0x000222, "MK2 Image Ltd"},
    {0x000223, "Red Panda LLC"},
    {0x000224, "OnSong LLC"},
    {0x000225, "Jamboxx Inc."},
    {0x000226, "Electro-Harmonix "},
    {0x000227, "RnD64 Inc"},
    {0x000228, "Neunaber Technology LLC "},
    {0x000229, "Kaom Inc."},
    {0x00022A, "Hallowell EMC"},
    {0x00022B, "Sound Devices, LLC"},
    {0x00022C, "Spectrasonics, Inc"},
    {0x00022D, "Second Sound, LLC"},
    {0x002000, "Dream SAS"},
    {0x002001, "Strand Lighting"},
    {0x002002, "Amek Div of Harman Industries"},
    {0x002003, "Casa Di Risparmio Di Loreto"},
    {0x002004, "Böhm electronic GmbH"},
    {0x002005, "Syntec Digital Audio"},
    {0x002006, "Trident Audio Developments"},
    {0x002007, "Real World Studio"},
    {0x002008, "Evolution Synthesis, Ltd"},
    {0x002009, "Yes Technology"},
    {0x00200A, "Audiomatica"},
    {0x00200B, "Bontempi SpA (Sigma)"},
    {0x00200C, "F.B.T. Elettronica SpA"},
    {0x00200D, "MidiTemp GmbH"},
    {0x00200E, "LA Audio (Larking Audio)"},
    {0x00200F, "Zero 88 Lighting Limited"},
    {0x002010, "Micon Audio Electronics GmbH"},
    {0x002011, "Forefront Technology"},
    {0x002012, "Studio Audio and Video Ltd."},
    {0x002013, "Kenton Electronics"},
    {0x002014, "Celco/ Electrosonic"},
    {0x002015, "ADB"},
    {0x002016, "Marshall Products Limited"},
    {0x002017, "DDA"},
    {0x002018, "BSS Audio Ltd."},
    {0x002019, "MA Lighting Technology"},
    {0x00201A, "Fatar SRL c/o Music Industries"},
    {0x00201B, "QSC Audio Products Inc."},
    {0x00201C, "Artisan Clasic Organ Inc."},
    {0x00201D, "Orla Spa"},
    {0x00201E, "Pinnacle Audio (Klark Teknik PLC)"},
    {0x00201F, "TC Electronics"},
    {0x002020, "Doepfer Musikelektronik GmbH"},
    {0x002021, "Creative ATC / E-mu"},
    {0x002022, "Seyddo/Minami"},
    {0x002023, "LG Electronics (Goldstar)"},
    {0x002024, "Midisoft sas di M.Cima & C"},
    {0x002025, "Samick Musical Inst. Co. Ltd."},
    {0x002026, "Penny and Giles (Bowthorpe PLC)"},
    {0x002027, "Acorn Computer"},
    {0x002028, "LSC Electronics Pty. Ltd."},
    {0x002029, "Focusrite/Novation"},
    {0x00202A, "Samkyung Mechatronics"},
    {0x00202B, "Medeli Electronics Co."},
    {0x00202C, "Charlie Lab SRL"},
    {0x00202D, "Blue Chip Music Technology"},
    {0x00202E, "BEE OH Corp"},
    {0x00202F, "LG Semicon America"},
    {0x002030, "TESI"},
    {0x002031, "EMAGIC"},
    {0x002032, "Behringer GmbH"},
    {0x002033, "Access Music Electronics"},
    {0x002034, "Synoptic"},
    {0x002035, "Hanmesoft"},
    {0x002036, "Terratec Electronic GmbH"},
    {0x002037, "Proel SpA"},
    {0x002038, "IBK MIDI"},
    {0x002039, "IRCAM"},
    {0x00203A, "Propellerhead Software"},
    {0x00203B, "Red Sound Systems Ltd"},
    {0x00203C, "Elektron ESI AB"},
    {0x00203D, "Sintefex Audio"},
    {0x00203E, "MAM (Music and More)"},
    {0x00203F, "Amsaro GmbH"},
    {0x002040, "CDS Advanced Technology BV (Lanbox)"},
    {0x002041, "Mode Machines (Touched By Sound GmbH)"},
    {0x002042, "DSP Arts"},
    {0x002043, "Phil Rees Music Tech"},
    {0x002044, "Stamer Musikanlagen GmbH"},
    {0x002045, "Musical Muntaner S.A. dba Soundart"},
    {0x002046, "C-Mexx Software"},
    {0x002047, "Klavis Technologies"},
    {0x002048, "Noteheads AB"},
    {0x002049, "Algorithmix"},
    {0x00204A, "Skrydstrup R&D"},
    {0x00204B, "Professional Audio Company"},
    {0x00204C, "NewWave Labs (MadWaves)"},
    {0x00204D, "Vermona"},
    {0x00204E, "Nokia"},
    {0x00204F, "Wave Idea"},
    {0x002050, "Hartmann GmbH"},
    {0x002051, "Lion's Tracs"},
    {0x002052, "Analogue Systems"},
    {0x002053, "Focal-JMlab"},
    {0x002054, "Ringway Electronics (Chang-Zhou) Co Ltd"},
    {0x002055, "Faith Technologies (Digiplug)"},
    {0x002056, "Showworks"},
    {0x002057, "Manikin Electronic"},
    {0x002058, "1 Come Tech"},
    {0x002059, "Phonic Corp"},
    {0x00205A, "Dolby Australia (Lake)"},
    {0x00205B, "Silansys Technologies"},
    {0x00205C, "Winbond Electronics"},
    {0x00205D, "Cinetix Medien und Interface GmbH"},
    {0x00205E, "A&G Soluzioni Digitali"},
    {0x00205F, "Sequentix GmbH"},
    {0x002060, "Oram Pro Audio"},
    {0x002061, "Be4 Ltd"},
    {0x002062, "Infection Music"},
    {0x002063, "Central Music Co. (CME)"},
    {0x002064, "genoQs Machines GmbH"},
    {0x002065, "Medialon"},
    {0x002066, "Waves Audio Ltd"},
    {0x002067, "Jerash Labs"},
    {0x002068, "Da Fact"},
    {0x002069, "Elby Designs"},
    {0x00206A, "Spectral Audio"},
    {0x00206B, "Arturia"},
    {0x00206C, "Vixid"},
    {0x00206D, "C-Thru Music"},
    {0x00206E, "Ya Horng Electronic Co LTD"},
    {0x00206F, "SM Pro Audio"},
    {0x002070, "OTO Machines"},
    {0x002071, "ELZAB S.A. (G LAB)"},
    {0x002072, "Blackstar Amplification Ltd"},
    {0x002073, "M3i Technologies GmbH"},
    {0x002074, "Gemalto (from Xiring)"},
    {0x002075, "Prostage SL"},
    {0x002076, "Teenage Engineering"},
    {0x002077, "Tobias Erichsen Consulting"},
    {0x002078, "Nixer Ltd"},
    {0x002079, "Hanpin Electron Co Ltd"},
    {0x00207A, "\"MIDI-hardware\" R.Sowa"},
    {0x00207B, "Beyond Music Industrial Ltd"},
    {0x00207C, "Kiss Box B.V."},
    {0x00207D, "Misa Digital Technologies Ltd"},
    {0x00207E, "AI Musics Technology Inc"},
    {0x00207F, "Serato Inc LP"},
    {0x002100, "Limex"},
    {0x002101, "Kyodday (Tokai)"},
    {0x002102, "Mutable Instruments"},
    {0x002103, "PreSonus Software Ltd"},
    {0x002104, "Ingenico (was Xiring)"},
    {0x002105, "Fairlight Instruments Pty Ltd"},
    {0x002106, "Musicom Lab"},
    {0x002107, "Modal Electronics (Modulus/VacoLoco)"},
    {0x002108, "RWA (Hong Kong) Limited"},
    {0x002109, "Native Instruments"},
    {0x00210A, "Naonext"},
    {0x00210B, "MFB"},
    {0x00210C, "Teknel Research"},
    {0x00210D, "Ploytec GmbH"},
    {0x00210E, "Surfin Kangaroo Studio"},
    {0x00210F, "Philips Electronics HK Ltd"},
    {0x002110, "ROLI Ltd"},
    {0x002111, "Panda-Audio Ltd"},
    {0x002112, "BauM Software"},
    {0x002113, "Machinewerks Ltd."},
    {0x002114, "Xiamen Elane Electronics"},
    {0x002115, "Marshall Amplification PLC"},
    {0x002116, "Kiwitechnics Ltd"},
    {0x002117, "Rob Papen"},
    {0x002118, "Spicetone OU"},
    {0x002119, "V3Sound"},
    {0x00211A, "IK Multimedia"},
    {0x00211B, "Novalia Ltd"},
    {0x00211C, "Modor Music"},
    {0x00211D, "Ableton"},
    {0x00211E, "Dtronics"},
    {0x00211F, "ZAQ Audio"},
    {0x002120, "Muabaobao Education Technology Co Ltd"},
    {0x002121, "Flux Effects"},
    {0x002122, "Audiothingies (MCDA)"},
    {0x002123, "Retrokits"},
    {0x002124, "Morningstar FX Pte Ltd"},
    {0x002125, "Changsha Hotone Audio Co Ltd"},
    {0x002126, "Expressive E"},
    {0x002127, "Expert Sleepers Ltd"},
    {0x002128, "Timecode-Vision Technology"},
    {0x002129, "Hornberg Research GbR"},
    {0x00212A, "Sonic Potions"},
    {0x00212B, "Audiofront"},
    {0x00212C, "Fred's Lab"},
    {0x00212D, "Audio Modeling"},
    {0x00212E, "C. Bechstein Digital GmbH"},
    {0x00212F, "Motas Electronics Ltd"},
    {0x002130, "MIND Music Labs"},
    {0x002131, "Sonic Academy Ltd"},
    {0x002132, "Bome Software"},
    {0x002133, "AODYO SAS"},
    {0x002134, "Pianoforce S.R.O"},
    {0x002135, "Dreadbox P.C."},
    {0x002136, "TouchKeys Instruments Ltd"},
    {0x002137, "The Gigrig Ltd"},
    {0x002138, "ALM Co"},
    {0x002139, "CH Sound Design"},
    {0x00213A, "Beat Bars"},
    {0x00213B, "Blokas"},
    {0x00213C, "GEWA Music GmbH"},
    {0x00213D, "dadamachines"},
    {0x00213E, "Augmented Instruments Ltd (Bela)"},
    {0x00213F, "Supercritical Ltd"},
    {0x004000, "Crimson Technology Inc."},
    {0x004001, "Softbank Mobile Corp"},
    {0x004003, "D&M Holdings Inc."},
    {0,NULL}
};
static value_string_ext sysex_extended_manufacturer_id_vals_ext =
    VALUE_STRING_EXT_INIT(sysex_extended_manufacturer_id_vals);

/* dissector for System Exclusive MIDI data */
static int
dissect_sysex_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data _U_)
{
    guint8 sysex_helper;
    gint data_len;
    proto_item *item;
    proto_item *ti = NULL;
    proto_tree *tree = NULL;
    gint offset = 0;
    gint manufacturer_payload_len;
    guint8 manufacturer_id;
    guint32 three_byte_manufacturer_id = 0xFFFFFF;

    col_set_str(pinfo->cinfo, COL_PROTOCOL, "SYSEX");
    col_set_str(pinfo->cinfo, COL_INFO, "MIDI System Exclusive Command");

    data_len = tvb_reported_length(tvb);

    ti = proto_tree_add_protocol_format(parent_tree, proto_sysex, tvb, 0, -1, "MIDI System Exclusive Command");
    tree = proto_item_add_subtree(ti, ett_sysex);

    /* Check start byte (System Exclusive - 0xF0) */
    sysex_helper = tvb_get_guint8(tvb, 0);
    item = proto_tree_add_item(tree, hf_sysex_message_start, tvb, offset, 1, ENC_BIG_ENDIAN);
    if (sysex_helper != 0xF0)
    {
        expert_add_info(pinfo, item, &ei_sysex_message_start_byte);
    }

    offset++;

    manufacturer_id = tvb_get_guint8(tvb, offset);
    /* Three-byte manufacturer ID starts with 00 */
    if (manufacturer_id == 0)
    {
        three_byte_manufacturer_id = tvb_get_ntoh24(tvb, offset);
        proto_tree_add_item(tree, hf_sysex_three_byte_manufacturer_id, tvb, offset, 3, ENC_BIG_ENDIAN);
        offset += 3;
    }
    /* One-byte manufacturer ID */
    else
    {
        proto_tree_add_item(tree, hf_sysex_manufacturer_id, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
    }

    /* Following data is menufacturer-specific */
    manufacturer_payload_len = data_len - offset - 1;
    if (manufacturer_payload_len > 0)
    {
        tvbuff_t *payload_tvb = tvb_new_subset_length(tvb, offset, manufacturer_payload_len);
        switch (three_byte_manufacturer_id)
        {
            case SYSEX_MANUFACTURER_DOD:
            {
                offset += call_dissector(sysex_digitech_handle, payload_tvb, pinfo, parent_tree);
                break;
            }
            default:
                break;
        }
    }

    if (offset < data_len - 1)
    {
        proto_tree_add_expert(tree, pinfo, &ei_sysex_undecoded, tvb, offset, data_len - offset - 1);
    }

    /* Check end byte (EOX - 0xF7) */
    sysex_helper = tvb_get_guint8(tvb, data_len - 1);
    item = proto_tree_add_item(tree, hf_sysex_message_eox, tvb, data_len - 1, 1, ENC_BIG_ENDIAN);
    if (sysex_helper != 0xF7)
    {
        expert_add_info(pinfo, item, &ei_sysex_message_end_byte);
    }
    return tvb_captured_length(tvb);
}

void
proto_register_sysex(void)
{
    static hf_register_info hf[] = {
        { &hf_sysex_message_start,
            { "SysEx message start", "sysex.start", FT_UINT8, BASE_HEX,
              NULL, 0, "System Exclusive Message start (0xF0)", HFILL }},
        { &hf_sysex_manufacturer_id,
            { "Manufacturer ID", "sysex.manufacturer_id", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
              &sysex_manufacturer_id_vals_ext, 0, NULL, HFILL }},
        { &hf_sysex_three_byte_manufacturer_id,
            { "Manufacturer ID", "sysex.manufacturer_id", FT_UINT24, BASE_HEX|BASE_EXT_STRING,
              &sysex_extended_manufacturer_id_vals_ext, 0, NULL, HFILL }},
        { &hf_sysex_message_eox,
            { "EOX", "sysex.eox", FT_UINT8, BASE_HEX,
              NULL, 0, "System Exclusive Message end (0xF7)", HFILL}},
    };

    static gint *sysex_subtrees[] = {
        &ett_sysex
    };

    static ei_register_info ei[] = {
        { &ei_sysex_message_start_byte, { "sysex.message_start_byte", PI_PROTOCOL, PI_WARN, "SYSEX Error: Wrong start byte", EXPFILL }},
        { &ei_sysex_message_end_byte, { "sysex.message_end_byte", PI_PROTOCOL, PI_WARN, "SYSEX Error: Wrong end byte", EXPFILL }},
        { &ei_sysex_undecoded, { "sysex.undecoded", PI_UNDECODED, PI_WARN, "Not dissected yet (report to wireshark.org)", EXPFILL }},
    };

    expert_module_t* expert_sysex;

    proto_sysex = proto_register_protocol("MIDI System Exclusive", "SYSEX", "sysex");
    proto_register_field_array(proto_sysex, hf, array_length(hf));
    proto_register_subtree_array(sysex_subtrees, array_length(sysex_subtrees));
    expert_sysex = expert_register_protocol(proto_sysex);
    expert_register_field_array(expert_sysex, ei, array_length(ei));

    register_dissector("sysex", dissect_sysex_command, proto_sysex);
}

void
proto_reg_handoff_sysex(void)
{
    sysex_digitech_handle = find_dissector_add_dependency("sysex_digitech", proto_sysex);
}

/*
 * Editor modelines
 *
 * Local Variables:
 * c-basic-offset: 4
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * ex: set shiftwidth=4 tabstop=8 expandtab:
 * :indentSize=4:tabSize=8:noTabs=true:
 */
