Duplex Beta Versions

Though I don’t understand a technical thing well, the independent application “PatternSequence” is more better idea indeed. It’s intelligible. B)

(Btw, If it’s troublesome to implement, I’m OK even if it cannot “wrap” since simply I can make temporal 1x16 group on the Duplex GUI. The Duplex GUI may not necessarily be the same as the hardware interface. I am satisfied if actual operation is possible. :) )

Et voilà, the TrackSelector has been born!

It integrates with the other Duplex apps (Matrix, Mixer and StepSequencer) and offer direct control of the following:

  • Select the next/previous track (via buttons)
  • Select the next/previous track-page (via buttons)
  • Select/set a specific track (via buttons or dial/fader)
  • Select (first) normal track (via button)
  • Select master track (via button)
  • Select (first) send track (via button)

Note: if you’re using a dial or fader to select tracks, the next/previous controls are not really useful and can be left out. Only the mapping to select/set a specific track is required.

The TrackSelector has one option, “track_increment”. This will determine the “page size” when flipping through tracks (again, only really relevant if you’re selecting tracks by using buttons). The default is to automatically detect the number of buttons - so if you want to run multiple apps and have their tracks nicely aligned, “track_increment” should be set to the same value as the other applications.

Installation procedure - until a proper release arrives…

  1. Copy TrackSelector.lua to the Duplex/Applications folder
  2. Edit the desired device configuration

For details on how to edit configurations etc., check out the Duplex manual on the tools site.
For starters, here’s an example device configuration for the Launchpad (Duplex 0.96 is required):

-- setup "TrackSelector + Mixer"   
duplex_configurations:insert {  
 -- configuration properties  
 name = "TrackSelector",  
 pinned = true,  
 -- device properties  
 device = {  
 class_name = "Launchpad",  
 display_name = "Launchpad",  
 device_port_in = "Launchpad",  
 device_port_out = "Launchpad",  
 control_map = "Controllers/Launchpad/Launchpad-Recorder.xml",  
 thumbnail = "Launchpad.bmp",  
 applications = {  
 TrackSelector = {  
 mappings = {  
 prev_next_track = {  
 group_name = "Controls",  
 index = 1,  
 prev_next_page = {  
 group_name = "Controls",  
 index = 3,  
 select_first = {  
 group_name = "Controls",  
 index = 5,  
 select_master = {  
 group_name = "Controls",  
 index = 6,  
 select_sends = {  
 group_name = "Controls",  
 index = 7,  
 select_track = {  
 group_name = "Row2",  
 index = 1,  
 options = {   
 track_increment = 1,  
 Mixer = {  
 mappings = {  
 levels = {  
 group_name = "Grid",  
 options = {  
 follow_track = 1,  
 track_increment = 1,  

Ah OK, you would be fooling Duplex into thinking that the buttons are actually next to each other. Yeah, that would definitely work

Thanks very much for making the TrackSelector app!!
Unexpectedly, it has some additional useful controls (especially I like “select_sends” :) ), so I’m re-considering about a new layout.

But I experienced some errors, especially, when I tried to use a fader as track-selector. It seems something wrong.
This is a simple example. Could you see what’s wrong??

1696 R-control-xx.zip

Also please try this APC40 mapping too.

If all the “Track increment” options of Matrix, Mixer and TrackSelector are “Automatic”,
TrackSelector works wonderfully really.

But when all the “Track increment” options of Matrix, Mixer and TrackSelector are “2”,
please try to use TrackSelector and page-Left/Right buttons several times.
TrackSelector will begin to jump to wrong track (the gap between TrackSelector and Matrix/Mixer arises. TrackSelector seems to be confused).

1698 APC40xx.zip

1697 apc40.png

Thanks a lot - this should be fixed now. I somehow expected the “track page” to be present when using a dial, this is what caused it.

As for the other issue, I think I understand. You seem to have problems with how the jump by page controls work, but the result isn’t strictly speaking a wrong result, it merely is a confusing one?

Here’s an example: each time you jump to a location which is out of bounds, say jumping from track 8 to track 12 in a 10-track song, the resulting position is adjusted to the closest possible (which in this case would be 10). Jumping back (still with a track increment of 4), we would end up in track 6.

The only way I see this solved cleanly is not to update the selected track when jumping through pages?
[Edit] Thinking more about it, the current way is probably the most intuitive. Problem is, when you are jumping through pages without updating the active track, the other apps will not align themselves automatically. So you end up with a TrackSelector which show a different set of tracks - that is, until you select a track. This would probably be even more confusing! But I could make an extra check, so that a scenario like the one above (jumping back from track 10) would go to track 8 instead of track 6, keeping the pages more consistent. If only the topmost tracks are affected, this would seem like a good compromise.

I’ve attached a version of TrackSelector with this new behaviour. Check out if it’s an improvement?

Thanks very much. Now I can use fader as Track-Selector. Very impressive!!

About the APC issue, now I can understand the cause itself, but still I feel it’s something strange behaviour honestly.
But there is no better method, isn’t there?? If so, I think it’s compromise-able too.
(What a puzzled problem it is!! :wacko: )

No, not unless Duplex was able to make applications exchange information. And this really could become a can of worms…currently, the core Duplex apps are communicating “through” Renoise, which is much more clean and easy to understand. But this is also the reason that we can’t select a page in the TrackSelector and have e.g. the Mixer update itself, because Renoise has no such concept as “track pages” which the Mixer could receive notifications from. So we basically need to set the active track first, in order to have the Mixer align itself properly.

I see. I can understand and thanks for your effort. :)

Btw, just an idea though;

I really like the fader-assign in TrackSelector. It’s very intuitive that the cursor moves right/left according to the movement of the fader.
So maybe, if you consider to make PatternSequence app in the future, I think that adding such fader(or knob) assign in PatternSequence as well is cool. Imagine that the pattern cursor moves up/down according to the movement of the fader.

If such fader assign and the mute button for Matrix slot are there, we can cover whole Matrix by tweaking only 2 faders and 1 button. B)

Hey danoise,

Today I try to make new mappings for the APC20, and I have 1 question.
APC20 has just only 1 knob called “CUE LEVEL”, but this knob sends a bit strange midi signals.
If I trun the knob to the left, it sends many “7F”, and if I turn it to the right, it sends many “1”.[if the speed which turns the knob is quick, other values will be sent.]
Can’t Duplex support such a strange knob?? (I want to assign TrackSelector there, if possible)

1709 apc20-knob.png

Ah, so it happens to be an endless rotary dial without any visual feedback (LED lights)? Then it’s a basic relative control, different from the absolute controls that we’ve dealt with so far.
There are different implementations of relative controls (various between manufacturer, or even individual models) , so we’ll definitely have to support more than just this one.

PS: Now where was that APC tech-guide that you linked to a while back? It contained a lot of valuable information, like the sysex codes and the expected output from controls like this one.

Yes, it is.

This one?? :huh:

Btw, now I confirmed that the knob works as “Relavive two’s comp” in the Renoise’s MIDI mapping option.

Thanks, that was useful. Looking at the Renoise docs, these are the relative modes that are supported natively:

  • Relative signed bit: Increase at [065 - 127], decrease at [001 - 063].
  • Relative signed bit 2: Increase at [001 - 063], decrease at [065 - 127].
  • Relative bin offset: Increase at [065 - 127], decrease at [063 - 000].
  • Relative two’s comp: Increase at [001 - 64], decrease at [127 - 065].

[font=verdana, sans-serif]
The APC docs specify the cue control in the following way:

Relative two’s comp it is then! But I’m not sure if the minor discrepancy between the two definitions (63 vs. 64) is simply a typo in one of the specifications?

Hmm, I don’t know. Maybe taktik knows well? :huh:
But I think that the center value itself is not so important since I’ve never seen such “high values” (ie 63 or 64) actually.
All the values I can confirm are about [7F - 60 (turn left)] and [20 - 1 (turn right)], even if I try to tweak the knob very very fast :blink: . In usual use, 7F or 1 mostly. It’s impossible to reach such highest values.

Btw, I am anxious about other knobs of APC40, since if the knobs are also such kind of special type, they shouldn’t work in the current Duplex configuration which I’ve made. :(

Don’t worry. It’s only the cue control that is relative, AFAIK.
The only thing that’s really missing is that LED dials on the APC40 have an option where you can specify if the LEDs are supposed to light up “centered” (good for displaying something like panning).

Personally I think that it’s not so big missing, of course it’s nice to have though. :)

Anyway, I’ve temporary made some new configurations for APC20, 40, and MPD26.
Though APCs have to be updated when the support for CUE LEVEL knob is coming.

Try the APC40’s “Relative Scroll” config with appropriate options (see the comment of the config). It’s very intuitive thanks to the TrackSelector on the CUE LEVEL knob. B)

1711 new-configs.zip

Oooops, I found one problem about the new config above. Got an error message.

  • load the “DemoSong - BeatSlaughter vs Tenda - Psydrums”
  • load the new configuraton “APC40 Matrix (Relative Scroll)…”
  • turn the CUE LEVEL knob to the right-end and turn it to the left

then this error message appears:

.\Duplex/Applications/Recorder.lua:1214: attempt to index field '?' (a nil value)  
stack traceback:  
 .\Duplex/Applications/Recorder.lua:1214: in function '_attempt_track_switch'  
 .\Duplex/Applications/Recorder.lua:870: in function   
  [C]: ?<br>
  [C]: in function '__newindex'<br>
  [string "do..."]:22: in function <br>
  .\Duplex/Applications/TrackSelector.lua:403: in function 'on_change'<br>
  .\Duplex/UISlider.lua:465: in function '_invoke_handler'<br>
  .\Duplex/UISlider.lua:223: in function 'set_value'<br>
  .\Duplex/UISlider.lua:197: in function 'do_change'<br>
  .\Duplex/UISlider.lua:398: in function 'handler'<br>
  .\Duplex/MessageStream.lua:182: in function 'input_message'<br>
  .\Duplex/Display.lua:464: in function 'generate_message'<br>
  .\Duplex/Display.lua:571: in function <.><br>```

After that, this dialog appears too:<br>

```<br>'C:\Users\satobox\AppData\Roaming\Renoise\V2.6.1\Scripts\Tools\com.renoise.Duplex.xrnx\main.lua' may be busy or may have stopped responding.<br>
You can stop the script now, in order to avoid freezing the whole program or continue waiting for it to complete.<br>
Terminate Script?<br>
[Yes] [No]<br>```

It seems that this error occurs only in the "DemoSong - BeatSlaughter vs Tenda - Psydrums" so far.<br>
Maybe there are too many signals to process in the new APC40 config??</.></.>

Nah, it’s probably my fault
The Recorder application is currently limited to a fixed number of tracks, but it shouldn’t throw errors…so thanks for pointing that out!

One more request, as usual. :rolleyes:

I want Duplex to support
Global Mappings >> Track DSPs >> Selected FX (Mixer Subset)
in the Effect app.
It seems that already there is the commented-out TODO option code in the Effect app, so I hope it will come true.

Current “ALL_PARAMETERS” method in Duplex is not so good.
I want to use “MIXER_PARAMETERS” really.

sorry for a noob question, is there a manual how to properly setup Novation Remote Zero SL?

I’m a fan of self-documenting software. Have you tried installed the Duplex tool?
Try selecting the Remote SL configuration - everything is there. Hover over a control to see what it’s doing.
Also, look at the bottom of the control surface and you’ll see these instructions:

This is referring to the .automap file that you can import into the Automap server to get the Remote to send the right commands.

Edit: I’m talking about the MKII here, but perhaps the first model is different? In that case, it’s a question of making a new control-map.