{
 "_sources": [
  {
   "type": "vendor-doc",
   "url": "https://github.com/sscheidl/preenfm2-vosim-editor-firmware",
   "notes": "PreenFM2 3.10 alpha by sscheidl (tAUREON), alternative firmware for the PreenFM2 (GPL, as upstream): src/midi/MidiDecoder.h (CC numbers, editor NRPN page), src/midi/MidiDecoder.cpp (controlChange scaling, decodeNrpn, MPE and polyphonic aftertouch) and release/editor-protocol-3.00alpha/EDITOR_PROTOCOL.md at 1107a62, the commit the v3.10alpha release (2026-10-02) was built from.",
   "firmware": "3.10-alpha",
   "commit": "1107a62",
   "imported_at": "2026-10-26"
  }
 ],
 "_limitations": "PreenFM2 3.10 alpha (pre-release of 2026-10-02, built on Patrice Vigouroux's VOSIM branch). Against the official 2.21: true polyphonic key pressure (send it with /poly_aftertouch; the AftT matrix routes become per note), Lower-Zone MPE (master channel 1, member channels set in the menu; per-note bend up to +/-48, slide on CC 74), and the editor protocol on NRPN page 4 (capability, position and store). Each of the 4 timbres listens on its channel set in the menu; routes default to channel 1. CCs are received when the menu's Receive setting includes CC, NRPNs when it includes NRPN. The values and their scaling are those of the decoder (shown on each route). Replies of the editor protocol and the NRPN dump come back as CCs 99/98/6/38 and are not decoded. Not mapped: CC 12/13 Scala (CC 13 is also unison detune), omni on/off, the synth parameter list behind NRPN pages 0 and 1, SysEx patch transfers. Untested on hardware.",
 "device": {
  "name": "PreenFM2",
  "vendor": "PreenFM",
  "revision": "3.10 alpha (alternative firmware by sscheidl)",
  "osc_prefix": "/preenfm2_310alpha",
  "manufacturer_id": [],
  "device_id": []
 },
 "sysex": {
  "header": [],
  "footer": []
 },
 "midi_out": {
  "default_channel": 0,
  "note_offset": 0
 },
 "cc_params": {
  "channel": 0,
  "entries": [
   {
    "osc": "/bank",
    "cc": 0,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Bank for the next Program Change (MSB).",
    "expects": "discrete"
   },
   {
    "osc": "/bank_lsb",
    "cc": 32,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Bank for the next Program Change (LSB).",
    "expects": "discrete"
   },
   {
    "osc": "/mod_wheel",
    "cc": 1,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Matrix source Mod wheel (value / 127)."
   },
   {
    "osc": "/breath",
    "cc": 2,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Matrix source Breath (value / 127)."
   },
   {
    "osc": "/volume",
    "cc": 7,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Filter/effect gain 0.0-1.0 (value / 127)."
   },
   {
    "osc": "/pan",
    "cc": 10,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Left/right balance ((value + 1) / 128)."
   },
   {
    "osc": "/scala/enable",
    "cc": 12,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Scala tuning on when above 0.",
    "expects": "switch"
   },
   {
    "osc": "/unison/detune",
    "cc": 13,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Unison detune (value / 64 - 1). CC 13 also selects the Scala scale (both handlers run)."
   },
   {
    "osc": "/unison/spread",
    "cc": 14,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Unison spread (value / 127)."
   },
   {
    "osc": "/engine/algo",
    "cc": 16,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Algorithm number (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/hold_pedal",
    "cc": 64,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Hold pedal.",
    "expects": "switch"
   },
   {
    "osc": "/filter/type",
    "cc": 70,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Filter/effect type (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/filter/param1",
    "cc": 71,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Filter parameter 1 (value / 127)."
   },
   {
    "osc": "/filter/param2",
    "cc": 72,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Filter parameter 2 (value / 127)."
   },
   {
    "osc": "/filter/gain",
    "cc": 73,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Filter/effect gain 0.0-1.27 (value x 0.01)."
   },
   {
    "osc": "/mpe/slide",
    "cc": 74,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "MPE slide, matrix source (value / 127)."
   },
   {
    "osc": "/lfo_env2/silence",
    "cc": 59,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Env 2 silence (value / 8)."
   },
   {
    "osc": "/env/attack_carriers",
    "cc": 80,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Attack of every carrier operator of the current algorithm (value / 64)."
   },
   {
    "osc": "/env/attack_modulators",
    "cc": 62,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Attack of every modulator operator (value / 64)."
   },
   {
    "osc": "/env/release_carriers",
    "cc": 81,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Release of every carrier operator (value / 32)."
   },
   {
    "osc": "/env/release_modulators",
    "cc": 63,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Release of every modulator operator (value / 32)."
   },
   {
    "osc": "/arp/clock",
    "cc": 100,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Arpeggiator clock (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/arp/direction",
    "cc": 101,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Arpeggiator direction (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/arp/octave",
    "cc": 102,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Arpeggiator octave (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/arp/pattern",
    "cc": 103,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Arpeggiator pattern (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/arp/division",
    "cc": 104,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Arpeggiator division (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/arp/duration",
    "cc": 105,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Arpeggiator duration (value as is).",
    "expects": "discrete"
   },
   {
    "osc": "/current_instrument",
    "cc": 119,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Selects the instrument (timbre) shown on the unit.",
    "expects": "discrete"
   },
   {
    "osc": "/all_sound_off",
    "cc": 120,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "All sound off.",
    "expects": "trigger"
   },
   {
    "osc": "/all_notes_off",
    "cc": 123,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "All notes off.",
    "expects": "trigger"
   },
   {
    "osc": "/reset",
    "cc": 127,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "All notes off, running status and song position reset.",
    "expects": "trigger"
   },
   {
    "osc": "/engine/im1",
    "cc": 17,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Modulation index 1 (value x 0.1)."
   },
   {
    "osc": "/engine/im2",
    "cc": 18,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Modulation index 2 (value x 0.1)."
   },
   {
    "osc": "/engine/im3",
    "cc": 19,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Modulation index 3 (value x 0.1)."
   },
   {
    "osc": "/engine/im4",
    "cc": 20,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Modulation index 4 (value x 0.1)."
   },
   {
    "osc": "/engine/im5",
    "cc": 21,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Modulation index 5 (value x 0.1)."
   },
   {
    "osc": "/mix/level1",
    "cc": 22,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 1 mix (value / 127)."
   },
   {
    "osc": "/mix/level2",
    "cc": 24,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 2 mix (value / 127)."
   },
   {
    "osc": "/mix/level3",
    "cc": 26,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 3 mix (value / 127)."
   },
   {
    "osc": "/mix/level4",
    "cc": 28,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 4 mix (value / 127)."
   },
   {
    "osc": "/mix/pan1",
    "cc": 23,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 1 pan (value / 127 x 2 - 1)."
   },
   {
    "osc": "/mix/pan2",
    "cc": 25,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 2 pan (value / 127 x 2 - 1)."
   },
   {
    "osc": "/mix/pan3",
    "cc": 27,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 3 pan (value / 127 x 2 - 1)."
   },
   {
    "osc": "/mix/pan4",
    "cc": 29,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Carrier 4 pan (value / 127 x 2 - 1)."
   },
   {
    "osc": "/osc1/freq",
    "cc": 50,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 1 frequency (value / 12)."
   },
   {
    "osc": "/osc2/freq",
    "cc": 51,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 2 frequency (value / 12)."
   },
   {
    "osc": "/osc3/freq",
    "cc": 52,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 3 frequency (value / 12)."
   },
   {
    "osc": "/osc4/freq",
    "cc": 53,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 4 frequency (value / 12)."
   },
   {
    "osc": "/osc5/freq",
    "cc": 54,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 5 frequency (value / 12)."
   },
   {
    "osc": "/osc6/freq",
    "cc": 55,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 6 frequency (value / 12)."
   },
   {
    "osc": "/matrix1/mul",
    "cc": 46,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Matrix row 1 multiplier (value x 0.2 - 10)."
   },
   {
    "osc": "/matrix2/mul",
    "cc": 47,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Matrix row 2 multiplier (value x 0.2 - 10)."
   },
   {
    "osc": "/matrix3/mul",
    "cc": 48,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Matrix row 3 multiplier (value x 0.2 - 10)."
   },
   {
    "osc": "/matrix4/mul",
    "cc": 49,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Matrix row 4 multiplier (value x 0.2 - 10)."
   },
   {
    "osc": "/lfo1/freq",
    "cc": 56,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 1 frequency (value x 0.2)."
   },
   {
    "osc": "/lfo2/freq",
    "cc": 57,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 2 frequency (value x 0.2)."
   },
   {
    "osc": "/lfo3/freq",
    "cc": 58,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 3 frequency (value x 0.2)."
   },
   {
    "osc": "/stepseq1/gate",
    "cc": 60,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Step sequencer 1 gate (value x 0.01)."
   },
   {
    "osc": "/stepseq2/gate",
    "cc": 61,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Step sequencer 2 gate (value x 0.01)."
   },
   {
    "osc": "/performance/cc1",
    "cc": 115,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Performance (matrix source) CC 1 ((value - 64) / 127 x 2)."
   },
   {
    "osc": "/performance/cc2",
    "cc": 116,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Performance (matrix source) CC 2 ((value - 64) / 127 x 2)."
   },
   {
    "osc": "/performance/cc3",
    "cc": 117,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Performance (matrix source) CC 3 ((value - 64) / 127 x 2)."
   },
   {
    "osc": "/performance/cc4",
    "cc": 118,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Performance (matrix source) CC 4 ((value - 64) / 127 x 2)."
   },
   {
    "osc": "/env1/attack",
    "cc": 65,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 1 envelope attack (value / 64)."
   },
   {
    "osc": "/env2/attack",
    "cc": 75,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 2 envelope attack (value / 64)."
   },
   {
    "osc": "/env3/attack",
    "cc": 76,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 3 envelope attack (value / 64)."
   },
   {
    "osc": "/env4/attack",
    "cc": 77,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 4 envelope attack (value / 64)."
   },
   {
    "osc": "/env5/attack",
    "cc": 78,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 5 envelope attack (value / 64)."
   },
   {
    "osc": "/env6/attack",
    "cc": 79,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 6 envelope attack (value / 64)."
   },
   {
    "osc": "/env1/release",
    "cc": 82,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 1 envelope release (value / 32)."
   },
   {
    "osc": "/env2/release",
    "cc": 83,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 2 envelope release (value / 32)."
   },
   {
    "osc": "/env3/release",
    "cc": 84,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 3 envelope release (value / 32)."
   },
   {
    "osc": "/env4/release",
    "cc": 85,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 4 envelope release (value / 32)."
   },
   {
    "osc": "/env5/release",
    "cc": 86,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 5 envelope release (value / 32)."
   },
   {
    "osc": "/env6/release",
    "cc": 87,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "Operator 6 envelope release (value / 32)."
   },
   {
    "osc": "/lfo1/phase",
    "cc": 88,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 1 phase (value x 0.01)."
   },
   {
    "osc": "/lfo2/phase",
    "cc": 89,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 2 phase (value x 0.01)."
   },
   {
    "osc": "/lfo3/phase",
    "cc": 90,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 3 phase (value x 0.01)."
   },
   {
    "osc": "/lfo1/bias",
    "cc": 91,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 1 bias (value x 0.01)."
   },
   {
    "osc": "/lfo2/bias",
    "cc": 92,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 2 bias (value x 0.01)."
   },
   {
    "osc": "/lfo3/bias",
    "cc": 93,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 3 bias (value x 0.01)."
   },
   {
    "osc": "/lfo1/shape",
    "cc": 94,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 1 shape (value as is)."
   },
   {
    "osc": "/lfo2/shape",
    "cc": 95,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 2 shape (value as is)."
   },
   {
    "osc": "/lfo3/shape",
    "cc": 96,
    "range": [
     0,
     127
    ],
    "section": "CC",
    "_usage": "LFO 3 shape (value as is)."
   },
   {
    "osc": "/nrpn/param",
    "nrpn_msb": 0,
    "nrpn_lsb_range": [
     0,
     127
    ],
    "range": [
     0,
     16383
    ],
    "section": "NRPN",
    "_usage": "Synth parameter n = LSB (0-127): row n / 4, encoder n % 4 of the parameter pages; float parameters take (value - min) x 100."
   },
   {
    "osc": "/nrpn/param_page1",
    "nrpn_msb": 1,
    "nrpn_lsb_range": [
     0,
     127
    ],
    "range": [
     0,
     16383
    ],
    "section": "NRPN",
    "_usage": "Synth parameter n = 128 + LSB; 228-239 (LSB 100-111) are the 12 preset name letters."
   },
   {
    "osc": "/nrpn/stepseq1_step",
    "nrpn_msb": 2,
    "nrpn_lsb_range": [
     0,
     15
    ],
    "range": [
     0,
     16383
    ],
    "section": "NRPN",
    "_usage": "Step sequencer 1, step = LSB; only the value's low 7 bits are read."
   },
   {
    "osc": "/nrpn/stepseq2_step",
    "nrpn_msb": 3,
    "nrpn_lsb_range": [
     0,
     15
    ],
    "range": [
     0,
     16383
    ],
    "section": "NRPN",
    "_usage": "Step sequencer 2, step = LSB; only the value's low 7 bits are read."
   },
   {
    "osc": "/nrpn/dump_request",
    "nrpn_msb": 127,
    "nrpn_lsb": 127,
    "range": [
     0,
     16383
    ],
    "expects": "trigger",
    "section": "NRPN",
    "_usage": "Any value: the unit sends the current patch back as NRPNs."
   },
   {
    "osc": "/editor/capability_query",
    "nrpn_msb": 4,
    "nrpn_lsb": 0,
    "range": [
     0,
     16383
    ],
    "expects": "trigger",
    "section": "Editor protocol",
    "_usage": "Send 0. Replies NRPN 4/64 protocol version (1) and 4/65 capabilities (bit 0 store, bit 1 position)."
   },
   {
    "osc": "/editor/position_query",
    "nrpn_msb": 4,
    "nrpn_lsb": 1,
    "range": [
     0,
     16383
    ],
    "expects": "trigger",
    "section": "Editor protocol",
    "_usage": "Send 0. Replies NRPN 4/66 bank type, 4/67 bank, 4/68 preset, 4/69 valid."
   },
   {
    "osc": "/editor/store",
    "nrpn_msb": 4,
    "nrpn_lsb": 2,
    "range": [
     0,
     16383
    ],
    "section": "Editor protocol",
    "_usage": "Value = bank x 128 + preset (both from 0, bank below 64): writes the edit buffer there. Replies 4/71 target and 4/70 status (0 ok, 1 bank absent or read-only, 2 invalid slot, 3 channel not on exactly one timbre, 4 storage error, 5 protocol error)."
   }
  ]
 },
 "commands": []
}
