Waldorf XT Mod Matrix

I found the XT preset I started.
Waldorf XT

3 Likes

I made an updated version of your fine work with the addition of most CC’s listed in the XT’s manual. I see there’s tons of parameters listed in the sysex documentation, but I don’t know how to map them, so some functions aren’t available (like the wave envelopes that aren’t mapped to any cc)

Updated version

1 Like

Excellent additions.
The sysex is documented in the back of the microWave XT manual.
You can look at how I defined the Mod Matrix sysex, look in the back of the docs, and add more.

If free time fell out of the sky this week, I might throw a bit more sysex controls in there as additional examples.

(so when you press the “Patch Request” button, all of the new params you added are populated?)

Unfortunately not, only the parameters in the Mod Matrix are updated from the received dump from the XT.
The XT receives sysex dump query, I observe sysex received in the midi console on the Electra, but it stops there.
Am I only quering about “your” parameters, or is the Electra not updating the parameters I added, for some reason?

Wondering if it is a setting problem on my unit; but then why’d I manage to receive your parameters?

The LUA code was explicitly mapping the data from the raw sysex dump into the parameterMap.
(look for lines like: parameterMap.set(1,PT_SYSEX,192+(i*3),syxBuf[192+(i*3)]))

To have a control read/understand/map to the sysex dump and have it send CCs to change the value requires a lot of LUA gymnastics.

The other option is to change all the CC controls to match the sysex dump offsets.

What I’ll try to do is create a parallel page showing how to map some of the same controls you did with CCs to sysex controls instead.

Once I show you how I did a few, you can extend that to the rest.

Look for a post (hopefully later today) that has more sysex examples.
If you’re bored, open your CC version, edit the LUA code, look for the function called patch.onResponse().

At the bottom of that function, make it look like this:

   -- read all the received data to make life easier
   for i = 0,(sysexBlock:getLength() - 1) do
       deSyx[i] = sysexBlock:read()
   end

   showPgmName(deSyx)
   updModMatrix(deSyx)
   mapAllCCs(deSyx)
end

and then paste this function somewhere below that last “end” .
See if that populates your CCs after pressing the “Get Patch” soft button


function mapAllCCs(syxBuf)
   -- unmapped CCs for the moment
   --[[
   parameterMap.set(1,PT_CC7,1,syxBuf[i])   -- 0 to 127 Modulation wheel
   parameterMap.set(1,PT_CC7,2,syxBuf[i])   -- 0 to 127 Breath control
   parameterMap.set(1,PT_CC7,3,syxBuf[i])   -- not documented
   parameterMap.set(1,PT_CC7,4,syxBuf[i])   -- 0 to 127 Foot controller
   parameterMap.set(1,PT_CC7,6,syxBuf[i])   -- not documented
   parameterMap.set(1,PT_CC7,7,syxBuf[i])   -- 0 to 127 Channel Volume
   parameterMap.set(1,PT_CC7,8,syxBuf[i])   -- not documented
   parameterMap.set(1,PT_CC7,9,syxBuf[i])   -- not documented
   parameterMap.set(1,PT_CC7,11,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,32,syxBuf[i])  -- 0,1 Bank Select 0:Bank A 1:Bank B
   parameterMap.set(1,PT_CC7,59,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,63,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,64,syxBuf[i])  -- 0 to 127 Sustain Switch
   parameterMap.set(1,PT_CC7,66,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,67,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,68,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,69,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,84,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,96,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,97,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,98,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,99,syxBuf[i])  -- not documented
   parameterMap.set(1,PT_CC7,100,syxBuf[i]) -- not documented
   parameterMap.set(1,PT_CC7,101,syxBuf[i]) -- not documented
   --]]

   parameterMap.set(1,PT_CC7,5,syxBuf[90])
   parameterMap.set(1,PT_CC7,10,syxBuf[84])
   parameterMap.set(1,PT_CC7,12,syxBuf[82])
   parameterMap.set(1,PT_CC7,13,syxBuf[7])
   for i=0,3 do
      parameterMap.set(1,PT_CC7,14+i,syxBuf[113+i])
      parameterMap.set(1,PT_CC7,18+i,syxBuf[119+i])
   end
   parameterMap.set(1,PT_CC7,22,syxBuf[88])
   parameterMap.set(1,PT_CC7,23,syxBuf[89])
   parameterMap.set(1,PT_CC7,24,syxBuf[159])
   parameterMap.set(1,PT_CC7,25,syxBuf[160])
   parameterMap.set(1,PT_CC7,26,syxBuf[166])
   parameterMap.set(1,PT_CC7,27,syxBuf[168])
   parameterMap.set(1,PT_CC7,28,syxBuf[167])
   parameterMap.set(1,PT_CC7,29,syxBuf[117])
   parameterMap.set(1,PT_CC7,30,syxBuf[161])
   parameterMap.set(1,PT_CC7,31,syxBuf[123])
   parameterMap.set(1,PT_CC7,33,syxBuf[1])
   parameterMap.set(1,PT_CC7,34,syxBuf[2])
   parameterMap.set(1,PT_CC7,35,syxBuf[3])
   parameterMap.set(1,PT_CC7,36,syxBuf[5])
   parameterMap.set(1,PT_CC7,37,syxBuf[6])
   for i=0,6 do
      parameterMap.set(1,PT_CC7,38+i,syxBuf[12+i])
   end
   for i=0,4 do
      parameterMap.set(1,PT_CC7,45+i,syxBuf[47+i])
   end
   parameterMap.set(1,PT_CC7,50,syxBuf[62])
   parameterMap.set(1,PT_CC7,51,syxBuf[65])
   parameterMap.set(1,PT_CC7,52,syxBuf[66])
   parameterMap.set(1,PT_CC7,53,syxBuf[67])
   parameterMap.set(1,PT_CC7,54,syxBuf[64])
   parameterMap.set(1,PT_CC7,55,syxBuf[80])
   parameterMap.set(1,PT_CC7,56,syxBuf[63])
   parameterMap.set(1,PT_CC7,57,syxBuf[77])
   parameterMap.set(1,PT_CC7,58,syxBuf[79])
   parameterMap.set(1,PT_CC7,60,syxBuf[73])
   parameterMap.set(1,PT_CC7,61,syxBuf[74])
   parameterMap.set(1,PT_CC7,62,syxBuf[75])
   parameterMap.set(1,PT_CC7,65,syxBuf[87])
   for i=0,6 do
      parameterMap.set(1,PT_CC7,70+i,syxBuf[25+i])
      parameterMap.set(1,PT_CC7,77+i,syxBuf[36+i])
   end
   for i=0,8 do
      parameterMap.set(1,PT_CC7,85+i,syxBuf[149+i])
   end
   parameterMap.set(1,PT_CC7,94,syxBuf[193])
   parameterMap.set(1,PT_CC7,95,syxBuf[196])
   parameterMap.set(1,PT_CC7,102,syxBuf[92])
   parameterMap.set(1,PT_CC7,103,syxBuf[95])
   parameterMap.set(1,PT_CC7,104,syxBuf[94])
   parameterMap.set(1,PT_CC7,105,syxBuf[93])
   parameterMap.set(1,PT_CC7,106,syxBuf[97])
   parameterMap.set(1,PT_CC7,107,syxBuf[96])
   parameterMap.set(1,PT_CC7,108,syxBuf[98])
   parameterMap.set(1,PT_CC7,109,syxBuf[99])
   parameterMap.set(1,PT_CC7,110,syxBuf[100])
   parameterMap.set(1,PT_CC7,111,syxBuf[101])
   parameterMap.set(1,PT_CC7,112,syxBuf[162])
   parameterMap.set(1,PT_CC7,113,syxBuf[163])
   parameterMap.set(1,PT_CC7,114,syxBuf[164])
   for i=0,3 do
      parameterMap.set(1,PT_CC7,115+i,syxBuf[169+i])
   end
end
1 Like

I see. Yes I think more people would benefit from learning more about sysex handling/translation to cc controls.

I had some problems mapping the octave and semitone controls somehow, they would just go to smallest value the instant I moved the remote controller, and stay stuck there. Mapped completely as all the other controls… but no.

But I found some more, slightly conflicting data about the destination when finding it in the sysex part of the manual; some of the recommended (by the manual) midi range would just not work, while in the sysex addendum its range was slightly different, omitting a tiny part of the cc (0-127) range. That suddenly sprung the control into action again…

Have been offline mostly from beginning of Aug w a home renovation project, hopefully fully landed this Wednesday. Then comes a demanding pedalboard installation that was interrupted by the renov, will take about 2 weeks. Then there’s time for Electra Mk II and your stellar presets…

No worries.

I’ve got a move coming up in my future (end of October).

Fortunately I have a PCM 80 (OS 1), PCM 80 (OS 1.1), and PCM 81 and 2 dual FX cards and 1 Pitch FX card and multiple Electra Ones, so I can split the hw up and develop everywhere. lol

The PCM 70 preset is getting close to being actually finished. I have the save working (except for a bug/limit in the Electra One) and all the edits are looking pretty good.
The PCM 80/81 is solid, but needs a lot of testing/tweaking/finishing

My plan for the Waldorf XT is to provide direction and let others run with it.

1 Like

@fragletrollet - scroll up a couple posts and I think you’ll be very happy.

Plug in the mapAllCCs() function and also update the patch.onResponse() as I showed.
Now if you press “Get Patch”, you will get all the CC controls updated as well.
One thing I did notice – at some point in time, the Mod Matrix stuff got broken (probably in one of the cut n’ paste things over time).

With sysex controls the parameter number must match exactly to the data offset in the sysex buffer.
So – right now, the Mod Matrix 1 controls show parameter numbers of 1,2,3. For it to work properly, they must be changed to 192,193,194 (see Table 3.1 in the microWave XT manual). Update the other 11 sets of controls as well and then all of it will work again.

In addition, I updated my Sysex version to show a couple different ways to handle the octaves and to handle the key tracking. Neither control maps 1 for 1 with the raw data, so you need to do some stuff to handle it.

Feel free to look it over and ask any questions.

Thanks! I’ll have a look as soon as I’ve got time; just started a bachelor in ee so got some math to catch up with :slight_smile:

Good luck in the studies. I’m traveling today, so if you don’t have time, I’ll create an update of your work and post it for you and others to play with in the next day or so.

1 Like

Just added the LUA code you posted above to my preset, and it seems to work and update the parameters from the synth to the cc-mapped parameters in the preset. I’ll test some more, but so far so good! Thanks so much <3

You did a lot of the hard work creating all the controls, glad to add a bit of help to the effort

I guess it’s all relative, plotting the CC’s is straight forward and the heavy lifting as I see it is the sysex implementation that sorts out the bi-directional communication. I am studying the XT’s sysex documentation and the various lines of LUA code in the preset and trying to understand it properly.

Updated my preset with some more parameters like program change and informative naming for each of the wavetables, and verified that all parameters are indeed receiving requested patch dump and updating accordingly.

Thanks again, now I can fully control my XT from the E1 :=)

…well there are still a few, sysex only available, parameters (like the wave envs) that I’d like to map.