Duplex-Like Framework For Progamming Hardware?

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:

http://ctrlr.org
http://ctrlr.googlecode.com/svn/trunk/Controllers/

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!

/b

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
http://www.hotelsinus.com/WaldorfBlofeldDesktop.zip
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?

Automageddon - I’m not 100% sure about what your understanding is, so I’ll just describe it :)

It was supposed to be a visual surface that mimicked the physical control surface - knobs, selector buttons, etc. - of the hardware synth (rather than any synthesis). Initially, it was just to send parameter changes, and the emphasis wasn’t just on control changes (which can be done with the CC device, albeit in a limited way) but also on heavily device-specific sysex stuff. In the case of the Virus, this could be patch saving, hardware input assignation, that sort of thing. I hadn’t implemented any receiving because my Virus B has knackered buttons anyway, though it wouldn’t have been hard to do - you could send a sysex request then store all returned data…etc.

Next step would have been to do the receiving properly, then to do some proper sysex library stuff, then to ensure that it would be easy for someone to edit the Duplex Application for their own synth and adjust the XML sysex params accordingly. I also had high ambitions for patch-name transfer, keeping the Duplex device in sync with patches on the hardware, and so on, but that probably would have been nightmarishly difficult.

I’m talking about this in the past tense for two reasons. Firstly, I got a Virus TI Snow last night and it does all of this perfectly :D Secondly, I tried my code out with my Roland JV-1010 and discovered THIS (quick version: life is too short to set about writing sysex software for Roland devices…jesus christ).

If I was less busy, I’d probably pursue this further just out of interest, but I want to concentrate on some other tools. The other reason is that I suspect danoise and others are coming up with what’s sure to be a much more solidly implemented range of sysex features, either in Duplex or in other tools. I’ll be keeping an eye on what they do… :)

Hope that explains it

KING, Thank you!
im get back to you when i have some settings and parameters DONE.

works fine now!
Two important thing i imagine in Duplex UI and parameters. I can not use parameters like Balance -64->64, the negative number is get me an error.
The Another one is the Group name. Is it possible to view groupnames in the UI? TopLeft or BottomLeft corners? Maybe a parameter in the group line something like this:

You can’t really send negative numbers as MIDI CC, only 7bit signed integers (0-127)

you are right. my bad. :D

i configure some osc in duplex (blofeld editor) , select waldorf blofeld out, but cc changes wont go to the blofeld. (no midi out activity)
is there any config for that?
i use only this:

but cant find any document for the device.lua file. what i need to configure? --==============================================================================

class “WaldorfBlofeld” (MidiDevice)

function WaldorfBlofeld:__init(display_name, message_stream, port_in, port_out)
TRACE(“WaldorfBlofeld:__init”, display_name, message_stream, port_in, port_out)

MidiDevice.__init(self, display_name, message_stream, port_in, port_out)

self.loopback_received_messages = false
self.dump_midi = false
end


– setup a Mixer and Effect application

duplex_configurations:insert {

– configuration properties
name = “Instrument Editor”,
pinned = true,

– device properties
device = {
class_name = “WaldorfBlofeld”,
display_name = “Waldorf Blofeld”,
device_port_in = “Waldorf Blofeld”,
device_port_out = “Waldorf Blofeld”,
control_map = “Controllers/WaldorfBlofeldDesktop/WaldorfBlofeldDesktop.xml”,
thumbnail = “WaldorfBlofeldDesktop.bmp”,
protocol = DEVICE_MIDI_PROTOCOL,
},

thank you