UCR X360 Controller Support for Multiplayer from Single HID [Tutorial]
As of version v0.1.18 Universal Control Remapper (UCR) supports the virtualization of multiple Xbox 360 controllers from a single HID. This could be a standard keyboard or various keyboard encoders such as Ultimarc’s iPac, GGG’s KeyWiz, or even what comes standard in the X-Arcade Joystick series.
This should come as a huge sigh of relief for a number of us arcade enthusiasts who have long been plagued with issues of modern Steam/PC games support. Many modern PC titles don’t support key rebinding, and of those that do, they typically don’t support binding multiple players to a single keyboard. As such, those of us using keyboard encoders in our arcade cabinets have had to go to great lengths to compile lists of games that are easily supported using our control configurations. For some cases such as SFIV, the community has found workarounds using X360ce but this doesn’t seem to work in all cases and can be cumbersome to setup on a per game basis. The solution presented here should work for the majority of cases and greatly expand the list of supported Steam/PC games on your arcade setup.
Without further adieu, let’s dig in.
First, we must begin with some pre-requisites. For this to work you will need to install the following:
- Install the latest Xbox 360 Controller for Windows drivers
- Install vJoy Device Driver (latest version is v2.1.8.38 as of writing)
- Install Universal Control Remapper (UCR) (latest version is v0.1.19 as of writing)
With vJoy installed we can now begin configuring UCR. Upon opening UCR use the file menu to navigate IOClasses > vJoy
First, make note of vJoy Installed (Required) and ensure that it’s checked. Next check the vJoy log and ensure it’s properly detecting the vJoy drivers. Provided vJoy is being recognized we can select Install SCPVBus which is necessary for the virtual Xbox 360 gamepads (or vXBox as UCR refers to it) to function.
After UCR restarts we can begin configuring our vXBox virtual Xbox 360 gamepads. Taking note of the right hand pane we see we have a Profile Toolbox. This allows us to create multiple profiles for different control configurations. For our purposes I’ll just be using the Default profile.
*It is important to note that while the Profile Toolbox allows for Child Profiles, these are intended for Shift States which are outside the scope of this tutorial. It may be tempting to create a child profile for each player controller, but this is not the intended use and may cause conflicts.
Expanding the Plugin Selection dropdown we’re presented with a number of options with the relevant ones outlined here:
- Button to Axis — Maps keys to an axis. For our application this will cover X/Y Axis of Analog sticks, and Trigger buttons.
- Button to Button — Maps keys to a single button input. This will cover all other buttons on the Xbox 360 controller (A, B, X, Y, LB, RB, Back, Start, L-Analog click, R-Analog click, and Directional Pad inputs).
Starting with the Left Analog Axis, select Button to Axis from the Plugin Selection and click Add.
You will be prompted to enter a name for each mapping. Here I have named the mapping P1X-Axis as it will be mapping the Player 1 Left Analog X-Axis (I am designating the player in the name as each player controller will be configured within the same profile).
The Input Buttons group will be our keyboard input with Low being Left-Analog Left and High being Left-Analog Right. Clicking on Select an Input Button will give us a drop down where we can select which key input we will be assigning. Clicking Select Binding will make the program listen for an input at which point you simply press the key you wish to assign.
The Settings group can be left as is for Left/Right Analog Axis but for LT/RT you will want to set the Deflection % as follows: Low=0, Mid=0, High=100. Otherwise, the left and right triggers will be in a constant state of being held halfway down.
The Output Axis group will be the intended Xbox 360 Controller output. In this case it will be an axis with high and low readings, but for Button to Button mappings it will be a single button output. Clicking on Select an Output Axis will present us with a list of options from which we’ll need to perform a few steps.
From the dropdown first we must assign what type of controller output we want along with the player number. In this case, since we are configuring player 1 Xbox 360 controller we will select vXBox Stick > 1 from the dropdown.
With the controller selected we may now assign the axis we are outputting. In this case we will select vXBox Axes > (LS X) for Left Analog Stick X-Axis.
With the player 1 Left Analog X-Axis assigned we can repeat this process for the Y-Axis (note: for Y-Axis low is down and high is up). This process is the same for Right Analog Stick. Also note that for Left/Right Trigger only assigning High input is necessary.
Button to Button assignment is exactly the same with the exception that you only have a single Input assignment (instead of low and high) and you will select vXBox Button > your button after assigning the vXBox controller.
Repeating these steps for the rest of the inputs you should end up with a final profile looking similar to this:
As you can see the profile can quickly become cluttered with most of the inputs off screen (you have to mouse scroll to see all the mappings) but it does get the job done.
Next we’ll look at testing our controls.
To test our newly configured virtual Xbox 360 Controllers first search Set Up USB Game Controllers from the Windows start menu. You should get a window like this:
You should notice two (or more depending on how many players you’re trying to support) Controller (XBOX 360 For Windows entries. If these do not appear for you make sure UCR is running and the profile you set up is active.
The entries should be in order with Player 1 being the first Xbox 360 Controller and Player 2 being the second (although this is not always the case). Selecting the first entry and clicking properties you should now be able to test Player 1 input using the keys you assigned. The same process should work for Player 2 as well.
Congratulations! You now have TWO unique Xbox 360 Controllers being simulated from a single HID.
Before you rush off to test these setting with your favorite newly supported Steam games we must first do a little clean-up and go over a couple of things. First, you may notice an entry for vJoy Device in the previous screenshot. That’s bad news and if you have that entry as well there’s a couple more steps we’ll need to take. The last thing we want are superfluous gamepad devices being recognized as that will just clutter and cause possible conflicts with games that support generic gamepad devices.
From the Windows start menu search for Configure vJoy and launch the application.
You should notice in the bottom left-hand corner of the application a checkbox Enable vJoy. Simply uncheck the box and the entry should disappear from the Game Controllers list.
If you’re using an iPac device, depending on which firmware you’re running you may see an entry in the Game Controllers window for the iPac. If this is causing issues in some games you head over to the Ultimarc downloads page and download the latest firmware. After flashing the firmware through WinIpac the iPac entry should be gone.
One final point of consideration is blocking key inputs. Since some games support both Xbox 360 and Keyboard controls, there’s the potential for conflicts as the Keyboard command is sent along with the X-Input command. The best thing to do here is to simply block the key commands.
If using a front-end managed by RocketLauncher you can create AHK scripts to block the key inputs but that is beyond the scope of this tutorial.
For now the simplest thing to do is select your key input within UCR and select Block from the dropdown. This will block that specific key command and only the X-Input command will be sent so you will need to go through your profile and block each input. You can use this handy Keyboard Tester to test and ensure none of the key commands are registering.
Please remember this is blocking those specific key inputs so if you’re setting up an arcade joystick and try and use your keyboard with the profile active those keys will not register. Your keyboard is not broken, you’re just blocking the input so either close the program or make a different profile active.
Tip — If you have excess button(s) on your control setup that aren’t assigned but you still want to block the key input simply add a Button to Button plugin for each excess button and set that key as the Input while leaving the Output blank. Then just select Block from the dropdown. This will block those key commands without having to have an associated output.
Profile’s are stored in the UCR.ini file so I’ll leave a link to a gist with a two player profile specifically tailored for the X-Arcade Tankstick series of joysticks. This could also serve as a profile for Ultimarc’s iPac series with a little modification as the default keybindings are nearly identical. Or it can simply serve as a reference if you get lost along the way. Just beware, if you’re going to replace your UCR.ini make sure to back your copy up if necessary otherwise you will lose your profile!
That about wraps this tutorial up. I hope you have found it useful!
As promised, here is a link to the two player X-Arcade UCR Profile.
Next I’ll be looking at automating the process of launching UCR with our profile loaded from RocketLauncher. So if you use a front-end that utilizes RocketLauncher be sure to check it out.