text: const config = require('config')
  const Midi = require('../lib/midi/midi')
  
  function virusMacroControl(part, ctrl) {
    return {
      name: `Part #${part} Control #${ctrl}`,
      type: 'parameter',
      surface: {
        type: 'nrpn',
        number: 128 + ((part - 1) * 6) + (ctrl),
        lsbFirst: false,
        min: 0,
        max: 16383,
      },
      min: 0,
      max: 16383,
      default: 0,
    }
  }
  
  function deviceToIndex(portName, channel) {
    if (config.devices) {
      let idx = 1
      const deviceKeys = Object.keys(config.devices).filter( deviceKey => deviceKey != 'bacara' )
      deviceKeys.unshift('bacara')
  
      for (let deviceKey of deviceKeys) {
        if (Array.isArray(config.devices[deviceKey].channels)) {
          for (let c in config.devices[deviceKey].channels) {
            if (Midi.normalisePortName(portName) == Midi.normalisePortName(deviceKey) && channel == config.devices[deviceKey].channels[c]) {
              /*            debug('deviceToIndex %y %y => %y',portName, channel, idx)*/
              return idx
            }
            idx++
          }
        }
      }
    }
    debug('deviceToIndex %y %y => NOT FOUND', portName, channel)
  }
  
  module.exports = {
  
    elements: {
      load: {
        name: 'Load',
        type: 'action',
        surface: {
          type: 'sysex',
          bytes: [0xF0, 0x7D, 0x00, 0x03, 0xF7],
          number: 0x03,
        },
      },
      generate: {
        name: 'Generate',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 1281,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      temperature: {
        name: 'Temperature',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 1153,
          lsbFirst: true,
          min: 100,
          max: 500,
        },
        min: 1.0,
        max: 5.0,
        default: 1.0,
        precision: 3,
        unit: '°',
      },
      steps: {
        name: 'Steps',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 16260,
          lsbFirst: true,
          min: 1,
          max: 128,
        },
        min: 1,
        max: 128,
        default: 16,
        unit: 'steps',
      },
      previous_pattern: {
        name: 'Previous Pattern',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 1409,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      next_pattern: {
        name: 'Next Pattern',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 1537,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      transpose: {
        name: 'Transpose',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 1665,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        external: {
          type: 'cc',
          number: 3,
          min: 0,
          max: 127,
        },
        min: -64,
        max: 63,
        default: 0,
        unit: 'notes',
      },
      gate: {
        name: 'Gate',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 1793,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        external: {
          type: 'cc',
          number: 18,
          min: 0,
          max: 127,
        },
        min: 0.02,
        max: 1.92,
        default: 0.96,
        precision: 2,
        unit: 'steps',
      },
      octaveChance: {
        name: 'Octave Chance',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 1921,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        external: {
          type: 'cc',
          number: 9,
          min: 0,
          max: 127,
        },
        min: -100,
        max: 100,
        default: 0,
        precision: 0,
        unit: '%',
      },
      density: {
        name: 'Density',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2049,
          lsbFirst: true,
          min: 0,
          max: 100,
        },
        external: {
          type: 'cc',
          number: 14,
          min: 0,
          max: 127,
        },
        min: 0,
        max: 100,
        default: 100,
        unit: '%',
      },
      probability: {
        name: 'Probability',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 8705,
          lsbFirst: true,
          min: 0,
          max: 100,
        },
        external: {
          type: 'cc',
          number: 15,
          min: 0,
          max: 100,
        },
        min: 0,
        max: 100,
        default: 100,
        unit: '%',
      },
      muteSteps: {
        name: 'Mute Steps',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2177,
          lsbFirst: true,
          min: 0,
          max: 16,
        },
        external: {
          type: 'cc',
          number: 16,
          min: 0,
          max: 16,
        },
        min: 0,
        max: 16,
        default: 0,
        unit: 'steps',
        precision: 0,
      },
      muteShift: {
        name: 'Mute Shift',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2305,
          lsbFirst: true,
          min: 0,
          max: 30,
        },
        external: {
          type: 'cc',
          number: 17,
          min: 0,
          max: 30,
        },
        min: -15,
        max: 15,
        default: 0,
        unit: 'steps',
        precision: 0,
      },
      scales: {
        name: 'Scales Mode',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2433,
          lsbFirst: true,
          min: 0,
          max: 36,
        },
        min: 0,
        max: 36,
        default: 0,
        integer: true,
        list: [
          'Chromatic',
          '8-Tone Spanish',
          'Bhairav',
          'Dorian #4',
          'Dorian mode',
          'Half-Whole Dim',
          'Hirajoshi',
          'Insen',
          'Iwato',
          'Kumoi',
          'Locrian Mode',
          'Locrian Super',
          'Lydian Augment',
          'Lydian Dominan',
          'Lydian Mode',
          'Major Harmonic',
          'Major Pentatnc',
          'Major',
          'Messiaen 3',
          'Messiaen 4',
          'Messiaen 5',
          'Messiaen 6',
          'Messiaen 7',
          'Minor Blues',
          'Minor Harmonic',
          'Minor Hungrian',
          'Minor Mldc Dwn',
          'Minor Mldc Up',
          'Minor Pentatnc',
          'Minor',
          'Mixolydian Mde',
          'Pelog Selisir',
          'Pelog Tembung',
          'Phrygian Domnt',
          'Phrygian Mode',
          'Whole Tone',
          'Whole-Half Dim',
        ],
      },
      base: {
        name: 'Scales Base',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2561,
          lsbFirst: true,
          min: 0,
          max: 11,
        },
        min: 0,
        max: 11,
        default: 0,
        list: ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'],
      },
      shift: {
        name: 'Shift',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2689,
          lsbFirst: true,
          min: 0,
          max: 32,
        },
        external: {
          type: 'cc',
          number: 19,
          min: 0,
          max: 32,
        },
        min: -16,
        max: 16,
        default: 0,
        unit: 'steps',
      },
      split: {
        name: 'Split',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2817,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        min: 0,
        max: 127,
        default: 127,
      },
      deviate: {
        name: 'Deviate',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 2945,
          lsbFirst: true,
          min: 0,
          max: 100,
        },
        min: 0,
        max: 100,
        default: 0,
        unit: '%',
      },
      reset_preset: {
        name: 'Reset Preset',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 3073,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      grid: {
        name: 'Grid',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 16294,
          lsbFirst: true,
          min: 0,
          max: 2,
        },
        default: 2,
      },
      previous_preset: {
        name: 'Previous Preset',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 8833,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      next_preset: {
        name: 'Next Preset',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 8961,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      add_preset: {
        name: 'Add Preset',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 9089,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      save_preset: {
        name: 'Save Preset',
        type: 'action',
        surface: {
          type: 'nrpn',
          number: 13057,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
      },
      bank: {
        name: 'Bank',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 9217,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        min: 0,
        max: 127,
        default: 0,
      },
      program: {
        name: 'Program',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 9345,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        min: 0,
        max: 127,
        default: 0,
      },
      pattern: {
        name: 'Program',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 1410,
          lsbFirst: true,
          min: 0,
          max: 127,
        },
        min: 0,
        max: 127,
        default: 0,
      },
      mute: {
        name: 'Mute',
        type: 'parameter',
        surface: {
          type: 'nrpn',
          number: 12929,
          lsbFirst: true,
          min: 0,
          max: 1,
        },
        on: 1,
        default: 0,
      },
      lfo: [{
        device: {
          A: {
            name: 'LFO 1 Device A',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 5249,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          B: {
            name: 'LFO 1 Device B',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 5377,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            external: {
              type: 'cc',
              number: 85,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        },
        control: {
          name: 'LFO 1 Control',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3201,
            lsbFirst: true,
            min: 0,
            max: 255,
          },
          min: 0,
          max: 255,
          default: 0,
        },
        shape: {
          name: 'LFO 1 Shape',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 7425,
            lsbFirst: true,
            min: 0,
            max: 5,
          },
          min: 0,
          max: 5,
          default: 0,
          list: ['sine', 'triangle', 'saw-up', 'saw-down', 'square', 'random'],
        },
        rate: {
          name: 'LFO 1 Rate',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3329,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 64,
        },
        phase: {
          name: 'LFO 1 Phase',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3457,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        amount: {
          name: 'LFO 1 Amount',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3585,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        offset: {
          name: 'LFO 1 Offset',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3713,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 50,
          unit: '%',
        },
        density: {
          name: 'LFO 1 Density',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 7809,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 127,
        },
        show: {
          name: 'LFO 1 Show',
          type: 'feedback',
          surface: {
            type: 'nrpn',
            number: 7041,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
          silent: true,
        },
      }, {
        device: {
          A: {
            name: 'LFO 2 Device A',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 5505,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            external: {
              type: 'cc',
              number: 104,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          B: {
            name: 'LFO 2 Device B',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 5633,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            external: {
              type: 'cc',
              number: 105,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        },
        control: {
          name: 'LFO 2 Control',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3841,
            lsbFirst: true,
            min: 0,
            max: 255,
          },
          min: 0,
          max: 255,
          default: 0,
        },
        shape: {
          name: 'LFO 2 Shape',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 7553,
            lsbFirst: true,
            min: 0,
            max: 5,
          },
          external: {
            type: 'cc',
            number: 87,
            min: 0,
            max: 5,
          },
          min: 0,
          max: 5,
          default: 0,
          list: ['sine', 'triangle', 'saw-up', 'saw-down', 'square', 'random'],
        },
        rate: {
          name: 'LFO 2 Rate',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 3969,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          external: {
            type: 'cc',
            number: 89,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 64,
        },
        phase: {
          name: 'LFO 2 Phase',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4097,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          external: {
            type: 'cc',
            number: 102,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        amount: {
          name: 'LFO 2 Amount',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4225,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          external: {
            type: 'cc',
            number: 88,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        offset: {
          name: 'LFO 2 Offset',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4353,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          external: {
            type: 'cc',
            number: 90,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 50,
          unit: '%',
        },
        density: {
          name: 'LFO 2 Density',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 7937,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          external: {
            type: 'cc',
            number: 103,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 127,
        },
        show: {
          name: 'LFO 2 Show',
          type: 'feedback',
          surface: {
            type: 'nrpn',
            number: 7169,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
          silent: true,
        },
      }, {
        device: {
          A: {
            name: 'LFO 3 Device A',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 5761,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            external: {
              type: 'cc',
              number: 113,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          B: {
            name: 'LFO 3 Device B',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 5889,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            external: {
              type: 'cc',
              number: 114,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        },
        control: {
          name: 'LFO 3 Control',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4481,
            lsbFirst: true,
            min: 0,
            max: 255,
          },
          min: 0,
          max: 255,
          default: 0,
        },
        shape: {
          name: 'LFO 3 Shape',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 7681,
            lsbFirst: true,
            min: 0,
            max: 5,
          },
          external: {
            type: 'cc',
            number: 107,
            min: 0,
            max: 5,
          },
          min: 0,
          max: 5,
          default: 0,
          list: ['sine', 'triangle', 'saw-up', 'saw-down', 'square', 'random'],
        },
        rate: {
          name: 'LFO 3 Rate',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4609,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          external: {
            type: 'cc',
            number: 109,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 64,
        },
        phase: {
          name: 'LFO 3 Phase',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4737,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          external: {
            type: 'cc',
            number: 111,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        amount: {
          name: 'LFO 3 Amount',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4865,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          external: {
            type: 'cc',
            number: 108,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        offset: {
          name: 'LFO 3 Offset',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 4993,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          external: {
            type: 'cc',
            number: 110,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 50,
          unit: '%',
        },
        density: {
          name: 'LFO 3 Density',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 8065,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          external: {
            type: 'cc',
            number: 112,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 127,
        },
        show: {
          name: 'LFO 3 Show',
          type: 'feedback',
          surface: {
            type: 'nrpn',
            number: 7297,
            lsbFirst: true,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
          silent: true,
        },
      }, ],
      device: {
        A: {
          device: {
            name: 'Device A Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 8193,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          mute: {
            name: 'Device A Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 8449,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          port: {
            name: 'Device A Port',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6529,
              lsbFirst: true,
              min: 0,
              max: 63,
            },
            min: 0,
            max: 63,
            default: 0,
          },
          channel: {
            name: 'Device A Channel',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6657,
              lsbFirst: true,
              min: 1,
              max: 16,
            },
            min: 1,
            max: 16,
            default: 1,
          },
          bank: {
            name: 'Device A Bank',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6017,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          program: {
            name: 'Device A Program',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6145,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          previousBank: {
            name: 'Device A Previous Bank',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6018,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          nextBank: {
            name: 'Device A Next Bank',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6019,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          previous: {
            name: 'Device A Previous',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6148,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          next: {
            name: 'Device A Next',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6149,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          transpose: {
            name: 'Device A Transpose',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6146,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: -64,
            max: 63,
            default: 0,
            unit: 'notes',
          },
        },
        B: {
          device: {
            name: 'Device B Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 8321,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          mute: {
            name: 'Device B Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 8577,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          port: {
            name: 'Device B Port',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6785,
              lsbFirst: true,
              min: 0,
              max: 63,
            },
            min: 0,
            max: 63,
            default: 0,
          },
          channel: {
            name: 'Device B Channel',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6913,
              lsbFirst: true,
              min: 1,
              max: 16,
            },
            min: 1,
            max: 16,
            default: 1,
          },
          bank: {
            name: 'Device B Bank',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6273,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          program: {
            name: 'Device B Program',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6401,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          previousBank: {
            name: 'Device B Previous Bank',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6274,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          nextBank: {
            name: 'Device B Next Bank',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6275,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          previous: {
            name: 'Device B Previous',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6402,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          next: {
            name: 'Device B Next',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 6403,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          transpose: {
            name: 'Device B Transpose',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 6147,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: -64,
            max: 63,
            default: 0,
            unit: 'notes',
          },
        },
      },
      drums: {
        generate: {
          name: 'Drums Generate',
          type: 'action',
          surface: {
            type: 'nrpn',
            number: 16286,
            lsbFirst: true,
            min: 0,
            max: 1,
          },
          on: 1,
        },
        mute: {
          name: 'Drums Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16290,
            lsbFirst: true,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 0,
        },
        style: {
          name: 'Drums Style',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16288,
            lsbFirst: true,
            min: 0,
            max: 2,
          },
          default: 1,
        },
        steps: {
          name: 'Drums Steps',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16287,
            lsbFirst: true,
            min: 1,
            max: 128,
          },
          min: 1,
          max: 128,
          default: 16,
          unit: 'steps',
        },
        continue: {
          name: 'Drums Continue',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16289,
            lsbFirst: true,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 0,
        },
        density: {
          name: 'Drums Density',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16293,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        probability: {
          name: 'Drums Probability',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16291,
            lsbFirst: true,
            min: 0,
            max: 100,
          },
          min: 0,
          max: 100,
          default: 100,
          unit: '%',
        },
        velocity: {
          name: 'Drums Velocity',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 16292,
            lsbFirst: true,
            min: 0,
            max: 200,
          },
          min: -100,
          max: 100,
          default: 0,
        },
        instrument: [{
          device: {
            name: 'Bass Drum Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16296,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Bass Drum Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16297,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 36,
          },
          mute: {
            name: 'Bass Drum Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16298,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Snare Drum Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16299,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Snare Drum Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16300,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 37,
          },
          mute: {
            name: 'Snare Drum Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16301,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Low Tom Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16302,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Low Tom Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16303,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 53,
          },
          mute: {
            name: 'Low Tom Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16304,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Mid Tom Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16305,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Mid Tom Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16306,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 54,
          },
          mute: {
            name: 'Mid Tom Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16307,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'High Tom Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16308,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'High Tom Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16309,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 55,
          },
          mute: {
            name: 'High Tom Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16310,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Rim Shot Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16311,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Rim Shot Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16312,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 52,
          },
          mute: {
            name: 'Rim Shot Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16313,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Hand Clap Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16314,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Hand Clap Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16315,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 45,
          },
          mute: {
            name: 'Hand Clap Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16316,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Cow Bell Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16317,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Cow Bell Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16318,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 46,
          },
          mute: {
            name: 'Cow Bell Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16319,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Cymbal Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16320,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Cymbal Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16321,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 47,
          },
          mute: {
            name: 'Cymbal Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16322,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Open Hat Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16323,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Open Hat Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16324,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 39,
          },
          mute: {
            name: 'Open Hat Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16325,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          device: {
            name: 'Closed Hat Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16326,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('bacara', 10),
          },
          note: {
            name: 'Closed Hat Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16327,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 38,
          },
          mute: {
            name: 'Closed Hat Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16328,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, ],
        redrum: [{
          instrument: {
            name: 'Bass Drum Instrument',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16329,
              lsbFirst: true,
              min: 0,
              max: 10,
            },
            min: 0,
            max: 10,
            default: 0,
          },
          generate: {
            name: 'Bass Drum Generate',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16330,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          mute: {
            name: 'Bass Drum Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16331,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          device: {
            name: 'Bass Drum Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16332,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('tr-6s', 10),
          },
          note: {
            name: 'Bass Drum Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16333,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 36,
          },
          preview: {
            name: 'Bass Drum Preview',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16334,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          instrument: {
            name: 'Snare Drum Instrument',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16335,
              lsbFirst: true,
              min: 0,
              max: 10,
            },
            min: 0,
            max: 10,
            default: 1,
          },
          generate: {
            name: 'Snare Drum Generate',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16336,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 1,
          },
          mute: {
            name: 'Snare Drum Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16337,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          device: {
            name: 'Snare Drum Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16338,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('tr-6s', 10),
          },
          note: {
            name: 'Snare Drum Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16339,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 38,
          },
          preview: {
            name: 'Snare Drum Preview',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16340,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          instrument: {
            name: 'Low Tom Instrument',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16341,
              lsbFirst: true,
              min: 0,
              max: 10,
            },
            min: 0,
            max: 10,
            default: 2,
          },
          generate: {
            name: 'Low Tom Generate',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16342,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          mute: {
            name: 'Low Tom Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16343,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          device: {
            name: 'Low Tom Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16344,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('tr-6s', 10),
          },
          note: {
            name: 'Low Tom Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16345,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 43,
          },
          preview: {
            name: 'Low Tom Preview',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16346,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          instrument: {
            name: 'Hand Clap Instrument',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16347,
              lsbFirst: true,
              min: 0,
              max: 10,
            },
            min: 0,
            max: 10,
            default: 6,
          },
          generate: {
            name: 'Hand Clap Generate',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16348,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          mute: {
            name: 'Hand Clap Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16349,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          device: {
            name: 'Hand Clap Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16350,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('tr-6s', 10),
          },
          note: {
            name: 'Hand Clap Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16351,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 39,
          },
          preview: {
            name: 'Hand Clap Preview',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16352,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          instrument: {
            name: 'Closed Hat Instrument',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16353,
              lsbFirst: true,
              min: 0,
              max: 10,
            },
            min: 0,
            max: 10,
            default: 10,
          },
          generate: {
            name: 'Closed Hat Generate',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16354,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          mute: {
            name: 'Closed Hat Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16355,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          device: {
            name: 'Closed Hat Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16356,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('tr-6s', 10),
          },
          note: {
            name: 'Closed Hat Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16357,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 42,
          },
          preview: {
            name: 'Closed Hat Preview',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16358,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, {
          instrument: {
            name: 'Open Hat Instrument',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16359,
              lsbFirst: true,
              min: 0,
              max: 10,
            },
            min: 0,
            max: 10,
            default: 9,
          },
          generate: {
            name: 'Open Hat Generate',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16360,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          mute: {
            name: 'Open Hat Mute',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16361,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
          device: {
            name: 'Open Hat Device',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16362,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: deviceToIndex('tr-6s', 10),
          },
          note: {
            name: 'Open Hat Note',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 16363,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            default: 46,
          },
          preview: {
            name: 'Open Hat Preview',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 16364,
              lsbFirst: true,
              min: 0,
              max: 1,
            },
            on: 1,
            default: 0,
          },
        }, ],
      },
      matrix: {
        slot: [{
          source: {
            name: 'Matrix Slot 1 Source',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 9473,
              lsbFirst: true,
              min: 0,
              max: 3,
            },
            min: 0,
            max: 3,
            default: 0,
          },
          value: {
            name: 'Matrix Slot 1 Value',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 12161,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
            silent: true,
          },
          slewLimiter: {
            name: 'Matrix Slot 1 Slew Limiter',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 12545,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          destination: [{
            target: {
              name: 'Matrix Slot 1 Target 1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 9601,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 1 Amount 1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 9985,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, {
            target: {
              name: 'Matrix Slot 1 Target 2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 9729,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 1 Amount 2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 10113,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, {
            target: {
              name: 'Matrix Slot 1 Target 3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 9857,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 1 Amount 3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 10241,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, ],
        }, {
          source: {
            name: 'Matrix Slot 2 Source',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 10369,
              lsbFirst: true,
              min: 0,
              max: 3,
            },
            min: 0,
            max: 3,
            default: 0,
          },
          value: {
            name: 'Matrix Slot 2 Value',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 12289,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
            silent: true,
          },
          slewLimiter: {
            name: 'Matrix Slot 2 Slew Limiter',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 12673,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          destination: [{
            target: {
              name: 'Matrix Slot 2 Target 1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 10497,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 2 Amount 1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 10881,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, {
            target: {
              name: 'Matrix Slot 2 Target 2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 10625,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 2 Amount 2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11009,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, {
            target: {
              name: 'Matrix Slot 2 Target 3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 10753,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 2 Amount 3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11137,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, ],
        }, {
          source: {
            name: 'Matrix Slot 3 Source',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 11265,
              lsbFirst: true,
              min: 0,
              max: 3,
            },
            min: 0,
            max: 3,
            default: 0,
          },
          value: {
            name: 'Matrix Slot 3 Value',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 12417,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
            silent: true,
          },
          slewLimiter: {
            name: 'Matrix Slot 3 Slew Limiter',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 12801,
              lsbFirst: true,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          destination: [{
            target: {
              name: 'Matrix Slot 3 Target 1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11393,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 3 Amount 1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11777,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, {
            target: {
              name: 'Matrix Slot 3 Target 2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11521,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 3 Amount 2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11905,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, {
            target: {
              name: 'Matrix Slot 3 Target 3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 11649,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            amount: {
              name: 'Matrix Slot 3 Amount 3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 12033,
                lsbFirst: true,
                min: 0,
                max: 127,
              },
              min: -100,
              max: 100,
              default: 0,
              unit: '%',
            },
          }, ],
        }, ],
      },
      track: [{
        device: {
          name: 'Track 1 Device',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13185,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        mute: {
          name: 'Track 1 Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13441,
            lsbFirst: false,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 1,
        },
        bank: {
          name: 'Track 1 Bank',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13313,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        program: {
          name: 'Track 1 Program',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13569,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
      }, {
        device: {
          name: 'Track 2 Device',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13186,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        mute: {
          name: 'Track 2 Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13442,
            lsbFirst: false,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 1,
        },
        bank: {
          name: 'Track 2 Bank',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13314,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        program: {
          name: 'Track 2 Program',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13570,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
      }, {
        device: {
          name: 'Track 3 Device',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13187,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        mute: {
          name: 'Track 3 Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13443,
            lsbFirst: false,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 1,
        },
        bank: {
          name: 'Track 3 Bank',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13315,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        program: {
          name: 'Track 3 Program',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13571,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
      }, {
        device: {
          name: 'Track 4 Device',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13188,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        mute: {
          name: 'Track 4 Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13444,
            lsbFirst: false,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 1,
        },
        bank: {
          name: 'Track 4 Bank',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13316,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        program: {
          name: 'Track 4 Program',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13572,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
      }, {
        device: {
          name: 'Track 5 Device',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13189,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        mute: {
          name: 'Track 5 Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13445,
            lsbFirst: false,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 1,
        },
        bank: {
          name: 'Track 5 Bank',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13317,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        program: {
          name: 'Track 5 Program',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13573,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
      }, {
        device: {
          name: 'Track 6 Device',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13190,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        mute: {
          name: 'Track 6 Mute',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13446,
            lsbFirst: false,
            min: 0,
            max: 1,
          },
          on: 1,
          default: 1,
        },
        bank: {
          name: 'Track 6 Bank',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13318,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
        program: {
          name: 'Track 6 Program',
          type: 'parameter',
          surface: {
            type: 'nrpn',
            number: 13574,
            lsbFirst: false,
            min: 0,
            max: 127,
          },
          min: 0,
          max: 127,
          default: 0,
        },
      }, ],
      virus: {
        axyz: {
          part: {
            name: 'Virus Axyz Part',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 14848,
              lsbFirst: false,
              min: 0,
              max: 15,
            },
            min: 1,
            max: 16,
            default: 1,
          },
          recenter: {
            name: 'Virus Axyz Recenter',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14855,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          mode: {
            name: 'Virus Axyz Mode',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 14856,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            min: 0,
            max: 1,
            default: 0,
          },
          resetTargets: {
            name: 'Virus Axyz Reset Targets',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14857,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          select: {
            name: 'Virus Axyz Select',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14849,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          level: {
            name: 'Virus Axyz Level',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 14850,
              lsbFirst: false,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 100,
          },
          bank: {
            name: 'Virus Axyz Bank',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 14851,
              lsbFirst: false,
              min: 0,
              max: 16383,
            },
            min: 0,
            max: 16383,
            default: 0,
          },
          program: {
            name: 'Virus Axyz Program',
            type: 'parameter',
            surface: {
              type: 'nrpn',
              number: 14852,
              lsbFirst: false,
              min: 0,
              max: 127,
            },
            min: 0,
            max: 127,
            default: 0,
          },
          next: {
            name: 'Virus Axyz Next',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14853,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          previous: {
            name: 'Virus Axyz Previous',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14854,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          nextBank: {
            name: 'Virus Axyz Next Bank',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14858,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          previousBank: {
            name: 'Virus Axyz Previous Bank',
            type: 'action',
            surface: {
              type: 'nrpn',
              number: 14859,
              lsbFirst: false,
              min: 0,
              max: 1,
            },
            on: 1,
          },
          x1: {
            control: {
              name: 'Virus Axyz X1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15361,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 20,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz X1 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15362,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 1,
            }, {
              name: 'Virus Axyz X1 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15363,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 2,
            }, ],
          },
          y1: {
            control: {
              name: 'Virus Axyz Y1',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15489,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 21,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz Y1 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15490,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 3,
            }, {
              name: 'Virus Axyz Y1 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15491,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            }, ],
          },
          x2: {
            control: {
              name: 'Virus Axyz X2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15617,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 23,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz X2 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15618,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 22,
            }, {
              name: 'Virus Axyz X2 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15619,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 27,
            }, ],
          },
          y2: {
            control: {
              name: 'Virus Axyz Y2',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15745,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 24,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz Y2 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15746,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 23,
            }, {
              name: 'Virus Axyz Y2 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15747,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 28,
            }, ],
          },
          x3: {
            control: {
              name: 'Virus Axyz X3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15873,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 26,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz X3 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15874,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 42,
            }, {
              name: 'Virus Axyz X3 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 15875,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 20,
            }, ],
          },
          y3: {
            control: {
              name: 'Virus Axyz Y3',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16001,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 27,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz Y3 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16002,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 45,
            }, {
              name: 'Virus Axyz Y3 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16003,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            }, ],
          },
          x4: {
            control: {
              name: 'Virus Axyz X4',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16129,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 29,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz X4 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16130,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 118,
            }, {
              name: 'Virus Axyz X4 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16131,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            }, ],
          },
          y4: {
            control: {
              name: 'Virus Axyz Y4',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16257,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              external: {
                type: 'cc',
                hiRes: true,
                number: 30,
                min: 0,
                max: 16383,
              },
              min: -1.0,
              max: 1.0,
              precision: 4,
              default: 0,
            },
            target: [{
              name: 'Virus Axyz Y4 Target A',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16258,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 119,
            }, {
              name: 'Virus Axyz Y4 Target B',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16259,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            }, ],
          },
        },
        mixer: {
          part: [{
            bank: {
              name: 'Virus Mixer Part 1 Bank',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14081,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              min: 0,
              max: 16383,
              default: 0,
            },
            program: {
              name: 'Virus Mixer Part 1 Program',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14209,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            next: {
              name: 'Virus Mixer Part 1 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14337,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Mixer Part 1 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14465,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            select: {
              name: 'Virus Mixer Part 1 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14593,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            level: {
              name: 'Virus Mixer Part 1 Level',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14721,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
          }, {
            bank: {
              name: 'Virus Mixer Part 2 Bank',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14082,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              min: 0,
              max: 16383,
              default: 0,
            },
            program: {
              name: 'Virus Mixer Part 2 Program',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14210,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            next: {
              name: 'Virus Mixer Part 2 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14338,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Mixer Part 2 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14466,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            select: {
              name: 'Virus Mixer Part 2 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14594,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            level: {
              name: 'Virus Mixer Part 2 Level',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14722,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
          }, {
            bank: {
              name: 'Virus Mixer Part 3 Bank',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14083,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              min: 0,
              max: 16383,
              default: 0,
            },
            program: {
              name: 'Virus Mixer Part 3 Program',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14211,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            next: {
              name: 'Virus Mixer Part 3 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14339,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Mixer Part 3 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14467,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            select: {
              name: 'Virus Mixer Part 3 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14595,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            level: {
              name: 'Virus Mixer Part 3 Level',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14723,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
          }, {
            bank: {
              name: 'Virus Mixer Part 4 Bank',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14084,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              min: 0,
              max: 16383,
              default: 0,
            },
            program: {
              name: 'Virus Mixer Part 4 Program',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14212,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            next: {
              name: 'Virus Mixer Part 4 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14340,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Mixer Part 4 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14468,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            select: {
              name: 'Virus Mixer Part 4 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14596,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            level: {
              name: 'Virus Mixer Part 4 Level',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14724,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
          }, {
            bank: {
              name: 'Virus Mixer Part 5 Bank',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14085,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              min: 0,
              max: 16383,
              default: 0,
            },
            program: {
              name: 'Virus Mixer Part 5 Program',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14213,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            next: {
              name: 'Virus Mixer Part 5 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14341,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Mixer Part 5 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14469,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            select: {
              name: 'Virus Mixer Part 5 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14597,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            level: {
              name: 'Virus Mixer Part 5 Level',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14725,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
          }, {
            bank: {
              name: 'Virus Mixer Part 6 Bank',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14086,
                lsbFirst: false,
                min: 0,
                max: 16383,
              },
              min: 0,
              max: 16383,
              default: 0,
            },
            program: {
              name: 'Virus Mixer Part 6 Program',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14214,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
            next: {
              name: 'Virus Mixer Part 6 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14342,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Mixer Part 6 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14470,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            select: {
              name: 'Virus Mixer Part 6 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 14598,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            level: {
              name: 'Virus Mixer Part 6 Level',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 14726,
                lsbFirst: false,
                min: 0,
                max: 127,
              },
              min: 0,
              max: 127,
              default: 0,
            },
          }, ],
        },
        macros: {
          part: [{
            control: [virusMacroControl(1, 1), virusMacroControl(1, 2), virusMacroControl(1, 3), virusMacroControl(1, 4), virusMacroControl(1, 5), virusMacroControl(1, 6)]
          }, {
            control: [virusMacroControl(2, 1), virusMacroControl(2, 2), virusMacroControl(2, 3), virusMacroControl(2, 4), virusMacroControl(2, 5), virusMacroControl(2, 6)]
          }, {
            control: [virusMacroControl(3, 1), virusMacroControl(3, 2), virusMacroControl(3, 3), virusMacroControl(3, 4), virusMacroControl(3, 5), virusMacroControl(3, 6)]
          }, {
            control: [virusMacroControl(4, 1), virusMacroControl(4, 2), virusMacroControl(4, 3), virusMacroControl(4, 4), virusMacroControl(4, 5), virusMacroControl(4, 6)]
          }, {
            control: [virusMacroControl(5, 1), virusMacroControl(5, 2), virusMacroControl(5, 3), virusMacroControl(5, 4), virusMacroControl(5, 5), virusMacroControl(5, 6)]
          }, {
            control: [virusMacroControl(6, 1), virusMacroControl(6, 2), virusMacroControl(6, 3), virusMacroControl(6, 4), virusMacroControl(6, 5), virusMacroControl(6, 6)]
          }, ],
        },
        search: {
          part: [{
            select: {
              name: 'Virus Search Part 1 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16261,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            category: {
              name: 'Virus Search Part 1 Category',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16262,
                lsbFirst: false,
                min: 0,
                max: 22,
              },
              min: 0,
              max: 22,
              default: 0,
            },
            next: {
              name: 'Virus Search Part 1 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16263,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Search Part 1 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16264,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
          }, {
            select: {
              name: 'Virus Search Part 2 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16265,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            category: {
              name: 'Virus Search Part 2 Category',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16266,
                lsbFirst: false,
                min: 0,
                max: 22,
              },
              min: 0,
              max: 22,
              default: 0,
            },
            next: {
              name: 'Virus Search Part 2 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16267,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Search Part 2 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16268,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
          }, {
            select: {
              name: 'Virus Search Part 3 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16269,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            category: {
              name: 'Virus Search Part 3 Category',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16270,
                lsbFirst: false,
                min: 0,
                max: 22,
              },
              min: 0,
              max: 22,
              default: 0,
            },
            next: {
              name: 'Virus Search Part 3 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16271,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Search Part 3 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16272,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
          }, {
            select: {
              name: 'Virus Search Part 4 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16273,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            category: {
              name: 'Virus Search Part 4 Category',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16274,
                lsbFirst: false,
                min: 0,
                max: 22,
              },
              min: 0,
              max: 22,
              default: 0,
            },
            next: {
              name: 'Virus Search Part 4 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16275,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Search Part 4 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16276,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
          }, {
            select: {
              name: 'Virus Search Part 5 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16277,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            category: {
              name: 'Virus Search Part 5 Category',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16278,
                lsbFirst: false,
                min: 0,
                max: 22,
              },
              min: 0,
              max: 22,
              default: 0,
            },
            next: {
              name: 'Virus Search Part 5 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16279,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Search Part 5 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16280,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
          }, {
            select: {
              name: 'Virus Search Part 6 Select',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16281,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            category: {
              name: 'Virus Search Part 6 Category',
              type: 'parameter',
              surface: {
                type: 'nrpn',
                number: 16282,
                lsbFirst: false,
                min: 0,
                max: 22,
              },
              min: 0,
              max: 22,
              default: 0,
            },
            next: {
              name: 'Virus Search Part 6 Next',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16283,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
            previous: {
              name: 'Virus Search Part 6 Previous',
              type: 'action',
              surface: {
                type: 'nrpn',
                number: 16284,
                lsbFirst: false,
                min: 0,
                max: 1,
              },
              on: 1,
            },
          }, ],
        },
      },
    },
  }
  