Duplex, Launchpad, Keyboard config and drum grid

Hi

Sorry could someone pls point me on the direction of how this should work, as it’s not clicking with me!

I want a grid of drum sounds a la drum rack in Live, where the samples are laid out in a nice chromatic scale. When I press the Session btn the top 3 rows become the said grid, is that right? According to the manual this is supposed to highlight pad where the samples are on the keyzones. I don’t see that.

The default mapping for Keypads Left/Right is for white keys but 4 notes for each row, why is each row not follow consecutively from the previous?

I don’t mind converting to a different way of thinking, but I’m struggling to get what the lay of the land is!

thanks

According to the manual

Sorry, the highlighting of the keys was removed during the last update and this somehow didn’t get mentioned in the manual.

I should probably re-introduce this option, but I remember thinking that the keyboard was getting a little “thick with information” after I introduced the additional layouts (isomorphic, etc).

But this is very useful information, so yeah… why not bring it back in some form.

Btw: your controller is a Launchpad? Not all controllers have enough control over LED shades/color. With the LP, this should be no problem.

I want a grid of drum sounds a la drum rack in Live, where the samples are laid out in a nice chromatic scale

“Chromatic” is the default option - but then, the default LP Keyboard configuration has three different keypads squeezed into well … not a lot of space.

If you want a little more breathing room for experimenting with the features, here is an alternative, more “basic” configuration:

Click to view contents

–[[----------------------------------------------------------------------------

– Duplex.Launchpad

----------------------------------------------------------------------------]]–

duplex_configurations:insert {

– configuration properties

name = “Keyboard (Simple)”,

pinned = true,

– device properties

device = {

class_name = “Launchpad”,

display_name = “Launchpad”,

device_port_in = “Launchpad”,

device_port_out = “Launchpad”,

control_map = “Controllers/Launchpad/Controlmaps/Launchpad.xml”,

thumbnail = “Controllers/Launchpad/Launchpad.bmp”,

protocol = DEVICE_PROTOCOL.MIDI,

},

applications = {

Keyboard = {

mappings = {

key_grid = {

group_name = “Grid”,

},

octave_down = {

group_name = “Controls”,

index = 2

},

octave_up = {

group_name = “Controls”,

index = 1

},

volume = {

group_name = “Triggers”,

orientation = ORIENTATION.VERTICAL,

index = 1

},

all_notes_off = {

group_name = “Controls”,

index = 3

},

cycle_layout = {

group_name = “Controls”,

index = 4

},

},

options = {

},

hidden_options = { – display minimal set of options

“channel_pressure”,“pitch_bend”,“release_type”,“button_width”,“button_height”,“mod_wheel”,“velocity_mode”,“keyboard_mode”

},

},

}

}

Edit: to install this configuration, copy the text above into a text document and save it as “Keyboard_Simple.lua” (important to give the file a .lua extension!)

Save the file to the "Duplex/Controllers/Launchpad/Configurations " folder and restart Duplex (Tool menu > Tool Browser, disable + enable)

You can always change the configurations for the controller to your liking - either by tweaking the settings or creating a new configuration from scratch.

PM me if you have additional questions B)

Sorry, the highlighting of the keys was removed during the last update and this somehow didn’t get mentioned in the manual.

I should probably re-introduce this option, but I remember thinking that the keyboard was getting a little “thick with information” after I introduced the additional layouts (isomorphic, etc).

But this is very useful information, so yeah… why not bring it back in some form.

Btw: your controller is a Launchpad? Not all controllers have enough control over LED shades/color. With the LP, this should be no problem.

“Chromatic” is the default option - but then, the default LP Keyboard configuration has three different keypads squeezed into well … not a lot of space.

If you want a little more breathing room for experimenting with the features, here is an alternative, more “basic” configuration:

Click to view contents

–[[----------------------------------------------------------------------------

– Duplex.Launchpad

----------------------------------------------------------------------------]]–

duplex_configurations:insert {

– configuration properties

name = “Keyboard (Simple)”,

pinned = true,

– device properties

device = {

class_name = “Launchpad”,

display_name = “Launchpad”,

device_port_in = “Launchpad”,

device_port_out = “Launchpad”,

control_map = “Controllers/Launchpad/Controlmaps/Launchpad.xml”,

thumbnail = “Controllers/Launchpad/Launchpad.bmp”,

protocol = DEVICE_PROTOCOL.MIDI,

},

applications = {

Keyboard = {

mappings = {

key_grid = {

group_name = “Grid”,

},

octave_down = {

group_name = “Controls”,

index = 2

},

octave_up = {

group_name = “Controls”,

index = 1

},

volume = {

group_name = “Triggers”,

orientation = ORIENTATION.VERTICAL,

index = 1

},

all_notes_off = {

group_name = “Controls”,

index = 3

},

cycle_layout = {

group_name = “Controls”,

index = 4

},

},

options = {

},

hidden_options = { – display minimal set of options

“channel_pressure”,“pitch_bend”,“release_type”,“button_width”,“button_height”,“mod_wheel”,“velocity_mode”,“keyboard_mode”

},

},

}

}

Edit: to install this configuration, copy the text above into a text document and save it as “Keyboard_Simple.lua” (important to give the file a .lua extension!)

Save the file to the "Duplex/Controllers/Launchpad/Configurations " folder and restart Duplex (Tool menu > Tool Browser, disable + enable)

You can always change the configurations for the controller to your liking - either by tweaking the settings or creating a new configuration from scratch.

PM me if you have additional questions B)

Thank you for taking time to write a comprehensive reply, sorry that I didn’t get back to you!

OK well it looks like an invitation to dive in and tweak it to my liking. I’ll share anything useful that I come up with

cheers

I’d love to see some sample project files made available for Duplex coupled with a video demonstration. I’ve also had a really hard time figuring out how it can be used.

Hi

I’ve been trying to figure (not successfully) out to create a Launchpad grid of 4 banks of 16 pads, each in chromatic scale, something like the attached image:

6895 drumpad_grid.png

How would I setup the Controlmap and Configuration files to handle this? Obviously the incoming pad values from the Launchpad need to be transformed into the required chromatic scale; is that all simply just down to how the Controlmap is set up, or does another app need to be created to handle that?

Many thanks

Obviously the incoming pad values from the Launchpad need to be transformed into the required chromatic scale; is that all simply just down to how the Controlmap is set up, or does another app need to be created to handle that?

Not exactly. The purpose of the controlmap is to describe the controller - which buttons that send what (type of) messages. Usually in Duplex, each controller comes with a “base” controlmap which describe the most likely settings (factory defaults).

Also, the controlmap organizes those buttons into layouts (groups) - which is why there are often many different controlmaps - the more specialized a configuration, the more likely it is to have a dedicated controlmap layout.

So what you essentially need to do is to create a new controlmap - the “base” Launchpad.xml would be a good starting point. Then, using a text editor, break the central grid into four equally sized groups (like in your image).

Basically, each group would each contain 16 parameters - note values and everything else should be left intact, it’s only the organization into groups you should be interested in (you can use the existing controlmaps as a reference)

Don’t forget that each group need some sort of name so you can identify it later on. E.g. “pad1”, “pad2” etc.

Once you have this controlmap you can begin creating a configuration file. This file is the one which is picked up by Duplex on startup - it specifies “mappings” to applications that should be running in your groups.

Since you’re splitting the grid into four groups, you will need four Keyboard applications running, side by side. Best thing here would be to take a look at the example Keyboard configuration which does something very similar, splitting the central grid into 3 parts instead of four.

Final steps would involve setting up default options etc. But this is not really essential as you can edit the options visually, from the Duplex GUI…well, once the configuration is able to launch which might not be in first attempt ;).

Also, don’t know if you’ve seen this:https://forum.renoise.com/t/how-to-start-editing-duplex-files/30979

Fantastic - thank you for clarifying that for me! That makes a lot more sense to me now.

One thing I’d like to ask: is it possible to trigger a external tool to run from a button in the Duplex config/keymap. In this case it would be Ledger’s Re-order Notes by Pitch in tool (assuming this is the only tool to do this?), which you can assign to a key, but it would be great to use one of the buttons in the layout after inputing some notes to tidy things up.

Cheers

One thing I’d like to ask: is it possible to trigger a external tool to run from a button in the Duplex config/keymap. In this case it would be Ledger’s Re-order Notes by Pitch in tool (assuming this is the only tool to do this?), which you can assign to a key, but it would be great to use one of the buttons in the layout after inputing some notes to tidy things up.

Sure, Duplex can pass MIDI messages to Renoise to enable standard MIDI mappings.

You need to leave the button “unmapped” (ensure no Duplex application is using it) and also, enable the “Pass unhandled…” checkbox in the Duplex settings.

It will not work with tools that grab the MIDI input directly from the controller, though. But this is not so common…

EDIT – actually I think got this sorted

EDIT EDIT - actually I don’t!

I’ve got the layout exactly how I want it, but the pads on the Launchpad output their notes, and they don’t map to the notes that I want in the ControlMap. Got a feeling that I need to create a new Keyboard Layout (like HarmonicLayout.lua) to transform the incoming midi note data from the Launchpad - like a hash map. Is this the case?

Sorry this is probably very straightforward, or perhaps I’ve not been explaining very well what I want to do!

Attached are both the .lua and .xml files.

Thanks

Will take a look, thanks.

And I think you explained it just fine with that image you posted.

Far be it for me to expect you to have cooked up something - you have quite enough on your plate - but did you manage to figure out a solution for this?

…something to nudge me in the right direction :slight_smile:

Cheers

Far be it for me to expect you to have cooked up something - you have quite enough on your plate -

Heh, you are absolutely right, I had forgotten. Until today :slight_smile:

Attached are both the .lua and .xml files.

When I replaced the mapped property name, the configuration started to work.

For example:

Bank4 = {
  application = "Keyboard",
  mappings = {
    key_grid = { -- fixed, needs to be name of mapping
      group_name = "Bank 4",
    },
  },
},

As the harmonic layout prefers to layout in a “each row begin with a C” pattern, I made a slightly tweaked layout called ‘HarmonicWrapped’.

Download this gist and paste it into the Applications/Keyboard/Layouts folder.

Then launch Duplex and select the new layout for each of your banks. This needs to be done just once.

Hah, so when I updated to the this latest Duplex beta, I was a bit of a nitwit and didn’t back up the layout/configuration that I had for the Drumpads above (that was working fine).

I’ve used the files above as a starting point, but the Launchpad is not reflecting the UI in the Duplex browser in anyway.

There seems to be an error coming from the HarmonicWrapped.lua file, on line 51:

local scale = xScale.get_scale_by_name(self.kb.scale_mode)

in the gist above it is:

local scale = HARMONIC_SCALES[self.kb.scale_mode]

I think it’s probably part of the refactoring of code that has taken place. How do I resolve the above?

thanks

the layout/configuration that I had for the Drumpads above (that was working fine).

That’s strange, I just downloaded those files and the controlmap doesn’t spell out the right notes for me.
For example, it defines a note as “C-8” but the Launchpad I have isn’t even able to send that note.

So just how this has ever been working is a a bit of a mystery … :blink:
I think the “scale related” error you experienced is also a result of this.

You’ve prompted me to take a look though, and I couldn’t resist but adding a few features to the Keyboard application while I was at it:

duplex_keyboard_may17.gif?raw=1

Tada-- bringing back the “visualize sample mappings” mode, and midi note/name switching :slight_smile:
Will release this as a new beta in a couple of days.

Until then, you can use the following control-map and see if that goes better:

<Device>
  <Name>Novation Launchpad</Name>
  <Author>Boonier</Author>
  <Description>Controlmap for Novation Launchpad
Note: If you have the Automap software running in the background, please disable it on the Launchpad to avoid conflicts between Duplex and Automap: simply press User2 + Down at the same time (this will toggle Automap on/off for the Launchpad)</Description>
  <States>
    <State name="DimStateA" hide_when_inactive="false" disable_when_inactive="true" value="CC#108" type="toggle" active="true" />
    <State name="DimStateB" hide_when_inactive="false" disable_when_inactive="true" value="CC#108" type="toggle" />
    <State name="ToggleStateA" hide_when_inactive="true" value="CC#108" type="toggle" active="true" />
    <State name="ToggleStateB" hide_when_inactive="true" value="CC#108" type="toggle" />
  </States>
  <Parameters>
    <Column>
      <Row>
        <Group name="Controls" orientation="horizontal">
          <Param value="CC#104" type="button" name="Up" maximum="127" minimum="0"/>
          <Param value="CC#105" type="button" name="Down" maximum="127" minimum="0"/>
          <Param value="CC#106" type="button" name="Left" maximum="127" minimum="0"/>
          <Param value="CC#107" type="button" name="Right" maximum="127" minimum="0"/>
          <Param value="CC#108" type="button" name="Session" maximum="127" minimum="0"/>
          <Param value="CC#109" type="button" name="User1" maximum="127" minimum="0"/>
          <Param value="CC#110" type="button" name="User2" maximum="127" minimum="0"/>
          <Param value="CC#111" type="button" name="Mixer" maximum="127" minimum="0"/>
        </Group>
      </Row>
      <Row>
        <Column>

          <Row>
            <Column>
              <Group name="Bank 3 label">
                <Param value="/" type="label" text="Bank 3" size="4" aspect="0.14"/>
              </Group>
              <Group name="Bank 3" columns="4">
                <Param value="C--1" type="button" name="Button 1,1"	maximum="127" minimum="0"/>
                <Param value="C#-1" type="button" name="Button 1,2"	maximum="127" minimum="0"/>
                <Param value="D--1" type="button" name="Button 1,3"	maximum="127" minimum="0"/>
                <Param value="D#-1" type="button" name="Button 1,4"	maximum="127" minimum="0"/>
                <Param value="E-0" type="button" name="Button 2,1"	maximum="127" minimum="0"/>
                <Param value="F-0" type="button" name="Button 2,2"	maximum="127" minimum="0"/>
                <Param value="F#0" type="button" name="Button 2,3"	maximum="127" minimum="0"/>
                <Param value="G-0" type="button" name="Button 2,4"	maximum="127" minimum="0"/>
                <Param value="G#1" type="button" name="Button 3,1"	maximum="127" minimum="0"/>
                <Param value="A-1" type="button" name="Button 3,2"	maximum="127" minimum="0"/>
                <Param value="A#1" type="button" name="Button 3,3"	maximum="127" minimum="0"/>
                <Param value="B-1" type="button" name="Button 3,4"	maximum="127" minimum="0"/>
                <Param value="C-3" type="button" name="Button 4,1"	maximum="127" minimum="0"/>
                <Param value="C#3" type="button" name="Button 4,2"	maximum="127" minimum="0"/>
                <Param value="D-3" type="button" name="Button 4,3"	maximum="127" minimum="0"/>
                <Param value="D#3" type="button" name="Button 4,4"	maximum="127" minimum="0"/>
              </Group>
            </Column>
            <Column>
              <Group name="Bank 4 label">
                <Param value="/" type="label" text="Bank 4" size="4" aspect="0.14"/>
              </Group>
              <Group name="Bank 4" columns="4">
                <Param value="E--1" type="button" name="Button 1,5"	maximum="127" minimum="0"/>
                <Param value="F--1" type="button" name="Button 1,6"	maximum="127" minimum="0"/>
                <Param value="F#-1" type="button" name="Button 1,7"	maximum="127" minimum="0"/>
                <Param value="G--1" type="button" name="Button 1,8"	maximum="127" minimum="0"/>
                <Param value="G#0" type="button" name="Button 2,5"	maximum="127" minimum="0"/>
                <Param value="A-0" type="button" name="Button 2,6"	maximum="127" minimum="0"/>
                <Param value="A#0" type="button" name="Button 2,7"	maximum="127" minimum="0"/>
                <Param value="B-0" type="button" name="Button 2,8"	maximum="127" minimum="0"/>
                <Param value="C-2" type="button" name="Button 3,5"	maximum="127" minimum="0"/>
                <Param value="C#2" type="button" name="Button 3,6"	maximum="127" minimum="0"/>
                <Param value="D-2" type="button" name="Button 3,7"	maximum="127" minimum="0"/>
                <Param value="D#2" type="button" name="Button 3,8"	maximum="127" minimum="0"/>
                <Param value="E-3" type="button" name="Button 4,5"	maximum="127" minimum="0"/>
                <Param value="F-3" type="button" name="Button 4,6"	maximum="127" minimum="0"/>
                <Param value="F#3" type="button" name="Button 4,7"	maximum="127" minimum="0"/>
                <Param value="G-3" type="button" name="Button 4,8"	maximum="127" minimum="0"/>
              </Group>
            </Column>
          </Row>

          <Row>
            <Column>
              <Group name="Bank 1 label">
                <Param value="/" type="label" text="Bank 1" size="4" aspect="0.14"/>
              </Group>            
              <Group name="Bank 1" columns="4">
                <Param value="E-4" type="button" name="Button 5,1"	maximum="127" minimum="0"/>
                <Param value="F-4" type="button" name="Button 5,2"	maximum="127" minimum="0"/>
                <Param value="F#4" type="button" name="Button 5,3"	maximum="127" minimum="0"/>
                <Param value="G-4" type="button" name="Button 5,4"	maximum="127" minimum="0"/>
                <Param value="G#5" type="button" name="Button 6,1"	maximum="127" minimum="0"/>
                <Param value="A-5" type="button" name="Button 6,2"	maximum="127" minimum="0"/>
                <Param value="A#5" type="button" name="Button 6,3"	maximum="127" minimum="0"/>
                <Param value="B-5" type="button" name="Button 6,4"	maximum="127" minimum="0"/>
                <Param value="C-7" type="button" name="Button 7,1"	maximum="127" minimum="0"/>
                <Param value="C#7" type="button" name="Button 7,2"	maximum="127" minimum="0"/>
                <Param value="D-7" type="button" name="Button 7,3"	maximum="127" minimum="0"/>
                <Param value="D#7" type="button" name="Button 7,4"	maximum="127" minimum="0"/>
                <Param value="E-8" type="button" name="Button 8,1"	maximum="127" minimum="0"/>
                <Param value="F-8" type="button" name="Button 8,2"	maximum="127" minimum="0"/>
                <Param value="F#8" type="button" name="Button 8,3"	maximum="127" minimum="0"/>
                <Param value="G-8" type="button" name="Button 8,4"	maximum="127" minimum="0"/>
              </Group>
            </Column>
            <Column>
              <Group name="Bank 2 label">
                <Param value="/" type="label" text="Bank 2" size="4" aspect="0.14"/>
              </Group>                        
              <Group name="Bank 2" columns="4">
                <Param value="G#4" type="button" name="Button 5,5"	maximum="127" minimum="0"/>
                <Param value="A-4" type="button" name="Button 5,6"	maximum="127" minimum="0"/>
                <Param value="A#4" type="button" name="Button 5,7"	maximum="127" minimum="0"/>
                <Param value="B-4" type="button" name="Button 5,8"	maximum="127" minimum="0"/>
                <Param value="C-6" type="button" name="Button 6,5"	maximum="127" minimum="0"/>
                <Param value="C#6" type="button" name="Button 6,6"	maximum="127" minimum="0"/>
                <Param value="D-6" type="button" name="Button 6,7"	maximum="127" minimum="0"/>
                <Param value="D#6" type="button" name="Button 6,8"	maximum="127" minimum="0"/>
                <Param value="E-7" type="button" name="Button 7,5"	maximum="127" minimum="0"/>
                <Param value="F-7" type="button" name="Button 7,6"	maximum="127" minimum="0"/>
                <Param value="F#7" type="button" name="Button 7,7"	maximum="127" minimum="0"/>
                <Param value="G-7" type="button" name="Button 7,8"	maximum="127" minimum="0"/>
                <Param value="G#8" type="button" name="Button 8,5"	maximum="127" minimum="0"/>
                <Param value="A-8" type="button" name="Button 8,6"	maximum="127" minimum="0"/>
                <Param value="A#8" type="button" name="Button 8,7"	maximum="127" minimum="0"/>
                <Param value="B-8" type="button" name="Button 8,8"	maximum="127" minimum="0"/>
              </Group>
            </Column>
            
          </Row>

          
        </Column>

        <Column>
          <Group name="Triggers" orientation="vertical">
            <Param value="G#-1" type="button" name="Trigger #1" maximum="127" minimum="0"/>
            <Param value="C-1" type="button" name="Trigger #2" maximum="127" minimum="0"/>
            <Param value="E-2" type="button" name="Trigger #3" maximum="127" minimum="0"/>
            <Param value="G#3" type="button" name="Trigger #4" maximum="127" minimum="0"/>
            <Param value="C-5" type="button" name="Trigger #5" maximum="127" minimum="0"/>
            <Param value="E-6" type="button" name="Trigger #6" maximum="127" minimum="0"/>
            <Param value="G#7" type="button" name="Trigger #7" maximum="127" minimum="0"/>
            <Param value="C-9" type="button" name="Trigger #8" maximum="127" minimum="0"/>
          </Group>
        </Column>

      </Row>
    </Column>
  </Parameters>
</Device>

You-da-man that’s awesome thanks, and that sample mappings demo above, even more so. Can’t wait to get into that! Your tools really do have that extra sparkle and attention to detail, got to say :slight_smile:

Can’t wait to get into that!

No more waiting:https://forum.renoise.com/t/duplex-beta-versions/30625

Niceeeee ta