Arturia Keylab MK2 Custom Midi Remote Script ( MKII )

Hi there, I’m happy to share with you my own script for the Arturia Keylab MK2 (I personally own and tested a 49 and a 61-keys, but I have to guess that the script is working for the 88-keys too).

For a start, follow the instructions in the attached pdf file (just import the attached script from the relevant Cubase’s window, if already familiar with this)

After finishing with import, you should now see inside the newly created folder (apart from the script’s file and additional ones), a file named Arturia Keylab MK2 Custom Script.pdf (I attach this here too, just in case you want to check aspects of the script before downloading). Cubase, upon finishing with import will most probably prompt you to open it. Please do so, since in this file I have the installation instructions of the script and an overview of the functionality it offers.

Currently the script covers (or at least tries to) the following:

Focused Quick Controls
Instrument Quick Controls
Channel Strip
Insert Effects
Send Effects

and fours sets of commands’ pages.

Though, I’ve been working on this script and testing it for over two months now, I’m more than sure that bugs will be here and there, and/or vital additions to make. It’s needless to say that I’m all ears to such reports/requests.


Arturia_KeyLab MK2 MC Custom.midiremote (925.1 KB)

Arturia Keylab MK2 Custom Script.pdf (476.7 KB)

Arturia_Keylab_MK2_versionChangesLog.pdf (131.8 KB)

This script can only be used with Cubase version 12.0.50 and above.


I’m still coming across some issues. For example: some transport controls triggering notes, along with faders. Commands on pads set to pad 4,5,6, and 7 (with Command 1 set to both pad 4 and 5) instead of the bottom four (13,14,15,16). That’s the only issue I have with the Keylab btw. It seems they’ve numbered the pads in reverse. Also, when setting the Generic Remote, I had to delete many auto-generated assignments before manually putting in the ones shown in the provided PDF. Maybe you can help me figure out what I’m missing or what I’ve done incorrectly.

1 Like

Here are two screenshots of how the devices are set


Hi Steven,

As I’ve already told you, but had no way to attach a screenshot there, you have to uncheck the MIDIIN2 of the Keylab (this is its default port for DAW control) from the “In ‘ALL MIDI inputs’” . (Menu Studio-> Studio Setup → Tab Midi Port Setup)
This way, you will not hear these annoying notes coming out from this port, anymore.

ALSO, since you want to use the full implementation of this script (and I’m quite happy about it) you should also uncheck the 3 first ports of loopMIDI (loopMIDI Port, loopMIDI Port 1 and loopMIDI Port 2), since I use them for DAW control too.

HOWEVER, leave the loopMIDI Port 3 checked. Check the screenshot of my dev-pc setup.

OBSOLETE (no need to, using the current version):
Moving on to your question about pads, which is vital, and I knew it may cause problems to the users.
Please check how my own pads are setup using the Arturia MIDI Control Center, and change yours accordingly to a USER preset of your choice that you want to have the pads’ settings for my script.
You have to check (and then edit if not the same) all the 16 pads.
Starting from the BOTTOM-LEFT Pad (Arturia names it Pad 13), you should have it set to channel 10, option Gate and note set to C1 (36):

Bind every other pad by moving one note up.

Moving on UP (always from left to right) to the TOP-RIGHT pad (Pad 4), you should have it set to channel 10, option Gate, and note set to D#2 (in all other pads, you should have channel 10 and option Gate as well).

About the Generic Remote instructions, yes, upon adding a new one, all these assignments appear and we have to delete them manually.

I am really sorry that I’ve not included these instructions in my pdf file, will do asap.

In fact I’m preparing instructions for importing the custom logical (midi and project) presets, and their macros, as well.

1 Like

The MIDIIN2 is unchecked, but the others you mentioned were not. I’ll do that when I boot back up. I’m aware that it’s a “me” issue with midi ins/outs configuration. Haha. I appreciate the help and understanding through here and your YouTube page. Thank you. A side note: I understand the info you gave me about reassigning the pads. I did that with my previous “no longer using” user settings. I just didn’t remember to reassign them after deleting my settings when implementing yours. My mistake. Regardless, what you’ve achieved here for us is nothing short of awesome. Some of us simple-folk just need additional guidance sometimes. :smiley:

1 Like

My bad, please recheck my instructions for the pads. I have them setup for my drum machine the “normal” way, starting from the bottom left corner.

1 Like

I’m actually fixing them now. Along with the other stuff you mentioned. Thanks again

Hi! Would you share the .js file?

1 Like

HI there, it’s already uploaded! If you follow the instructions, you can import it to Cubase and inside its installation folder, you’ll see the .js file. It’s not obfuscated if that’s what you mean.


Thanks! I’ve only ever used my own script files and didn’t realize that the .midiremote file exposes a .js file once installed.
I’ll look at this tonight, thanks!

1 Like

Hope it contains something useful for your own deployments :slight_smile:

Decided to announce updates in the comments section here, since this can help anyone who setup notifications for this thread, to be informed.

Version - 06/04/2023

• Addition and Changes in Mixer Page:

 Added a subpage (the very first one after our main) for controlling the pre-gain (Input filter). Knobs control the level, select buttons control the bypass. Note that the leds are lit up when our pre-gain is ON and NOT when bypassed.

 Send Effects subpages now show the selected send effect, its level and On/Off state on the display. As in the pre-gain subpage, knobs control the level, select buttons control the On-state.

Reminder: In Mixer Page, we move through the various subpages using Pad13 (Shift) + Page Next/Previous Buttons.

1 Like

Version - 08/04/2023

• Additions to Instrument (Pad 8):

 Holding Instrument and turning the Jog wheel now switches between track versions.

 Shift (Pad 13) + Instrument, now opens the “add Instrument” modal form.

 Ctrl (Pad 14) + Instrument, duplicates selected tracks.

 Alt (Pad 15) + Instrument, duplicates selected tracks with No Data. Attention: This is a default macro inside Cubase. If you have deleted it, this won’t work obviously.

 FN (Pad 16) + Instrument: Creates a new (empty) track version.

• Additions to Open Strip (Pad 12) when holding:

 Shift (Pad 13) + Open, now deletes the selected tracks.

 Ctrl (Pad 14) + Open, deletes ALL empty tracks.

 Alt (Pad 15) + Open, deletes inactive versions of the selected track.

 FN (Pad 16) + Open, deletes current track version.

Note that most of the above commands are already implemented in the commands sets pages.

However, I found it useful to add them to the default pads mapping (at least for my own workflow.In fact I do tend to work a lot with track versions, and thought I should really have these shortcuts available in all pages).

Here’s a screenshot of the mixer page after the new additions:

I have not downloaded and install yet but wanted to give your flowers for this one much needed and appreciated…


Thank you, hope you find it useful!

Don’t have (yet ?) Arturia Keylab but a huge thanks for your great work !

1 Like

Note that you can always have a look at my script either way, especially when you’re in trouble with yours. There is a (small) chance you may find useful parts. (Or get in more trouble :grin: ) Thank you for your comment!

Version - 09/04/2023

In this version I’ve added the combination of states (Shift, Ctrl, Alt and FN) with our 8 knobs, in all pages except from the ones for the Commands Sets. You can set them up by altering the new file mapOfActionsOfKnobsByState.js. I’ve added remarks there on how to do this.

However, if you don’t need this functionality, you can deactivate it by setting generalSettings.allowCustomKnobsStates=0 in our mapOfGeneralSettings.js file.

We have three types of mapping for each knob and each state:

  • Normal MIDI CC. Upon turning a knob, we send its CC value to a CC we’ve set up in the mapOfActionsOfKnobsByState.js file.
  • Dual MIDI CC. In this one, upon turning a knob, we send a 127 to one of two CCs we have defined, based on our turning direction, i.e., if we turn our knob left or right.
  • Commands. Upon turning a knob, based on the turning direction, we execute a command assigned to either left or right turn.

Now, this update needs some justification. The Keylab has a set of 10 user templates to assist us in pretty much every mapping we can think of when controlling DAW and/or our plugins. In fact, I personally mapped most of my plugins to these templates.

However, there is a lack of DUAL handling of knobs. This is to be expected, and most of the time we’re adding this by either coding in this new midi remote API by Steinberg, or by using third-party apps (I personally use Bome’s MIDI Translator Pro but there are other wonderful tools out there as well).

So, I thought it would be a nice addition after all. I personally use this new feature of the script a) for controlling the browser of my plugins and b) for dual commands (that are not already assigned to other controls).

PLEASE, ALWAYS BACK-UP your working script folder before updating.

A screenshot demonstrating the new addition:

Version - 12/04/2023

The change in this version may seem a cosmetic one, but it’s actually a bit deeper, at least the way I see it and thus I’ve decided to do it.

We now have two versions of the UI we can choose from, by altering the variable generalSettings.UIType in our mapOfGeneralSettings.js file, to either 0 or 1.

The first one (0) is the “default”, the way that our display is built up since the initial appearance of my script.

The second one, and here’s the change, rebuilds the layout in a way that more accurately represents our Keylab’s surface.

However, this is not the real reason for rearranging the elements of my design. The real reason is that we can now place for example a second monitor/tablet upon our Keylab’s mixer section, and by zooming the remote environment, have a much better overview of our controls.

At the same time, when we need to, we can see the other section of our surface (Pads, Track Controls, Transports and Jog) and have a much better overview of the assignments in this area.

I personally, after memorising my own assignments for the pads/track controls/transport/jog section, I find it very useful to zoom the remote window to our mixer assignments, because simply I always get to see the available controls in instrument’s and insert effects’ page. This helps a lot, because obviously I cannot easily memorise all the controls of all my plugins, nor I ever thought of doing so, actually :blush:

Now, here are some screenshots to better understand this update.

Original one (Default):

Now the NEW one:

This looks so shrink, when we look at it at a 100% zoom (unless of course we use a wide monitor just for the remote).

HOWEVER, if we zoom in it, we can easily get two sections:

Here we have a much better view of the first section. This can be helpful upon memorising the almost standard assignments this section provides.

And here’s the second section:

Now, imagine a second monitor/table at our Keylab’s Mixer section. We can now see our controls “connected” to our surface. This may mean nothing to some, but to me, while controlling instruments, is a big help.

Version - 14/04/2023

Motivation: It’s been always a pleasure for me to watch all these hardware synths with their tremendous number of knobs/faders handled by experts to generate all these phenomenal sounds by tweaking – usually very quickly – the parameters that those knobs/faders exposed to the lucky owner.

In this version, I’ve added an option (by setting generalSettings.UISpecialTabForControls=1 [default] in our mapOfGeneralSettings.js file, or if you want to deactivate it, by setting it to 0) to have an 80-parameters bank in our Instrument’s Quick Controls page, in an attempt to make this experience a bit more feasible while using our controller, which lacks this number of knobs/faders, since our Keylab has a set of 8 knobs and 8 faders (OK, plus another two but I don’t use them in this implementation).

In order to get these 80 parameters’ control, we’re going to use our knobs and faders as we normally do, and this is called state 1, and state buttons (i.e., Shift-Pad 13, Ctrl-Pad14, Alt-Pad15 and FN-Pad16) held down while we turn/move our knobs/faders, to gain access to the other 4 states. That gives as a total number of 5 states multiplied by our knobs/faders number, giving us a total of 80 parameters per plugin bank.

On our midi remote window, we’re going to see all these parameters plus a lamp showing which exactly row of them we’re dealing with.

Hint: In order to best view these assignments, zooming-in is needed when we are in the Instrument Quick Controls mode.

Note: It may take up to 1-2 seconds for the controls’ bank to refresh. That’s probably logical given the overhead produced upon the page’s creation.

And here’s a screenshot (Retrologue) of how this 80-parameters banks concept will look like inside our midi remote window (when properly zoomed):

Version - 14/04/2023

The default mode of the script is changed to the stripped-down version.

This decision was made to help the less experienced users to begin testing the script using the two ports of the Keylab for DAW handling, i.e., MIDIIN2 and MIDIOUT2.

You can always use the full version of the script by setting


in our mapOfGeneralSettings.js file.

I advise you to do so, once you get comfortable with the stripped-down functionalities provided, and only IF you need the following extra ones (by following the additional instructions on how to implement these):

Browsing instruments and effects plugins (FN+Jog Wheel)

Custom functionality of our knobs (sending midi messages to loopMIDI Port 3)

Change metronome click level (Metro+Jog Wheel)

Correctly light up the Punch In/Out leds

Show on our LCD display:

MIDI Record mode,

MIDI Cycle Record mode,

Metronome Pre-count.

Version - 14/04/2023

I’ve noticed that the lcd display was not updating properly when in 80-controls instrument banks. Fixed.

Added in the script’s folder, two new subfolders:


This one contains the default settings files, just in case we mess around and we want to restore them by copying & pasting them inside our main folder (replacing the old ones),


This one contains my preferred mapOfGeneralSettings.js file.

Version - 03/05/2023

  • This version makes a big change, when we’re using the full version of the script. For users of the stripped down version, no change here.

From now on, there’s no need anymore for assigning port 1 of the Keylab when setting up our controller.

This means, that we have to setup just the DAW ports, plus the loopMidi ones.
This makes it possible to create another midi remote instance which can now use the Port 1 of our Keylab.
Thus, we can now use the midi assistant of the midi remote API (or even writing a separate script), in order to add functionalities not implemented by my own script, when we have our Keylab in USER mode!
For example, one can now setup a full ControlRoom page (my script currently does not implement ControlRoom) by using a user preset.

  • Added a file named mapOfMasterFaderAndKnobBindings.js.

In this file we can define what our master fader and knob do, when Ctrl, Alt or FN pads are pushed, in the Mixer page.

  • Minor change to avoid an error when we have enabled the pads’ changing color upon beat, when our primary time display is not set to Bars+Beats.

Arturia_KeyLab MK2 MC Custom.midiremote (914.3 KB)

Arturia Keylab MK2 Custom Script.pdf (476.7 KB)

versionChangesLog.pdf (122.3 KB)


Just unboxed a new MKII 61 and ran the MIDI Control Center making sure it’s all up to date.

Ten minutes installing your scripts into Cubase 12 (Windows 10), and another 10 minutes into learning my way around it, and I must say it’s impressive!

I’ve enabled the full version. It’s nicely designed and seems to be working well for me. Looking forward to exploring the script to see what other ‘options and goodies’ you’ve got ready or near ready to go.

Thanks so much for sharing!

1 Like