    {- |
    MIDI device manufacturers and their id's.
    -}
    module Sound.MIDI.Manufacturer
     (T, get, put,

      sequential, idp, octavePlateau, moog, passport, lexicon, kurzweil,
      fender,  gulbransen,  akg,  voyce,  waveframe,  ada,  garfield,  ensoniq,
      oberheim,  apple,  greyMatter,  digidesign,  palmTree,  jlCooper,  lowrey,
      adamsSmith,  emu,  harmony,  art,  baldwin,  eventide,  inventronics,
      keyConcepts,  clarity,

      timeWarner,  digitalMusic,  iota,  newEngland,  artisyn,  ivl,
      southernMusic,  lakeButler,  alesis,  dod,  studerEditech,  perfectFret,
      kat,  opcode,  rane,  anadi,  kmx,  brenell,  peavey,  systems360,
      spectrum,  marquis,  zeta,  axxes,  orban,  kti,  breakaway,  cae,
      rocktron,  pianoDisc,  cannon,  rogers,  blueSkyLogic,  encore,  uptown,
      voce,  cti,  ssResearch,  broderbund,  allenOrgan,  musicQuest,  aphex,
      gallienKrueger,  ibm,  hotzInstruments,  etaLighting,  nsi,  adLib,
      richmond,  microsoft,  softwareToolworks,  rjmgNiche,  intone,
      grooveTubes,  euphonix,  interMIDI,  loneWolf,  musonix,  taHorng,  eTek,
      electrovoice,  midisoft,  qSoundLabs,  westrex,  nVidia,  ess,  mediaTrix,
      brooktree,  otari,  keyElectronics,  crystalake,  crystal,  rockwell,
      siliconGraphics,  midiman,  preSonus,  topaz,  castLighting,
      microsoftConsumer,  fastForward,  headspace,  vanKoevering,  altech,
      vlsi,  chromaticResearch,  sapphire,  idrc,  justonic,  torComp,  newtek,
      soundSculpture,  walker,  pavo,  inVision,  tSquareDesign,  nemesys,  dbx,
      syndyne,  bitheadz,  cakewalk,  staccato,  nationalSemiconductor,
      boomTheory,  virtualDSP,  antares,  angelSoftware,  stLouis,  lyrrus,

      passac,  siel,  synthaxe,  hohner,  twister,  solton,  jellinghaus,
      southworth,  ppg,  jen,  ssl,  audioVeritrieb,  elka,  dynacord,
      viscount,  clavia,  audioArchitect,  generalMusic,  soundcraft,  wersi,
      avab,  digigram,  waldorf,  quasimidi,

      dream,  strandLighting,  amek,  drBohm,  trident,  realWorldDesign,
      yesTechnology,  audiomatica,  bontempiFarfisa,  fbtElectronica,  miditemp,
      larkingAudio,  zero88lighting,  miconAudio,  forefront,  kenton,  adb,
      jimMarshall,  dda,  bssAudio,  tcElectronic,  medeli,  charlieLab,
      blueChip,  beeOH,  lgSemiconductor,  tesi,  emagic,  behringer,  access,
      synoptic,  hanmesoft,  terratec,  proel,  ibk,

      kawai,  roland,  korg,  yamaha,  casio,  kamiya,  akai,  japanVictor,
      mesosha,  hoshinoGakki,  fujitsuElect,  sony,  nisshinOnpa,  teac,
      matsushitaElec,  fostex,  zoom,  midori,  matsushitaComm,  suzuki,

      nonCommercial,  nonRealTime,  realTime,
      ) where

    import           Sound.MIDI.Parser.Primitive
    import qualified Sound.MIDI.Parser.Class as Parser

    import qualified Sound.MIDI.Writer.Basic as Writer
    import Sound.MIDI.Monoid ((+#+))

    import Control.Monad (liftM2, )

    import Data.Word (Word8)

    data T =
         Short Word8
       | Extended Word8 Word8
       deriving (Show, Eq, Ord)

    -- * North American Group

    sequential, idp, octavePlateau, moog, passport, lexicon, kurzweil,
      fender,  gulbransen,  akg,  voyce,  waveframe,  ada,  garfield,  ensoniq,
      oberheim,  apple,  greyMatter,  digidesign,  palmTree,  jlCooper,  lowrey,
      adamsSmith,  emu,  harmony,  art,  baldwin,  eventide,  inventronics,
      keyConcepts,  clarity,

      timeWarner,  digitalMusic,  iota,  newEngland,  artisyn,  ivl,
      southernMusic,  lakeButler,  alesis,  dod,  studerEditech,  perfectFret,
      kat,  opcode,  rane,  anadi,  kmx,  brenell,  peavey,  systems360,
      spectrum,  marquis,  zeta,  axxes,  orban,  kti,  breakaway,  cae,
      rocktron,  pianoDisc,  cannon,  rogers,  blueSkyLogic,  encore,  uptown,
      voce,  cti,  ssResearch,  broderbund,  allenOrgan,  musicQuest,  aphex,
      gallienKrueger,  ibm,  hotzInstruments,  etaLighting,  nsi,  adLib,
      richmond,  microsoft,  softwareToolworks,  rjmgNiche,  intone,
      grooveTubes,  euphonix,  interMIDI,  loneWolf,  musonix,  taHorng,  eTek,
      electrovoice,  midisoft,  qSoundLabs,  westrex,  nVidia,  ess,  mediaTrix,
      brooktree,  otari,  keyElectronics,  crystalake,  crystal,  rockwell,
      siliconGraphics,  midiman,  preSonus,  topaz,  castLighting,
      microsoftConsumer,  fastForward,  headspace,  vanKoevering,  altech,
      vlsi,  chromaticResearch,  sapphire,  idrc,  justonic,  torComp,  newtek,
      soundSculpture,  walker,  pavo,  inVision,  tSquareDesign,  nemesys,  dbx,
      syndyne,  bitheadz,  cakewalk,  staccato,  nationalSemiconductor,
      boomTheory,  virtualDSP,  antares,  angelSoftware,  stLouis,  lyrrus :: T

    sequential     = Short 0x01
    idp            = Short 0x02
    octavePlateau  = Short 0x03
    moog           = Short 0x04
    passport       = Short 0x05
    lexicon        = Short 0x06
    kurzweil       = Short 0x07
    fender         = Short 0x08
    gulbransen     = Short 0x09
    akg            = Short 0x0A
    voyce          = Short 0x0B
    waveframe      = Short 0x0C
    ada            = Short 0x0D
    garfield       = Short 0x0E
    ensoniq        = Short 0x0F
    oberheim       = Short 0x10
    apple          = Short 0x11
    greyMatter     = Short 0x12
    digidesign     = Short 0x13
    palmTree       = Short 0x14
    jlCooper       = Short 0x15
    lowrey         = Short 0x16
    adamsSmith     = Short 0x17
    emu            = Short 0x18
    harmony        = Short 0x19
    art            = Short 0x1A
    baldwin        = Short 0x1B
    eventide       = Short 0x1C
    inventronics   = Short 0x1D
    keyConcepts    = Short 0x1E
    clarity        = Short 0x1F

    timeWarner     = Extended 0x00 0x01
    digitalMusic   = Extended 0x00 0x07
    iota           = Extended 0x00 0x08
    newEngland     = Extended 0x00 0x09
    artisyn        = Extended 0x00 0x0A
    ivl            = Extended 0x00 0x0B
    southernMusic  = Extended 0x00 0x0C
    lakeButler     = Extended 0x00 0x0D
    alesis         = Extended 0x00 0x0E
    dod            = Extended 0x00 0x10
    studerEditech  = Extended 0x00 0x11
    perfectFret    = Extended 0x00 0x14
    kat            = Extended 0x00 0x15
    opcode         = Extended 0x00 0x16
    rane           = Extended 0x00 0x17
    anadi          = Extended 0x00 0x18  -- spatialSound ?
    kmx            = Extended 0x00 0x19
    brenell        = Extended 0x00 0x1A
    peavey         = Extended 0x00 0x1B
    systems360     = Extended 0x00 0x1C
    spectrum       = Extended 0x00 0x1D
    marquis        = Extended 0x00 0x1E
    zeta           = Extended 0x00 0x1F
    axxes          = Extended 0x00 0x20
    orban          = Extended 0x00 0x21
    kti            = Extended 0x00 0x24
    breakaway      = Extended 0x00 0x25
    cae            = Extended 0x00 0x26
    rocktron       = Extended 0x00 0x29
    pianoDisc      = Extended 0x00 0x2A
    cannon         = Extended 0x00 0x2B
    rogers         = Extended 0x00 0x2D
    blueSkyLogic   = Extended 0x00 0x2E
    encore         = Extended 0x00 0x2F
    uptown         = Extended 0x00 0x30
    voce           = Extended 0x00 0x31

    cti                      = Extended 0x00 0x32
    ssResearch               = Extended 0x00 0x33
    broderbund               = Extended 0x00 0x34
    allenOrgan               = Extended 0x00 0x35
    musicQuest               = Extended 0x00 0x37
    aphex                    = Extended 0x00 0x38
    gallienKrueger           = Extended 0x00 0x39
    ibm                      = Extended 0x00 0x3A
    hotzInstruments          = Extended 0x00 0x3C
    etaLighting              = Extended 0x00 0x3D
    nsi                      = Extended 0x00 0x3E
    adLib                    = Extended 0x00 0x3F
    richmond                 = Extended 0x00 0x40
    microsoft                = Extended 0x00 0x41
    softwareToolworks        = Extended 0x00 0x42
    rjmgNiche                = Extended 0x00 0x43
    intone                   = Extended 0x00 0x44
    grooveTubes              = Extended 0x00 0x47
    euphonix                 = Extended 0x00 0x4E
    interMIDI                = Extended 0x00 0x4F
    loneWolf                 = Extended 0x00 0x55
    musonix                  = Extended 0x00 0x64
    taHorng                  = Extended 0x00 0x74
    eTek                     = Extended 0x00 0x75   -- formerly Forte
    electrovoice             = Extended 0x00 0x76
    midisoft                 = Extended 0x00 0x77
    qSoundLabs               = Extended 0x00 0x78
    westrex                  = Extended 0x00 0x79
    nVidia                   = Extended 0x00 0x7A
    ess                      = Extended 0x00 0x7B
    mediaTrix                = Extended 0x00 0x7C
    brooktree                = Extended 0x00 0x7D
    otari                    = Extended 0x00 0x7E
    keyElectronics           = Extended 0x00 0x7F
    crystalake               = Extended 0x01 0x01
    crystal                  = Extended 0x01 0x02
    rockwell                 = Extended 0x01 0x03
    siliconGraphics          = Extended 0x01 0x04
    midiman                  = Extended 0x01 0x05
    preSonus                 = Extended 0x01 0x06
    topaz                    = Extended 0x01 0x08
    castLighting             = Extended 0x01 0x09
    microsoftConsumer        = Extended 0x01 0x0A
    fastForward              = Extended 0x01 0x0C
    headspace                = Extended 0x01 0x0D   -- Igor's Labs
    vanKoevering             = Extended 0x01 0x0E
    altech                   = Extended 0x01 0x0F
    -- ssResearch               = Extended 0x01 0x10
    vlsi                     = Extended 0x01 0x11
    chromaticResearch        = Extended 0x01 0x12
    sapphire                 = Extended 0x01 0x13
    idrc                     = Extended 0x01 0x14
    justonic                 = Extended 0x01 0x15
    torComp                  = Extended 0x01 0x16
    newtek                   = Extended 0x01 0x17
    soundSculpture           = Extended 0x01 0x18
    walker                   = Extended 0x01 0x19
    pavo                     = Extended 0x01 0x1A
    inVision                 = Extended 0x01 0x1B
    tSquareDesign            = Extended 0x01 0x1C
    nemesys                  = Extended 0x01 0x1D
    dbx                      = Extended 0x01 0x1E
    syndyne                  = Extended 0x01 0x1F
    bitheadz                 = Extended 0x01 0x20
    cakewalk                 = Extended 0x01 0x21
    staccato                 = Extended 0x01 0x22
    nationalSemiconductor    = Extended 0x01 0x23
    boomTheory               = Extended 0x01 0x24   -- Adinolfi Alternative Percussion
    virtualDSP               = Extended 0x01 0x25
    antares                  = Extended 0x01 0x26
    angelSoftware            = Extended 0x01 0x27
    stLouis                  = Extended 0x01 0x28
    lyrrus                   = Extended 0x01 0x29

    -- * European Group
    passac,  siel,  synthaxe,  hohner,  twister,  solton,  jellinghaus,
      southworth,  ppg,  jen,  ssl,  audioVeritrieb,  elka,  dynacord,
      viscount,  clavia,  audioArchitect,  generalMusic,  soundcraft,  wersi,
      avab,  digigram,  waldorf,  quasimidi,

      dream,  strandLighting,  amek,  drBohm,  trident,  realWorldDesign,
      yesTechnology,  audiomatica,  bontempiFarfisa,  fbtElectronica,  miditemp,
      larkingAudio,  zero88lighting,  miconAudio,  forefront,  kenton,  adb,
      jimMarshall,  dda,  bssAudio,  tcElectronic,  medeli,  charlieLab,
      blueChip,  beeOH,  lgSemiconductor,  tesi,  emagic,  behringer,  access,
      synoptic,  hanmesoft,  terratec,  proel,  ibk
        :: T

    passac         = Short 0x20
    siel           = Short 0x21
    synthaxe       = Short 0x22
    hohner         = Short 0x24
    twister        = Short 0x25
    solton         = Short 0x26
    jellinghaus    = Short 0x27
    southworth     = Short 0x28
    ppg            = Short 0x29
    jen            = Short 0x2A
    ssl            = Short 0x2B
    audioVeritrieb = Short 0x2C
    elka           = Short 0x2F
    dynacord       = Short 0x30
    viscount       = Short 0x31
    clavia         = Short 0x33
    audioArchitect = Short 0x34
    generalMusic   = Short 0x35
    soundcraft     = Short 0x39
    wersi          = Short 0x3B
    avab           = Short 0x3C
    digigram       = Short 0x3D
    waldorf        = Short 0x3E
    quasimidi      = Short 0x3F

    dream            = Extended 0x20 0x00
    strandLighting   = Extended 0x20 0x01
    amek             = Extended 0x20 0x02
    drBohm           = Extended 0x20 0x04
    trident          = Extended 0x20 0x06
    realWorldDesign  = Extended 0x20 0x07
    yesTechnology    = Extended 0x20 0x09
    audiomatica      = Extended 0x20 0x0A
    bontempiFarfisa  = Extended 0x20 0x0B
    fbtElectronica   = Extended 0x20 0x0C
    miditemp         = Extended 0x20 0x0D
    larkingAudio     = Extended 0x20 0x0E
    zero88lighting   = Extended 0x20 0x0F
    miconAudio       = Extended 0x20 0x10
    forefront        = Extended 0x20 0x11
    kenton           = Extended 0x20 0x13
    adb              = Extended 0x20 0x15
    jimMarshall      = Extended 0x20 0x16
    dda              = Extended 0x20 0x17
    bssAudio         = Extended 0x20 0x18
    tcElectronic     = Extended 0x20 0x1F
    medeli           = Extended 0x20 0x2B
    charlieLab       = Extended 0x20 0x2C
    blueChip         = Extended 0x20 0x2D
    beeOH            = Extended 0x20 0x2E
    lgSemiconductor  = Extended 0x20 0x2F
    tesi             = Extended 0x20 0x30
    emagic           = Extended 0x20 0x31
    behringer        = Extended 0x20 0x32
    access           = Extended 0x20 0x33
    synoptic         = Extended 0x20 0x34
    hanmesoft        = Extended 0x20 0x35
    terratec         = Extended 0x20 0x36
    proel            = Extended 0x20 0x37
    ibk              = Extended 0x20 0x38

    -- * Japanese Group
    kawai,  roland,  korg,  yamaha,  casio,  kamiya,  akai,  japanVictor,
      mesosha,  hoshinoGakki,  fujitsuElect,  sony,  nisshinOnpa,  teac,
      matsushitaElec,  fostex,  zoom,  midori,  matsushitaComm,  suzuki
        :: T

    kawai          = Short 0x40
    roland         = Short 0x41
    korg           = Short 0x42
    yamaha         = Short 0x43
    casio          = Short 0x44
    kamiya         = Short 0x46
    akai           = Short 0x47
    japanVictor    = Short 0x48
    mesosha        = Short 0x49
    hoshinoGakki   = Short 0x4A
    fujitsuElect   = Short 0x4B
    sony           = Short 0x4C
    nisshinOnpa    = Short 0x4D
    teac           = Short 0x4E
    matsushitaElec = Short 0x50
    fostex         = Short 0x51
    zoom           = Short 0x52
    midori         = Short 0x53
    matsushitaComm = Short 0x54
    suzuki         = Short 0x55

    -- * Universal ID Numbers
    nonCommercial,  nonRealTime,  realTime :: T
    nonCommercial  = Short 0x7D
    nonRealTime    = Short 0x7E
    realTime       = Short 0x7F

    -- * serialization

    get :: Parser.C parser => Parser.Fallible parser T
    get =
       do subId <- getByte
          if subId == 0
            then liftM2 Extended getByte getByte
            else return $ Short subId

    put :: Writer.C writer => T -> writer
    put subId =
       case subId of
         Short n -> Writer.putByte n
         Extended hi lo ->
            Writer.putByte 0 +#+
            Writer.putByte hi +#+
            Writer.putByte lo