The idea is simple: I’ve been using the full version of SPAD.neXt which includes MIDI support and, as such, can utilize devices such as Behringer Xtouch Mini or Novation Launchpad Mini to control MSFS. In particular to control things that cannot be mapped directly via in-game settings, for example all L:VAR/H:VAR variables which are very common in 3rd party aircraft (WT CJ4, Piper P28R, CRJ and so on).
Although a full blown MIDI controller with dozens of keys and knobs would be ideal, they also don’t come cheap. So what if I could use a secondary PC keyboard as a dedicated input, masking it as a virtual MIDI device? I would effectively have as many keys as I wanted for free (except the initial purchase of SPAD.neXt). The solution can scale up to as many additional keyboards as we want to.
What I did in 10 easy steps was:
DISCLAIMER: Best to try this with TWO keyboards connected to your PC, otherwise you may end up locking your input if you are only using one keyboard. If this happens then try killing UCR via CTRL+ALT+DEL and Task Manager. In the worst case scenario, you will need to use the power button on your PC to reset it.
-
Download UCR, which enables us to map any device input to any device output. No installation is needed. No need to launch it just yet.
-
Install UCR’s Core Interception software, which is essentially a driver which captures our secondary keyboard’s keystrokes before they reach Windows. All we need is to run executable “\Interception\command line installer\install-interception.exe” (as admins via command prompt) and reboot. Sounds fishy but it seems to be legit software, has been around for years and is well known to the community.
-
Enable Core Interception’s blocking feature, which allows UCR to prevent our secondary keyboard’s keystrokes from registering in Windows as standard input. This will effectively result in the second keyboard sending only MIDI commands to MSFS and nothing else (so we’ll avoid any key conflicts). Enabling the blocking feature is as easy as updating the value of “BlockingEnabled” config item found in “UCR_v0.9.0\Providers\Core_Interception\Settings.xml” from False to True.
-
Add 3 DLL files to UCR, found in a plugin called MapToMidi.zip and downloaded from here. The DLLs are essentially plugins which will add MIDI mapping features to UCR and will allow us to map keyboard buttons to MIDI commands. The installation instructions are as follows: “Extract the 3 DLL files and place Core_Midi.dll in UCR’s /Providers/Core_Midi/ and the other two files in /Plugins/UCR.Plugins/”.
-
Install LoopBe1, which is free software (as long as it’s not used for commercial reasons) which adds a MIDI device in Windows.
We will need this as the output for UCR and also the MIDI input device for SPAD.neXt. -
Launch UCR, create a new profile and set your secondary keyboard as input and LoopBe as the MIDI output:
-
In UCR’s Plugins menu, select “Midi → Button to Midi” and create a new keybind such as this:
You can use any MIDI output command you like, I prefer notes because they’re simpler. Just make sure you use a different note for each keystroke (thankfully there are several octaves there) and also remember to enable both “Block” and “Disable Key Repeat” for good measure. As described in step (3) this will prevent Windows from registering our keystrokes as standard input. -
As soon as you are happy with your UCR bindings, activate your profile (press that Play icon on top left).
-
Launch SPAD.neXt, enable General MIDI support (if you haven’t already):
-
Go to Panels. Your LoopBe MIDI device should be there. It’ll probably be empty of all keys, but as soon as you start pressing keys on your secondary keyboard you’ll see them appearing in SPAD.neXt. This is standard behaviour for this app for all MIDI devices. In this particular example I have mapped all A-to-N keys of my secondary keyboard, assigned “A” to a random SimConnect event (toggle beacon lights) and this is how they appear:
So for example this is how you could easily map all A-Z and 0-9 keys to their respective MCDU buttons of WT CJ4 or CRJ (both are using L:VAR/H:VARs for all these things). Took about half an hour to get all mapping done, the only MCDU buttons I didn’t assign were the LSKs because keyboard layouts aren’t really ideal for those side selectors.