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.

I’ve been debating whether to sell one of my XTs and buy an M, partly because of the better UI (in some ways). I forgot about the work that had been done here.

So - going to take a break from the effects units for a bit and dive in and finish off the XT preset using all the hard work that @fragletrollet has done to this point.

I’ll implement the sysex only functions, maybe do some other tweaking, and if I actually have some momentum, might look into the multi-timbral aspect with the Mk II Electra hardware.

The goal is to see if the combination of Electra and the XT hardware makes it a smoother editing/viewing process for patches.

My personal opinion of all editors in general (mine included) is that sometimes so much information is displayed that you still can get lost and the device is just a complex machine and any external hardware or software doesn’t really help.

FWIW, even when I had a Yamaha DX-1 and the Jellinghaus programmer, it was still not fast to edit a DX-7 patch. If the Jellinghaus could have displayed the current value for all their controls, it would have helped but you’d still be looking at a sea of knobs and displays.

But - enough digression - this is the next thing on my plate.

2 Likes

ok, I’m getting sick of messing with this for the moment. Here’s something to play with and hopefully give me feedback on after some use.

Waldorf XT preset

A big ask whether you end up using this preset or not:

If you can send the MIDI string:
0xf0 0x7e 0x7f 0x06 0x01 0xf7 (or f0h 7eh 7fh 06h 01h f7h) to your microWave II/XT/XTk and report the return string, as well as the configuration, that would be a huge help in tailoring the preset to correctly identify and configure the controls for the specific version.

For instance, my XT is a 30 voice expanded model with firmware 2.33 installed.
The MIDI return is:
F0 7E 06 02 3E 0E 00 1B 00 32 2E 33 33 F7
where the 32 2e 33 33 means firmware version 2.33
and the 1B 00 means mainboard 2.0, XT frontboard, Expandable Mainboard, 30 voice expansion.

thanks

Just updated to your new revision. Don’t have much to say yet as I’ve barely started testing it, but so far, it works perfectly! Loads patch name and seems to sync and control everything I’ve tried so far.

When using the midi console in to send sysex:
f0h 7eh 7fh 06h 01h f7h

returns:

F0h 7Eh 06h 02h 3Eh 0Eh 00h 03h 00h 32h 2Eh 33h 33h F7h

Which I believe means I’ve got the old, in-expandable 10 voice motherboard.

Appreciate the sysex feedback. In the end, is love it to be able to transparently support any of those models with the correct param displays, etc. Trying to juggle a lot of different things at the moment, but still working on PCM 80, XT, and DL8000R.

Some comments:

You seem to have a “strategy” in how your presets should be used. Details like starting with tapping the “sync” button, and then the patch parse rubber knob to properly sync everything up.

You have midi selection in different menu’s(?): Globals and Config/Save
I thought the selection on the Globals page was referring to what channel it should send PGM CH on, but here it cuts any response to incoming midi if I change the channel to any but the one I use to control it with. I might be confused here, I just got a keystep pro I’m testing it with, and there is extensive, but functional midi routing involved.

It’s opposite with the midi selection on the Config/Save page, where nothing happens when I change the Midi Channel (while doing no change to the input sequence). I have not monitored the program change, but could these two control groups be reversed somehow? Or at least that the midi selection on the Globals page should be the Midi Channel selection of the XT itself (and therefor probably just like the Config/Save page)

Is saving patches supposed to be done with E1’s middle right button, or in other words let E1 do the patch management?

A sort of short intro page, where the correct use as mentioned in the preset description, would save many clumsy users like me who didn’t remember the whole scheme, and it took me a lot of headscratching to understand the proper, intended workflow. As in:

…
or something. The Sync button should be the first thing you see, not something one stumbles over if actually exploring line two of controls before moving between pages.

A question on the XT: is there no modulation of either LFO amp or vol etc? Nor Modulation Amount as an assignable modulation destination?

Is this where I need to use one of those mysterious Modifiers function I’ve never tried?

Hehe. The XT is so cool. But keep the Volume parameter low (Amplifier section), as it’s so easy to clip it. While that can and does sometimes sound awesome, being very gentle with the Volume (40 area), every other volume inflicting parameter maxed out, and then adding needed post gain with a preamp or plugin makes for a very different synth.

This preset makes me want re-discover this thing.

Thank you

On another note, I would love the real names of the effect selection, and preferably a list a list selection as not to browse so quickly between them all. And why are there 35 selectable one’s, while the manual only counts 10. And they stop working after no 7 I believe, I can’t seem to hear any delay fx 8-10.

Great work as always