Duplex Beta Versions

I just looked at what version of Duplex I have by looking at an installed file. I see
–[[----------------------------------------------------------------------------
– Duplex API Reference
----------------------------------------------------------------------------]]–

Version 0.8

I’m using it on a Mac running 10.4.11 running Automap 3.4 with a Remote Zero SL MKI & using Renoise 2.8.1.
this is working ok btw so I am reluctant to put in a higher version of Duplex.

Instead of overwriting an Automap patch on the Remote SL I have used the User Client section on the Remote.
I basically programmed in the controllers and routed the client using (settings Midi in and Midi out port to Automap)
I’m never sure if this is needed but my impression is that in this configuration it might be.

I have the Automap template which comes with duplex but I’m not sure where it should be loaded on the SL.
e.g. if I should overwrite a particular Automap patch number @ patch number 38, 39 or 40.

I notice in the later version that in the (Midi + Effects + Transport) the Mute buttons are slated as replaced by track selection.
that would be sort of a shame, but I can see the logic in this as one of it’s focuses is Effects navigation.
also, in this particular mode the lower analog pots don’t seem to be being used for anything to speak of.
I would have thought panning would have been the natural choice. depending on pre or post focus.

in any case, I’m getting some good use out of it with the MKI Remote so I thought I’d let you know and to say thanks. :)

I do have one question though, I have an ELO touch screen and I’m wondering if all these Duplex Tools can basically
work as effective touch screen interface extensions to Renoise with no immediate issues to be concerned about. ?

Thanks again.

No guarantees that a newer version will not mess up things, but it’s mostly a risk if you have customized your setup.
But you can always take a backup first, by opening the Tool Browser, rightclick and then “Reveal in Finder” and move the whole folder somewhere else.
Then, if something screws up, you simply replace the new version with the one you backed up :slight_smile:

The control-map is just a simple way to describe the hardware in terms that Duplex can understand.
As long as the Duplex control-map is referring to the same CC messages as the Remote is actually transmitting, you should be fine.

Personally, I have left some controls unassigned so I can use good old-fashioned MIDI mapping in Renoise as well
(this is achieved by enabling the “pass unhandled MIDI messages” checkbox in the settings dialog)

Yes, I would think so - excerpt that the Renoise UI isn’t multi-touch as such, a touch screen + virtual controllers should be usable enough.

I think I’ve fixed the issue, thanks for reporting!

Here’s the corrected UISlider - if you want to try it out just replace that file:
https://xrnx.googlecode.com/svn-history/r1162/trunk/Tools/com.renoise.Duplex.xrnx/Duplex/UISlider.lua

Now APC20’s CUE LEVEL knob works fine, Thanks!! :)

But still Mackie Control panning knob has a little problem.
This is a bit hard to explain, so please see this mp4 file.

http://reg.s63.xrea.com/gomi/relative_knob_issue.mp4

The knob works fine unless the value has reached to zero (left).
If the value reach to zero, it will be confined in low value.
Then if it reachs to max, the knob works fine again.

This is the MIDI data: from zero to max value (turning Left to right)

Click to view contents

MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 41
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 2
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 3
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 4
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 5
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 6
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 7
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 8
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 9
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 A
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 B
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 C
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 D
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 E
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 10
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 2
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 12
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 1
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 13
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 52
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 CTRL send MIDI B0 10 7F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F
MidiDevice: nanoKONTROL2 1 SLIDER/KNOB received MIDI B0 10 3F

[Additional info]

The strange behaviour doesn’t happen when I move the knob quickly.
It only happens when I move the knob slowly.
It seems that the omission of midi data has influenced.

It’s been a busy couple of days in Duplex-land, so a new release is in order.
Apart from the changes mentioned here (latest SVN update), the download contains a fix for some relative encoders and GridPie

  
* FIXME Repeater.lua, XYPad.lua - now updates on idle loop only when needed  
* New mappings: SwitchConfiguration.lua - map buttons to configuration 1-16  
* Browser.lua - support config switching by index  
* Config: APC20/40 - now with BPM control  
* Control-map: APC20/40 - Relative encoder support  
* FIXME - monome64 controlmap - invalid parameters fixed  
  

Here’s the massive 27th beta of Duplex 0.98!!

Of special note is the completely rewritten Navigator application and the fancy new iPad/TouchOSC configuration :slight_smile:

IMPORTANT: If you have written any Duplex applications yourself, note that UIComponents are now instantiated slightly different:
Instead of writing UIComponent(self.display), you simply write UIComponent(self)

Download the release here

  
  
Navigator  
* Completely rewritten, more solid feeling, and compatible with previous version :-)  
* Match the pattern selection with the looped range (whole pattern / track / column in track)  
* Select (restrict) to a particular set of coefficients: fours, threes or all possible ranges  
* Loop "carry-over" is now made optional  
* New mappings: “prev_block”,”next_block”  
  
New device configuration: iPad (via TouchOSC)  
* Makes use of several new features : UILabel to spell out parameter names & values, etc.   
  
New UIComponent: UILabel  
* Realtime display of dynamic text (for OSC devices that support this)   
  
New control-map attribute, relevant for parameters with a @type=’xypad’  
* swap_axes=“true” (replace X with Y and vice versa)  
  
Duplex core   
* Optimized message-stream cache (obtain controls faster, might reduce CPU usage)  
  
Transport  
* New mapping: “songpos_display” (UILabel)  
* New mapping: “bpm_display” (UILabel)  
* New mappings: “bpm_increase”,”bpm_decrease”  
  
Mixer  
* New mappings: “prev_page”, “next_page” (replace UISpinner @page)  
* options.track_offset has been removed  
  
Effect  
* New mapping: “device_name” (UILabel)  
* New mappings: “param_names”,”param_values” (UILabels for parameters)  
* New mappings: “param_next”,”param_next” (UIButtons, replaces UISpinner)  
 Update & test configurations that previously used the UISpinner:  
 - APC40:GridPieEffectNavigatorTransportMixer.lua  
 - APC40:MatrixEffectNavigatorTransportMixer.lua  
 - APC40:XYPadEffectNavigatorTransportMixer.lua  
 - BCF2000_Effect.lua  
 - BCR2000_MixerEffect.lua  
 - BCR2000_RecorderEffect.lua  
 - Kontrol49:Effect.lua  
 - Launchpad_Effect.lua  
 - microKONTROL:Effect.lua  
 - MPD26:MixerMatrixEffectsTransport.lua  
 - Nocturn_Effect.lua  
 - Ohm64:MixerMatrixEffects.lua  
 - Ohm64:MixerMatrixEffectsSwitch.lua  
 - Ohm64:SequencerNavigatorMixerEffects.lua  
 - Ohm64:SequencerNavigatorMixerEffectsSwitch.lua  
 - Remote SLMKII:MixerEffectsTransport.lua  
  
Matrix  
* Mappings sequence/track (UISpinner) have been removed  
* Changed default retrigger method to “play/continue”  
* New mappings: next_track_page/prev_track_page (UIButtons)  
* New mappings: “prev_seq_page/next_seq_page” (UIButtons)  
 Update & test configurations that previously used the UISpinner:  
 - APC20: MatrixNavigatorTransportMixer.lua  
 - APC40: MatrixEffectNavigatorTransportMixer.lua  
 - Launchpad_Matrix.lua  
 - Launchpad_MixerMatrix.lua  
 - m128_MatrixEffect.lua  
 - m128_Performance.lua  
 - m64_Matrix.lua  
 - ohm64: MixerMatrixEffects.lua  
 - ohm64: MixerMatrixEffectsSwitch.lua  
 - TouchOSC: MixerRecorderMatrix.lua  
  
Hydra  
* New mapping: value_string (UILabel)  
* FIXME Attach to newly inserted device (update controller)  
  

I just realised there has never been a final release (non-Beta) of Duplex for Renoise 2.8 and people are now starting to strongly anticipate the next release of Renoise (whether prematurely or not.) I would be kinda funny if the new Renoise came out before Duplex made it to the Tools page for 2.8… Even though I don’t think there is anybody claiming that the Beta versions are not stable or usable enough as it is ;)

Yea, currently, it’s not even listed among the 2.8 tools, and it is of course a shame if someone is looking for something like this.
But, the reported bugs are few and far between by now, so I anticipate just one or two more releases (which would bring it to b29, btw :-).

You can still link to the Beta forum topic on the tools page you know?
But having a Renoise 2.8 valid version would make it swell.
Also, don’t forget people may have added own templates or adjusted existing ones before adding the Duplex final to the tools page (supplementary user configs might also get lost here, unless you wisely decided to save user content two parent folders higher).

Woohoo!!

Aaargh!!

…Nah, on second thought I just uploaded the most recent version. Three cheers for discoverability !!
Also, Google taught us that it’s OK to use software in beta

.

That’s why i don’t use their stuff :P

@vV: Interesting thought - to avoid any of google’s stuff would be … challenging :slight_smile:

I think the relevant question is, do I need velocity sensitive pads and/or LED backlit buttons?

If you want to explore live step sequencing, or play nibbles at the concert then backlit buttons are needed. Oh, and they look sort of cool.
But, I somehow think you would want velocity sensitive pads too, which would rule out the launchpad (and monome’s, for that matter).

This is why the Livid Base is such good news, it has both :slight_smile:

Hi!
In 0.98b27 caching components in MessageStream deny to use more than one same application in configuration.

MessageStream.lua

  
self.message_cache[evt_type][msg.param.value] = ui_component_ref  
  

I’ve figure out it when dig code after unable to use Keyboard application more than once (e.g. MIDI-keyboard TripleStack)

Comment this line out solves the issue but probably will emit performance issues.

I have Evolution MK-449C midi keyboard
And it have keypad that on factory defaults outputs program chanage midi event
But duplex doesn’t support this keys.
It would be cool if support of this keys will appear in next versions of Duplex

Workaround, patch Duplex (for v.0.98b27):

  
diff -r bd0f57f4d50d -r b4dc87fc6ba5 Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/ControlMap.lua  
--- a/Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/ControlMap.lua Tue Mar 19 11:58:17 2013 +0400  
+++ b/Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/ControlMap.lua Tue Mar 19 18:46:45 2013 +0400  
@@ -630,6 +630,10 @@  
 elseif string.sub(str,1,2)=="PB" then  
 return MIDI_PITCH_BEND_MESSAGE  
  
+ -- program change  
+ elseif string.sub(str,1,3)=="Prg" then  
+ return MIDI_PROGRAM_CHANGE_MESSAGE  
+  
 -- channel pressure  
 elseif string.sub(str,1,2)=="CP" then  
 return MIDI_CHANNEL_PRESSURE  
diff -r bd0f57f4d50d -r b4dc87fc6ba5 Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/Globals.lua  
--- a/Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/Globals.lua Tue Mar 19 11:58:17 2013 +0400  
+++ b/Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/Globals.lua Tue Mar 19 18:46:45 2013 +0400  
@@ -23,6 +23,7 @@  
 MIDI_CHANNEL_PRESSURE = 5  
 MIDI_KEY_MESSAGE = 6 -- non-specific key (keyboard)  
 OSC_MESSAGE = 7  
+MIDI_PROGRAM_CHANGE_MESSAGE = 8  
  
 -- Event types  
  
diff -r bd0f57f4d50d -r b4dc87fc6ba5 Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/MidiDevice.lua  
--- a/Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/MidiDevice.lua Tue Mar 19 11:58:17 2013 +0400  
+++ b/Renoise/Scripts/Tools/com.renoise.Duplex.xrnx/Duplex/MidiDevice.lua Tue Mar 19 18:46:45 2013 +0400  
@@ -152,6 +152,11 @@  
 msg_value = message[3]  
 msg_channel = message[1]-175  
 value_str = self._midi_cc_to_string(self,message[2])  
+ elseif (message[1]>=192) and (message[1]<=207) then  
+ msg_context = MIDI_PROGRAM_CHANGE_MESSAGE  
+ msg_value = message[2]  
+ msg_channel = message[1]-191  
+ value_str = "Prg#" .. message[2]  
 elseif (message[1]>=208) and (message[1]<=223) then  
 msg_context = MIDI_CHANNEL_PRESSURE  
 msg_value = message[2]  
@@ -168,7 +173,6 @@  
 -- possible data include timing clock, active sensing etc.  
 end  
  
-  
 if (value_str) then  
  
 --print("*** value_str",value_str,msg_context)  
  
  

The missing Behringer BCD-300 control map

@E-Fir: I’ll look more closely at that message caching thingie, should of course “just work”.
But thanks a lot for coming up with a workaround :slight_smile:

Hi I have one question. I work with Novation nocturn and i wanna to change duplex templates (mixer, notes on wheels, effect etc) without mouse because it breaks my workflow. Is there any way how to do it? Thanks

Hey Akiz,

yes, there is a way to change templates from the controller itself, if that is what you mean. Unfortunately, the solution is not super-elegant, but it works.
The answer is SwitchConfiguration, which is a Duplex application that allows you to select next/previous, or any of the first 16 device configurations.

This is all good, but you need to add the application itself to each configuration you wish to control, which is a bit of work. However, there is a good example of how this is done: if you look at the Ohm64 Switch configuration(s), you’ll see that each one has the next/previous switch mapped to the buttons on each side of the big crossfader. Looking into the device config itself, it is simply a matter of adding something like the following to your Nocturn config(s):

  
SwitchConfiguration = {  
 mappings = {  
 goto_previous = {  
 group_name = "Buttons",  
 index = 1,  
 },  
 goto_next = {  
 group_name = "Buttons",  
 index = 2,  
 },  
 }  
 }  
  

Alternatively, if adding SwitchConfiguration takes up too much physical space on the controller (although you could add it to one of the “virtual pages” on the controller?),
then it has always been possible to use the function keys F1,F2, etc. to switch device configuration while the Duplex browser has focus.

Hope this helps!

It helps a lot! Thanks
F1, F2 etc. is enough. I didnt know about it.
It is so great… :w00t: