Recently, I received the MIDI Fighter Twister for the holidays. I honestly didn't realize how much I loved this thing until I got one! The Twister is incredibly useful for controlling your virtual synths with a more tactile experience. Sadly, however, it doesn't really work all that well with Propellerhead's Reason out of the box. After just a little bit of research, it turns out we can rectify this quite easily.

Propellerhead uses their Remote protocol to map MIDI devices inside Reason. There is a collection of supported devices by default, which basically just means that they have provided Remote codecs and map files for these devices. By creating our own codec and map files, we can add support for any device we want!

Fortunately for us, both the codec and map files are stored in ASCII format, so you really don't need anything beyond a basic text editor to create and modify them. I will detail the specifics of what I've discovered here.

If you don't care about hacking these files and just want to add support for the MIDI Fighter Twister to your own Reason app, you can download the Remote Pack from GitHub.

Where do you live?

First, we need to find the Remote codecs and map files that Reason will read to configure our devices. On macOS, if you want to see an example of these files, you should be able to find the factory default files in /Library/Application Support/Propellerhead Software/Remote/. You should be able to find a similar path for Windows in %PROGRAMDATA%Propellerhead SoftwareRemote.

Once you find this folder, you will find two subfolders beneath it (Codecs and Maps). These locations are where we will store our files.

Codecs

There are two types of codecs you can utilize. The older "MIDI Codec" or the newer "Lua Codec". The Lua codecs are more flexible, more powerful, and pretty easy to use, so we will just focus on those.

Inside the Lua Codecs folder, the individual codecs are organized into folders named by the manufacturers. In this case, we create a DJTT folder to store the MIDI Fighter Twister codec.

Within this folder, we have three files per codec, and they contain the following extensions:

  • .png
  • .lua
  • .luacodec

The PNG file is going to be the image used by Reason when you are setting up MIDI control devices. They should be exactly 96x96 pixels in dimension.

The Lua file contains model definitions; use this to assign names to the inputs and outputs of your device. These names will be used later when crafting Remote map files.

The Lua codec file is the main configuration of the device. It specifies all of the metadata for your MIDI device, including the names of the .png and .lua files to use.

You can examine existing codec files to get a feel of how these are written. There isn't much needed from these files to get basic functionality working.

Remote maps

NOTE: you will need to be careful when crafting these files, as they require the use of tabs as parameter delimiters. If your editor is converting tabs to spaces, this could become problematic.

Once your codec files have been created, you need to create a Remote map file to tell Reason how it should map the MIDI device controls to Reason's virtual instruments. These will be found in the Maps subfolder mentioned earlier. Similar to the codec files, Remote maps are organized by manufacturer. For the MIDI Fighter Twister, I created a DJTT folder here as well. This folder will contain the .remotemap files we need to finalize getting our gear working.

The map files are pretty basic. The top of the file is a header which contains a few lines of metadata; things like the file format, controller manufacturer, model name, etc. These can be briefly tweaked to reflect the device we want to add.

After the header, we have one or more scopes, which actually define the maps we want to create. Each scope starts with a declaration (a tab-separated line of 3 strings: the constant "Scope", CompanyID, and RackExtensionID.)

To find the RackExtensionID, we can navigate to the location of our installed rack extensions.

On macOS ~/Library/Application Support/Propellerhead Software/RackExtensions/

On Windows %AppData%Propellerhead SoftwareRackExtensions

For example, let's say I want to find the ID of the Korg Polysix. I can search in that path, and I will find the folder jp.co.korg.Polysix.1.0.6. If we just remove the version number, we are left with jp.co.korg.Polysix, and this is our RackExtensionID.

The CompanyID is also easy to get. When you are in Reason, press F8 to access the toolbox. You will notice each rack extension is categorized by company name. This name is the CompanyID. For Propellerhead, the ID is Propellerhead Software. For the Polysix, the CompanyID is Korg.

Now that we have all of our pieces, we can construct the scope string for our map file. Remember to separate each segment with tabs.

As an example, this is the scope declaration for the Korg Polysix rack extension:

Scope       Korg    jp.co.korg.Polysix

Beneath each scope declaration, there will be some number of scope definitions. These map the various I/O components to the virtual device components.

Each definition will contain 3 additional tab-separated strings: the constant "Map", deviceIOName, and RackExtensionControl.

The deviceIOName will be taken from the list of names you created in the codec earlier. Each name corresponds to a particular control on your physical device. For the MIDI Fighter Twister, I numbered the controls: CC 00, CC 01, etc.

The RackExtensionControl can be found in a few ways, but I've found the easiest way to be right clicking on the control you want to map on the rack extension itself and selecting "Edit Remote Override Mapping" in Reason. A small window will pop up, and will contain a line similar to this: Item: 00 Fat Line Bass - VCF CUTOFF. The string after the dash on this item line is the RackExtensionControl name you must use (in this example VCF CUTOFF.)

An example for the MIDI Fighter Twister is:

Map     CC 00       VCF CUTOFF

Once you have mapped out all of your scopes, just restart Reason! Supposing there are no errors, you should now be able to utilize your MIDI controller inside Reason (without using remote map overrides)!

The end

The hardest part at this point, is determining where you want to map everything. I thought about this at length, and ultimately decided to try and make a fairly generic template. I dedicate the first two banks of the MIDI Fighter Twister to common knobs I will use a lot (i.e., 2 VCFs, EG, and 2 VCOs), and the next two banks become more specific to the virtual instrument itself. This should help address devices which have different inputs to control, but still have some overlapping controls. I realize that with a device like Thor, having 3 VCOs breaks this continuity, but it's kind of a rare situation, and I don't use Thor quite as much as Malström or the Polysix.

You can check out the MIDI Fighter Twister support pack I created on GitHub. I imagine this will be a continuous work in progress for a while, so I will add additional scopes for other rack devices as they come up. For now, it supports the ones I use most commonly, but feel free to tear it apart and modify it for your own setup!