Assign midi event to "move cursor down"...?

Hello, dumb question again -)

I’d like to assign a button on my midi keyboard to move the cursor down (with edit step value) in the pattern editor …is this possible to do?

You’ll probably have to make your own editstep script that allows for midi binding.

Here is an editstep snippet, and if you know some basics of the LUA API, you should be able to fix it: Snippet: Edit Step

Thanks for the info! I successfully created keybindings (for testing) and midi mappings, but i don’t know how to assign them in Renoise :3

In the Song -> Midi mappings menu, there’s 2 problems:

  1. Assigned midi commands are specific to the song, and not global as i would like them to be, and
  2. My function triggers twice for each button press, once when i press the button down, and a second time when i release it.

I feel like a retard right now :3 :D

I haven’t dealt with midi mappings IRL yet :)

This might help? Make the cursor midi mappable!

Hm, if this is how you want it to work, it might be worth going through Duplex instead.

I could quickly create a “pattern navigation” type application for you. Starting with cursor up/down (editstep), and expanding it later on…

Quick question: what keyboard do you own? I am guessing the button you mention is sending a CC message, or…?

Thanks danoise :D !! Yeah, it’s a M-Audio Oxygen 88. My first preference would be to use the prev/next track buttons (CC #110 and #111 value 127 on press down) since the transport buttons are already doing useful stuff in Renoise (except the loop button afaics) and the rest of the push buttons i’m already using to switch between presets & such.

The midi keyboard setup is at my left, and it would just be really quicker to program longer notes without having to turn away from the (midi) keyboard and back to the computer at each note when i’m recording stuff with my right hand, to press the down arrow, or the up arrow when i make a mistake. -)

OK, I’ve mostly written the “PatternCursor” application now, but planning to test things a little more… It has grown to become a little more complex than I anticipated, since I want to support “edit wrap mode” (crossing over pattern boundaries just like you can in Renoise). This is optional, of course, and you will be able to explicitly set it to wrap inside the pattern too, if that’s what you want.

One question: to make a control-map for the Oxygen-88, would it be possible for you to list all the non-keyboard controls that actually output MIDI messages (buttons, sliders) ?
I tried downloading and taking a look at their manual, but it doesn’t seem to come with an actual MIDI implementation chart. I guess the reason is that these values can be modified, but nevertheless it would be nice to ship Duplex with some useful “factory defaults”

Sure, here’s what pianoteq (standalone application) shows me with a pretty much default setup of the oxygen 88:

track < cc#110 button down 127, button up 0   
track > cc#111 button down 127, button up 0  
- program change -- (decremental)  
+ program change ++ (incremental)  
sliders, left to right:  
cc# 74, 71, 91, 93, 73, 72, 5, 84, 7  
buttons under sliders:  
program change 1 to 9  
cc# (top) 75, 76, 92, 95, (bottom) 10, 77, 78, 79  
transport buttons:  
loop mmc pause  
<< mmc rewind  
>> mmc forward  
stop mmc stop  
> mmc play  
rec mmc record  

Just wanted to add, the oxygen 88 has 10 “presets”, the above is preset #1, like i said with a pretty default setup. I believe the oxygen 61 and 49 have the exact same midi setup. The oxygen 25 (the really really small one) has only the last slider, which does CC#7 (volume) by default.

Also, in renoise the track < and > buttons (CC# 110 and 111) send program change messages to the selected instrument.

/* edit */

Seems like the CC#110 and 111 are simply passed to the instrument, which in the case of pianoteq VST, causes presets (programs) to be selected.

Hi delt,

There is a preview release of the Oxygen configuration located here

It would be great if you could take it for a spin, and come back with any feedback you might have (it’s important to turn off the standard Renoise MIDI port and select the Oxygen MIDI port through Duplex instead).

Edit: oh, and I forgot to add - you want to enable “pass unhandled MIDI messages to Renoise” (Duplex browser > Settings, when Oxygen88 configuration is selected). Otherwise, the MIDI keyboard, MMC and program change events will not be forwarded to Renoise.

If you experience that the buttons do not behave as expected, you can try opening the Oxygen control-map (tool browser > rightclick Duplex > show in Explorer/Finder > Browse to Duplex/Controllers/Oxygen88/Controlmaps) and find this text:

<group name="PrevNext"><br>
 <param value="CC#110" type="button" maximum="127" minimum="0">
 <param value="CC#111" type="button" maximum="127" minimum="0">

There are three possible button types that Duplex know about:

"button" -- standard bidirectional button which output a value on press & release, but does not control it's internal state  
"togglebutton" -- 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)  
"pushbutton" -- bidirectional button which will output values on press & release while controlling it's state internally. Some examples are Automap "momentary" buttons, or TouchOSC pushbuttons  

I don’t know exactly how the buttons behave on the Oxygen. Some controllers only output when the button is pressed, while others output when pressed and released - if it’s the latter, you will benefit from this as Duplex will be able to detect a “key was held for a moment” style event.
Simply experiment a little with different button types? And note that you will need to reload the tool each time you modify the control-map. Can be done when you have activated the scripting console (, or by choosing Disable/Enable in the Renoise tool browser…

Downloaded, tried to install, and on renoise startup i get the following error:

'/home/user/.renoise/V3.0.0/Scripts/Tools/com.renoise.Duplex.xrnx/' failed to load.  
Please remove this tool or contact the author (danoise []) for assistance...  
.///Duplex/Controllers/APC40/APC40.lua:36: variable 'APC20' is not declared  
stack traceback:  
 [C]: in function '_error'  
 [string "local mt = getmetatable(_G)..."]:29: in function   
 .///Duplex/Controllers/APC40/APC40.lua:36: in main chunk  
 [C]: in function 'require'  
 ./Duplex.lua:60: in main chunk  
 [C]: in function 'require'  
 main.lua:7: in main chunk