{
 "version": 2,
 "name": "ModularMB",
 "categories": [
  {
   "id": "vco",
   "label": "VCO",
   "kind": "vco",
   "defaultCvRange": {
    "min": -5,
    "max": 5,
    "bipolar": true
   }
  },
  {
   "id": "vcf",
   "label": "VCF",
   "kind": "vcf",
   "defaultCvRange": {
    "min": -5,
    "max": 5,
    "bipolar": true
   }
  },
  {
   "id": "vca",
   "label": "VCA",
   "kind": "vca",
   "defaultCvRange": {
    "min": 0,
    "max": 10,
    "bipolar": false
   }
  },
  {
   "id": "mixer",
   "label": "Mixer",
   "kind": "mixer"
  },
  {
   "id": "breakout",
   "label": "Breakout",
   "kind": "breakout"
  },
  {
   "id": "envelope",
   "label": "Envelope",
   "kind": "envelope",
   "defaultCvRange": {
    "min": 0,
    "max": 10,
    "bipolar": false
   }
  },
  {
   "id": "lfo",
   "label": "LFO",
   "kind": "lfo",
   "defaultCvRange": {
    "min": -5,
    "max": 5,
    "bipolar": true
   }
  },
  {
   "id": "sequencer",
   "label": "Sequencer",
   "kind": "sequencer"
  },
  {
   "id": "drum",
   "label": "Drum",
   "kind": "drum"
  },
  {
   "id": "effect",
   "label": "Effect",
   "kind": "effect"
  },
  {
   "id": "noise",
   "label": "Noise/Rand",
   "kind": "noise"
  },
  {
   "id": "utility",
   "label": "Utility",
   "kind": "utility"
  }
 ],
 "moduleTypes": [
  {
   "id": "tp_mmb_ahdsr",
   "categoryId": "envelope",
   "variant": "AHDSR (vertical-sliders)",
   "ports": [
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "trig",
     "name": "Trig",
     "signalType": "trigger",
     "direction": "in"
    },
    {
     "id": "cv_out",
     "name": "Env",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "eoc",
     "name": "EOC",
     "signalType": "trigger",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "slider",
     "id": "attack",
     "label": "A",
     "min": 0,
     "max": 2000,
     "defaultValue": 10,
     "orientation": "v",
     "lengthMm": 56,
     "unit": "ms",
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "hold",
     "label": "H",
     "min": 0,
     "max": 5000,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 56,
     "unit": "ms",
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "decay",
     "label": "D",
     "min": 0,
     "max": 5000,
     "defaultValue": 200,
     "orientation": "v",
     "lengthMm": 56,
     "unit": "ms",
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "sustain",
     "label": "S",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "orientation": "v",
     "lengthMm": 56,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "release",
     "label": "R",
     "min": 0,
     "max": 8000,
     "defaultValue": 300,
     "orientation": "v",
     "lengthMm": 56,
     "unit": "ms",
     "style": "mini-fader"
    },
    {
     "kind": "toggle",
     "id": "loop",
     "label": "Loop",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "retrig",
     "label": "Reset",
     "defaultValue": false
    },
    {
     "kind": "switch",
     "id": "curve",
     "label": "Curve",
     "positions": [
      "Lin",
      "Exp",
      "Log"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Interne MMB envelope. Loop=on maakt er een quasi-LFO van; curve schakelt tussen lineair/exp/log per fase. Reset=on hertriggert elke noot vanaf 0 (consistente filter-wah); Reset=off vervolgt klikvrij vanaf de huidige waarde (goed voor amp-env).",
   "internal": true
  },
  {
   "id": "tp_mmb_lfo",
   "categoryId": "lfo",
   "variant": "LFO (rate+wave+depth)",
   "ports": [
    {
     "id": "rate_cv",
     "name": "Rate",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "trigger",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_inv",
     "name": "Inv",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.01,
     "max": 50,
     "defaultValue": 1,
     "taper": "log",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Saw",
      "Sqr",
      "S&H"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "bipolar",
     "label": "Bip",
     "defaultValue": true
    },
    {
     "kind": "switch",
     "id": "run",
     "label": "Run",
     "positions": [
      "Always",
      "Gated",
      "OneShot"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "rate_cv_amt",
     "label": "Rate CV",
     "min": -1,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Interne MMB LFO; bipolar=on geeft ±depth, off geeft 0..depth.",
   "internal": true
  },
  {
   "id": "tp_mmb_sh",
   "categoryId": "utility",
   "variant": "S&H + Slew",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "trig",
     "name": "Trig",
     "signalType": "trigger",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "slew",
     "label": "Slew",
     "min": 0,
     "max": 5000,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "S&H",
      "T&H",
      "Slew"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Sample-and-hold met slew-limiter. S&H: elke flank op Trig neemt de waarde van In over. T&H: zolang Trig hoog is volgt de uitgang In, laag = vasthouden. Slew: geen trigger nodig, de uitgang volgt In met de Slew-tijd (lag, portamento). Slew werkt in alle standen op de uitgang: S&H met slew geeft glijdende trapjes. Zit er geen kabel in In, dan is de bron interne ruis: S&H geeft de klassieke random-trap (zet er de Quantizer achter), Slew een traag zwervende random-CV. Firmware tp_mmb_sh; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_vco",
   "categoryId": "vco",
   "variant": "VCO (wave + coarse/fine)",
   "ports": [
    {
     "id": "voct",
     "name": "1V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "tune",
     "name": "Tune",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fm",
     "name": "FM",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "sync",
     "name": "Sync",
     "signalType": "trigger",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Saw",
      "Sqr"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "fm_amt",
     "label": "FM",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Interne MMB VCO. 'wave' kiest sine/triangle/sawtooth/square; coarse+fine zijn semitonen+cent offsets t.o.v. de inkomende V/Oct. 'tune' is een aparte V/Oct-ingang die bij de hoofdpitch wordt opgeteld (voor pitch-bend/detune zonder de noot-V/Oct te overschrijven).",
   "internal": true
  },
  {
   "id": "tp_mmb_quad_vco_shared",
   "categoryId": "vco",
   "variant": "Quad VCO (shared controls)",
   "ports": [
    {
     "id": "voct_1",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_2",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_3",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_4",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "out_1",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_2",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_3",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_4",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Saw",
      "Sqr"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Multi-module met 4 identieke oscillator-cellen die ALLE dezelfde control-set delen (wave/coarse/fine/level). Eén v/oct-in en één audio-out per cel. Canonisch voorbeeld van een shared-controls multi-module (CellGroup met controlIds: []). Hardware bestaat nog niet — eerst alleen in simulator gebruiken.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "osc",
     "label": "Oscillator",
     "count": 4,
     "portIds": [
      "voct",
      "out"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_octa_vco",
   "categoryId": "vco",
   "variant": "Octa VCO (shared controls)",
   "ports": [
    {
     "id": "voct_1",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_2",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_3",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_4",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_5",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_6",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_7",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "voct_8",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "osc"
    },
    {
     "id": "out_1",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_2",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_3",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_4",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_5",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_6",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_7",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "out_8",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "osc"
    },
    {
     "id": "tune",
     "name": "Tune",
     "signalType": "cv",
     "direction": "in"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Saw",
      "Sqr"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "detune",
     "label": "Detune",
     "min": 0,
     "max": 50,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Multi-module met 8 identieke oscillator-cellen die ALLE dezelfde control-set delen (wave/coarse/fine/level). 'detune' spreidt de 8 cellen symmetrisch in cents voor een dikke supersaw/unison. Eén v/oct-in en één audio-out per cel; 'tune' is een gedeelde V/Oct-offset. Firmware: tp_mmb_octa_vco (FW-PM-1).",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "osc",
     "label": "Oscillator",
     "count": 8,
     "portIds": [
      "voct",
      "out"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_octa_vcf",
   "categoryId": "vcf",
   "variant": "Octa VCF (shared controls)",
   "ports": [
    {
     "id": "cv",
     "name": "CV (all)",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_1",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_2",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_3",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_4",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_5",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_6",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_7",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "in_8",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_1",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_2",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_3",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_4",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_5",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_6",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_7",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "cv_8",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "flt"
    },
    {
     "id": "out_1",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_2",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_3",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_4",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_5",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_6",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_7",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    },
    {
     "id": "out_8",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "flt"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 18000,
     "defaultValue": 800,
     "taper": "log",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "q",
     "label": "Res",
     "min": 0.7,
     "max": 5,
     "defaultValue": 0.9,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cv_amt",
     "label": "CV amt",
     "min": 0,
     "max": 7,
     "defaultValue": 2,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "switch",
     "id": "type",
     "label": "Type",
     "positions": [
      "LP",
      "BP",
      "HP"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Multi-module met 8 identieke state-variable-filtercellen die één control-set delen (cutoff/res/CV-diepte/type) — de vorm van de latere hardware-module met één set fysieke knoppen. Per cel een eigen audio-in, cutoff-CV (±1 = ±CV-amt octaven, bovenop de gedeelde CV-ingang) en audio-uit. Type kiest LP/BP/HP voor alle cellen (her-push nodig). Firmware: tp_mmb_octa_vcf (FW-PM-2).",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "flt",
     "label": "Filter",
     "count": 8,
     "portIds": [
      "in",
      "cv",
      "out"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_octa_vca",
   "categoryId": "vca",
   "variant": "Octa VCA (shared level)",
   "ports": [
    {
     "id": "in_1",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_2",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_3",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_4",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_5",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_6",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_7",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "in_8",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_1",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_2",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_3",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_4",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_5",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_6",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_7",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "cv_8",
     "name": "CV",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "vca"
    },
    {
     "id": "out_1",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_2",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_3",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_4",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_5",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_6",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_7",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    },
    {
     "id": "out_8",
     "name": "Out",
     "signalType": "audio",
     "direction": "out",
     "cellGroupId": "vca"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "taper": "exp",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Multi-module met 8 identieke VCA-cellen (multiply): per cel audio-in, gain-CV (typisch een envelope) en audio-uit. De gedeelde Level-knop schaalt alle cellen. Samen met de Octa-VCO en Octa-VCF maakt dit een complete 8-stemmige poly van drie modules. Firmware: tp_mmb_octa_vca (FW-PM-3).",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "vca",
     "label": "VCA",
     "count": 8,
     "portIds": [
      "in",
      "cv",
      "out"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_quad_mixer_shared",
   "categoryId": "utility",
   "variant": "Quad Mixer (per-cell pan, shared volume)",
   "ports": [
    {
     "id": "in_1",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "chan"
    },
    {
     "id": "in_2",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "chan"
    },
    {
     "id": "in_3",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "chan"
    },
    {
     "id": "in_4",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "chan"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pan_1",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_2",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_3",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_4",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "volume",
     "label": "Volume",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Multi-module met 4 mix-cellen. Elke cel heeft een eigen audio-in en een eigen PAN-knop (per-cel control), maar deelt één globale VOLUME-knop (shared control). Mengt naar één stereo-out. Voorbeeld van het per-cel-controls-geval van CellGroups (controlIds: ['pan']) — vergelijk met de quad-VCO die juist ALLE controls deelt (controlIds: []). Hardware bestaat nog niet — eerst alleen in simulator gebruiken.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "chan",
     "label": "Channel",
     "count": 4,
     "portIds": [
      "in"
     ],
     "controlIds": [
      "pan"
     ]
    }
   ]
  },
  {
   "id": "tp_mmb_vcf",
   "categoryId": "vcf",
   "variant": "VCF (lp/hp/bp)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "cv",
     "name": "F CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "q_cv",
     "name": "Q CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 18000,
     "defaultValue": 2000,
     "taper": "log",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "q",
     "label": "Q",
     "min": 0.7,
     "max": 5,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cv_amt",
     "label": "CV amt",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "q_cv_amt",
     "label": "Q CV amt",
     "min": 0,
     "max": 4.3,
     "defaultValue": 2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type",
     "label": "Type",
     "positions": [
      "LP",
      "HP",
      "BP"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Interne MMB filter (state-variable). Cutoff-knop is de basis; F CV moduleert via cv_amt (1V/oct-achtig). Q CV telt op bij de Q-knop met q_cv_amt als diepte (in Q-eenheden, control-rate — prima voor LFO/envelope-sweeps). Q stabiel tussen 0.7 en 5.0.",
   "internal": true
  },
  {
   "id": "tp_mmb_ladder",
   "categoryId": "vcf",
   "variant": "Ladder VCF (Moog-stijl, 24 dB LP)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "cv",
     "name": "F CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "q_cv",
     "name": "Res CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "drive_cv",
     "name": "Drv CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 18000,
     "defaultValue": 2000,
     "taper": "log",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "q",
     "label": "Res (Q)",
     "min": 0,
     "max": 1.8,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 4,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cv_amt",
     "label": "F CV amt",
     "min": 0,
     "max": 7,
     "defaultValue": 2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "knob",
     "id": "q_cv_amt",
     "label": "Res CV amt",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive_cv_amt",
     "label": "Drv CV amt",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Moog-stijl 4-pole lowpass ladder (Huovilainen-model, firmware tp_mmb_ladder). Res = Q: de Res-knop is de basiswaarde, Res CV moduleert erbovenop (diepte via Res CV amt, 0–1 res-eenheden). F CV en Res CV zijn audio-rate op de Teensy; F CV in octaven (F CV amt 0–7 oct). Drv CV moduleert de drive exponentieel: ±1 CV bij amt 1 is ×4…÷4. Res boven ~1.1 gaat zelf-oscilleren; Drive >1 stuurt de tanh-clipping aan. Alleen lowpass 24 dB/oct — HP/BP doe je met de MMB VCF.",
   "internal": true
  },
  {
   "id": "tp_mmb_ms20",
   "categoryId": "vcf",
   "variant": "MS-20 filter (Korg35 Sallen-Key, LP/HP)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "cv",
     "name": "F CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "q_cv",
     "name": "Res CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "drive_cv",
     "name": "Drv CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 18000,
     "defaultValue": 2000,
     "taper": "log",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "q",
     "label": "Res (Q)",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0.1,
     "max": 10,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cv_amt",
     "label": "F CV amt",
     "min": 0,
     "max": 7,
     "defaultValue": 2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "knob",
     "id": "q_cv_amt",
     "label": "Res CV amt",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive_cv_amt",
     "label": "Drv CV amt",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type",
     "label": "Mode",
     "positions": [
      "LP",
      "HP"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Korg35/MS-20 Sallen-Key filter (zero-delay-feedback naar Pirkle, firmware tp_mmb_ms20) met tanh-diodeclipping in de resonantielus en 2x oversampling — de MS-20 \"scream\". Res = Q: de Res-knop is de basiswaarde, Res CV moduleert erbovenop (diepte via Res CV amt). Drv CV moduleert de drive exponentieel (±1 CV bij amt 1 = ×4…÷4). Res = 1 gaat zelf-oscilleren; Drive bepaalt hoe hard de lus satureert. LP is 12 dB/oct, HP is (Korg35-typisch) 6 dB/oct; de mode-switch schakelt live, zonder rebuild. Alle CV control-rate met per-block smoothing; F CV in octaven.",
   "internal": true
  },
  {
   "id": "tp_mmb_vca",
   "categoryId": "vca",
   "variant": "VCA (linear)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "cv",
     "name": "CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "gain",
     "label": "Gain",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "taper": "exp",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "resp",
     "label": "Resp",
     "positions": [
      "Lin",
      "Exp"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Lineaire VCA. Bij gain=0 is de basisweg dicht; een CV-input voegt erbovenop (typisch envelope → CV).",
   "internal": true
  },
  {
   "id": "tp_mmb_out",
   "categoryId": "utility",
   "variant": "Audio output",
   "ports": [
    {
     "id": "l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Stuurt aangesloten audio naar de master out. Mono-bron op L of R werkt ook.",
   "internal": true
  },
  {
   "id": "tp_mmb_midiin",
   "categoryId": "utility",
   "variant": "MIDI-to-CV breakout",
   "ports": [
    {
     "id": "pitch",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "out",
     "eventKind": "voice"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "eventKind": "voice"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "out",
     "eventKind": "voice"
    },
    {
     "id": "press",
     "name": "Press",
     "signalType": "cv",
     "direction": "out",
     "eventKind": "voice"
    },
    {
     "id": "rel",
     "name": "Rel",
     "signalType": "cv",
     "direction": "out",
     "eventKind": "voice"
    },
    {
     "id": "cv_mod",
     "name": "Mod",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "cv_bend",
     "name": "Bend",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "cv_cc1",
     "name": "CC1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "cv_cc2",
     "name": "CC2",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "channel",
     "label": "Ch",
     "min": 0,
     "max": 16,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "0=all",
     "step": 1
    },
    {
     "kind": "display",
     "id": "chDisp",
     "digits": 3,
     "style": "led",
     "bindTo": "channel",
     "format": "int"
    },
    {
     "kind": "led",
     "id": "act",
     "label": "Act",
     "color": "#22c55e",
     "size": "medium"
    },
    {
     "kind": "display",
     "id": "voicesDisp",
     "digits": 2,
     "style": "led",
     "bindTo": "voiceCount",
     "format": "int"
    },
    {
     "kind": "switch",
     "id": "priority",
     "label": "Prio",
     "positions": [
      "last",
      "low",
      "high"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "steal",
     "label": "Steal",
     "positions": [
      "old",
      "low",
      "hi"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "legato",
     "label": "Leg",
     "positions": [
      "off",
      "on"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "bendRange",
     "label": "Bend",
     "min": 1,
     "max": 24,
     "defaultValue": 2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "glide",
     "label": "Glide",
     "min": 0,
     "max": 2000,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms/oct",
     "step": 10
    },
    {
     "kind": "switch",
     "id": "unison",
     "label": "Uni",
     "positions": [
      "off",
      "on"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Sprd",
     "min": 0,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct",
     "step": 1
    },
    {
     "kind": "switch",
     "id": "bendPitch",
     "label": "B→P",
     "positions": [
      "off",
      "on"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "cc1Num",
     "label": "CC1#",
     "min": 0,
     "max": 127,
     "defaultValue": 74,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "display",
     "id": "cc1Disp",
     "digits": 3,
     "style": "led",
     "bindTo": "cc1Num",
     "format": "int"
    },
    {
     "kind": "knob",
     "id": "cc2Num",
     "label": "CC2#",
     "min": 0,
     "max": 127,
     "defaultValue": 71,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "display",
     "id": "cc2Disp",
     "digits": 3,
     "style": "led",
     "bindTo": "cc2Num",
     "format": "int"
    },
    {
     "kind": "knob",
     "id": "a4",
     "label": "A4",
     "min": 380,
     "max": 500,
     "defaultValue": 440,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz",
     "step": 1
    }
   ],
   "notes": "Zet inkomende MIDI om in CV. NOTE-uitgangen (per stem): pitch (V/Oct), gate, velocity, Press (aftertouch: channel pressure zet alle stemmen, poly pressure alleen de stem met die toets; 0..1) en Rel (release-velocity van de laatste note-off op die stem, 0..1, blijft staan — een keyboard dat hem niet meldt geeft 0,5). MOD-uitgangen (globaal): Mod (mod-wheel CC1), Bend (pitch-bend, V/Oct, bereik = Bend-knop in halve tonen; B→P aan = de bend zit ook al in pitch/pitchK, handig zonder aparte bend-kabel), CC1/CC2 (vrij kiesbare CC-nummers via CC1#/CC2#; het gekozen nummer staat op het LED-display naast elke knop). De MIDI-bron kies je in het Simulatie-paneel. Mono/poly volgt automatisch uit het aantal stemmen (voiceCount). PRIO = mono note-priority (last/low/high). STEAL = poly voice-stealing → firmware StealStrategy. LEG = legato (firmware-gedrag = FW-1, nog te bouwen). GLIDE = portamento (ms per octaaf, 0 = uit). UNI = unison (één toets → alle stemmen, last-note); SPRD = unison-detune in centen. Géén MIDI-jack op de front; alles loopt via de brain.",
   "internal": true,
   "role": "event-source"
  },
  {
   "id": "tp_mmb_cvmath",
   "categoryId": "utility",
   "variant": "CV Math (sum/mult)",
   "ports": [
    {
     "id": "a",
     "name": "A",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "b",
     "name": "B",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "c",
     "name": "C",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Sum",
      "Mult"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "gain_a",
     "label": "Gain A",
     "min": -2,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "gain_b",
     "label": "Gain B",
     "min": -2,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "gain_c",
     "label": "Gain C",
     "min": -2,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "offset",
     "label": "Offset",
     "min": -5,
     "max": 5,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Sum-mode: out = a×gain_a + b×gain_b + c×gain_c + offset. Mult-mode: out = (a×gain_a) × (b×gain_b) — ring-mod stijl, bijv. envelope × velocity; let op: gain 0 maakt het product 0 (stilte). Gain-waarden kunnen negatief zijn voor inversie.",
   "internal": true
  },
  {
   "id": "tp_mmb_mixer",
   "categoryId": "utility",
   "variant": "Stereo mixer (4-in)",
   "ports": [
    {
     "id": "in1",
     "name": "1",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in2",
     "name": "2",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in3",
     "name": "3",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in4",
     "name": "4",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "vol1",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan1",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol2",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan2",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol3",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan3",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol4",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan4",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Stereo 4-kanaals mixer. Per kanaal: Vol (0..1) + Pan (-1 links .. +1 rechts, equal-power). Elke ingang wordt naar de L- en R-bus gemengd; out_l/out_r vormen het stereo-paar. Basis voor polyfone stem-sommatie.",
   "internal": true
  },
  {
   "id": "tp_mmb_mixer8",
   "categoryId": "utility",
   "variant": "Stereo mixer (8-in)",
   "ports": [
    {
     "id": "in1",
     "name": "1",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in2",
     "name": "2",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in3",
     "name": "3",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in4",
     "name": "4",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in5",
     "name": "5",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in6",
     "name": "6",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in7",
     "name": "7",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in8",
     "name": "8",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "vol1",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan1",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol2",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan2",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol3",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan3",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol4",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan4",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol5",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan5",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol6",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan6",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol7",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan7",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol8",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan8",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Stereo 8-kanaals mixer (twee kolommen van 4). Per kanaal: Vol (0..1) + Pan (-1 links .. +1 rechts, equal-power). De firmware sommeert via twee AudioMixer4-banken in een sub-mix. Sommatie-node voor racks tot 8 stemmen.",
   "internal": true
  },
  {
   "id": "tp_mmb_mixer16",
   "categoryId": "utility",
   "variant": "Stereo mixer (16-in)",
   "ports": [
    {
     "id": "in1",
     "name": "1",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in2",
     "name": "2",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in3",
     "name": "3",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in4",
     "name": "4",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in5",
     "name": "5",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in6",
     "name": "6",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in7",
     "name": "7",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in8",
     "name": "8",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in9",
     "name": "9",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in10",
     "name": "10",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in11",
     "name": "11",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in12",
     "name": "12",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in13",
     "name": "13",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in14",
     "name": "14",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in15",
     "name": "15",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in16",
     "name": "16",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "vol1",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan1",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol2",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan2",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol3",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan3",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol4",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan4",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol5",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan5",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol6",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan6",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol7",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan7",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol8",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan8",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol9",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan9",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol10",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan10",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol11",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan11",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol12",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan12",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol13",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan13",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol14",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan14",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol15",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan15",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vol16",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan16",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Stereo 16-kanaals mixer (vier kolommen van 4). Per kanaal: Vol (0..1) + Pan (-1 links .. +1 rechts, equal-power). De firmware sommeert via vier AudioMixer4-banken in een sub-mix. Sommatie-node voor racks tot 16 stemmen.",
   "internal": true
  },
  {
   "id": "tp_mmb_seq8",
   "categoryId": "sequencer",
   "variant": "16-step CV/Gate sequencer",
   "ports": [
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "trigger",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "trigger",
     "direction": "in"
    },
    {
     "id": "voct_in",
     "name": "V+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "run_in",
     "name": "Run+",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "cv",
     "name": "CV",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "gate_out",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "trig",
     "name": "Trig",
     "signalType": "trigger",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "s1",
     "label": "1",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s2",
     "label": "2",
     "min": -24,
     "max": 24,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s3",
     "label": "3",
     "min": -24,
     "max": 24,
     "defaultValue": 7,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s4",
     "label": "4",
     "min": -24,
     "max": 24,
     "defaultValue": 12,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s5",
     "label": "5",
     "min": -24,
     "max": 24,
     "defaultValue": 7,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s6",
     "label": "6",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s7",
     "label": "7",
     "min": -24,
     "max": 24,
     "defaultValue": 5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s8",
     "label": "8",
     "min": -24,
     "max": 24,
     "defaultValue": 3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s9",
     "label": "9",
     "min": -24,
     "max": 24,
     "defaultValue": 12,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s10",
     "label": "10",
     "min": -24,
     "max": 24,
     "defaultValue": 9,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s11",
     "label": "11",
     "min": -24,
     "max": 24,
     "defaultValue": 7,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s12",
     "label": "12",
     "min": -24,
     "max": 24,
     "defaultValue": 5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s13",
     "label": "13",
     "min": -24,
     "max": 24,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s14",
     "label": "14",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s15",
     "label": "15",
     "min": -24,
     "max": 24,
     "defaultValue": -5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "knob",
     "id": "s16",
     "label": "16",
     "min": -24,
     "max": 24,
     "defaultValue": -12,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "st"
    },
    {
     "kind": "led",
     "id": "led_s1",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 1
    },
    {
     "kind": "led",
     "id": "led_s2",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 2
    },
    {
     "kind": "led",
     "id": "led_s3",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 3
    },
    {
     "kind": "led",
     "id": "led_s4",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 4
    },
    {
     "kind": "led",
     "id": "led_s5",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 5
    },
    {
     "kind": "led",
     "id": "led_s6",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 6
    },
    {
     "kind": "led",
     "id": "led_s7",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 7
    },
    {
     "kind": "led",
     "id": "led_s8",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 8
    },
    {
     "kind": "led",
     "id": "led_s9",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 9
    },
    {
     "kind": "led",
     "id": "led_s10",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 10
    },
    {
     "kind": "led",
     "id": "led_s11",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 11
    },
    {
     "kind": "led",
     "id": "led_s12",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 12
    },
    {
     "kind": "led",
     "id": "led_s13",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 13
    },
    {
     "kind": "led",
     "id": "led_s14",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 14
    },
    {
     "kind": "led",
     "id": "led_s15",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 15
    },
    {
     "kind": "led",
     "id": "led_s16",
     "color": "#fbbf24",
     "size": "small",
     "bindTo": "__currentStep",
     "bindMatch": 16
    },
    {
     "kind": "knob",
     "id": "root",
     "label": "Root",
     "min": 24,
     "max": 96,
     "defaultValue": 60,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "midi"
    },
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.5,
     "max": 16,
     "defaultValue": 4,
     "taper": "log",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "gate",
     "label": "Gate",
     "min": 0.05,
     "max": 0.95,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "length",
     "label": "Length",
     "min": 2,
     "max": 16,
     "defaultValue": 8,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       6,
       8,
       12,
       16
      ]
     }
    },
    {
     "kind": "switch",
     "id": "run",
     "label": "Run",
     "positions": [
      "Free",
      "Off",
      "Gate"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "led",
     "id": "runLed",
     "color": "#22c55e",
     "size": "small",
     "bindTo": "__runActive"
    },
    {
     "kind": "display",
     "id": "stepDisp",
     "label": "Step",
     "digits": 2,
     "style": "led",
     "bindTo": "__currentStep",
     "format": "int",
     "size": "large"
    },
    {
     "kind": "display",
     "id": "rateBpm",
     "label": "BPM",
     "digits": 3,
     "style": "led",
     "bindTo": "__rateBpm",
     "format": "int",
     "size": "small"
    },
    {
     "kind": "display",
     "id": "lenVal",
     "label": "len",
     "digits": 2,
     "style": "led",
     "bindTo": "length",
     "format": "int",
     "size": "small"
    }
   ],
   "notes": "16-step sequencer met semitone-per-step. Run-schakelaar: Free = sequencer loopt vrij, Off = doorlus (V+ → CV-out, Run+ → Gate-out — sequencer als kabeltje), Gate = wacht op Run+ rising edge en gebruikt V+ als root. CV-out is een proxy voor V/Oct. V+ override-t de root (toetsenbord bepaalt grondtoon). Trig vuurt een korte puls per step (handig voor drum-envelopes). Step-LED licht op bij de huidige positie.",
   "internal": true
  },
  {
   "id": "tp_mmb_string",
   "categoryId": "vco",
   "variant": "Karplus-Strong string",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "pluck_cv",
     "name": "P+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "level_cv",
     "name": "L+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pluck",
     "label": "Pluck",
     "min": 0.01,
     "max": 1,
     "defaultValue": 0.8,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Karplus-Strong physical-modeling snaar (firmware tp_mmb_string, FW-AU-8). Een Gate rising-edge tokkelt de snaar op de toonhoogte uit V/Oct. 'pluck' bepaalt de helderheid/ruisinhoud van de aanslag (0.01 dof … 1.0 helder); pluck en level zijn ook als CV bestuurbaar.",
   "internal": true
  },
  {
   "id": "tp_mmb_elements",
   "categoryId": "vco",
   "variant": "Elements (MI)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "strength",
     "name": "Str",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "envelope",
     "label": "Contour",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bow",
     "label": "Bow",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "blow",
     "label": "Blow",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "strike",
     "label": "Strike",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "blow_meta",
     "label": "Flow",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "strike_meta",
     "label": "Mallet",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fm",
     "label": "FM",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "geometry",
     "label": "Geometry",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "brightness",
     "label": "Bright",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bow_timbre",
     "label": "Bow Tim",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "blow_timbre",
     "label": "Blow Tim",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "strike_timbre",
     "label": "Strike Tim",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "damping",
     "label": "Damping",
     "min": 0,
     "max": 1,
     "defaultValue": 0.25,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "position",
     "label": "Position",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "space",
     "label": "Space",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "signature",
     "label": "Signat",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mod_freq",
     "label": "ModFrq",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mod_offset",
     "label": "ModOff",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Elements modal / physical-modelling voice (firmware tp_mmb_elements, FW-AU-9). V/Oct + Gate in, stereo uit (L/R). Exciters: Bow/Blow/Strike zijn continue levels (mengbaar, zoals de hardware); Flow/Mallet zijn de meta-morphs, Contour de exciter-envelope. FM: 0.5 = neutraal (±24 st bereik). Coarse/fine verschuiven de pitch t.o.v. V/Oct. Monofone voice; voor polyfonie plaats meerdere instanties in een PolyGroup.",
   "internal": true
  },
  {
   "id": "tp_mmb_rings",
   "categoryId": "vco",
   "variant": "Rings (MI resonator)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Strum",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "Odd",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "Even",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "structure_cv",
     "name": "S+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "brightness_cv",
     "name": "B+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "damping_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "position_cv",
     "name": "P+",
     "signalType": "cv",
     "direction": "in"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "structure",
     "label": "Structure",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "brightness",
     "label": "Bright",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "damping",
     "label": "Damping",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "position",
     "label": "Position",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "model",
     "label": "Model",
     "positions": [
      "Modal",
      "Sympath",
      "String",
      "FM",
      "Quant",
      "Str+Rev"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "polyphony",
     "label": "Poly",
     "positions": [
      "1",
      "2",
      "4"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Rings resonator (firmware tp_mmb_rings, FW-AU-11). Elke stijgende flank op Strum plukt de resonator op de huidige V/Oct-toonhoogte; Poly 2/4 laat strums over stemmen roteren (odd op L, even op R). Modellen: modal (klokken/marimba), sympathetic strings, string (Karplus-achtig), plus de FM/quantized/string+reverb bonus-modellen. Structure = inharmoniciteit/snaarkoppeling, Position = excitatiepunt.",
   "internal": true
  },
  {
   "id": "tp_mmb_plaits",
   "categoryId": "vco",
   "variant": "Plaits (MI macro-osc)",
   "ports": [
    {
     "id": "harmonics_cv",
     "name": "H+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "timbre_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "morph_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "aux",
     "name": "Aux",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "engine",
     "label": "Engine",
     "min": 0,
     "max": 23,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "display",
     "id": "engDisp",
     "digits": 2,
     "style": "led",
     "bindTo": "engine",
     "format": "int"
    },
    {
     "kind": "display",
     "id": "engName",
     "digits": 9,
     "style": "led-green",
     "bindTo": "engine",
     "lookup": [
      [
       "VA+VCF",
       "PHASEDIST",
       "FM 6-OP A",
       "FM 6-OP B",
       "FM 6-OP C",
       "WAVETERR",
       "STRINGS",
       "CHIPTUNE",
       "VA",
       "WAVESHAPE",
       "FM 2-OP",
       "GRAIN",
       "ADDITIVE",
       "WAVETABLE",
       "CHORD",
       "SPEECH",
       "SWARM",
       "NOISE",
       "PARTICLE",
       "STRING",
       "MODAL",
       "BASS DRUM",
       "SNARE",
       "HI-HAT"
      ]
     ],
     "text": "VA+VCF",
     "size": "small"
    },
    {
     "kind": "knob",
     "id": "harmonics",
     "label": "Harmonics",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "timbre",
     "label": "Timbre",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "morph",
     "label": "Morph",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lpg",
     "label": "LPG",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    }
   ],
   "notes": "Mutable Instruments Plaits macro-oscillator (firmware tp_mmb_plaits, FW-AU-12). Eén knop kiest uit 24 engines (Plaits 1.2): 0 VA+VCF · 1 Phase distortion · 2/3/4 6-op FM A/B/C · 5 Wave terrain · 6 String machine · 7 Chiptune · 8 VA · 9 Waveshape · 10 FM · 11 Grain · 12 Additive · 13 Wavetable · 14 Chord · 15 Speech · 16 Swarm · 17 Noise · 18 Particle · 19 String · 20 Modal · 21 BassDrum · 22 Snare · 23 HiHat. Speech (15): Trig moet gepatcht zijn; Harmonics kiest het model (0–0,33 klinkers formant→SAM→LPC, 0,33–0,45 LPC-fonemen, daarboven vijf woordbanken), Morph de klinker of het woord, Timbre de formantverschuiving. Harmonics/Timbre/Morph zijn de drie macro-parameters (per engine anders). De interne low-pass-gate (Decay/LPG) vuurt per Trig; Aux draagt de engine-variant. CV-ingangen: harmonics_cv/timbre_cv/morph_cv/level_cv (alias zonder _cv werkt ook).",
   "internal": true
  },
  {
   "id": "tp_mmb_clouds",
   "categoryId": "effect",
   "variant": "Clouds (MI granular)",
   "ports": [
    {
     "id": "in_l",
     "name": "In L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "In R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "freeze",
     "name": "Frz",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "trig",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "size_cv",
     "name": "S+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "Out L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "Out R",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "position_cv",
     "name": "P+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "density_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "texture_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "position",
     "label": "Position",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "size",
     "label": "Size",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pitch",
     "label": "Pitch",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "density",
     "label": "Density",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "texture",
     "label": "Texture",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Feedbk",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "reverb",
     "label": "Reverb",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Gran",
      "Strch",
      "Loop",
      "Spect"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "toggle",
     "id": "freeze",
     "label": "Freeze",
     "defaultValue": false
    }
   ],
   "notes": "Mutable Instruments Clouds granular processor (firmware tp_mmb_clouds, FW-FX-4). Stereo in → korrelwolk → stereo uit; mono-bron op In L werkt ook. Freeze bevriest de audiobuffer (jack of toggle), Trig vuurt één korrel. Modes: granular / pitch-stretch / looping delay / spectral. CV-ingangen: position/density/texture (ook size_cv/pitch_cv/mix_cv via kabel). Let op: één instantie kost ~26% CPU en ~180 KB heap.",
   "internal": true
  },
  {
   "id": "tp_mmb_tides",
   "categoryId": "lfo",
   "variant": "Tides (MI slopes)",
   "ports": [
    {
     "id": "shape_cv",
     "name": "Sh+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "slope_cv",
     "name": "Sl+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "smooth_cv",
     "name": "Sm+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "shift_cv",
     "name": "Sf+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "rate_cv",
     "name": "R+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out1",
     "name": "1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out2",
     "name": "2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out3",
     "name": "3",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out4",
     "name": "4",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.01,
     "max": 100,
     "defaultValue": 2,
     "taper": "log",
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "AD",
      "Loop",
      "AR"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "output",
     "label": "Out",
     "positions": [
      "Gates",
      "Ampl",
      "Phase",
      "Freq"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "shape",
     "label": "Shape",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "slope",
     "label": "Slope",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "smooth",
     "label": "Smooth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "shift",
     "label": "Shift",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Tides (tides2) slope-generator (firmware tp_mmb_tides, FW-CV-1). CV-domein op de 1 kHz-tick: LFO/envelope tot ~100 Hz. Mode: AD = trigger-envelope, Loop = LFO, AR = gate-envelope. Out-mode bepaalt de 4 uitgangen: Gates (slope+EOA+EOR), Ampl (4 niveaus via Shift), Phase (4 fasen — quadratuur-LFO!), Freq (4 gerelateerde snelheden). Rate-CV is exponentieel (±1 = ±1 octaaf). Uitgangen genormaliseerd (fullscale ≈ 1.0). Let op (upstream-gedrag): in Ampl-mode kiest Shift het actieve kanaal — op precies 0.5 zijn alle vier de uitgangen 0.",
   "internal": true
  },
  {
   "id": "tp_mmb_marbles",
   "categoryId": "sequencer",
   "variant": "Marbles (MI random)",
   "ports": [
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "rate_cv",
     "name": "R+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "dejavu_cv",
     "name": "DV+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "spread_cv",
     "name": "Sp+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "t1",
     "name": "t1",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "t2",
     "name": "t2",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "tclk",
     "name": "tK",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "x1",
     "name": "X1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "x2",
     "name": "X2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "x3",
     "name": "X3",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "y",
     "name": "Y",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 10,
     "max": 480,
     "defaultValue": 120,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bias",
     "label": "Bias",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "jitter",
     "label": "Jitter",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "xbias",
     "label": "Bias X",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "steps",
     "label": "Steps",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "dejavu",
     "label": "Déjà vu",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "length",
     "label": "Loop",
     "min": 1,
     "max": 16,
     "defaultValue": 8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "switch",
     "id": "model",
     "label": "Model",
     "positions": [
      "Coin",
      "Clus",
      "Drum"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "scale",
     "label": "Scale",
     "positions": [
      "Maj",
      "Min",
      "Pent",
      "Pelog",
      "Bhai",
      "Shri"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "range",
     "label": "Range",
     "positions": [
      "+2V",
      "+5V",
      "±5V"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "toggle",
     "id": "extclock",
     "label": "ExtClk",
     "defaultValue": false
    }
   ],
   "notes": "Mutable Instruments Marbles (firmware tp_mmb_marbles, FW-CV-2): generatieve random-sequencer in het CV-domein (1 kHz-tick). t1/t2 zijn random gates rond de interne klok (Tempo, of ExtClk + Clk-jack); tK is de master-klok. X1..X3 zijn gekwantiseerde random-CV's in volts — patch X1 direct op een V/Oct-ingang en kies een Scale. Déjà vu rond 0.5 bevriest de loop (Loop = lengte); Steps maakt gladde CV's trapsgewijs; Spread/Bias X sturen de spreiding. Y is een trage random-CV (klok ÷16). Range: octaafbereik van X (±5V = ±5 octaven rond C4).",
   "internal": true
  },
  {
   "id": "tp_mmb_dx7",
   "categoryId": "vco",
   "variant": "DX7 (msfa 6-op FM)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "bank",
     "label": "Bank",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "size": "small",
     "color": "#a5b4fc",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       8
      ]
     }
    },
    {
     "kind": "display",
     "id": "bnkDisp",
     "digits": 2,
     "style": "led",
     "bindTo": "bank",
     "format": "int"
    },
    {
     "kind": "knob",
     "id": "program",
     "label": "Program",
     "min": 0,
     "max": 31,
     "defaultValue": 0,
     "size": "medium",
     "color": "#a5b4fc",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "display",
     "id": "prgDisp",
     "digits": 2,
     "style": "led",
     "bindTo": "program",
     "format": "int"
    },
    {
     "kind": "display",
     "id": "voiceName",
     "digits": 10,
     "style": "led-green",
     "bindTo": "program",
     "bindTo2": "bank",
     "lookup": [
      [
       "BRASS   1",
       "BRASS   2",
       "BRASS   3",
       "STRINGS 1",
       "STRINGS 2",
       "STRINGS 3",
       "ORCHESTRA",
       "PIANO   1",
       "PIANO   2",
       "PIANO   3",
       "E.PIANO 1",
       "GUITAR  1",
       "GUITAR  2",
       "SYN-LEAD 1",
       "BASS    1",
       "BASS    2",
       "E.ORGAN 1",
       "PIPES   1",
       "HARPSICH 1",
       "CLAV    1",
       "VIBE    1",
       "MARIMBA",
       "KOTO",
       "FLUTE   1",
       "ORCH-CHIME",
       "TUB BELLS",
       "STEEL DRUM",
       "TIMPANI",
       "REFS WHISL",
       "VOICE   1",
       "TRAIN",
       "TAKE OFF"
      ],
      [
       "PIANO   4",
       "PIANO   5",
       "E.PIANO 2",
       "E.PIANO 3",
       "E.PIANO 4",
       "PIANO 5THS",
       "CELESTE",
       "TOY PIANO",
       "HARPSICH 2",
       "HARPSICH 3",
       "CLAV    2",
       "CLAV    3",
       "E.ORGAN 2",
       "E.ORGAN 3",
       "E.ORGAN 4",
       "E.ORGAN 5",
       "PIPES   2",
       "PIPES   3",
       "PIPES   4",
       "CALIOPE",
       "ACCORDION",
       "SITAR",
       "GUITAR  3",
       "GUITAR  4",
       "GUITAR  5",
       "GUITAR  6",
       "LUTE",
       "BANJO",
       "HARP    1",
       "HARP    2",
       "BASS    3",
       "BASS    4"
      ],
      [
       "PICCOLO",
       "FLUTE   2",
       "OBOE",
       "CLARINET",
       "SAX BC",
       "BASSOON",
       "STRINGS 4",
       "STRINGS 5",
       "STRINGS 6",
       "STRINGS 7",
       "STRINGS 8",
       "BRASS   4",
       "BRASS   5",
       "BRASS 6 BC",
       "BRASS   7",
       "BRASS   8",
       "RECORDER",
       "HARMONICA1",
       "HRMNCA2 BC",
       "VOICE   2",
       "VOICE   3",
       "GLOKENSPL",
       "VIBE    2",
       "XYLOPHONE",
       "CHIMES",
       "GONG    1",
       "GONG    2",
       "BELLS",
       "COW BELL",
       "BLOCK",
       "FLEXATONE",
       "LOG DRUM"
      ],
      [
       "SYN-LEAD 2",
       "SYN-LEAD 3",
       "SYN-LEAD 4",
       "SYN-LEAD 5",
       "SYN-CLAV 1",
       "SYN-CLAV 2",
       "SYN-CLAV 3",
       "SYN-PIANO",
       "SYNBRASS 1",
       "SYNBRASS 2",
       "SYNORGAN 1",
       "SYNORGAN 2",
       "SYN-VOX",
       "SYN-ORCH",
       "SYN-BASS 1",
       "SYN-BASS 2",
       "HARP-FLUTE",
       "BELL-FLUTE",
       "E.P-BRS BC",
       "T.BL-EXPA",
       "CHIME-STRG",
       "B.DRM-SNAR",
       "SHIMMER",
       "EVOLUTION",
       "WATER GDN",
       "WASP STING",
       "LASER GUN",
       "DESCENT",
       "OCTAVE WAR",
       "GRAND PRIX",
       "ST.HELENS",
       "EXPLOSION"
      ],
      [
       "FLUTE   1",
       "HARPSICH 1",
       "STRG ENS 1",
       "BRIGHT BOW",
       "BRASSHORNS",
       "BR TRUMPET",
       "MARIMBA",
       "E.PIANO 1",
       "PIANO   1",
       "PIPES   1",
       "E.ORGAN 1",
       "E.BASS  1",
       "CLAV    1",
       "HARMONICA1",
       "JAZZ GUIT1",
       "PRC SYNTH1",
       "SAX BC",
       "FRETLESS 1",
       "HARP    1",
       "TIMPANI",
       "HEAVYMETAL",
       "STEEL DRUM",
       "SYN-LEAD 1",
       "VOICES BC",
       "CLAV ENS",
       "LASERSWEEP",
       "TUB ERUPT",
       "GRAND PRIX",
       "REFS WHISL",
       "TRAIN",
       "BRASS S H",
       "TAKE OFF"
      ],
      [
       "PIANO   2",
       "E.GRAND 1",
       "E.GRAND 2",
       "HONKY TONK",
       "E.PIANO 2",
       "E.PIANO 3",
       "E.PIANO 4",
       "CELESTE",
       "FUNK CLAV",
       "CLAV ENS 2",
       "PERC CLAV",
       "HARPSICH 2",
       "E.ORGAN 2",
       "E.ORGAN 3",
       "60-S ORGAN",
       "PIPES   2",
       "PIPES   3",
       "CALIOPE",
       "ACCORDION",
       "TOY PIANO",
       "SITAR",
       "KOTO",
       "JAZZ GUIT2",
       "SPANISHGTR",
       "FOLK GUIT",
       "LUTE",
       "BANJO",
       "CLAS.GUIT",
       "HARP    2",
       "E.BASS  2",
       "FRETLESS 2",
       "PLUCK BASS"
      ],
      [
       "PICCOLO",
       "FLUTE   2",
       "OBOE",
       "CLARINET",
       "BASSOON",
       "PAN FLUTE",
       "LEAD BRASS",
       "HORNS",
       "SOLO TBONE",
       "BRASS BC",
       "BRASS 5THS",
       "SYNTHBRASS",
       "STRG QRT 1",
       "STRG ENS 2",
       "VIOLA SECN",
       "STRGS LOW",
       "HIGH STRGS",
       "PIZZ STGS",
       "STG CRSNDO",
       "STGS 5THS",
       "BELLS",
       "TUB BELLS",
       "RECORDERS",
       "CHIMES",
       "VOICES",
       "XYLOPHONE",
       "COWBELL",
       "WOOD BLOCK",
       "FLEXATONE",
       "LOG DRUM",
       "GLOKENSPL",
       "VIBE"
      ],
      [
       "CLAV-E.PNO",
       "PERC BRASS",
       "PRC SYNTH2",
       "HARPSI-STG",
       "CHIME-STRG",
       "HARP-FLUTE",
       "BELL-FLUTE",
       "STRG-CHIME",
       "STRG-MARIM",
       "STRG-PIZZT",
       "ORCHESTRA",
       "LEAD GUITR",
       "PIANO-BRS",
       "BRS-CHIME",
       "B.DRM-SNAR",
       "E.P-BRS BC",
       "ORG-BRS BC",
       "CLV-BRS BC",
       "WHISTLES",
       "FILTER SWP",
       "FUNKY RISE",
       "WILD BOAR",
       "SHIMMER",
       "EVOLUTION",
       "WATER GDN",
       "WASP STING",
       "MULTI NOTE",
       "DESCENT",
       "OCTAVE WAR",
       "..GOTCHA..",
       "ST.HELENS",
       "EXPLOSION"
      ],
      [
       "USER 0",
       "USER 1",
       "USER 2",
       "USER 3",
       "USER 4",
       "USER 5",
       "USER 6",
       "USER 7",
       "USER 8",
       "USER 9",
       "USER 10",
       "USER 11",
       "USER 12",
       "USER 13",
       "USER 14",
       "USER 15",
       "USER 16",
       "USER 17",
       "USER 18",
       "USER 19",
       "USER 20",
       "USER 21",
       "USER 22",
       "USER 23",
       "USER 24",
       "USER 25",
       "USER 26",
       "USER 27",
       "USER 28",
       "USER 29",
       "USER 30",
       "USER 31"
      ]
     ],
     "text": "----------",
     "size": "medium"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Yamaha DX7-stem op de msfa-engine (Apache-2.0, dezelfde kern als Dexed/MicroDexed; firmware tp_mmb_dx7, FW-AU-13). Eén stem per instantie — polyfoon via de Poly-seeds. De 8 Yamaha factory-ROMs (1A..4B) zitten ingebouwd in de firmware-flash; Bank kiest de ROM en Program de voice 0–31 (namen: zie dx7BankNames.ts — de firmware logt de naam bij elke wissel). Bank USR = eigen 32-voice .syx, geladen via de Teensy-modal (🎹 DX7-bank); zonder upload klinkt USR als E.PIANO 1. Velocity stuurt de FM-envelopes zoals op het origineel; pitch is fractioneel (V/Oct + Coarse/Fine via de interne pitch-mod).",
   "internal": true
  },
  {
   "id": "tp_mmb_warps",
   "categoryId": "effect",
   "variant": "Warps (MI meta-modulator)",
   "ports": [
    {
     "id": "in1",
     "name": "In 1",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in2",
     "name": "In 2",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "algo_cv",
     "name": "A+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "timbre_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "aux",
     "name": "Aux",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "algo",
     "label": "Algorithm",
     "min": 0,
     "max": 8,
     "defaultValue": 2,
     "size": "large",
     "color": "#22c55e",
     "style": "generic"
    },
    {
     "kind": "display",
     "id": "algDisp",
     "digits": 1,
     "style": "led",
     "bindTo": "algo",
     "format": "int"
    },
    {
     "kind": "knob",
     "id": "timbre",
     "label": "Timbre",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "shape",
     "label": "Carrier",
     "positions": [
      "Ext",
      "Sin",
      "Tri",
      "Saw",
      "Pls",
      "Nz"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "drive1",
     "label": "Drv 1",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive2",
     "label": "Drv 2",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Warps meta-modulator (firmware tp_mmb_warps, FW-FX-5). Vouwt In 1 (carrier) en In 2 (modulator) door elkaar; de Algorithm-knop morpht door: 0 xfade · 1 wavefolder · 2 ringmod (analoog model) · 3 ringmod (digitaal) · 4 XOR · 5 comparator · 6 spectraal · 7 morph · 8 vocoder. Timbre kleurt het gekozen algoritme. Carrier ≠ Ext vervangt In 1 door de interne oscillator (V/Oct + Coarse bespeelbaar) — zet 8 (vocoder) en spreek/speel via In 2. Aux draagt de spiegelvariant. Draait native op 44.1 kHz.",
   "internal": true
  },
  {
   "id": "tp_mmb_morph_wt",
   "categoryId": "vco",
   "variant": "Morph-WT (morphing wavetable)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "morph_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "morph",
     "label": "Morph",
     "min": 0,
     "max": 7,
     "defaultValue": 0,
     "size": "large",
     "color": "#22c55e",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "bank",
     "label": "Bank",
     "positions": [
      "Ana",
      "Voc",
      "Hrm",
      "Dig",
      "Usr"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "wslot",
     "label": "W-slot",
     "min": 0,
     "max": 7,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    }
   ],
   "notes": "Morphing-wavetable-VCO (firmware tp_mmb_morph_wt, FW-AU-14): 8 frames per bank, per sample geïnterpoleerd én tussen aangrenzende frames gecrossfaded — draai Morph (of stuur M+ met een LFO) voor vloeiende spectrale beweging. Banken: Analog (sin→tri→saw→puls), Vocal (schuivende formants), Harmonics (drawbar-opbouw), Digital (gaten/fase-flips), USER. USER-frames vul je met de wavetable-push van de Draw-VCO-teken-UI: W-slot kiest het doelframe. v2 is per-octaaf gebandlimit (3 mip-levels), dus ook hoog schoon.",
   "internal": true
  },
  {
   "id": "tp_mmb_stages",
   "categoryId": "envelope",
   "variant": "Stages (MI segment-gen)",
   "ports": [
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "eoc",
     "name": "EOC",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "t1",
     "label": "T1",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "s1",
     "label": "S1",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type1",
     "label": "",
     "positions": [
      "R",
      "H",
      "S",
      "A"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "t2",
     "label": "T2",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "s2",
     "label": "S2",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type2",
     "label": "",
     "positions": [
      "R",
      "H",
      "S",
      "A"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "t3",
     "label": "T3",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "s3",
     "label": "S3",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type3",
     "label": "",
     "positions": [
      "R",
      "H",
      "S",
      "A"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "t4",
     "label": "T4",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "s4",
     "label": "S4",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type4",
     "label": "",
     "positions": [
      "R",
      "H",
      "S",
      "A"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "t5",
     "label": "T5",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "s5",
     "label": "S5",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type5",
     "label": "",
     "positions": [
      "R",
      "H",
      "S",
      "A"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "t6",
     "label": "T6",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "s6",
     "label": "S6",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type6",
     "label": "",
     "positions": [
      "R",
      "H",
      "S",
      "A"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "segments",
     "label": "Active",
     "min": 1,
     "max": 6,
     "defaultValue": 3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "toggle",
     "id": "loop",
     "label": "Loop",
     "defaultValue": false
    },
    {
     "kind": "knob",
     "id": "loop_start",
     "label": "L-start",
     "min": 0,
     "max": 5,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "loop_end",
     "label": "L-end",
     "min": 0,
     "max": 5,
     "defaultValue": 2,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.05,
     "max": 20,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Stages (firmware tp_mmb_stages, FW-CV-3): 6 ketenbare segmenten in het CV-domein (1 kHz-tick). Elk segment heeft een type — R(amp) / H(old) / S(tep) / A(lt) — en twee knoppen (T = primary, S = secondary; betekenis per type: ramp = tijd+vorm, hold = niveau+tijd, step = niveau+portamento). Active kiest hoeveel segmenten meedoen; Loop + L-start/L-end laat een deel herhalen → een multi-stage-LFO. Gate triggert/gatet de keten; EOC pulseert bij de cyclusstart. Zonder loop is het een complexe multi-breakpoint-envelope.",
   "internal": true
  },
  {
   "id": "tp_mmb_peaks",
   "categoryId": "drum",
   "variant": "Peaks (MI drums)",
   "ports": [
    {
     "id": "gate",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "drum",
     "label": "Drum",
     "positions": [
      "Kick",
      "Snare",
      "Hat",
      "FM"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "snap",
     "label": "Snap",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Peaks drums (firmware tp_mmb_peaks, FW-AU-15): 808-achtige analoge-model-drums. Drum kiest Kick / Snare / Hat / FM; elke stijgende flank op Trig slaat de drum. Tone en Decay zijn de macro-knoppen; Snap = punch (kick) / snappy (snare) / FM-amount (fm). V/Oct + Coarse stemmen de kick/snare/fm. Eén drum per module — plaats er meerdere en klok ze met Marbles t1/t2 of een sequencer. Rendert op 48 kHz, geresampled naar 44.1.",
   "internal": true
  },
  {
   "id": "tp_mmb_resonator",
   "categoryId": "effect",
   "variant": "Resonator (sympathetic)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "struct_cv",
     "name": "St+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "mix",
     "name": "Mix",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "root",
     "label": "Root",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "switch",
     "id": "scale",
     "label": "Scale",
     "positions": [
      "Chrom",
      "Maj",
      "Min",
      "5th",
      "Harm"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "structure",
     "label": "Struct",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "damping",
     "label": "Damp",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Sympathetic-resonator-bank (firmware tp_mmb_resonator, FW-FX-6). Twaalf Karplus-achtige comb-resonatoren gestemd op een schaal rond Root (semitonen rond C2, V/Oct verschuift mee). Audio op In excite't alle snaren tegelijk: harmonisch verwante snaren klinken mee (sitar/piano-klankkast), ook zonder direct te zijn aangeslagen. Struct spreidt de stemming (koor-detune), Decay = resonantietijd, Damp = helderheid (laag = donker). Out en Mix dragen hetzelfde signaal (dry/wet volgens de Mix-knob) — patch op Out. ~75 KB heap, enkele % CPU.",
   "internal": true
  },
  {
   "id": "tp_mmb_cr78",
   "categoryId": "drum",
   "variant": "CR-78 drum (berekend)",
   "ports": [
    {
     "id": "gate",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "accent_cv",
     "name": "Acc",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "drum",
     "label": "Drum",
     "positions": [
      "Kick",
      "Snare",
      "Rim",
      "Claves",
      "Cowbell",
      "HiHat",
      "Cymbal",
      "Maracas",
      "Guiro",
      "Bongo",
      "Conga",
      "Tamb"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#fbe8c8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bend",
     "label": "Bend",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#fbe8c8",
     "style": "generic"
    }
   ],
   "notes": "Roland CR-78 drumstem, berekend i.p.v. gesampeld (firmware tp_mmb_cr78, FW-AU-16). Drum kiest een van 12 stemmen: Kick/Bongo/Conga zijn bridged-T gedempte sinussen met aanslag-pitchbuiging, Snare mengt vel + hiss, Rim/Claves korte hoge sinussen, Cowbell twee onharmonische sinussen door een soft-clip, HiHat/Cymbal/Maracas/Tamb gefilterde ruis met envelope-VCA, Guiro een pulstrein-geratel. Accent-CV maakt de slag luider én buigt de pitch harder (het accent-circuit — dat mist een sample). Tone = kleur/pitch per stem, Bend = buigdiepte, V/Oct stemt de vellen. Eén drum per module, zoals Peaks.",
   "internal": true
  },
  {
   "id": "tp_mmb_quant",
   "categoryId": "utility",
   "variant": "Quantizer (schaal)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "trig",
     "name": "Trig",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "scale",
     "label": "Scale",
     "positions": [
      "Chrom",
      "Maj",
      "Min",
      "PentM",
      "Pentm",
      "Dor",
      "5th",
      "Whole"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "root",
     "label": "Root",
     "min": 0,
     "max": 11,
     "defaultValue": 0,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "glide",
     "label": "Glide",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#0891b2",
     "style": "generic"
    }
   ],
   "notes": "V/Oct-quantizer (firmware tp_mmb_quant, FW-CV-4): klikt de CV op In vast op de dichtstbijzijnde noot van de gekozen schaal. Root verschuift de grondtoon (semitonen), Glide is een one-pole portamento (0–500 ms) tussen de noten. Trig vuurt een 10 ms-puls bij elke nootwissel — trigger er een envelope of pluk mee. Klassiek achter Marbles X-uitgangen, een S&H of een trage LFO.",
   "internal": true
  },
  {
   "id": "tp_mmb_chord",
   "categoryId": "utility",
   "variant": "Chord (4 stemmen)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out1",
     "name": "1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out2",
     "name": "2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out3",
     "name": "3",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out4",
     "name": "4",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "chord",
     "label": "Chord",
     "positions": [
      "Maj",
      "Min",
      "Maj7",
      "Min7",
      "Dom7",
      "Sus2",
      "Sus4",
      "Dim7",
      "Aug",
      "5th"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "inv",
     "label": "Inv",
     "min": 0,
     "max": 3,
     "defaultValue": 0,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#0891b2",
     "style": "generic"
    }
   ],
   "notes": "Chord-generator (firmware tp_mmb_chord, FW-CV-5): zet vier akkoordstemmen rond de V/Oct-ingang. Inv is de klassieke inversie (laagste stemmen een octaaf omhoog), Spread opent de voicing trapsgewijs in octaven (blijft dus akkoordeigen). Stuur out1..4 naar vier VCO-cellen (Octa-VCO), vier DX7's of de resonator-bank. Achter de quantizer (tp_mmb_quant) blijft de grondtoon in de toonsoort.",
   "internal": true
  },
  {
   "id": "tp_mmb_elements_reverb",
   "categoryId": "effect",
   "variant": "Reverb (Dattorro)",
   "ports": [
    {
     "id": "in_l",
     "name": "In L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "In R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "Out L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "Out R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "amount",
     "label": "Amount",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "time",
     "label": "Time",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "diffusion",
     "label": "Diff",
     "min": 0,
     "max": 1,
     "defaultValue": 0.625,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lp",
     "label": "Damp",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#0891b2",
     "style": "generic"
    }
   ],
   "notes": "Mutable Instruments Elements' Dattorro-plate-reverb als losse stereo-module (firmware tp_mmb_elements_reverb, FW-FX-3). Amount = dry/wet, Time = staartlengte, Diff = diffusie (echodichtheid), Damp = lowpass in de staart (laag = donkerder). Mono-bron: alleen In L aansluiten werkt (de plate spreidt naar stereo). 64 KB delaybuffer op de heap; draait native op 44.1 kHz.",
   "internal": true
  },
  {
   "id": "tp_mmb_grids",
   "categoryId": "sequencer",
   "variant": "Grids (drum-kaart)",
   "ports": [
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "x_cv",
     "name": "X+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "y_cv",
     "name": "Y+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "bd",
     "name": "BD",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "sd",
     "name": "SD",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "hh",
     "name": "HH",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "acc",
     "name": "Acc",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "x",
     "label": "X",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "y",
     "label": "Y",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#0891b2",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bd",
     "label": "BD",
     "min": 0,
     "max": 1,
     "defaultValue": 0.75,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sd",
     "label": "SD",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "hh",
     "label": "HH",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "chaos",
     "label": "Chaos",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 20,
     "max": 300,
     "defaultValue": 120,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "toggle",
     "id": "extclock",
     "label": "ExtClk",
     "defaultValue": false
    }
   ],
   "notes": "Topologische drum-sequencer (firmware tp_mmb_grids, FW-SQ-2), geïnspireerd op MI Grids maar met eigen patroondata (upstream is GPL-3.0). X morpht basis→druk, Y mengt syncopatie erin; elke plek op de kaart heeft eigen karakter (value-noise op een 5×5-rooster). BD/SD/HH zijn density-drempels per stem; hits met hoge prioriteit krijgen Acc (accent) — stuur die naar de accent-CV van de CR-78. Chaos randomiseert per patroonronde. 32 stappen (2 maten zestienden), interne klok (Tempo) of ExtClk + Clk-jack. Reset springt naar stap 0.",
   "internal": true
  },
  {
   "id": "tp_mmb_comp",
   "categoryId": "effect",
   "variant": "Compressor + overdrive",
   "ports": [
    {
     "id": "thr_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "drive_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "threshold",
     "label": "Thr",
     "min": -48,
     "max": 0,
     "defaultValue": -18,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "ratio",
     "label": "Ratio",
     "min": 1,
     "max": 20,
     "defaultValue": 4,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": ":1"
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Atk",
     "min": 0.1,
     "max": 100,
     "defaultValue": 10,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Rel",
     "min": 5,
     "max": 1000,
     "defaultValue": 120,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "makeup",
     "label": "Gain",
     "min": 0,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Feed-forward peak-compressor met makeup-gain en een tanh soft-clip overdrive (firmware tp_mmb_comp, FW-FX-2). De Teensy Audio-lib heeft geen kant-en-klare compressor; dit is een custom AudioStream. 'drive' voegt na de compressie warme saturatie toe; threshold en drive zijn ook als CV bestuurbaar.",
   "internal": true
  },
  {
   "id": "tp_mmb_noise",
   "categoryId": "noise",
   "variant": "Noise generator",
   "ports": [
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "color",
     "label": "Color",
     "positions": [
      "white",
      "pink",
      "brown"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Witte / roze / bruine ruis. Mooi voor S&H-bronnen, drum-shells of hi-hat-percussie.",
   "internal": true
  },
  {
   "id": "tp_mmb_audioin",
   "categoryId": "utility",
   "variant": "Audio input",
   "ports": [
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mono",
     "label": "Mono",
     "positions": [
      "stereo",
      "mono"
     ],
     "defaultIndex": 1
    }
   ],
   "notes": "Audio-ingang. In de simulator: de microfoon van de browser (de standaard-ingang van je systeem; de browser vraagt toestemming). Op de Teensy: wat de pc naar het afspeelapparaat \"Teensy MIDI/Audio\" stuurt — zet in Windows bij je headset-microfoon \"Listen to this device\" aan met de Teensy als afspeelapparaat. Mono sommeert L+R naar beide uitgangen (een microfoon is mono). Gebruik een koptelefoon, anders gaat het rondzingen.",
   "internal": true
  },
  {
   "id": "tp_mmb_echo",
   "categoryId": "effect",
   "variant": "Feedback delay",
   "ports": [
    {
     "id": "time_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fbk_cv",
     "name": "F+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "time",
     "label": "Time",
     "min": 0.01,
     "max": 0.5,
     "defaultValue": 0.3,
     "taper": "log",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 0.95,
     "defaultValue": 0.45,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.35,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "tempo_sync",
     "label": "Sync",
     "defaultValue": false
    }
   ],
   "notes": "Feedback-delay met CV op tijd (sec), feedback en mix. Op de Teensy een AudioEffectDelay-feedbacklus (max 500 ms). Sync-toggle haakt later in op de master-clock.",
   "internal": true
  },
  {
   "id": "tp_mmb_tape_echo",
   "categoryId": "effect",
   "variant": "Tape echo",
   "ports": [
    {
     "id": "time_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fbk_cv",
     "name": "F+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "time",
     "label": "Time",
     "min": 0.02,
     "max": 1,
     "defaultValue": 0.35,
     "taper": "log",
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 1.1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "wow",
     "label": "Wow",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "flutter",
     "label": "Flutter",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "Bandecho: de band is een int16-buffer (max 1 s), de leeskop staat op tijd + wow + flutter achter de schrijfkop en de tijd wordt traag geslewd — draaien aan Time zwiept de toonhoogte zoals een bandmotor. Feedback door een verzadiger (Drive) en een toon-lowpass (Tone): elke omloop doffer. Firmware tp_mmb_tape_echo (mmb_dsp::TapeEcho); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_stereo_tape_echo",
   "categoryId": "effect",
   "variant": "Stereo tape echo",
   "ports": [
    {
     "id": "time_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fbk_cv",
     "name": "F+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "cross_cv",
     "name": "X+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "time",
     "label": "Time",
     "min": 0.02,
     "max": 1,
     "defaultValue": 0.35,
     "taper": "log",
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "ratio",
     "label": "Ratio",
     "min": 0.5,
     "max": 2,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "×R",
     "ticks": {
      "every": 0.25,
      "highlight": [
       0.5,
       0.75,
       1,
       1.5,
       2
      ]
     }
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 1.1,
     "defaultValue": 0.4,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cross",
     "label": "Cross",
     "min": 0,
     "max": 1.1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "wow",
     "label": "Wow",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "flutter",
     "label": "Flutter",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "Stereo bandecho: twee bandsporen (dezelfde TapeEcho-kern als het mono-echo: verzadiging, toon-laagdoorlaat, wow en flutter) met Ratio = tijd van het rechterspoor als factor van links (0,75 of 1,5 = gepunteerde patronen) en Cross = hoeveel van het natte signaal van het ene spoor de schrijfkop van het andere in gaat. Cross 1 met Fbk 0 = ping-pong; Cross én Fbk samen = een wolk die van links naar rechts kruipt (de verzadiger houdt de lus in toom, ook boven 1). De wow/flutter van rechts loopt een kwartslag achter, dus de sporen zweven niet in de maat: breedte. Zonder R-kabel krijgt rechts hetzelfde als links (mono in, stereo uit). Firmware tp_mmb_stereo_tape_echo, mmb_dsp::StereoTapeEcho — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_digital_echo",
   "categoryId": "effect",
   "variant": "Vintage digital echo",
   "ports": [
    {
     "id": "time_cv",
     "name": "T+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fbk_cv",
     "name": "F+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mod_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "time",
     "label": "Time",
     "min": 0.005,
     "max": 1,
     "defaultValue": 0.3,
     "taper": "log",
     "size": "medium",
     "color": "#a3e635",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "ratio",
     "label": "Ratio",
     "min": 0.5,
     "max": 2,
     "defaultValue": 1,
     "size": "medium",
     "color": "#a3e635",
     "style": "generic",
     "unit": "×R",
     "ticks": {
      "every": 0.25,
      "highlight": [
       0.5,
       0.75,
       1,
       1.5,
       2
      ]
     }
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 1.1,
     "defaultValue": 0.4,
     "size": "medium",
     "color": "#a3e635",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cross",
     "label": "Cross",
     "min": 0,
     "max": 1.1,
     "defaultValue": 0,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mod_rate",
     "label": "Rate",
     "min": 0.05,
     "max": 10,
     "defaultValue": 0.8,
     "taper": "log",
     "size": "small",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "mod_depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bits",
     "label": "Bits",
     "min": 6,
     "max": 16,
     "defaultValue": 12,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "band",
     "label": "Band",
     "min": 1000,
     "max": 16000,
     "defaultValue": 8000,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Vintage digitale echo, naar de rack-delays van begin jaren tachtig: companderende converters van Bits breed (12 = de klassieke kasten; 8 wordt krakerig), een bandbreedte Band met de aliasing van toen (de interne samplefrequentie is 2 × Band — het gruis op de herhalingen), en een sinus-modulatie op de leeskop (Rate/Depth) voor chorus op de echo. Twee sporen met Ratio (R-tijd als factor van L) en Cross-feedback zoals het stereo bandecho. Zonder R-kabel krijgt rechts hetzelfde als links. Firmware tp_mmb_digital_echo, mmb_dsp::DigitalEcho — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_bbd_chorus",
   "categoryId": "effect",
   "variant": "BBD chorus / flanger",
   "ports": [
    {
     "id": "rate_cv",
     "name": "R+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "depth_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.02,
     "max": 12,
     "defaultValue": 0.6,
     "taper": "log",
     "size": "medium",
     "color": "#4ade80",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#4ade80",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "delay",
     "label": "Delay",
     "min": 0.5,
     "max": 40,
     "defaultValue": 8,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": -0.95,
     "max": 0.95,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "age",
     "label": "Age",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "BBD-chorus (emmertjesgeheugen, CE-1/Dimension-familie): een korte vertraging (Delay, 2–6 ms = flanger, 8–20 = chorus, 20+ = doubling) die door een driehoek-LFO (Rate/Depth) heen en weer wordt getrokken. Het karakter zit in de keten: laagdoorlaat aan in- en uitgang (Tone = bandbreedte van de emmertjes), een zachte compander en klokruis (Age). Twee sporen met Spread = LFO-fasehoek (0 = mono, 1 = tegenfase: het brede Dimension-beeld); Fbk negatief of positief voor de flanger-kant. Mono in geeft stereo uit; met een R-kabel blijft het echt stereo. Firmware tp_mmb_bbd_chorus, mmb_dsp::BbdChorus — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_ringmod",
   "categoryId": "effect",
   "variant": "Ring modulator",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "carrier",
     "name": "Car",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "freq",
     "label": "Freq",
     "min": 1,
     "max": 5000,
     "defaultValue": 440,
     "taper": "log",
     "size": "large",
     "color": "#e879f9",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Sqr"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Clean",
      "Diode"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "bias",
     "label": "Bias",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Ringmodulator: ingang × draaggolf. De draaggolf komt van de eigen oscillator (Freq × 2^V/Oct — stem hem met een MIDI-pitch voor harmonische klokken, of laat hem los voor metaal) of van de Car-ingang als daar een kabel in zit (dan is het een echte vierkwadrantvermenigvuldiger van twee signalen). Clean = het zuivere product: alleen som- en verschiltonen, de grondtonen verdwijnen. Diode = de vier-diodenring: Bias is de drempel van de dioden; de draaggolf en de ingang lekken door en er komen oneven harmonischen bij — het gemene van een echte ringmod. Firmware tp_mmb_ringmod, mmb_dsp::RingMod — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_octaver",
   "categoryId": "effect",
   "variant": "Analog octaver",
   "ports": [
    {
     "id": "oct1_cv",
     "name": "1+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "oct2_cv",
     "name": "2+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "up_cv",
     "name": "U+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "oct1",
     "label": "−1 oct",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#34d399",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "oct2",
     "label": "−2 oct",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#34d399",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "up",
     "label": "Up",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#34d399",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "dry",
     "label": "Dry",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "Analoge octaver naar de klassieke octaafpedalen (OC-2-familie): geen pitch-shifter maar een flip-flop. De ingang gaat door een tracking-laagdoorlaat, een comparator maakt er een blokgolf van en twee delers geven f/2 (−1 oct) en f/4 (−2 oct); die blokgolven ademen mee met de envelope van de ingang en worden afgerond door Tone (laag = bijna sinus, hoog = hoekig). Up is de Octavia-truc: dubbelfasig gelijkrichten voor een octaaf omhoog (rauw, fuzzy). De drie niveaus zijn moduleerbaar via de CV-ingangen (een kabel vervangt de knop): envelope of LFO op −1 oct geeft een ademende sub. Werkt het best op één noot tegelijk (bas, lead); op akkoorden gaat het net zo mooi mis als het origineel. Firmware tp_mmb_octaver, mmb_dsp::Octaver — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_harmonizer",
   "categoryId": "effect",
   "variant": "Pitch shifter / harmonizer",
   "ports": [
    {
     "id": "voct_a",
     "name": "A V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "voct_b",
     "name": "B V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "semi_a",
     "label": "Semi",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "medium",
     "color": "#c084fc",
     "style": "generic",
     "unit": "st",
     "step": 1,
     "ticks": {
      "every": 12,
      "highlight": [
       -12,
       0,
       12
      ]
     }
    },
    {
     "kind": "knob",
     "id": "cent_a",
     "label": "Cent",
     "min": -50,
     "max": 50,
     "defaultValue": 0,
     "size": "small",
     "color": "#c084fc",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "semi_b",
     "label": "Semi",
     "min": -24,
     "max": 24,
     "defaultValue": 7,
     "size": "medium",
     "color": "#c084fc",
     "style": "generic",
     "unit": "st",
     "step": 1,
     "ticks": {
      "every": 12,
      "highlight": [
       -12,
       0,
       12
      ]
     }
    },
    {
     "kind": "knob",
     "id": "cent_b",
     "label": "Cent",
     "min": -50,
     "max": 50,
     "defaultValue": 0,
     "size": "small",
     "color": "#c084fc",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "lvl_a",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lvl_b",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "window",
     "label": "Window",
     "min": 8,
     "max": 120,
     "defaultValue": 40,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 0.9,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "algo",
     "label": "Algo",
     "positions": [
      "Heads",
      "Grains"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "jitter",
     "label": "Jitter",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Pitch-shifter/harmonizer in de stijl van de rack-harmonizers: twee stemmen (A, B) die elk een vertragingslijn met twee kruisgefadete leeskoppen uitlezen — de koppen lopen met 2^(semi/12) door het geheugen. Semi in halve tonen (±24), Cent fijn, en A V/Oct / B V/Oct tellen erbij op (1 V = 12 st: een sequencer of de MIDI-pitch als interval). Window = korrel: klein (10–20 ms) volgt strak maar klinkt ietsje metaalachtig, groot (60–100) is zachter maar smeert aanslagen. Fbk stuurt het natte signaal terug de shifter in: +12 met feedback = shimmer, +7 = getrapte kwinten. Spread zet A links en B rechts. Algo kiest de methode: Heads = twee koppen met een pitch-synchroon venster (strak op één noot: lead, bas, zang; op akkoorden het vintage gewiebel), Grains = korrels van Window ms met een Hann-venster, vier tegelijk over elkaar (gladder op akkoorden en pads); Jitter maakt plek, lengte en moment van de korrels willekeurig, van glad naar een wolkje. Mono in, stereo uit. Firmware tp_mmb_harmonizer, mmb_dsp::Harmonizer — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_reverb",
   "categoryId": "effect",
   "variant": "Plate / spring reverb",
   "ports": [
    {
     "id": "size_cv",
     "name": "S+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "size",
     "label": "Size",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "large",
     "color": "#7dd3fc",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Plate",
      "Spring"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "damp",
     "label": "Damp",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "predelay",
     "label": "Pre",
     "min": 0,
     "max": 120,
     "defaultValue": 10,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "mod",
     "label": "Mod",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Twee galmen in één. Plate = de Dattorro-tank (input-diffusie, twee gemoduleerde all-passes, vier vertragingen in een acht, demping in de lus, zeven taps per kant): de gladde studioplaat; Size = decay, Damp = hoe snel het hoog wegsterft, Mod = de lichte zweving die de tank van metaal naar lucht brengt. Spring = twee veren (L/R iets anders): een vertragingslijn in feedback met acht dispersieve all-passes in de lus — laag komt later dan hoog, dat is de \"boing\" — een ingangs-bandpass en gerommel via Mod; Size = hoe lang de veer natrilt. Pre = predelay. Zonder R-kabel krijgt rechts hetzelfde als links. Firmware tp_mmb_reverb, mmb_dsp::Reverb — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_tremolo",
   "categoryId": "effect",
   "variant": "Tremolo pedal",
   "ports": [
    {
     "id": "rate_cv",
     "name": "R+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "depth_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.05,
     "max": 20,
     "defaultValue": 4.5,
     "taper": "log",
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Amp",
      "Opto",
      "Harm",
      "Pan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Sqr"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "shape",
     "label": "Shape",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Tremolo-pedaal in vier smaken. Amp = bias-tremolo van een buizenversterker (de dip is dieper dan de piek hoog is). Opto = fotocel-tremolo (blackface): de cel volgt de lamp snel omhoog en traag terug — het scheve, schokkerige golfje. Harm = brownface harmonic tremolo: laag en hoog (split bij 800 Hz) in tegenfase — half tremolo, half phaser. Pan = L en R in tegenfase: auto-panner. Wave sin/tri/sqr, Shape drukt de golf naar een blok toe, Level tot ×2 om het gemiddelde verlies te compenseren. Rate en Depth met CV (een LFO op Rate = ritmische versnelling). Mono in geeft stereo uit. Firmware tp_mmb_tremolo, mmb_dsp::Tremolo — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_stereo_phaser",
   "categoryId": "effect",
   "variant": "Stereo phaser",
   "ports": [
    {
     "id": "rate_cv",
     "name": "R+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "depth_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.02,
     "max": 8,
     "defaultValue": 0.4,
     "taper": "log",
     "size": "medium",
     "color": "#2dd4bf",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#2dd4bf",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 0.95,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Stereo phaser: twee keer de zes-traps all-pass-cascade van de mono phaser, met de LFO van rechts een Spread-deel verschoven — 0 = mono, 0,5 = een kwartslag (draaiend, breed), 1 = tegenfase (de notches van links zitten waar rechts open is). Fbk laat de notches resoneren. Mono in geeft stereo uit; met een R-kabel blijft het echt stereo. Firmware tp_mmb_stereo_phaser, mmb_dsp::StereoPhaser — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_vibe",
   "categoryId": "effect",
   "variant": "Vibe (univibe-style)",
   "ports": [
    {
     "id": "speed_cv",
     "name": "S+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "intensity_cv",
     "name": "I+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "speed",
     "label": "Speed",
     "min": 0.1,
     "max": 12,
     "defaultValue": 2,
     "taper": "log",
     "size": "medium",
     "color": "#fb923c",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "intensity",
     "label": "Intensity",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "medium",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Chorus",
      "Vibrato",
      "Light"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "lamp_age",
     "label": "Lamp age",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "volume",
     "label": "Volume",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "De univibe-familie (en moderne klonen als de Mojo Vibe): geen gewone phaser maar vier fasedraai-trappen met elk een andere condensator, zodat de notches wijd verspreid liggen, en vier lichtgevoelige weerstanden (LDR) rond één lampje dat door een LFO wordt aangestuurd. Het lampje reageert niet-lineair en de LDR’s worden snel laag-ohmig bij licht maar herstellen traag in het donker: de sweep is scheef en kloppend, hij ademt. Mode Chorus = droog + nat (het klassieke geluid, tussen chorus en phaser in); Vibrato = alleen nat (de fasedraaiing trekt aan de toonhoogte); Light = een zuivere vibrato met een vertragingslijn, zonder lampkarakter. Lamp age regelt hoeveel van dat oude-lamp-karakter erin zit (0 = nette sinus, 1 = een oud exemplaar). Speed en Intensity met CV — een expressiepedaal of envelope op Speed doet wat de voetpedaal-versie deed. Mono in geeft stereo uit. Firmware tp_mmb_vibe, mmb_dsp::Vibe — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_rotary",
   "categoryId": "effect",
   "variant": "Rotary speaker",
   "ports": [
    {
     "id": "fast",
     "name": "Fast",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "drive_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "speed",
     "label": "Speed",
     "positions": [
      "Slow",
      "Fast",
      "Brake"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "slow_rate",
     "label": "Slow",
     "min": 0.1,
     "max": 3,
     "defaultValue": 0.8,
     "taper": "log",
     "size": "medium",
     "color": "#f59e0b",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "fast_rate",
     "label": "Fast",
     "min": 2,
     "max": 10,
     "defaultValue": 6.7,
     "taper": "log",
     "size": "medium",
     "color": "#f59e0b",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "inertia",
     "label": "Inertia",
     "min": 0.25,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#ef4444",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "balance",
     "label": "Horn/Drum",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "noise",
     "label": "Noise",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Draaiende luidspreker in Leslie-stijl: een hoorn voor het hoog en een trommel voor het laag (scheiding bij 800 Hz), elk met een eigen motor en eigen traagheid. De hoorn versnelt in ongeveer een seconde, de zware trommel in een seconde of vier, en vertragen duurt langer dan versnellen — tijdens het omschakelen lopen ze uit elkaar, en dat opwinden hoor je. Slow en Fast zijn allebei instelbaar (zoals op een ELKA); de standaard 0,8 en 6,7 Hz zijn die van een klassiek exemplaar, en de trommel draait altijd iets langzamer dan de hoorn. Brake laat beide uitlopen tot stilstand. Inertia schaalt de traagheid (0,25 = vlug, 2 = extra zwaar). Wat je hoort: Doppler (de toonhoogte schommelt), richting (van voren luid en helder, van achteren zacht en dof), een reflectie van de kastwand, en de bijgeluiden — de hoorn suist hoorbaar als hij snel draait, de motor bromt, de trommel rommelt en het relais tikt bij het omschakelen (Noise). Drive is de buizenvoorversterker. Spread = hoek tussen de twee microfoons (0 = mono). De Fast-gate schakelt op de flank: omhoog = snel, omlaag = langzaam — hang er het mod-wiel of een voetschakelaar via MIDI aan; de schakelaar op het paneel werkt ernaast. Mono in (L+R), stereo uit. Firmware tp_mmb_rotary, mmb_dsp::Leslie — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_shimmer",
   "categoryId": "effect",
   "variant": "Shimmer reverb",
   "ports": [
    {
     "id": "shimmer_cv",
     "name": "Sh+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "size_cv",
     "name": "S+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "shimmer",
     "label": "Shimmer",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#a5b4fc",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "interval",
     "label": "Interval",
     "positions": [
      "+12",
      "+7",
      "+19",
      "+24",
      "−12"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "size",
     "label": "Size",
     "min": 0,
     "max": 1,
     "defaultValue": 0.75,
     "size": "small",
     "color": "#7dd3fc",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "damp",
     "label": "Damp",
     "min": 0,
     "max": 1,
     "defaultValue": 0.35,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "predelay",
     "label": "Pre",
     "min": 0,
     "max": 120,
     "defaultValue": 20,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "mod",
     "label": "Mod",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Shimmer reverb: de plaatgalm (dezelfde Dattorro-tank als REVERB) met in de lus een korrel-pitch-shifter. De natte galm wordt een Interval omhoog geschoven (+12 = een octaaf, het bekende geluid; +7 een kwint, +19 octaaf plus kwint, −12 een octaaf omlaag) en gaat terug de galm in. Elke ronde komt er zo een laagje een interval hoger bij: een glinsterende wolk boven wat je speelt. Shimmer = hoeveel er terug gaat (0 = gewone plaat), Tone = hoe helder de lus is (lager = warmer, minder gefluit), Size/Damp/Pre/Mod zoals bij de plaat. Een zachte begrenzer in de lus voorkomt dat hij wegloopt. Zonder R-kabel krijgt rechts hetzelfde als links. Firmware tp_mmb_shimmer, mmb_dsp::Shimmer — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_fet_comp",
   "categoryId": "effect",
   "variant": "FET compressor",
   "ports": [
    {
     "id": "gr",
     "name": "GR",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "input",
     "label": "Input",
     "min": -12,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "output",
     "label": "Output",
     "min": -24,
     "max": 12,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Attack",
     "min": 1,
     "max": 7,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       1,
       7
      ]
     }
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Release",
     "min": 1,
     "max": 7,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       1,
       7
      ]
     }
    },
    {
     "kind": "switch",
     "id": "ratio",
     "label": "Ratio",
     "positions": [
      "4:1",
      "8:1",
      "12:1",
      "20:1",
      "All"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "color",
     "label": "Color",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "FET-compressor die knipoogt naar de UREI/UA 1176. Geen threshold-knop: de drempel ligt vast en Input stuurt hem aan (meer Input = meer compressie), Output haalt het niveau terug. Attack en Release 1–7, 7 = snelst (800 → 20 µs en 1100 → 50 ms); op de snelste standen vervormt de bas, net als bij het echte apparaat. Ratio 4/8/12/20, en All = alle knoppen tegelijk ingedrukt: drempel lager, harder dan 20:1, de transiënt knalt erdoor en veel meer vervorming. De FET-vervorming groeit met het ingrijpen. Color regelt hoeveel FET-vervorming erbij komt (0 schoon, 1 zoals gemeten aan het apparaat, 2 dik; dubbel bemonsterd zodat het warm blijft). Mix = parallelle compressie, Bypass laat het signaal ongemoeid door (met/zonder vergelijken; zet dan Output zo dat beide kanten even luid zijn). GR = gain reduction als CV (1 = 20 dB). Stereo gekoppeld; alleen L aangesloten = mono op beide uitgangen. Firmware tp_mmb_fet_comp (mmb_dsp::FetComp); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_opto_comp",
   "categoryId": "effect",
   "variant": "Opto compressor",
   "ports": [
    {
     "id": "gr",
     "name": "GR",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "peak",
     "label": "Peak red.",
     "min": 0,
     "max": 100,
     "defaultValue": 40,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "gain",
     "label": "Gain",
     "min": -20,
     "max": 20,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Comp",
      "Limit"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "color",
     "label": "Color",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Opto-compressor die knipoogt naar de Teletronix LA-2A. Twee knoppen, zoals het apparaat: Peak Reduction zakt de drempel (0 tot −45 dBFS) en Gain is de uitgangsversterking; attack en release liggen vast. Het karakter zit in de lichtcel: de eerste helft van het ingrijpen is in ~60 ms weg, de rest sijpelt er in seconden uit, en hoe langer en harder hij heeft gewerkt hoe trager dat gaat (~0,8 tot 12 s). Daardoor ademt hij mee in plaats van te pompen. Mode: Comp (~3:1 met brede knie) of Limit. Color regelt de buisverzadiging (0 schoon, 1 zoals het apparaat, 2 dik; dubbel bemonsterd), Mix is parallelle compressie, Bypass laat het signaal ongemoeid door. GR = gain reduction als CV (1 = 20 dB). Stereo gekoppeld; alleen L aangesloten = mono op beide uitgangen. Firmware tp_mmb_opto_comp (mmb_dsp::OptoComp); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_bus_comp",
   "categoryId": "effect",
   "variant": "VCA bus compressor",
   "ports": [
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "gr",
     "name": "GR",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "threshold",
     "label": "Threshold",
     "min": -60,
     "max": 0,
     "defaultValue": -18,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "makeup",
     "label": "Makeup",
     "min": 0,
     "max": 20,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "ratio",
     "label": "Ratio",
     "positions": [
      "2:1",
      "4:1",
      "10:1"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "attack",
     "label": "Attack",
     "positions": [
      "0.1",
      "0.3",
      "1",
      "3",
      "10",
      "30"
     ],
     "defaultIndex": 5
    },
    {
     "kind": "switch",
     "id": "release",
     "label": "Release",
     "positions": [
      "0.1",
      "0.3",
      "0.6",
      "1.2",
      "Auto"
     ],
     "defaultIndex": 4
    },
    {
     "kind": "switch",
     "id": "sc_hpf",
     "label": "SC HPF",
     "positions": [
      "Uit",
      "60",
      "100",
      "150"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "VCA-buscompressor die knipoogt naar de SSL G-bus: strak en schoon, de lijm op een mix. Vaste standen zoals het apparaat: Attack 0,1 tot 30 ms, Release 0,1 tot 1,2 s en Auto, Ratio 2/4/10. De klassieke busstand: attack 30, release Auto, ratio 2 of 4 — de aanslag komt erdoor en de mix pompt mee met de maat. Auto = een snelle envelope (100 ms) voor losse pieken en een trage (1,2 s) die alleen bij aanhoudend luid materiaal groeit; de grootste wint. SC HPF (niet op het origineel) haalt laag uit de detector zodat de bas hem minder laat pompen. Makeup, Mix (parallel), Bypass, GR als CV. Stereo gekoppeld. Firmware tp_mmb_bus_comp (mmb_dsp::BusComp); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_varimu_comp",
   "categoryId": "effect",
   "variant": "Vari-mu compressor",
   "ports": [
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "gr",
     "name": "GR",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "input",
     "label": "Input",
     "min": -12,
     "max": 24,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "threshold",
     "label": "Threshold",
     "min": -40,
     "max": 0,
     "defaultValue": -18,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "output",
     "label": "Output",
     "min": -24,
     "max": 12,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "time",
     "label": "Time",
     "positions": [
      "1",
      "2",
      "3",
      "4",
      "5",
      "6"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "LR",
      "M/S"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "color",
     "label": "Color",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Variable-mu buizencompressor die knipoogt naar de Fairchild 660/670: dik, warm, lijm. Er is geen vaste ratio: een paar dB boven de drempel rond 2:1, 20 dB erboven ~12:1 — zacht in, stevig aan de top. Time 1–6 zoals het apparaat (attack 0,2–0,8 ms, release 0,3 / 0,8 / 2 / 5 s); 5 en 6 passen zich aan het programma aan (een trage envelope die alleen bij aanhoudend materiaal groeit, loslaten in 10 of 25 s). Mode LR regelt links en rechts samen, M/S (lateral/vertical, zoals de 670) midden en zijkant apart: het midden stevig zonder de ruimte in te klemmen. Color = buisvervorming die meegroeit met het ingrijpen (dubbel bemonsterd). Input, Threshold, Output, Mix, Bypass, GR als CV. Firmware tp_mmb_varimu_comp (mmb_dsp::VariMuComp); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_program_eq",
   "categoryId": "effect",
   "variant": "Program EQ",
   "ports": [
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "low_freq",
     "label": "Low Hz",
     "positions": [
      "20",
      "30",
      "60",
      "100"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "low_boost",
     "label": "Boost",
     "min": 0,
     "max": 10,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       10
      ]
     }
    },
    {
     "kind": "knob",
     "id": "low_atten",
     "label": "Atten",
     "min": 0,
     "max": 10,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       10
      ]
     }
    },
    {
     "kind": "knob",
     "id": "output",
     "label": "Output",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "high_freq",
     "label": "High kHz",
     "positions": [
      "3",
      "4",
      "5",
      "8",
      "10",
      "12",
      "16"
     ],
     "defaultIndex": 4
    },
    {
     "kind": "knob",
     "id": "high_boost",
     "label": "Boost",
     "min": 0,
     "max": 10,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       10
      ]
     }
    },
    {
     "kind": "knob",
     "id": "bandwidth",
     "label": "Bandwidth",
     "min": 0,
     "max": 10,
     "defaultValue": 5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       10
      ]
     }
    },
    {
     "kind": "knob",
     "id": "color",
     "label": "Color",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "atten_freq",
     "label": "Atten kHz",
     "positions": [
      "5",
      "10",
      "20"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "high_atten",
     "label": "Atten",
     "min": 0,
     "max": 10,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       10
      ]
     }
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Passieve program-EQ die knipoogt naar de Pultec EQP-1A. Laag (20/30/60/100 Hz): Boost tot +13,5 dB (een shelf met een lichte bult rond de frequentie) en een aparte Atten tot −10 dB die hoger begint (~3×) en zachter is. Draai je beide open, dan krijg je de beroemde Pultec-truc: een stevige boost onderin en een dip net erboven — vol maar niet modderig (op 60 Hz, beide op 10: +4,6 dB op 30 Hz, −6,8 dB rond 120 Hz). Hoog: een Boost-bell op 3–16 kHz (tot +16 dB) met Bandwidth van scherp naar breed, en een aparte Atten (shelf op 5/10/20 kHz, tot −16 dB). Buistrap met Color (0 = schoon), Output om het niveau gelijk te trekken bij een A/B met Bypass. Knoppen 0–10 zoals het apparaat; draaien glijdt in ~5 ms zodat het niet ritst. Stereo. Firmware tp_mmb_program_eq (mmb_dsp::ProgramEq); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_diode_comp",
   "categoryId": "effect",
   "variant": "Diode bridge compressor",
   "ports": [
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "gr",
     "name": "GR",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "threshold",
     "label": "Threshold",
     "min": -50,
     "max": 0,
     "defaultValue": -20,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "makeup",
     "label": "Makeup",
     "min": 0,
     "max": 20,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "ratio",
     "label": "Ratio",
     "positions": [
      "1.5",
      "2",
      "3",
      "4",
      "6"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "attack",
     "label": "Attack",
     "positions": [
      "Fast",
      "Slow"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "release",
     "label": "Release",
     "positions": [
      "0.1",
      "0.4",
      "0.8",
      "1.5",
      "A1",
      "A2"
     ],
     "defaultIndex": 4
    },
    {
     "kind": "knob",
     "id": "color",
     "label": "Color",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Diodebrug-compressor die knipoogt naar de Neve 33609 / 2254: dik en gekleurd. Diodes zijn symmetrisch, dus vooral oneven harmonischen (3e, 5e) — anders dan de buis (even) en de FET (gemengd) — en die groeien hard mee met het ingrijpen: rustig is bijna schoon, flink ingrijpen wordt dik en Brits. Ratio 1,5 / 2 / 3 / 4 / 6 met een zachte knie, Attack Fast (2 ms) of Slow (10 ms), Release 0,1 / 0,4 / 0,8 / 1,5 s en A1/A2 (programma-afhankelijk: een snelle envelope van 40 of 150 ms naast een trage die alleen bij aanhoudend materiaal groeit en in 5 s loslaat). Color schaalt de diodevervorming (dubbel bemonsterd, alleen het vervormingsdeel), Threshold, Makeup, Mix, Bypass, GR als CV. Stereo gekoppeld. Firmware tp_mmb_diode_comp (mmb_dsp::DiodeComp); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_console_eq",
   "categoryId": "effect",
   "variant": "Console EQ",
   "ports": [
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "hpf",
     "label": "HPF",
     "positions": [
      "Uit",
      "50",
      "80",
      "160",
      "300"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "high_gain",
     "label": "High 12k",
     "min": -16,
     "max": 16,
     "defaultValue": 0,
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "output",
     "label": "Output",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "mid_freq",
     "label": "Mid Hz",
     "positions": [
      "360",
      "700",
      "1.6k",
      "3.2k",
      "4.8k",
      "7.2k"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "mid_gain",
     "label": "Mid",
     "min": -18,
     "max": 18,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "color",
     "label": "Color",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f5a623",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "low_freq",
     "label": "Low Hz",
     "positions": [
      "35",
      "60",
      "110",
      "220"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "low_gain",
     "label": "Low",
     "min": -16,
     "max": 16,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f97316",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Console-EQ die knipoogt naar de Britse klasse-A kanaal-EQ (Neve 1073). Vaste keuzefrequenties, zoals het apparaat: HPF uit/50/80/160/300 Hz met 18 dB/oct; Low shelf op 35/60/110/220 Hz (±16 dB) met een lichte bult bij de knik — de inductor — waardoor +6 dB laag stevig klinkt en niet wollig; Mid bell op 360 Hz–7,2 kHz (±18 dB) met een matige Q die licht meeloopt met de gain (kleine ingrepen breed, grote gerichter); High shelf op 12 kHz (±16 dB). Color = klasse-A/transformatorkleur (asymmetrische verzadiging rond −12 dBFS, dubbel bemonsterd; 0 schoon, 2 dik). Output om het niveau gelijk te trekken bij een A/B met Bypass. Draaien glijdt in ~5 ms. Stereo. Firmware tp_mmb_console_eq (mmb_dsp::ConsoleEq); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_para_eq",
   "categoryId": "effect",
   "variant": "Parametric EQ",
   "ports": [
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "lf_freq",
     "label": "Freq",
     "min": 30,
     "max": 450,
     "defaultValue": 100,
     "taper": "log",
     "size": "small",
     "color": "#f97316",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "lf_gain",
     "label": "Gain",
     "min": -15,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "lf_shelf",
     "label": "Shape",
     "positions": [
      "Bell",
      "Shelf"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "lmf_freq",
     "label": "Freq",
     "min": 200,
     "max": 2000,
     "defaultValue": 600,
     "taper": "log",
     "size": "small",
     "color": "#f5a623",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "lmf_gain",
     "label": "Gain",
     "min": -15,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "lmf_q",
     "label": "Q",
     "min": 0.4,
     "max": 4,
     "defaultValue": 1,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "hmf_freq",
     "label": "Freq",
     "min": 600,
     "max": 7000,
     "defaultValue": 2500,
     "taper": "log",
     "size": "small",
     "color": "#f5a623",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "hmf_gain",
     "label": "Gain",
     "min": -15,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "hmf_q",
     "label": "Q",
     "min": 0.4,
     "max": 4,
     "defaultValue": 1,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "hf_freq",
     "label": "Freq",
     "min": 1500,
     "max": 16000,
     "defaultValue": 8000,
     "taper": "log",
     "size": "small",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "hf_gain",
     "label": "Gain",
     "min": -15,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5a623",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "hf_shelf",
     "label": "Shape",
     "positions": [
      "Bell",
      "Shelf"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "hpf",
     "label": "HPF",
     "min": 16,
     "max": 400,
     "defaultValue": 16,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "lpf",
     "label": "LPF",
     "min": 3000,
     "max": 20000,
     "defaultValue": 20000,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "switch",
     "id": "prop_q",
     "label": "Prop.Q",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "output",
     "label": "Output",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "bypass",
     "label": "Bypass",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    }
   ],
   "notes": "Vierbands parametrische EQ die knipoogt naar de Britse mixer-EQ (SSL E/G): strak, schoon, het werkpaard. LF (30–450 Hz) en HF (1,5–16 kHz) schakelbaar bell of shelf; LMF (200 Hz–2 kHz) en HMF (600 Hz–7 kHz) met eigen Q (0,4–4); alle ±15 dB. HPF 12 dB/oct (helemaal links = uit) en LPF (helemaal rechts = uit). Prop.Q is de Amerikaanse stand (API 550): de Q loopt mee met de gain — een kleine ingreep is breed, een grote gericht. Geen verzadiging; Output om het niveau gelijk te trekken bij een A/B met Bypass. Alle knoppen glijden in ~5 ms. Stereo. Firmware tp_mmb_para_eq (mmb_dsp::ParamEq); dezelfde kern als wasm in de simulator.",
   "internal": true
  },
  {
   "id": "tp_mmb_sampler",
   "categoryId": "vco",
   "variant": "Multisampler",
   "ports": [
    {
     "id": "bend",
     "name": "Bend",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_3",
     "name": "3",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_4",
     "name": "4",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "env_1",
     "name": "1",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_2",
     "name": "2",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_3",
     "name": "3",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_4",
     "name": "4",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_5",
     "name": "5",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_6",
     "name": "6",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_7",
     "name": "7",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "env_8",
     "name": "8",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "bank",
     "label": "Bank",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       15
      ]
     }
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "start",
     "label": "Start",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Att",
     "min": 0.2,
     "max": 500,
     "defaultValue": 1.5,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "env_rel",
     "label": "Env rel",
     "min": 10,
     "max": 2000,
     "defaultValue": 120,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "switch",
     "id": "filter",
     "label": "Filter",
     "positions": [
      "Uit",
      "SVF",
      "MS-20"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 18000,
     "defaultValue": 2000,
     "taper": "log",
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "q",
     "label": "Res",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "fmode",
     "label": "Mode",
     "positions": [
      "LP",
      "HP",
      "BP"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0.1,
     "max": 10,
     "defaultValue": 1,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cv_amt",
     "label": "CV amt",
     "min": 0,
     "max": 8,
     "defaultValue": 4,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "knob",
     "id": "env_sens",
     "label": "Sens",
     "min": -12,
     "max": 36,
     "defaultValue": 12,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "switch",
     "id": "limit",
     "label": "Limit",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "era",
     "label": "Era",
     "positions": [
      "Clean",
      "CMI"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "clock",
     "label": "Clock",
     "min": 8000,
     "max": 32000,
     "defaultValue": 24000,
     "taper": "log",
     "size": "small",
     "color": "#fbbf24",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "bits",
     "label": "Bits",
     "min": 6,
     "max": 12,
     "defaultValue": 8,
     "size": "small",
     "color": "#fbbf24",
     "style": "generic",
     "step": 1
    }
   ],
   "notes": "Multisample-speler als multi-module: acht stem-cellen (voct_k/gate_k/vel_k) die één keymap-bank delen, elk met een filter in de stem (Filter: uit/SVF/MS-20 — dezelfde kernels als de losse VCF en MS-20) dat via cutoff_k gestuurd wordt, en een envelope-follower per stem op env_k (Sens tilt die met decibels op; zonder lift haalt een sample amper 0,2 en blijft de wah een kiertje). Auto-wah = env_k → cutoff_k. Een keymap met key- én velocity-zones kiest per noot en aanslag het juiste sample; V/Oct transponeert vanaf de root-noot van die zone; Bend (gedeelde CV-ingang, V/Oct) komt daar bij alle cellen bovenop — MidiIn.Bend → Bend en de pitch-wheel buigt alle stemmen mee (of een LFO voor vibrato). 1–4 kanalen (mono komt op L+R, stereo op L/R, quad op alle vier), gemengd over alle cellen. Limit (standaard aan): limiter + zachte begrenzing op die som, zodat een zingende MS-20 op een paar stemmen niet digitaal clipt; Uit = hard afknippen op ±1 (het gruis). Loop-modes: geen, one-shot, continu, of tot note-off. Polyfoon spelen = een PolyGroup over de cellen (Poly ▾ → Sampler ×8): MIDI-in verdeelt de noten, de sampler doet niets slims. Banken maak je met de 🎹 Multisample-import; die schrijft een .mmbs die je naar /mmb/banks/NN.mmbs op de SD kopieert — Bank kiest NN. Era CMI: zoals de Fairlight CMI — elke stem leest met een eigen klok (Clock: de samplerate waarop de bank \"opgenomen\" was, 8–32 kHz), zonder interpolatie (de spiegelingen lopen mee met de toon), op Bits (standaard 8), door een filter dat de toon volgt; hoog spelen klinkt korrelig, laag dof. Clean = zoals altijd. In de simulator draait dezelfde kern (mmb_dsp::SamplePlayer) als wasm. Firmware tp_mmb_sampler.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Stem",
     "count": 8,
     "portIds": [
      "voct",
      "gate",
      "vel",
      "cutoff",
      "env"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_zang",
   "categoryId": "vco",
   "variant": "Zingende stemmen",
   "ports": [
    {
     "id": "syl_cv",
     "name": "Syl",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "next",
     "name": "Next",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "formant_cv",
     "name": "Frm",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "bend",
     "name": "Bend",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "syl_out",
     "name": "Syl",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "voct_1",
     "name": "1",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "2",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "3",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "4",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "5",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "6",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "7",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "8",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "bank",
     "label": "Bank",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       15
      ]
     }
    },
    {
     "kind": "knob",
     "id": "syl",
     "label": "Start",
     "min": 0,
     "max": 255,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "display",
     "id": "sylDisp",
     "digits": 3,
     "style": "led",
     "bindTo": "__currentSyl",
     "format": "int"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Vast",
      "Door",
      "Door+terug"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "speed",
     "label": "Speed",
     "min": 0.25,
     "max": 4,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "formant",
     "label": "Formant",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "medium",
     "color": "#e879f9",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Att",
     "min": 0,
     "max": 500,
     "defaultValue": 5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Rel",
     "min": 5,
     "max": 3000,
     "defaultValue": 250,
     "taper": "log",
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    }
   ],
   "notes": "Zingende stemmen. Een lyricbank bevat ingesproken lettergrepen; ZANG zingt ze op de noot die je speelt, met de klinkerkleur van de opname (PSOLA: korte stukjes van twee stemperioden, opnieuw aan elkaar geplakt op de gevraagde toonhoogte). Zolang de gate open is blijft de klinker klinken; bij loslaten speelt de slotmedeklinker uit. Start = de lettergreep waar het liedje begint (0 = de eerste). Mode: Vast = altijd die ene lettergreep (de knop kiest welke); Door = elke aanslag de volgende, rond naar het begin (een akkoord deelt er één); Door+terug = idem, maar na 2 s stilte begint het liedje opnieuw bij Start. Het display toont de lettergreep die aan de beurt is. Bank kiest de lyricbank: in de simulator het nummer waaronder 🎤 Zang hem zette, op de Teensy /mmb/lyrics/NN.mmbl. Next en Reset doen hetzelfde met een gate, Syl (CV 0..1) kiest rechtstreeks. Formant schuift de klinkerkleur los van de toonhoogte: omhoog = kinderstem, omlaag = reus. Speed rekt de medeklinkers en overgangen. Bereik: ruwweg een octaaf rond de gesproken toonhoogte klinkt natuurlijk. De bank maak je met 🎤 Zang (opnemen of wav, lettergrepen intypen); op de Teensy staat hij in /mmb/lyrics/NN.mmbl en kiest Bank het nummer. Acht stem-cellen als de sampler: polyfoon = een PolyGroup over de cellen (Poly ▾ → Zingende stem). Firmware tp_mmb_zang.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Stem",
     "count": 8,
     "portIds": [
      "voct",
      "gate",
      "vel"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_sid",
   "categoryId": "vco",
   "variant": "SID 6581/8580 (emulatie)",
   "ports": [
    {
     "id": "voct_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_9",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_10",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_11",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_12",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_9",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_10",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_11",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_12",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "cutoff_cv",
     "name": "Cut+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "ext_in",
     "name": "Ext 1",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "ext_2",
     "name": "2",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "ext_3",
     "name": "3",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "ext_4",
     "name": "4",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "sid_1",
     "name": "S1",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "sid_2",
     "name": "S2",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "sid_3",
     "name": "S3",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "sid_4",
     "name": "S4",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "bend",
     "name": "Bend",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "pw_cv",
     "name": "PW+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Mono",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "tri",
     "label": "Tri",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "saw",
     "label": "Saw",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "pulse",
     "label": "Pulse",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "noise",
     "label": "Noise",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "pw",
     "label": "PW",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "combo",
     "label": "Combo",
     "min": 0,
     "max": 10,
     "defaultValue": 7,
     "size": "medium",
     "color": "#c4b5fd",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       4,
       7
      ],
      "labels": {
       "4": "8580",
       "7": "6581"
      }
     }
    },
    {
     "kind": "switch",
     "id": "ring",
     "label": "Ring",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "sync",
     "label": "Sync",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "A",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "D",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "sustain",
     "label": "S",
     "min": 0,
     "max": 15,
     "defaultValue": 10,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "R",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "volume",
     "label": "Vol",
     "min": 0,
     "max": 15,
     "defaultValue": 15,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "filt",
     "label": "Filt",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "model",
     "label": "Chip",
     "positions": [
      "6581",
      "8580"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 0,
     "max": 2047,
     "defaultValue": 1024,
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Res",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "curve",
     "label": "Curve",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "lp",
     "label": "LP",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "bp",
     "label": "BP",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "hp",
     "label": "HP",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "chips",
     "label": "SIDs",
     "min": 1,
     "max": 4,
     "defaultValue": 1,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       1,
       2,
       3,
       4
      ]
     }
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "De geluidschip van de Commodore 64 (MOS 6581/8580), als eigen emulatie op registerniveau — geen reSID-code. Drie stemmen, elk met een 24-bit oscillator en vier golfvormen: Tri, Saw, Pulse (breedte met PW, ook via PW+) en Noise (een 23-bit schuifregister). Zet je er meer dan één aan, dan krijg je een combined waveform: de golfvormen hangen dan aan dezelfde lijnen naar de DAC en een 0 trekt harder dan een 1, dus het lijkt op een AND, maar zwakker. Combo regelt hoe sterk: 0 = zuivere AND, 8580 en 6581 zijn gemarkeerd (op de 6581 wordt tri+saw dun en zacht), 10 gaat nog verder. Een eigen model, op het oor afgesteld, niet gemeten aan een chip. Noise in een combinatie sterft uit, zoals op de chip: de uitgang schrijft terug in het schuifregister. Wissel je daarna van golfvorm, dan zet de module het schuifregister terug met de test-bit (zoals C64-spelers dat deden). Ring en Sync koppelen elke stem aan de vorige (3 → 1 → 2 → 3): Ring vervangt de driehoek door een ringmodulatie met die stem, Sync zet de oscillator terug bij elke periode van die stem. De ADSR staat in registerwaarden 0..15 zoals op de chip (attack 2 ms tot 8 s, decay en release 6 ms tot 24 s, sustain in 16 stappen) en heeft de beroemde ADSR-bug: wissel je naar een snellere rate terwijl de interne teller al verder staat, dan wacht de envelope tot die rond is (tot ~33 ms). Vol is het 4-bit mastervolume van de chip. Multi-module: stem-cellen (voct_k/gate_k) die MIDI-in over de chips verdeelt — polyfoon spelen = een PolyGroup over de cellen (Poly ▾ → SID). SIDs (1–4) zet hoeveel chips meedoen: cel 1–3 = chip 1, 4–6 = chip 2, enzovoort, elk met een eigen filter (zoals een dual- of triple-SID); een stille chip kost vrijwel niets. Uitgangen: Mono (de som, met een limiter), L/R (de chips over het stereobeeld verdeeld met Spread, zoals de stereo-SID-tunes) en S1–S4 (elke chip apart, om zelf te mengen en te pannen). EXT IN per chip: Ext 1–4 gaan elk door het filter van hun eigen chip — een stereobron op Ext 1 en 2 (met SIDs = 2) of quad op 1–4, en met Spread komt die ook weer over het stereobeeld uit. Filter (8580-model): een 2-polig state-variable filter (12 dB/oct) met LP, BP en HP als losse schakelaars — combineerbaar zoals op de chip, LP+HP geeft een notch; zonder mode is wat door het filter gaat stil. Cutoff is het 11-bit register (0..2047, bij de 8580 vrijwel lineair van ~30 Hz tot ~12 kHz), Res het 4-bit register (8580 tot Q ≈ 4, 6581 tot ≈ 2, geen zelfoscillatie); beide op het oor, niet gemeten. Filt stuurt de drie stemmen door het filter. Cut+ telt op bij de cutoff (0..1 = het hele bereik, een envelope geeft de klassieke SID-bas). Ext is EXT IN: elk ander signaal gaat altijd door het SID-filter. Chip kiest het model van filter en uitgang. 8580: het nette filter hierboven. 6581 (standaard): de cutoff loopt als een S-curve (onderaan blijft hij rond ~220 Hz hangen, in het midden stijgt hij steil tot ~16 kHz) — Curve schuift dat midden, want geen twee 6581-exemplaren zijn gelijk (0 = helder exemplaar, 1 = donker) — de resonantie is zwakker en gromt in plaats van te piepen, een hard signaal vervormt, en elke stem geeft bij het aanslaan en loslaten een doffe tik (de DAC staat niet rond nul); ook een volumewijziging tikt, de truc waarmee C64-spellen samples speelden. Alles op het oor, niet gemeten. Firmware tp_mmb_sid, mmb_dsp::SidSynth — in de simulator draait dezelfde code als wasm.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Stem",
     "count": 12,
     "portIds": [
      "voct",
      "gate"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_sid3",
   "categoryId": "vco",
   "variant": "SID 3-osc (emulatie, per stem)",
   "ports": [
    {
     "id": "voct_1",
     "name": "V/Oct 1",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "voct_2",
     "name": "2",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "voct_3",
     "name": "3",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate_1",
     "name": "Gate 1",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "gate_2",
     "name": "2",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "gate_3",
     "name": "3",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "bend",
     "name": "Bend",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "pw_cv",
     "name": "PW+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "cutoff_cv",
     "name": "Cut+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "ext_in",
     "name": "Ext",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "tri_1",
     "label": "Tri",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "saw_1",
     "label": "Saw",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "pulse_1",
     "label": "Pulse",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "noise_1",
     "label": "Noise",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "pw_1",
     "label": "PW",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "ring_1",
     "label": "Ring",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "sync_1",
     "label": "Sync",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "attack_1",
     "label": "A",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "decay_1",
     "label": "D",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "sustain_1",
     "label": "S",
     "min": 0,
     "max": 15,
     "defaultValue": 10,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "release_1",
     "label": "R",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "coarse_1",
     "label": "Coarse",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine_1",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "switch",
     "id": "filt_1",
     "label": "Filt",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "tri_2",
     "label": "Tri",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "saw_2",
     "label": "Saw",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "pulse_2",
     "label": "Pulse",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "noise_2",
     "label": "Noise",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "pw_2",
     "label": "PW",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "ring_2",
     "label": "Ring",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "sync_2",
     "label": "Sync",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "attack_2",
     "label": "A",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "decay_2",
     "label": "D",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "sustain_2",
     "label": "S",
     "min": 0,
     "max": 15,
     "defaultValue": 10,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "release_2",
     "label": "R",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "coarse_2",
     "label": "Coarse",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine_2",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "switch",
     "id": "filt_2",
     "label": "Filt",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "tri_3",
     "label": "Tri",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "saw_3",
     "label": "Saw",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "pulse_3",
     "label": "Pulse",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "noise_3",
     "label": "Noise",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "pw_3",
     "label": "PW",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "ring_3",
     "label": "Ring",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "sync_3",
     "label": "Sync",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "attack_3",
     "label": "A",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "decay_3",
     "label": "D",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "sustain_3",
     "label": "S",
     "min": 0,
     "max": 15,
     "defaultValue": 10,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "release_3",
     "label": "R",
     "min": 0,
     "max": 15,
     "defaultValue": 9,
     "size": "small",
     "color": "#c4b5fd",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "coarse_3",
     "label": "Coarse",
     "min": -24,
     "max": 24,
     "defaultValue": -12,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine_3",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "switch",
     "id": "filt_3",
     "label": "Filt",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "stack",
     "label": "Stack",
     "positions": [
      "Split",
      "Stack"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "combo",
     "label": "Combo",
     "min": 0,
     "max": 10,
     "defaultValue": 7,
     "size": "medium",
     "color": "#c4b5fd",
     "style": "generic",
     "ticks": {
      "every": 1,
      "highlight": [
       4,
       7
      ],
      "labels": {
       "4": "8580",
       "7": "6581"
      }
     }
    },
    {
     "kind": "knob",
     "id": "volume",
     "label": "Vol",
     "min": 0,
     "max": 15,
     "defaultValue": 15,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 0,
     "max": 2047,
     "defaultValue": 1024,
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Res",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "switch",
     "id": "lp",
     "label": "LP",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "switch",
     "id": "bp",
     "label": "BP",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "hp",
     "label": "HP",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "model",
     "label": "Chip",
     "positions": [
      "6581",
      "8580"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "curve",
     "label": "Curve",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "De SID van de Commodore 64 met instellingen per stem — dezelfde eigen emulatie als de SID-module, een ander paneel. Elke rij is één stem: golfvormen (Tri, Saw, Pulse, Noise; samen = combined waveform), PW, Ring en Sync (gekoppeld aan de vorige stem: 3 → 1 → 2 → 3), een ADSR in registerwaarden 0..15, Coarse en Fine, en Filt (deze stem door het filter). Stack (standaard): V/Oct 1 en Gate 1 sturen alle drie de stemmen, elk verstemd met zijn eigen Coarse/Fine — drie oscillatoren op één noot, zoals veel C64-leads en -bassen gemaakt zijn; ring en sync hebben dan een vast interval (probeer stem 2 met Sync aan en Coarse +7, of Ring op een driehoek). Split: elke stem een eigen V/Oct en Gate, zoals in een C64-tune (bas, melodie en drum op één chip). Gedeeld: Combo (0 = AND, 8580 en 6581 gemarkeerd), Vol (4-bit), Level, en het filter (Cutoff 0..2047, Res 0..15, LP/BP/HP combineerbaar, Chip 6581/8580, Curve voor de spreiding van de 6581), met Cut+ (0..1 = het hele bereik), PW+ (bij alle stemmen) en Ext (EXT IN door het filter). Polyfoon spelen: zet meerdere SID 3-osc's in een PolyGroup (Poly ▾ → SID 3-osc ×4): elke noot krijgt een eigen chip met eigen filter, zoals een stapel SID's. Standaardstemmen: pulse; saw 8 cent hoger; driehoek een octaaf lager. Firmware tp_mmb_sid3, mmb_dsp::SidSynth — in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_phaser",
   "categoryId": "effect",
   "variant": "Phaser",
   "ports": [
    {
     "id": "rate_cv",
     "name": "R+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "depth_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.1,
     "max": 8,
     "defaultValue": 0.5,
     "taper": "log",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 0.95,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "6-traps all-pass phaser (custom AudioStream op de Teensy). CV op rate en depth. Klassieke sweep-modulatie; mooi achter een VCF of als send.",
   "internal": true
  },
  {
   "id": "tp_mmb_stereo_vca",
   "categoryId": "effect",
   "variant": "Stereo VCA / panner",
   "ports": [
    {
     "id": "vol_cv",
     "name": "V+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "pan_cv",
     "name": "P+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "vol",
     "label": "Vol",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Stereo-VCA/panner: één audio-in waaiert naar L+R. 'vol' regelt het totale niveau, 'pan' de balans (equal-power). Pan-CV: 0 = midden, −1 = hard links, +1 = hard rechts. Firmware tp_mmb_stereo_vca (FW-AU-1).",
   "internal": true
  },
  {
   "id": "tp_mmb_fm_vco",
   "categoryId": "vco",
   "variant": "FM VCO (2-op)",
   "ports": [
    {
     "id": "voct",
     "name": "1V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "tune",
     "name": "Tune",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fm",
     "name": "FM",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Sin",
      "Tri",
      "Saw",
      "Sqr"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "fm_amt",
     "label": "FM",
     "min": 0,
     "max": 4,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Twee-operator FM-oscillator (AudioSynthWaveformModulated). De audio-FM-ingang moduleert de carrier-frequentie; 'fm_amt' is de FM-diepte in octaven. Voed FM met een tweede VCO (de modulator) voor klassieke DX-achtige timbres. Firmware tp_mmb_fm_vco (FW-AU-4).",
   "internal": true
  },
  {
   "id": "tp_mmb_comb",
   "categoryId": "effect",
   "variant": "Comb / resonator",
   "ports": [
    {
     "id": "freq_cv",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fbk_cv",
     "name": "F+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "M+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Tune",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "feedback",
     "label": "Fbk",
     "min": 0,
     "max": 0.99,
     "defaultValue": 0.9,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Comb-filter / resonator: een getunede feedback-delay (0.2–50 ms). De V/Oct-ingang stemt de toonhoogte (0V = C4); 'coarse' is een semitone-offset. Bij hoge feedback wordt het een gestemde resonator — voed het met ruis of een puls voor plucked/blown timbres. Firmware tp_mmb_comb (FW-AU-3).",
   "internal": true
  },
  {
   "id": "tp_mmb_wt_vco",
   "categoryId": "vco",
   "variant": "Wavetable VCO",
   "ports": [
    {
     "id": "voct",
     "name": "1V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "tune",
     "name": "Tune",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "bank",
     "label": "Bank",
     "positions": [
      "Saw",
      "Sqr",
      "Tri",
      "Organ",
      "Pulse",
      "Vocal"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Wavetable-oscillator met 6 banks (saw, square, triangle, orgel, 25%-pulse, vocaal/formant) — additief opgebouwd op de Teensy via arbitraryWaveform. 'bank' kiest de golfvorm; coarse/fine zijn pitch-offsets t.o.v. V/Oct. Firmware tp_mmb_wt_vco (FW-AU-5).",
   "internal": true
  },
  {
   "id": "tp_mmb_draw_vco",
   "categoryId": "vco",
   "variant": "Draw-waveshape VCO",
   "ports": [
    {
     "id": "voct",
     "name": "1V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "tune",
     "name": "Tune",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Teken-golfvorm-oscillator: de editor stuurt een single-cycle tabel via het 'wavetable'-serieframe (FW-LIVE-1) en de firmware resamplet naar 256 punten. De zwarte balk is de teken-zone (UI volgt). coarse/fine zijn pitch-offsets t.o.v. V/Oct. Firmware tp_mmb_draw_vco (FW-AU-6).",
   "internal": true
  },
  {
   "id": "tp_mmb_stk_sound",
   "categoryId": "vco",
   "variant": "STK Sound (multi)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "strength",
     "name": "Str+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "timbre",
     "name": "Tim+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "modulation",
     "name": "Mod+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "sound",
     "label": "Sound",
     "positions": [
      "Plucked",
      "Clarinet",
      "Bowed",
      "Flute",
      "Brass",
      "Saxophony",
      "BlowHole",
      "BandedWG",
      "Mandolin"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "timbre",
     "label": "Timbre",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "modulation",
     "label": "Mod",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "strength",
     "label": "Str",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Multi-sound physical-modelling voice (firmware tp_mmb_stk_sound, FW-AU-10). De sound-selector kiest welk STK-algoritme actief is: Plucked (getokkelde snaar, Karplus-Strong), Clarinet (riet), Bowed (gestreken snaar), Flute (fluit), Brass (koper), Saxophony (saxofoon), BlowHole (enkelriet+klankgat), BandedWG (modale/waveguide) of Mandolin (commuted synthesis, geëmbedde body-samples). Alle CV-ingangen tellen op bij de knopwaarde. Monofone voice; polyfonie via PolyGroup.",
   "internal": true
  },
  {
   "id": "tp_mmb_fof",
   "categoryId": "vco",
   "variant": "FOF zingende formantstem",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "next",
     "name": "Next",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "syl_cv",
     "name": "Syl+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "vowel",
     "name": "Vow+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "breath",
     "name": "Air+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "vibrato",
     "name": "Vib+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "voice",
     "name": "Voi+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "pressure",
     "name": "Press",
     "signalType": "cv",
     "direction": "in"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "vowel",
     "label": "Vowel",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "breath",
     "label": "Breath",
     "min": 0,
     "max": 1,
     "defaultValue": 0.08,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vibrato",
     "label": "Vibrato",
     "min": 0,
     "max": 1,
     "defaultValue": 0.12,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "voice",
     "label": "Voice",
     "min": 0,
     "max": 1,
     "defaultValue": 0.35,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "syl",
     "label": "Syl",
     "min": 0,
     "max": 45,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "display",
     "id": "sylDisp",
     "digits": 6,
     "style": "oled",
     "bindTo": "syl",
     "lookup": [
      [
       "Vowel",
       "doo",
       "da",
       "va",
       "der",
       "ja",
       "cob",
       "slaapt",
       "gij",
       "nog",
       "al",
       "le",
       "klo",
       "ken",
       "lui",
       "den",
       "bim",
       "bam",
       "bom",
       "de",
       "na",
       "hee",
       "djoed",
       "o",
       "li",
       "fant",
       "je",
       "in",
       "het",
       "bos",
       "laat",
       "ma",
       "toch",
       "niet",
       "los",
       "an",
       "ders",
       "raak",
       "weg",
       "kwijt",
       "en",
       "dan",
       "heb",
       "la",
       "ter",
       "spijt"
      ]
     ],
     "text": "Vowel",
     "size": "small"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "syl_amt",
     "label": "Syl",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vowel_amt",
     "label": "Vow",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "breath_amt",
     "label": "Air",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vibrato_amt",
     "label": "Vib",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "voice_amt",
     "label": "Voi",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "vel_amt",
     "label": "Vel",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "press_amt",
     "label": "Prs",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    }
   ],
   "notes": "FOF/CHANT-geinspireerde zangoscillator met asymmetrische glottale bron. Vowel morft door A-E-I-O-U; formanten blijven staan bij pitchverandering. Voice loopt van korte, heldere sluiting naar langer, zachter open/sluitgedrag. Vel (0-1) regelt volume en verzacht de sluiting bij zachte aanslagen; zonder kabel volle sterkte. Press (0-1) is de doorlopende expressie tijdens de noot (MidiIn Press/aftertouch, breath controller of CV): lager = iets zachter (vloer 0,5), duidelijk ademiger (als Breath open staat) en een langere, zachtere sluiting; zonder kabel volle druk, ~20 ms gladgestreken. Vow+/Air+/Vib+/Voi+ tellen op bij de knop; de kleine knop boven elke CV-jack is de attenuator (1 = vol, 0 = kabel doet niets; bij Vel en Press = gevoeligheid). Syl kiest een lettergreep uit een tabel van 46 (0 = de Vowel-knop; dan doo, da, va, der, ja, cob, slaapt, gij, nog, al, le, klo, ken, lui, den, bim, bam, bom, de, na, hee, djoed, en 23-45 Olifantje in het bos: o, li, fant, je, in, het, bos, laat, ma, toch, niet, los, an, ders, raak, weg, kwijt, en, dan, heb, la, ter, spijt): synthetische medeklinkers (plosieven met sluiting/burst/glijbaan, nasalen, fricatieven, l/r/j/w met de Nederlandse schraap-r en -g) en tweeklanken, en een slotmedeklinker die speelt als de gate valt; het display toont de knopstand. Syl+ (0-1 over de tabel, zoals syl_cv bij ZANG) telt op bij de knop: CC-waarde = index × 127 / 45. Next (gate-flank) stapt naar de volgende lettergreep, Reset gaat terug naar de knop: een sustainpedaal via MIDI-IN CC2# = 64 werkt als stappedaal. De lettergreep wordt bij de gate-flank gelezen: kies hem vóór de noot (linkerhand pads, rechterhand melodie). Tone bepaalt de resonantiebreedte, Breath voegt pulsgebonden aspiratie toe en Vibrato geeft maximaal een halve toon (100 cent) bij 5,3 Hz. Geen exacte LF-bron, spraaksynthese of volledige CHANT-reconstructie. Mono; polyfonie via PolyGroup.",
   "internal": true
  },
  {
   "id": "tp_mmb_env_follower",
   "categoryId": "envelope",
   "variant": "Envelope follower (8 cellen)",
   "ports": [
    {
     "id": "in_1",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_2",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_3",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_4",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_5",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_6",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_7",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "in_8",
     "name": "In",
     "signalType": "audio",
     "direction": "in",
     "cellGroupId": "follow"
    },
    {
     "id": "env_1",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_2",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_3",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_4",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_5",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_6",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_7",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "env_8",
     "name": "Env",
     "signalType": "cv",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_1",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_2",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_3",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_4",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_5",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_6",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_7",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    },
    {
     "id": "gate_8",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out",
     "cellGroupId": "follow"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "attack",
     "label": "Attack",
     "min": 0.1,
     "max": 100,
     "defaultValue": 5,
     "taper": "log",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Release",
     "min": 5,
     "max": 1000,
     "defaultValue": 150,
     "taper": "log",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "sens",
     "label": "Sens",
     "min": -12,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#0891b2",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "thresh",
     "label": "Thresh",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Peak",
      "RMS"
     ],
     "defaultIndex": 1
    }
   ],
   "notes": "Multi-module met 8 identieke envelope-follower-cellen: per cel een audio-in, de gevolgde envelope als CV (0..1) en een gate zodra die boven Thresh komt. Attack/Release zijn tijdconstanten van de detector; Sens is de gevoeligheid in dB; Mode kiest tussen piek (scherp, reageert op transiënten) en RMS (rustiger, volgt het gemiddelde vermogen). De gate heeft 25 % hysterese zodat een uitstervende staart niet klappert. Typisch: sampler → in_1, env_1 → cutoff-CV van een VCF. Detectie loopt op audiotempo, niet op de CV-tick, zodat een aanslag van 2 ms niet wordt gemist. Firmware: tp_mmb_env_follower (FW-CV-6), gedeelde DSP mmb_dsp::EnvFollower — in de simulator draait dezelfde code als wasm.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "follow",
     "label": "Follower",
     "count": 8,
     "portIds": [
      "in",
      "env",
      "gate"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_env_follower_mono",
   "categoryId": "envelope",
   "variant": "Envelope follower (enkel)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "env",
     "name": "Env",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "attack",
     "label": "Att",
     "min": 0.1,
     "max": 100,
     "defaultValue": 5,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Rel",
     "min": 5,
     "max": 1000,
     "defaultValue": 150,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "sens",
     "label": "Sens",
     "min": -12,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#0891b2",
     "style": "generic",
     "unit": "dB"
    },
    {
     "kind": "knob",
     "id": "thresh",
     "label": "Thr",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Peak",
      "RMS"
     ],
     "defaultIndex": 1
    }
   ],
   "notes": "Enkelvoudige envelope follower: audio erin, de gevolgde envelope als CV (0..1) eruit, plus een gate zodra die boven Thresh komt. Attack/Release zijn tijdconstanten van de detector; Sens is de gevoeligheid in dB; Mode kiest tussen piek (scherp, reageert op transiënten) en RMS (rustiger, volgt het gemiddelde vermogen). De gate heeft 25 % hysterese zodat een uitstervende staart niet klappert. Typisch: sampler → In, Env → cutoff-CV van een VCF. Firmware: tp_mmb_env_follower_mono (FW-CV-6), dezelfde romp en dezelfde DSP als de 8-cel versie — alleen één cel. In de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_material_bridge",
   "categoryId": "vco",
   "variant": "Material Bridge (gekoppelde resonatoren)",
   "ports": [
    {
     "id": "coupling_cv",
     "name": "Cpl+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "pickup_cv",
     "name": "Pick+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Hit A",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "gate_b",
     "name": "Hit B",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "stress",
     "name": "Stress",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pitch",
     "label": "Pitch",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 0,
     "max": 1,
     "defaultValue": 0.35,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "coupling",
     "label": "Couple",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#6ee7b7",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0.05,
     "max": 8,
     "defaultValue": 2,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "memory",
     "label": "Memory",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#fb7185",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fatigue",
     "label": "Fatigue",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#fb7185",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "recovery",
     "label": "Recover",
     "min": 0.1,
     "max": 10,
     "defaultValue": 2,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "pickup",
     "label": "Pickup",
     "min": 0,
     "max": 1,
     "defaultValue": 0.25,
     "size": "small",
     "color": "#6ee7b7",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Experimentele state-graph voice: vier resonatoren delen energie via drie passieve koppelingen. Hit A/B slaan de uiteinden aan; audio exciteert A. Een harde aanslag (velocity boven ~0,85) drijft Stress over de breekdrempel; pas onder de hersteldrempel sluit het contact weer (hysterese). Memory laat dat gebroken contact de middelste brug verzwakken: energie blijft dan aan de aangeslagen kant en de pickupbalans verandert, zonder extra demping. Fatigue voegt stressafhankelijke demping toe (kortere uitklank onder belasting). Recover bepaalt het herstel; Stress geeft de toestand als CV. Pickup verplaatst twee passieve stereo-pickups. Reset wist energie en geheugen. V/Oct rond C4 transponeert het hele spectrum; de koppeling schaalt mee, zodat de modusverhoudingen vast liggen. Couple spreidt de modi (bij 0,65 ligt de sterkste modus ~36 cent boven de grondtoon). Dezelfde C++-kern op Teensy en in wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_scanned",
   "categoryId": "vco",
   "variant": "Scanned (levende golftabel)",
   "ports": [
    {
     "id": "pos_cv",
     "name": "Pos+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "press",
     "name": "Press",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Hit",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "energy",
     "name": "Energy",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pitch",
     "label": "Pitch",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "tension",
     "label": "Tension",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "medium",
     "color": "#c084fc",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "damping",
     "label": "Damping",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "restore",
     "label": "Return",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#c084fc",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "speed",
     "label": "Speed",
     "min": 0.02,
     "max": 1,
     "defaultValue": 0.15,
     "size": "medium",
     "color": "#c084fc",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "width",
     "label": "Width",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "position",
     "label": "Position",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Scanned synthesis (Verplank/Mathews/Shaw): een gesloten ring van 64 massa's met veren naar de buren (Tension) en een terugveer naar rust (Return) beweegt traag; Speed vertraagt of versnelt het materiaal (fysica op ~5,5 kHz, met Speed verder omlaag). De vorm van de ring wordt op de toonhoogte van V/Oct en Pitch als golftabel uitgelezen, dus de golfvorm leeft en trilt na. Hit slaat de ring aan rond Position met Vel als kracht; Press (0..1) drukt een vinger in de ring en geeft een stilstaande vorm die bij loslaten terugveert; In duwt met audio. Width is de breedte van de vinger. Energy (CV 0..1) is de uitwijking van de ring. Reset wist posities en snelheden. Mono; dezelfde C++-kern op Teensy en in wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_reservoir",
   "categoryId": "utility",
   "variant": "Reservoir (gedeelde bron)",
   "ports": [
    {
     "id": "in_a",
     "name": "A",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_b",
     "name": "B",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_c",
     "name": "C",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_d",
     "name": "D",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_a",
     "name": "A",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_b",
     "name": "B",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_c",
     "name": "C",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_d",
     "name": "D",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "refill",
     "name": "Refill",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "level",
     "name": "Level",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "starve",
     "name": "Starve",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "empty",
     "name": "Empty",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "drain",
     "label": "Drain",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#60a5fa",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "recover",
     "label": "Recover",
     "min": 0.1,
     "max": 20,
     "defaultValue": 2,
     "taper": "log",
     "size": "medium",
     "color": "#60a5fa",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "floor",
     "label": "Floor",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "curve",
     "label": "Curve",
     "min": 0.25,
     "max": 4,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "thresh",
     "label": "Empty@",
     "min": 0,
     "max": 1,
     "defaultValue": 0.15,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Resource-coupled synthesis: een eindige bron (lucht, snaarspanning, voeding) waar tot vier stemmen tegelijk uit putten. Zet envelopes of gates (0..1) op In A..D; iedere belasting trekt de bron leeg (Drain 1 = een volle stem leegt hem in 1 s), de bron vult exponentieel bij met tijdconstante Recover. Out A..D is de eigen belasting maal het aanbod: stuur die naar de VCA-CV in plaats van de envelope zelf, dan laat een harde noot tijdelijk minder over voor de volgende stem en is het herstel hoorbaar. Aanbod = Floor + (1-Floor) * Level^Curve. Level is de bron (0..1), Starve het tekort (patch op cutoff of V/Oct met een attenuator), Empty een gate zodra de bron onder Empty@ zakt (hysterese 0,1) - laat het instrument stotteren. Refill vult extra bij, Reset maakt de bron direct vol. Onderzoeksmodule: toetst of gedeelde toestand anders speelt dan onafhankelijke stemmen.",
   "internal": true
  },
  {
   "id": "tp_mmb_gendyn",
   "categoryId": "vco",
   "variant": "GENDYN (stochastisch)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Hit",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "chaos_cv",
     "name": "Amp+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "cycle",
     "name": "Cycle",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pitch",
     "label": "Pitch",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "points",
     "label": "Points",
     "min": 3,
     "max": 24,
     "defaultValue": 12,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "amp_step",
     "label": "Amp",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "dur_step",
     "label": "Dur",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "dist",
     "label": "Dist",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "smooth",
     "label": "Smooth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "settle",
     "label": "Settle",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "seed",
     "label": "Seed",
     "min": 0,
     "max": 99,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "GENDYN (Xenakis, dynamische stochastische synthese): een cyclus bestaat uit Points breekpunten; na iedere cyclus zet elk breekpunt een random stap in amplitude (Amp, spiegelend binnen -1..1) en in duur (Dur, symmetrisch rond de nominale periode, zodat de gemiddelde toonhoogte V/Oct volgt). Dist mengt uniforme stappen (0) met een zwaarstaartige verdeling (1: veel kleine, af en toe een grote). Smooth loopt van rechte lijnstukken (ruw, veel boventonen) naar cosinusbogen. Settle trekt amplitudes per cyclus iets naar nul, zodat de golf niet aan de grenzen blijft hangen. Hit zaait de ruis opnieuw met Seed en herstelt de beginvorm: iedere noot begint hetzelfde en wandelt daarna weg; zonder Hit loopt de wandeling vrij door. Amp+ moduleert de stapgrootte (bijv. met een envelope: stabiel begin, chaotische staart). Cycle is hoog tijdens het eerste segment van elke cyclus. Niet bandbegrensd; dat is de aard van de techniek.",
   "internal": true
  },
  {
   "id": "tp_mmb_excitable",
   "categoryId": "vco",
   "variant": "Excitable (prikkelbaar medium)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate A",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "voct_b",
     "name": "V/Oct B",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate_b",
     "name": "Gate B",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Reset",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "activity",
     "name": "Activity",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pitch",
     "label": "Pitch",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "detune",
     "label": "Detune B",
     "min": -24,
     "max": 24,
     "defaultValue": 7,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "refract",
     "label": "Refract",
     "min": 2,
     "max": 60,
     "defaultValue": 12,
     "size": "medium",
     "color": "#4ade80",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "excite",
     "label": "Excite",
     "min": 1,
     "max": 8,
     "defaultValue": 3,
     "size": "medium",
     "color": "#4ade80",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "thresh",
     "label": "Thresh",
     "min": 1,
     "max": 3,
     "defaultValue": 1,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "pickup",
     "label": "Pickup",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "medium",
     "color": "#4ade80",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "speed",
     "label": "Speed",
     "positions": [
      "1",
      "2",
      "4"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Excitable-media synthesis: een begrensd raster van 16x16 prikkelbare cellen (rust, actief gedurende Excite stappen, refractair gedurende Refract stappen). Een rustende cel wordt actief zodra Thresh van zijn vier buren actief is. Pacemaker A (links) en B (rechts) prikkelen hun cel op de toonhoogte van V/Oct (B met Detune en V/Oct B erbij) zolang hun gate hoog is; de golffronten lopen een cel per stap, doven aan de rand en vernietigen elkaar waar ze botsen. Speed is het aantal audiosamples per mediumstap (1 = fijnst, zwaar op de Teensy). Pickup verplaatst beide pickups van de bronnen (0) naar het midden (1) waar de fronten botsen. Is de periode korter dan Excite + Refract, dan negeert de cel elke tweede of derde prikkel: subharmonieken ontstaan causaal uit het medium (bij Pitch +24 en Refract 60 klinkt weer ongeveer de grondtoon). Activity (CV 0..1) is het aandeel actieve en refractaire cellen. Pulsvormig geluid; de toonhoogte heeft stapjitter van een mediumstap. Onderzoeksmodule.",
   "internal": true
  },
  {
   "id": "tp_mmb_tapestrip",
   "categoryId": "vco",
   "variant": "Tape strip (Mellotron-mechanica)",
   "ports": [
    {
     "id": "press",
     "name": "Press",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "bend",
     "name": "Bend",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "tape",
     "name": "Tape",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "load",
     "name": "Load",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "voct_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "bank",
     "label": "Bank",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       15
      ]
     }
    },
    {
     "kind": "knob",
     "id": "length",
     "label": "Length",
     "min": 1,
     "max": 8,
     "defaultValue": 8,
     "taper": "log",
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "return",
     "label": "Return",
     "min": 0.1,
     "max": 4,
     "defaultValue": 1,
     "taper": "log",
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "contact",
     "label": "Contact",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "motor",
     "label": "Motor",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "wow",
     "label": "Wow",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "flutter",
     "label": "Flutter",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "wear",
     "label": "Wear",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Mellotron-mechanica om een gewone samplebank: de goede opname komt uit de bank (dezelfde .mmbs-bank en Bank-knop als de SAMPLER; in de simulator krijgt deze module automatisch de bank van de sampler), de onvolmaaktheid komt hiervandaan. Per toets een bandje van Length seconden: na Length stopt de klank abrupt, hoe lang je de toets ook houdt. Loslaten laat het bandje met een veer terugspoelen (Return = terugloop van een volle strip); druk je de toets opnieuw in terwijl het bandje nog onderweg is, dan speelt hij vanaf de plek waar het bandje dan staat, zodat snelle herhalingen anders klinken dan de eerste aanslag. Contact is het drukkussen dat de band tegen de kop duwt: opkomst, hoogafval en een kleine pitch-dip bij het indrukken. Motor laat de capstan zakken onder belasting (meer toetsen = iets trager, met traagheid); Press (channel pressure) vertraagt licht. Wow en Flutter moduleren de snelheid; Wear voegt bandruis, bandbreedteverlies en zachte verzadiging toe. Tape (CV) is de positie van het laatst aangeslagen bandje, Load de motorbelasting. Acht stem-cellen; polyfoon via een PolyGroup (Poly ▾ → Tape strip ×8). Firmware tp_mmb_tapestrip op dezelfde SampleBank als de sampler.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Stem",
     "count": 8,
     "portIds": [
      "voct",
      "gate",
      "vel"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_clock",
   "categoryId": "sequencer",
   "variant": "Clock (masterklok + delers)",
   "ports": [
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "tempo_cv",
     "name": "Tempo",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "bar",
     "name": "Bar",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "beat",
     "name": "Beat",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "x2",
     "name": "×2",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "x3",
     "name": "×3",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "x4",
     "name": "×4",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "div",
     "name": "Div",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "ramp",
     "name": "Ramp",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 20,
     "max": 300,
     "defaultValue": 120,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "toggle",
     "id": "run",
     "label": "Run",
     "defaultValue": true
    },
    {
     "kind": "knob",
     "id": "swing",
     "label": "Swing",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#60a5fa",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "width",
     "label": "Width",
     "min": 0.05,
     "max": 0.95,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "div",
     "label": "Div",
     "min": 1,
     "max": 64,
     "defaultValue": 6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    }
   ],
   "notes": "Masterklok: één tempo waar alle uitgangen van worden afgeleid, zodat ze onderling nooit verschuiven. Beat = kwartnoten, ×2 = achtsten, ×3 = triolen, ×4 = zestienden (de stapklok voor de sequencers: Seq Clk, of Grids/Euclid/Turing met ExtClk aan; zet bij de Seq de Rate-knop op het tempo van de stappen, want die bepaalt daar nog de lengte van de gate), Bar = één puls per maat van vier tellen, Div = elke Div zestienden (6 = gepunteerde kwart, 3 = gepunteerde achtste). Swing verschuift elke tweede zestiende op ×4: 0 = recht, 1 = triolen-swing. Width is de pulsbreedte. Ramp is een zaag van 0 naar 1 per maat: hang er een filter of een Morph aan en de modulatie loopt in de maat. Tempo-CV is exponentieel (+1 = dubbel tempo). Rst zet alles terug op de één; Run uit houdt de klok stil. Firmware tp_mmb_clock; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_euclid",
   "categoryId": "sequencer",
   "variant": "Euclid (Euclidische ritmes ×3)",
   "ports": [
    {
     "id": "fill_1_cv",
     "name": "Fill+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_1",
     "name": "1",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "fill_2_cv",
     "name": "Fill+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_2",
     "name": "2",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "fill_3_cv",
     "name": "Fill+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_3",
     "name": "3",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "any",
     "name": "Any",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "steps_1",
     "label": "Steps",
     "min": 1,
     "max": 32,
     "defaultValue": 16,
     "size": "small",
     "color": "#e11d48",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fill_1",
     "label": "Fill",
     "min": 0,
     "max": 32,
     "defaultValue": 4,
     "size": "small",
     "color": "#e11d48",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "rot_1",
     "label": "Rot",
     "min": 0,
     "max": 31,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "steps_2",
     "label": "Steps",
     "min": 1,
     "max": 32,
     "defaultValue": 16,
     "size": "small",
     "color": "#0891b2",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fill_2",
     "label": "Fill",
     "min": 0,
     "max": 32,
     "defaultValue": 3,
     "size": "small",
     "color": "#0891b2",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "rot_2",
     "label": "Rot",
     "min": 0,
     "max": 31,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "steps_3",
     "label": "Steps",
     "min": 1,
     "max": 32,
     "defaultValue": 16,
     "size": "small",
     "color": "#eab308",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fill_3",
     "label": "Fill",
     "min": 0,
     "max": 32,
     "defaultValue": 5,
     "size": "small",
     "color": "#eab308",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "rot_3",
     "label": "Rot",
     "min": 0,
     "max": 31,
     "defaultValue": 2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 20,
     "max": 300,
     "defaultValue": 120,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "toggle",
     "id": "extclock",
     "label": "ExtClk",
     "defaultValue": false
    }
   ],
   "notes": "Euclidische ritmegenerator met drie kanalen. Per kanaal verdeelt het algoritme Fill slagen zo gelijk mogelijk over Steps stappen; Rot draait het patroon. 3 op 8 is de tresillo, 5 op 8 met Rot 6 de cinquillo, 7 op 16 een samba-achtig patroon; veel traditionele ritmes zijn zo te maken (stap 0 is altijd raak, de rest volgt uit de verdeling). Geef de kanalen verschillende lengtes (16, 12, 7) en ze schuiven tegen elkaar: polymetriek. Fill+ telt op bij de Fill-knop (0..1 = 0..Steps), dus een LFO of Chaos maakt het ritme dichter en ijler. Klok zoals Grids: intern (Tempo, zestienden) of ExtClk aan + Clk (bijvoorbeeld Clock ×4). Any is hoog als een van de drie slaat. Stuur de uitgangen naar Peaks, de CR-78 of een envelope. Firmware tp_mmb_euclid; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_turing",
   "categoryId": "sequencer",
   "variant": "Turing (lus die langzaam verandert)",
   "ports": [
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "change_cv",
     "name": "Chg+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "cv",
     "name": "CV",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "cv2",
     "name": "CV2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "pulse",
     "name": "Pulse",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "pulse2",
     "name": "P2",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "change",
     "label": "Change",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "large",
     "color": "#e11d48",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "slot",
       "1": "2×",
       "0.5": "random"
      }
     }
    },
    {
     "kind": "knob",
     "id": "length",
     "label": "Length",
     "min": 2,
     "max": 16,
     "defaultValue": 8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "range",
     "label": "Range",
     "min": 0,
     "max": 5,
     "defaultValue": 2,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 20,
     "max": 300,
     "defaultValue": 120,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "toggle",
     "id": "extclock",
     "label": "ExtClk",
     "defaultValue": false
    }
   ],
   "notes": "Schuifregister-sequencer in de geest van de Turing Machine: een lus van Length stappen die je laat veranderen. Change is de kans dat het bit dat rondgaat omklapt: 0 = de lus zit op slot en herhaalt precies; 0,5 = elke stap een muntworp, geen herhaling; 1 = het bit klapt altijd om, de lus herhaalt na twee keer Length met een gespiegelde tweede helft. Daartussen verandert er af en toe een noot: draai open tot je iets hoort wat je bevalt en draai dicht om het te houden. CV is de 8-bits waarde van het register (0 tot Range octaven, ongekwantiseerd: zet er de Quantizer achter voor noten in een schaal); CV2 is dezelfde lijn acht stappen later, een canon. Pulse en P2 volgen twee bits van het register als ritme. Klok intern (Tempo, zestienden) of ExtClk aan + Clk. Rst zet het register terug op het beginpatroon, dus na een reset klinkt dezelfde lus. Firmware tp_mmb_turing; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_branches",
   "categoryId": "utility",
   "variant": "Branches (muntworp per trigger)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "p_cv",
     "name": "P+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "a",
     "name": "A",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "b",
     "name": "B",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "p",
     "label": "P(B)",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "toggle",
     "label": "Toggle",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "latch",
     "label": "Latch",
     "defaultValue": false
    }
   ],
   "notes": "Bernoulli-gate (naar het idee van Mutable Instruments Branches, eigen code): elke trigger op In gaat naar uitgang A of naar uitgang B; P(B) is de kans op B. Toggle aan: P is de kans dat de kant wisselt (1 = strak om-en-om, een klokdeler door twee; klein = lang dezelfde kant). Latch aan: de gekozen uitgang blijft hoog tot de worp de andere kant kiest, een willekeurige schakelaar. Typisch: klok erin, A naar de hihat en B naar een fill; of een gate uit de sequencer erin en met P bepalen hoe vaak het accent meedoet. P+ telt op bij de knop. Firmware tp_mmb_branches; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_chaos",
   "categoryId": "lfo",
   "variant": "Chaos (Lorenz / Rössler / Thomas)",
   "ports": [
    {
     "id": "rate_cv",
     "name": "Rate",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "x",
     "name": "X",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "y",
     "name": "Y",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "z",
     "name": "Z",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.005,
     "max": 20,
     "defaultValue": 0.2,
     "taper": "log",
     "size": "large",
     "color": "#a78bfa",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "switch",
     "id": "model",
     "label": "Model",
     "positions": [
      "Lorenz",
      "Rössler",
      "Thomas"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "shape",
     "label": "Shape",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "bipolar",
     "label": "Bip",
     "defaultValue": true
    },
    {
     "kind": "knob",
     "id": "rate_cv_amt",
     "label": "Rate CV",
     "min": -1,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Chaotische modulator. Een LFO herhaalt zich en ruis heeft geen richting; een chaotisch stelsel zit ertussenin: het beweegt vloeiend en samenhangend, maar komt nooit precies terug. X, Y en Z zijn drie kanten van dezelfde beweging: modulaties die ermee gestuurd worden horen bij elkaar zonder gelijk te lopen. Lorenz: twee lobben; de baan cirkelt een poos om de ene en springt dan onvoorspelbaar naar de andere (Gate is hoog op de rechterlob: een onregelmatige schakelaar). Rössler: een bijna-sinus op X en Y die af en toe uitschiet, met op Z losse pieken; Shape loopt door de periodeverdubbeling, van periodiek naar chaotisch. Thomas: een trage, symmetrische dwaaltocht, het rustigste van de drie, voor drift over minuten. Rate is ruwweg het aantal omlopen per seconde (0,005 Hz = ruim drie minuten per omloop); Rate-CV is exponentieel (±1 = ±4 octaven maal Rate CV). Depth schaalt de uitgangen, Bip uit maakt ze 0..Depth. Rst herstelt de beginpositie, dus een patch begint reproduceerbaar. Firmware tp_mmb_chaos; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_lfo8",
   "categoryId": "lfo",
   "variant": "LFO-8 (acht verwante LFO’s)",
   "ports": [
    {
     "id": "rate_cv",
     "name": "Rate",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "out_1",
     "name": "1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_2",
     "name": "2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_3",
     "name": "3",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_4",
     "name": "4",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_5",
     "name": "5",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_6",
     "name": "6",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_7",
     "name": "7",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_8",
     "name": "8",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.02,
     "max": 50,
     "defaultValue": 1,
     "taper": "log",
     "size": "large",
     "color": "#a78bfa",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "spread",
     "label": "Spread",
     "min": 1.1,
     "max": 3,
     "defaultValue": 1.6,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "shape",
     "label": "Shape",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "tri",
       "1": "sin"
      }
     }
    },
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "bipolar",
     "label": "Bip",
     "defaultValue": true
    }
   ],
   "notes": "Acht vrijlopende LFO’s op één Rate-knop. Uitgang 1 is de snelste (Rate), elke volgende is een factor Spread trager, met een kleine vaste afwijking per uitgang zodat ze nooit in de maat gaan lopen. Bij Rate 1 Hz en Spread 1,6 loopt uitgang 8 op ongeveer 0,04 Hz: van trilling tot getij op één knop. Prik overal een uitgang in en de hele patch beweegt samenhangend, zonder acht LFO’s te hoeven instellen. Shape loopt van driehoek naar sinus, Depth schaalt alle uitgangen, Bip uit maakt ze 0..Depth. Rate-CV is exponentieel (±1 = ±4 octaven) en werkt op alle acht; Rst zet alle fasen op nul. Firmware tp_mmb_lfo8; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_slope",
   "categoryId": "envelope",
   "variant": "Slope (functiegenerator: rise/fall)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "trig",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "time_cv",
     "name": "Time",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "inv",
     "name": "Inv",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "eor",
     "name": "EOR",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "eoc",
     "name": "EOC",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "rise",
     "label": "Rise",
     "min": 0.001,
     "max": 20,
     "defaultValue": 0.05,
     "taper": "log",
     "size": "medium",
     "color": "#34d399",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "fall",
     "label": "Fall",
     "min": 0.001,
     "max": 20,
     "defaultValue": 0.5,
     "taper": "log",
     "size": "medium",
     "color": "#f87171",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "knob",
     "id": "shape",
     "label": "Shape",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "lin",
       "1": "exp",
       "-1": "log"
      }
     }
    },
    {
     "kind": "toggle",
     "id": "cycle",
     "label": "Cycle",
     "defaultValue": false
    }
   ],
   "notes": "Functiegenerator naar het bekende West Coast-bouwblok (Serge DUSG, later Maths): één schakeling die envelope, LFO, lag of envelope-volger is, afhankelijk van wat je erin steekt. Trig: een flank laat de uitgang naar 1 stijgen (Rise) en daarna naar 0 dalen (Fall), een AD-envelope. In: de uitgang volgt de ingang, omhoog met Rise en omlaag met Fall; een gate geeft een ASR-envelope, een V/Oct-lijn portamento met omhoog en omlaag apart, een gelijkgericht signaal (Logic Abs) een envelope-volger. Cycle: aan het eind van de daling start hij zichzelf opnieuw, een LFO waarvan Rise en Fall de vorm bepalen (zaag, driehoek, ramp). Shape buigt de lijnen: log = snel begin en trage nadering (zoals een condensator), lin = recht, exp = trage start en snel eind. Rise en Fall zijn de tijd voor een volle slag; Time-CV rekt beide (+1 = acht keer zo lang). EOR is hoog zolang de uitgang daalt, EOC geeft een puls aan het eind van de daling: keten er een tweede Slope aan, of gebruik hem als klok. Inv = 1 − Out. Firmware tp_mmb_slope; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_logic",
   "categoryId": "utility",
   "variant": "Logic (min/max, logica, vergelijker)",
   "ports": [
    {
     "id": "a",
     "name": "A",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "b",
     "name": "B",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "min",
     "name": "Min",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "max",
     "name": "Max",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "and",
     "name": "AND",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "or",
     "name": "OR",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "xor",
     "name": "XOR",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "gt",
     "name": "A>B",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "abs",
     "name": "|A|",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "inv",
     "name": "−A",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "thresh",
     "label": "Thresh",
     "min": -1,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "CV-gereedschap: twee ingangen, acht uitgangen die er elk iets anders mee doen. Het zijn de kleine bewerkingen waarmee twee eenvoudige modulatoren samen een ingewikkelde worden. Min en Max geven de laagste en de hoogste van A en B: op gates is dat AND en OR, op twee LFO’s een nieuwe golfvorm met knikken. AND, OR en XOR zijn gate-logica (een ingang telt als hoog boven Thresh): twee klokken door XOR geeft een derde, onregelmatiger ritme. A>B is een vergelijker; met alleen A aangesloten vergelijkt hij met Thresh en maakt hij van elke CV een gate (een LFO wordt een pulsgolf met instelbare breedte). |A| richt A gelijk: een bipolaire LFO wordt twee keer zo snel en unipolair, en met Slope erachter heb je een envelope-volger voor CV. −A keert A om. Firmware tp_mmb_logic; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_folder",
   "categoryId": "effect",
   "variant": "Wavefolder (West Coast)",
   "ports": [
    {
     "id": "fold_cv",
     "name": "Fold+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "sym_cv",
     "name": "Sym+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "fold",
     "label": "Fold",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "large",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "symmetry",
     "label": "Sym",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "type",
     "label": "Type",
     "positions": [
      "Sine",
      "Tri",
      "259"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Wavefolder: de West Coast-manier om boventonen te maken. Een filter haalt boventonen weg uit een rijke golf; een folder begint met een sinus of driehoek en vouwt de toppen terug zodra ze over een grens gaan. Hoe verder Fold open, hoe vaker de golf vouwt en hoe meer boventonen, in een patroon dat op FM lijkt maar strak harmonisch blijft. Zet er een envelope of LFO op Fold+ en de klank opent zoals een filter dat zou doen, maar dan andersom. Type: Sine = door een sinus (zacht, rond), Tri = hoekig terugvouwen (helder, scherp), 259 = de vijf vouwcellen van het timbre-circuit van de Buchla 259 (hol, neuzig). Sym schuift de golf voor het vouwen opzij en voegt even boventonen toe. Het werkt het best op een sinus of driehoek op volle sterkte; een zaag of een akkoord wordt snel ruis. Vier keer overbemonsterd. Mix mengt met het droge signaal. Erachter hoort een low-pass gate (LPG). Firmware tp_mmb_folder, mmb_dsp::Wavefolder; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_lpg",
   "categoryId": "vca",
   "variant": "LPG (low-pass gate, vactrol)",
   "ports": [
    {
     "id": "cv",
     "name": "CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "trig",
     "name": "Ping",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "env",
     "name": "Env",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "offset",
     "label": "Open",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fb923c",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0.02,
     "max": 4,
     "defaultValue": 0.25,
     "taper": "log",
     "size": "medium",
     "color": "#fb923c",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "LP",
      "Both",
      "VCA"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Res",
     "min": 0,
     "max": 1,
     "defaultValue": 0.1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.9,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Low-pass gate: filter en versterker in één, gestuurd door een vactrol (een lampje tegen een lichtgevoelige weerstand). De weerstand reageert vlug op licht maar komt traag terug, en trager naarmate het donkerder wordt. In stand Both stuurt hij tegelijk de helderheid en het volume, zoals in de Buchla 292: een klank die uitsterft wordt ook doffer, net als een aangeslagen stuk hout of een getokkelde snaar. Ping: een trigger laat het lampje flitsen; zonder envelope geeft dat al een natuurlijke tik met een eigen staart (het bongo-geluid van de West Coast). Decay bepaalt hoe lang de vactrol nagloeit. CV (0..1) telt op bij Open: een envelope of LFO opent de gate geleidelijk, en ook dan komt hij traag terug. Mode LP = alleen het filter, VCA = alleen de versterker. Res geeft het filter een piek. Env is de toestand van de vactrol als CV (0..1): een envelope met dat nagloeien, voor elders in de patch. Firmware tp_mmb_lpg, mmb_dsp::Lpg; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_drive",
   "categoryId": "effect",
   "variant": "Drive (overdrive / distortion / fuzz)",
   "ports": [
    {
     "id": "drive_cv",
     "name": "Drv+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#ef4444",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "OD",
      "Dist",
      "Fuzz"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Drie vervormpedalen in één. Het verschil zit niet in meer gain, maar in wat er vóór en ná de clipper gefilterd wordt en hoe hard die knipt. OD = overdrive naar de groene overdrive (Tube Screamer-familie): alleen midden en hoog gaan de zachte clipper in en het schone signaal wordt er weer bij opgeteld; het laag blijft strak en het midden komt naar voren, zodat een solo door de band heen komt. Dist = distortion naar de RAT-familie: veel versterking in een trage opamp, dan harde dioden; ruiger en platter, Tone is hier het filter dat het hoog wegneemt. Fuzz = naar de Big Muff-familie: twee clippende trappen achter elkaar en een toonregeling met een gat in het midden; lange, zingende sustain. Level 0,5 is ongeveer even luid als onbewerkt. Drv+ telt op bij Drive (een envelope-volger erop: harder spelen = meer vervorming). Vier keer overbemonsterd. Een eigen model naar de topologie van de schakelingen, op het oor; geen simulatie per onderdeel. Firmware tp_mmb_drive, mmb_dsp::Drive; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_tube",
   "categoryId": "effect",
   "variant": "Tube (buizenversterker / studio-buis)",
   "ports": [
    {
     "id": "drive_cv",
     "name": "Drv+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "In L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "In R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "Out L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "Out R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Studio",
      "Amp"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "large",
     "color": "#f59e0b",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "stack",
     "label": "Stack",
     "positions": [
      "Fender",
      "Marshall",
      "Vox"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "bias",
     "label": "Bias",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bass",
     "label": "Bass",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mid",
     "label": "Mid",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "treble",
     "label": "Treble",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "presence",
     "label": "Pres",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sag",
     "label": "Sag",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "cab",
     "label": "Cab",
     "positions": [
      "Uit",
      "Aan"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Buizenoverdrive in twee standen. Wat een buis anders doet dan een diode: hij clipt asymmetrisch (boven nul gaat er roosterstroom lopen en wordt de top zacht afgerond, onder nul knijpt hij later en harder dicht), dus even boventonen; en de roosterstroom laadt de koppelcondensator op, waardoor het werkpunt na een harde aanslag even wegzakt en in tientallen milliseconden terugkomt (blocking): de vervorming ademt mee met je spel. Amp = gitaarversterker: twee triodetrappen, dan de toonstack (Stack Fender: diep gat in het midden rond 400 Hz; Marshall: ondieper en hoger, meer midden; Vox top boost: weinig gat, helder) met Bass/Mid/Treble, dan de push-pull-eindtrap met Sag (de voeding zakt in bij hard spelen: compressie, sponziger) en Presence, en een kastsimulatie (Cab; zet hem uit voor een eigen kast of galm). Studio = één triodetrap en een uitgangstrafo die het laag iets verzadigt: warmte en tweede harmonische op een stem, synth of mix, zonder toonstack of kast; Level blijft ongeveer gelijk als je Drive draait. Bias: links koud (eerder dichtknijpen, rauwer), rechts warm (eerder roosterstroom, ronder). Mix maakt het parallel. Drv+ (CV) telt op bij Drive. Stereo: twee gelijke kanalen; alleen In L = mono naar beide. Vier keer overbemonsterd. Een eigen model op gedrag en topologie, geen simulatie per onderdeel. Firmware tp_mmb_tube, mmb_dsp::Tube; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_freqshift",
   "categoryId": "effect",
   "variant": "Frequency shifter (Bode)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "shift_cv",
     "name": "Shift+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Up",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "down",
     "name": "Down",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "shift",
     "label": "Shift",
     "min": -1,
     "max": 1,
     "defaultValue": 0.2,
     "size": "large",
     "color": "#34d399",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "0",
       "1": "+",
       "-1": "−"
      }
     }
    },
    {
     "kind": "switch",
     "id": "range",
     "label": "Range",
     "positions": [
      "5 Hz",
      "50",
      "500",
      "5 k"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "fbk",
     "label": "Fbk",
     "min": 0,
     "max": 0.95,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Frequency shifter naar Bode: schuift elke frequentie hetzelfde aantal hertz op. Dat is iets anders dan een pitch-shifter, die vermenigvuldigt: bij +100 Hz wordt 200/400/600 Hz niet 300/600/900 maar 300/500/700. De boventonen staan dan niet meer in een hele verhouding: klokachtig, metalig. Shift maal Range is de verschuiving (Range 5 Hz voor trage, eindeloos doorlopende zwevingen; 50 en 500 voor ontstemmen en klokken; 5 k voor ringmod-achtig geweld). Up is het mengsel van droog en de omhoog geschoven kant (Mix), Down de andere kant: zet Up links en Down rechts en een klein beetje Shift geeft een breed, draaiend stereobeeld. Fbk stuurt de geschoven klank terug de ingang in: elke ronde schuift hij verder, een spiraal van zijbanden. Shift+ telt op bij de knop (een LFO erop geeft vibrato dat de boventonen uit elkaar trekt). Techniek: enkelzijbandmodulatie met twee all-pass-ketens die 90 graden verschillen; de ongewenste zijband ligt van 40 Hz tot 18 kHz meer dan 44 dB lager (gemeten). Firmware tp_mmb_freqshift, mmb_dsp::FreqShifter; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_acid",
   "categoryId": "vco",
   "variant": "Acid (303-stijl basstem)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "accent",
     "name": "Acc",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "slide",
     "name": "Slide",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "cutoff_cv",
     "name": "Cut+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "env",
     "name": "Env",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "tune",
     "label": "Tune",
     "min": -24,
     "max": 24,
     "defaultValue": 0,
     "size": "small",
     "color": "#111827",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 0,
     "max": 1,
     "defaultValue": 0.35,
     "size": "medium",
     "color": "#111827",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Reso",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "medium",
     "color": "#111827",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "envmod",
     "label": "Env mod",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "medium",
     "color": "#111827",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0.1,
     "max": 3,
     "defaultValue": 0.4,
     "taper": "log",
     "size": "small",
     "color": "#111827",
     "style": "generic",
     "unit": "s"
    },
    {
     "kind": "switch",
     "id": "wave",
     "label": "Wave",
     "positions": [
      "Saw",
      "Sqr"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "accent",
     "label": "Accent",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "medium",
     "color": "#dc2626",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#111827",
     "style": "generic"
    }
   ],
   "notes": "Complete basstem naar de TB-303: één oscillator (zaag of blok), een vierpolig ladderfilter dat hard piept maar net niet zelf gaat zingen, en een filter-envelope met alleen Decay. Het karakter komt van twee gate-ingangen die bij het begin van elke noot gelezen worden. Acc (accent): de noot is luider, de filter-envelope kort en hij opent verder; een tweede, tragere schakeling telt opeenvolgende accenten bij elkaar op, zodat het filter bij een rij accenten per noot hoger klimt (de knop Accent bepaalt hoeveel). Slide: de toonhoogte glijdt in ongeveer 60 ms naar de volgende noot en de envelopes slaan niet opnieuw aan (gebonden noot); houd Slide hoog over de nootgrens heen. Het patroon maak je met de sequencer (V/Oct + Gate); hang Acc en Slide aan een tweede rij, Euclid, Turing of Branches en het wordt een acid-lijn die zichzelf varieert. Draai tijdens het spelen aan Cutoff, Reso en Env mod: dat is het instrument. Tune staat in halve tonen; een baslijn wil −12 of −24. Env is de filter-envelope als CV. Eigen model naar de topologie van het apparaat, op het oor; geen simulatie per onderdeel. Solo ▾ → Acid jam speelt een lijn. Firmware tp_mmb_acid, mmb_dsp::Acid; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_mixtur",
   "categoryId": "vco",
   "variant": "Mixtur (Trautonium-stem)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "press",
     "name": "Press",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "sub_cv",
     "name": "Sub+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "form_cv",
     "name": "Form+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "amp",
     "name": "Amp",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5e6c8",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5e6c8",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "curve",
     "label": "Lamp",
     "min": 0,
     "max": 1,
     "defaultValue": 0.55,
     "size": "small",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "unrest",
     "label": "Unrest",
     "min": 0,
     "max": 1,
     "defaultValue": 0.25,
     "size": "small",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "glide",
     "label": "Glide",
     "min": 0,
     "max": 2000,
     "defaultValue": 0,
     "size": "small",
     "color": "#f5e6c8",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "div1",
     "label": "Div",
     "min": 1,
     "max": 24,
     "defaultValue": 2,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "div2",
     "label": "Div",
     "min": 1,
     "max": 24,
     "defaultValue": 3,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "div3",
     "label": "Div",
     "min": 1,
     "max": 24,
     "defaultValue": 4,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "div4",
     "label": "Div",
     "min": 1,
     "max": 24,
     "defaultValue": 5,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "main",
     "label": "Main",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sub1",
     "label": "Sub 1",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sub2",
     "label": "Sub 2",
     "min": 0,
     "max": 1,
     "defaultValue": 0.45,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sub3",
     "label": "Sub 3",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sub4",
     "label": "Sub 4",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "formant",
     "label": "Formant",
     "positions": [
      "Uit",
      "A",
      "E",
      "I",
      "O",
      "U"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "fshift",
     "label": "Shift",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#93c5fd",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "freso",
     "label": "Reso",
     "min": 0,
     "max": 1,
     "defaultValue": 0.55,
     "size": "small",
     "color": "#93c5fd",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fmix",
     "label": "Form mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#93c5fd",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "noise",
     "label": "Noise",
     "min": 0,
     "max": 1,
     "defaultValue": 0.03,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "dyn",
     "label": "Dyn",
     "positions": [
      "Vel",
      "Press"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Att",
     "min": 0.5,
     "max": 2000,
     "defaultValue": 8,
     "taper": "log",
     "size": "small",
     "color": "#f5e6c8",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Rel",
     "min": 1,
     "max": 5000,
     "defaultValue": 120,
     "taper": "log",
     "size": "small",
     "color": "#f5e6c8",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f5e6c8",
     "style": "generic"
    }
   ],
   "notes": "Een stem naar het Mixtur-Trautonium van Oskar Sala (bekend van The Birds). Drie dingen maken het geluid. (1) Een glimlamp-oscillator: een condensator laadt op en ontlaadt in één klap door een neonlamp, een zaagtand met een gebogen flank en een harde val; Lamp = hoe krom die laadcurve is, Unrest = de kleine onrust per periode van een echte lamp. (2) Ondertonen in plaats van boventonen: vier delers tellen de perioden van de hoofdtoon en geven f/Div (1..24), exact in fase met de hoofdtoon. De mengverhouding van Main en Sub 1–4 is een mixtuur: een akkoord uit de ondertoonreeks (bijv. Div 2-3-4-5 = de grondtoon met een octaaf, een kwint en een terts daaronder) dat meeschuift met de toonhoogte. Sub+ (CV) schaalt de vier ondertonen samen, zoals Salas pedaal. (3) Vaste formantfilters: drie bandfilters op de klinker A, E, I, O of U die níét meebewegen met de toonhoogte; daardoor klinkt hij als een stem of een blaasinstrument en verkleurt hij als je over het bereik glijdt. Shift schuift de drie samen, Reso maakt ze scherper, Form mix mengt droog en gefilterd, Form+ (CV) glijdt door de klinkerrij. Dyn: Vel = de aanslag van de toets, Press = continue druk (de draad van het instrument; MIDI-aftertouch of een lint met drukmeting). Glide maakt de toonhoogte traploos voor wie op toetsen speelt. Het instrument had twee manualen: twee modules, of een PolyGroup ×2. Amp is de dynamiek als CV. Eigen model naar de beschrijvingen, op het oor. Firmware tp_mmb_mixtur, mmb_dsp::Mixtur; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_rungler",
   "categoryId": "vco",
   "variant": "Rungler (Benjolin-stijl chaos)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "rate_cv",
     "name": "Rate B",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "cutoff_cv",
     "name": "Cut+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "tri_a",
     "name": "Tri A",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "rungler",
     "name": "Rung",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "tri_b",
     "name": "Tri B",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "pulse_b",
     "name": "Pls B",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "pwm",
     "name": "PWM",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "freq_a",
     "label": "Freq A",
     "min": 0.5,
     "max": 5000,
     "defaultValue": 110,
     "taper": "log",
     "size": "medium",
     "color": "#a78bfa",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "run_a",
     "label": "Run A",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "run_b",
     "label": "Run B",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "freq_b",
     "label": "Freq B",
     "min": 0.05,
     "max": 2000,
     "defaultValue": 3,
     "taper": "log",
     "size": "medium",
     "color": "#a78bfa",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "cross_a",
     "label": "B→A",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "loop",
     "label": "Loop",
     "defaultValue": false
    },
    {
     "kind": "knob",
     "id": "cross_b",
     "label": "A→B",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 12000,
     "defaultValue": 900,
     "taper": "log",
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Res",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "sweep",
     "label": "Sweep",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Chaotische stem naar de Benjolin van Rob Hordijk. Twee oscillatoren (A hoorbaar, B meestal traag) en daartussen de rungler: een schuifregister van acht bits dat door de puls van B geklokt wordt en de puls van A als data neemt. De laatste drie bits vormen een getrapte spanning van acht niveaus, en die spanning verstemt de oscillatoren die hem maken (Run A, Run B). Dat is een kring zonder begin: het gedrag loopt van vaste lussen via patronen die bijna herhalen tot ruis, afhankelijk van een paar knoppen. Hordijk noemde het getrapte chaos. Loop aan: het register voert alleen zijn eigen laatste bit terug en herhaalt (acht stappen); uit: nieuwe data van A komt erbij. B→A en A→B laten de driehoek van de een de ander verstemmen. Het geluid (Out) is een pulsgolf uit een vergelijker (driehoek A boven driehoek B) door een filter waarvan de cutoff met de rungler mee springt (Sweep); PWM is die pulsgolf zonder filter, Tri A de kale oscillator. Rung is de rungler zelf als CV (0..1): een getrapte modulator die bij de klank hoort, voor elders in de patch (via de Quantizer wordt het een melodie). Tri B en Pls B geven oscillator B als LFO en klok. V/Oct stemt A. Begin met Freq B rond 3 Hz en draai aan Run A. Niet bandbegrensd; dat hoort bij het instrument. Firmware tp_mmb_rungler, mmb_dsp::Rungler; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_organ",
   "categoryId": "vco",
   "variant": "Organ (tonewheel, trekstangen)",
   "ports": [
    {
     "id": "voct_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_9",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_10",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_11",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_12",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_9",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_10",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_11",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_12",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "swell",
     "name": "Swell",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "slider",
     "id": "d16",
     "label": "16'",
     "min": 0,
     "max": 8,
     "defaultValue": 8,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d513",
     "label": "5⅓'",
     "min": 0,
     "max": 8,
     "defaultValue": 8,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d8",
     "label": "8'",
     "min": 0,
     "max": 8,
     "defaultValue": 8,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d4",
     "label": "4'",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d223",
     "label": "2⅔'",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d2",
     "label": "2'",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d135",
     "label": "1⅗'",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d113",
     "label": "1⅓'",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "d1",
     "label": "1'",
     "min": 0,
     "max": 8,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 30,
     "style": "mini-fader"
    },
    {
     "kind": "switch",
     "id": "perc",
     "label": "Perc",
     "positions": [
      "Uit",
      "2e",
      "3e"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "toggle",
     "id": "perc_fast",
     "label": "Fast",
     "defaultValue": true
    },
    {
     "kind": "toggle",
     "id": "perc_soft",
     "label": "Soft",
     "defaultValue": false
    },
    {
     "kind": "switch",
     "id": "vib",
     "label": "Vib/Cho",
     "positions": [
      "Uit",
      "V1",
      "V2",
      "V3",
      "C1",
      "C2",
      "C3"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "click",
     "label": "Click",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "leak",
     "label": "Leak",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Tonewheel-orgel met trekstangen, gebouwd zoals de generator van een elektromechanisch orgel werkt en niet als negen sinussen per toets. Er draaien 91 toonwielen, altijd. Een toets maakt geen toon maar tapt negen wielen af (de voetmaten 16′, 5⅓′, 8′, 4′, 2⅔′, 2′, 1⅗′, 1⅓′, 1′) en de trekstangen (0..8, ongeveer 3 dB per stand) bepalen hoeveel van elk. Daar komt het karakter vandaan: twee toetsen die hetzelfde wiel aftappen krijgen dezelfde sinus in fase, dus het orgel zweeft niet met zichzelf; bovenin zijn de wielen op en vouwen de hoogste voetmaten een octaaf terug (foldback); en omdat de wielen doorlopen sluit een toets op een willekeurig punt van de golf: de key click (Click). Perc: percussie op de 2e of 3e harmonische, Fast of traag, Soft of normaal (normaal zet de trekstangen iets terug, zoals het origineel). Er is één percussie-envelope voor het hele klavier en hij slaat pas opnieuw aan als alle toetsen los zijn: legato spelen geeft alleen op de eerste noot een tik. Vib/Cho: scanner-vibrato V1..V3, of C1..C3 met het droge signaal erbij (het klassieke chorus). Leak laat wielen die in de kast naast elkaar zitten in elkaar lekken. Swell telt op bij Level: zet Level op 0 en een expressiepedaal (MIDI-IN CC) op Swell voor een zwelpedaal. Bekende registraties: 888000000 (jazz, met Perc 3e), 888888888 (vol), 838000000 (gospel-bas), 006876540 (fluitig). Twaalf toetsen tegelijk: Poly ▾ → Organ ×12 zet MIDI-in, het orgel en de ROTARY erachter klaar; de draaiende luidspreker en zijn buizenversterker horen erbij. De toonhoogte wordt op halve tonen afgerond. Firmware tp_mmb_organ, mmb_dsp::Tonewheel; in de simulator draait dezelfde code als wasm.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Toets",
     "count": 12,
     "portIds": [
      "voct",
      "gate"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_martenot",
   "categoryId": "vco",
   "variant": "Martenot (Ondes Martenot-stem)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "press",
     "name": "Touche",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "vib_cv",
     "name": "Vib+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "amp",
     "name": "Amp",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "glide",
     "label": "Glide",
     "min": 0,
     "max": 2000,
     "defaultValue": 0,
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "vib",
     "label": "Vib",
     "min": 0,
     "max": 1,
     "defaultValue": 0.15,
     "size": "small",
     "color": "#fbbf24",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "vib_rate",
     "label": "Rate",
     "min": 0.5,
     "max": 12,
     "defaultValue": 5.5,
     "taper": "log",
     "size": "small",
     "color": "#fbbf24",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "onde",
     "label": "O",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "creux",
     "label": "C",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "gambe",
     "label": "G",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "nasillard",
     "label": "N",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "octaviant",
     "label": "8",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "souffle",
     "label": "S",
     "min": 0,
     "max": 1,
     "defaultValue": 0.05,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bright",
     "label": "Bright",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#d6c4a0",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "touche",
     "label": "Volume",
     "positions": [
      "Klavier",
      "Touche"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Att",
     "min": 0.5,
     "max": 2000,
     "defaultValue": 6,
     "taper": "log",
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Rel",
     "min": 1,
     "max": 5000,
     "defaultValue": 250,
     "taper": "log",
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic"
    }
   ],
   "notes": "Een stem naar de Ondes Martenot (Maurice Martenot, 1928; Messiaens Turangalîla, Jonny Greenwood). Een bijna zuivere toon met de tiroir, de la met klankschakelaars, hier als mengknoppen die je kunt combineren: O (onde, de zuivere golf), C (creux, hol: alleen oneven boventonen), G (gambe, strijkend en rijk), N (nasillard, neuzig), 8 (octaviant, het octaaf erbij) en S (souffle, adem rond de toonhoogte). Volume: Klavier = de toets met zijn aanslag, druk zwelt erbovenop; Touche = zoals het instrument, de druktoets onder de linkerhand maakt het volume en de toetsen (of de ring aan de draad, of het lint van het schermtoetsenbord) kiezen alleen de toonhoogte: zonder druk klinkt er niets. Hang Touche aan aftertouch (Press van MIDI-IN). Vib is het vibrato dat je maakt door de toets opzij te wiegen; Vib+ (het modwiel) zet er meer bij. Glide is het glijden van de ring. Bright: hoe helder de toon de kast in gaat. De luidsprekers (Principal, Palme met meetrillende snaren, Métallique met een gong) zijn een eigen module erachter: DIFFUSEUR. Eigen model naar de beschrijvingen, op het oor. Firmware tp_mmb_martenot, mmb_dsp::Martenot; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_diffuseur",
   "categoryId": "effect",
   "variant": "Diffuseur (Martenot-luidsprekers)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "mix_cv",
     "name": "Mix+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "type",
     "label": "Kast",
     "positions": [
      "Principal",
      "Palme",
      "Métallique"
     ],
     "defaultIndex": 1
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "ring",
     "label": "Ring",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#fde68a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "gong",
     "label": "Gong",
     "min": 60,
     "max": 600,
     "defaultValue": 196,
     "taper": "log",
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 2,
     "defaultValue": 1,
     "size": "small",
     "color": "#f3e3c3",
     "style": "generic"
    }
   ],
   "notes": "De luidsprekers van de Ondes Martenot, elk met een eigen klank. Principal: de gewone kast, wat laag en wat hoog eraf. Palme: een liervormige kast met twaalf snaren, chromatisch gestemd vanaf C3, die meetrillen: een zingende halo die na de noot doorklinkt; Tune stemt de snaren om, Ring is hoe lang ze naklinken. Métallique: een gong als luidsprekermembraan; metalen, niet-harmonische boventonen die niet met de toon meegaan; Gong is de grondtoon van de gong, Ring hoe lang hij zingt. Mix mengt de kast met de directe klank (Principal heeft geen menging), Mix+ telt erbij op. Eén kast voor alle stemmen: zet hem na de stemmen, en ook achter iets anders (een piano door de palme). De vierde luidspreker, Résonance (veergalm), is REVERB in Spring-stand erachter. Eigen model op het oor. Firmware tp_mmb_diffuseur, mmb_dsp::Diffuseur; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_arp",
   "categoryId": "sequencer",
   "variant": "Arp (arpeggiator)",
   "ports": [
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "pitch",
     "name": "Pitch",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "step",
     "name": "Step",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Up",
      "Down",
      "Up/Down",
      "Random",
      "Played"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "octaves",
     "label": "Oct",
     "min": 1,
     "max": 4,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 20,
     "max": 300,
     "defaultValue": 120,
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "switch",
     "id": "division",
     "label": "Div",
     "positions": [
      "1/4",
      "1/8",
      "1/8T",
      "1/16",
      "1/16T",
      "1/32"
     ],
     "defaultIndex": 3
    },
    {
     "kind": "knob",
     "id": "gate",
     "label": "Gate",
     "min": 0.05,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "channel",
     "label": "Ch",
     "min": 0,
     "max": 16,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "step": 1,
     "ticks": {
      "labels": {
       "0": "alle"
      }
     }
    },
    {
     "kind": "toggle",
     "id": "latch",
     "label": "Latch",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "extclock",
     "label": "ExtClk",
     "defaultValue": false
    }
   ],
   "notes": "Arpeggiator, het bruikbare deel van Mutable Yarns. Hoort zelf de toetsen (net als MIDI-IN: elk MIDI-bericht gaat naar elke MIDI-IN en elke ARP) en speelt de toetsen die je vasthoudt als geklokte reeks op één stem: Pitch (V/Oct), Gate en Vel, zoals de mono-uitgangen van MIDI-IN. Mode: Up, Down, Up/Down (heen en terug, de uitersten één keer), Random (nooit twee keer dezelfde) of Played (de volgorde waarin je aansloeg). Oct herhaalt de reeks één tot vier octaven hoger. Latch: de reeks blijft spelen na het loslaten; een nieuwe aanslag na het loslaten begint een nieuwe. Klok intern (Tempo in bpm, Div = notenwaarde) of ExtClk aan + Clk: een stap per flank. De eerste aanslag uit stilstand speelt meteen. Gate is de nootlengte als deel van de stap; er blijft altijd een korte pauze, zodat elke noot opnieuw aanslaat. Step pulseert op elke stap (ook zonder toetsen), Rst begint de reeks opnieuw. Ch = MIDI-kanaal (0 = alle). Firmware tp_mmb_arp; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_cmi",
   "categoryId": "vco",
   "variant": "CMI (Fairlight-golfvormsynthese)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "gate",
     "name": "Gate",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "seg_cv",
     "name": "Seg+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "pos",
     "name": "Pos",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "coarse",
     "label": "Coarse",
     "min": -36,
     "max": 36,
     "defaultValue": 0,
     "size": "small",
     "color": "#1f2937",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "fine",
     "label": "Fine",
     "min": -100,
     "max": 100,
     "defaultValue": 0,
     "size": "small",
     "color": "#1f2937",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#1f2937",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "seg",
     "label": "Seg",
     "min": 5,
     "max": 1000,
     "defaultValue": 40,
     "taper": "log",
     "size": "medium",
     "color": "#16a34a",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "smooth",
     "label": "Smooth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#16a34a",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "loop",
     "label": "Loop",
     "min": 1,
     "max": 32,
     "defaultValue": 24,
     "size": "medium",
     "color": "#16a34a",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "attack",
     "label": "Att",
     "min": 0.5,
     "max": 2000,
     "defaultValue": 4,
     "taper": "log",
     "size": "small",
     "color": "#1f2937",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "release",
     "label": "Rel",
     "min": 1,
     "max": 5000,
     "defaultValue": 300,
     "taper": "log",
     "size": "small",
     "color": "#1f2937",
     "style": "generic",
     "unit": "ms"
    },
    {
     "kind": "knob",
     "id": "filter",
     "label": "Filter",
     "min": 1,
     "max": 15,
     "defaultValue": 8,
     "size": "small",
     "color": "#1f2937",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       8,
       15
      ]
     }
    }
   ],
   "notes": "Een stem naar de golfvormsynthese van de Fairlight CMI (Page 4/5). Uit een harmonischenprofiel — tot 32 harmonischen, elk met een eigen verloop over 32 segmenten — rekent de editor 32 golfvormen van 128 samples (8 bit) en stuurt die naar deze stem; die speelt ze na elkaar af, zodat de klank door de noot heen beweegt. Seg: hoe lang elk segment duurt. Smooth: 0 = hard van golfvorm wisselen zoals de CMI, hoger = laten overvloeien. Loop: zolang je de toets vasthoudt loopt hij na segment 32 rond vanaf dit segment (32 = op het laatste blijven); loslaten speelt door naar het eind. Afspelen zoals de CMI: zonder interpolatie (de stem klokt op 128 × de grondtoon), 8 bit, door een filter dat die klok volgt. Filter (1–15) zoals Page 7 van de CMI: hoger = helderder, 8 = standaard, 15 = filter uit (dan hoor je de spiegelingen van de 8-bit-klok). Seg+ schuift de positie (±1 = ±16 segmenten); Pos is de positie als CV. Zonder profiel speelt hij een ingebouwde koperklank. Firmware tp_mmb_cmi, mmb_dsp::Cmi; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_sem",
   "categoryId": "vcf",
   "variant": "SEM-filter (12 dB, LP→notch→HP)",
   "ports": [
    {
     "id": "cutoff_cv",
     "name": "F CV",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mode_cv",
     "name": "Mode+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "bp",
     "name": "BP",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "cutoff",
     "label": "Cutoff",
     "min": 20,
     "max": 18000,
     "defaultValue": 1000,
     "taper": "log",
     "size": "large",
     "color": "#38bdf8",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Res",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "medium",
     "color": "#38bdf8",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mode",
     "label": "Mode",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "LP",
       "1": "HP",
       "0.5": "notch"
      }
     }
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.2,
     "size": "small",
     "color": "#ef4444",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "cv_amt",
     "label": "CV amt",
     "min": 0,
     "max": 7,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "oct"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Het tweepolige state-variable filter van de Oberheim SEM. Waar een ladder (Moog, ACID) steil is en bij resonantie het laag wegdrukt, is dit filter mild: 12 dB per octaaf, een resonantie die kleurt maar niet zelf gaat zingen, en het laag blijft staan. Het bijzondere is Mode: die loopt traploos van laagdoorlaat via een notch (laag en hoog samen, met een gat op de cutoff) naar hoogdoorlaat. Een LFO op Mode+ laat het filter van karakter veranderen in plaats van alleen open en dicht gaan. De bandpass heeft een eigen uitgang (BP): zet Out links en BP rechts voor een breed beeld. F CV is in octaven (±1 maal CV amt). Drive stuurt het filter harder aan; de verzadiging zit in het filter zelf. Solo ▾ → SEM sweep laat het horen. Firmware tp_mmb_sem, mmb_dsp::Sem; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_complex",
   "categoryId": "vco",
   "variant": "Complex-oscillator (259-stijl)",
   "ports": [
    {
     "id": "voct",
     "name": "V/Oct",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "fm_cv",
     "name": "FM+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "timbre_cv",
     "name": "Tim+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "mod",
     "name": "Mod",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "ratio",
     "label": "Ratio",
     "min": 0.01,
     "max": 16,
     "defaultValue": 2,
     "size": "medium",
     "color": "#a78bfa",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mod_wave",
     "label": "Mod",
     "positions": [
      "Sin",
      "Tri",
      "Saw"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "pitch",
     "label": "Pitch",
     "min": -48,
     "max": 48,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi",
     "step": 1
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fm",
     "label": "FM",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "am",
     "label": "AM",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tmod",
     "label": "T mod",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#e11d48",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "symmetry",
     "label": "Sym",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "timbre",
     "label": "Timbre",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "large",
     "color": "#fb923c",
     "style": "generic"
    }
   ],
   "notes": "Complex-oscillator naar de Buchla 259: twee oscillatoren in één module. De modulatie-oscillator (frequentie = Ratio maal de grondtoon; hele getallen blijven harmonisch, daartussen wordt het klokachtig) bewerkt de hoofdoscillator op drie manieren, elk met een eigen index: FM (de toonhoogte, lineair en door nul heen), AM (hoe hard de sinus de vouwer in gaat) en T mod (hoe ver de vouwer open staat). De hoofdoscillator is een sinus die door het timbre-circuit gaat, de vijf vouwcellen van de 259: Timbre 0 is een zuivere sinus, verder open vouwt hij en komen er boventonen bij. Sym voegt even boventonen toe. Samen met een low-pass gate is dit de West Coast-stem: geen filter, de boventonen komen van FM en vouwen. Zet een envelope op Tim+ (helderder bij de aanslag) en een tweede op FM+. Mod is de modulatie-oscillator los. Vier keer overbemonsterd. Solo ▾ → Buchla-stem zet hem met Slope en LPG onder het klavier. Firmware tp_mmb_complex, mmb_dsp::ComplexOsc; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_wah",
   "categoryId": "effect",
   "variant": "Wah (pedaal / auto / LFO, + klinkers)",
   "ports": [
    {
     "id": "in",
     "name": "In",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "pedal_cv",
     "name": "Ped+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "env",
     "name": "Env",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "pedal",
     "label": "Pedal",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "large",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "Pedal",
      "Auto↑",
      "Auto↓",
      "LFO"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "switch",
     "id": "type",
     "label": "Type",
     "positions": [
      "Wah",
      "Vowel"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "sens",
     "label": "Sens",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "rate",
     "label": "Rate",
     "min": 0.05,
     "max": 12,
     "defaultValue": 2,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "q",
     "label": "Q",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Wah: een smalle piek die door het midden van het spectrum schuift. Type Wah is het inductor-wahpedaal (Cry Baby-familie): de piek loopt van ongeveer 400 Hz (hak) naar 2,2 kHz (teen). Type Vowel zet er twee pieken neer die samen een klinker vormen en met het pedaal van OE via O, A en E naar IE lopen: een sprekend filter. Mode bepaalt wie het pedaal bedient. Pedal: de knop plus Ped+ (een expressiepedaal via MIDI-IN CC, een envelope of een LFO van buiten). Auto↑: een envelope-volger duwt het pedaal open, harder spelen is helderder (touch-wah, funk); Sens is de gevoeligheid en de knop Pedal de ruststand. Auto↓: andersom, harder spelen is doffer. LFO: een eigen sinus (Rate) tussen de knopstand en helemaal open. Q maakt de piek smaller en luider. Env is de envelope-volger als CV. Firmware tp_mmb_wah, mmb_dsp::Wah; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_ensemble",
   "categoryId": "effect",
   "variant": "Ensemble (string-machine-chorus)",
   "ports": [
    {
     "id": "depth_cv",
     "name": "D+",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "in_l",
     "name": "L",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "in_r",
     "name": "R",
     "signalType": "audio",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "depth",
     "label": "Depth",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "large",
     "color": "#2dd4bf",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "slow",
     "label": "Slow",
     "min": 0.1,
     "max": 3,
     "defaultValue": 0.6,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "fast",
     "label": "Fast",
     "min": 2,
     "max": 12,
     "defaultValue": 6,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "tone",
     "label": "Tone",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "mix",
     "label": "Mix",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Ensemble: het driefasige chorus van de string machines (Solina-familie). Een gewone chorus heeft één vertragingslijn met één LFO en je hoort de zweving op en neer gaan. Hier zijn het er drie, gemoduleerd door dezelfde twee LFO’s (Slow rond 0,6 Hz en Fast rond 6 Hz) maar steeds een derde slag verschoven. De drie fasen vullen elkaar altijd aan, dus er is geen moment waarop de modulatie stilvalt of omkeert: de klank wordt breed en dik zonder hoorbaar te golven. Een kale zaag wordt een strijkorkest; een orgel of elektrische piano krijgt ruimte. Depth is de diepte van beide LFO’s, Tone de bandbreedte van de emmertjesgeheugens (lager = doffer, ouder). Mono in geeft stereo uit (L en R worden gesommeerd). Firmware tp_mmb_ensemble, mmb_dsp::Ensemble; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_epiano",
   "categoryId": "vco",
   "variant": "E-piano (tine / reed)",
   "ports": [
    {
     "id": "sustain",
     "name": "Sust",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "voct_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_9",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_10",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_11",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_12",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_9",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_10",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_11",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_12",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_1",
     "name": "1",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_2",
     "name": "2",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_3",
     "name": "3",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_4",
     "name": "4",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_5",
     "name": "5",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_6",
     "name": "6",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_7",
     "name": "7",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_8",
     "name": "8",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_9",
     "name": "9",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_10",
     "name": "10",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_11",
     "name": "11",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "vel_12",
     "name": "12",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "type",
     "label": "Type",
     "positions": [
      "Tine",
      "Reed"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "timbre",
     "label": "Timbre",
     "min": 0,
     "max": 1,
     "defaultValue": 0.35,
     "size": "large",
     "color": "#fbbf24",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bell",
     "label": "Bell",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay",
     "label": "Decay",
     "min": 0,
     "max": 1,
     "defaultValue": 0.5,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "drive",
     "label": "Drive",
     "min": 0,
     "max": 1,
     "defaultValue": 0.4,
     "size": "medium",
     "color": "#ef4444",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tremolo",
     "label": "Tremolo",
     "min": 0,
     "max": 1,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#2dd4bf",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "trem_rate",
     "label": "Rate",
     "min": 0.5,
     "max": 12,
     "defaultValue": 4.5,
     "taper": "log",
     "size": "small",
     "color": "#2dd4bf",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "knob",
     "id": "damper",
     "label": "Damper",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Elektrische piano als model, zonder samples. De klank zit maar voor de helft in wat er trilt; de andere helft is hoe de pickup dat ziet, en die twee zijn hier apart gebouwd. Wat trilt: per toets een grondtoon die traag uitsterft en een hoge, niet-harmonische boventoon die snel wegsterft (Bell): de tik in de aanslag. Harder aanslaan geeft meer uitwijking en verhoudingsgewijs meer bel. Type Tine (Rhodes-familie): een magnetische pickup. Timbre is de plek van de tine voor de pickup, de stelschroef waarmee een technicus het instrument afregelt. Recht ervoor (0) passeert de tine het midden twee keer per trilling en klinkt vooral het octaaf: dun en glazig. Ernaast (hoger) komt de grondtoon terug: vol en rond. Drive is hoe dicht de tine bij de pickup staat: verder open wordt hij bij hard spelen rauwer en grommend. Type Reed (Wurlitzer-familie): een stalen tong voor een condensatorplaat; holler, nasaler, en de noot sterft sneller uit. Decay is de uitklinktijd (hoge noten korter, zoals het instrument). Tremolo is het heen-en-weer tussen links en rechts van het koffermodel. Damper is hoe snel de vilten demper een losgelaten toets stilt (0 = geen dempers: alles klinkt vrij uit; 1 = in ~15 ms); de bel wordt mee gedempt. Sust is het sustainpedaal (gate, bijvoorbeeld MIDI-IN CC2# = 64): zolang het hoog is klinken losgelaten toetsen vrij uit, en bij loslaten vallen de dempers op alle toetsen die niet meer ingedrukt zijn. Velocity doet veel: zonder kabel op Vel krijgt elke noot een gemiddelde aanslag. Twaalf toetsen tegelijk: Poly ▾ → E-piano ×12. Zet er de ENSEMBLE, de PHASER of de TREMOLO achter. Eigen model op meting, geen kopie van een bepaald exemplaar. Firmware tp_mmb_epiano, mmb_dsp::EPiano; in de simulator draait dezelfde code als wasm.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Toets",
     "count": 12,
     "portIds": [
      "voct",
      "gate",
      "vel"
     ],
     "controlIds": []
    }
   ]
  },
  {
   "id": "tp_mmb_pads",
   "categoryId": "utility",
   "variant": "Pads (4 drukknoppen: gate + trigger)",
   "ports": [
    {
     "id": "gate_1",
     "name": "G1",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "gate_2",
     "name": "G2",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "gate_3",
     "name": "G3",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "gate_4",
     "name": "G4",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "trig_1",
     "name": "T1",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "trig_2",
     "name": "T2",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "trig_3",
     "name": "T3",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "trig_4",
     "name": "T4",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "any",
     "name": "Any",
     "signalType": "gate",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "button",
     "id": "b1",
     "label": "1",
     "momentary": true,
     "size": "large"
    },
    {
     "kind": "button",
     "id": "b2",
     "label": "2",
     "momentary": true,
     "size": "large"
    },
    {
     "kind": "button",
     "id": "b3",
     "label": "3",
     "momentary": true,
     "size": "large"
    },
    {
     "kind": "button",
     "id": "b4",
     "label": "4",
     "momentary": true,
     "size": "large"
    },
    {
     "kind": "toggle",
     "id": "latch1",
     "label": "Latch",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "latch2",
     "label": "Latch",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "latch3",
     "label": "Latch",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "latch4",
     "label": "Latch",
     "defaultValue": false
    }
   ],
   "notes": "Vier grote drukknoppen om een gate- of CV-ingang met de muis (of een vinger) te proberen: de Fast-ingang van de ROTARY, de Ping van de LPG, Accent en Slide van ACID, een Reset of een envelope. G1..G4 is hoog zolang je de knop indrukt (een vlugge klik duurt minstens 100 ms); T1..T4 geeft bij elke druk een puls van 10 ms. Latch aan: de gate wisselt bij elke druk (aan, uit), voor een schakelaar die blijft staan. Any is hoog als een van de vier gates hoog is. Op de Teensy komen de knoppen via de editor (live control) binnen. Firmware tp_mmb_pads; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_faders",
   "categoryId": "utility",
   "variant": "Faders (4 schuiven als CV)",
   "ports": [
    {
     "id": "out_1",
     "name": "1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_2",
     "name": "2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_3",
     "name": "3",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_4",
     "name": "4",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "slider",
     "id": "v1",
     "label": "1",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 44,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "v2",
     "label": "2",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 44,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "v3",
     "label": "3",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 44,
     "style": "mini-fader"
    },
    {
     "kind": "slider",
     "id": "v4",
     "label": "4",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "orientation": "v",
     "lengthMm": 44,
     "style": "mini-fader"
    },
    {
     "kind": "switch",
     "id": "range",
     "label": "Range",
     "positions": [
      "×1",
      "×2",
      "×5"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "slew",
     "label": "Slew",
     "min": 0,
     "max": 2000,
     "defaultValue": 10,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    }
   ],
   "notes": "Vier schuiven, elk een CV-uitgang van 0 tot 1: om een CV-ingang met de hand te proberen (de cutoff van een filter, Fold van de FOLDER, Pedal van de WAH, Mode van het SEM-filter). Range vermenigvuldigt: ×1, ×2 of ×5 (×5 op een V/Oct-ingang is vijf octaven per volle slag). Slew strijkt een sprong glad, zodat een vlugge schuif geen tik geeft; zet hem hoog voor trage overgangen. Op de Teensy komen de schuiven via de editor (live control) binnen. Firmware tp_mmb_faders; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_knobs",
   "categoryId": "utility",
   "variant": "Knobs (4 draaiknoppen als CV, ±)",
   "ports": [
    {
     "id": "out_1",
     "name": "1",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_2",
     "name": "2",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_3",
     "name": "3",
     "signalType": "cv",
     "direction": "out"
    },
    {
     "id": "out_4",
     "name": "4",
     "signalType": "cv",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "v1",
     "label": "1",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "0",
       "1": "+",
       "-1": "−"
      }
     }
    },
    {
     "kind": "knob",
     "id": "v2",
     "label": "2",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "0",
       "1": "+",
       "-1": "−"
      }
     }
    },
    {
     "kind": "knob",
     "id": "v3",
     "label": "3",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "0",
       "1": "+",
       "-1": "−"
      }
     }
    },
    {
     "kind": "knob",
     "id": "v4",
     "label": "4",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "ticks": {
      "labels": {
       "0": "0",
       "1": "+",
       "-1": "−"
      }
     }
    },
    {
     "kind": "switch",
     "id": "range",
     "label": "Range",
     "positions": [
      "×1",
      "×2",
      "×5"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "slew",
     "label": "Slew",
     "min": 0,
     "max": 2000,
     "defaultValue": 10,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ms"
    }
   ],
   "notes": "Vier draaiknoppen, elk een bipolaire CV-uitgang van −1 tot 1 (midden = 0): voor ingangen die een plus en een min kennen, zoals Shift van de FREQ SHIFT, Sym van de FOLDER, F CV van een filter of een V/Oct-ingang (Range ×5 = vijf octaven elke kant op). Slew strijkt sprongen glad. Op de Teensy komen de knoppen via de editor (live control) binnen. Firmware tp_mmb_knobs; in de simulator draait dezelfde klasse als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_rhythm",
   "categoryId": "drum",
   "variant": "Rhythm box (CR-78-presets)",
   "ports": [
    {
     "id": "start",
     "name": "Start",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "clock",
     "name": "Clk",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "reset",
     "name": "Rst",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "step",
     "name": "Step",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "bar",
     "name": "Bar",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "acc",
     "name": "Acc",
     "signalType": "gate",
     "direction": "out"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "display",
     "id": "rhythmName",
     "digits": 10,
     "style": "led-green",
     "bindTo": "rhythm",
     "lookup": [
      [
       "Rock 1",
       "Rock 2",
       "Rock 3",
       "Rock 4",
       "Disco 1",
       "Disco 2",
       "Waltz",
       "Shuffle",
       "Slow rock",
       "Swing",
       "Foxtrot",
       "Tango",
       "Boogie",
       "Enka",
       "Bossa nova"
      ]
     ],
     "text": "Rock 1",
     "size": "medium"
    },
    {
     "kind": "knob",
     "id": "rhythm",
     "label": "Rhythm",
     "min": 0,
     "max": 14,
     "defaultValue": 0,
     "size": "medium",
     "color": "#fbbf24",
     "style": "generic",
     "step": 1
    },
    {
     "kind": "switch",
     "id": "variation",
     "label": "Variation",
     "positions": [
      "A",
      "B",
      "A+B"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "tempo",
     "label": "Tempo",
     "min": 30,
     "max": 300,
     "defaultValue": 120,
     "size": "large",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "bpm"
    },
    {
     "kind": "toggle",
     "id": "run",
     "label": "Run",
     "defaultValue": true
    },
    {
     "kind": "toggle",
     "id": "extclock",
     "label": "ExtClk",
     "defaultValue": false
    },
    {
     "kind": "knob",
     "id": "accent",
     "label": "Accent",
     "min": 0,
     "max": 1,
     "defaultValue": 0.6,
     "size": "small",
     "color": "#ef4444",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "bass",
     "label": "Bass",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "snare",
     "label": "Snare",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "metal",
     "label": "Metal",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "perc",
     "label": "Perc",
     "min": 0,
     "max": 1,
     "defaultValue": 0.7,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Ritmebox met de presets van de Roland CR-78, gespeeld op dezelfde berekende CR-78-stemmen als de CR-78-module (basdrum, lage conga, lage en hoge bongo, snare, rimshot, claves, koebel, maracas, hihat, cymbal). De patronen zijn met de hand overgenomen uit het notenschrift in de CR-78 Service Notes (20 juni 1979): Rock 1–4, Disco 1–2, Waltz, Shuffle, Slow rock, Swing, Foxtrot, Tango, Boogie, Enka en Bossa nova, elk met een A- en een B-maat (Foxtrot en Tango zitten op het origineel samen op één knop: A en B). Rock 4 en de Disco-patronen zijn onzeker overgenomen; Samba, Mambo, Cha-cha, Beguine en Rhumba ontbreken nog, want die zijn in de scan niet betrouwbaar te lezen. Variation: A, B, of A+B om en om. Run start en stopt; een puls op Start wisselt ook (een voetschakelaar via PADS). Tempo is in tellen per minuut; ExtClk aan laat hem een externe tel volgen (bijvoorbeeld CLOCK Beat): de box meet de afstand tussen de tellen en verdeelt de stappen erover, ook triolen. Rst gaat terug naar het begin van maat A. Accent is hoe hard de geaccentueerde stappen eruit springen; Bass, Snare, Metal (hihat, cymbal, maracas) en Perc (bongo, conga, claves, koebel, rimshot) zijn de groepsvolumes. Step, Bar en Acc geven een puls per stap, op de één en op elk accent: synchroniseer er een sequencer of een envelope mee. Firmware tp_mmb_rhythm, mmb_dsp::RhythmBox; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_percuter",
   "categoryId": "drum",
   "variant": "Percuter (8 kanalen, 8-bit cartridges)",
   "ports": [
    {
     "id": "trig_1",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_1",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_1",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_2",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_2",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_2",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_3",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_3",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_3",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_4",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_4",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_4",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_5",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_5",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_5",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_6",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_6",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_6",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_7",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_7",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_7",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "trig_8",
     "name": "Trig",
     "signalType": "gate",
     "direction": "in"
    },
    {
     "id": "vel_8",
     "name": "Vel",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_8",
     "name": "Out",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "pitch",
     "name": "Pitch",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "knob",
     "id": "bank",
     "label": "Bank",
     "min": 0,
     "max": 15,
     "defaultValue": 0,
     "size": "medium",
     "color": "#f5a623",
     "style": "generic",
     "step": 1,
     "ticks": {
      "every": 1,
      "highlight": [
       0,
       15
      ]
     }
    },
    {
     "kind": "knob",
     "id": "tune",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "toggle",
     "id": "filter",
     "label": "Filter",
     "defaultValue": true
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "level_1",
     "label": "1",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_1",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_1",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_1",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_2",
     "label": "2",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_2",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_2",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_2",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_3",
     "label": "3",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_3",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_3",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_3",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_4",
     "label": "4",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_4",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_4",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_4",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_5",
     "label": "5",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_5",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_5",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_5",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_6",
     "label": "6",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_6",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_6",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_6",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_7",
     "label": "7",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_7",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_7",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_7",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "level_8",
     "label": "8",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "pan_8",
     "label": "Pan",
     "min": -1,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "decay_8",
     "label": "Dec",
     "min": 0,
     "max": 1,
     "defaultValue": 1,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune_8",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#9ca3af",
     "style": "generic",
     "unit": "semi"
    }
   ],
   "notes": "Acht digitale drumkanalen naar de Dynacord Percuter (1984). Op het apparaat zit in elk kanaal een cartridge: een EPROM van 8 of 16 KB met kale 8-bit geluid, afgespeeld op 12,5 of 25 kHz. Het lo-fi-karakter komt van hoe hij afspeelt, en dat doet deze module ook: zonder interpolatie (je hoort de spiegeltonen boven de halve samplefrequentie), op 8 bit, en de toonhoogte is de afspeelklok, dus hoger gestemd is ook korter. Filter aan dempt de spiegeltonen zoals de de-emphasis van de cartridge; uit is rauw. Kanaal k speelt slot k van de samplebank die Bank kiest: dezelfde banken als de SAMPLER (/mmb/banks/NN.mmbs op de Teensy, de bankbalk in de simulator). Een bank maak je van cartridge-dumps met tools/mmb-wasm/percuter-to-mmbs.mjs: één .bin per kanaal, met per cartridge zijn eigen samplefrequentie. Per kanaal: Trig (gate), Vel (aanslag 0..1; zonder kabel volle sterkte), volume, Pan, Dec (1 = het hele sample, lager = korter) en Tune, en een eigen uitgang zonder volume en pan, zoals de losse uitgangen op het apparaat. Pitch is het pitchpedaal (V/Oct, op alle kanalen), Tune de globale stemming. Op de Teensy deelt hij de bank met de sampler en de tape strip: één bank tegelijk. Firmware tp_mmb_percuter, mmb_dsp::Percuter; in de simulator draait dezelfde code als wasm.",
   "internal": true
  },
  {
   "id": "tp_mmb_synthex",
   "categoryId": "vco",
   "variant": "Synthex (8 stemmen, naar de Elka Synthex)",
   "ports": [
    {
     "id": "voct_1",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_2",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_3",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_4",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_5",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_6",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_7",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "voct_8",
     "name": "",
     "signalType": "cv",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_1",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_2",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_3",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_4",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_5",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_6",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_7",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "gate_8",
     "name": "",
     "signalType": "gate",
     "direction": "in",
     "cellGroupId": "voice"
    },
    {
     "id": "bend",
     "name": "Joy X",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "joy",
     "name": "Joy Y",
     "signalType": "cv",
     "direction": "in"
    },
    {
     "id": "out_l",
     "name": "L",
     "signalType": "audio",
     "direction": "out"
    },
    {
     "id": "out_r",
     "name": "R",
     "signalType": "audio",
     "direction": "out"
    }
   ],
   "controls": [
    {
     "kind": "switch",
     "id": "o1_oct",
     "label": "Feet",
     "positions": [
      "16'",
      "8'",
      "4'",
      "2'"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "switch",
     "id": "o1_wave",
     "label": "Wave",
     "positions": [
      "Ramp",
      "Sqr",
      "Pulse"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "o1_level",
     "label": "Volume",
     "min": 0,
     "max": 10,
     "defaultValue": 10,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "o2_oct",
     "label": "Feet",
     "positions": [
      "16'",
      "8'",
      "4'",
      "2'"
     ],
     "defaultIndex": 2
    },
    {
     "kind": "knob",
     "id": "o2_transpose",
     "label": "Transp",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "knob",
     "id": "o2_detune",
     "label": "Detune",
     "min": -50,
     "max": 50,
     "defaultValue": 6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "ct"
    },
    {
     "kind": "switch",
     "id": "o2_wave",
     "label": "Wave",
     "positions": [
      "Ramp",
      "Sqr",
      "Pulse"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "o2_level",
     "label": "Volume",
     "min": 0,
     "max": 10,
     "defaultValue": 8,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "toggle",
     "id": "sync",
     "label": "Sync",
     "defaultValue": false
    },
    {
     "kind": "toggle",
     "id": "ring",
     "label": "Ring",
     "defaultValue": false
    },
    {
     "kind": "knob",
     "id": "pw",
     "label": "PW",
     "min": 0.05,
     "max": 0.5,
     "defaultValue": 0.3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "noise",
     "label": "Noise",
     "min": 0,
     "max": 10,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "freq",
     "label": "Freq",
     "min": 0,
     "max": 10,
     "defaultValue": 6,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "res",
     "label": "Reso",
     "min": 0,
     "max": 10,
     "defaultValue": 2,
     "size": "medium",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "env_amt",
     "label": "Env",
     "min": 0,
     "max": 10,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "kbd",
     "label": "Kbd",
     "min": 0,
     "max": 10,
     "defaultValue": 3,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "switch",
     "id": "mode",
     "label": "Mode",
     "positions": [
      "LP",
      "BP",
      "HP"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "fa",
     "label": "A",
     "min": 0,
     "max": 10,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fd",
     "label": "D",
     "min": 0,
     "max": 10,
     "defaultValue": 5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fs",
     "label": "S",
     "min": 0,
     "max": 10,
     "defaultValue": 6,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "fr",
     "label": "R",
     "min": 0,
     "max": 10,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "aa",
     "label": "A",
     "min": 0,
     "max": 10,
     "defaultValue": 0.5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "ad",
     "label": "D",
     "min": 0,
     "max": 10,
     "defaultValue": 5,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "as",
     "label": "S",
     "min": 0,
     "max": 10,
     "defaultValue": 8,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "ar",
     "label": "R",
     "min": 0,
     "max": 10,
     "defaultValue": 4,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lfo_rate",
     "label": "Rate",
     "min": 0.05,
     "max": 20,
     "defaultValue": 5,
     "taper": "log",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "Hz"
    },
    {
     "kind": "switch",
     "id": "lfo_wave",
     "label": "Wave",
     "positions": [
      "Tri",
      "Sqr",
      "Saw",
      "S&H"
     ],
     "defaultIndex": 0
    },
    {
     "kind": "knob",
     "id": "lfo_osc",
     "label": "→Osc",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lfo_pw",
     "label": "→PW",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lfo_vcf",
     "label": "→VCF",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "lfo_vca",
     "label": "→VCA",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "glide",
     "label": "Glide",
     "min": 0,
     "max": 1,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    },
    {
     "kind": "knob",
     "id": "tune",
     "label": "Tune",
     "min": -12,
     "max": 12,
     "defaultValue": 0,
     "size": "small",
     "color": "#f9fafb",
     "style": "generic",
     "unit": "semi"
    },
    {
     "kind": "toggle",
     "id": "chorus",
     "label": "Chorus",
     "defaultValue": true
    },
    {
     "kind": "knob",
     "id": "level",
     "label": "Level",
     "min": 0,
     "max": 1,
     "defaultValue": 0.8,
     "taper": "exp",
     "size": "small",
     "color": "#f9fafb",
     "style": "generic"
    }
   ],
   "notes": "Polyfone stem naar de Elka Synthex (1981, ontwerp Mario Maggi), gebouwd naar het schema. Per stem twee oscillatoren; op het apparaat zijn die digitaal (tellers op 4 MHz), daarom stabiel. Golfvorm Ramp, Sqr of Pulse (met PW), voetmaat 16′ tot 2′; oscillator 2 heeft Transpose en Detune, Sync zet hem vast aan oscillator 1, Ring vervangt hem door het product van beide. De menger telt in 16 stappen, zoals de 4-bit volumes van het origineel, en heeft ruis. Het filter is het vierpolige OTA-filter van de Synthex: Mode kiest LP (24 dB), BP of HP, met Freq, Reso (tot net onder zingen), Env (de filter-envelope) en Kbd (toetsvolging). ENV F en ENV A zijn ADSR’s in knopstanden 0..10 (2 ms tot 10 s). De LFO stuurt de oscillatoren, PW, het filter en het volume; Glide, Tune, de stereochorus en Level zitten bij MASTER. Joy X buigt de toonhoogte (V/Oct), Joy Y stuurt het filter, zoals de joystick. Acht stemmen tegelijk: Poly ▾ → Synthex ×8. Eigen model naar de topologie, geen simulatie per onderdeel. Firmware tp_mmb_synthex, mmb_dsp::Synthex; in de simulator draait dezelfde code als wasm.",
   "internal": true,
   "role": "multi",
   "cellGroups": [
    {
     "id": "voice",
     "label": "Stem",
     "count": 8,
     "portIds": [
      "voct",
      "gate"
     ],
     "controlIds": []
    }
   ]
  }
 ],
 "modules": [
  {
   "id": "mod_y73fa9k",
   "typeId": "tp_mmb_ahdsr",
   "internal": true,
   "name": "MMB AHDSR",
   "brand": "MMB",
   "modelNumber": "AHDSR",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "AHDSR",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "envelope",
      "fontSize": 1.4,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "decorations": [
     {
      "kind": "rect",
      "x": 1,
      "y": 20,
      "w": 38.64,
      "h": 68,
      "color": "#0b1220"
     }
    ],
    "controlPlacements": {
     "attack": {
      "x": 4.8768,
      "y": 50
     },
     "hold": {
      "x": 12.192,
      "y": 50
     },
     "decay": {
      "x": 20.32,
      "y": 50
     },
     "sustain": {
      "x": 28.447999999999997,
      "y": 50
     },
     "release": {
      "x": 35.7632,
      "y": 50
     },
     "loop": {
      "x": 8.128,
      "y": 96
     },
     "retrig": {
      "x": 18.288,
      "y": 96
     },
     "curve": {
      "x": 30.0736,
      "y": 96
     }
    },
    "portPlacements": {
     "gate": {
      "x": 8.128,
      "y": 112,
      "labelPos": "below"
     },
     "trig": {
      "x": 20.32,
      "y": 112,
      "labelPos": "below"
     },
     "cv_out": {
      "x": 32.512,
      "y": 112,
      "labelPos": "below"
     },
     "eoc": {
      "x": 20.32,
      "y": 122,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_xartrf7",
   "typeId": "tp_mmb_lfo",
   "internal": true,
   "name": "MMB LFO",
   "brand": "MMB",
   "modelNumber": "LFO",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "LFO",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 15.24,
      "y": 24
     },
     "wave": {
      "x": 15.24,
      "y": 47
     },
     "depth": {
      "x": 15.24,
      "y": 63
     },
     "bipolar": {
      "x": 7.62,
      "y": 79
     },
     "run": {
      "x": 22.86,
      "y": 79
     },
     "rate_cv_amt": {
      "x": 7.62,
      "y": 93
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 7.62,
      "y": 106,
      "labelPos": "below"
     },
     "reset": {
      "x": 22.86,
      "y": 106,
      "labelPos": "below"
     },
     "out": {
      "x": 7.62,
      "y": 118,
      "labelPos": "below"
     },
     "out_inv": {
      "x": 22.86,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ju37bhb",
   "typeId": "tp_mmb_sh",
   "internal": true,
   "name": "MMB S&H",
   "brand": "MMB",
   "modelNumber": "S&H",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "S&H",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "slew": {
      "x": 10.16,
      "y": 30
     },
     "mode": {
      "x": 10.16,
      "y": 60
     }
    },
    "portPlacements": {
     "in": {
      "x": 6.096,
      "y": 92,
      "labelPos": "below"
     },
     "trig": {
      "x": 14.223999999999998,
      "y": 92,
      "labelPos": "below"
     },
     "out": {
      "x": 10.16,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_zvcxjgi",
   "typeId": "tp_mmb_vco",
   "internal": true,
   "name": "MMB VCO",
   "brand": "MMB",
   "modelNumber": "VCO",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "VCO",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "wave": {
      "x": 20.32,
      "y": 22
     },
     "coarse": {
      "x": 12.192,
      "y": 50
     },
     "fine": {
      "x": 28.447999999999997,
      "y": 50
     },
     "fm_amt": {
      "x": 12.192,
      "y": 78
     },
     "level": {
      "x": 28.447999999999997,
      "y": 78
     }
    },
    "portPlacements": {
     "voct": {
      "x": 7.3152,
      "y": 104,
      "labelPos": "below"
     },
     "tune": {
      "x": 16.256,
      "y": 104,
      "labelPos": "below"
     },
     "fm": {
      "x": 25.1968,
      "y": 104,
      "labelPos": "below"
     },
     "sync": {
      "x": 34.1376,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 20.32,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_hdmg3kh",
   "typeId": "tp_mmb_quad_vco_shared",
   "internal": true,
   "name": "MMB QUAD-VCO-S",
   "brand": "MMB",
   "modelNumber": "QUAD-VCO-S",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "QUAD-VCO-S",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 14,
      "text": "shared controls · 4 cells",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 78,
      "text": "1",
      "fontSize": 1.6,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 78,
      "text": "2",
      "fontSize": 1.6,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 78,
      "text": "3",
      "fontSize": 1.6,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 71.12,
      "y": 78,
      "text": "4",
      "fontSize": 1.6,
      "color": "#9ca3af",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "wave": {
      "x": 16.256,
      "y": 28
     },
     "coarse": {
      "x": 36.576,
      "y": 32
     },
     "fine": {
      "x": 52.832,
      "y": 32
     },
     "level": {
      "x": 69.088,
      "y": 32
     }
    },
    "portPlacements": {
     "voct_1": {
      "x": 10.16,
      "y": 92,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 30.48,
      "y": 92,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 50.8,
      "y": 92,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 71.12,
      "y": 92,
      "labelPos": "below"
     },
     "out_1": {
      "x": 10.16,
      "y": 116,
      "labelPos": "below"
     },
     "out_2": {
      "x": 30.48,
      "y": 116,
      "labelPos": "below"
     },
     "out_3": {
      "x": 50.8,
      "y": 116,
      "labelPos": "below"
     },
     "out_4": {
      "x": 71.12,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_7xutlau",
   "typeId": "tp_mmb_octa_vco",
   "internal": true,
   "name": "MMB OCTA-VCO-S",
   "brand": "MMB",
   "modelNumber": "OCTA-VCO-S",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "OCTA-VCO-S",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 14,
      "text": "shared controls · 8 cells",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "wave": {
      "x": 16.256,
      "y": 30
     },
     "coarse": {
      "x": 36.57599999999999,
      "y": 34
     },
     "fine": {
      "x": 54.864,
      "y": 34
     },
     "detune": {
      "x": 71.11999999999999,
      "y": 34
     },
     "level": {
      "x": 87.37599999999999,
      "y": 34
     }
    },
    "portPlacements": {
     "voct_1": {
      "x": 8.128,
      "y": 92,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 20.2184,
      "y": 92,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 32.3088,
      "y": 92,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 44.3992,
      "y": 92,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 56.48959999999999,
      "y": 92,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 68.57999999999998,
      "y": 92,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 80.67039999999999,
      "y": 92,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 92.76079999999999,
      "y": 92,
      "labelPos": "below"
     },
     "out_1": {
      "x": 8.128,
      "y": 116,
      "labelPos": "below"
     },
     "out_2": {
      "x": 20.2184,
      "y": 116,
      "labelPos": "below"
     },
     "out_3": {
      "x": 32.3088,
      "y": 116,
      "labelPos": "below"
     },
     "out_4": {
      "x": 44.3992,
      "y": 116,
      "labelPos": "below"
     },
     "out_5": {
      "x": 56.48959999999999,
      "y": 116,
      "labelPos": "below"
     },
     "out_6": {
      "x": 68.57999999999998,
      "y": 116,
      "labelPos": "below"
     },
     "out_7": {
      "x": 80.67039999999999,
      "y": 116,
      "labelPos": "below"
     },
     "out_8": {
      "x": 92.76079999999999,
      "y": 116,
      "labelPos": "below"
     },
     "tune": {
      "x": 50.8,
      "y": 78,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_fbr058q",
   "typeId": "tp_mmb_octa_vcf",
   "internal": true,
   "name": "MMB OCTA-VCF-S",
   "brand": "MMB",
   "modelNumber": "OCTA-VCF-S",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "OCTA-VCF-S",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 14,
      "text": "shared controls · 8 cells",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "cutoff": {
      "x": 25.4,
      "y": 34
     },
     "q": {
      "x": 47.751999999999995,
      "y": 34
     },
     "cv_amt": {
      "x": 67.056,
      "y": 34
     },
     "type": {
      "x": 87.37599999999999,
      "y": 30
     }
    },
    "portPlacements": {
     "cv": {
      "x": 50.8,
      "y": 64,
      "labelPos": "below"
     },
     "in_1": {
      "x": 8.128,
      "y": 84,
      "labelPos": "below"
     },
     "in_2": {
      "x": 20.2184,
      "y": 84,
      "labelPos": "below"
     },
     "in_3": {
      "x": 32.3088,
      "y": 84,
      "labelPos": "below"
     },
     "in_4": {
      "x": 44.3992,
      "y": 84,
      "labelPos": "below"
     },
     "in_5": {
      "x": 56.48959999999999,
      "y": 84,
      "labelPos": "below"
     },
     "in_6": {
      "x": 68.57999999999998,
      "y": 84,
      "labelPos": "below"
     },
     "in_7": {
      "x": 80.67039999999999,
      "y": 84,
      "labelPos": "below"
     },
     "in_8": {
      "x": 92.76079999999999,
      "y": 84,
      "labelPos": "below"
     },
     "cv_1": {
      "x": 8.128,
      "y": 101,
      "labelPos": "below"
     },
     "cv_2": {
      "x": 20.2184,
      "y": 101,
      "labelPos": "below"
     },
     "cv_3": {
      "x": 32.3088,
      "y": 101,
      "labelPos": "below"
     },
     "cv_4": {
      "x": 44.3992,
      "y": 101,
      "labelPos": "below"
     },
     "cv_5": {
      "x": 56.48959999999999,
      "y": 101,
      "labelPos": "below"
     },
     "cv_6": {
      "x": 68.57999999999998,
      "y": 101,
      "labelPos": "below"
     },
     "cv_7": {
      "x": 80.67039999999999,
      "y": 101,
      "labelPos": "below"
     },
     "cv_8": {
      "x": 92.76079999999999,
      "y": 101,
      "labelPos": "below"
     },
     "out_1": {
      "x": 8.128,
      "y": 118,
      "labelPos": "below"
     },
     "out_2": {
      "x": 20.2184,
      "y": 118,
      "labelPos": "below"
     },
     "out_3": {
      "x": 32.3088,
      "y": 118,
      "labelPos": "below"
     },
     "out_4": {
      "x": 44.3992,
      "y": 118,
      "labelPos": "below"
     },
     "out_5": {
      "x": 56.48959999999999,
      "y": 118,
      "labelPos": "below"
     },
     "out_6": {
      "x": 68.57999999999998,
      "y": 118,
      "labelPos": "below"
     },
     "out_7": {
      "x": 80.67039999999999,
      "y": 118,
      "labelPos": "below"
     },
     "out_8": {
      "x": 92.76079999999999,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_67t91pi",
   "typeId": "tp_mmb_octa_vca",
   "internal": true,
   "name": "MMB OCTA-VCA-S",
   "brand": "MMB",
   "modelNumber": "OCTA-VCA-S",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "OCTA-VCA-S",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 14,
      "text": "shared level · 8 cells",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "level": {
      "x": 40.64,
      "y": 34
     }
    },
    "portPlacements": {
     "in_1": {
      "x": 6.502400000000001,
      "y": 84,
      "labelPos": "below"
     },
     "in_2": {
      "x": 16.17472,
      "y": 84,
      "labelPos": "below"
     },
     "in_3": {
      "x": 25.84704,
      "y": 84,
      "labelPos": "below"
     },
     "in_4": {
      "x": 35.51936,
      "y": 84,
      "labelPos": "below"
     },
     "in_5": {
      "x": 45.19168,
      "y": 84,
      "labelPos": "below"
     },
     "in_6": {
      "x": 54.864,
      "y": 84,
      "labelPos": "below"
     },
     "in_7": {
      "x": 64.53631999999999,
      "y": 84,
      "labelPos": "below"
     },
     "in_8": {
      "x": 74.20863999999999,
      "y": 84,
      "labelPos": "below"
     },
     "cv_1": {
      "x": 6.502400000000001,
      "y": 101,
      "labelPos": "below"
     },
     "cv_2": {
      "x": 16.17472,
      "y": 101,
      "labelPos": "below"
     },
     "cv_3": {
      "x": 25.84704,
      "y": 101,
      "labelPos": "below"
     },
     "cv_4": {
      "x": 35.51936,
      "y": 101,
      "labelPos": "below"
     },
     "cv_5": {
      "x": 45.19168,
      "y": 101,
      "labelPos": "below"
     },
     "cv_6": {
      "x": 54.864,
      "y": 101,
      "labelPos": "below"
     },
     "cv_7": {
      "x": 64.53631999999999,
      "y": 101,
      "labelPos": "below"
     },
     "cv_8": {
      "x": 74.20863999999999,
      "y": 101,
      "labelPos": "below"
     },
     "out_1": {
      "x": 6.502400000000001,
      "y": 118,
      "labelPos": "below"
     },
     "out_2": {
      "x": 16.17472,
      "y": 118,
      "labelPos": "below"
     },
     "out_3": {
      "x": 25.84704,
      "y": 118,
      "labelPos": "below"
     },
     "out_4": {
      "x": 35.51936,
      "y": 118,
      "labelPos": "below"
     },
     "out_5": {
      "x": 45.19168,
      "y": 118,
      "labelPos": "below"
     },
     "out_6": {
      "x": 54.864,
      "y": 118,
      "labelPos": "below"
     },
     "out_7": {
      "x": 64.53631999999999,
      "y": 118,
      "labelPos": "below"
     },
     "out_8": {
      "x": 74.20863999999999,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_7adj7n4",
   "typeId": "tp_mmb_quad_mixer_shared",
   "internal": true,
   "name": "MMB QUAD-MIX-S",
   "brand": "MMB",
   "modelNumber": "QUAD-MIX-S",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "QUAD-MIX-S",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 14,
      "text": "per-cel pan · gedeelde volume",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pan_1": {
      "x": 9.7536,
      "y": 52
     },
     "pan_2": {
      "x": 23.1648,
      "y": 52
     },
     "pan_3": {
      "x": 36.576,
      "y": 52
     },
     "pan_4": {
      "x": 49.9872,
      "y": 52
     },
     "volume": {
      "x": 30.48,
      "y": 82
     }
    },
    "portPlacements": {
     "in_1": {
      "x": 9.7536,
      "y": 30,
      "labelPos": "below"
     },
     "in_2": {
      "x": 23.1648,
      "y": 30,
      "labelPos": "below"
     },
     "in_3": {
      "x": 36.576,
      "y": 30,
      "labelPos": "below"
     },
     "in_4": {
      "x": 49.9872,
      "y": 30,
      "labelPos": "below"
     },
     "out_l": {
      "x": 23.1648,
      "y": 110,
      "labelPos": "below"
     },
     "out_r": {
      "x": 37.7952,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_vvjwt48",
   "typeId": "tp_mmb_vcf",
   "internal": true,
   "name": "MMB VCF",
   "brand": "MMB",
   "modelNumber": "VCF",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "VCF",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "cutoff": {
      "x": 15.24,
      "y": 22
     },
     "q": {
      "x": 9.144,
      "y": 48
     },
     "cv_amt": {
      "x": 21.336,
      "y": 48
     },
     "q_cv_amt": {
      "x": 9.144,
      "y": 70
     },
     "type": {
      "x": 21.336,
      "y": 72
     }
    },
    "portPlacements": {
     "in": {
      "x": 7.62,
      "y": 98,
      "labelPos": "below"
     },
     "cv": {
      "x": 22.86,
      "y": 98,
      "labelPos": "below"
     },
     "q_cv": {
      "x": 7.62,
      "y": 112,
      "labelPos": "below"
     },
     "out": {
      "x": 22.86,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_yulox28",
   "typeId": "tp_mmb_ladder",
   "internal": true,
   "name": "MMB LADDER",
   "brand": "MMB",
   "modelNumber": "LADDER",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "LADDER",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "cutoff": {
      "x": 20.32,
      "y": 22
     },
     "q": {
      "x": 11.3792,
      "y": 48
     },
     "drive": {
      "x": 29.2608,
      "y": 48
     },
     "cv_amt": {
      "x": 8.128,
      "y": 70
     },
     "q_cv_amt": {
      "x": 20.32,
      "y": 70
     },
     "drive_cv_amt": {
      "x": 32.512,
      "y": 70
     }
    },
    "portPlacements": {
     "in": {
      "x": 8.128,
      "y": 98,
      "labelPos": "below"
     },
     "cv": {
      "x": 20.32,
      "y": 98,
      "labelPos": "below"
     },
     "q_cv": {
      "x": 32.512,
      "y": 98,
      "labelPos": "below"
     },
     "drive_cv": {
      "x": 8.128,
      "y": 112,
      "labelPos": "below"
     },
     "out": {
      "x": 32.512,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_7589mpn",
   "typeId": "tp_mmb_ms20",
   "internal": true,
   "name": "MMB MS-20",
   "brand": "MMB",
   "modelNumber": "MS-20",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "MS-20",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "cutoff": {
      "x": 20.32,
      "y": 22
     },
     "q": {
      "x": 11.3792,
      "y": 48
     },
     "drive": {
      "x": 29.2608,
      "y": 48
     },
     "cv_amt": {
      "x": 8.128,
      "y": 70
     },
     "q_cv_amt": {
      "x": 20.32,
      "y": 70
     },
     "drive_cv_amt": {
      "x": 32.512,
      "y": 70
     },
     "type": {
      "x": 20.32,
      "y": 86
     }
    },
    "portPlacements": {
     "in": {
      "x": 8.128,
      "y": 100,
      "labelPos": "below"
     },
     "cv": {
      "x": 20.32,
      "y": 100,
      "labelPos": "below"
     },
     "q_cv": {
      "x": 32.512,
      "y": 100,
      "labelPos": "below"
     },
     "drive_cv": {
      "x": 8.128,
      "y": 113,
      "labelPos": "below"
     },
     "out": {
      "x": 32.512,
      "y": 113,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_t95c8ed",
   "typeId": "tp_mmb_vca",
   "internal": true,
   "name": "MMB VCA",
   "brand": "MMB",
   "modelNumber": "VCA",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "VCA",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "gain": {
      "x": 10.16,
      "y": 24
     },
     "resp": {
      "x": 10.16,
      "y": 60
     }
    },
    "portPlacements": {
     "in": {
      "x": 5.08,
      "y": 92,
      "labelPos": "below"
     },
     "cv": {
      "x": 15.24,
      "y": 92,
      "labelPos": "below"
     },
     "out": {
      "x": 10.16,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_8pvmksm",
   "typeId": "tp_mmb_out",
   "internal": true,
   "name": "MMB OUT",
   "brand": "MMB",
   "modelNumber": "OUT",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "OUT",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "level": {
      "x": 10.16,
      "y": 30
     }
    },
    "portPlacements": {
     "l": {
      "x": 6.096,
      "y": 92,
      "labelPos": "below"
     },
     "r": {
      "x": 14.223999999999998,
      "y": 92,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_k92x0lw",
   "typeId": "tp_mmb_midiin",
   "internal": true,
   "name": "MMB MIDI-IN",
   "brand": "MMB",
   "modelNumber": "MIDI-IN",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "MIDI-IN",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 14,
      "text": "voicing · steal · modulatie",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 42.672000000000004,
      "y": 26,
      "text": "Voices",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 19.2024,
      "y": 100,
      "text": "NOTE",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 54.76240000000001,
      "y": 100,
      "text": "MOD",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "channel": {
      "x": 8.5344,
      "y": 30
     },
     "chDisp": {
      "x": 18.491200000000003,
      "y": 30
     },
     "act": {
      "x": 64.00800000000001,
      "y": 28
     },
     "voicesDisp": {
      "x": 42.672000000000004,
      "y": 32
     },
     "priority": {
      "x": 8.5344,
      "y": 52
     },
     "steal": {
      "x": 24.180800000000005,
      "y": 52
     },
     "legato": {
      "x": 39.827200000000005,
      "y": 52
     },
     "bendRange": {
      "x": 56.89600000000001,
      "y": 52
     },
     "glide": {
      "x": 9.956800000000001,
      "y": 66
     },
     "unison": {
      "x": 28.448000000000004,
      "y": 66
     },
     "spread": {
      "x": 46.93920000000001,
      "y": 66
     },
     "bendPitch": {
      "x": 62.58560000000001,
      "y": 66
     },
     "cc1Num": {
      "x": 11.3792,
      "y": 80
     },
     "cc1Disp": {
      "x": 24.180800000000005,
      "y": 80
     },
     "cc2Num": {
      "x": 41.2496,
      "y": 80
     },
     "cc2Disp": {
      "x": 54.0512,
      "y": 80
     },
     "a4": {
      "x": 66.14160000000001,
      "y": 80
     }
    },
    "portPlacements": {
     "pitch": {
      "x": 4.978400000000001,
      "y": 112,
      "labelPos": "below"
     },
     "gate": {
      "x": 12.090400000000002,
      "y": 112,
      "labelPos": "below"
     },
     "vel": {
      "x": 19.2024,
      "y": 112,
      "labelPos": "below"
     },
     "press": {
      "x": 26.314400000000003,
      "y": 112,
      "labelPos": "below"
     },
     "rel": {
      "x": 33.4264,
      "y": 112,
      "labelPos": "below"
     },
     "cv_mod": {
      "x": 43.3832,
      "y": 112,
      "labelPos": "below"
     },
     "cv_bend": {
      "x": 51.2064,
      "y": 112,
      "labelPos": "below"
     },
     "cv_cc1": {
      "x": 59.0296,
      "y": 112,
      "labelPos": "below"
     },
     "cv_cc2": {
      "x": 66.8528,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_2qe3rq0",
   "typeId": "tp_mmb_cvmath",
   "internal": true,
   "name": "MMB CV-MATH",
   "brand": "MMB",
   "modelNumber": "CV-MATH",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "CV-MATH",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "mode": {
      "x": 10.16,
      "y": 22
     },
     "gain_a": {
      "x": 6.096,
      "y": 46
     },
     "gain_b": {
      "x": 14.223999999999998,
      "y": 46
     },
     "gain_c": {
      "x": 6.096,
      "y": 68
     },
     "offset": {
      "x": 14.223999999999998,
      "y": 68
     }
    },
    "portPlacements": {
     "a": {
      "x": 4.064,
      "y": 92,
      "labelPos": "below"
     },
     "b": {
      "x": 10.16,
      "y": 92,
      "labelPos": "below"
     },
     "c": {
      "x": 16.256,
      "y": 92,
      "labelPos": "below"
     },
     "out": {
      "x": 10.16,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ms0no5l",
   "typeId": "tp_mmb_mixer",
   "internal": true,
   "name": "MMB MIXER",
   "brand": "MMB",
   "modelNumber": "MIXER",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "MIXER",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "vol1": {
      "x": 18.288,
      "y": 26
     },
     "pan1": {
      "x": 31.6992,
      "y": 26
     },
     "vol2": {
      "x": 18.288,
      "y": 48
     },
     "pan2": {
      "x": 31.6992,
      "y": 48
     },
     "vol3": {
      "x": 18.288,
      "y": 70
     },
     "pan3": {
      "x": 31.6992,
      "y": 70
     },
     "vol4": {
      "x": 18.288,
      "y": 92
     },
     "pan4": {
      "x": 31.6992,
      "y": 92
     }
    },
    "portPlacements": {
     "in1": {
      "x": 4.8768,
      "y": 26,
      "labelPos": "below"
     },
     "in2": {
      "x": 4.8768,
      "y": 48,
      "labelPos": "below"
     },
     "in3": {
      "x": 4.8768,
      "y": 70,
      "labelPos": "below"
     },
     "in4": {
      "x": 4.8768,
      "y": 92,
      "labelPos": "below"
     },
     "out_l": {
      "x": 15.443200000000001,
      "y": 116,
      "labelPos": "below"
     },
     "out_r": {
      "x": 25.1968,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_5ky5ukp",
   "typeId": "tp_mmb_mixer8",
   "internal": true,
   "name": "MMB MIX8",
   "brand": "MMB",
   "modelNumber": "MIX8",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "MIXER-8",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "vol1": {
      "x": 12.192,
      "y": 28
     },
     "pan1": {
      "x": 20.7264,
      "y": 28
     },
     "vol2": {
      "x": 12.192,
      "y": 50
     },
     "pan2": {
      "x": 20.7264,
      "y": 50
     },
     "vol3": {
      "x": 12.192,
      "y": 72
     },
     "pan3": {
      "x": 20.7264,
      "y": 72
     },
     "vol4": {
      "x": 12.192,
      "y": 94
     },
     "pan4": {
      "x": 20.7264,
      "y": 94
     },
     "vol5": {
      "x": 42.672,
      "y": 28
     },
     "pan5": {
      "x": 51.2064,
      "y": 28
     },
     "vol6": {
      "x": 42.672,
      "y": 50
     },
     "pan6": {
      "x": 51.2064,
      "y": 50
     },
     "vol7": {
      "x": 42.672,
      "y": 72
     },
     "pan7": {
      "x": 51.2064,
      "y": 72
     },
     "vol8": {
      "x": 42.672,
      "y": 94
     },
     "pan8": {
      "x": 51.2064,
      "y": 94
     }
    },
    "portPlacements": {
     "in1": {
      "x": 3.6576,
      "y": 28,
      "labelPos": "below"
     },
     "in2": {
      "x": 3.6576,
      "y": 50,
      "labelPos": "below"
     },
     "in3": {
      "x": 3.6576,
      "y": 72,
      "labelPos": "below"
     },
     "in4": {
      "x": 3.6576,
      "y": 94,
      "labelPos": "below"
     },
     "in5": {
      "x": 34.137600000000006,
      "y": 28,
      "labelPos": "below"
     },
     "in6": {
      "x": 34.137600000000006,
      "y": 50,
      "labelPos": "below"
     },
     "in7": {
      "x": 34.137600000000006,
      "y": 72,
      "labelPos": "below"
     },
     "in8": {
      "x": 34.137600000000006,
      "y": 94,
      "labelPos": "below"
     },
     "out_l": {
      "x": 24.384,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 36.576,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_bs0hrck",
   "typeId": "tp_mmb_mixer16",
   "internal": true,
   "name": "MMB MIX16",
   "brand": "MMB",
   "modelNumber": "MIX16",
   "visual": {
    "hpWidth": 24,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 60.96,
      "y": 8,
      "text": "MIXER-16",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 60.96,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "vol1": {
      "x": 14.6304,
      "y": 28
     },
     "pan1": {
      "x": 25.6032,
      "y": 28
     },
     "vol2": {
      "x": 14.6304,
      "y": 50
     },
     "pan2": {
      "x": 25.6032,
      "y": 50
     },
     "vol3": {
      "x": 14.6304,
      "y": 72
     },
     "pan3": {
      "x": 25.6032,
      "y": 72
     },
     "vol4": {
      "x": 14.6304,
      "y": 94
     },
     "pan4": {
      "x": 25.6032,
      "y": 94
     },
     "vol5": {
      "x": 45.1104,
      "y": 28
     },
     "pan5": {
      "x": 56.083200000000005,
      "y": 28
     },
     "vol6": {
      "x": 45.1104,
      "y": 50
     },
     "pan6": {
      "x": 56.083200000000005,
      "y": 50
     },
     "vol7": {
      "x": 45.1104,
      "y": 72
     },
     "pan7": {
      "x": 56.083200000000005,
      "y": 72
     },
     "vol8": {
      "x": 45.1104,
      "y": 94
     },
     "pan8": {
      "x": 56.083200000000005,
      "y": 94
     },
     "vol9": {
      "x": 75.5904,
      "y": 28
     },
     "pan9": {
      "x": 86.5632,
      "y": 28
     },
     "vol10": {
      "x": 75.5904,
      "y": 50
     },
     "pan10": {
      "x": 86.5632,
      "y": 50
     },
     "vol11": {
      "x": 75.5904,
      "y": 72
     },
     "pan11": {
      "x": 86.5632,
      "y": 72
     },
     "vol12": {
      "x": 75.5904,
      "y": 94
     },
     "pan12": {
      "x": 86.5632,
      "y": 94
     },
     "vol13": {
      "x": 106.0704,
      "y": 28
     },
     "pan13": {
      "x": 117.0432,
      "y": 28
     },
     "vol14": {
      "x": 106.0704,
      "y": 50
     },
     "pan14": {
      "x": 117.0432,
      "y": 50
     },
     "vol15": {
      "x": 106.0704,
      "y": 72
     },
     "pan15": {
      "x": 117.0432,
      "y": 72
     },
     "vol16": {
      "x": 106.0704,
      "y": 94
     },
     "pan16": {
      "x": 117.0432,
      "y": 94
     }
    },
    "portPlacements": {
     "in1": {
      "x": 6.096,
      "y": 28,
      "labelPos": "below"
     },
     "in2": {
      "x": 6.096,
      "y": 50,
      "labelPos": "below"
     },
     "in3": {
      "x": 6.096,
      "y": 72,
      "labelPos": "below"
     },
     "in4": {
      "x": 6.096,
      "y": 94,
      "labelPos": "below"
     },
     "in5": {
      "x": 36.576,
      "y": 28,
      "labelPos": "below"
     },
     "in6": {
      "x": 36.576,
      "y": 50,
      "labelPos": "below"
     },
     "in7": {
      "x": 36.576,
      "y": 72,
      "labelPos": "below"
     },
     "in8": {
      "x": 36.576,
      "y": 94,
      "labelPos": "below"
     },
     "in9": {
      "x": 67.05600000000001,
      "y": 28,
      "labelPos": "below"
     },
     "in10": {
      "x": 67.05600000000001,
      "y": 50,
      "labelPos": "below"
     },
     "in11": {
      "x": 67.05600000000001,
      "y": 72,
      "labelPos": "below"
     },
     "in12": {
      "x": 67.05600000000001,
      "y": 94,
      "labelPos": "below"
     },
     "in13": {
      "x": 97.536,
      "y": 28,
      "labelPos": "below"
     },
     "in14": {
      "x": 97.536,
      "y": 50,
      "labelPos": "below"
     },
     "in15": {
      "x": 97.536,
      "y": 72,
      "labelPos": "below"
     },
     "in16": {
      "x": 97.536,
      "y": 94,
      "labelPos": "below"
     },
     "out_l": {
      "x": 48.768,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 73.152,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_fmw3tdv",
   "typeId": "tp_mmb_seq8",
   "internal": true,
   "name": "MMB SEQ-16",
   "brand": "MMB",
   "modelNumber": "SEQ-16",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "SEQ-16",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 14,
      "text": "16-step sequencer",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "decorations": [
     {
      "kind": "rect",
      "x": 2,
      "y": 30,
      "w": 97.6,
      "h": 44,
      "color": "#0b1220"
     }
    ],
    "controlPlacements": {
     "s1": {
      "x": 7.112,
      "y": 38
     },
     "s2": {
      "x": 18.796,
      "y": 38
     },
     "s3": {
      "x": 30.480000000000004,
      "y": 38
     },
     "s4": {
      "x": 42.164,
      "y": 38
     },
     "s5": {
      "x": 53.848,
      "y": 38
     },
     "s6": {
      "x": 65.532,
      "y": 38
     },
     "s7": {
      "x": 77.216,
      "y": 38
     },
     "s8": {
      "x": 88.89999999999999,
      "y": 38
     },
     "s9": {
      "x": 7.112,
      "y": 62
     },
     "s10": {
      "x": 18.796,
      "y": 62
     },
     "s11": {
      "x": 30.480000000000004,
      "y": 62
     },
     "s12": {
      "x": 42.164,
      "y": 62
     },
     "s13": {
      "x": 53.848,
      "y": 62
     },
     "s14": {
      "x": 65.532,
      "y": 62
     },
     "s15": {
      "x": 77.216,
      "y": 62
     },
     "s16": {
      "x": 88.89999999999999,
      "y": 62
     },
     "led_s1": {
      "x": 7.112,
      "y": 47
     },
     "led_s2": {
      "x": 18.796,
      "y": 47
     },
     "led_s3": {
      "x": 30.480000000000004,
      "y": 47
     },
     "led_s4": {
      "x": 42.164,
      "y": 47
     },
     "led_s5": {
      "x": 53.848,
      "y": 47
     },
     "led_s6": {
      "x": 65.532,
      "y": 47
     },
     "led_s7": {
      "x": 77.216,
      "y": 47
     },
     "led_s8": {
      "x": 88.89999999999999,
      "y": 47
     },
     "led_s9": {
      "x": 7.112,
      "y": 71
     },
     "led_s10": {
      "x": 18.796,
      "y": 71
     },
     "led_s11": {
      "x": 30.480000000000004,
      "y": 71
     },
     "led_s12": {
      "x": 42.164,
      "y": 71
     },
     "led_s13": {
      "x": 53.848,
      "y": 71
     },
     "led_s14": {
      "x": 65.532,
      "y": 71
     },
     "led_s15": {
      "x": 77.216,
      "y": 71
     },
     "led_s16": {
      "x": 88.89999999999999,
      "y": 71
     },
     "root": {
      "x": 18.287999999999997,
      "y": 92
     },
     "rate": {
      "x": 36.57599999999999,
      "y": 92
     },
     "gate": {
      "x": 54.864,
      "y": 92
     },
     "length": {
      "x": 71.11999999999999,
      "y": 92
     },
     "run": {
      "x": 8.128,
      "y": 92
     },
     "runLed": {
      "x": 8.128,
      "y": 104
     },
     "stepDisp": {
      "x": 89.408,
      "y": 92
     },
     "rateBpm": {
      "x": 36.57599999999999,
      "y": 104
     },
     "lenVal": {
      "x": 71.11999999999999,
      "y": 104
     }
    },
    "portPlacements": {
     "clock": {
      "x": 10.16,
      "y": 114,
      "labelPos": "below"
     },
     "reset": {
      "x": 22.352,
      "y": 114,
      "labelPos": "below"
     },
     "voct_in": {
      "x": 34.544000000000004,
      "y": 114,
      "labelPos": "below"
     },
     "run_in": {
      "x": 46.736,
      "y": 114,
      "labelPos": "below"
     },
     "cv": {
      "x": 62.992,
      "y": 114,
      "labelPos": "below"
     },
     "gate_out": {
      "x": 77.216,
      "y": 114,
      "labelPos": "below"
     },
     "trig": {
      "x": 91.44,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_i0c28jk",
   "typeId": "tp_mmb_string",
   "internal": true,
   "name": "MMB STRING",
   "brand": "MMB",
   "modelNumber": "STRING",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "STRING",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 14,
      "text": "Karplus-Strong",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pluck": {
      "x": 9.144,
      "y": 36
     },
     "level": {
      "x": 21.336,
      "y": 36
     }
    },
    "portPlacements": {
     "voct": {
      "x": 6.096,
      "y": 92,
      "labelPos": "below"
     },
     "gate": {
      "x": 15.24,
      "y": 92,
      "labelPos": "below"
     },
     "pluck_cv": {
      "x": 24.384,
      "y": 92,
      "labelPos": "below"
     },
     "level_cv": {
      "x": 6.096,
      "y": 110,
      "labelPos": "below"
     },
     "out": {
      "x": 19.812,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_fep3pvp",
   "typeId": "tp_mmb_elements",
   "internal": true,
   "name": "MI ELEMENTS",
   "brand": "MI",
   "modelNumber": "ELEMENTS",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "ELEMENTS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 13,
      "text": "modal / physical modelling",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "envelope": {
      "x": 9.143999999999998,
      "y": 24
     },
     "bow": {
      "x": 25.8064,
      "y": 24
     },
     "blow": {
      "x": 42.4688,
      "y": 24
     },
     "strike": {
      "x": 59.13119999999999,
      "y": 24
     },
     "coarse": {
      "x": 75.7936,
      "y": 24
     },
     "fine": {
      "x": 92.456,
      "y": 24
     },
     "blow_meta": {
      "x": 25.8064,
      "y": 46
     },
     "strike_meta": {
      "x": 42.4688,
      "y": 46
     },
     "fm": {
      "x": 59.13119999999999,
      "y": 46
     },
     "geometry": {
      "x": 75.7936,
      "y": 46
     },
     "brightness": {
      "x": 92.456,
      "y": 46
     },
     "bow_timbre": {
      "x": 9.143999999999998,
      "y": 70
     },
     "blow_timbre": {
      "x": 25.8064,
      "y": 70
     },
     "strike_timbre": {
      "x": 42.4688,
      "y": 70
     },
     "damping": {
      "x": 59.13119999999999,
      "y": 70
     },
     "position": {
      "x": 75.7936,
      "y": 70
     },
     "space": {
      "x": 92.456,
      "y": 70
     },
     "signature": {
      "x": 9.143999999999998,
      "y": 90
     },
     "mod_freq": {
      "x": 25.8064,
      "y": 90
     },
     "mod_offset": {
      "x": 42.4688,
      "y": 90
     },
     "level": {
      "x": 92.456,
      "y": 90
     }
    },
    "portPlacements": {
     "voct": {
      "x": 9.143999999999998,
      "y": 108,
      "labelPos": "below"
     },
     "gate": {
      "x": 25.8064,
      "y": 108,
      "labelPos": "below"
     },
     "strength": {
      "x": 42.4688,
      "y": 108,
      "labelPos": "below"
     },
     "out_l": {
      "x": 75.7936,
      "y": 108,
      "labelPos": "below"
     },
     "out_r": {
      "x": 92.456,
      "y": 108,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_zq8hqqq",
   "typeId": "tp_mmb_rings",
   "internal": true,
   "name": "MI RINGS",
   "brand": "MI",
   "modelNumber": "RINGS",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "RINGS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 13,
      "text": "resonator · strum",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "structure": {
      "x": 9.956800000000001,
      "y": 30
     },
     "brightness": {
      "x": 27.0256,
      "y": 30
     },
     "damping": {
      "x": 44.0944,
      "y": 30
     },
     "position": {
      "x": 61.1632,
      "y": 30
     },
     "model": {
      "x": 21.336000000000002,
      "y": 62
     },
     "polyphony": {
      "x": 51.2064,
      "y": 62
     },
     "coarse": {
      "x": 9.956800000000001,
      "y": 88
     },
     "fine": {
      "x": 27.0256,
      "y": 88
     },
     "level": {
      "x": 61.1632,
      "y": 88
     }
    },
    "portPlacements": {
     "voct": {
      "x": 9.956800000000001,
      "y": 108,
      "labelPos": "below"
     },
     "gate": {
      "x": 27.0256,
      "y": 108,
      "labelPos": "below"
     },
     "out_l": {
      "x": 44.0944,
      "y": 108,
      "labelPos": "below"
     },
     "out_r": {
      "x": 61.1632,
      "y": 108,
      "labelPos": "below"
     },
     "structure_cv": {
      "x": 9.956800000000001,
      "y": 120,
      "labelPos": "below"
     },
     "brightness_cv": {
      "x": 27.0256,
      "y": 120,
      "labelPos": "below"
     },
     "damping_cv": {
      "x": 44.0944,
      "y": 120,
      "labelPos": "below"
     },
     "position_cv": {
      "x": 61.1632,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_rms05wc",
   "typeId": "tp_mmb_plaits",
   "internal": true,
   "name": "MI PLAITS",
   "brand": "MI",
   "modelNumber": "PLAITS",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "PLAITS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "24 engines · macro-osc",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "engine": {
      "x": 17.068800000000003,
      "y": 26
     },
     "engDisp": {
      "x": 40.2336,
      "y": 22
     },
     "engName": {
      "x": 40.2336,
      "y": 29
     },
     "harmonics": {
      "x": 9.7536,
      "y": 52
     },
     "timbre": {
      "x": 30.48,
      "y": 52
     },
     "morph": {
      "x": 51.2064,
      "y": 52
     },
     "decay": {
      "x": 9.7536,
      "y": 80
     },
     "lpg": {
      "x": 30.48,
      "y": 80
     },
     "level": {
      "x": 51.2064,
      "y": 80
     },
     "coarse": {
      "x": 9.7536,
      "y": 96
     },
     "fine": {
      "x": 30.48,
      "y": 96
     }
    },
    "portPlacements": {
     "harmonics_cv": {
      "x": 8.534400000000002,
      "y": 106,
      "labelPos": "below"
     },
     "timbre_cv": {
      "x": 30.48,
      "y": 106,
      "labelPos": "below"
     },
     "morph_cv": {
      "x": 52.4256,
      "y": 106,
      "labelPos": "below"
     },
     "voct": {
      "x": 8.534400000000002,
      "y": 118,
      "labelPos": "below"
     },
     "gate": {
      "x": 23.1648,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 37.7952,
      "y": 118,
      "labelPos": "below"
     },
     "aux": {
      "x": 52.4256,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_6jdenzg",
   "typeId": "tp_mmb_clouds",
   "internal": true,
   "name": "MI CLOUDS",
   "brand": "MI",
   "modelNumber": "CLOUDS",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "CLOUDS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 13,
      "text": "granular · texture",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "position": {
      "x": 8.5344,
      "y": 28
     },
     "size": {
      "x": 22.0472,
      "y": 28
     },
     "pitch": {
      "x": 35.56,
      "y": 28
     },
     "density": {
      "x": 49.07280000000001,
      "y": 28
     },
     "texture": {
      "x": 62.58560000000001,
      "y": 28
     },
     "mix": {
      "x": 8.5344,
      "y": 56
     },
     "spread": {
      "x": 22.0472,
      "y": 56
     },
     "feedback": {
      "x": 35.56,
      "y": 56
     },
     "reverb": {
      "x": 49.07280000000001,
      "y": 56
     },
     "level": {
      "x": 62.58560000000001,
      "y": 56
     },
     "mode": {
      "x": 19.913600000000002,
      "y": 80
     },
     "freeze": {
      "x": 51.2064,
      "y": 80
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 8.5344,
      "y": 102,
      "labelPos": "below"
     },
     "in_r": {
      "x": 22.0472,
      "y": 102,
      "labelPos": "below"
     },
     "freeze": {
      "x": 35.56,
      "y": 102,
      "labelPos": "below"
     },
     "trig": {
      "x": 49.07280000000001,
      "y": 102,
      "labelPos": "below"
     },
     "size_cv": {
      "x": 62.58560000000001,
      "y": 102,
      "labelPos": "below"
     },
     "out_l": {
      "x": 35.56,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 49.07280000000001,
      "y": 118,
      "labelPos": "below"
     },
     "position_cv": {
      "x": 8.5344,
      "y": 118,
      "labelPos": "below"
     },
     "density_cv": {
      "x": 22.0472,
      "y": 118,
      "labelPos": "below"
     },
     "texture_cv": {
      "x": 62.58560000000001,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_y1nw7fe",
   "typeId": "tp_mmb_tides",
   "internal": true,
   "name": "MI TIDES",
   "brand": "MI",
   "modelNumber": "TIDES",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "TIDES",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "slopes · 4 uitgangen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 25.4,
      "y": 26
     },
     "mode": {
      "x": 14.224,
      "y": 50
     },
     "output": {
      "x": 36.57599999999999,
      "y": 50
     },
     "shape": {
      "x": 7.112,
      "y": 72
     },
     "slope": {
      "x": 19.304,
      "y": 72
     },
     "smooth": {
      "x": 31.496,
      "y": 72
     },
     "shift": {
      "x": 43.687999999999995,
      "y": 72
     }
    },
    "portPlacements": {
     "shape_cv": {
      "x": 7.112,
      "y": 84,
      "labelPos": "below"
     },
     "slope_cv": {
      "x": 19.304,
      "y": 84,
      "labelPos": "below"
     },
     "smooth_cv": {
      "x": 31.496,
      "y": 84,
      "labelPos": "below"
     },
     "shift_cv": {
      "x": 43.687999999999995,
      "y": 84,
      "labelPos": "below"
     },
     "gate": {
      "x": 15.239999999999998,
      "y": 102,
      "labelPos": "below"
     },
     "rate_cv": {
      "x": 35.559999999999995,
      "y": 102,
      "labelPos": "below"
     },
     "out1": {
      "x": 7.112,
      "y": 118,
      "labelPos": "below"
     },
     "out2": {
      "x": 19.304,
      "y": 118,
      "labelPos": "below"
     },
     "out3": {
      "x": 31.496,
      "y": 118,
      "labelPos": "below"
     },
     "out4": {
      "x": 43.687999999999995,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_z8ak4pf",
   "typeId": "tp_mmb_marbles",
   "internal": true,
   "name": "MI MARBLES",
   "brand": "MI",
   "modelNumber": "MARBLES",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "MARBLES",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 13,
      "text": "random · déjà vu",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 17.78,
      "y": 20,
      "text": "— t —",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 53.34,
      "y": 20,
      "text": "— X —",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "tempo": {
      "x": 17.78,
      "y": 32
     },
     "spread": {
      "x": 53.34,
      "y": 32
     },
     "bias": {
      "x": 8.5344,
      "y": 56
     },
     "jitter": {
      "x": 26.314400000000003,
      "y": 56
     },
     "xbias": {
      "x": 44.0944,
      "y": 56
     },
     "steps": {
      "x": 61.8744,
      "y": 56
     },
     "dejavu": {
      "x": 17.78,
      "y": 76
     },
     "length": {
      "x": 39.11600000000001,
      "y": 76
     },
     "model": {
      "x": 60.452000000000005,
      "y": 76
     },
     "scale": {
      "x": 12.8016,
      "y": 93
     },
     "range": {
      "x": 35.56,
      "y": 93
     },
     "extclock": {
      "x": 58.3184,
      "y": 93
     }
    },
    "portPlacements": {
     "clock": {
      "x": 7.112000000000001,
      "y": 106,
      "labelPos": "below"
     },
     "rate_cv": {
      "x": 26.314400000000003,
      "y": 106,
      "labelPos": "below"
     },
     "dejavu_cv": {
      "x": 45.5168,
      "y": 106,
      "labelPos": "below"
     },
     "spread_cv": {
      "x": 64.7192,
      "y": 106,
      "labelPos": "below"
     },
     "t1": {
      "x": 7.112000000000001,
      "y": 119,
      "labelPos": "below"
     },
     "t2": {
      "x": 16.7132,
      "y": 119,
      "labelPos": "below"
     },
     "tclk": {
      "x": 26.314400000000003,
      "y": 119,
      "labelPos": "below"
     },
     "x1": {
      "x": 35.915600000000005,
      "y": 119,
      "labelPos": "below"
     },
     "x2": {
      "x": 45.5168,
      "y": 119,
      "labelPos": "below"
     },
     "x3": {
      "x": 55.118,
      "y": 119,
      "labelPos": "below"
     },
     "y": {
      "x": 64.7192,
      "y": 119,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_oh58bpi",
   "typeId": "tp_mmb_dx7",
   "internal": true,
   "name": "MMB DX7",
   "brand": "MMB",
   "modelNumber": "DX7",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1e1b4b",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "DX7",
      "fontSize": 2.6,
      "color": "#a5b4fc",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "6-op FM · msfa",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "bank": {
      "x": 13.004800000000001,
      "y": 24
     },
     "bnkDisp": {
      "x": 29.2608,
      "y": 24
     },
     "program": {
      "x": 13.004800000000001,
      "y": 44
     },
     "prgDisp": {
      "x": 29.2608,
      "y": 44
     },
     "voiceName": {
      "x": 20.32,
      "y": 60
     },
     "coarse": {
      "x": 10.16,
      "y": 76
     },
     "fine": {
      "x": 30.48,
      "y": 76
     },
     "level": {
      "x": 20.32,
      "y": 90
     }
    },
    "portPlacements": {
     "voct": {
      "x": 8.128,
      "y": 102,
      "labelPos": "below"
     },
     "gate": {
      "x": 20.32,
      "y": 102,
      "labelPos": "below"
     },
     "vel": {
      "x": 32.512,
      "y": 102,
      "labelPos": "below"
     },
     "out": {
      "x": 20.32,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_04msmzd",
   "typeId": "tp_mmb_warps",
   "internal": true,
   "name": "MI WARPS",
   "brand": "MI",
   "modelNumber": "WARPS",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "WARPS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "xmod · vocoder",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "algo": {
      "x": 17.779999999999998,
      "y": 30
     },
     "algDisp": {
      "x": 39.624,
      "y": 30
     },
     "timbre": {
      "x": 25.4,
      "y": 58
     },
     "shape": {
      "x": 10.16,
      "y": 80
     },
     "drive1": {
      "x": 27.94,
      "y": 80
     },
     "drive2": {
      "x": 43.18,
      "y": 80
     },
     "coarse": {
      "x": 27.94,
      "y": 96
     },
     "level": {
      "x": 43.18,
      "y": 96
     }
    },
    "portPlacements": {
     "in1": {
      "x": 7.112,
      "y": 108,
      "labelPos": "below"
     },
     "in2": {
      "x": 19.304,
      "y": 108,
      "labelPos": "below"
     },
     "voct": {
      "x": 31.496,
      "y": 108,
      "labelPos": "below"
     },
     "algo_cv": {
      "x": 43.687999999999995,
      "y": 108,
      "labelPos": "below"
     },
     "timbre_cv": {
      "x": 7.112,
      "y": 120,
      "labelPos": "below"
     },
     "out": {
      "x": 27.94,
      "y": 120,
      "labelPos": "below"
     },
     "aux": {
      "x": 43.18,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_sq38foh",
   "typeId": "tp_mmb_morph_wt",
   "internal": true,
   "name": "MMB MORPH-WT",
   "brand": "MMB",
   "modelNumber": "MORPH-WT",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "MORPH-WT",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "8 frames · vloeiend",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "morph": {
      "x": 25.4,
      "y": 32
     },
     "bank": {
      "x": 11.176,
      "y": 60
     },
     "wslot": {
      "x": 31.496,
      "y": 60
     },
     "level": {
      "x": 44.704,
      "y": 60
     },
     "coarse": {
      "x": 15.239999999999998,
      "y": 88
     },
     "fine": {
      "x": 35.559999999999995,
      "y": 88
     }
    },
    "portPlacements": {
     "voct": {
      "x": 9.143999999999998,
      "y": 110,
      "labelPos": "below"
     },
     "morph_cv": {
      "x": 25.4,
      "y": 110,
      "labelPos": "below"
     },
     "out": {
      "x": 41.65599999999999,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_9esixly",
   "typeId": "tp_mmb_stages",
   "internal": true,
   "name": "MI STAGES",
   "brand": "MI",
   "modelNumber": "STAGES",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "STAGES",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 13,
      "text": "6 segmenten · env/LFO/seq",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "t1": {
      "x": 8.128,
      "y": 34
     },
     "s1": {
      "x": 8.128,
      "y": 54
     },
     "type1": {
      "x": 8.128,
      "y": 72
     },
     "t2": {
      "x": 20.48256,
      "y": 34
     },
     "s2": {
      "x": 20.48256,
      "y": 54
     },
     "type2": {
      "x": 20.48256,
      "y": 72
     },
     "t3": {
      "x": 32.837120000000006,
      "y": 34
     },
     "s3": {
      "x": 32.837120000000006,
      "y": 54
     },
     "type3": {
      "x": 32.837120000000006,
      "y": 72
     },
     "t4": {
      "x": 45.19168,
      "y": 34
     },
     "s4": {
      "x": 45.19168,
      "y": 54
     },
     "type4": {
      "x": 45.19168,
      "y": 72
     },
     "t5": {
      "x": 57.54624,
      "y": 34
     },
     "s5": {
      "x": 57.54624,
      "y": 54
     },
     "type5": {
      "x": 57.54624,
      "y": 72
     },
     "t6": {
      "x": 69.9008,
      "y": 34
     },
     "s6": {
      "x": 69.9008,
      "y": 54
     },
     "type6": {
      "x": 69.9008,
      "y": 72
     },
     "segments": {
      "x": 13.004800000000001,
      "y": 96
     },
     "loop": {
      "x": 29.2608,
      "y": 96
     },
     "loop_start": {
      "x": 43.891200000000005,
      "y": 96
     },
     "loop_end": {
      "x": 58.5216,
      "y": 96
     },
     "rate": {
      "x": 71.5264,
      "y": 96
     }
    },
    "portPlacements": {
     "gate": {
      "x": 16.256,
      "y": 114,
      "labelPos": "below"
     },
     "out": {
      "x": 44.70400000000001,
      "y": 114,
      "labelPos": "below"
     },
     "eoc": {
      "x": 66.64959999999999,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_wb6lcaw",
   "typeId": "tp_mmb_peaks",
   "internal": true,
   "name": "MI PEAKS",
   "brand": "MI",
   "modelNumber": "PEAKS",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "PEAKS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "808 drums",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "drum": {
      "x": 20.32,
      "y": 26
     },
     "tone": {
      "x": 11.3792,
      "y": 50
     },
     "decay": {
      "x": 29.2608,
      "y": 50
     },
     "snap": {
      "x": 11.3792,
      "y": 74
     },
     "coarse": {
      "x": 29.2608,
      "y": 74
     },
     "level": {
      "x": 20.32,
      "y": 92
     }
    },
    "portPlacements": {
     "gate": {
      "x": 8.128,
      "y": 110,
      "labelPos": "below"
     },
     "voct": {
      "x": 20.32,
      "y": 110,
      "labelPos": "below"
     },
     "out": {
      "x": 32.512,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_1xp0lwp",
   "typeId": "tp_mmb_resonator",
   "internal": true,
   "name": "MMB RESONATOR",
   "brand": "MMB",
   "modelNumber": "RESONATOR",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "RESONATOR",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "12 sympathetic strings",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "root": {
      "x": 15.239999999999998,
      "y": 30
     },
     "scale": {
      "x": 36.57599999999999,
      "y": 30
     },
     "structure": {
      "x": 12.7,
      "y": 60
     },
     "decay": {
      "x": 38.099999999999994,
      "y": 60
     },
     "damping": {
      "x": 10.16,
      "y": 86
     },
     "mix": {
      "x": 25.4,
      "y": 86
     },
     "level": {
      "x": 40.64,
      "y": 86
     }
    },
    "portPlacements": {
     "in": {
      "x": 9.143999999999998,
      "y": 104,
      "labelPos": "below"
     },
     "voct": {
      "x": 25.4,
      "y": 104,
      "labelPos": "below"
     },
     "struct_cv": {
      "x": 41.65599999999999,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 16.256,
      "y": 118,
      "labelPos": "below"
     },
     "mix": {
      "x": 34.544000000000004,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_u46af14",
   "typeId": "tp_mmb_cr78",
   "internal": true,
   "name": "MMB CR-78",
   "brand": "MMB",
   "modelNumber": "CR-78",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3b2413",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "CR-78",
      "fontSize": 2.4,
      "color": "#fbe8c8",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "CompuRhythm · berekend",
      "fontSize": 1,
      "color": "#c8a878",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#fbe8c8",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "drum": {
      "x": 20.32,
      "y": 26
     },
     "tone": {
      "x": 11.3792,
      "y": 54
     },
     "decay": {
      "x": 29.2608,
      "y": 54
     },
     "bend": {
      "x": 11.3792,
      "y": 80
     },
     "level": {
      "x": 29.2608,
      "y": 80
     }
    },
    "portPlacements": {
     "gate": {
      "x": 6.502400000000001,
      "y": 104,
      "labelPos": "below"
     },
     "voct": {
      "x": 20.32,
      "y": 104,
      "labelPos": "below"
     },
     "accent_cv": {
      "x": 34.1376,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 20.32,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_jjghxf2",
   "typeId": "tp_mmb_quant",
   "internal": true,
   "name": "MMB QUANT",
   "brand": "MMB",
   "modelNumber": "QUANT",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "QUANT",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "CV → schaal",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "scale": {
      "x": 15.24,
      "y": 26
     },
     "root": {
      "x": 9.144,
      "y": 58
     },
     "glide": {
      "x": 21.336,
      "y": 58
     }
    },
    "portPlacements": {
     "in": {
      "x": 7.62,
      "y": 100,
      "labelPos": "below"
     },
     "out": {
      "x": 22.86,
      "y": 100,
      "labelPos": "below"
     },
     "trig": {
      "x": 22.86,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_44o8657",
   "typeId": "tp_mmb_chord",
   "internal": true,
   "name": "MMB CHORD",
   "brand": "MMB",
   "modelNumber": "CHORD",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "CHORD",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "1 in · 4 stemmen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "chord": {
      "x": 15.24,
      "y": 26
     },
     "inv": {
      "x": 9.144,
      "y": 58
     },
     "spread": {
      "x": 21.336,
      "y": 58
     }
    },
    "portPlacements": {
     "voct": {
      "x": 15.24,
      "y": 92,
      "labelPos": "below"
     },
     "out1": {
      "x": 6.096,
      "y": 112,
      "labelPos": "below"
     },
     "out2": {
      "x": 12.192,
      "y": 112,
      "labelPos": "below"
     },
     "out3": {
      "x": 18.288,
      "y": 112,
      "labelPos": "below"
     },
     "out4": {
      "x": 24.384,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_eb7cvm8",
   "typeId": "tp_mmb_elements_reverb",
   "internal": true,
   "name": "MI REVERB",
   "brand": "MI",
   "modelNumber": "REVERB",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "REVERB",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "Dattorro · stereo",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "amount": {
      "x": 11.3792,
      "y": 34
     },
     "time": {
      "x": 29.2608,
      "y": 34
     },
     "diffusion": {
      "x": 11.3792,
      "y": 66
     },
     "lp": {
      "x": 29.2608,
      "y": 66
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 10.16,
      "y": 96,
      "labelPos": "below"
     },
     "in_r": {
      "x": 30.48,
      "y": 96,
      "labelPos": "below"
     },
     "out_l": {
      "x": 10.16,
      "y": 114,
      "labelPos": "below"
     },
     "out_r": {
      "x": 30.48,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_a0yuvy5",
   "typeId": "tp_mmb_grids",
   "internal": true,
   "name": "MMB GRIDS",
   "brand": "MMB",
   "modelNumber": "GRIDS",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "GRIDS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "drum-kaart · X/Y",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "x": {
      "x": 14.224,
      "y": 30
     },
     "y": {
      "x": 36.57599999999999,
      "y": 30
     },
     "bd": {
      "x": 9.143999999999998,
      "y": 60
     },
     "sd": {
      "x": 21.336,
      "y": 60
     },
     "hh": {
      "x": 33.528,
      "y": 60
     },
     "chaos": {
      "x": 44.704,
      "y": 60
     },
     "tempo": {
      "x": 15.239999999999998,
      "y": 84
     },
     "extclock": {
      "x": 38.099999999999994,
      "y": 84
     }
    },
    "portPlacements": {
     "clock": {
      "x": 7.112,
      "y": 102,
      "labelPos": "below"
     },
     "reset": {
      "x": 19.304,
      "y": 102,
      "labelPos": "below"
     },
     "x_cv": {
      "x": 31.496,
      "y": 102,
      "labelPos": "below"
     },
     "y_cv": {
      "x": 43.687999999999995,
      "y": 102,
      "labelPos": "below"
     },
     "bd": {
      "x": 7.112,
      "y": 118,
      "labelPos": "below"
     },
     "sd": {
      "x": 19.304,
      "y": 118,
      "labelPos": "below"
     },
     "hh": {
      "x": 31.496,
      "y": 118,
      "labelPos": "below"
     },
     "acc": {
      "x": 43.687999999999995,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_mmd22ua",
   "typeId": "tp_mmb_comp",
   "internal": true,
   "name": "MMB COMP",
   "brand": "MMB",
   "modelNumber": "COMP",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "COMP",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 14,
      "text": "comp + drive",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "threshold": {
      "x": 8.534400000000002,
      "y": 30
     },
     "ratio": {
      "x": 21.9456,
      "y": 30
     },
     "attack": {
      "x": 8.534400000000002,
      "y": 60
     },
     "release": {
      "x": 21.9456,
      "y": 60
     },
     "makeup": {
      "x": 8.534400000000002,
      "y": 86
     },
     "drive": {
      "x": 21.9456,
      "y": 86
     }
    },
    "portPlacements": {
     "thr_cv": {
      "x": 4.8768,
      "y": 104,
      "labelPos": "below"
     },
     "drive_cv": {
      "x": 12.192,
      "y": 104,
      "labelPos": "below"
     },
     "in": {
      "x": 9.144,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 21.336,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_a14oll8",
   "typeId": "tp_mmb_noise",
   "internal": true,
   "name": "MMB NOISE",
   "brand": "MMB",
   "modelNumber": "NOISE",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "NOISE",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "color": {
      "x": 10.16,
      "y": 30
     },
     "level": {
      "x": 10.16,
      "y": 60
     }
    },
    "portPlacements": {
     "out": {
      "x": 10.16,
      "y": 100,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_cqpg1w2",
   "typeId": "tp_mmb_audioin",
   "internal": true,
   "name": "MMB AUDIO IN",
   "brand": "MMB",
   "modelNumber": "AUDIO IN",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "IN",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 13,
      "text": "mic · usb",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "level": {
      "x": 10.16,
      "y": 30
     },
     "mono": {
      "x": 10.16,
      "y": 62
     }
    },
    "portPlacements": {
     "out_l": {
      "x": 6.096,
      "y": 100,
      "labelPos": "below"
     },
     "out_r": {
      "x": 14.223999999999998,
      "y": 100,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_tnsuli9",
   "typeId": "tp_mmb_echo",
   "internal": true,
   "name": "MMB ECHO",
   "brand": "MMB",
   "modelNumber": "ECHO",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "ECHO",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 14,
      "text": "feedback delay",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "time": {
      "x": 9.144,
      "y": 30
     },
     "feedback": {
      "x": 21.336,
      "y": 30
     },
     "mix": {
      "x": 9.144,
      "y": 70
     },
     "tempo_sync": {
      "x": 21.336,
      "y": 70
     }
    },
    "portPlacements": {
     "time_cv": {
      "x": 5.4864,
      "y": 100,
      "labelPos": "below"
     },
     "fbk_cv": {
      "x": 11.5824,
      "y": 100,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 17.6784,
      "y": 100,
      "labelPos": "below"
     },
     "in": {
      "x": 9.144,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 21.336,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_vcjj390",
   "typeId": "tp_mmb_tape_echo",
   "internal": true,
   "name": "MMB TAPE",
   "brand": "MMB",
   "modelNumber": "TAPE",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f1a14",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "TAPE ECHO",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "sat · tone · wow/flutter",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "time": {
      "x": 10.16,
      "y": 30
     },
     "feedback": {
      "x": 30.48,
      "y": 30
     },
     "mix": {
      "x": 10.16,
      "y": 58
     },
     "tone": {
      "x": 30.48,
      "y": 58
     },
     "wow": {
      "x": 8.128,
      "y": 82
     },
     "flutter": {
      "x": 20.32,
      "y": 82
     },
     "drive": {
      "x": 32.512,
      "y": 82
     }
    },
    "portPlacements": {
     "time_cv": {
      "x": 6.096,
      "y": 102,
      "labelPos": "below"
     },
     "fbk_cv": {
      "x": 15.443200000000001,
      "y": 102,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 24.790399999999998,
      "y": 102,
      "labelPos": "below"
     },
     "in": {
      "x": 12.192,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 28.447999999999997,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_y6nkvrx",
   "typeId": "tp_mmb_stereo_tape_echo",
   "internal": true,
   "name": "MMB TAPE-ST",
   "brand": "MMB",
   "modelNumber": "TAPE-ST",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f1a14",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "STEREO TAPE",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 14,
      "text": "twee sporen · cross-feedback",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "time": {
      "x": 10.9728,
      "y": 30
     },
     "ratio": {
      "x": 30.48,
      "y": 30
     },
     "feedback": {
      "x": 49.987199999999994,
      "y": 30
     },
     "cross": {
      "x": 10.9728,
      "y": 58
     },
     "mix": {
      "x": 30.48,
      "y": 58
     },
     "tone": {
      "x": 49.987199999999994,
      "y": 58
     },
     "wow": {
      "x": 10.9728,
      "y": 82
     },
     "flutter": {
      "x": 30.48,
      "y": 82
     },
     "drive": {
      "x": 49.987199999999994,
      "y": 82
     }
    },
    "portPlacements": {
     "time_cv": {
      "x": 6.096,
      "y": 102,
      "labelPos": "below"
     },
     "fbk_cv": {
      "x": 18.288,
      "y": 102,
      "labelPos": "below"
     },
     "cross_cv": {
      "x": 30.48,
      "y": 102,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 42.672,
      "y": 102,
      "labelPos": "below"
     },
     "in_l": {
      "x": 7.3152,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 18.288,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 42.672,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 53.644800000000004,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ru4hey2",
   "typeId": "tp_mmb_digital_echo",
   "internal": true,
   "name": "MMB DDL-12",
   "brand": "MMB",
   "modelNumber": "DDL-12",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#14181f",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "DIGITAL ECHO",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 14,
      "text": "12-bit · modulatie · stereo",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "time": {
      "x": 10.9728,
      "y": 30
     },
     "ratio": {
      "x": 30.48,
      "y": 30
     },
     "feedback": {
      "x": 49.987199999999994,
      "y": 30
     },
     "cross": {
      "x": 10.9728,
      "y": 58
     },
     "mod_rate": {
      "x": 30.48,
      "y": 58
     },
     "mod_depth": {
      "x": 49.987199999999994,
      "y": 58
     },
     "bits": {
      "x": 10.9728,
      "y": 82
     },
     "band": {
      "x": 30.48,
      "y": 82
     },
     "mix": {
      "x": 49.987199999999994,
      "y": 82
     }
    },
    "portPlacements": {
     "time_cv": {
      "x": 6.096,
      "y": 102,
      "labelPos": "below"
     },
     "fbk_cv": {
      "x": 18.288,
      "y": 102,
      "labelPos": "below"
     },
     "mod_cv": {
      "x": 30.48,
      "y": 102,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 42.672,
      "y": 102,
      "labelPos": "below"
     },
     "in_l": {
      "x": 7.3152,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 18.288,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 42.672,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 53.644800000000004,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_5kijifu",
   "typeId": "tp_mmb_bbd_chorus",
   "internal": true,
   "name": "MMB BBD",
   "brand": "MMB",
   "modelNumber": "BBD",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1a1f1a",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "BBD CHORUS",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "emmertjes · stereo",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 12.7,
      "y": 30
     },
     "depth": {
      "x": 38.099999999999994,
      "y": 30
     },
     "delay": {
      "x": 12.7,
      "y": 58
     },
     "feedback": {
      "x": 38.099999999999994,
      "y": 58
     },
     "mix": {
      "x": 10.16,
      "y": 82
     },
     "spread": {
      "x": 25.4,
      "y": 82
     },
     "age": {
      "x": 40.64,
      "y": 82
     },
     "tone": {
      "x": 25.4,
      "y": 58
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 7.619999999999999,
      "y": 102,
      "labelPos": "below"
     },
     "depth_cv": {
      "x": 20.32,
      "y": 102,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 33.019999999999996,
      "y": 102,
      "labelPos": "below"
     },
     "in_l": {
      "x": 6.095999999999999,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 16.256,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 34.544000000000004,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 44.704,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_wou481h",
   "typeId": "tp_mmb_ringmod",
   "internal": true,
   "name": "MMB RING",
   "brand": "MMB",
   "modelNumber": "RING",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f1420",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "RING MOD",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "clean · diode",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "freq": {
      "x": 20.32,
      "y": 32
     },
     "wave": {
      "x": 8.9408,
      "y": 62
     },
     "mode": {
      "x": 29.2608,
      "y": 62
     },
     "bias": {
      "x": 11.3792,
      "y": 86
     },
     "mix": {
      "x": 29.2608,
      "y": 86
     }
    },
    "portPlacements": {
     "voct": {
      "x": 8.128,
      "y": 104,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 20.32,
      "y": 104,
      "labelPos": "below"
     },
     "carrier": {
      "x": 32.512,
      "y": 104,
      "labelPos": "below"
     },
     "in": {
      "x": 12.192,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 28.447999999999997,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_8jwtvg9",
   "typeId": "tp_mmb_octaver",
   "internal": true,
   "name": "MMB OCTAVE",
   "brand": "MMB",
   "modelNumber": "OCTAVE",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#14201a",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "OCTAVER",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "−1 · −2 · up",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "oct1": {
      "x": 11.3792,
      "y": 32
     },
     "oct2": {
      "x": 29.2608,
      "y": 32
     },
     "up": {
      "x": 11.3792,
      "y": 62
     },
     "dry": {
      "x": 29.2608,
      "y": 62
     },
     "tone": {
      "x": 20.32,
      "y": 86
     }
    },
    "portPlacements": {
     "oct1_cv": {
      "x": 8.128,
      "y": 104,
      "labelPos": "below"
     },
     "oct2_cv": {
      "x": 20.32,
      "y": 104,
      "labelPos": "below"
     },
     "up_cv": {
      "x": 32.512,
      "y": 104,
      "labelPos": "below"
     },
     "in": {
      "x": 12.192,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 28.447999999999997,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_tphhaxg",
   "typeId": "tp_mmb_harmonizer",
   "internal": true,
   "name": "MMB HARMONY",
   "brand": "MMB",
   "modelNumber": "HARMONY",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1a1424",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "HARMONIZER",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 14,
      "text": "twee stemmen · shimmer",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 22,
      "text": "A",
      "fontSize": 1.2,
      "color": "#c084fc",
      "align": "middle"
     },
     {
      "x": 45.72,
      "y": 22,
      "text": "B",
      "fontSize": 1.2,
      "color": "#c084fc",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "semi_a": {
      "x": 8.534400000000002,
      "y": 34
     },
     "cent_a": {
      "x": 21.9456,
      "y": 34
     },
     "semi_b": {
      "x": 39.0144,
      "y": 34
     },
     "cent_b": {
      "x": 52.4256,
      "y": 34
     },
     "lvl_a": {
      "x": 8.534400000000002,
      "y": 60
     },
     "lvl_b": {
      "x": 52.4256,
      "y": 60
     },
     "window": {
      "x": 23.1648,
      "y": 62
     },
     "feedback": {
      "x": 37.7952,
      "y": 62
     },
     "spread": {
      "x": 8.534400000000002,
      "y": 86
     },
     "algo": {
      "x": 23.1648,
      "y": 86
     },
     "jitter": {
      "x": 37.7952,
      "y": 86
     },
     "mix": {
      "x": 52.4256,
      "y": 86
     }
    },
    "portPlacements": {
     "voct_a": {
      "x": 8.534400000000002,
      "y": 104,
      "labelPos": "below"
     },
     "voct_b": {
      "x": 24.384,
      "y": 104,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 40.2336,
      "y": 104,
      "labelPos": "below"
     },
     "in": {
      "x": 12.192,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 40.2336,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 52.4256,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_xf173y1",
   "typeId": "tp_mmb_reverb",
   "internal": true,
   "name": "MMB PLATE·SPRING",
   "brand": "MMB",
   "modelNumber": "PLATE·SPRING",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#141c24",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "REVERB",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "plaat · veer",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "size": {
      "x": 14.224,
      "y": 32
     },
     "mode": {
      "x": 38.608,
      "y": 30
     },
     "damp": {
      "x": 11.176,
      "y": 62
     },
     "predelay": {
      "x": 25.4,
      "y": 62
     },
     "mod": {
      "x": 39.624,
      "y": 62
     },
     "mix": {
      "x": 25.4,
      "y": 86
     }
    },
    "portPlacements": {
     "size_cv": {
      "x": 12.7,
      "y": 104,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 38.099999999999994,
      "y": 104,
      "labelPos": "below"
     },
     "in_l": {
      "x": 6.095999999999999,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 16.256,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 34.544000000000004,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 44.704,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_j6cefss",
   "typeId": "tp_mmb_tremolo",
   "internal": true,
   "name": "MMB TREM",
   "brand": "MMB",
   "modelNumber": "TREM",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f1a10",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "TREMOLO",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "amp · opto · harm · pan",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 11.3792,
      "y": 32
     },
     "depth": {
      "x": 29.2608,
      "y": 32
     },
     "mode": {
      "x": 8.9408,
      "y": 60
     },
     "wave": {
      "x": 29.2608,
      "y": 60
     },
     "shape": {
      "x": 11.3792,
      "y": 88
     },
     "level": {
      "x": 29.2608,
      "y": 88
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 10.16,
      "y": 104,
      "labelPos": "below"
     },
     "depth_cv": {
      "x": 30.48,
      "y": 104,
      "labelPos": "below"
     },
     "in_l": {
      "x": 4.8768,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 13.004800000000001,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 27.6352,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 35.7632,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_f9j62oo",
   "typeId": "tp_mmb_stereo_phaser",
   "internal": true,
   "name": "MMB PHASE-ST",
   "brand": "MMB",
   "modelNumber": "PHASE-ST",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#10201c",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "STEREO PHASER",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "2 × 6 stages",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 11.3792,
      "y": 32
     },
     "depth": {
      "x": 29.2608,
      "y": 32
     },
     "feedback": {
      "x": 11.3792,
      "y": 62
     },
     "spread": {
      "x": 29.2608,
      "y": 62
     },
     "mix": {
      "x": 20.32,
      "y": 88
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 10.16,
      "y": 104,
      "labelPos": "below"
     },
     "depth_cv": {
      "x": 30.48,
      "y": 104,
      "labelPos": "below"
     },
     "in_l": {
      "x": 4.8768,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 13.004800000000001,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 27.6352,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 35.7632,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_evfq68t",
   "typeId": "tp_mmb_vibe",
   "internal": true,
   "name": "MMB VIBE",
   "brand": "MMB",
   "modelNumber": "VIBE",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#241a12",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "VIBE",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "lamp · 4 × LDR",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "speed": {
      "x": 11.3792,
      "y": 32
     },
     "intensity": {
      "x": 29.2608,
      "y": 32
     },
     "mode": {
      "x": 9.7536,
      "y": 60
     },
     "lamp_age": {
      "x": 29.2608,
      "y": 62
     },
     "volume": {
      "x": 20.32,
      "y": 88
     }
    },
    "portPlacements": {
     "speed_cv": {
      "x": 10.16,
      "y": 104,
      "labelPos": "below"
     },
     "intensity_cv": {
      "x": 30.48,
      "y": 104,
      "labelPos": "below"
     },
     "in_l": {
      "x": 4.8768,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 13.004800000000001,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 27.6352,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 35.7632,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_32auudn",
   "typeId": "tp_mmb_rotary",
   "internal": true,
   "name": "MMB ROTARY",
   "brand": "MMB",
   "modelNumber": "ROTARY",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1d14",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "ROTARY",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 14,
      "text": "hoorn · trommel · traagheid",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "speed": {
      "x": 9.7536,
      "y": 30
     },
     "slow_rate": {
      "x": 26.822400000000002,
      "y": 30
     },
     "fast_rate": {
      "x": 46.3296,
      "y": 30
     },
     "inertia": {
      "x": 9.7536,
      "y": 60
     },
     "drive": {
      "x": 24.384,
      "y": 60
     },
     "balance": {
      "x": 39.0144,
      "y": 60
     },
     "spread": {
      "x": 52.4256,
      "y": 60
     },
     "noise": {
      "x": 18.288,
      "y": 86
     },
     "level": {
      "x": 42.672,
      "y": 86
     }
    },
    "portPlacements": {
     "fast": {
      "x": 15.24,
      "y": 104,
      "labelPos": "below"
     },
     "drive_cv": {
      "x": 33.528000000000006,
      "y": 104,
      "labelPos": "below"
     },
     "in_l": {
      "x": 7.3152,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 18.288,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 42.672,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 53.644800000000004,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_t51icrb",
   "typeId": "tp_mmb_shimmer",
   "internal": true,
   "name": "MMB SHIMMER",
   "brand": "MMB",
   "modelNumber": "SHIMMER",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#161a2a",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "SHIMMER",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "galm · octaaf in de lus",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "shimmer": {
      "x": 14.224,
      "y": 32
     },
     "interval": {
      "x": 39.624,
      "y": 30
     },
     "size": {
      "x": 10.16,
      "y": 62
     },
     "damp": {
      "x": 22.352,
      "y": 62
     },
     "tone": {
      "x": 34.544000000000004,
      "y": 62
     },
     "predelay": {
      "x": 10.16,
      "y": 86
     },
     "mod": {
      "x": 22.352,
      "y": 86
     },
     "mix": {
      "x": 36.57599999999999,
      "y": 86
     }
    },
    "portPlacements": {
     "shimmer_cv": {
      "x": 10.16,
      "y": 104,
      "labelPos": "below"
     },
     "size_cv": {
      "x": 25.4,
      "y": 104,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 40.64,
      "y": 104,
      "labelPos": "below"
     },
     "in_l": {
      "x": 6.095999999999999,
      "y": 118,
      "labelPos": "below"
     },
     "in_r": {
      "x": 16.256,
      "y": 118,
      "labelPos": "below"
     },
     "out_l": {
      "x": 34.544000000000004,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 44.704,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_uptg07m",
   "typeId": "tp_mmb_fet_comp",
   "internal": true,
   "name": "MMB FET",
   "brand": "MMB",
   "modelNumber": "FET",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#16181c",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "FET COMP",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "limiting amplifier",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "input": {
      "x": 10.972800000000001,
      "y": 30
     },
     "output": {
      "x": 29.6672,
      "y": 30
     },
     "attack": {
      "x": 10.972800000000001,
      "y": 56
     },
     "release": {
      "x": 29.6672,
      "y": 56
     },
     "ratio": {
      "x": 8.9408,
      "y": 80
     },
     "mix": {
      "x": 29.2608,
      "y": 68
     },
     "color": {
      "x": 29.2608,
      "y": 82
     },
     "bypass": {
      "x": 20.32,
      "y": 92
     }
    },
    "portPlacements": {
     "gr": {
      "x": 20.32,
      "y": 106,
      "labelPos": "below"
     },
     "in_l": {
      "x": 6.096,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 13.004800000000001,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 27.6352,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 34.544,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_645enc8",
   "typeId": "tp_mmb_opto_comp",
   "internal": true,
   "name": "MMB OPTO",
   "brand": "MMB",
   "modelNumber": "OPTO",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1b1714",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "OPTO COMP",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "leveling amplifier",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "peak": {
      "x": 10.972800000000001,
      "y": 32
     },
     "gain": {
      "x": 29.6672,
      "y": 32
     },
     "mode": {
      "x": 8.9408,
      "y": 62
     },
     "color": {
      "x": 29.2608,
      "y": 60
     },
     "mix": {
      "x": 29.2608,
      "y": 78
     },
     "bypass": {
      "x": 8.9408,
      "y": 86
     }
    },
    "portPlacements": {
     "gr": {
      "x": 20.32,
      "y": 106,
      "labelPos": "below"
     },
     "in_l": {
      "x": 6.096,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 13.004800000000001,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 27.6352,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 34.544,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_3w78pw9",
   "typeId": "tp_mmb_bus_comp",
   "internal": true,
   "name": "MMB VCA-BUS",
   "brand": "MMB",
   "modelNumber": "VCA-BUS",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1a1d22",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "VCA-BUS",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "bus compressor",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "threshold": {
      "x": 13.716,
      "y": 30
     },
     "makeup": {
      "x": 37.083999999999996,
      "y": 30
     },
     "ratio": {
      "x": 5.08,
      "y": 54
     },
     "attack": {
      "x": 20.32,
      "y": 60
     },
     "release": {
      "x": 35.559999999999995,
      "y": 59
     },
     "sc_hpf": {
      "x": 5.08,
      "y": 82
     },
     "mix": {
      "x": 24.383999999999997,
      "y": 84
     },
     "bypass": {
      "x": 39.624,
      "y": 84
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 6.095999999999999,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 14.224,
      "y": 106,
      "labelPos": "below"
     },
     "gr": {
      "x": 25.4,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 36.57599999999999,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 44.704,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_g8s01ef",
   "typeId": "tp_mmb_varimu_comp",
   "internal": true,
   "name": "MMB VARI-MU",
   "brand": "MMB",
   "modelNumber": "VARI-MU",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#201a14",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "VARI-MU",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "tube limiter",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "input": {
      "x": 10.16,
      "y": 30
     },
     "threshold": {
      "x": 25.4,
      "y": 30
     },
     "output": {
      "x": 40.64,
      "y": 30
     },
     "time": {
      "x": 6.095999999999999,
      "y": 62
     },
     "mode": {
      "x": 21.336,
      "y": 56
     },
     "color": {
      "x": 38.608,
      "y": 54
     },
     "mix": {
      "x": 38.608,
      "y": 74
     },
     "bypass": {
      "x": 21.336,
      "y": 78
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 6.095999999999999,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 14.224,
      "y": 106,
      "labelPos": "below"
     },
     "gr": {
      "x": 25.4,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 36.57599999999999,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 44.704,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_wo2nsu4",
   "typeId": "tp_mmb_program_eq",
   "internal": true,
   "name": "MMB PROGRAM EQ",
   "brand": "MMB",
   "modelNumber": "PROGRAM EQ",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1c2230",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "PROGRAM EQ",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 14,
      "text": "passive program equalizer",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "low_freq": {
      "x": 4.267200000000001,
      "y": 30
     },
     "low_boost": {
      "x": 20.7264,
      "y": 30
     },
     "low_atten": {
      "x": 35.3568,
      "y": 30
     },
     "output": {
      "x": 51.2064,
      "y": 30
     },
     "high_freq": {
      "x": 4.267200000000001,
      "y": 60
     },
     "high_boost": {
      "x": 20.7264,
      "y": 58
     },
     "bandwidth": {
      "x": 35.3568,
      "y": 58
     },
     "color": {
      "x": 51.2064,
      "y": 58
     },
     "atten_freq": {
      "x": 4.267200000000001,
      "y": 86
     },
     "high_atten": {
      "x": 20.7264,
      "y": 86
     },
     "bypass": {
      "x": 40.2336,
      "y": 86
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 9.144,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 19.5072,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 41.4528,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 51.816,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_36sspsx",
   "typeId": "tp_mmb_diode_comp",
   "internal": true,
   "name": "MMB DIODE",
   "brand": "MMB",
   "modelNumber": "DIODE",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#232a24",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "DIODE COMP",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "diode bridge compressor",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "threshold": {
      "x": 13.716,
      "y": 30
     },
     "makeup": {
      "x": 37.083999999999996,
      "y": 30
     },
     "ratio": {
      "x": 5.08,
      "y": 58
     },
     "attack": {
      "x": 20.32,
      "y": 54
     },
     "release": {
      "x": 33.528,
      "y": 60
     },
     "color": {
      "x": 20.32,
      "y": 76
     },
     "mix": {
      "x": 7.112,
      "y": 84
     },
     "bypass": {
      "x": 35.559999999999995,
      "y": 86
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 6.095999999999999,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 14.224,
      "y": 106,
      "labelPos": "below"
     },
     "gr": {
      "x": 25.4,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 36.57599999999999,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 44.704,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_1t4c6ed",
   "typeId": "tp_mmb_console_eq",
   "internal": true,
   "name": "MMB CONSOLE EQ",
   "brand": "MMB",
   "modelNumber": "CONSOLE EQ",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a2320",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "CONSOLE EQ",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 14,
      "text": "class-A channel equalizer",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "hpf": {
      "x": 5.08,
      "y": 32
     },
     "high_gain": {
      "x": 22.86,
      "y": 30
     },
     "output": {
      "x": 40.64,
      "y": 30
     },
     "mid_freq": {
      "x": 5.08,
      "y": 62
     },
     "mid_gain": {
      "x": 22.86,
      "y": 58
     },
     "color": {
      "x": 40.64,
      "y": 58
     },
     "low_freq": {
      "x": 5.08,
      "y": 88
     },
     "low_gain": {
      "x": 22.86,
      "y": 86
     },
     "bypass": {
      "x": 39.624,
      "y": 88
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 7.619999999999999,
      "y": 106,
      "labelPos": "below"
     },
     "in_r": {
      "x": 16.256,
      "y": 106,
      "labelPos": "below"
     },
     "out_l": {
      "x": 34.544000000000004,
      "y": 106,
      "labelPos": "below"
     },
     "out_r": {
      "x": 43.18,
      "y": 106,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_oy4x5yl",
   "typeId": "tp_mmb_para_eq",
   "internal": true,
   "name": "MMB PARA EQ",
   "brand": "MMB",
   "modelNumber": "PARA EQ",
   "visual": {
    "hpWidth": 14,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1e232b",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "PARA EQ",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 14,
      "text": "4-band parametric equalizer",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 9.245600000000001,
      "y": 22,
      "text": "LF",
      "fontSize": 1.4,
      "color": "#f97316",
      "align": "middle"
     },
     {
      "x": 27.0256,
      "y": 22,
      "text": "LMF",
      "fontSize": 1.4,
      "color": "#f5a623",
      "align": "middle"
     },
     {
      "x": 44.805600000000005,
      "y": 22,
      "text": "HMF",
      "fontSize": 1.4,
      "color": "#f5a623",
      "align": "middle"
     },
     {
      "x": 62.58560000000001,
      "y": 22,
      "text": "HF",
      "fontSize": 1.4,
      "color": "#38bdf8",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "lf_freq": {
      "x": 9.245600000000001,
      "y": 32
     },
     "lf_gain": {
      "x": 9.245600000000001,
      "y": 50
     },
     "lf_shelf": {
      "x": 7.112000000000001,
      "y": 68
     },
     "lmf_freq": {
      "x": 27.0256,
      "y": 32
     },
     "lmf_gain": {
      "x": 27.0256,
      "y": 50
     },
     "lmf_q": {
      "x": 27.0256,
      "y": 68
     },
     "hmf_freq": {
      "x": 44.805600000000005,
      "y": 32
     },
     "hmf_gain": {
      "x": 44.805600000000005,
      "y": 50
     },
     "hmf_q": {
      "x": 44.805600000000005,
      "y": 68
     },
     "hf_freq": {
      "x": 62.58560000000001,
      "y": 32
     },
     "hf_gain": {
      "x": 62.58560000000001,
      "y": 50
     },
     "hf_shelf": {
      "x": 60.452000000000005,
      "y": 68
     },
     "hpf": {
      "x": 9.245600000000001,
      "y": 88
     },
     "lpf": {
      "x": 62.58560000000001,
      "y": 88
     },
     "prop_q": {
      "x": 24.892,
      "y": 90
     },
     "output": {
      "x": 44.805600000000005,
      "y": 88
     },
     "bypass": {
      "x": 35.56,
      "y": 108
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 7.112000000000001,
      "y": 108,
      "labelPos": "below"
     },
     "in_r": {
      "x": 17.0688,
      "y": 108,
      "labelPos": "below"
     },
     "out_l": {
      "x": 54.0512,
      "y": 108,
      "labelPos": "below"
     },
     "out_r": {
      "x": 64.00800000000001,
      "y": 108,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_8wvujqt",
   "typeId": "tp_mmb_sampler",
   "internal": true,
   "name": "MMB SAMPLER",
   "brand": "MMB",
   "modelNumber": "SAMPLER",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#14261f",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "SAMPLER",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 14,
      "text": "keymap · 8 stemmen · filter per stem",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 73,
      "text": "Env",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 85,
      "text": "Cut",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 97,
      "text": "V/Oct",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 109,
      "text": "Gate",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 121,
      "text": "Vel",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     }
    ],
    "controlPlacements": {
     "bank": {
      "x": 8.128,
      "y": 28
     },
     "level": {
      "x": 20.32,
      "y": 28
     },
     "coarse": {
      "x": 32.512,
      "y": 28
     },
     "fine": {
      "x": 42.2656,
      "y": 28
     },
     "start": {
      "x": 52.019200000000005,
      "y": 28
     },
     "attack": {
      "x": 61.772800000000004,
      "y": 28
     },
     "env_rel": {
      "x": 73.152,
      "y": 28
     },
     "filter": {
      "x": 6.502400000000001,
      "y": 45
     },
     "cutoff": {
      "x": 19.5072,
      "y": 45
     },
     "q": {
      "x": 30.886400000000002,
      "y": 45
     },
     "fmode": {
      "x": 40.64,
      "y": 45
     },
     "drive": {
      "x": 50.3936,
      "y": 45
     },
     "cv_amt": {
      "x": 60.1472,
      "y": 45
     },
     "env_sens": {
      "x": 60.96,
      "y": 58
     },
     "limit": {
      "x": 5.6896,
      "y": 58
     },
     "era": {
      "x": 26.822400000000002,
      "y": 58
     },
     "clock": {
      "x": 41.4528,
      "y": 58
     },
     "bits": {
      "x": 51.2064,
      "y": 58
     }
    },
    "portPlacements": {
     "bend": {
      "x": 16.256,
      "y": 58,
      "labelPos": "below"
     },
     "out_l": {
      "x": 69.9008,
      "y": 45,
      "labelPos": "below"
     },
     "out_r": {
      "x": 75.5904,
      "y": 45,
      "labelPos": "below"
     },
     "out_3": {
      "x": 69.9008,
      "y": 58,
      "labelPos": "below"
     },
     "out_4": {
      "x": 75.5904,
      "y": 58,
      "labelPos": "below"
     },
     "env_1": {
      "x": 5.08,
      "y": 72,
      "labelPos": "below"
     },
     "env_2": {
      "x": 15.24,
      "y": 72,
      "labelPos": "below"
     },
     "env_3": {
      "x": 25.4,
      "y": 72,
      "labelPos": "below"
     },
     "env_4": {
      "x": 35.56,
      "y": 72,
      "labelPos": "below"
     },
     "env_5": {
      "x": 45.72,
      "y": 72,
      "labelPos": "below"
     },
     "env_6": {
      "x": 55.88,
      "y": 72,
      "labelPos": "below"
     },
     "env_7": {
      "x": 66.04,
      "y": 72,
      "labelPos": "below"
     },
     "env_8": {
      "x": 76.2,
      "y": 72,
      "labelPos": "below"
     },
     "cutoff_1": {
      "x": 5.08,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_2": {
      "x": 15.24,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_3": {
      "x": 25.4,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_4": {
      "x": 35.56,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_5": {
      "x": 45.72,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_6": {
      "x": 55.88,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_7": {
      "x": 66.04,
      "y": 84,
      "labelPos": "below"
     },
     "cutoff_8": {
      "x": 76.2,
      "y": 84,
      "labelPos": "below"
     },
     "voct_1": {
      "x": 5.08,
      "y": 96,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 15.24,
      "y": 96,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 25.4,
      "y": 96,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 35.56,
      "y": 96,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 45.72,
      "y": 96,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 55.88,
      "y": 96,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 66.04,
      "y": 96,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 76.2,
      "y": 96,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 5.08,
      "y": 108,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 15.24,
      "y": 108,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 25.4,
      "y": 108,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 35.56,
      "y": 108,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 45.72,
      "y": 108,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 55.88,
      "y": 108,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 66.04,
      "y": 108,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 76.2,
      "y": 108,
      "labelPos": "below"
     },
     "vel_1": {
      "x": 5.08,
      "y": 120,
      "labelPos": "below"
     },
     "vel_2": {
      "x": 15.24,
      "y": 120,
      "labelPos": "below"
     },
     "vel_3": {
      "x": 25.4,
      "y": 120,
      "labelPos": "below"
     },
     "vel_4": {
      "x": 35.56,
      "y": 120,
      "labelPos": "below"
     },
     "vel_5": {
      "x": 45.72,
      "y": 120,
      "labelPos": "below"
     },
     "vel_6": {
      "x": 55.88,
      "y": 120,
      "labelPos": "below"
     },
     "vel_7": {
      "x": 66.04,
      "y": 120,
      "labelPos": "below"
     },
     "vel_8": {
      "x": 76.2,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_og750lc",
   "typeId": "tp_mmb_zang",
   "internal": true,
   "name": "MMB ZANG",
   "brand": "MMB",
   "modelNumber": "ZANG",
   "visual": {
    "hpWidth": 14,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1a2e",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "ZANG",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 12,
      "text": "woorden · 8 stemmen · PSOLA",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 97,
      "text": "V/Oct",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 109,
      "text": "Gate",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 121,
      "text": "Vel",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     }
    ],
    "controlPlacements": {
     "bank": {
      "x": 8.5344,
      "y": 28
     },
     "syl": {
      "x": 22.7584,
      "y": 28
     },
     "sylDisp": {
      "x": 35.56,
      "y": 28
     },
     "mode": {
      "x": 48.36160000000001,
      "y": 28
     },
     "level": {
      "x": 62.58560000000001,
      "y": 28
     },
     "speed": {
      "x": 8.5344,
      "y": 52
     },
     "formant": {
      "x": 19.913600000000002,
      "y": 52
     },
     "attack": {
      "x": 31.292800000000003,
      "y": 52
     },
     "release": {
      "x": 41.2496,
      "y": 52
     },
     "coarse": {
      "x": 51.2064,
      "y": 52
     },
     "fine": {
      "x": 61.1632,
      "y": 52
     }
    },
    "portPlacements": {
     "syl_cv": {
      "x": 5.6896,
      "y": 74,
      "labelPos": "below"
     },
     "next": {
      "x": 15.646400000000002,
      "y": 74,
      "labelPos": "below"
     },
     "reset": {
      "x": 25.6032,
      "y": 74,
      "labelPos": "below"
     },
     "formant_cv": {
      "x": 35.56,
      "y": 74,
      "labelPos": "below"
     },
     "bend": {
      "x": 45.5168,
      "y": 74,
      "labelPos": "below"
     },
     "syl_out": {
      "x": 55.473600000000005,
      "y": 74,
      "labelPos": "below"
     },
     "out_l": {
      "x": 61.1632,
      "y": 84,
      "labelPos": "below"
     },
     "out_r": {
      "x": 66.8528,
      "y": 84,
      "labelPos": "below"
     },
     "voct_1": {
      "x": 4.445,
      "y": 96,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 13.335,
      "y": 96,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 22.225,
      "y": 96,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 31.115000000000002,
      "y": 96,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 40.005,
      "y": 96,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 48.895,
      "y": 96,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 57.785000000000004,
      "y": 96,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 66.67500000000001,
      "y": 96,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 4.445,
      "y": 108,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 13.335,
      "y": 108,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 22.225,
      "y": 108,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 31.115000000000002,
      "y": 108,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 40.005,
      "y": 108,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 48.895,
      "y": 108,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 57.785000000000004,
      "y": 108,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 66.67500000000001,
      "y": 108,
      "labelPos": "below"
     },
     "vel_1": {
      "x": 4.445,
      "y": 120,
      "labelPos": "below"
     },
     "vel_2": {
      "x": 13.335,
      "y": 120,
      "labelPos": "below"
     },
     "vel_3": {
      "x": 22.225,
      "y": 120,
      "labelPos": "below"
     },
     "vel_4": {
      "x": 31.115000000000002,
      "y": 120,
      "labelPos": "below"
     },
     "vel_5": {
      "x": 40.005,
      "y": 120,
      "labelPos": "below"
     },
     "vel_6": {
      "x": 48.895,
      "y": 120,
      "labelPos": "below"
     },
     "vel_7": {
      "x": 57.785000000000004,
      "y": 120,
      "labelPos": "below"
     },
     "vel_8": {
      "x": 66.67500000000001,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_rzxrjt4",
   "typeId": "tp_mmb_sid",
   "internal": true,
   "name": "MMB SID",
   "brand": "MMB",
   "modelNumber": "SID",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a2440",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "SID",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 14,
      "text": "1–4 chips · 3–12 stemmen · 6581/8580 · C64",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 85,
      "text": "V/Oct · Gate — stemmen 1–6 (chip 1–2)",
      "fontSize": 0.9,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 105,
      "text": "stemmen 7–12 (chip 3–4)",
      "fontSize": 0.9,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 91.44,
      "y": 19,
      "text": "CHIPS · UIT",
      "fontSize": 1,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 71.12,
      "y": 19,
      "text": "FILTER",
      "fontSize": 1.1,
      "color": "#38bdf8",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "tri": {
      "x": 8.534400000000002,
      "y": 26
     },
     "saw": {
      "x": 23.1648,
      "y": 26
     },
     "pulse": {
      "x": 37.7952,
      "y": 26
     },
     "noise": {
      "x": 52.4256,
      "y": 26
     },
     "pw": {
      "x": 9.7536,
      "y": 44
     },
     "combo": {
      "x": 26.822400000000002,
      "y": 44
     },
     "ring": {
      "x": 42.672,
      "y": 42
     },
     "sync": {
      "x": 54.864000000000004,
      "y": 42
     },
     "attack": {
      "x": 8.534400000000002,
      "y": 60
     },
     "decay": {
      "x": 23.1648,
      "y": 60
     },
     "sustain": {
      "x": 37.7952,
      "y": 60
     },
     "release": {
      "x": 52.4256,
      "y": 60
     },
     "coarse": {
      "x": 8.534400000000002,
      "y": 78
     },
     "fine": {
      "x": 23.1648,
      "y": 78
     },
     "volume": {
      "x": 37.7952,
      "y": 78
     },
     "level": {
      "x": 52.4256,
      "y": 78
     },
     "filt": {
      "x": 66.62,
      "y": 27
     },
     "model": {
      "x": 75.62,
      "y": 27
     },
     "cutoff": {
      "x": 71.12,
      "y": 44
     },
     "res": {
      "x": 66.62,
      "y": 60
     },
     "curve": {
      "x": 75.62,
      "y": 60
     },
     "lp": {
      "x": 64.92,
      "y": 76
     },
     "bp": {
      "x": 71.12,
      "y": 76
     },
     "hp": {
      "x": 77.32000000000001,
      "y": 76
     },
     "chips": {
      "x": 91.44,
      "y": 29
     },
     "spread": {
      "x": 91.44,
      "y": 46
     }
    },
    "portPlacements": {
     "voct_1": {
      "x": 7,
      "y": 90,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 16.6,
      "y": 90,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 26.2,
      "y": 90,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 35.8,
      "y": 90,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 45.4,
      "y": 90,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 55,
      "y": 90,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 7,
      "y": 110,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 16.6,
      "y": 110,
      "labelPos": "below"
     },
     "voct_9": {
      "x": 26.2,
      "y": 110,
      "labelPos": "below"
     },
     "voct_10": {
      "x": 35.8,
      "y": 110,
      "labelPos": "below"
     },
     "voct_11": {
      "x": 45.4,
      "y": 110,
      "labelPos": "below"
     },
     "voct_12": {
      "x": 55,
      "y": 110,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 7,
      "y": 99,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 16.6,
      "y": 99,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 26.2,
      "y": 99,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 35.8,
      "y": 99,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 45.4,
      "y": 99,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 55,
      "y": 99,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 7,
      "y": 119,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 16.6,
      "y": 119,
      "labelPos": "below"
     },
     "gate_9": {
      "x": 26.2,
      "y": 119,
      "labelPos": "below"
     },
     "gate_10": {
      "x": 35.8,
      "y": 119,
      "labelPos": "below"
     },
     "gate_11": {
      "x": 45.4,
      "y": 119,
      "labelPos": "below"
     },
     "gate_12": {
      "x": 55,
      "y": 119,
      "labelPos": "below"
     },
     "cutoff_cv": {
      "x": 71.12,
      "y": 96,
      "labelPos": "below"
     },
     "ext_in": {
      "x": 66.12,
      "y": 108,
      "labelPos": "below"
     },
     "ext_2": {
      "x": 76.12,
      "y": 108,
      "labelPos": "below"
     },
     "ext_3": {
      "x": 66.12,
      "y": 120,
      "labelPos": "below"
     },
     "ext_4": {
      "x": 76.12,
      "y": 120,
      "labelPos": "below"
     },
     "sid_1": {
      "x": 86.44,
      "y": 62,
      "labelPos": "below"
     },
     "sid_2": {
      "x": 96.44,
      "y": 62,
      "labelPos": "below"
     },
     "sid_3": {
      "x": 86.44,
      "y": 74,
      "labelPos": "below"
     },
     "sid_4": {
      "x": 96.44,
      "y": 74,
      "labelPos": "below"
     },
     "bend": {
      "x": 86.44,
      "y": 90,
      "labelPos": "below"
     },
     "pw_cv": {
      "x": 96.44,
      "y": 90,
      "labelPos": "below"
     },
     "out_l": {
      "x": 86.44,
      "y": 104,
      "labelPos": "below"
     },
     "out_r": {
      "x": 96.44,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 91.44,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ug1e1su",
   "typeId": "tp_mmb_sid3",
   "internal": true,
   "name": "MMB SID 3-OSC",
   "brand": "MMB",
   "modelNumber": "SID 3-OSC",
   "visual": {
    "hpWidth": 28,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a2440",
    "texts": [
     {
      "x": 71.12,
      "y": 8,
      "text": "SID 3-OSC",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 71.12,
      "y": 14,
      "text": "drie stemmen, elk eigen instellingen · Stack / Split · 6581/8580",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 71.12,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 4,
      "y": 25,
      "text": "1",
      "fontSize": 2,
      "color": "#c4b5fd",
      "align": "middle"
     },
     {
      "x": 4,
      "y": 45,
      "text": "2",
      "fontSize": 2,
      "color": "#c4b5fd",
      "align": "middle"
     },
     {
      "x": 4,
      "y": 65,
      "text": "3",
      "fontSize": 2,
      "color": "#c4b5fd",
      "align": "middle"
     },
     {
      "x": 105,
      "y": 79,
      "text": "FILTER",
      "fontSize": 1,
      "color": "#38bdf8",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "tri_1": {
      "x": 12,
      "y": 24
     },
     "saw_1": {
      "x": 21,
      "y": 24
     },
     "pulse_1": {
      "x": 30,
      "y": 24
     },
     "noise_1": {
      "x": 39,
      "y": 24
     },
     "pw_1": {
      "x": 49,
      "y": 26
     },
     "ring_1": {
      "x": 59,
      "y": 24
     },
     "sync_1": {
      "x": 68,
      "y": 24
     },
     "attack_1": {
      "x": 78,
      "y": 26
     },
     "decay_1": {
      "x": 87,
      "y": 26
     },
     "sustain_1": {
      "x": 96,
      "y": 26
     },
     "release_1": {
      "x": 105,
      "y": 26
     },
     "coarse_1": {
      "x": 115,
      "y": 26
     },
     "fine_1": {
      "x": 124,
      "y": 26
     },
     "filt_1": {
      "x": 134,
      "y": 24
     },
     "tri_2": {
      "x": 12,
      "y": 44
     },
     "saw_2": {
      "x": 21,
      "y": 44
     },
     "pulse_2": {
      "x": 30,
      "y": 44
     },
     "noise_2": {
      "x": 39,
      "y": 44
     },
     "pw_2": {
      "x": 49,
      "y": 46
     },
     "ring_2": {
      "x": 59,
      "y": 44
     },
     "sync_2": {
      "x": 68,
      "y": 44
     },
     "attack_2": {
      "x": 78,
      "y": 46
     },
     "decay_2": {
      "x": 87,
      "y": 46
     },
     "sustain_2": {
      "x": 96,
      "y": 46
     },
     "release_2": {
      "x": 105,
      "y": 46
     },
     "coarse_2": {
      "x": 115,
      "y": 46
     },
     "fine_2": {
      "x": 124,
      "y": 46
     },
     "filt_2": {
      "x": 134,
      "y": 44
     },
     "tri_3": {
      "x": 12,
      "y": 64
     },
     "saw_3": {
      "x": 21,
      "y": 64
     },
     "pulse_3": {
      "x": 30,
      "y": 64
     },
     "noise_3": {
      "x": 39,
      "y": 64
     },
     "pw_3": {
      "x": 49,
      "y": 66
     },
     "ring_3": {
      "x": 59,
      "y": 64
     },
     "sync_3": {
      "x": 68,
      "y": 64
     },
     "attack_3": {
      "x": 78,
      "y": 66
     },
     "decay_3": {
      "x": 87,
      "y": 66
     },
     "sustain_3": {
      "x": 96,
      "y": 66
     },
     "release_3": {
      "x": 105,
      "y": 66
     },
     "coarse_3": {
      "x": 115,
      "y": 66
     },
     "fine_3": {
      "x": 124,
      "y": 66
     },
     "filt_3": {
      "x": 134,
      "y": 64
     },
     "stack": {
      "x": 12,
      "y": 86
     },
     "combo": {
      "x": 27,
      "y": 88
     },
     "volume": {
      "x": 43,
      "y": 88
     },
     "level": {
      "x": 53,
      "y": 88
     },
     "cutoff": {
      "x": 68,
      "y": 88
     },
     "res": {
      "x": 81,
      "y": 88
     },
     "lp": {
      "x": 91,
      "y": 86
     },
     "bp": {
      "x": 99,
      "y": 86
     },
     "hp": {
      "x": 107,
      "y": 86
     },
     "model": {
      "x": 118,
      "y": 86
     },
     "curve": {
      "x": 130,
      "y": 88
     }
    },
    "portPlacements": {
     "voct_1": {
      "x": 12,
      "y": 108,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 22,
      "y": 108,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 32,
      "y": 108,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 44,
      "y": 108,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 54,
      "y": 108,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 64,
      "y": 108,
      "labelPos": "below"
     },
     "bend": {
      "x": 78,
      "y": 108,
      "labelPos": "below"
     },
     "pw_cv": {
      "x": 88,
      "y": 108,
      "labelPos": "below"
     },
     "cutoff_cv": {
      "x": 98,
      "y": 108,
      "labelPos": "below"
     },
     "ext_in": {
      "x": 110,
      "y": 108,
      "labelPos": "below"
     },
     "out": {
      "x": 130,
      "y": 108,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_edtttik",
   "typeId": "tp_mmb_phaser",
   "internal": true,
   "name": "MMB PHASER",
   "brand": "MMB",
   "modelNumber": "PHASER",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "PHASER",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 9.144,
      "y": 30
     },
     "depth": {
      "x": 21.336,
      "y": 30
     },
     "feedback": {
      "x": 9.144,
      "y": 70
     },
     "mix": {
      "x": 21.336,
      "y": 70
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 5.4864,
      "y": 100,
      "labelPos": "below"
     },
     "depth_cv": {
      "x": 12.8016,
      "y": 100,
      "labelPos": "below"
     },
     "in": {
      "x": 9.144,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 21.336,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_mrvkv1e",
   "typeId": "tp_mmb_stereo_vca",
   "internal": true,
   "name": "MMB ST-VCA",
   "brand": "MMB",
   "modelNumber": "ST-VCA",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "ST-VCA",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 14,
      "text": "vol + pan",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "vol": {
      "x": 9.144,
      "y": 36
     },
     "pan": {
      "x": 21.336,
      "y": 36
     }
    },
    "portPlacements": {
     "vol_cv": {
      "x": 6.096,
      "y": 86,
      "labelPos": "below"
     },
     "pan_cv": {
      "x": 15.24,
      "y": 86,
      "labelPos": "below"
     },
     "in": {
      "x": 24.384,
      "y": 86,
      "labelPos": "below"
     },
     "l": {
      "x": 9.7536,
      "y": 112,
      "labelPos": "below"
     },
     "r": {
      "x": 20.7264,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_i1uacil",
   "typeId": "tp_mmb_fm_vco",
   "internal": true,
   "name": "MMB FM-VCO",
   "brand": "MMB",
   "modelNumber": "FM-VCO",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "FM-VCO",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "wave": {
      "x": 20.32,
      "y": 22
     },
     "coarse": {
      "x": 12.192,
      "y": 50
     },
     "fine": {
      "x": 28.447999999999997,
      "y": 50
     },
     "fm_amt": {
      "x": 12.192,
      "y": 78
     },
     "level": {
      "x": 28.447999999999997,
      "y": 78
     }
    },
    "portPlacements": {
     "voct": {
      "x": 7.3152,
      "y": 104,
      "labelPos": "below"
     },
     "tune": {
      "x": 16.256,
      "y": 104,
      "labelPos": "below"
     },
     "fm": {
      "x": 25.1968,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 34.9504,
      "y": 104,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ntydeja",
   "typeId": "tp_mmb_comb",
   "internal": true,
   "name": "MMB COMB",
   "brand": "MMB",
   "modelNumber": "COMB",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "COMB",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 14,
      "text": "tuned resonator",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "coarse": {
      "x": 9.144,
      "y": 30
     },
     "feedback": {
      "x": 21.336,
      "y": 30
     },
     "mix": {
      "x": 9.144,
      "y": 70
     }
    },
    "portPlacements": {
     "freq_cv": {
      "x": 5.4864,
      "y": 100,
      "labelPos": "below"
     },
     "fbk_cv": {
      "x": 12.8016,
      "y": 100,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 20.1168,
      "y": 100,
      "labelPos": "below"
     },
     "in": {
      "x": 9.144,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 21.336,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ij15yby",
   "typeId": "tp_mmb_wt_vco",
   "internal": true,
   "name": "MMB WT-VCO",
   "brand": "MMB",
   "modelNumber": "WT-VCO",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "WT-VCO",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "bank": {
      "x": 20.32,
      "y": 22
     },
     "coarse": {
      "x": 12.192,
      "y": 58
     },
     "fine": {
      "x": 28.447999999999997,
      "y": 58
     },
     "level": {
      "x": 20.32,
      "y": 84
     }
    },
    "portPlacements": {
     "voct": {
      "x": 10.16,
      "y": 104,
      "labelPos": "below"
     },
     "tune": {
      "x": 20.32,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 31.6992,
      "y": 104,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_slc2l2d",
   "typeId": "tp_mmb_draw_vco",
   "internal": true,
   "name": "MMB DRAW-VCO",
   "brand": "MMB",
   "modelNumber": "DRAW-VCO",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "DRAW-VCO",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "decorations": [
     {
      "kind": "rect",
      "x": 4.8768,
      "y": 22,
      "w": 30.886400000000002,
      "h": 30,
      "color": "#0b1220"
     }
    ],
    "controlPlacements": {
     "coarse": {
      "x": 12.192,
      "y": 70
     },
     "fine": {
      "x": 28.447999999999997,
      "y": 70
     },
     "level": {
      "x": 20.32,
      "y": 92
     }
    },
    "portPlacements": {
     "voct": {
      "x": 10.16,
      "y": 110,
      "labelPos": "below"
     },
     "tune": {
      "x": 20.32,
      "y": 110,
      "labelPos": "below"
     },
     "out": {
      "x": 31.6992,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_t2a531k",
   "typeId": "tp_mmb_stk_sound",
   "internal": true,
   "name": "MMB STK-SOUND",
   "brand": "MMB",
   "modelNumber": "STK-SOUND",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "STK-SOUND",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 14,
      "text": "physical modelling",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "sound": {
      "x": 20.32,
      "y": 22
     },
     "level": {
      "x": 12.192,
      "y": 54
     },
     "timbre": {
      "x": 28.447999999999997,
      "y": 54
     },
     "modulation": {
      "x": 12.192,
      "y": 84
     },
     "strength": {
      "x": 28.447999999999997,
      "y": 84
     }
    },
    "portPlacements": {
     "voct": {
      "x": 8.128,
      "y": 108,
      "labelPos": "below"
     },
     "gate": {
      "x": 18.288,
      "y": 108,
      "labelPos": "below"
     },
     "strength": {
      "x": 8.128,
      "y": 120,
      "labelPos": "below"
     },
     "timbre": {
      "x": 18.288,
      "y": 120,
      "labelPos": "below"
     },
     "modulation": {
      "x": 28.447999999999997,
      "y": 108,
      "labelPos": "below"
     },
     "out": {
      "x": 30.48,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_nqzh3au",
   "typeId": "tp_mmb_fof",
   "internal": true,
   "name": "MMB FOF-VOICE",
   "brand": "MMB",
   "modelNumber": "FOF-VOICE",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "FOF-VOICE",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 14,
      "text": "A · E · I · O · U",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "vowel": {
      "x": 20.32,
      "y": 28
     },
     "tone": {
      "x": 60.96,
      "y": 28
     },
     "breath": {
      "x": 16.256,
      "y": 52
     },
     "vibrato": {
      "x": 40.64,
      "y": 52
     },
     "voice": {
      "x": 65.024,
      "y": 52
     },
     "syl": {
      "x": 13.004800000000001,
      "y": 72
     },
     "sylDisp": {
      "x": 40.64,
      "y": 72
     },
     "level": {
      "x": 68.2752,
      "y": 72
     },
     "syl_amt": {
      "x": 6.502400000000001,
      "y": 104
     },
     "vowel_amt": {
      "x": 17.8816,
      "y": 104
     },
     "breath_amt": {
      "x": 29.2608,
      "y": 104
     },
     "vibrato_amt": {
      "x": 40.64,
      "y": 104
     },
     "voice_amt": {
      "x": 52.019200000000005,
      "y": 104
     },
     "vel_amt": {
      "x": 63.3984,
      "y": 104
     },
     "press_amt": {
      "x": 74.7776,
      "y": 104
     }
    },
    "portPlacements": {
     "voct": {
      "x": 9.7536,
      "y": 88,
      "labelPos": "below"
     },
     "gate": {
      "x": 24.384,
      "y": 88,
      "labelPos": "below"
     },
     "next": {
      "x": 40.64,
      "y": 88,
      "labelPos": "below"
     },
     "reset": {
      "x": 55.2704,
      "y": 88,
      "labelPos": "below"
     },
     "out": {
      "x": 71.5264,
      "y": 88,
      "labelPos": "below"
     },
     "syl_cv": {
      "x": 6.502400000000001,
      "y": 120,
      "labelPos": "below"
     },
     "vowel": {
      "x": 17.8816,
      "y": 120,
      "labelPos": "below"
     },
     "breath": {
      "x": 29.2608,
      "y": 120,
      "labelPos": "below"
     },
     "vibrato": {
      "x": 40.64,
      "y": 120,
      "labelPos": "below"
     },
     "voice": {
      "x": 52.019200000000005,
      "y": 120,
      "labelPos": "below"
     },
     "vel": {
      "x": 63.3984,
      "y": 120,
      "labelPos": "below"
     },
     "pressure": {
      "x": 74.7776,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_wmexkri",
   "typeId": "tp_mmb_env_follower",
   "internal": true,
   "name": "MMB ENV-FOLLOW-8",
   "brand": "MMB",
   "modelNumber": "ENV-FOLLOW-8",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "ENV-FOLLOW-8",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 14,
      "text": "audio → cv · 8 cellen",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.8,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "attack": {
      "x": 16.256,
      "y": 34
     },
     "release": {
      "x": 34.1376,
      "y": 34
     },
     "sens": {
      "x": 52.019200000000005,
      "y": 34
     },
     "thresh": {
      "x": 69.9008,
      "y": 34
     },
     "mode": {
      "x": 40.64,
      "y": 60
     }
    },
    "portPlacements": {
     "in_1": {
      "x": 6.502400000000001,
      "y": 84,
      "labelPos": "below"
     },
     "in_2": {
      "x": 16.17472,
      "y": 84,
      "labelPos": "below"
     },
     "in_3": {
      "x": 25.84704,
      "y": 84,
      "labelPos": "below"
     },
     "in_4": {
      "x": 35.51936,
      "y": 84,
      "labelPos": "below"
     },
     "in_5": {
      "x": 45.19168,
      "y": 84,
      "labelPos": "below"
     },
     "in_6": {
      "x": 54.864,
      "y": 84,
      "labelPos": "below"
     },
     "in_7": {
      "x": 64.53631999999999,
      "y": 84,
      "labelPos": "below"
     },
     "in_8": {
      "x": 74.20863999999999,
      "y": 84,
      "labelPos": "below"
     },
     "env_1": {
      "x": 6.502400000000001,
      "y": 101,
      "labelPos": "below"
     },
     "env_2": {
      "x": 16.17472,
      "y": 101,
      "labelPos": "below"
     },
     "env_3": {
      "x": 25.84704,
      "y": 101,
      "labelPos": "below"
     },
     "env_4": {
      "x": 35.51936,
      "y": 101,
      "labelPos": "below"
     },
     "env_5": {
      "x": 45.19168,
      "y": 101,
      "labelPos": "below"
     },
     "env_6": {
      "x": 54.864,
      "y": 101,
      "labelPos": "below"
     },
     "env_7": {
      "x": 64.53631999999999,
      "y": 101,
      "labelPos": "below"
     },
     "env_8": {
      "x": 74.20863999999999,
      "y": 101,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 6.502400000000001,
      "y": 118,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 16.17472,
      "y": 118,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 25.84704,
      "y": 118,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 35.51936,
      "y": 118,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 45.19168,
      "y": 118,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 54.864,
      "y": 118,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 64.53631999999999,
      "y": 118,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 74.20863999999999,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_nnx5gh6",
   "typeId": "tp_mmb_env_follower_mono",
   "internal": true,
   "name": "MMB ENV-FOLLOW",
   "brand": "MMB",
   "modelNumber": "ENV-FOLLOW",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "ENV",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "FOLLOW",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 18,
      "text": "audio → cv",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 124,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "attack": {
      "x": 8.534400000000002,
      "y": 30
     },
     "release": {
      "x": 21.9456,
      "y": 30
     },
     "sens": {
      "x": 8.534400000000002,
      "y": 52
     },
     "thresh": {
      "x": 21.9456,
      "y": 52
     },
     "mode": {
      "x": 15.24,
      "y": 72
     }
    },
    "portPlacements": {
     "in": {
      "x": 15.24,
      "y": 92,
      "labelPos": "below"
     },
     "env": {
      "x": 8.534400000000002,
      "y": 112,
      "labelPos": "below"
     },
     "gate": {
      "x": 21.9456,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_b3murb5",
   "typeId": "tp_mmb_material_bridge",
   "internal": true,
   "name": "MMB MATERIAL BRIDGE",
   "brand": "MMB",
   "modelNumber": "MATERIAL BRIDGE",
   "visual": {
    "hpWidth": 14,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#163c39",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "MATERIAL BRIDGE",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pitch": {
      "x": 12.8016,
      "y": 27
     },
     "spread": {
      "x": 35.56,
      "y": 27
     },
     "coupling": {
      "x": 58.3184,
      "y": 27
     },
     "decay": {
      "x": 9.956800000000001,
      "y": 53
     },
     "memory": {
      "x": 27.0256,
      "y": 53
     },
     "fatigue": {
      "x": 44.0944,
      "y": 53
     },
     "recovery": {
      "x": 61.1632,
      "y": 53
     },
     "pickup": {
      "x": 25.6032,
      "y": 78
     },
     "level": {
      "x": 45.5168,
      "y": 78
     }
    },
    "portPlacements": {
     "coupling_cv": {
      "x": 8.5344,
      "y": 78,
      "labelPos": "below"
     },
     "pickup_cv": {
      "x": 62.58560000000001,
      "y": 78,
      "labelPos": "below"
     },
     "in": {
      "x": 7.112000000000001,
      "y": 100,
      "labelPos": "below"
     },
     "voct": {
      "x": 21.336000000000002,
      "y": 100,
      "labelPos": "below"
     },
     "gate": {
      "x": 35.56,
      "y": 100,
      "labelPos": "below"
     },
     "gate_b": {
      "x": 49.784,
      "y": 100,
      "labelPos": "below"
     },
     "vel": {
      "x": 64.00800000000001,
      "y": 100,
      "labelPos": "below"
     },
     "reset": {
      "x": 12.8016,
      "y": 117,
      "labelPos": "below"
     },
     "stress": {
      "x": 28.448000000000004,
      "y": 117,
      "labelPos": "below"
     },
     "out_l": {
      "x": 45.5168,
      "y": 117,
      "labelPos": "below"
     },
     "out_r": {
      "x": 59.7408,
      "y": 117,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_jj5qpnu",
   "typeId": "tp_mmb_scanned",
   "internal": true,
   "name": "MMB SCANNED",
   "brand": "MMB",
   "modelNumber": "SCANNED",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1f3d",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "SCANNED",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "massa-veerring als golftabel",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pitch": {
      "x": 10.9728,
      "y": 29
     },
     "tension": {
      "x": 30.48,
      "y": 29
     },
     "damping": {
      "x": 49.987199999999994,
      "y": 29
     },
     "restore": {
      "x": 10.9728,
      "y": 55
     },
     "speed": {
      "x": 30.48,
      "y": 55
     },
     "width": {
      "x": 49.987199999999994,
      "y": 55
     },
     "position": {
      "x": 10.9728,
      "y": 79
     },
     "level": {
      "x": 52.4256,
      "y": 79
     }
    },
    "portPlacements": {
     "pos_cv": {
      "x": 25.6032,
      "y": 79,
      "labelPos": "below"
     },
     "press": {
      "x": 39.0144,
      "y": 79,
      "labelPos": "below"
     },
     "in": {
      "x": 7.3152,
      "y": 100,
      "labelPos": "below"
     },
     "voct": {
      "x": 18.8976,
      "y": 100,
      "labelPos": "below"
     },
     "gate": {
      "x": 30.48,
      "y": 100,
      "labelPos": "below"
     },
     "vel": {
      "x": 42.0624,
      "y": 100,
      "labelPos": "below"
     },
     "reset": {
      "x": 53.644800000000004,
      "y": 100,
      "labelPos": "below"
     },
     "energy": {
      "x": 18.288,
      "y": 117,
      "labelPos": "below"
     },
     "out": {
      "x": 42.672,
      "y": 117,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_jez1rqk",
   "typeId": "tp_mmb_reservoir",
   "internal": true,
   "name": "MMB RESERVOIR",
   "brand": "MMB",
   "modelNumber": "RESERVOIR",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "RESERVOIR",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "gedeelde herstellende bron",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "drain": {
      "x": 11.3792,
      "y": 29
     },
     "recover": {
      "x": 29.2608,
      "y": 29
     },
     "floor": {
      "x": 8.128,
      "y": 55
     },
     "curve": {
      "x": 20.32,
      "y": 55
     },
     "thresh": {
      "x": 32.512,
      "y": 55
     }
    },
    "portPlacements": {
     "in_a": {
      "x": 5.6896,
      "y": 76,
      "labelPos": "below"
     },
     "in_b": {
      "x": 15.443200000000001,
      "y": 76,
      "labelPos": "below"
     },
     "in_c": {
      "x": 25.1968,
      "y": 76,
      "labelPos": "below"
     },
     "in_d": {
      "x": 34.9504,
      "y": 76,
      "labelPos": "below"
     },
     "out_a": {
      "x": 5.6896,
      "y": 92,
      "labelPos": "below"
     },
     "out_b": {
      "x": 15.443200000000001,
      "y": 92,
      "labelPos": "below"
     },
     "out_c": {
      "x": 25.1968,
      "y": 92,
      "labelPos": "below"
     },
     "out_d": {
      "x": 34.9504,
      "y": 92,
      "labelPos": "below"
     },
     "refill": {
      "x": 10.16,
      "y": 108,
      "labelPos": "below"
     },
     "reset": {
      "x": 30.48,
      "y": 108,
      "labelPos": "below"
     },
     "level": {
      "x": 7.3152,
      "y": 120,
      "labelPos": "below"
     },
     "starve": {
      "x": 20.32,
      "y": 120,
      "labelPos": "below"
     },
     "empty": {
      "x": 33.324799999999996,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_l1w2y44",
   "typeId": "tp_mmb_gendyn",
   "internal": true,
   "name": "MMB GENDYN",
   "brand": "MMB",
   "modelNumber": "GENDYN",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3d1f1f",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "GENDYN",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "dynamische stochastische synthese",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pitch": {
      "x": 11.176,
      "y": 29
     },
     "points": {
      "x": 39.624,
      "y": 29
     },
     "amp_step": {
      "x": 11.176,
      "y": 55
     },
     "dur_step": {
      "x": 39.624,
      "y": 55
     },
     "dist": {
      "x": 8.128,
      "y": 79
     },
     "smooth": {
      "x": 19.812,
      "y": 79
     },
     "settle": {
      "x": 30.987999999999996,
      "y": 79
     },
     "seed": {
      "x": 42.672,
      "y": 79
     },
     "level": {
      "x": 25.4,
      "y": 100
     }
    },
    "portPlacements": {
     "voct": {
      "x": 7.112,
      "y": 100,
      "labelPos": "below"
     },
     "gate": {
      "x": 16.256,
      "y": 100,
      "labelPos": "below"
     },
     "chaos_cv": {
      "x": 34.544000000000004,
      "y": 100,
      "labelPos": "below"
     },
     "reset": {
      "x": 43.687999999999995,
      "y": 100,
      "labelPos": "below"
     },
     "cycle": {
      "x": 15.239999999999998,
      "y": 117,
      "labelPos": "below"
     },
     "out": {
      "x": 35.559999999999995,
      "y": 117,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_s8km4da",
   "typeId": "tp_mmb_excitable",
   "internal": true,
   "name": "MMB EXCITABLE",
   "brand": "MMB",
   "modelNumber": "EXCITABLE",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f3d2a",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "EXCITABLE",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "prikkelbaar celraster, 2 pacemakers",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pitch": {
      "x": 10.9728,
      "y": 29
     },
     "detune": {
      "x": 30.48,
      "y": 29
     },
     "refract": {
      "x": 49.987199999999994,
      "y": 29
     },
     "excite": {
      "x": 10.9728,
      "y": 55
     },
     "thresh": {
      "x": 30.48,
      "y": 55
     },
     "pickup": {
      "x": 49.987199999999994,
      "y": 55
     },
     "speed": {
      "x": 18.288,
      "y": 79
     },
     "level": {
      "x": 45.72,
      "y": 79
     }
    },
    "portPlacements": {
     "voct": {
      "x": 7.3152,
      "y": 100,
      "labelPos": "below"
     },
     "gate": {
      "x": 18.8976,
      "y": 100,
      "labelPos": "below"
     },
     "voct_b": {
      "x": 30.48,
      "y": 100,
      "labelPos": "below"
     },
     "gate_b": {
      "x": 42.0624,
      "y": 100,
      "labelPos": "below"
     },
     "reset": {
      "x": 53.644800000000004,
      "y": 100,
      "labelPos": "below"
     },
     "activity": {
      "x": 13.411200000000001,
      "y": 117,
      "labelPos": "below"
     },
     "out_l": {
      "x": 35.3568,
      "y": 117,
      "labelPos": "below"
     },
     "out_r": {
      "x": 49.987199999999994,
      "y": 117,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ftufzu6",
   "typeId": "tp_mmb_tapestrip",
   "internal": true,
   "name": "MMB TAPE STRIP",
   "brand": "MMB",
   "modelNumber": "TAPE STRIP",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3b2a1a",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "TAPE STRIP",
      "fontSize": 2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 14,
      "text": "bank van de sampler · 8 bandjes",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 97,
      "text": "V/Oct",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 109,
      "text": "Gate",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     },
     {
      "x": 3,
      "y": 121,
      "text": "Vel",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "start"
     }
    ],
    "controlPlacements": {
     "bank": {
      "x": 8.128,
      "y": 30
     },
     "length": {
      "x": 21.945600000000002,
      "y": 30
     },
     "return": {
      "x": 35.7632,
      "y": 30
     },
     "contact": {
      "x": 49.580799999999996,
      "y": 30
     },
     "level": {
      "x": 65.024,
      "y": 30
     },
     "motor": {
      "x": 8.128,
      "y": 56
     },
     "wow": {
      "x": 21.1328,
      "y": 56
     },
     "flutter": {
      "x": 34.1376,
      "y": 56
     },
     "wear": {
      "x": 47.142399999999995,
      "y": 56
     }
    },
    "portPlacements": {
     "press": {
      "x": 60.1472,
      "y": 56,
      "labelPos": "below"
     },
     "bend": {
      "x": 71.5264,
      "y": 56,
      "labelPos": "below"
     },
     "tape": {
      "x": 8.128,
      "y": 76,
      "labelPos": "below"
     },
     "load": {
      "x": 21.1328,
      "y": 76,
      "labelPos": "below"
     },
     "out_l": {
      "x": 60.1472,
      "y": 76,
      "labelPos": "below"
     },
     "out_r": {
      "x": 71.5264,
      "y": 76,
      "labelPos": "below"
     },
     "voct_1": {
      "x": 5.08,
      "y": 96,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 15.24,
      "y": 96,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 25.4,
      "y": 96,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 35.56,
      "y": 96,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 45.72,
      "y": 96,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 55.88,
      "y": 96,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 66.04,
      "y": 96,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 76.2,
      "y": 96,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 5.08,
      "y": 108,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 15.24,
      "y": 108,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 25.4,
      "y": 108,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 35.56,
      "y": 108,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 45.72,
      "y": 108,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 55.88,
      "y": 108,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 66.04,
      "y": 108,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 76.2,
      "y": 108,
      "labelPos": "below"
     },
     "vel_1": {
      "x": 5.08,
      "y": 120,
      "labelPos": "below"
     },
     "vel_2": {
      "x": 15.24,
      "y": 120,
      "labelPos": "below"
     },
     "vel_3": {
      "x": 25.4,
      "y": 120,
      "labelPos": "below"
     },
     "vel_4": {
      "x": 35.56,
      "y": 120,
      "labelPos": "below"
     },
     "vel_5": {
      "x": 45.72,
      "y": 120,
      "labelPos": "below"
     },
     "vel_6": {
      "x": 55.88,
      "y": 120,
      "labelPos": "below"
     },
     "vel_7": {
      "x": 66.04,
      "y": 120,
      "labelPos": "below"
     },
     "vel_8": {
      "x": 76.2,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_vs0i3vp",
   "typeId": "tp_mmb_clock",
   "internal": true,
   "name": "MMB CLOCK",
   "brand": "MMB",
   "modelNumber": "CLOCK",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "CLOCK",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "masterklok · delers · swing",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "tempo": {
      "x": 12.192,
      "y": 30
     },
     "run": {
      "x": 31.6992,
      "y": 30
     },
     "swing": {
      "x": 8.128,
      "y": 56
     },
     "width": {
      "x": 20.32,
      "y": 56
     },
     "div": {
      "x": 32.512,
      "y": 56
     }
    },
    "portPlacements": {
     "reset": {
      "x": 10.16,
      "y": 76,
      "labelPos": "below"
     },
     "tempo_cv": {
      "x": 30.48,
      "y": 76,
      "labelPos": "below"
     },
     "bar": {
      "x": 6.502400000000001,
      "y": 96,
      "labelPos": "below"
     },
     "beat": {
      "x": 15.8496,
      "y": 96,
      "labelPos": "below"
     },
     "x2": {
      "x": 25.1968,
      "y": 96,
      "labelPos": "below"
     },
     "x3": {
      "x": 34.544,
      "y": 96,
      "labelPos": "below"
     },
     "x4": {
      "x": 6.502400000000001,
      "y": 114,
      "labelPos": "below"
     },
     "div": {
      "x": 20.32,
      "y": 114,
      "labelPos": "below"
     },
     "ramp": {
      "x": 34.1376,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_crik8v1",
   "typeId": "tp_mmb_euclid",
   "internal": true,
   "name": "MMB EUCLID",
   "brand": "MMB",
   "modelNumber": "EUCLID",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "EUCLID",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "slagen gelijk verdeeld over stappen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "steps_1": {
      "x": 12.192,
      "y": 26
     },
     "fill_1": {
      "x": 12.192,
      "y": 44
     },
     "rot_1": {
      "x": 12.192,
      "y": 62
     },
     "steps_2": {
      "x": 30.48,
      "y": 26
     },
     "fill_2": {
      "x": 30.48,
      "y": 44
     },
     "rot_2": {
      "x": 30.48,
      "y": 62
     },
     "steps_3": {
      "x": 48.768,
      "y": 26
     },
     "fill_3": {
      "x": 48.768,
      "y": 44
     },
     "rot_3": {
      "x": 48.768,
      "y": 62
     },
     "tempo": {
      "x": 9.7536,
      "y": 114
     },
     "extclock": {
      "x": 21.9456,
      "y": 114
     }
    },
    "portPlacements": {
     "fill_1_cv": {
      "x": 12.192,
      "y": 80,
      "labelPos": "below"
     },
     "out_1": {
      "x": 12.192,
      "y": 96,
      "labelPos": "below"
     },
     "fill_2_cv": {
      "x": 30.48,
      "y": 80,
      "labelPos": "below"
     },
     "out_2": {
      "x": 30.48,
      "y": 96,
      "labelPos": "below"
     },
     "fill_3_cv": {
      "x": 48.768,
      "y": 80,
      "labelPos": "below"
     },
     "out_3": {
      "x": 48.768,
      "y": 96,
      "labelPos": "below"
     },
     "clock": {
      "x": 32.918400000000005,
      "y": 114,
      "labelPos": "below"
     },
     "reset": {
      "x": 43.8912,
      "y": 114,
      "labelPos": "below"
     },
     "any": {
      "x": 54.864000000000004,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_sok60dt",
   "typeId": "tp_mmb_turing",
   "internal": true,
   "name": "MMB TURING",
   "brand": "MMB",
   "modelNumber": "TURING",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "TURING",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "schuifregister · 16 bits",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "change": {
      "x": 20.32,
      "y": 31
     },
     "length": {
      "x": 10.16,
      "y": 58
     },
     "range": {
      "x": 30.48,
      "y": 58
     },
     "tempo": {
      "x": 10.16,
      "y": 78
     },
     "extclock": {
      "x": 30.48,
      "y": 78
     }
    },
    "portPlacements": {
     "clock": {
      "x": 7.3152,
      "y": 98,
      "labelPos": "below"
     },
     "reset": {
      "x": 20.32,
      "y": 98,
      "labelPos": "below"
     },
     "change_cv": {
      "x": 33.324799999999996,
      "y": 98,
      "labelPos": "below"
     },
     "cv": {
      "x": 5.6896,
      "y": 116,
      "labelPos": "below"
     },
     "cv2": {
      "x": 15.443200000000001,
      "y": 116,
      "labelPos": "below"
     },
     "pulse": {
      "x": 25.1968,
      "y": 116,
      "labelPos": "below"
     },
     "pulse2": {
      "x": 34.9504,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_droty9s",
   "typeId": "tp_mmb_branches",
   "internal": true,
   "name": "MMB BRANCHES",
   "brand": "MMB",
   "modelNumber": "BRANCHES",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "BRANCH",
      "fontSize": 1.9,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "p": {
      "x": 10.16,
      "y": 28
     },
     "toggle": {
      "x": 10.16,
      "y": 50
     },
     "latch": {
      "x": 10.16,
      "y": 66
     }
    },
    "portPlacements": {
     "in": {
      "x": 5.6896,
      "y": 86,
      "labelPos": "below"
     },
     "p_cv": {
      "x": 14.6304,
      "y": 86,
      "labelPos": "below"
     },
     "a": {
      "x": 5.6896,
      "y": 110,
      "labelPos": "below"
     },
     "b": {
      "x": 14.6304,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_ov7mrzz",
   "typeId": "tp_mmb_chaos",
   "internal": true,
   "name": "MMB CHAOS",
   "brand": "MMB",
   "modelNumber": "CHAOS",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1f3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "CHAOS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "vloeiend, nooit hetzelfde",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 12.192,
      "y": 30
     },
     "model": {
      "x": 31.6992,
      "y": 30
     },
     "shape": {
      "x": 8.9408,
      "y": 58
     },
     "depth": {
      "x": 20.32,
      "y": 58
     },
     "bipolar": {
      "x": 32.512,
      "y": 58
     },
     "rate_cv_amt": {
      "x": 10.16,
      "y": 78
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 10.16,
      "y": 96,
      "labelPos": "below"
     },
     "reset": {
      "x": 30.48,
      "y": 96,
      "labelPos": "below"
     },
     "x": {
      "x": 5.6896,
      "y": 116,
      "labelPos": "below"
     },
     "y": {
      "x": 15.443200000000001,
      "y": 116,
      "labelPos": "below"
     },
     "z": {
      "x": 25.1968,
      "y": 116,
      "labelPos": "below"
     },
     "gate": {
      "x": 34.9504,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_cpgo71n",
   "typeId": "tp_mmb_lfo8",
   "internal": true,
   "name": "MMB LFO-8",
   "brand": "MMB",
   "modelNumber": "LFO-8",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1f3d",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "LFO-8",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "snel → traag · één knop",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 14.224,
      "y": 31
     },
     "spread": {
      "x": 36.57599999999999,
      "y": 31
     },
     "shape": {
      "x": 9.143999999999998,
      "y": 58
     },
     "depth": {
      "x": 23.368,
      "y": 58
     },
     "bipolar": {
      "x": 38.608,
      "y": 58
     }
    },
    "portPlacements": {
     "rate_cv": {
      "x": 14.224,
      "y": 78,
      "labelPos": "below"
     },
     "reset": {
      "x": 36.57599999999999,
      "y": 78,
      "labelPos": "below"
     },
     "out_1": {
      "x": 7.112,
      "y": 98,
      "labelPos": "below"
     },
     "out_2": {
      "x": 19.304,
      "y": 98,
      "labelPos": "below"
     },
     "out_3": {
      "x": 31.496,
      "y": 98,
      "labelPos": "below"
     },
     "out_4": {
      "x": 43.687999999999995,
      "y": 98,
      "labelPos": "below"
     },
     "out_5": {
      "x": 7.112,
      "y": 116,
      "labelPos": "below"
     },
     "out_6": {
      "x": 19.304,
      "y": 116,
      "labelPos": "below"
     },
     "out_7": {
      "x": 31.496,
      "y": 116,
      "labelPos": "below"
     },
     "out_8": {
      "x": 43.687999999999995,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_yl6ly0h",
   "typeId": "tp_mmb_slope",
   "internal": true,
   "name": "MMB SLOPE",
   "brand": "MMB",
   "modelNumber": "SLOPE",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1f3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "SLOPE",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "envelope · LFO · lag",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rise": {
      "x": 11.3792,
      "y": 30
     },
     "fall": {
      "x": 29.2608,
      "y": 30
     },
     "shape": {
      "x": 11.3792,
      "y": 56
     },
     "cycle": {
      "x": 29.2608,
      "y": 56
     }
    },
    "portPlacements": {
     "in": {
      "x": 7.3152,
      "y": 80,
      "labelPos": "below"
     },
     "trig": {
      "x": 20.32,
      "y": 80,
      "labelPos": "below"
     },
     "time_cv": {
      "x": 33.324799999999996,
      "y": 80,
      "labelPos": "below"
     },
     "out": {
      "x": 11.3792,
      "y": 98,
      "labelPos": "below"
     },
     "inv": {
      "x": 29.2608,
      "y": 98,
      "labelPos": "below"
     },
     "eor": {
      "x": 11.3792,
      "y": 116,
      "labelPos": "below"
     },
     "eoc": {
      "x": 29.2608,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_yfl9ezf",
   "typeId": "tp_mmb_logic",
   "internal": true,
   "name": "MMB LOGIC",
   "brand": "MMB",
   "modelNumber": "LOGIC",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "LOGIC",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "thresh": {
      "x": 15.24,
      "y": 26
     }
    },
    "portPlacements": {
     "a": {
      "x": 8.534400000000002,
      "y": 48,
      "labelPos": "below"
     },
     "b": {
      "x": 21.9456,
      "y": 48,
      "labelPos": "below"
     },
     "min": {
      "x": 8.534400000000002,
      "y": 66,
      "labelPos": "below"
     },
     "max": {
      "x": 21.9456,
      "y": 66,
      "labelPos": "below"
     },
     "and": {
      "x": 8.534400000000002,
      "y": 83,
      "labelPos": "below"
     },
     "or": {
      "x": 21.9456,
      "y": 83,
      "labelPos": "below"
     },
     "xor": {
      "x": 8.534400000000002,
      "y": 100,
      "labelPos": "below"
     },
     "gt": {
      "x": 21.9456,
      "y": 100,
      "labelPos": "below"
     },
     "abs": {
      "x": 8.534400000000002,
      "y": 117,
      "labelPos": "below"
     },
     "inv": {
      "x": 21.9456,
      "y": 117,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_kbkhgvv",
   "typeId": "tp_mmb_folder",
   "internal": true,
   "name": "MMB FOLDER",
   "brand": "MMB",
   "modelNumber": "FOLDER",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3d2a1f",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "FOLDER",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "boventonen door vouwen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "fold": {
      "x": 20.32,
      "y": 32
     },
     "symmetry": {
      "x": 10.16,
      "y": 60
     },
     "type": {
      "x": 30.48,
      "y": 60
     },
     "mix": {
      "x": 10.16,
      "y": 80
     },
     "level": {
      "x": 30.48,
      "y": 80
     }
    },
    "portPlacements": {
     "fold_cv": {
      "x": 10.16,
      "y": 98,
      "labelPos": "below"
     },
     "sym_cv": {
      "x": 30.48,
      "y": 98,
      "labelPos": "below"
     },
     "in": {
      "x": 10.16,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 30.48,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_3nydzbu",
   "typeId": "tp_mmb_lpg",
   "internal": true,
   "name": "MMB LPG",
   "brand": "MMB",
   "modelNumber": "LPG",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3d2a1f",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "LPG",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "filter + versterker",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "offset": {
      "x": 8.534400000000002,
      "y": 28
     },
     "decay": {
      "x": 21.9456,
      "y": 28
     },
     "mode": {
      "x": 15.24,
      "y": 50
     },
     "res": {
      "x": 8.534400000000002,
      "y": 68
     },
     "level": {
      "x": 21.9456,
      "y": 68
     }
    },
    "portPlacements": {
     "cv": {
      "x": 8.534400000000002,
      "y": 88,
      "labelPos": "below"
     },
     "trig": {
      "x": 21.9456,
      "y": 88,
      "labelPos": "below"
     },
     "in": {
      "x": 8.534400000000002,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 21.9456,
      "y": 104,
      "labelPos": "below"
     },
     "env": {
      "x": 15.24,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_w8jkabc",
   "typeId": "tp_mmb_drive",
   "internal": true,
   "name": "MMB DRIVE",
   "brand": "MMB",
   "modelNumber": "DRIVE",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3d1f1f",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "DRIVE",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "drie pedalen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "drive": {
      "x": 15.24,
      "y": 30
     },
     "mode": {
      "x": 15.24,
      "y": 54
     },
     "tone": {
      "x": 8.534400000000002,
      "y": 72
     },
     "level": {
      "x": 21.9456,
      "y": 72
     },
     "mix": {
      "x": 8.534400000000002,
      "y": 92
     }
    },
    "portPlacements": {
     "drive_cv": {
      "x": 21.9456,
      "y": 92,
      "labelPos": "below"
     },
     "in": {
      "x": 8.534400000000002,
      "y": 114,
      "labelPos": "below"
     },
     "out": {
      "x": 21.9456,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_zjm9nok",
   "typeId": "tp_mmb_tube",
   "internal": true,
   "name": "MMB TUBE",
   "brand": "MMB",
   "modelNumber": "TUBE",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2b1d12",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "TUBE",
      "fontSize": 2.4,
      "color": "#fbbf24",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "buizenoverdrive",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "mode": {
      "x": 12.7,
      "y": 24
     },
     "drive": {
      "x": 34.544000000000004,
      "y": 26
     },
     "stack": {
      "x": 12.7,
      "y": 44
     },
     "bias": {
      "x": 34.544000000000004,
      "y": 46
     },
     "bass": {
      "x": 10.16,
      "y": 62
     },
     "mid": {
      "x": 25.4,
      "y": 62
     },
     "treble": {
      "x": 40.64,
      "y": 62
     },
     "presence": {
      "x": 10.16,
      "y": 79
     },
     "sag": {
      "x": 25.4,
      "y": 79
     },
     "cab": {
      "x": 40.64,
      "y": 79
     },
     "mix": {
      "x": 10.16,
      "y": 96
     },
     "level": {
      "x": 25.4,
      "y": 96
     }
    },
    "portPlacements": {
     "drive_cv": {
      "x": 40.64,
      "y": 96,
      "labelPos": "below"
     },
     "in_l": {
      "x": 7.619999999999999,
      "y": 114,
      "labelPos": "below"
     },
     "in_r": {
      "x": 19.304,
      "y": 114,
      "labelPos": "below"
     },
     "out_l": {
      "x": 31.496,
      "y": 114,
      "labelPos": "below"
     },
     "out_r": {
      "x": 43.18,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_uhbzjxn",
   "typeId": "tp_mmb_freqshift",
   "internal": true,
   "name": "MMB FREQ-SHIFT",
   "brand": "MMB",
   "modelNumber": "FREQ-SHIFT",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f3d36",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "FREQ",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "SHIFT",
      "fontSize": 2.2,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "shift": {
      "x": 20.32,
      "y": 34
     },
     "range": {
      "x": 20.32,
      "y": 58
     },
     "fbk": {
      "x": 8.128,
      "y": 78
     },
     "mix": {
      "x": 20.32,
      "y": 78
     },
     "level": {
      "x": 32.512,
      "y": 78
     }
    },
    "portPlacements": {
     "in": {
      "x": 11.3792,
      "y": 98,
      "labelPos": "below"
     },
     "shift_cv": {
      "x": 29.2608,
      "y": 98,
      "labelPos": "below"
     },
     "out": {
      "x": 11.3792,
      "y": 116,
      "labelPos": "below"
     },
     "down": {
      "x": 29.2608,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_lm4hyef",
   "typeId": "tp_mmb_acid",
   "internal": true,
   "name": "MMB ACID",
   "brand": "MMB",
   "modelNumber": "ACID",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "aluminum",
    "baseColor": "#c9ccd1",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "ACID",
      "fontSize": 2.6,
      "color": "#111827",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "bass line · accent · slide",
      "fontSize": 1.1,
      "color": "#374151",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#111827",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "tune": {
      "x": 7.3152,
      "y": 30
     },
     "cutoff": {
      "x": 18.8976,
      "y": 30
     },
     "res": {
      "x": 30.48,
      "y": 30
     },
     "envmod": {
      "x": 42.062400000000004,
      "y": 30
     },
     "decay": {
      "x": 53.644800000000004,
      "y": 30
     },
     "wave": {
      "x": 7.3152,
      "y": 58
     },
     "accent": {
      "x": 30.48,
      "y": 58
     },
     "level": {
      "x": 53.644800000000004,
      "y": 58
     }
    },
    "portPlacements": {
     "voct": {
      "x": 7.3152,
      "y": 92,
      "labelPos": "below"
     },
     "gate": {
      "x": 18.8976,
      "y": 92,
      "labelPos": "below"
     },
     "accent": {
      "x": 30.48,
      "y": 92,
      "labelPos": "below"
     },
     "slide": {
      "x": 42.062400000000004,
      "y": 92,
      "labelPos": "below"
     },
     "cutoff_cv": {
      "x": 53.644800000000004,
      "y": 92,
      "labelPos": "below"
     },
     "env": {
      "x": 42.062400000000004,
      "y": 114,
      "labelPos": "below"
     },
     "out": {
      "x": 53.644800000000004,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_8vrii9e",
   "typeId": "tp_mmb_mixtur",
   "internal": true,
   "name": "MMB MIXTUR",
   "brand": "MMB",
   "modelNumber": "MIXTUR",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "wood",
    "baseColor": "#3b2a1c",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "MIXTUR",
      "fontSize": 2.6,
      "color": "#f5e6c8",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 13,
      "text": "glimlamp · ondertonen · formanten",
      "fontSize": 1.1,
      "color": "#d6c4a0",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 41,
      "text": "f/n",
      "fontSize": 1,
      "color": "#d6c4a0",
      "align": "start"
     },
     {
      "x": 3,
      "y": 57,
      "text": "Mix",
      "fontSize": 1,
      "color": "#d6c4a0",
      "align": "start"
     },
     {
      "x": 8.128,
      "y": 41,
      "text": "f",
      "fontSize": 1.4,
      "color": "#f5e6c8",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f5e6c8",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "coarse": {
      "x": 8.128,
      "y": 24
     },
     "fine": {
      "x": 24.384000000000004,
      "y": 24
     },
     "curve": {
      "x": 40.64,
      "y": 24
     },
     "unrest": {
      "x": 56.89600000000001,
      "y": 24
     },
     "glide": {
      "x": 73.152,
      "y": 24
     },
     "div1": {
      "x": 24.384000000000004,
      "y": 41
     },
     "div2": {
      "x": 40.64,
      "y": 41
     },
     "div3": {
      "x": 56.89600000000001,
      "y": 41
     },
     "div4": {
      "x": 73.152,
      "y": 41
     },
     "main": {
      "x": 8.128,
      "y": 57
     },
     "sub1": {
      "x": 24.384000000000004,
      "y": 57
     },
     "sub2": {
      "x": 40.64,
      "y": 57
     },
     "sub3": {
      "x": 56.89600000000001,
      "y": 57
     },
     "sub4": {
      "x": 73.152,
      "y": 57
     },
     "formant": {
      "x": 8.128,
      "y": 78
     },
     "fshift": {
      "x": 24.384000000000004,
      "y": 78
     },
     "freso": {
      "x": 40.64,
      "y": 78
     },
     "fmix": {
      "x": 56.89600000000001,
      "y": 78
     },
     "noise": {
      "x": 73.152,
      "y": 78
     },
     "dyn": {
      "x": 8.128,
      "y": 98
     },
     "attack": {
      "x": 24.384000000000004,
      "y": 98
     },
     "release": {
      "x": 40.64,
      "y": 98
     },
     "level": {
      "x": 73.152,
      "y": 98
     }
    },
    "portPlacements": {
     "voct": {
      "x": 5.6896,
      "y": 116,
      "labelPos": "below"
     },
     "gate": {
      "x": 14.6304,
      "y": 116,
      "labelPos": "below"
     },
     "vel": {
      "x": 23.571199999999997,
      "y": 116,
      "labelPos": "below"
     },
     "press": {
      "x": 32.512,
      "y": 116,
      "labelPos": "below"
     },
     "sub_cv": {
      "x": 41.4528,
      "y": 116,
      "labelPos": "below"
     },
     "form_cv": {
      "x": 50.3936,
      "y": 116,
      "labelPos": "below"
     },
     "amp": {
      "x": 65.024,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 74.7776,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_uny6yzu",
   "typeId": "tp_mmb_rungler",
   "internal": true,
   "name": "MMB RUNGLER",
   "brand": "MMB",
   "modelNumber": "RUNGLER",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2a1f3d",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "RUNGLER",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "getrapte chaos · naar Rob Hordijk",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "freq_a": {
      "x": 8.534400000000002,
      "y": 28
     },
     "run_a": {
      "x": 23.1648,
      "y": 28
     },
     "run_b": {
      "x": 37.7952,
      "y": 28
     },
     "freq_b": {
      "x": 52.4256,
      "y": 28
     },
     "cross_a": {
      "x": 8.534400000000002,
      "y": 52
     },
     "loop": {
      "x": 30.48,
      "y": 52
     },
     "cross_b": {
      "x": 52.4256,
      "y": 52
     },
     "cutoff": {
      "x": 8.534400000000002,
      "y": 74
     },
     "res": {
      "x": 23.1648,
      "y": 74
     },
     "sweep": {
      "x": 37.7952,
      "y": 74
     },
     "level": {
      "x": 52.4256,
      "y": 74
     }
    },
    "portPlacements": {
     "voct": {
      "x": 8.534400000000002,
      "y": 94,
      "labelPos": "below"
     },
     "rate_cv": {
      "x": 23.1648,
      "y": 94,
      "labelPos": "below"
     },
     "cutoff_cv": {
      "x": 37.7952,
      "y": 94,
      "labelPos": "below"
     },
     "tri_a": {
      "x": 52.4256,
      "y": 94,
      "labelPos": "below"
     },
     "rungler": {
      "x": 6.096,
      "y": 114,
      "labelPos": "below"
     },
     "tri_b": {
      "x": 18.288,
      "y": 114,
      "labelPos": "below"
     },
     "pulse_b": {
      "x": 30.48,
      "y": 114,
      "labelPos": "below"
     },
     "pwm": {
      "x": 42.672,
      "y": 114,
      "labelPos": "below"
     },
     "out": {
      "x": 54.864000000000004,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_uchhyh8",
   "typeId": "tp_mmb_organ",
   "internal": true,
   "name": "MMB ORGAN",
   "brand": "MMB",
   "modelNumber": "ORGAN",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "wood",
    "baseColor": "#5b3a1e",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "ORGAN",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 13,
      "text": "91 toonwielen · 9 trekstangen · 12 toetsen",
      "fontSize": 1.1,
      "color": "#e5e7eb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 85,
      "text": "V/Oct · Gate — toetsen 1–6",
      "fontSize": 0.9,
      "color": "#e5e7eb",
      "align": "start"
     },
     {
      "x": 3,
      "y": 105,
      "text": "toetsen 7–12",
      "fontSize": 0.9,
      "color": "#e5e7eb",
      "align": "start"
     }
    ],
    "controlPlacements": {
     "d16": {
      "x": 9,
      "y": 22
     },
     "d513": {
      "x": 16.6,
      "y": 22
     },
     "d8": {
      "x": 24.2,
      "y": 22
     },
     "d4": {
      "x": 31.799999999999997,
      "y": 22
     },
     "d223": {
      "x": 39.4,
      "y": 22
     },
     "d2": {
      "x": 47,
      "y": 22
     },
     "d135": {
      "x": 54.599999999999994,
      "y": 22
     },
     "d113": {
      "x": 62.199999999999996,
      "y": 22
     },
     "d1": {
      "x": 69.8,
      "y": 22
     },
     "perc": {
      "x": 82.2,
      "y": 26
     },
     "perc_fast": {
      "x": 95.2,
      "y": 22
     },
     "perc_soft": {
      "x": 95.2,
      "y": 34
     },
     "vib": {
      "x": 82.2,
      "y": 46
     },
     "click": {
      "x": 95.2,
      "y": 50
     },
     "leak": {
      "x": 82.2,
      "y": 68
     },
     "level": {
      "x": 95.2,
      "y": 68
     }
    },
    "portPlacements": {
     "voct_1": {
      "x": 7,
      "y": 90,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 16.6,
      "y": 90,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 26.2,
      "y": 90,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 35.8,
      "y": 90,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 45.4,
      "y": 90,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 55,
      "y": 90,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 7,
      "y": 110,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 16.6,
      "y": 110,
      "labelPos": "below"
     },
     "voct_9": {
      "x": 26.2,
      "y": 110,
      "labelPos": "below"
     },
     "voct_10": {
      "x": 35.8,
      "y": 110,
      "labelPos": "below"
     },
     "voct_11": {
      "x": 45.4,
      "y": 110,
      "labelPos": "below"
     },
     "voct_12": {
      "x": 55,
      "y": 110,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 7,
      "y": 99,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 16.6,
      "y": 99,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 26.2,
      "y": 99,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 35.8,
      "y": 99,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 45.4,
      "y": 99,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 55,
      "y": 99,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 7,
      "y": 119,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 16.6,
      "y": 119,
      "labelPos": "below"
     },
     "gate_9": {
      "x": 26.2,
      "y": 119,
      "labelPos": "below"
     },
     "gate_10": {
      "x": 35.8,
      "y": 119,
      "labelPos": "below"
     },
     "gate_11": {
      "x": 45.4,
      "y": 119,
      "labelPos": "below"
     },
     "gate_12": {
      "x": 55,
      "y": 119,
      "labelPos": "below"
     },
     "swell": {
      "x": 82.2,
      "y": 100,
      "labelPos": "below"
     },
     "out": {
      "x": 95.2,
      "y": 100,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_4fm5btn",
   "typeId": "tp_mmb_martenot",
   "internal": true,
   "name": "MMB MARTENOT",
   "brand": "MMB",
   "modelNumber": "MARTENOT",
   "visual": {
    "hpWidth": 14,
    "heightMm": 128.5,
    "texture": "wood",
    "baseColor": "#2b1d14",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "MARTENOT",
      "fontSize": 2.5,
      "color": "#f3e3c3",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 13,
      "text": "tiroir · touche · vibrato",
      "fontSize": 1.1,
      "color": "#c9b38a",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 36,
      "text": "tiroir",
      "fontSize": 1,
      "color": "#c9b38a",
      "align": "start"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f3e3c3",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "coarse": {
      "x": 8.5344,
      "y": 24
     },
     "fine": {
      "x": 22.0472,
      "y": 24
     },
     "glide": {
      "x": 35.56,
      "y": 24
     },
     "vib": {
      "x": 49.07280000000001,
      "y": 24
     },
     "vib_rate": {
      "x": 62.58560000000001,
      "y": 24
     },
     "onde": {
      "x": 8.5344,
      "y": 44
     },
     "creux": {
      "x": 22.0472,
      "y": 44
     },
     "gambe": {
      "x": 35.56,
      "y": 44
     },
     "nasillard": {
      "x": 49.07280000000001,
      "y": 44
     },
     "octaviant": {
      "x": 62.58560000000001,
      "y": 44
     },
     "souffle": {
      "x": 8.5344,
      "y": 64
     },
     "bright": {
      "x": 22.0472,
      "y": 64
     },
     "touche": {
      "x": 35.56,
      "y": 82
     },
     "attack": {
      "x": 49.07280000000001,
      "y": 82
     },
     "release": {
      "x": 62.58560000000001,
      "y": 82
     },
     "level": {
      "x": 62.58560000000001,
      "y": 64
     }
    },
    "portPlacements": {
     "voct": {
      "x": 5.6896,
      "y": 116,
      "labelPos": "below"
     },
     "gate": {
      "x": 14.9352,
      "y": 116,
      "labelPos": "below"
     },
     "vel": {
      "x": 24.180800000000005,
      "y": 116,
      "labelPos": "below"
     },
     "press": {
      "x": 33.4264,
      "y": 116,
      "labelPos": "below"
     },
     "vib_cv": {
      "x": 42.672000000000004,
      "y": 116,
      "labelPos": "below"
     },
     "amp": {
      "x": 55.473600000000005,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 65.4304,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_9ihbx9o",
   "typeId": "tp_mmb_diffuseur",
   "internal": true,
   "name": "MMB DIFFUSEUR",
   "brand": "MMB",
   "modelNumber": "DIFFUSEUR",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "wood",
    "baseColor": "#2b1d14",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "DIFFUSEUR",
      "fontSize": 2.2,
      "color": "#f3e3c3",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "principal · palme · métallique",
      "fontSize": 1,
      "color": "#c9b38a",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f3e3c3",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "type": {
      "x": 20.32,
      "y": 26
     },
     "mix": {
      "x": 12.192,
      "y": 48
     },
     "ring": {
      "x": 29.2608,
      "y": 48
     },
     "tune": {
      "x": 12.192,
      "y": 70
     },
     "gong": {
      "x": 29.2608,
      "y": 70
     },
     "level": {
      "x": 12.192,
      "y": 88
     }
    },
    "portPlacements": {
     "in": {
      "x": 8.128,
      "y": 112,
      "labelPos": "below"
     },
     "mix_cv": {
      "x": 20.32,
      "y": 112,
      "labelPos": "below"
     },
     "out": {
      "x": 32.512,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_74u1piq",
   "typeId": "tp_mmb_arp",
   "internal": true,
   "name": "MMB ARP",
   "brand": "MMB",
   "modelNumber": "ARP",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "ARP",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "arpeggiator · hoort de toetsen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "mode": {
      "x": 12.192,
      "y": 26
     },
     "octaves": {
      "x": 30.48,
      "y": 26
     },
     "tempo": {
      "x": 12.192,
      "y": 46
     },
     "division": {
      "x": 30.48,
      "y": 46
     },
     "gate": {
      "x": 12.192,
      "y": 66
     },
     "channel": {
      "x": 30.48,
      "y": 66
     },
     "latch": {
      "x": 12.192,
      "y": 82
     },
     "extclock": {
      "x": 30.48,
      "y": 82
     }
    },
    "portPlacements": {
     "clock": {
      "x": 12.192,
      "y": 98,
      "labelPos": "below"
     },
     "reset": {
      "x": 28.447999999999997,
      "y": 98,
      "labelPos": "below"
     },
     "pitch": {
      "x": 5.6896,
      "y": 116,
      "labelPos": "below"
     },
     "gate": {
      "x": 15.443200000000001,
      "y": 116,
      "labelPos": "below"
     },
     "vel": {
      "x": 25.1968,
      "y": 116,
      "labelPos": "below"
     },
     "step": {
      "x": 34.9504,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_xhkr5e5",
   "typeId": "tp_mmb_cmi",
   "internal": true,
   "name": "MMB CMI",
   "brand": "MMB",
   "modelNumber": "CMI",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#d9d3c3",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "CMI",
      "fontSize": 2.6,
      "color": "#1f2937",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "32 golfvormen · 8 bit",
      "fontSize": 1.1,
      "color": "#4b5563",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#1f2937",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "coarse": {
      "x": 9.144,
      "y": 26
     },
     "fine": {
      "x": 23.34768,
      "y": 26
     },
     "level": {
      "x": 51.75504000000001,
      "y": 26
     },
     "seg": {
      "x": 9.144,
      "y": 50
     },
     "smooth": {
      "x": 23.34768,
      "y": 50
     },
     "loop": {
      "x": 37.55136,
      "y": 50
     },
     "attack": {
      "x": 9.144,
      "y": 76
     },
     "release": {
      "x": 23.34768,
      "y": 76
     },
     "filter": {
      "x": 37.55136,
      "y": 76
     }
    },
    "portPlacements": {
     "voct": {
      "x": 7.3152,
      "y": 104,
      "labelPos": "below"
     },
     "gate": {
      "x": 18.8976,
      "y": 104,
      "labelPos": "below"
     },
     "vel": {
      "x": 30.48,
      "y": 104,
      "labelPos": "below"
     },
     "seg_cv": {
      "x": 42.0624,
      "y": 104,
      "labelPos": "below"
     },
     "pos": {
      "x": 53.644800000000004,
      "y": 104,
      "labelPos": "below"
     },
     "out": {
      "x": 53.644800000000004,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_uju0v2n",
   "typeId": "tp_mmb_sem",
   "internal": true,
   "name": "MMB SEM",
   "brand": "MMB",
   "modelNumber": "SEM",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2a3d",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "SEM",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "12 dB · state variable",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "cutoff": {
      "x": 12.192,
      "y": 31
     },
     "res": {
      "x": 31.6992,
      "y": 31
     },
     "mode": {
      "x": 20.32,
      "y": 58
     },
     "drive": {
      "x": 8.128,
      "y": 80
     },
     "cv_amt": {
      "x": 20.32,
      "y": 80
     },
     "level": {
      "x": 32.512,
      "y": 80
     }
    },
    "portPlacements": {
     "cutoff_cv": {
      "x": 11.3792,
      "y": 98,
      "labelPos": "below"
     },
     "mode_cv": {
      "x": 29.2608,
      "y": 98,
      "labelPos": "below"
     },
     "in": {
      "x": 7.3152,
      "y": 116,
      "labelPos": "below"
     },
     "out": {
      "x": 20.32,
      "y": 116,
      "labelPos": "below"
     },
     "bp": {
      "x": 33.324799999999996,
      "y": 116,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_3ukx032",
   "typeId": "tp_mmb_complex",
   "internal": true,
   "name": "MMB COMPLEX",
   "brand": "MMB",
   "modelNumber": "COMPLEX",
   "visual": {
    "hpWidth": 12,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3d2a1f",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "COMPLEX",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "modulatie → hoofdoscillator → timbre",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "ratio": {
      "x": 8.534400000000002,
      "y": 28
     },
     "mod_wave": {
      "x": 23.1648,
      "y": 28
     },
     "pitch": {
      "x": 37.7952,
      "y": 28
     },
     "level": {
      "x": 52.4256,
      "y": 28
     },
     "fm": {
      "x": 8.534400000000002,
      "y": 54
     },
     "am": {
      "x": 23.1648,
      "y": 54
     },
     "tmod": {
      "x": 37.7952,
      "y": 54
     },
     "symmetry": {
      "x": 52.4256,
      "y": 54
     },
     "timbre": {
      "x": 30.48,
      "y": 80
     }
    },
    "portPlacements": {
     "voct": {
      "x": 8.534400000000002,
      "y": 104,
      "labelPos": "below"
     },
     "fm_cv": {
      "x": 23.1648,
      "y": 104,
      "labelPos": "below"
     },
     "timbre_cv": {
      "x": 37.7952,
      "y": 104,
      "labelPos": "below"
     },
     "mod": {
      "x": 37.7952,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 52.4256,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_jw009ct",
   "typeId": "tp_mmb_wah",
   "internal": true,
   "name": "MMB WAH",
   "brand": "MMB",
   "modelNumber": "WAH",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3d1f1f",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "WAH",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "pedal": {
      "x": 15.24,
      "y": 27
     },
     "mode": {
      "x": 8.534400000000002,
      "y": 50
     },
     "type": {
      "x": 21.9456,
      "y": 50
     },
     "sens": {
      "x": 8.534400000000002,
      "y": 68
     },
     "rate": {
      "x": 21.9456,
      "y": 68
     },
     "q": {
      "x": 5.4864,
      "y": 86
     },
     "mix": {
      "x": 15.24,
      "y": 86
     },
     "level": {
      "x": 24.993599999999997,
      "y": 86
     }
    },
    "portPlacements": {
     "in": {
      "x": 8.534400000000002,
      "y": 103,
      "labelPos": "below"
     },
     "pedal_cv": {
      "x": 21.9456,
      "y": 103,
      "labelPos": "below"
     },
     "env": {
      "x": 8.534400000000002,
      "y": 117,
      "labelPos": "below"
     },
     "out": {
      "x": 21.9456,
      "y": 117,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_d2er647",
   "typeId": "tp_mmb_ensemble",
   "internal": true,
   "name": "MMB ENSEMBLE",
   "brand": "MMB",
   "modelNumber": "ENSEMBLE",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f3d36",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "ENSEMBLE",
      "fontSize": 1.9,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "drie fasen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "depth": {
      "x": 15.24,
      "y": 30
     },
     "slow": {
      "x": 8.534400000000002,
      "y": 56
     },
     "fast": {
      "x": 21.9456,
      "y": 56
     },
     "tone": {
      "x": 5.4864,
      "y": 76
     },
     "mix": {
      "x": 15.24,
      "y": 76
     },
     "level": {
      "x": 24.993599999999997,
      "y": 76
     }
    },
    "portPlacements": {
     "depth_cv": {
      "x": 15.24,
      "y": 94,
      "labelPos": "below"
     },
     "in_l": {
      "x": 4.267200000000001,
      "y": 114,
      "labelPos": "below"
     },
     "in_r": {
      "x": 11.5824,
      "y": 114,
      "labelPos": "below"
     },
     "out_l": {
      "x": 18.8976,
      "y": 114,
      "labelPos": "below"
     },
     "out_r": {
      "x": 26.2128,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_1iuz5uj",
   "typeId": "tp_mmb_epiano",
   "internal": true,
   "name": "MMB E-PIANO",
   "brand": "MMB",
   "modelNumber": "E-PIANO",
   "visual": {
    "hpWidth": 20,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#3a2a1a",
    "texts": [
     {
      "x": 50.8,
      "y": 8,
      "text": "E-PIANO",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 13,
      "text": "tine of reed voor een pickup · 12 toetsen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 50.8,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 82,
      "text": "V/Oct · Gate · Vel per toets",
      "fontSize": 0.9,
      "color": "#9ca3af",
      "align": "start"
     }
    ],
    "controlPlacements": {
     "type": {
      "x": 8.128,
      "y": 30
     },
     "timbre": {
      "x": 24.383999999999997,
      "y": 30
     },
     "bell": {
      "x": 42.672,
      "y": 30
     },
     "decay": {
      "x": 58.92799999999999,
      "y": 30
     },
     "drive": {
      "x": 75.184,
      "y": 30
     },
     "level": {
      "x": 91.44,
      "y": 30
     },
     "tremolo": {
      "x": 24.383999999999997,
      "y": 58
     },
     "trem_rate": {
      "x": 42.672,
      "y": 58
     },
     "damper": {
      "x": 58.92799999999999,
      "y": 58
     }
    },
    "portPlacements": {
     "sustain": {
      "x": 8.128,
      "y": 58,
      "labelPos": "below"
     },
     "out_l": {
      "x": 77.216,
      "y": 58,
      "labelPos": "below"
     },
     "out_r": {
      "x": 91.44,
      "y": 58,
      "labelPos": "below"
     },
     "voct_1": {
      "x": 6.5,
      "y": 88,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 14.55,
      "y": 88,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 22.6,
      "y": 88,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 30.650000000000002,
      "y": 88,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 38.7,
      "y": 88,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 46.75,
      "y": 88,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 54.800000000000004,
      "y": 88,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 62.85000000000001,
      "y": 88,
      "labelPos": "below"
     },
     "voct_9": {
      "x": 70.9,
      "y": 88,
      "labelPos": "below"
     },
     "voct_10": {
      "x": 78.95,
      "y": 88,
      "labelPos": "below"
     },
     "voct_11": {
      "x": 87,
      "y": 88,
      "labelPos": "below"
     },
     "voct_12": {
      "x": 95.05000000000001,
      "y": 88,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 6.5,
      "y": 100,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 14.55,
      "y": 100,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 22.6,
      "y": 100,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 30.650000000000002,
      "y": 100,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 38.7,
      "y": 100,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 46.75,
      "y": 100,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 54.800000000000004,
      "y": 100,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 62.85000000000001,
      "y": 100,
      "labelPos": "below"
     },
     "gate_9": {
      "x": 70.9,
      "y": 100,
      "labelPos": "below"
     },
     "gate_10": {
      "x": 78.95,
      "y": 100,
      "labelPos": "below"
     },
     "gate_11": {
      "x": 87,
      "y": 100,
      "labelPos": "below"
     },
     "gate_12": {
      "x": 95.05000000000001,
      "y": 100,
      "labelPos": "below"
     },
     "vel_1": {
      "x": 6.5,
      "y": 112,
      "labelPos": "below"
     },
     "vel_2": {
      "x": 14.55,
      "y": 112,
      "labelPos": "below"
     },
     "vel_3": {
      "x": 22.6,
      "y": 112,
      "labelPos": "below"
     },
     "vel_4": {
      "x": 30.650000000000002,
      "y": 112,
      "labelPos": "below"
     },
     "vel_5": {
      "x": 38.7,
      "y": 112,
      "labelPos": "below"
     },
     "vel_6": {
      "x": 46.75,
      "y": 112,
      "labelPos": "below"
     },
     "vel_7": {
      "x": 54.800000000000004,
      "y": 112,
      "labelPos": "below"
     },
     "vel_8": {
      "x": 62.85000000000001,
      "y": 112,
      "labelPos": "below"
     },
     "vel_9": {
      "x": 70.9,
      "y": 112,
      "labelPos": "below"
     },
     "vel_10": {
      "x": 78.95,
      "y": 112,
      "labelPos": "below"
     },
     "vel_11": {
      "x": 87,
      "y": 112,
      "labelPos": "below"
     },
     "vel_12": {
      "x": 95.05000000000001,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_zgrr83z",
   "typeId": "tp_mmb_pads",
   "internal": true,
   "name": "MMB PADS",
   "brand": "MMB",
   "modelNumber": "PADS",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2937",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "PADS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "drukken = gate",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "b1": {
      "x": 11.3792,
      "y": 30
     },
     "b2": {
      "x": 29.2608,
      "y": 30
     },
     "b3": {
      "x": 11.3792,
      "y": 58
     },
     "b4": {
      "x": 29.2608,
      "y": 58
     },
     "latch1": {
      "x": 5.6896,
      "y": 76
     },
     "latch2": {
      "x": 15.443200000000001,
      "y": 76
     },
     "latch3": {
      "x": 25.1968,
      "y": 76
     },
     "latch4": {
      "x": 34.9504,
      "y": 76
     }
    },
    "portPlacements": {
     "gate_1": {
      "x": 5.6896,
      "y": 94,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 15.443200000000001,
      "y": 94,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 25.1968,
      "y": 94,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 34.9504,
      "y": 94,
      "labelPos": "below"
     },
     "trig_1": {
      "x": 5.6896,
      "y": 108,
      "labelPos": "below"
     },
     "trig_2": {
      "x": 15.443200000000001,
      "y": 108,
      "labelPos": "below"
     },
     "trig_3": {
      "x": 25.1968,
      "y": 108,
      "labelPos": "below"
     },
     "trig_4": {
      "x": 34.9504,
      "y": 108,
      "labelPos": "below"
     },
     "any": {
      "x": 20.32,
      "y": 120,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_uyzsg9y",
   "typeId": "tp_mmb_faders",
   "internal": true,
   "name": "MMB FADERS",
   "brand": "MMB",
   "modelNumber": "FADERS",
   "visual": {
    "hpWidth": 8,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2937",
    "texts": [
     {
      "x": 20.32,
      "y": 8,
      "text": "FADERS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 13,
      "text": "handbediende CV",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 20.32,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "v1": {
      "x": 5.6896,
      "y": 44
     },
     "v2": {
      "x": 15.443200000000001,
      "y": 44
     },
     "v3": {
      "x": 25.1968,
      "y": 44
     },
     "v4": {
      "x": 34.9504,
      "y": 44
     },
     "range": {
      "x": 11.3792,
      "y": 82
     },
     "slew": {
      "x": 29.2608,
      "y": 84
     }
    },
    "portPlacements": {
     "out_1": {
      "x": 5.6896,
      "y": 112,
      "labelPos": "below"
     },
     "out_2": {
      "x": 15.443200000000001,
      "y": 112,
      "labelPos": "below"
     },
     "out_3": {
      "x": 25.1968,
      "y": 112,
      "labelPos": "below"
     },
     "out_4": {
      "x": 34.9504,
      "y": 112,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_twac13g",
   "typeId": "tp_mmb_knobs",
   "internal": true,
   "name": "MMB KNOBS",
   "brand": "MMB",
   "modelNumber": "KNOBS",
   "visual": {
    "hpWidth": 6,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1f2937",
    "texts": [
     {
      "x": 15.24,
      "y": 8,
      "text": "KNOBS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 13,
      "text": "midden = 0",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 15.24,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "v1": {
      "x": 8.534400000000002,
      "y": 28
     },
     "v2": {
      "x": 21.9456,
      "y": 28
     },
     "v3": {
      "x": 8.534400000000002,
      "y": 52
     },
     "v4": {
      "x": 21.9456,
      "y": 52
     },
     "range": {
      "x": 8.534400000000002,
      "y": 76
     },
     "slew": {
      "x": 21.9456,
      "y": 78
     }
    },
    "portPlacements": {
     "out_1": {
      "x": 8.534400000000002,
      "y": 98,
      "labelPos": "below"
     },
     "out_2": {
      "x": 21.9456,
      "y": 98,
      "labelPos": "below"
     },
     "out_3": {
      "x": 8.534400000000002,
      "y": 114,
      "labelPos": "below"
     },
     "out_4": {
      "x": 21.9456,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_1fvh10e",
   "typeId": "tp_mmb_rhythm",
   "internal": true,
   "name": "MMB RHYTHM",
   "brand": "MMB",
   "modelNumber": "RHYTHM",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "wood",
    "baseColor": "#4a3220",
    "texts": [
     {
      "x": 40.64,
      "y": 8,
      "text": "RHYTHM",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 13,
      "text": "ritmebox · presets naar de CR-78",
      "fontSize": 1.1,
      "color": "#e5e7eb",
      "align": "middle"
     },
     {
      "x": 40.64,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rhythmName": {
      "x": 29.2608,
      "y": 24
     },
     "rhythm": {
      "x": 65.024,
      "y": 26
     },
     "variation": {
      "x": 11.3792,
      "y": 48
     },
     "tempo": {
      "x": 34.1376,
      "y": 48
     },
     "run": {
      "x": 55.2704,
      "y": 46
     },
     "extclock": {
      "x": 71.5264,
      "y": 46
     },
     "accent": {
      "x": 8.128,
      "y": 72
     },
     "bass": {
      "x": 21.1328,
      "y": 72
     },
     "snare": {
      "x": 34.137600000000006,
      "y": 72
     },
     "metal": {
      "x": 47.142399999999995,
      "y": 72
     },
     "perc": {
      "x": 60.1472,
      "y": 72
     },
     "level": {
      "x": 73.152,
      "y": 72
     }
    },
    "portPlacements": {
     "start": {
      "x": 8.128,
      "y": 96,
      "labelPos": "below"
     },
     "clock": {
      "x": 21.1328,
      "y": 96,
      "labelPos": "below"
     },
     "reset": {
      "x": 34.137600000000006,
      "y": 96,
      "labelPos": "below"
     },
     "step": {
      "x": 47.142399999999995,
      "y": 96,
      "labelPos": "below"
     },
     "bar": {
      "x": 60.1472,
      "y": 96,
      "labelPos": "below"
     },
     "acc": {
      "x": 73.152,
      "y": 96,
      "labelPos": "below"
     },
     "out_l": {
      "x": 50.3936,
      "y": 114,
      "labelPos": "below"
     },
     "out_r": {
      "x": 68.2752,
      "y": 114,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_hjytow8",
   "typeId": "tp_mmb_percuter",
   "internal": true,
   "name": "MMB PERCUTER",
   "brand": "MMB",
   "modelNumber": "PERCUTER",
   "visual": {
    "hpWidth": 24,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#2b2b2b",
    "texts": [
     {
      "x": 60.96,
      "y": 8,
      "text": "PERCUTER",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 60.96,
      "y": 13,
      "text": "8 track digital drum computer · 8-bit cartridges",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 60.96,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "bank": {
      "x": 12.192,
      "y": 25
     },
     "tune": {
      "x": 87.7824,
      "y": 25
     },
     "filter": {
      "x": 102.4128,
      "y": 23
     },
     "level": {
      "x": 114.6048,
      "y": 25
     },
     "level_1": {
      "x": 8,
      "y": 42
     },
     "pan_1": {
      "x": 8,
      "y": 55
     },
     "decay_1": {
      "x": 8,
      "y": 68
     },
     "tune_1": {
      "x": 8,
      "y": 81
     },
     "level_2": {
      "x": 22.4,
      "y": 42
     },
     "pan_2": {
      "x": 22.4,
      "y": 55
     },
     "decay_2": {
      "x": 22.4,
      "y": 68
     },
     "tune_2": {
      "x": 22.4,
      "y": 81
     },
     "level_3": {
      "x": 36.8,
      "y": 42
     },
     "pan_3": {
      "x": 36.8,
      "y": 55
     },
     "decay_3": {
      "x": 36.8,
      "y": 68
     },
     "tune_3": {
      "x": 36.8,
      "y": 81
     },
     "level_4": {
      "x": 51.2,
      "y": 42
     },
     "pan_4": {
      "x": 51.2,
      "y": 55
     },
     "decay_4": {
      "x": 51.2,
      "y": 68
     },
     "tune_4": {
      "x": 51.2,
      "y": 81
     },
     "level_5": {
      "x": 65.6,
      "y": 42
     },
     "pan_5": {
      "x": 65.6,
      "y": 55
     },
     "decay_5": {
      "x": 65.6,
      "y": 68
     },
     "tune_5": {
      "x": 65.6,
      "y": 81
     },
     "level_6": {
      "x": 80,
      "y": 42
     },
     "pan_6": {
      "x": 80,
      "y": 55
     },
     "decay_6": {
      "x": 80,
      "y": 68
     },
     "tune_6": {
      "x": 80,
      "y": 81
     },
     "level_7": {
      "x": 94.4,
      "y": 42
     },
     "pan_7": {
      "x": 94.4,
      "y": 55
     },
     "decay_7": {
      "x": 94.4,
      "y": 68
     },
     "tune_7": {
      "x": 94.4,
      "y": 81
     },
     "level_8": {
      "x": 108.8,
      "y": 42
     },
     "pan_8": {
      "x": 108.8,
      "y": 55
     },
     "decay_8": {
      "x": 108.8,
      "y": 68
     },
     "tune_8": {
      "x": 108.8,
      "y": 81
     }
    },
    "portPlacements": {
     "trig_1": {
      "x": 8,
      "y": 95,
      "labelPos": "below"
     },
     "vel_1": {
      "x": 8,
      "y": 106,
      "labelPos": "below"
     },
     "out_1": {
      "x": 8,
      "y": 117,
      "labelPos": "below"
     },
     "trig_2": {
      "x": 22.4,
      "y": 95,
      "labelPos": "below"
     },
     "vel_2": {
      "x": 22.4,
      "y": 106,
      "labelPos": "below"
     },
     "out_2": {
      "x": 22.4,
      "y": 117,
      "labelPos": "below"
     },
     "trig_3": {
      "x": 36.8,
      "y": 95,
      "labelPos": "below"
     },
     "vel_3": {
      "x": 36.8,
      "y": 106,
      "labelPos": "below"
     },
     "out_3": {
      "x": 36.8,
      "y": 117,
      "labelPos": "below"
     },
     "trig_4": {
      "x": 51.2,
      "y": 95,
      "labelPos": "below"
     },
     "vel_4": {
      "x": 51.2,
      "y": 106,
      "labelPos": "below"
     },
     "out_4": {
      "x": 51.2,
      "y": 117,
      "labelPos": "below"
     },
     "trig_5": {
      "x": 65.6,
      "y": 95,
      "labelPos": "below"
     },
     "vel_5": {
      "x": 65.6,
      "y": 106,
      "labelPos": "below"
     },
     "out_5": {
      "x": 65.6,
      "y": 117,
      "labelPos": "below"
     },
     "trig_6": {
      "x": 80,
      "y": 95,
      "labelPos": "below"
     },
     "vel_6": {
      "x": 80,
      "y": 106,
      "labelPos": "below"
     },
     "out_6": {
      "x": 80,
      "y": 117,
      "labelPos": "below"
     },
     "trig_7": {
      "x": 94.4,
      "y": 95,
      "labelPos": "below"
     },
     "vel_7": {
      "x": 94.4,
      "y": 106,
      "labelPos": "below"
     },
     "out_7": {
      "x": 94.4,
      "y": 117,
      "labelPos": "below"
     },
     "trig_8": {
      "x": 108.8,
      "y": 95,
      "labelPos": "below"
     },
     "vel_8": {
      "x": 108.8,
      "y": 106,
      "labelPos": "below"
     },
     "out_8": {
      "x": 108.8,
      "y": 117,
      "labelPos": "below"
     },
     "pitch": {
      "x": 36.576,
      "y": 25,
      "labelPos": "below"
     },
     "out_l": {
      "x": 53.644800000000004,
      "y": 25,
      "labelPos": "below"
     },
     "out_r": {
      "x": 68.27520000000001,
      "y": 25,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_8mdtct6",
   "typeId": "tp_mmb_synthex",
   "internal": true,
   "name": "MMB SYNTHEX",
   "brand": "MMB",
   "modelNumber": "SYNTHEX",
   "visual": {
    "hpWidth": 28,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#1c1c22",
    "texts": [
     {
      "x": 71.12,
      "y": 8,
      "text": "SYNTHEX",
      "fontSize": 2.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 71.12,
      "y": 13,
      "text": "OSC 1 · OSC 2 · MIX · FILTER · ENV F · ENV A · LFO · MASTER",
      "fontSize": 1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 71.12,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 3,
      "y": 99,
      "text": "V/Oct · Gate per stem",
      "fontSize": 0.9,
      "color": "#9ca3af",
      "align": "start"
     }
    ],
    "controlPlacements": {
     "o1_oct": {
      "x": 9,
      "y": 24
     },
     "o1_wave": {
      "x": 9,
      "y": 42
     },
     "o1_level": {
      "x": 9,
      "y": 60
     },
     "o2_oct": {
      "x": 26.2,
      "y": 24
     },
     "o2_transpose": {
      "x": 26.2,
      "y": 78
     },
     "o2_detune": {
      "x": 43.4,
      "y": 78
     },
     "o2_wave": {
      "x": 26.2,
      "y": 42
     },
     "o2_level": {
      "x": 26.2,
      "y": 60
     },
     "sync": {
      "x": 43.4,
      "y": 24
     },
     "ring": {
      "x": 43.4,
      "y": 36
     },
     "pw": {
      "x": 9,
      "y": 78
     },
     "noise": {
      "x": 43.4,
      "y": 60
     },
     "freq": {
      "x": 60.599999999999994,
      "y": 24
     },
     "res": {
      "x": 60.599999999999994,
      "y": 42
     },
     "env_amt": {
      "x": 60.599999999999994,
      "y": 60
     },
     "kbd": {
      "x": 60.599999999999994,
      "y": 78
     },
     "mode": {
      "x": 77.8,
      "y": 24
     },
     "fa": {
      "x": 77.8,
      "y": 42
     },
     "fd": {
      "x": 77.8,
      "y": 54
     },
     "fs": {
      "x": 77.8,
      "y": 66
     },
     "fr": {
      "x": 77.8,
      "y": 78
     },
     "aa": {
      "x": 95,
      "y": 42
     },
     "ad": {
      "x": 95,
      "y": 54
     },
     "as": {
      "x": 95,
      "y": 66
     },
     "ar": {
      "x": 95,
      "y": 78
     },
     "lfo_rate": {
      "x": 112.19999999999999,
      "y": 24
     },
     "lfo_wave": {
      "x": 112.19999999999999,
      "y": 42
     },
     "lfo_osc": {
      "x": 112.19999999999999,
      "y": 56
     },
     "lfo_pw": {
      "x": 112.19999999999999,
      "y": 66
     },
     "lfo_vcf": {
      "x": 112.19999999999999,
      "y": 76
     },
     "lfo_vca": {
      "x": 112.19999999999999,
      "y": 86
     },
     "glide": {
      "x": 95,
      "y": 24
     },
     "tune": {
      "x": 129.39999999999998,
      "y": 24
     },
     "chorus": {
      "x": 129.39999999999998,
      "y": 42
     },
     "level": {
      "x": 129.39999999999998,
      "y": 58
     }
    },
    "portPlacements": {
     "voct_1": {
      "x": 7,
      "y": 104,
      "labelPos": "below"
     },
     "voct_2": {
      "x": 19,
      "y": 104,
      "labelPos": "below"
     },
     "voct_3": {
      "x": 31,
      "y": 104,
      "labelPos": "below"
     },
     "voct_4": {
      "x": 43,
      "y": 104,
      "labelPos": "below"
     },
     "voct_5": {
      "x": 55,
      "y": 104,
      "labelPos": "below"
     },
     "voct_6": {
      "x": 67,
      "y": 104,
      "labelPos": "below"
     },
     "voct_7": {
      "x": 79,
      "y": 104,
      "labelPos": "below"
     },
     "voct_8": {
      "x": 91,
      "y": 104,
      "labelPos": "below"
     },
     "gate_1": {
      "x": 7,
      "y": 115,
      "labelPos": "below"
     },
     "gate_2": {
      "x": 19,
      "y": 115,
      "labelPos": "below"
     },
     "gate_3": {
      "x": 31,
      "y": 115,
      "labelPos": "below"
     },
     "gate_4": {
      "x": 43,
      "y": 115,
      "labelPos": "below"
     },
     "gate_5": {
      "x": 55,
      "y": 115,
      "labelPos": "below"
     },
     "gate_6": {
      "x": 67,
      "y": 115,
      "labelPos": "below"
     },
     "gate_7": {
      "x": 79,
      "y": 115,
      "labelPos": "below"
     },
     "gate_8": {
      "x": 91,
      "y": 115,
      "labelPos": "below"
     },
     "bend": {
      "x": 129.39999999999998,
      "y": 78,
      "labelPos": "below"
     },
     "joy": {
      "x": 129.39999999999998,
      "y": 90,
      "labelPos": "below"
     },
     "out_l": {
      "x": 123.39999999999998,
      "y": 110,
      "labelPos": "below"
     },
     "out_r": {
      "x": 135.39999999999998,
      "y": 110,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_gq1y6yh",
   "typeId": "tp_mmb_marbles",
   "internal": false,
   "name": "MI MARBLES",
   "brand": "MI",
   "modelNumber": "MARBLES",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "MARBLES",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 13,
      "text": "random · déjà vu",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 17.78,
      "y": 20,
      "text": "— t —",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 53.34,
      "y": 20,
      "text": "— X —",
      "fontSize": 1.2,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "tempo": {
      "x": 17.78,
      "y": 32
     },
     "spread": {
      "x": 53.34,
      "y": 32
     },
     "bias": {
      "x": 8.5344,
      "y": 56
     },
     "jitter": {
      "x": 26.314400000000003,
      "y": 56
     },
     "xbias": {
      "x": 44.0944,
      "y": 56
     },
     "steps": {
      "x": 61.8744,
      "y": 56
     },
     "dejavu": {
      "x": 17.78,
      "y": 76
     },
     "length": {
      "x": 39.11600000000001,
      "y": 76
     },
     "model": {
      "x": 60.452000000000005,
      "y": 76
     },
     "scale": {
      "x": 12.8016,
      "y": 93
     },
     "range": {
      "x": 35.56,
      "y": 93
     },
     "extclock": {
      "x": 58.3184,
      "y": 93
     }
    },
    "portPlacements": {
     "clock": {
      "x": 7.112000000000001,
      "y": 106,
      "labelPos": "below"
     },
     "rate_cv": {
      "x": 26.314400000000003,
      "y": 106,
      "labelPos": "below"
     },
     "dejavu_cv": {
      "x": 45.5168,
      "y": 106,
      "labelPos": "below"
     },
     "spread_cv": {
      "x": 64.7192,
      "y": 106,
      "labelPos": "below"
     },
     "t1": {
      "x": 7.112000000000001,
      "y": 119,
      "labelPos": "below"
     },
     "t2": {
      "x": 16.7132,
      "y": 119,
      "labelPos": "below"
     },
     "tclk": {
      "x": 26.314400000000003,
      "y": 119,
      "labelPos": "below"
     },
     "x1": {
      "x": 35.915600000000005,
      "y": 119,
      "labelPos": "below"
     },
     "x2": {
      "x": 45.5168,
      "y": 119,
      "labelPos": "below"
     },
     "x3": {
      "x": 55.118,
      "y": 119,
      "labelPos": "below"
     },
     "y": {
      "x": 64.7192,
      "y": 119,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_rpz23nh",
   "typeId": "tp_mmb_plaits",
   "internal": false,
   "name": "MI PLAITS",
   "brand": "MI",
   "modelNumber": "PLAITS",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 30.48,
      "y": 8,
      "text": "PLAITS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 13,
      "text": "24 engines · macro-osc",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 30.48,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "engine": {
      "x": 17.068800000000003,
      "y": 26
     },
     "engDisp": {
      "x": 40.2336,
      "y": 22
     },
     "engName": {
      "x": 40.2336,
      "y": 29
     },
     "harmonics": {
      "x": 9.7536,
      "y": 52
     },
     "timbre": {
      "x": 30.48,
      "y": 52
     },
     "morph": {
      "x": 51.2064,
      "y": 52
     },
     "decay": {
      "x": 9.7536,
      "y": 80
     },
     "lpg": {
      "x": 30.48,
      "y": 80
     },
     "level": {
      "x": 51.2064,
      "y": 80
     },
     "coarse": {
      "x": 9.7536,
      "y": 96
     },
     "fine": {
      "x": 30.48,
      "y": 96
     }
    },
    "portPlacements": {
     "harmonics_cv": {
      "x": 8.534400000000002,
      "y": 106,
      "labelPos": "below"
     },
     "timbre_cv": {
      "x": 30.48,
      "y": 106,
      "labelPos": "below"
     },
     "morph_cv": {
      "x": 52.4256,
      "y": 106,
      "labelPos": "below"
     },
     "voct": {
      "x": 8.534400000000002,
      "y": 118,
      "labelPos": "below"
     },
     "gate": {
      "x": 23.1648,
      "y": 118,
      "labelPos": "below"
     },
     "out": {
      "x": 37.7952,
      "y": 118,
      "labelPos": "below"
     },
     "aux": {
      "x": 52.4256,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_jfx4qkx",
   "typeId": "tp_mmb_tides",
   "internal": false,
   "name": "MI TIDES",
   "brand": "MI",
   "modelNumber": "TIDES",
   "visual": {
    "hpWidth": 10,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 25.4,
      "y": 8,
      "text": "TIDES",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 13,
      "text": "slopes · 4 uitgangen",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 25.4,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "rate": {
      "x": 25.4,
      "y": 26
     },
     "mode": {
      "x": 14.224,
      "y": 50
     },
     "output": {
      "x": 36.57599999999999,
      "y": 50
     },
     "shape": {
      "x": 7.112,
      "y": 72
     },
     "slope": {
      "x": 19.304,
      "y": 72
     },
     "smooth": {
      "x": 31.496,
      "y": 72
     },
     "shift": {
      "x": 43.687999999999995,
      "y": 72
     }
    },
    "portPlacements": {
     "shape_cv": {
      "x": 7.112,
      "y": 84,
      "labelPos": "below"
     },
     "slope_cv": {
      "x": 19.304,
      "y": 84,
      "labelPos": "below"
     },
     "smooth_cv": {
      "x": 31.496,
      "y": 84,
      "labelPos": "below"
     },
     "shift_cv": {
      "x": 43.687999999999995,
      "y": 84,
      "labelPos": "below"
     },
     "gate": {
      "x": 15.239999999999998,
      "y": 102,
      "labelPos": "below"
     },
     "rate_cv": {
      "x": 35.559999999999995,
      "y": 102,
      "labelPos": "below"
     },
     "out1": {
      "x": 7.112,
      "y": 118,
      "labelPos": "below"
     },
     "out2": {
      "x": 19.304,
      "y": 118,
      "labelPos": "below"
     },
     "out3": {
      "x": 31.496,
      "y": 118,
      "labelPos": "below"
     },
     "out4": {
      "x": 43.687999999999995,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_5zwoa01",
   "typeId": "tp_mmb_clouds",
   "internal": false,
   "name": "MI CLOUDS",
   "brand": "MI",
   "modelNumber": "CLOUDS",
   "visual": {
    "hpWidth": 16,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 35.56,
      "y": 8,
      "text": "CLOUDS",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 13,
      "text": "granular · texture",
      "fontSize": 1.1,
      "color": "#9ca3af",
      "align": "middle"
     },
     {
      "x": 35.56,
      "y": 126,
      "text": "MI",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "position": {
      "x": 8.5344,
      "y": 28
     },
     "size": {
      "x": 22.0472,
      "y": 28
     },
     "pitch": {
      "x": 35.56,
      "y": 28
     },
     "density": {
      "x": 49.07280000000001,
      "y": 28
     },
     "texture": {
      "x": 62.58560000000001,
      "y": 28
     },
     "mix": {
      "x": 8.5344,
      "y": 56
     },
     "spread": {
      "x": 22.0472,
      "y": 56
     },
     "feedback": {
      "x": 35.56,
      "y": 56
     },
     "reverb": {
      "x": 49.07280000000001,
      "y": 56
     },
     "level": {
      "x": 62.58560000000001,
      "y": 56
     },
     "mode": {
      "x": 19.913600000000002,
      "y": 80
     },
     "freeze": {
      "x": 51.2064,
      "y": 80
     }
    },
    "portPlacements": {
     "in_l": {
      "x": 8.5344,
      "y": 102,
      "labelPos": "below"
     },
     "in_r": {
      "x": 22.0472,
      "y": 102,
      "labelPos": "below"
     },
     "freeze": {
      "x": 35.56,
      "y": 102,
      "labelPos": "below"
     },
     "trig": {
      "x": 49.07280000000001,
      "y": 102,
      "labelPos": "below"
     },
     "size_cv": {
      "x": 62.58560000000001,
      "y": 102,
      "labelPos": "below"
     },
     "out_l": {
      "x": 35.56,
      "y": 118,
      "labelPos": "below"
     },
     "out_r": {
      "x": 49.07280000000001,
      "y": 118,
      "labelPos": "below"
     },
     "position_cv": {
      "x": 8.5344,
      "y": 118,
      "labelPos": "below"
     },
     "density_cv": {
      "x": 22.0472,
      "y": 118,
      "labelPos": "below"
     },
     "texture_cv": {
      "x": 62.58560000000001,
      "y": 118,
      "labelPos": "below"
     }
    }
   }
  },
  {
   "id": "mod_nxb1szl",
   "typeId": "tp_mmb_out",
   "internal": false,
   "name": "MMB OUT",
   "brand": "MMB",
   "modelNumber": "OUT",
   "visual": {
    "hpWidth": 4,
    "heightMm": 128.5,
    "texture": "pcb-black",
    "baseColor": "#111827",
    "texts": [
     {
      "x": 10.16,
      "y": 8,
      "text": "OUT",
      "fontSize": 2.4,
      "color": "#f9fafb",
      "align": "middle"
     },
     {
      "x": 10.16,
      "y": 126,
      "text": "MMB",
      "fontSize": 1.6,
      "color": "#f9fafb",
      "align": "middle"
     }
    ],
    "controlPlacements": {
     "level": {
      "x": 10.16,
      "y": 30
     }
    },
    "portPlacements": {
     "l": {
      "x": 6.096,
      "y": 92,
      "labelPos": "below"
     },
     "r": {
      "x": 14.223999999999998,
      "y": 92,
      "labelPos": "below"
     }
    }
   }
  }
 ],
 "racks": [
  {
   "id": "rack_dnbjwa9",
   "name": "Generative jam",
   "description": "Marbles → Plaits → Clouds; Tides beweegt de wolk. Zelfspelend.",
   "rows": 1,
   "hpPerRow": 66,
   "slots": [
    {
     "id": "slot_z6mcid6",
     "moduleId": "mod_gq1y6yh",
     "row": 0,
     "hpOffset": 0
    },
    {
     "id": "slot_vtk2dzp",
     "moduleId": "mod_rpz23nh",
     "row": 0,
     "hpOffset": 16
    },
    {
     "id": "slot_qm2jyvd",
     "moduleId": "mod_jfx4qkx",
     "row": 0,
     "hpOffset": 32
    },
    {
     "id": "slot_1d8sndy",
     "moduleId": "mod_5zwoa01",
     "row": 0,
     "hpOffset": 42
    },
    {
     "id": "slot_n51i3cw",
     "moduleId": "mod_nxb1szl",
     "row": 0,
     "hpOffset": 58
    }
   ],
   "kind": "physical"
  }
 ],
 "patches": [
  {
   "id": "patch_2rq147i",
   "name": "Generative jam",
   "description": "Zelfspelend: Marbles kiest noten (pentatonisch) en klokt Plaits; Clouds + Tides maken er een drijvende wolk van. Draai aan Déjà vu (~0.5) om de melodie te laten loopen.",
   "voiceCount": 1,
   "rackIds": [
    "rack_dnbjwa9"
   ],
   "connections": [
    {
     "id": "conn_w2uhqjy",
     "from": {
      "moduleId": "mod_gq1y6yh",
      "portId": "x1"
     },
     "to": {
      "moduleId": "mod_rpz23nh",
      "portId": "voct"
     }
    },
    {
     "id": "conn_yr8tzbq",
     "from": {
      "moduleId": "mod_gq1y6yh",
      "portId": "t1"
     },
     "to": {
      "moduleId": "mod_rpz23nh",
      "portId": "gate"
     }
    },
    {
     "id": "conn_5jk1xt3",
     "from": {
      "moduleId": "mod_rpz23nh",
      "portId": "out"
     },
     "to": {
      "moduleId": "mod_5zwoa01",
      "portId": "in_l"
     }
    },
    {
     "id": "conn_jsnez1v",
     "from": {
      "moduleId": "mod_rpz23nh",
      "portId": "aux"
     },
     "to": {
      "moduleId": "mod_5zwoa01",
      "portId": "in_r"
     }
    },
    {
     "id": "conn_k1z3rdq",
     "from": {
      "moduleId": "mod_gq1y6yh",
      "portId": "t2"
     },
     "to": {
      "moduleId": "mod_5zwoa01",
      "portId": "trig"
     }
    },
    {
     "id": "conn_ygzzeba",
     "from": {
      "moduleId": "mod_jfx4qkx",
      "portId": "out1"
     },
     "to": {
      "moduleId": "mod_5zwoa01",
      "portId": "position_cv"
     }
    },
    {
     "id": "conn_wka3oej",
     "from": {
      "moduleId": "mod_jfx4qkx",
      "portId": "out2"
     },
     "to": {
      "moduleId": "mod_5zwoa01",
      "portId": "texture_cv"
     }
    },
    {
     "id": "conn_2k7xeg6",
     "from": {
      "moduleId": "mod_5zwoa01",
      "portId": "out_l"
     },
     "to": {
      "moduleId": "mod_nxb1szl",
      "portId": "l"
     }
    },
    {
     "id": "conn_fusxv4g",
     "from": {
      "moduleId": "mod_5zwoa01",
      "portId": "out_r"
     },
     "to": {
      "moduleId": "mod_nxb1szl",
      "portId": "r"
     }
    }
   ],
   "controlState": {
    "mod_gq1y6yh": {
     "tempo": 180,
     "bias": 0.4,
     "jitter": 0.1,
     "model": 0,
     "dejavu": 0,
     "length": 8,
     "spread": 0.5,
     "xbias": 0.5,
     "steps": 0.8,
     "scale": 2,
     "range": 1
    },
    "mod_rpz23nh": {
     "engine": 11,
     "harmonics": 0.5,
     "timbre": 0.45,
     "morph": 0.5,
     "decay": 0.55,
     "lpg": 0.6
    },
    "mod_jfx4qkx": {
     "rate": 0.07,
     "mode": 1,
     "output": 2,
     "shape": 0.5,
     "slope": 0.5,
     "smooth": 0.6,
     "shift": 0.5
    },
    "mod_5zwoa01": {
     "position": 0.35,
     "size": 0.6,
     "pitch": 0,
     "density": 0.5,
     "texture": 0.5,
     "mix": 0.55,
     "spread": 0.6,
     "feedback": 0.3,
     "reverb": 0.55,
     "mode": 0
    },
    "mod_nxb1szl": {
     "level": 0.8
    }
   },
   "envelopes": [],
   "lfos": []
  }
 ],
 "activeRackId": "rack_dnbjwa9",
 "activePatchId": "patch_2rq147i"
}