How To Map A Controller In Duplex

Hi there

Probably I am just stupid, but I am apparently not able to create a new Controller in Duplex that maps to the actual device (Zoom R16)

I made a simple ControlMap:

  <name>Zoom R16</name><br>
  <description>Controlmap for Zoom R16</description><br>
          <group name="Buttons" orientation="horizontal"><br>
            <param value="A-7|Ch1" type="button" name="Stop" maximum="127" minimum="0">
            <param value="A#7|Ch1" type="button" name="Play" maximum="127" minimum="0">

I got the A-7 and A#7 notes from the “normal” renoise midi mapping learn mode. I tried with and without channel settings. Harware buttons won’t work :confused: Pressing on the GUI buttons do, though.

On the other hand, the midi dump for those buttons actually read

MidiDevice: ZOOM R16_R24 Audio Interface received MIDI 90 5D 7F  
MidiDevice: ZOOM R16_R24 Audio Interface received MIDI 90 5D 0  
``` and  

MidiDevice: ZOOM R16_R24 Audio Interface received MIDI 90 5E 7F
MidiDevice: ZOOM R16_R24 Audio Interface received MIDI 90 5E 0

so how do I enter these?  
My lua code looks like this  

– Duplex.ZoomR16


Inheritance: ZoomR16 > MidiDevice > Device

A device-specific class



class “ZoomR16” (MidiDevice)

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

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

– setup a monochrome colorspace for the Zoom
self.colorspace = {1,1,1}

– setup Mixer + Matrix + Effect as apps

duplex_configurations:insert {

– configuration properties
name = “Transport”,
pinned = true,

– device properties
device = {
class_name = “ZoomR16”,
display_name = “ZoomR16”,
device_port_in = “ZOOM R16_24 Audio Interface”,
device_port_out = “ZOOM R16_24 Audio Interface”,
control_map = “Controllers/ZoomR16/ZoomR16.xml”,
thumbnail = “ZoomR16.bmp”,

applications = {
Transport = {
mappings = {
stop_playback = {
group_name = “Buttons”,
index = 1,
start_playback = {
group_name = “Buttons”,
index = 2,



The device_port attributes do not work either (what must I enter to get the Zoom selected automatically?). If I select them manually (via [settings)], I can get the midi dump, but nothing else happens.   
So what do I miss here?


Please try “A-5 and A#5” or “A-6 and A#6” too since Renoise’s midi mapping produces the “octave gap”.
I think that [90 5D] means A-5, so maybe it should work.

Tried them as well as A-8 and A#8 to no avail. Any other idea? Any debugging tips?

Hmmm, strange. I think that you aren’t wrong anything. I don’t have any other debugging tips.
Guessing from my experience, A-6 and A#6 should work in this case, I believe. So please check it again.

Also, do you use transport buttons on the R16 in this case?
(just I wonder a little that the note signal is used for such buttons.)
If so, could you try another buttons or faders as well??

Hi. I just copy-pasted your code, and the actual control-map and configuration is working fine. So yeah, something is wrong with how the message is interpreted.
Perhaps you could try to exchange the “button” part with one of the other types of buttons, and see if this helps?

– standard bidirectional button which output a value on press
– & release, but does not control it’s internal state
– (a control-map @type=“button” attribute)

– bidirectional button which toggles the state internally
– this type of control does not support release & hold events
– Examples are buttons on the BCF/BCR controller
– (a control-map @type=“togglebutton” attribute)

– bidirectional button which will output values on press & release
– while controlling it’s state internally. Some examples are
– Automap “momentary” buttons, or TouchOSC pushbuttons
– (a control-map @type=“pushbutton” attribute)

To autostart, Duplex simply look for the device-name as you’ve entered it. So, please ensure that it is exactly the same - try entering this into the console to get a list of MIDI devices:

I don’t know, what happened, but when opening renoise today, everything automagically worked out of the box (using A-6 and A#6). Thank you ;)

Hmm, might be a bug. Sometimes I need to do a restart all tools to make the mapping work. Sometimes I have to deselect and reselct the midi-device…

If you edit something in the Duplex config, naturally you have to “Reload All Tools”.
But you don’t mean so?
It sometimes works, sometimes doesn’t work without any changes?? :huh:

I cannot think that the problem is due to Duplex, since I’ve never experience such behavior so far. I guess that something can be misset or misunderstood…

Yeah, it could be a bit confusing when you’re writing both a device configuration/class and a control-map:
Control-map files are loaded each time a device is instantiated through the Duplex browser, but the configuration (.lua ) files are only refreshed when all tools are reloaded.
I’m guessing that your “it works sometimes” experience is because you were working with the files, and not reloading tools after each edit.

Btw: “Reload all tools” is only available when you’ve started Renoise with the --scripting-dev commandline option.
I wonder if it’s possible to disable and then re-enable a tool via the tool browser to achieve the same without a restart?

Actually no.

I encountered this at two occasions:

I changed my ControlMap and my .lua file, clicked reload all tools → my device did not work. I deselected and reselected my device → everything working.

Maybe case 1 was caused by dis- and reconnecting the device while renoise was runnning (hence I restarted renoise) and the autostart not correctly initializing the duplex configuration. Case 2 could be due to external editing of the ControlMap/.lua source to an errornous state.

Used the latest 2.6.1 final and Duplex 0.94 from the tools download page. I am working under Vista 64Bit.

I will try to reproduce the symptoms and report back, if it happens again.

It’s definately connected to unpluging the device while renoise is running, so no big deal here…

Two other questions:

How do I map a dial sending signed relative midi messages like:
clockwise: received MIDI B0 3C 1
counterclockwise: received MIDI B0 3C 41

and how do I map midi note messages lower than MIDI 90 C 7F (which seems to be C-0):
received MIDI 90 0 7F

received MIDI 90 B 7F

The “relative dial” is not supported in 0.94 (and 0.96) yet.
APC20 has such knob too and I’ve already reported it to danoise.
I hope it will be supported in the next update.

Use “-1” or “-2”. (for example, C–1, C#-1)

it seems that the parameter assign of Zoom-R16 is based on the Mackie Control.
So, currently you cannot set the assign for the panning knobs correctly due to lack of the reletive-knob support.
But I think that you can set faders like this, for example;

<group name="Volume" orientation="horizontal" columns="8"><br>
  <param value="PB|Ch1" type="fader" name="Fader 1" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch2" type="fader" name="Fader 2" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch3" type="fader" name="Fader 3" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch4" type="fader" name="Fader 4" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch5" type="fader" name="Fader 5" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch6" type="fader" name="Fader 6" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch7" type="fader" name="Fader 7" size="4" orientation="vertical" maximum="127" minimum="0">
  <param value="PB|Ch8" type="fader" name="Fader 8" size="4" orientation="vertical" maximum="127" minimum="0">

[For reference]
Mackie Control MIDI Map B)

Hmm, could have tried that myself ;) Thanks!

Yeah its a Mackie emulation and I got everything working but the dial.