Duplex-Like Framework For Progamming Hardware?

Are there any plans for some sort of framework like Duplex for programming external synths? So to make tweaking synths that have many submenus easier, storing presets within Renoise and loading sysex… that sort of stuff. I was trying to string some Lua together to get it to send and receive sysex data, but I’m really not that good, and don’t want to spend ages doing something that might be done right at some point in the future…

(oh probably move this to Q&A)

If Duplex could offer a configuration tool as part of its user-orientated front end, loads of people would create and share these templates. This could be a beautiful solution for an enormous range of SYSEX/MIDI/CV/GATE/NRPN issues that no sequencer currently supports.

When we get to the point where I can do SYSEX sync between Renoise and my Supernova II so that a renamed patch on the Supernova can be selected by name in Renoise…shit, I’ll just be sperming up the walls.

i thought about reproducing nord modular g2 control surface in that way, to program and control my g2 engine
so, if we’ll have such framework, that will be really great

Well, while I agree that a front end on the patch creation would be cool, you can still go into the code right now and make your own templates for synths etc, that are currently not included.

Cool, well I’ll probably try and throw something up too. But it won’t be pretty.

btw I don’t think Duplex supports sysex right now, or does it?

No, but we need to do it eventually. Some devices need a sysex dump before they can be controlled bi-directionally. Just a matter of getting there…

Let’s gather information on this! Edit: Duplex list of controllers

padKONTROL is such a device, I used to have one and once you put it in sysex mode you can program (in lua) every knob and button in anyway you like.

btw a nice source of information on a lot of synths can be found here, these are all going to be standalone/vst:


danoise - I’ve been playing around with MIDI ports and whatnot while learning a little Lua and I’ve discovered it’s fairly easy to send 3-byte sysex messages to my hardware (a Virus B, in this case).

Looking through the Duplex code, it seems like the value parsing restricts messages to either note or CC number/val. Is this something that could be tweaked in the short term, so that we can fire our sysex parameter/etc messages out alongside note and CC when making custom Duplex templates for hardware synths? I reckon I could do my Virus one in about an hour if I was able to put the sysex values into the XML :)

I haven’t got my head around the Duplex code yet, so I can’t suggest a snippet, but I feel it might just be a case of coming up with an appropriate value format for the XML, adding a parse condition (to the extant if/else for note and CC) and then pushing it through the MIDI out as normal. Then hardcore sysex stuff can come later, either within Duplex or in dedicated tools (I have a few of my own I plan to make, when I’ve got more skillz).

What do you reckon?

danoise - I’ve made more progress overnight. Noticed a couple of weird things, and have lots to ask you too.

So far, I’ve hacked a ‘sysex’ control type into Duplex, alongside the note and CC types. I can now adjust patch parameters on my Virus B using a custom Duplex device. The XML has lines like this:

<param value="0xf0,0x00,0x20,0x33,0x01,16,112,0,59" type="dial" name="Dial #1" maximum="127" minimum="0">  

where hex values should remain unchanged by the user (they’re specific to the hardware device, but universal to all instances of it) and numerical values represent sysex ‘pages’, device IDs, parameter numbers, all that device-specific stuff.

So far, so good. Ish. I’m having trouble figuring out the Applications, and I wonder if my need requires a new, custom Application. I started out modifying the Ohm64 template but soon realised that the knobs which were successfully sending sysex to my synth were also controlling Renoise params - I forgot that Effects, Mixer, Transport are all designed to do just that. So I guess I’m trying to do something that’s a little ass-backwards for Duplex, but I’m doing it so I can take advantage of Duplex’s great UI and templating system. So do you think I need a new application that just does outbound control stuff (I haven’t looked at receiving sysex yet)?

I have used the test sliders/spinners/etc, but I’m noticing weird stuff. First off, does ‘spinner’ refer to page-flipping? I’ve only come to that conclusion after lots of head-scratching and wondering if it was another name for knob. Anyway, a weirdness is that, when I’ve got a 4-column group of EncodersEffect knobs, only the first three work. I increase it to 5 and add a new param line (as seen above), and still only the first three work. I can swap the lines and the values, everything’s fine - but only the first three parsed parameters in that group will work! Any ideas what that might be about?

Also having weird experiences with buttons, where I have single-value option selections (like to change LFO shape on the synth) - a block of, say, four buttons, sine/tri/saw/square, each has max and min of 0-0/1-1/2-2/3-3. Clicking one will change the colour of another, and I don’t really know what’s going on with them :)

Anyway, please let me know what you think of this whole approach - maybe it’s totally cack-handed; maybe it’ll be superseded by updates you have in the pipeline (which’ll be a lot less hacky, I’m sure!). Cheers :)

awesome, I’ll do a DSI Evolver interface for it when it’s done.

Hey Syphus, props for your work! I would definitely like to see your modifications?

Yeah, no wonder you’re wondering. But you are assuming correctly; the ‘UISpinner’ is for page flipping, and occupies either two buttons (which light up if the internal value can be increased or decreased), or a slider/dial (which will, for obvious reasons, behave like a slider or dial). Sorry if the documentation for the UIComponents are less than ideal, time didn’t allow me to do a proper writeup on how to use those things.
Also, if you are experiencing trouble assigning those controls it might be because of the issue described here? (of course, this needs to be fixed ASAP)

You want to have buttons acting like ‘radio buttons’ (one is clicked, and the others are turned off, allowing only a single active choice at a time)?
If so, the quick answer is to use a UISlider instead, with a ‘ceiling’ of four. But are you creating a new application for this, or simply changing the mappings (as specified by the device configuration) ?

danoise, cheers - I’ll post some of my changes later this evening :)

I started out by changing mappings, but after some struggles, I’ve decided that I’ll probably have to create a new application… I guess the extant apps are geared towards either mostly incoming or mostly bi-directional control, and that’s making my stuff a little more confusing. Short term, I want an application that’s solely outgoing, though I suppose long term it should be bi-directional so I can receive sysex. You can see why, while I’m occasionally a capable dirtyhacker, I’m no software designer :P

danoise, not sure about the best way to show you my changes, so I’ve zipped my working copy of Duplex so you can do a diff. To be honest, I’ve probably forgotten to comment some/most of the smaller changes I made…

You’ll notice that it doesn’t do anything at the moment, because I’ve just begun writing a fresh Application (SysexController) using Application.lua as a template. No real progress there at all, as I haven’t had time to look at it again.

Nevertheless, the parameter string I posted earlier can be dropped into any existing controller’s XML to do the required business. Things to be looked at include bi-directional sysex (as mentioned before; maybe not a big challenge), controlling whether Duplex sends a sysex command on startup (this sometimes gives hardware synths quite a surprise!), and…some other things that I can’t remember right now :D

Hope my modifications are of some use, even if it’s in the ‘how not to do it’ sense ;)

this is kool,

btw how can i add my own device,
i duplicate one controller and rename everything, folder, images, inside lua and xml
but the new device not in the list!
can you help me about this issue, coz i want to build a Waldorf Blofeld complete controller.
thank you

hotelsinus - you may or may not be interested in my experiences doing similar stuff: https://forum.renoise.com/t/duplex-like-framework-for-progamming-hardware/29258

Obviously, if you only need MIDI CCs, then building a Blofeld controller should be fairly straightforward (not sure why it isn’t appearing in your list, though). If you need sysex, though, I’ve hacked in some stuff that parses hex from the XML, adds the value from the controller and sends the sysex message through. I started doing this for my Virus B; I also tried one for my Roland JV-1010 last night, but that thing’s SO complicated to figure out the sysex for that I’ve shelved it for now…

Hope that’s of some help, anyway. Look forward to hearing of your progress!


Perhaps you could explain more thoroughly what you want to achieve? I can see that the Blofeld itself has only a few controls, so I’m guessing you want to control it using some alternative interface. But how have you imagined this to work - do you want to build some ‘fantasy controller’ that expose the Blofeld parameters on-screen (via the ‘virtual UI’ in Duplex), or do you want to use some other physical controller (Ohm64, Remote, etc.) to pull this off?

Also, how do you control the Blofeld - do you need to use sysex commands, or is it possible to rely on standard CC messages?

Blofeld can be edited via midi all of the paraeters.

  • Blofeld is controllable with midi CC’s
  • I want to build a virtual ui, instrument editor. (in duplex)
  • Don’t want physical controllers (at the moment)
  • Blofeld can send the cc parameters vice-versa.

here’s the midi control devices, some controls. But too many CC’s! So i need Duplex UI. It is powerfull
[Blofeld_MIDI-Control Device.zip](http://www.hotelsinus.com/HSSD_WaldorfBlofeld_MIDI-Control Device.zip)

the copied Duplex BlofeldEditor
But it wont appear in the Tools/Duplex section. (parameters and ui settings is just a copy)
THank you

Ah, you need the [device.lua] file to be identical to the name of the device folder. So, simply rename the folder from “WaldorfBlofeldDesktop” to “WaldorfBlofeld” and it should work.
If you still want you device to be identified as “WaldorfBlofeldDesktop”, simply change the display_name in the device configuration. This way, you can have multiple names for one device (including different port settings etc).

I’m not 100% sure about what you’re doing here, but if I understand correctly you’re creating a tool that will more or less mimick the hardware synth, right?
If so, will it also send and receive knobs and parameters changes in real-time?
Would it work like a sort-of library software?