Programming Oberheim Matrix Xpander

Hi!
My first project with the ElectraOne was to get more out of the Oberheim Xpander, a beast of a synth with one of the first ever MIDI implementations. It sends SYSEX for every parameter which the Electra One picks up.

I did get something going, but seem to have run into a thing that the sysex messages seem to be only sending an increment or a decrement (by 1) for the specified parameter. Which means loads of turns on the ElectraOne rotaries, which rather defeats the point.

Anyone having any experience with the Xpander and ElectraOne?

2 Likes

Hi Cristian,

I found the Xpander SysEx docs online. see below.

After a quick look, I would say that you are most likely receiving the “UP/DOWN” SysEx messages. These indicate pressing of the “+” and “-” buttons on the panel. Just guessing…

If I were you, I would take a look at the Page select messages and Page edit messages.

Maybe I am missing something obvious, but it looks like this SysEx implementation is based on the user interface of the synth? Is that assumption correct?

oberheimxpandermidispec-473798.pdf (227.9 KB)

Yes, it is based on the rotaries on the front of the synth, which physically click as they turn, incrementing by 1 every click. The increment is of course relative to the current value of each param, and increments when turned to the right, decrements when turned to the left

Its great someone took the time to keep alive the original spec in that document! So, reading it, it seems to me that the contemporary method of setting the parameter to a specific value is not achievable via sysex, or am I wrong?

There are a handful of CC numbers ( called Lever1, Lever2 etc) that can be assigned to control som parameters via the front panel, but I wanted to make it all more simple by reaching every sound paramater value directly from the Electra One, without all the front panel button punching.

Would it be feasible to make a LUA script that would be able to repeat the up/down push virtually? My understanding reading that doc, is that the synth doesn’t send the current value of the parameter either - which is also a bit tricky

One approach would be to first request the current patch, parse out the data pieces and set the ElectraOne controls to those current values.
Then, if the user moved a knob/fader from the current value of 7 to a new value of 50, the LUA script could generate 43 consecutive “increment by 1” sysex messages.

You would either have to have a slight pause between recognizing a fader/knob movement and transmitting the data or send a new increment message for each change.

Currently, if you put a fader up and have a normal 0-127 range on it, you do not need a large number of movements to sweep the range.

If you wanted to send increment messages for each change, I might play with the idea of setting the range to something like 0-508 and then do a MOD 4 of the value and if 0, send it. That way you have some control over the speed of messages going to the Xpander. My guess is that the ElectraOne could easily flood the Xpander MIDI input and cause issues. Processors back in the day were not as fast as today and the memory buffers were not very big either.

It is possible to rate limit the messages on Electra’s side. the rate parameter of the device.

I will look at it at the weekend. I general, I agree with @oldgearguy, the first step is to make sure that Electra has current values of the parameters by getting a patch dump and apply the incremental changes.

I have been making progress since December 12 update.

I can now flip pages easily on the XPander from Electra-1, but finding out that the dials are absolute, in that the sysex for turning a dial on the old synth is not page aware. It is one of six dials.

Therefore I tried to attach sysex that first flips the page , but it kills the Matrix straight away. This is I suppose to do with flooding with the page flip sysex.

//Page Select

[
  "F0",
  "10",
  "02",
  "0B",
  {
    "type": "value"
  },
  "00",
  "F7"
]

//Knob 6
[
  "F0",
  "10",
  "02",
  "0A",
  "00",
  "1D",
  "00",
  {
    "type": "value"
  },
  "00",
  "00",
  "00",
  "F7"
]

How could I make it send only one page flip, then increment ?

1 Like

Hi Cristian,

I tried something, not sure if it will work, but it might help…

Please take a look the Xpander test preset

I created 4 pads for the page selection. Pretty much inspired by your preset. Tapping pads should switch pages on the Xpander.

Then, there is an array of 6 knobs. I left 1 … 5 on CC7 for now. The knob 6 is set up to send the SysEx message according to your example. The difference is that I call function instead of value. The Lua function is determines the direction of the rotation and returns 1 (clockwise) or 64 (counter-clockwise). These two values (1, 64) are just examples, right values should be put in place. Also, looks like that Xpander might be using two bytes to express the value. If it was the case then two function calls will be required.

The idea of changing the absolute knob to relative one is quite simple. I configure its range to three values (0, 1, 2). the 1 is the default, say center. When the knob is twisted I check if the new value is higher or lower (hence the direction) and immediately reset the knob to the default (center) again.

Lua function called from the SysEx template. Note, it is a simplified example. It ignores devices, valueObject, etc. It is hardwired to knob 6.

centerValue = 1

function sendIncrement(valueObject, value)
  local outputValue = 0

  -- determine direction of the rotation
  if (value > centerValue) then
    outputValue = 1                         -- return 1 on inc
  else
    outputValue = 64                       -- return 64 on dec
  end

  -- reset the parameter value to the center
  parameterMap.set (1, PT_SYSEX, 6, centerValue)

  print ("output: " .. outputValue)  

  return (outputValue)
end

Maybe, if you were able to capture a few sysex messages when turning the knobs and pressing the buttons and send it to me, I would be able to get the sysex messages right for you remotely.

Props to you @martin for having a go at devleoping a script without being able to try it on an actual 1981 Oberheim XPander! I will have a go with your new suggestions and learn from there , once I see how the old beast reacts. Many thanks!

2 Likes