You need help. Admit it.

Learn how to configure input devices, output drivers, macros and curves. It's all here.

ControlMyJoystick support illustration
Inevitable AI-generated image. At least he only has two arms this time.

Compatible with

64 bit version of Windows 7, 8, 8.1, 10 or 11

We Are

Tetherscript Technology Corporation
Saskatchewan, Canada
Since 2011

Installation

Free 14-Day Trial

Is the free trial fully functional?

Yes. All functions are enabled and you can try everything including creating and modifying profiles, macros and scripts and using voice commands, joysticks and 3Dconnexion controllers. The trial will function for 14 days after it first ran.

I have the trial and now I have purchased a product key.  What do I do now?

Run the trial software again and you will be prompted the enter the product key.  Enter it, and presto!  Your trial version is now fully registered.

Hardware Requirements

  • An optional microphone suitable for gaming.
  • An optional 3Dxconnexion controller.
  • An optional Joystick.
  • 50 MB hard drive space .

Generally speaking, if you can run your game on your PC, it is more than adequate for ControlMyJoystick.

Installing

Where can I download the installation file?

You can get the official 14-day trial installer from this website.  Don t get it from anywhere else as it will not be the official, unaltered release.

Is the file safe?

Yes. It has been scanned by VirusTotal, which uses 60 different virus scanners. You can confirm this by uploading the file to www.virustotal.com and they will scan it for free. Some antivirus apps may give warnings because this is a new installation file, and it has not been downloaded by many people yet. These are typically reputation warnings. The installation file has been digitally signed by the developer of ControlMyJoystick, Tetherscript Technology Corporation.

What does it install?

It will install files in the folder you specify, as well as ControlMyJoystick's user-mode (not kernel-mode) virtual joystick, mouse and keyboard drivers.

Do I need to install it as Admin?

Yes, because it install the virtual joystick, mouse and keyboard drivers.

How do I reinstall the virtual drivers?

You must uninstall/reinstall ControlMyJoystick, or use the install batch files in the /drivers folder where you installed ControlMyjoystick.

How do I back up my profiles before I uninstall?

Right-click on the profile list and select Export or Export All . Each profile will be saved as a .cmj file. You can import these files into ControlMyJoystick using the Import function.

If you have version 5.0 or 5.1, you can copy your .cmjson files to another location using Windows Explorer.

Video: https://www.youtube.com/watch?v=9SiJVODfw-M

Release Notes

5.5.78.50 Final February 12, 2023 (Current Version)

1) Updated app and driver certificates.
2) Minor UI fixes.

5.5.54.40 Final December 1, 2020

1) Updated the way you set themes and removed some old themes that could cause errors.
2) Removed the News tab.  We just didn’t like the concept of it dialing out to get the ‘latest updates’ .txt file every now and then.
3) Added support for relative mouse movement script actions.  This includes the installation of the new relative mouse driver.
4) Fixed a bug where when you attempted to bind an output/joystick axis it would also send a Hat0 buttonpress to the joystick driver. Now it no longer sends that keypress.
5) Changed the ‘enable profile target’ control to a simple checkbox along with some explanatory verbage.

5.4.17.80 Final June 9, 2020

1) Now when CMJ starts, the controlmyjoystick.xml DxWare profile is copied with a forced overwrite.  Sometimes on Steam installs, this would fail, leaving DxWare behaving oddly.

5.4.17.79 June 3, 2020

  • An attempt to fix the ‘Device cannot be opened’ and ‘Device cannot be identified’ crash bugs.
  • Tweaked the bug reporting dialog so now the bug report is automatically copied to your clipboard.  An email address is shown in the dialog to send the bug report to (just paste it into the email).  You can also send it via the feedback form in the ControlMyJoystick support webpage.
  • Changed to profiles to recommend using Wordpad instead of Notepad.  We now recommend using Wordpad instead of Notepad for keystroke testing.  This is because Notepad has been changing with recent Win10 releases and causing problems.  Recent versions of Notepad will change the Notepad titlebar text to prefix it with an asterisk* when it has been edited, which invalidates the CMJ profile target and for some reason eats some keystrokes, often leaving you with a repeating keydown action.  Wordpad doesn’t do this, which makes it easier to test.

5.3.45.89 January 6, 2020

  • Fixed crash you get when you press a joystick button if you don’t have a 3dConnexion device installed.
  • Now when you click on the Curve Presets button, it no longer resets the curve.
  • Now the keyboard driver is reset on CMJ startup.
  • Updated support for most recent 3dconnexion devices.
  • Added extra delay on CMJ shutdown so that it has more time to release HID devices and speech recognition interfaces.
  • Fixed crash encountered if you click on the registration splash screen Close button.
  • Binding an output axis when a voice prefix has been set now works.

5.1.65.80 April 12 2019

IMPORTANT - Make sure you export your profiles as .cmj files from your earlier version of ControlMyJoystick. In more recent versions, this was done automatically on shutdown. You should find them at: C:\Users\YourName\Documents\ControlMyJoystick. You will need to import these into ControlMyJoystick.

If you have a newer version that has .cmjson files, copy these
somewhere as a backup. If you leave them where they are, the new
version will auto-convert these profiles as they are used. But just to
be safe, backup up your old .cmjson files!

This is by far the largest feature update since ControlMyJoystick was launched around five years ago. Where to start?

  • FREE UPGRADE for registered users. Just use your Product Key and you are good to go.
  • INSTALLATION - You must uninstall previous versions of ControlMyJoystick, so be sure to backup your profiles somewhere as they can be imported into the new version. The reason for the uninstall is that new drivers will be installed with the new version that cannot be used by the previous version. Also, previous versions cannot use the new drivers. If you installed over top of the old version, the new drivers should replace the old drivers and the new version should work, but the old version will not work properly.
  • IMPORTANT Make sure you export your profiles as .cmj files from your earlier version of ControlMyJoystick. In more recent versions, this was done automatically on shutdown. You should find them at: C:\Users\YourName\Documents\ControlMyJoystick. You will need to import these into ControlMyJoystick.
  • Update your 3DxWare10 version to 10.5.5 or higher if you are using a DxWare device.

LOTS OF NEW FEATURES

  • You can now accept input from one or more physical joystick devices and apply the usual smoothing and curves. This is in addition to the existing DxWare device input.
  • You can now map the various buttons and axis from physical joystick and DxWare inputs to the output virtual joystick driver axis and buttons.
  • Added a VIRTUAL KEYBOARD DRIVER, which is way more reliable then the old SendInput method. You can still use SendInput, but after you use the driver, you won t want to. This emulates a physical keyboard and it can do tons of stuff. Note: We don t read keystrokes from the keyboard driver. We only send data to the driver so that it can appear as physical keystrokes.
  • Added a VIRTUAL MOUSE DRIVER, which is also more reliable than the old SendInput methods.
  • Refined how you bind output axis and made it more likely to be seen by games.
  • Greatly reduced CPU usage.

Note: For most output to be received by a target
app(like a game), you need to set a profile target and enable it.
Right-click on the profile picklist for this option, or use the status
bar.
Note: There is an import function to import
older .cmj profiles. If you are using .cmjson files, these will
upgraded automatically when you first select them in the profile
picklist.

USER INTERFACE

  • You will notice new Input and Output tabs. In the Input tabs you set which DxWare or physical joystick devices you will accept input from. In the Output tab, you will map those inputs to the output virtual joystick driver.
  • Axis and button gauges for input devices now show curve alignment and the raw and curved values.
  • Added a statusbar at the bottom of the screen to show whether or not profile targeting is enabled, the delay, and the target.
  • Now if you add the three characters [!] at the end of a macro name, only one instance of this macro can run concurrently. This is useful for longer macros that you don t want to accidentally trigger again before it has finished running.
  • Added keyboard driver editor dialog buttons ( Edit... ) to the curve digital joystick dialog so now it easier to compose scroll commands.
  • Added on profile targets enabled switch to the statusbar so you no longer have to go to the menu to enable/disable targeting. Removed the ability to enabled/disable this from the menus. It is not profile-specific, so it didn t really belong in the profile menu. This setting is used for all profiles.
  • You can now toggle the enabled/disabled state of macros, triggers and scripts by selecting a row in the grid and pressing the spacebar on the keyboard.
  • Tweaked the profile target functionality so now you can set the delay that occurs immediately after the target app is activated. This delay is set in the profile target edit window, and is used to give the target window enough time to become active. A small and simple window like Notepad may only take 10ms, but a larger running game window may take 50ms or more before it is ready to accept commands from CMJ.
  • Now if you hold down the keyboard shift key when starting ControlMyJoystick, it will launch with profile targets, voice and DxWare disabled as well as reset the layout to 1024 720 on the main monitor.

SCRIPTS

  • Added a Reset Drivers item.
  • Nested scripts now work properly.
  • In the new Keyboard (Driver) option, all DOWN_UP, DOWN and UP keystrokes are done in the same dialog. You can also enter text and press the Test button to send it to the targeted app.

TRIGGERS

  • You can now receive triggers from physical joystick devices as well as DxWare devices. It is very customizable - you can literally do a device button combo by pressing buttons across different input devices if you wanted to.
  • You can now have cross-device button combinations as a trigger. Think pressing button one on this joystick, button two on that joystick, and the Fit button on a DxWare controller to trigger a macro. We re sure someone will find a good use for this.

CURVES

  • You can now apply smoothing and curves to input joysticks.
  • In the Digital Joystick option, you can now specify one or more keystrokes, so it should be possible to do something like CTRL-F7 or something like that instead of a single key. To experiment with the keystrokes needed for your game, try launching the keystroke editor from the Output/Keyboard tab and experiment there.
  • You can now use the Prev and Next buttons to change the current axis instead of having to close the curve dialog.
  • There is now the concept of curve alignment when editing a joystick curve. Axis curves that spring back to center should be set to Center alignment. Use Left or right alignment for joystick slider and dials. Yes, you can now curve a throttle axis!
  • There are now more curve presets to choose from.
  • You can now run a script triggered by axis movement. It s kind of like Digital WASD, but with macros. See the new Tutorial 16 - Digital Controller Axis Triggers for a demo.

SECURITY

  • We never have and never will use hooks to read mouse and keyboard output. We don t monitor your keyboard. Period.
  • Our drivers or fully cross-signed, legitimate drivers that we have developed in-house for use with ControlMyJoystick. No reduction of Windows security is required to install these drivers.
  • Because the keyboard driver is so flexible, be careful when running scripts that you gotten from someone else. You can literally launch a command line or web browser and type stuff in and do pretty well anything you can do with a physical keyboard. So, never run an unknown without reviewing it first.

WHAT IT DOESN T HAVE

  • ControlMyJoystick does not have a way to read memory or screen pixels, or relay axis and button data from a third party app to the ControlMyJoystick virtual drivers. This kind of functionality is typically used by cheat-bots and we do not condone this use, or provide a way to do so.

VIRTUAL JOYSTICK DRIVER

  • You can view the driver output in the Output/Joystick tab.
  • Dial, Slider, Wheel and Hat Switches are now supported.
  • You can now map input axis and buttons to the output joystick driver axis and buttons. By default it is mapped to DxWare, but if you double-click on an axis you can remap it to something else.

VIRTUAL MOUSE DRIVER

  • You can set absolute desktop cursor positions. Try this in the Output/Mouse tab. You can enter the coordinates and see where the mouse goes. You can also use a voice command to dump the current x,y coordinates to the mouse log so that you can use the coords later in a script (think navigating menus).
  • You can no longer set relative mouse positions. You must use absolute. Relative really wasn t too useful as you could never set where to start the relative movement.
  • This driver is far more reliable than the old SendInput message we used in previous versions.

VIRTUAL KEYBOARD DRIVER

  • This driver is far more reliable than the old SendInput message we used in previous versions. We still haven t seen it fail to press a key in an app that could be pressed with a physical keyboard. SendInput failed quite often, depending on how the game devs restricted external inputs.
  • If you send a key DN (down) to the driver, you better follow it up with an UP for the same key. If you don t, the key will remain stuck, just like someone is still pressing the key on a physical keyboard. You can kill this stuck key by shutting down ControlMyJoystick. Best to review your Alt-Tab and Alt-F4 skills for killing ControlMyJoystick should this happen. Wear it as a badge of experimental honor.

JOYSTICK BUTTONS

  • There used to be a list of output joystick buttons that you assigned names to. This has been removed as it is no longer required.

BUG FIXES

  • Removed the particular theme that could cause a crash when selected.
  • Now when you double-click on the upper-right-hand corner x to shut down the app, it doesn t crash.
  • Nested scripts now work.
  • Fixed bug when some dialogs would appear underneath the main window when Stay On Top was enabled, making it look like the app had crashed.
  • Fixed odd placement and scaling of dialogs.
  • Reduced the number of words stored in the speech recognition dictionary, which will make recognition a bit more accurate.
  • Fixed bug that could occur when bringing up the Profile Target dialog if there was an app running with a title of greater than 256 chars in length.
  • Removed duplicates from Profile Target dialog.
  • Fixed bug that could prevent a script commands MACRO_SYNC and MACRO_ASYNC from running properly.
  • Fixed a bug where a keystrokes could be sent to CMJ if the target app is not available.
  • Fixed a bug where sometimes macro s would appear in the macros activity list even if they were no longer running.
  • Fixed a bug where if you duplicated a macro, it would not select the newly duplicated macro.
  • Reduced the likelyhood of a crash due to switching themes too fast.
  • Increased the volume of the beep.wav file.
  • Fixed duplicate cmjson file created when renaming a profile then editing and saving profile notes.
  • Tweaked how mouse movements and button presses works in scripts. See the new Tutorial 15 - Draw an X in Microsoft Paint for a demo.
  • Many other small fixes. A bunch, really.


5.0.6.24 January 22, 2019
IMPORTANT - Make sure
you export your profiles as .cmj files from your earlier version of
ControlMyJoystick. In more recent versions, this was done automatically
on shutdown. You should find them at:
C:\Users\YourName\Documents\ControlMyJoystick. You will need to import
these into ControlMyJoystick.

Note: This is a free upgrade. Your 4.x existing product key will work fine on this version.
Note: Update your 3DxWare10 version to 10.5.5 or higher.

This is a fairly large code rewrite. The GUI was been heavily tweaked
and the method of storing profiles has changed from a database to JSON
files. This will make it easier to maintain and add new features in the
future. If you have exported your existing profiles to .cmj files, you
can go to the new version s Profile menu/import and import them.

GENERAL
- Several tutorial profiles have been included. Yes. Finally.
- Controller button names are now shown in more readable form ( Fit instead of VK_FIT ).
- The triggers and script grids have been moved to tabs.

SIDEBAR
- Changed the UI to a tabbed interface for easier navigation and expandibility in the future.
- Changed the Threads grid to Running Macros and included it in the new Log tab.
- Logs can now be auto-backed up to the PublicDocuments/ControlMyJoystick/Logs folder. This is enabled by default.
-
3DXWare - The axis indicator gauges now show the raw axis position data
on the top, and the curve-adjusted position data on the bottom. This
allows you to see the effects of curves. By default, curves are flat so
you won t see a difference between raw and curved positions until you
modify the curve.
- 3DXWare - Curves now have an additional 4
controlpoints for better granularity, for a total of 21 (10 on either
side of center).
- 3DXWare - Curve editor has been replace with a much better UI.
- 3DXWare - Curve editor now has the digital controls on the editor form instead of spawning a separate form.
- 3DXWare - You can now create a new default curve group.
-
There is now a News tab that will show any new ControlMyJoystick news
such as new versions, etc. This checks for new news once every 30 days.

PROFILES
- Added the ability to include notes. This can be used to explain how to set up the game to use the profile.
-
Profiles now are stored as .cmjson files which are different format
from the previous .cmj files. Previous versions of ControlMyJoystick
used a Firebird database to store profiles, but this has been removed
and all profiles are now stored in JSON format in the
PublicDocuments/ControlMyJoystick/Profiles folder. This has resulted in
slightly faster performance and less code complexity.
- You can now launch Windows Explorer to view the profile folder.
- Profile backups on shutdown are enabled by default and stored in the PublicDocuments/ControlMyJoystick/Profiles/Backup folder.

TRIGGERS
- The triggers are now displayed in a more readable form.
- You can now export the trigger summary as .csv so that you can print out reference cards etc in an external app (like excel).

SCRIPTS
- The script command lines are now displayed in a more readable form.
- You can now add a "Comment" script item for documenting your script.
-
You can now add a "Change Profile" script item for making another
profile active. This allows you to break your macros, joystick buttons
and curve settings across more than one profile for the same game. So
you could have GameName - Flight Mode and GameName - FPS Mode or
something like that.
- Bugfix: Syncronous Macro s now work.
- You can now use as many nested and sub-nested syncronous and non-syncronous macros as you want.

4.4.2.49 November 11 2018 (current release)
Note: Update your 3DxWare10 version to 10.5.5 or higher.
-
Renamed the Output menu item to Joystick and submenu items for binding
Joystick driver axis and buttons. You need to ensure that you have
enabled profile targeting and set a target for the current profile. This
is an alternate method to the microphone method of binding, which you
can still do if you want to.
- Tweaked the UI in the left sidebar to make it easier to manage profiles.
- Added Tap sensitivity and min and max time between taps to the DxWare configuration screen.
-
Added a app shutdown progress indicator to let you know to wait, since
shutting down speech recognition can take a while to uninitialize.
-
An automatic app shutdown now occurs if you change the settings in the
voice configuration dialog. You will need to restart the app. This is
done to ensure proper handling of the speech recognition engine.
- Reduced the delay that could occur when switching between profiles while voice is enabled.
- Fixed a Device cannot be opened error that some users encountered.
-
You can now disable the DxWare setup commands via checkbox in the voice
tab. Disabling the setup commands when they are no longer needed will
increase the voice recognition accuracy and speed.
- Fixed the Joystick button Test menu item so that it now actually sends the simulated joystick button press to the driver.
- Added detailed error logging for 3DxWare.

4.3.0.14 March 1 2018
Note: Update your 3DxWare10 version to 10.5.5 or higher.
- Fixed bug where you would get a Error reading ttcSAPI541.Microphones.Strings error.
- Fixed bug where digital joystick character assigments would not be imported correctly.
- Fixed bug where the digital joystick would emit a character stream immediately after switching profiles.
- Fixed bug where the user interface would be scaled poorly on high-dpi monitors with Windows scaling greater than 100%.
- Removed the x0.00, x1.00, x3.00 labels from the curve editor.
- Tweaked the theme setup window to make it easier to browse the available themes.
- Removed the configurable user interface scaling options. It now scales automatically.
- Updated to the latest code-signing certificate.

4.2.1.35 Jan 11, 2018
Note: Update your 3DxWare10 version to 10.5.4 or higher.
-
Profiles are now automatically exported to the
MyDocuments/ControlMyJoystick upon app exit. The profile filenames do
not have a timestamp, so this is not a full history of changes to the
profile, but rather a snapshot of the most recent changes.
- Fixed crash that occurred when you double-clicked on the application close button X in titlebar to shutdown the app.
-
Added a Demo mode for Steam releases. Steam Demo s are restricted to a
maximum of two macros per profile and the profile import function is
disabled.

4.1.61.97 Dec 15, 2017
Note: Update your 3DxWare10 version to 10.5.4 or higher.
- Updated the ControlMyJoystick.xml that is installed to reflect changes in 3DxWare 10.5.4.
- Fixed bug that prevented you from having more than one left-panel open at the same time.
- 3DxWare is now enabled by default. If no controller is found the app runs normally.

4.1.20.20 Dec 4, 2017  (Current Release)
- Fixed bug that could give a cannot find drive e: error on startup on some computers.
- Now when the app starts the ui no longer briefly flickers white.
- Now when you change the UI scaling in the view menu you will need to restart ControlMyJoystick for the changes to take effect.
- Changed name of app to ControlMyJoystick from Testerx so that it is displayed correctly in 3dconnexion utilities.

4.1.20.18 Nov 25, 2017
- Fixed a bug that would give error Device cannot be identified on app startup.

4.1.20.17 Nov 22, 2017
-
Added additional bug reporting functions so that you can email an
automatically generated bug report to us for troubleshooting purposes.
- Changed the menu item Help/Online Manual to Help/Knowledge Base so that it points to the new ControlMyJoystick website.
- Fixed hang that occurred when application is set to stay on top and you go to the help menu and un-register the product key.

4.1.19.65 Aug 24 2017
- Changed voice threshold default from 92 to 70 to allow better recognition for non-english languages.
- The voice command list is now automatically updated when you add a voice trigger.
- Added the W and w key to the Editing Digital axis negative and positive key dropdownlists.
- Reduced delay encountered when switching to a different profile with voice activated.

4.0.5.91 July 17 2017
-
Added TCP/IP Triggers.  This allows you to connect to ControlMyJoystick
with a TCP/IP app and receive a list of TCP/IP triggers for the
selected profile.  You can then send commands back to fire the triggers.
- Added a TCP/IP remote utility that can be launched from the tools
menu.  It connects to your TCP/IP trigger server and displays the
triggers as buttons.  When you click on one of those buttons, the
trigger is fired in ControlMyJoystick.
- Fixed a bug where the registration splash screen would remain hidden
behind the main screen if stay on top was enabled and the app was still
in evaluation mode.
- You can now create a folder from the export profile dialog.

4.0.4.67 Jun 30 2017
- The full app version is now displayed on the titlebar.
- Exporting and backing up profiles now checks whether the save-to path
is valid and tries to re-create the directory if it is missing.
- Fixed a a bug where an exported profile could cause the script to be saved in the wrong sequence.
- You can now duplicate a macro along with it s triggers and scripts.
- You can now automatically switch to the game when sending control
inputs to it.  This allows you to run a game in windowed mode and when
necessary, use another app (browser, email etc).  When you execute a
macro or move the 3Dconnexion controller, the target window will be made
active before the commands are sent to the game.  This eliminates the
need to click on the game again before sending ControlMyJoystick
commands and axis data to the game.  It s great if you need to
multi-task on multiple monitors when gaming.  In the profile menu,
select Edit Target and select the game window title in the list.  You
can enable targeting for all profiles by checking the Enable Targets
in the profile menu.
- You can
now mute voice commands with a controller keypress.  This is useful if
you don t use a voice prefix and don t want a regular conversation to
accidentally trigger a macro.  You can configure this in the Input/Voice
menu.  When muted, a large red Voice Muted banner is displayed above
the macro list.
- The log now only shows the most recent 500 lines.

4.0.3.15 Jun 29 2017
- Fixed a bug that happened when you clicked on the Macro run button, which would not run the macro.
- Added a Trigger Summary panel on the sidebar which shows a quick reference command reference for your macros.
- You can now export one or more profiles to a .cmj file format.  Use
this as a way to back up or share your profiles with other users.
- You can now import one or more .cmj files.  Use this as a way to restore backed-up or shared profiles.
- You now set up an automated profile backup which occurs when shutting
down the app.  Check out Backup under the profiles menu.
- Added a way to select a microphone in the voice configuration screen.
- You can now send special characters in digital joystick mode like right arrow keys etc.

4.0.2.56 Jun 18 2017
- Fixed a bug where the digital joystick TX, TY and TZ axis would not respond to inputs.
- Fixed a bug where the digital joystick would not respond on the RY axis if the RX digital was not enabled.
- The full version and build number is now shown on the app titlebar.
- The full version is now stored along with the profile in the database for a future import/export function.

4.0.2.17 June 8, 2017
- Fixed a bug where sometimes you could not clear the WASD configuration.

4.0.2.0 June 7, 2017
-
Added WASD support for 3Dconnexion controllers.  This allows you to use
the controller as a digital joystick.  Configure it by clicking the new
Digital... button in the curve editor.

4.0.1.37 June 5, 2017
-
Fixed bug that would cause a slowdown when adding new macros or
deleting existing macros. The delay was caused by the resetting of the
speech engine.

4.0.1.35 June 4, 2017
- Fixed bug that caused the pause script command not to work if the computer has been up for more than 15 days.
- Fixed bug that caused the voice config screen disable system commands
and test mode checkbox settings to not be remembered properly.

4.0.1.33 June 3, 2017
- Fixed bug that cause some script commands to be enabled when a macro did not exist.
- Added a resizer area on the lower-right hand corner of the screen to make screen resizing easier.
- Enabled the snap-to functionality of the main window so that it will snap to the monitor edge.
- Fixed bug that caused the joystick panel axis positions to not update unless the 3DxWare panel was also open.

4.0 - Released May 20, 2017
This
upgrade adds support for the SpaceMouse Pro and Enterprise, use of
controller buttons and UDP triggers, and the sending of mouse and
keyboard commands via script, along with many new script commands.

USER INTERFACE
- You can now scale the user interface from 100%, 125% and 150% in the view menu.
- You can now change the theme brightness.
- You can now set the the app to stay on top.
- You can now launch a magnifier to be able to see small UI details.
- Replaced the tab-based UI with a sidebar-based one.

3DXWARE CONTROLLERS
- Be sure to update to the most recent version of 3DxWare.
- You can now use the SpaceMouse Pro and Enterprise in addition to the previously supported Navigator.
- You can now map any button on the controllers as a trigger.
- You can now enable smoothing to reduce the jitters caused by your hand.
- You can now specify a curve preset for each axis.
- You can now switch between curve groups with voice commands and controller buttons.

PROFILES
- You can now duplicate an existing profile.
- You can now see which macros are running and can terminate one or all of them.
- You can now use voice, controller button up/down/updown states and remote UDP commands as triggers.
- You can now do the following script commands:
- Joystick Button down/up/downup
- Keyboard button down/up/downup
- Mouse button down/up/downup
- Pause (for x milliseconds)
- Play Sound (.wav files)
- Set Axis Curve Group (landing, combat etc)
- Loops (for x iterations)
- Launch other macros (synchronous and asynchronous)
- Run a file (a batch file perhaps)
- Send data via UDP (to another app)
- Stop running all macros
- Move the mouse cursor

TOOLS
- Added app for testing the SEND_UDP script command.
- Added app for testing the UDP trigger.

Version 3.2.0.6 Released January 3, 2015
Bug: Fonts in dialogs for inputting names, values are too small.  *Fixed.
Request: Now enables/disables the axis labels in the driver status panel when translation/rotation is enabled/disabled.
Request: Added voice command to reset buttons only.
Request: You can now have more than one axis mode configurations, each
with it s own voice command. So you can now have a set of curves for
landing, and another set for regular flight, etc.
Request: You can now copy a curve to another curve.
Request: You can now navigate to all six axis within the axis screen,
so you don t need to close the screen before selecting a different axis.
Bug: Sometimes buttons remain pressed, as shown on the driver status display. *Fixed.
Request: Removed the user interface buttons from the profiles and
button lists. You can now access those functions via right-click menu.
Request: You can no longer delete the last profile.  If you do, it will create a default profile.

Version 3.1.0.27 Released December 23, 2014
BUG:
Add(button) to Script button not working.  Fixed.  This has been
removed.  You can now add the currently selected button to the script
with the Add button in the script panel.
BUG: Can t add a button to an existing script.  Fixed . You can now add
the currently selected button to the script with the Add button in
the script panel.
BUG: Language accents not recognized by speech recognition. Fixed.
BUG: BUTTON_UP and BUTTON_DOWN commands toggle the button state, but they should not. Fixed.
REQUEST: Need a way to temporarily reduce or increase axis sensitivity.
  Fixed: Added a Axis Sensitivity Low voice command to set
sensitivity at 30% of the curve.   Added a Axis Sensitivity Normal
voice command to set sensitivity at 100% of the curve.       Added a
Axis Sensitivity High voice command to set sensitivity at 200%% of the
curve.
REQUEST: Add script
command to play mp3 or wav.  Fixed.  You can now add a sound (mp3 or
wav) as a script command with the Add button in the script panel.
REQUEST: Need to be able to toggle a button.  Fixed.  A new script
button state BUTTON_TOGGLE has been added.  Just double-click on the
button script command to change the state.

Version 3.0.0.537 Released December 17, 2014
This is the initial public release of ControlMyJoystick.
Some tips:
1) After startup, go to the setup tab and select a suitable skin.
2) Go to the help tab and read the help.
3) Study the included profile for Elite: Dangerous.
4) Watch the tutorial videos on the website.
Then make your own profiles, and have fun!

Purchasing and Support

Licensing

How does the licensing work?

Your product key grants the purchaser of the key a perpetual license for ControlMyJoystick version 5.x. This key can be used on subsequent upgrades to version 5 (ex. 5.1, 5.2, 5.3, 5.4, 5.5, 5.6 etc) and can be used on up to three computers owned by the purchaser. So if you have a laptop, notebook and a desktop, you can use the same key on all three computers.

Can I transfer, give or sell the product key to someone other than the purchaser?

No.

Is it a subscription?

No.  The product key does not expire and you do not need to pay additional fees to continue using the software.


Product Keys

What is a product key?

You need to purchase a product key to unlock the 14-day trial version. When it is unlocked, it no longer has the 14-day limit and all functions are fully enabled. You can use the same product key on up to three computers that you own.

How do I purchase ControlMyJoystick?

You can easily order through our secure online store, which is hosted by FastSpring, our reliable and secure eCommerce provider located in California, USA.

What do I receive?

When you purchase ControlMyJoystick, you will receive a Product Key via email within minutes of your order. The product key will also be displayed on the order screen.

What payment methods do you accept?

The payment methods available vary depending on which country you are in when you order. Options include:

  • PayPal
  • Visa, Mastercard, Discover, Amex and JCB credit cards
  • Bank/Wire Transfers
  • Amazon Payments
  • Purchase Orders

I ordered but I did not receive a product key.  Where is it?

Check your spam and junk folders. Allow up to 15 minutes for key delivery by email. If you did not receive it, it could be that you used an incorrect email address while ordering. Contact our support and we will send you the key.

Is there a Money-Back Guarantee?

Yes. If, within 60 days of your purchase you are not satisfied, we will refund your purchase. We only ask that you give us a chance to resolve any issues you have with the software first.

Requesting Support

I have a question.  Who do I ask?

We are happy to answer any questions, bug reports or observations you may have. Just email us at the address listed near the top of this page in the Contact Us section. You don't need to create an account or have purchased the software to create a support ticket. When we respond to your ticket via email.

We also have a community forum where you can ask your question or search for answers.

What do I need to include?

Be sure to be specific as possible, and if you are experiencing problems with the software, include your operating system (ex. Win10 64 bit), hardware info (ex. laptop with a SpaceNavigator). Tell us your ControlMyJoystick version (it is displayed on the titlebar at the top of the ControlMyJoystick screen), and whatever details you can. The more info you provide, the better we can assist you.

Overview

3Dconnexion Controllers

What are these controllers?

3Dconnexion creates six-degrees-of-freedom controllers for the CAD and graphics industry. They are widely used by engineers and designers because the controllers allow them to easily navigate 3D space in their favorite CAD programs. These are solidly built and very accurate. They are not a cheap joystick-like controller, that s for sure. The accuracy and solid build makes these controllers excellent for gaming.


3Dconnexion Website

Are you affiliated with 3Dconnexion?

No. But we support their efforts to make their controllers more accessible to developers through their excellent SDK and support. We don t sell controllers either. We just enjoy using them.

Do I require a 3Dconnexion controller to use ControlMyJoystick?

No.

Which controllers are supported?

You can use any controller which is supported by 3Dconnexion s 3DxWare10 software. Here is the list:

  • SpaceMouse Enterprise
  • SpacePilot Pro
  • SpaceMouse Pro Wireless
  • SpaceMouse Pro
  • SpaceMouse Wireless
  • SpaceMouse Compact
  • SpaceNavigator for Notebooks
  • SpaceNavigator

Video: https://www.youtube.com/watch?v=TNrG1mvebZI

Video: https://www.youtube.com/watch?v=4xJSTrZt1o8

Usage

You can optionally use a 3Dconnexion controller as a source of triggers and axis data. They have been selling these for years for use with CAD and other 3D design apps, and they are really nice to use for games - especially where six degrees of freedom is needed: up/down/right/left/forward/backward plus rotation around all axis. Let s take a look at what is involved with getting these controllers to work with ControlMyJoystick and games. From here on it, we ll refer to them as controllers .

Prerequisites

You must install the 3DxWare driver software, which is available from the 3Dconnexion website. This software has some good practice apps so you can get to a feel of how to use the controller. It also has a Menu app that pops up when you press certain button on the controller. This Menu app can be used to configure the controller for use with an application. You tweak axis orientation and sensitivities and remap the buttons to perform different actions.

XML Files

For each app you are running when you open the Menu, the Menu app will use an existing .xml from this folder:

C:\Program Files\3Dconnexion\3DxWare\3DxWinCore64\Cfg
or it doesn t exist, a new .xml file will be created in:

C:\Users\UserName\AppData\Roaming\3Dconnexion\3DxWare\Cfg

If you go to a game and use the controller and it s Menu app, it will create a new .xml file if it does not already exist. Take a look at the .xml file and you will see definitions for axis sensitivities, button mapping and more. You can manually edit the .xml file or use the Menu app to modify the settings in the file.

Getting it to work without ControlMyJoystick

3DxWare installs a 3DConnexion KMJ driver (Keyboard, Mouse, Joystick). This allows the controller to emulate a keyboard, mouse and joystick. You can see it working if you use the Chrome browser and find that you can scroll with the controller. It is reading the Chrome.xml and sending commands to Chrome. The main limitations for using it in-game are:

  • No user-adjustable curve support or curve switching while in-game.
  • Incomplete joystick emulation.
  • No support for a proper deadzone or trim.
  • No jitter reduction (from shaky hands).
  • No way to launch macro s with buttons.
  • It really isn t meant to be used in games this way. You can get close by hacking the .xml files, but it still doesn t get you to a point where it feels like an effective controller.

Working with ControlMyJoystick

You still need to install the 3DxWare driver. And when you install ControlMyJoystick the installer will add a controlmyjoystick.xml to the following folder:
C:\Users\UserName\AppData\Roaming\3Dconnexion\3DxWare\Cfg

This controlmyjoystick.xml file holds critical configuration settings to allow it to be used as a joystick. ControlMyJoystick also allows you to:

  • Specify a sensitivity (response) curve per axis. This is done via curve presets and a drag and drop curve node screen.
  • Specify axis inversion, trim and deadzone.
  • Set an overall jitter reduction for all games.
  • Create axis curve groups so that you can have different response curves for different gaming phases, such as landing and combat. You can use a macro to switch between these axis curve groups while in-game.

The install also adds a Tetherscript Virtual Joystick driver. ControlMyJoystick will take controller axis data, apply curves to it, and then pass it through to the Tetherscript Virtual Joystick driver. Then game then needs to read the joystick axis and button data from this driver. This can be tricky because the game may be able to see both the KMJ driver as well as the Tetherscript Virtual Joystick driver.

You can either disable the KMJ driver (not a great solution, since you may want to use the controller for something else, like CAD), or you can use ControlMyJoystick s special voice-activated axis binding commands or the non-voice binding commands in the Joystick menu. This will ensure that the game is listening to the Tetherscript Virtual Joystick instead of KMJ.

Enabling 3DxWare Support

In ControlMyJoystick, go to the Input menu, and select the 3DxWare item. This will bring up a configuration screen:

  • Enabled - Check this box to allow ControlMyJoystick to communicate with the controller. This is what you will see in the log when you enable the controller.
  • Show Axis Values - Check this box to show the real controller axis values in the 3DxWare sidebar panel.
  • Smoothing - Check this box to reduce the jitter or shake that is caused by shaky hands. Since the controller puck moves very small distances physically, any amount of shake can be magnified. Using smoothing introduces a bit of controller lag, with the higher Depth values causing more lag since it goes back and averages controller axis values to the specified Depth. So a depth of five will average the last five axis values. Default value is two. You can compare the raw axis input data with the smoothed data in the curve editing screen - it will show on the bottom response indicators. One will be jittery, the other will be less jittery.
  • Tap Trigger - You can set the sensitivity and timing of tap recognition. Tapping is recognized on the controller puck Z axis only. You can use these taps as a trigger.

You’ll see the 3DxWare being initialized in the log tab as shown below:

Sidebar Panel
Try moving the controller puck and you will see the axis indicators move in the 3DxWare sidebar panel. Take notice the vertical lines showing the axis positions. It’s going to look a bit different once we set a curve for an axis.

Curve Groups
When you create a profile, a Default curve group will be created and all your curve edits will be in that group. You can rename the group, or create a new group by right-clicking in the curve group list. You can switch between groups by clicking on a curve group or by changing it with a script command. So, by using your voice or a controller button, you can change the active curve group and use different curves. This is very useful for different phases of a game, such as landing or combat. See tutorial 05 for more info.

Axis Curves
Double-click on a curve, in this example, TX (Translation along the X axis) to bring up the curve editor. This will edit the TX curve. These curves are what really makes using the 3Dconnexion controllers in games a real treat. To adjust a curve, click and drag one of the control points which is located along the curve line. You can t remove or add control points. The curve shown above is a preset available from the Curve Presents button. You can tweak this curve and you can reset it with the Reset Curve button.

Try moving the controller puck along the RX axis (move the puck from side to side or left to right). The un-curved axis data is represented by a small tick at the top of the axis indicators, and the curved data that will be sent to the virtual joystick driver is shown as a longer tick at the bottom. Try modifying a curve or invert it, and you will see how it works. You can also edit the curve while the game is running, so if, for example, an axis is too sensitive, you can bring up ControlMyJoystick and adjust the curve, then swap back to the game to test it out. No need to restart the game or ControlMyJoystick

  • Prev – Click on this to go to the previous axis.
  • Next – Click on this to go to the next axis.
  • Enabled - Check this box to enable the axis. Sometimes you ll want to disable an axis.
  • Invert - Check this box to reverse the axis values. Some games allow axis inversion, and you can do it there if necessary, or here.
  • Trim - You may have a controller that is miscalibrated and doesn t seem to return to center when you take your hand off the controller. You can set a positive or negative trim value to zero the axis value.
  • Deadzone - You can set a value here so that any movement of the controller puck within the deadzone value of center will be considered as center. Most curves will have a deadzone of some kind since that without it, the controller is just too sensitive around the center position. Setting a deadzone this way is called an non-explicit deadzone. An explicit deadzone can be achieved by setting the deadzone to zero, and then by dragging the near-center curve nodes down to zero. Either way, it s a deadzone and both techniques give the same results.
  • Digital - Use this to enable Digital Joystick emulation, where you can send keystrokes to a game when you move the controller along the axis, or launch a macro when a joystick axis movement is detected. This allows you to map a key in-game to scroll whenever the axis goes positive or negative, and to stop scrolling when it returns to zero. You can do this for each axis. This is useful for games where you need to scroll a lot (like on a map, or overhead kind of game). Users often map the WASD keys for this, and you can do the same here.
  • Digital Enabled - Enables digital joystick emulation for this curve.
  • Digital Negative - This is sent to the keyboard driver. For example, ‘[A_DN]’ simulates pressing and holding the ‘A’ key on a real physical keyboard until the axis returns to zero, or goes positive. See tutorial 09 and 16 for more info.
  • Digital Positive - This is sent to the keyboard driver. For example, ‘[D_DN]’ simulates pressing and holding the ‘D’ key on a real physical keyboard until the axis returns to zero, or goes negative. See tutorial 09 and 16 for more info.
  • Digital Edit - This brings up the keystroke editor.
  • Mirror - Check this box so that when you drag a curve controlpoint, the corresponding controlpoint on the other side of center will also move to the same value.
  • << < > >> - Use these buttons to move the entire curve up or down.
  • Reset Curve – Sets it to a flat curve where the curved data equals the raw data.
  • Curve Presets – You can select a curve type here. The centered presets are for the normal axis, while the left and right curves or for a throttle/slider.
  • Curve Presets Copy/Paste – If you go to a curve and select ‘Copy’, you can then go to another curve and select ‘Paste’ and it will overwrite the curve with the copied curve.

Adjusting the User Interface

Change the Theme

Go to the View menu, and select Themes. Select the a theme from the list and optionally adjust the hue, saturation and brightness. Clicking on Reset to Defaults returns the hue, saturation and brightness to default values. The default theme is Material Dark.

Use the Magnifier

Go to the View menu and select Magnifier. This zooms in on the area under the magnifier to make small text easier to read. To change the magnification level, or to close the magnifier, right-click on the magnifier and select from the pop-up menu.

Stay on Top

Go to the View menu and select Stay on Top. This causes ControlMyJoystick to remain visually in front of all other running applications. By default this is disabled.

Tooltips

Go to the View menu and select Tooltips to enable the short display of a UI element description. Once you are familiar with the program you can uncheck this option. By default this is checked.

Here is a video showing how to tweak the user interface.

Video: https://www.youtube.com/watch?v=pafhBVwYw_U

Architecture

ControlMyJoystick accepts triggering actions by microphone (voice commands), 3Dconnexion controller, joysticks and 3rd Party App Triggers. When a valid trigger is detected, a macro executes one or more script commands. The script commands can send keyboard keystrokes, mouse movements and button presses and joystick axis and button presses to a game. You can also send a command via network UDP to a 3rd party app.

Your physical 3Dconnexion and joystick device axis data is adjusted by user-defined curves then passed through to the Tetherscript virtual joystick driver, where the data is consumed by the game as joystick axis and button data. Scripted keyboard keystrokes, mouse position and button press data are send directly to the game Tetherscript virtual keyboard and mouse drivers.

Game Compatibility

ControlMyJoystick emulates a real joystick, keyboard and mouse. Most games will see these as real hardware devices, but some game developers may attempt to restrict access to these devices. The only way to know for sure is to try it.

Joysticks

ControlMyJoystick can take axis position data from a 3Dconnexion controller or joystick, apply a curve to it and then send it to the virtual joystick driver. 3Dconnexion also has it s own KMJ driver that is installed when you install their 3DxWare10 software for their controllers. You may also have a physical joystick a driver which uses it s own driver. So a game has three joysticks to choose from.

  • Tetherscript Virtual Controller
  • 3Dconnexion KMJ Driver
  • My RealPhysicalJoystick Driver

Some games will just default to the first available joystick and only accept input from that joystick. This happens more often on older games. Sometimes the Tetherscript Virtual Controller is not seen as the default joystick. The only way around this is to disable the drivers for all other joysticks and then restart the game.

Newer games generally allow a user to select which joystick to use. Some newer games even allow the selection of more than one joystick, so you can use one for flight controls and another joystick for throttle. These are great designs and make it very easy to use with ControlMyJoystick.

The 3Dconnexion KMJ Driver

The Keyboard, Mouse, Joystick driver that is installed with 3DxWare10 can cause problems. When you are mapping controls in-game, some games prompt you to move a joystick along an axis or press a button. These games may monitor all joystick drivers and look for the one that is emitting data.

If you are using a 3Dconnexion controller, both the KMJ driver and ControlMyJoystick s Virtual Controller driver will emit data at the same time. This may cause the game to map to the KMJ driver instead of ControlMyJoystick s virtual controller driver. If that happens, the game is listening to the wrong joystick driver and ControlMyJoystick s s curves and joystick button press scripts will not work properly.

The only workaround is to disable the KMJ driver, restart the game and then do the control mapping again. No data will be emitted from the KMJ driver and this will allow the game to see the virtual controller driver.

Keyboard

ControlMyJoystick allows a macro s script or digital joystick emulation to send keystrokes to a game using the Tetherscript Virtual Keyboard Driver. You can send text with the script command ‘Keyboard (Driver)’. If you would like to set up WASD-like controls, you can setup the keystrokes in the curve configuration screen (see tutorial 09). You can also send text with ‘Keyboard (SendInput)’, but this is more easily blocked by the game.

Some games also discriminate between upper and lower case. So, even if the in-game command to toggle the landing gear looks like a capital G , you may send a lowercase g via script command to get it to work.

As you try these keyboard script commands, you may do a DN, but forget to do an UP. This can cause your keyboard to act strangely. To fix it, just physically press and release the button on the physical keyboard.

Best to try outputting keystrokes to Notepad to see how it works. Be sure to enable profile targeting and set Notepad as the target.

Mouse

ControlMyJoystick allows a macro s script to send mouse button presses and axis position data to a game using the Tetherscript Virtual Mouse driver. The mouse script commands are ‘Move Mouse (Driver)’. You can set the mouse coordinates and set mouse button clicks with this script command. To experiment with the coordinate system, check out the Output/mouse tab and try moving the mouse to various coordinates. Be sure to check out tutorial 15 to see how to draw an ‘X’ in Microsoft Paint.

As you try these mouse script commands, you may do a Button Down, but forget to do a Button Up. This can cause your mouse to act strangely. The fix it, just physically press and release the button on the physical mouse.

Voice Commands

How does it work?

ControlMyJoystick s voice control uses Microsoft s built-in Speech Recognition to recognize your words spoken through a microphone. Once a valid word or phrase is recognized, you can have ControlMyJoystick run a macro that can sends keyboard, joystick or mouse commands to a game. For example, you could have a voice command of Landing Gear that, when spoken, causes the landing gear to deploy in-game.

What kind of microphone do I need?

Use a good quality microphone. The microphone you would use for in-game voice chat would work just fine.

How do I prevent normal conversations from triggering a voice command?

You can specify a voice command prefix. For example, you can set the prefix to computer or a word of your choice and then when you wanted to activate the landing gear, you could say Computer Landing Gear .

You can also set the the threshold setting in the Voice Configuration screen to make it more accurate. A threshold of zero reduces recognition accuracy, while a threshold of 94 is the maximum accuracy, although the max useful threshold will vary, depending on the microphone, voice characteristics and language. So start at zero and experiment with higher values until you get the max accuracy.

In the Voice Configuration screen, you can set a 3Dconnexion controller button to enable/disable recognition for when you know that you do not want recognition active.

How can I achieve the highest voice recognition accuracy?

You need to go through the Microsoft Speech Recognition setup and training. This critical step is needed to ensure the best accuracy. After a while, it will get more and more accurate as you use it more.

Do I need to use voice commands?

ControlMyJoystick is really meant to be used with voice commands, and optionally a 3Dconnexion controller or joystick. You can use voice commands to bind the 3Dconnexion controller in most games, and you can also bind by using the Output/Joystick menu.

How to Configure Voice Commands

  • Get a good microphone - A good quality microphone will always give better speech recognition results. That said, I have used some cheap-ish smartphone earbuds with a built-in microphone on the cord, and it worked pretty well. So give the microphone you already have a good try before going out and buying a new one. I personally use the earbud mic since headphones with a boom microphone is too hot in the warm days.
  • Configure your mic in Windows - Go to the Windows control panel and find where you configure the microphone. Try to get it working as good as possible.
  • Configure Microsoft Speech Recognition - You have to do this. If you don t, your words and phrases won t be consistently recognized. Once the mic is configured, the speech recognition wizard will walk you through a bunch of sentences to speak. As you speak, Windows is learning your speech patterns and nuances. It takes about 10-15 minutes to do this. It is worth doing the whole thing twice as it gets better each time.
  • Enable Voice Commands ControlMyJoystick - By default, voice commands are disabled. Go to the Input menu, and select the Voice menu item. it will open up the Voice Configuration screen as shown below:
  • Microphone - Select the microphone you want to use. You will need to restart ControlMyJoystick after selecting a different Microphone.
  • Language - Select the speech recognition language to use. This needs to be the same language that you have trained your Windows Speech Recognition to recognize.
  • Threshold - Determines how much recognition accuracy is required before causing a voice match. A value of zero is very loose so variations on the phrase will cause false positives. The max usable value is 94 in English, but this can vary depending on the language spoken and clarity of speech and accents etc. So if you have too many false positives or it is not recognizing anything at all, start at zero and test it. Increase the threshold until you find a value that works well for your language/accent/microphone combination.
  • Set to Default - Sets the Threshold to 70, which should work for most languages.
  • Enable - Check this box to allow ControlMyJoystick to access Windows Speech Recognition. You will need to restart ControlMyJoystick for this setting to take effect.
  • Beep on Success - Check this box and a short beep will be played after each voice command that matches one of the voice commands you have configured. If a word or phrase spoken is not part of your setup, it will not beep. This is useful in games when you wonder did the computer get that last command I just spoke? .
  • Disable Setup Commands - There are some built-in voice commands that can be set up in the Commands tab. These are used to bind axis and buttons. All voice commands, including these setup commands are listed in the Voice panel in the sidebar. If you uncheck this box, the setup commands won t be listed, reducing the list length and making it look a bit cleaner.
  • Test Mode - Check this box to see for when you want to test the voice, but don t want any voice triggers to run any macro s. Some macro s can be complex and do a lot of things, so it can be a hassle if they are always running as you test the triggering commands for the macro. This setting is for all macro s.
  • Prefix - Enter a word here that you must speak before the actual voice command. If you wanted to turn on the landing lights, and you have a voice trigger with the voice command Lights , the trigger will fire anytime speech recognition hears the word lights. You could be saying, for example, I love light beer. and suddenly your ship lights turn on because the voice trigger ran the macro. You can avoid this by using a single prefix word. In this example, we have set the prefix to computer , so you would need to say computer lights for the trigger to fire and the macro to run. You can use any word here that you like, so have fun.
  • Mute - This is a 3Dconnexion controller button that you can use to toggle the recognition on and off. This is useful if you don t want your regular talking to accidentally trigger any macros.
  • Set - Brings up the screen where you can set which button(s) to use to mute recognition.
  • Commands tab – You can use these voice commands to bind and the output/joystick axis or button. You just select the axis or button, then speak the command. You can also bind without voice, by using the output/joystick menu.

Testing the Voice Commands

  1. Create a macro that has a voice trigger and simple script (like a pause). See the Script help above for more information on setting up a voice trigger.
  2. Open the Voice panel in the sidebar. This show s the microphone volume as well as a list of available voice commands. When you speak a valid voice command, the corresponding command in the list will become highlighted.
  3. Open the Log panel in the sidebar. Any valid voice commands will be logged. Invalid voice words or phrases will not be logged.
  4. Speak the command and see if it fires the macro.

Configuring Joysticks

You can use one more physical joysticks in ControlMyJoystick as a source of axis and button data. You can use this data to trigger macros or apply a curve to the axis data and send it to a game. See the video below for more info.

Video: https://www.youtube.com/watch?v=LN8DsNDYeJg

Core Concepts

Profiles

A profile is a collection of macros, curves and joystick button definitions that you have created for a specific game. You will typically have one profile per game.

When you want to play a game, you start ControlMyJoystick and then click on the game profile in the list. You can start the game before or after you have selected your profile, and you can switch to another profile while the game is running. So, for example, in the profiles list above we have DOTA 2 Normal which you may typically use. But you also have a copy of that profile with some changes. Just click on DOTA2 Tankage and you are now using that profile.

You can manage your profiles by either right-clicking in the profile list, or by clicking on the Profile menu.

  • New - Creates a new profile with default curves and no macros or joystick button definitions.
  • Rename - Renames the currently selected profile.
  • Duplicate - Copies the currently selected profile.
  • Edit Target - Set this to the game name to allow the auto-activation of the game when a macro or controller movement is detected in ControlMyJoystick. This is great when you are playing a game in a window and tend to switch to other windows to surf, do email etc. You will need to enable targeting (slider switch at the bottom of the screen), and have a valid target for most script commands to work.
  • Import - Imports a ControlMyJoystick-generated .cmj file which contains the information contained in a single profile. This file is converted to a .cmjson file, which was introduced in version 5.
  • Backup - Allows you to enable automatic profile backups which will be backed up when you shut down the program.
  • Explore - Opens up Windows Explorer in the profile storage folder and selects the profile file.
  • Delete - Removes the currently selected profile. All curves, macros and joystick button definitions for that profile will also be deleted. You cannot undo a delete.

Backing up and Importing Profiles

To back up your profiles, click on Backup and each profile will be saved as a .cmjson file. You can then later re-import these by dropping those files in the Profiles folder. You can find this folder by selecting Explore in the menu.

An Introduction to ControlMyJoystick

Video: https://www.youtube.com/watch?v=88uSHrL_T30

Macros

A profile can contain one or more macros. A macro consists of one or more script commands and one or more triggers. When the macro is triggered, the macro will run and each script command will be executed. You can run multiple macro s simultaneously and even have a macro call other macros. This allows you to create simple or complex game automation.

In the example above, you may want the Fire macro to run when you speak the voice command fire . This would execute one or more script commands that would send keystrokes, joystick button press, or mouse button presses to the game to cause the ship to fire it s weapons.

Concurrent Macro Execution
If you put an exclamation mark ‘!’ at the end of a macro name, it means that only one instance of this macro can run concurrently. This is useful if you accidentally spam a trigger that launches a macro so that you wind up with the same macro running in separate threads, giving odd results. Prevent this problem by using a !. You can see the difference in the two macro names below:


You can manage your macros by either right-clicking in the macro list, or by clicking on the Macro menu.

  • New - Creates a new macro with no triggers or script commands.
  • Rename - Renames the currently selected macro.
  • Delete - Removes the currently selected macro. All triggers and script commands will also be deleted. You cannot undo a delete.
  • Run - This simulates a triggering of the macro and causes the script commands to be executed.
  • Duplicate - Makes a copy of the selected macro and it s associated triggers and scripts.
  • Toggle Enable/Disable - Use this to enable or disable the macro. That means that a trigger won t run the macro. The Run button will still run it though.
  • Stop all running macros - Stops all macros that may still be running. You can see which macros are running in the Log tab.

Triggers

A macro can contain one or more triggers. A Trigger is something that would cause the macro to run. Examples of triggers are voice command, TCP/IP remote utility, joystick or 3Dconnexion controller keydown/keyup/keycombo or externally generated app triggers. You can manage your triggers by either right-clicking in the trigger list, or by clicking on the Trigger menu.

A macro will usually only have one trigger, but you could have more. It is possible to have the same trigger for different macros. In that event, when the trigger is detected, the first macro (listed alphabetically) will fire and the rest of the macros with the same trigger data will not. Here is an example of triggers configured to run a macro. If either one of these triggers occur, the macro will run.

  • Saying ‘test’
  • 3Dconnexion controller Fit and Menu buttons are pressed simultaneously
  • Pressing the 3Dconnexion Shift button
  • Releasing the 3Dconnexion Alt button
  • Tapping the 3Dconnexion controller button two times
  • Receiving via UDP the bytes 77AAFF
  • Receiving a button press on button ‘My Macro’ on device 1 from the Windows TCP/IP remote utility.
  • You can also use joystick buttons and TCPIP data to trigger a macro.
  • Voice - Creates a new voice trigger for the entered word or phrase. Case does not matter, so uppercase or lowercase or any combination is fine. If you have set the voice configuration to include a Prefix, you do not need to include the prefix in the voice command. So in the voice command shown above, you would need to speak test for the macro to run. Using a prefix helps reduce false voice triggers, such as may occur when you say Oh hey, how did your driving test go? . If you aren t using a prefix, you can still mute the voice input by pressing a key on the controller. It s up to you whether a prefix is better in your setup. Before you can use the voice triggers, you need to configure the Voice Configuration screen which is available from the Input menu. See the Voice Commands article for more information on how to set this up. When you add a voice trigger, you will need to enter the voice command, but without the prefix. After you have added the trigger and voice is enabled, speak the command Test into the microphone. In the Voice, Log and Activity sidebar items you will see the results of your voice command.
  • Single Button or Combo - This creates a trigger for a joystick or 3Dxconnexion controller with multiple keys pressed simultaneously. So, in the example above, pressing the Fit and Menu buttons simultaneously will cause the macro to run.
  • Single-Button Down - This creates a trigger for a joystick or 3Dxconnexion controller button press. So, in the example above, pressing the Shift button on a SpaceMouse Pro will cause the macro to run.
  • Single-Button Up - This creates a trigger for joystick or a 3Dxconnexion controller button release. So, in the example above, releasing the Right button on a SpaceMouse Pro will cause the macro to run. Be sure to enable the controller in the Input menu, 3DxWare menu item.
  • 3DxWare Taps – By tapping the 3Dconnexion device puck, you can use single, double, triple or quadruple taps as a trigger. You can set up the tap sensitivity in the Input/3DxWare setup screen.
  • External/UDP - This creates a trigger that will fire when ControlMyJoystick receives the byte $FF via network UDP on a port and bound host address that you define with the Configure UDP Trigger Server menu item. This allows you to create another app that sends $FF to the trigger server. You could put a big red button on your desk that is connected to a microcontroller, which is in turn connected to an app you have created, which will send $FF to the trigger server when the button is pressed. There is a test app in the Tools menu called UDP Trigger Sender which will send test data to the trigger server so that you can experiment to see how it works. Follow the instructions on the UDP Trigger Sender app for more information on how to set it up.
  • External/ Configure UDP Trigger Server - Here is where you set which network address and port on which the trigger server will wait for data sent to it by external apps and if the data matches the data specified in a UDP trigger, then the macro will be run. Set the Bind Address ex. address 127.0.0.1 or fe80::51f5:abd6:e19f:26cf. You may have more than one network card in your computer that you can bind to, so ensure you are using the correct one. Set the Bind Port as well. Be sure that no other apps running on your PC are listening on the same address and port. Click on Enabled when you want to start the server. Watch the Log in the sidebar to get status info and received data.
  • External/ TCP/IP - This creates a trigger that will display a trigger button in the Windows TCP/IP remote utility. Click the button to fire the trigger and run the corresponding macro.
  • External/ Configure TCP/IP Trigger Server - Here is where you set which network address and port on which the trigger server will wait for data sent to it by the Windows TCP/IP remote utility.
  • Edit - This brings up the editor so that you may modify the selected trigger.
  • Toggle Enable/Disable – Use this to enable or disable a trigger.
  • Delete - This removes the currently selected trigger from the selected macro. Deletes cannot be undone.

Scripts

A macro can contain one or more script commands. When a macro is triggered, each script command is executed in order from top to bottom. Script commands typically send joystick button presses, keyboard key presses, mouse button presses and mouse axis data to the game.

Some script commands don t send anything to the game and are used to pause, create loops, run other macros, change curve groups, run a batch file, play a sound or even send data via network UDP to another app.

Here s a script with all possible script commands used, for illustrative purposes only.

You can have as many commands as you like as there is no upper limit on how long a script can be. The following is a complex script that opens a game menu, does a series of mouse clicks and then closes the game menu.

If you right-click on script list, or click on the script add button, or click on the Script menu, you will see the following menu.

Joystick Buttons

Before you use joystick button script commands, you should define your joystick buttons in the joystick button list, which is located under Joystick in the sidebar. Just double-click on the joystick button needed and type in the name.

Now when you select a joystick button for this script, it is labeled Landing Lights instead of just appearing as 1 . You can configure up to 128 joystick buttons, although some games may support fewer.

  • Joystick Button [DOWN/UP] - Adds joy_button_down, pause 100 milliseconds and joy_button_up commands to the script list. In this example, we would set the in-game control configuration to toggle the landing lights when joystick button #1 is pressed. When this macro is run, joystick #1 button down and up commands will be sent to the game, with a short pause in-between. Most games require a pause and 100 ms is usually adequate, although you may need to change the pause for your game. If the pause is too short, it seems some games just don t notice the following command (up, in this case). Here is where you select the joystick button and the resulting script.
  • Joystick Button [DOWN] - Adds a joy_button_down only.
  • Joystick Button [UP] - Adds a joy_button_up only.

Keyboard Keys

You can send individual keyboard_down and keyboard_up commands to the game. You will need to keep track of which up and down commands you are sending.

If you were to send a keyboard_down and don t send a corresponding keyboard_up, the operating system will still think that key is still pressed and some apps will act a bit odd. To fix it, just physically press and release the key on keyboard.

You can also send a string of text to the game such as might be used in a chat window by using the keyboard_text command.

  • Keyboard Text - Adds a string of text with a configurable delay for each key press (down delay) and the delay between each character (interkey delay). For special keys on the left panel, double-click on them to add them to your text string.

Tutorial video showing how to send text.

Video: https://www.youtube.com/watch?v=wuaSAY3qC-M

Some games, although you map for example the key P , really will only respond to a scripted lower-case p . So try different cases if it doesn t seem to be working. Some keys can t be sent to games, and some games will only recognize certain keys, so you need to experiment to find the right setting for your game.

  • Keyboard [DOWN] - Adds a keyboard_down only. Select the key that you want to send by double-clicking the desired key in the list.
  • Keyboard [UP] - Adds a keyboard_up only. Select the key that you want to send by double-clicking the desired key in the list.

Mouse Buttons

You can send mouse button down and up commands to the game. If you do the down/up combo, the down delay is built-in and determined by the operating system. If you do just a down, then you will need to add a pause before issuing the up. If you issue a down, but not an up, the game and other apps could act as if the button is still pressed and act strangely. To fix, just physically press and release the mouse button.

  • Mouse Button LEFT [DOWN/UP] - Adds a mouse left button down, followed by an operating system determined delay, followed by a mouse left button up.
  • Mouse Button LEFT [DOWN] - Adds a mouse left button down only. You will need to add a pause and up.
  • Mouse Button LEFT [UP] - Adds a mouse left button up only.
  • Mouse Button MIDDLE [DOWN/UP] - Adds a mouse middle button down, followed by an operating system determined delay, followed by a mouse middle button up.
  • Mouse Button MIDDLE [DOWN] - Adds a mouse middle button down only. You will need to add a pause and up.
  • Mouse Button MIDDLE [UP] - Adds a mouse middle button up only.
  • Mouse Button RIGHT [DOWN/UP] - Adds a mouse right button down, followed by an operating system determined delay, followed by a mouse right button up.
  • Mouse Button RIGHT [DOWN] - Adds a mouse right button down only. You will need to add a pause and up.
  • Mouse Button RIGHT [UP] - Adds a mouse right button up only.
  • Mouse ABSOLUTE - Moves the mouse pointer to an absolute x,y position on the screen. 0, 0 is upper left. 65535, 65535 is lower right. (32767, 32767 is the center of the screen).
  • Mouse RELATIVE - Moves the mouse pointer relative to it s current position. Enter x,y pixels to move from current cursor position. Moving right or down is a positive value. (100, 0 moves to the right 100 pixels).

Commands Not Sent to the Game

  • Pause - Adds a pause in milliseconds. So a pause of 1000 ms is one second. Most often used between joystick, keyboard or mouse down/up commands. Defaults to 100 ms which is usually adequate.
  • Comment - Adds a comment line so that you can document your script to make it easier to understand later.
  • Play Sound - Plays a .wav file that you select. Only .wav files are supported. If you have one .wav file playing, and start playing another .wav file, the first .wav file will be stopped. So, the .wav files cannot mix and overlay one another. The .wav files will mix properly with a music player or the game sounds though. If you have a long-running .wav file, the only way to stop playing it is to use the Stop All Running Macros script command.
  • Curve Groups - Allows you change the active axis curve group. an axis curve is used by each 3Dconnexion controller axis to adjust the axis sensitivity before the axis data is passed to the joystick driver. The curves for all six axis is called a Curve Group. You can create additional curve groups; perhaps one for landing, another one for combat, and another one for mining because these phases of gameplay would normally require unique curves. You can create curve groups in the 3DxWare sidebar panel.
  • Repeat START - Adds a start of loop marker to the script. You can select how many loop iterations to perform. Loops cannot be nested, which means that you can t have a loop within a loop. You can get around this limitation by running a Macro SYNCH command within a loop.
  • Repeat END - Adds a end of loop marker to the script. The commands between the start and end markers will be repeated until the iteration limit you set is finished. Here is an example of a three iteration loop that plays a sound every two seconds. Also shown is the log.
  • Macro SYNCH - Adds another script to the current script. This allows you to make a script that calls other scripts but runs them sequentially. The SYNCH parts stands for Synchronous, which means that if this command is encountered, the script that it references will be run in-line with the currently running script. It will all run on the same thread. Use this if you want things to happen serially (in order). You can only add one script to a script.
  • Macro ASYNC - Adds another script to the current script. This allows you to make a script that calls other scripts, but runs then simultaneously. The ASYNCH parts stands for Asynchronous, which means that if this command is encountered, the script that it references will be run in-line immediately in it s own thread and will be running at the same time as the calling macro. Use this if you want a bunch of things to happen at the same time. You can only add one script to a script.
  • Run File - Adds a command that will run a DOS batch file. So, if some reason you wanted to toggle the ship lights and transfer a file to another folder, you could do it. It is more of a integration-kind-of-command. You can also use it to open up other apps, like notepad etc.
  • Send UDP - Adds a command that sends data via network UDP to another app somewhere on the network. So if you wanted to have a macro that toggle the ship lights and also turned on some real physical lights in your gaming room, you could do this with a clever combination of this command, another app that you create and an interface to the lights, perhaps via Arduino or some other micro-controller. You could also send data to an app on your phone. You can experiment with this command by using the Script Send UDP Receiver app that under the Tools menu where you will find more instructions on how to set it all up. Here s the dialog where you select the destination address, port and data you want to send.
  • Stop Running All Macros - Adds a command that will cause all macros to stop running. This is useful if you have some complex macros, especially long-running macros that call other macros. Having a macro that only calls this command is really handy.
  • Change Profile - You can select another profile to switch to. This should always be the final command in the script.
  • Delete - Removes the currently selected script command. You cannot undo a delete.
  • Up - Moves the currently selected script command up in the list so that it is executed earlier.
  • Down - Moves the currently selected script command down in the list so that it is executed later.
  • Edit - Allows the editing of the currently selected script command.

Profile Targets

You need to ensure that ControlMyJoystick sends it s commands (keystrokes, mouse movements and clicks) to the game and not some other window such as your web browser.  You can use Profile App Targets to accomplish this.

Note: Once you have set the target app and enabled targets, all ControlMyJoystick commands will be sent to the target window. For easy testing, open Wordpad and set it as the target.

Why not Notepad?

We recently changed our recommendation from using Notepad to using Wordpad instead for keystroke testing. This is because Notepad has been changing with recent Win10 releases and causing problems. Recent versions of Notepad will change the Notepad titlebar text to prefix it with an *asterisk when it has been edited, which invalidates the CMJ profile target and for some reason eats some keystrokes, often leaving you with a repeating keydown action. Wordpad doesn’t do this, which makes it easier to test.

Setting an App Target

Right-click on the active profile to bring up the popup menu, or double-click on the target name at the bottom of the screen.  Select the target program from the list.

Set the target program here.

Enabling App Targeting

Slide the profile targeting switch to the on position.

Here is what it looks like when it is off.
And here’s what it looks like when App Targeting is on.

Integration

Windows TCP/IP Remote Utility

Installing it on a Windows PC

You can get the same remote trigger functionality by running the TCP/IP Remote utility from the ControlMyJoystick Tools menu. This is a separate Windows app that you can put on another monitor.

You will need to click on the macro buttons with the mouse. You can run up to three instances simultaneously and set them for different DeviceIDs so that each window displays different macro buttons.

How it Works

The utility connects to the ControlMyJoystick TCP/IP Trigger Server via TCP/IP protocol on your network. In ControlMyJoystick, you configure the TCP/IP Trigger Server to listen on an IP Address and port, and then you enable the server. In the utility, you set it to connect to the same address and port and then connect to the server. Any TCP/IP triggers configured for the current profile will be displayed as buttons. Click a button to run a macro back in ControlMyJoystick.

Creating a TCP/IP Trigger

Create a profile, add a macro and create a trigger for that macro by selecting TCP/IP... from the Trigger menu. You will need to set the text, colors, order and DeviceID for that trigger. This trigger will appear as a button in the remote utility.

  • Title - Required. This appears as larger, bold text on the button.
  • Description - Optional. This appears as smaller text beneath the title on the button.
  • Order - This is the order in which the button will be displayed. The lowest number will appear at the top of the button list. The button list will be sorted by Order, ascending. Order numbers do not need to be consecutive, so you can have gaps (ex. 1, 2, 3, 6, 7).
  • Device - Required. You can set this value from 1-3. For example, you could create buttons with device = 1 for one utility window and buttons with device = 2 for another. When you connect the remote utility to the server, specify the DeviceID that you want to display in that window.
  • Copy Colors - Click on this to copy the button and text color. If you want several buttons to have the same colors, using the copy and paste buttons are easier than trying to set the colors manually.
  • Paste Colors - Click on this to apply the button and text colors that you copied with the Copy Colors button.

Configuring the TCP/IP Trigger Server

In ControlMyJoystick, select Configure TCP/IP Trigger Server from the Trigger menu. You will need to set the Bind Address and Port and then enable the server. Any server status information or errors will be displayed in the sidebar, so it is a good idea to open up the log panel and clear it now. You will likely need to tell your firewall to allow TCP/IP connections to the address and port you have specified. Note: This configures the server for all profiles, not just the current profile.

  • Bind Address - This is the IP Address that the server will listen to. You must find the IP Address of the computer that is running ControlMyJoystick and one of the best ways to do this is to go to a Windows command prompt and type ipconfig . It will display your network connection info and in there somewhere is your IP address. If you have more than one network card in your computer, you will see one IP address per card, so you need to figure out which card is visible to the remote utility on the network. The Windows utility can use IPv6 and IPv4 addresses.
  • Bind Port - This is the port that the server will listen to on the Bind Address you specified. It defaults to 50003 but you can use any port from 1-65535 that isn t already used by another app or service. We recommend to use 50003 unless you have a really good reason to use another port.
  • Enabled - Check this box to set the server to listen to the port on the address you specified. Check the log panel in the sidebar to see if it connected or if any errors occurred.

Configuring the Remote Utility

Run the ControlMyJoystick TCP/IP Remote utility. Open the settings screen.

  • Server Address - Set this to the Bind Address you set in ControlMyJoystick s TCP/IP Trigger Server setup screen.
  • Server Port - Set this to the Bind Port you set in ControlMyJoystick s TCP/IP Trigger Server setup screen.
  • DeviceID - This allows you to filter which buttons you want to view in the utility window. When you create a TCP/IP trigger in ControlMyJoystick, set which DeviceIDs can view that button.
  • Columns - For wider utility windows, you can set how many columns of buttons you want.
  • Connected - Toggle this to connect to the server. If it connects successfully, the settings panel will close and you will see any TCP/IP trigger buttons that you have configured in ControlMyJoystick.

Troubleshooting

The trickiest part of setting this up is to select the correct IP address and port and ensure that the remote utility can see the TCP/IP Trigger Server on the network. Check the ControlMyJoystick log for any error messages. And don t forget about firewalls. There s Windows firewall, and often other firewalls that antivirus apps are running. You may also have a firewall in your network router.

Communicating with Other Apps

ControlMyJoystick can receive triggers from external apps. It can also send commands to an external app when a macro is run. This allows you to extend ControlMyJoystick s functionality, such as running a macro from another tool, or turning on a physical light when a macro is run.

All communication between external apps and ControlMyJoystick is via network UDP protocol. So you need to make sure that the address, port and UDP protocol is allowable in your firewall. If it doesn t seem to be working, check your firewall.

Why UDP?

That is a good question. Since UDP is a stateless or connection-less protocol, it is very fast. UDP also cannot guarantee that UDP packets will arrive in the order in which they were sent, but this shouldn t be a problem for how we are using it. You really only need to send a single byte to or from ControlMyJoystick, so any lost or out of order packets should be pretty rare. And if it is lost, it isn t a critical thing..like not nuclear reactor critical at least (please do not interface ControlMyJoystick with nuclear reactors, k?).

Receiving Triggers from External Apps

You can add a UDP trigger to a macro. This trigger will fire and run the macro if it receives a user-defined series of data. See the Trigger help for more info on how to configure this trigger and on how to set up the UDP Trigger Server.

Sending Data to External Apps

You can add a Send UDP script command to a macro so that when a macro is run, a user-defined series of data bytes is sent to an address and port somewhere on the network. What the receiver of that data does with it is up to the developer of that receiver app. Turn on a light? Play some music? Trigger a device? I am sure someone will build something great!

Execute a Batch File

You can run a batch file with the Run File script command. Within the batch file you can use any batch command, so you could launch an app, copy a file etc.

Here s a video showing how to integrate with external apps. This vid is showing an old version, but the setup is the same as in the current version.

Video: https://www.youtube.com/watch?v=znwhgErzbpc

Game Configurations

Star Citizen

ControlMyJoystick can send virtual joystick axis data, keystrokes and mouse button clicks/movements to Star Citizen. Using a six-degree-of-freedom 3Dconnexion controller is perfect for space games, and Star Citizen is no exception.

Configuring ControlMyJoystick (CMJ) and Star Citizen (SC) is pretty simple, providing you follow the method outlined below. This article covers how to bind your controller axis and buttons to SC. It does not cover how to send keystrokes or mouse clicks.

New to using 3Dconnexion Controllers in ControlMyJoystick?  Read these Knowledge Base articles first.
- About the 3DxConnection controller and it s configuration in ControlMyJoystick
- About app targets
- About the virtual joystick driver and 3dconnexion driver conflicts

Remember This

The secret to getting it working is to use CMJ voice or menu commands to bind the axis to the controller in-game. Don t touch the controller while binding. If you do touch it while binding it will not bind correctly. This is explained further below.

The Task

Let s bind the Pitch, Roll and Yaw flight axis and a controller button to bring up the in-game scoreboard while in flight.

Prepare your 3Dconnexion Controller

Plug in the controller and confirm that it is working with the utilities that came with 3DxWare drivers that came with it.

Prepare ControlMyJoystick

  1. Shut down SC and CMJ.
  2. Start CMJ and set it to stay on top (View/Stay on Top menu). This will allow you to keep the CMJ window floating above your SC game window later on if you are short on screen space.
  3. Enable 3DxWare in the Input/3DxWare menu.
  4. Move the controller puck around and you should be able to see the indicators moving under the 3DxWare panel.
  5. Press some buttons on the controller and you should which button was pressed just below the RZ indicator (in the Bu indicator area).
  6. Enable the microphone in the Input/Voice menu. This is absolutely required to bind the controller axis in-game and there is no way to bind the axis without the microphone. Turn up the voice Threshold to around 90-92 if you are English speaking on an English-language PC, or around 70 otherwise.
  7. Open up the Voice panel in CMJ and try speaking some commands like Bind button or Bind Rotation on X Axis . If the voice command is detected properly, the voice command text will be auto-selected in the voice command list. Get it working well so that it can recognize your voice commands reliably.
  8. Create a new profile.

Checkpoint

At this point, CMJ is running, the controller is responsive and the voice commands are working.

Prepare Star Citizen

First we will unbind a bunch of axis-related items.

  1. Start SC. Run it in windowed mode so it s easy to swap back and forth to CMJ for the next while. Later on you can run it full-screen when the bindings are working. Go to the Arena/Broken moon area or some place where you will not get shot up.
  2. Go to the Controls tab and on the lower-right corner of the screen, select Joystick/HOTAS1. Disable everything for this by setting flight to No, Throttle to No, everything to No. Do this for all the Joystick/HOTASx s you have - ours go to Joystick/HOTAS4. This means that SC sees four joysticks on our PC. You can still bind a real physical joystick while while CMJ is running, it s just that for now, let s clear out all the bindings.
  3. Go to the Options/Keybindings/Advanced Controls Customization and on the lower-right corner of the screen, cycle to Joystick/Hotas. Go to Flight-Movement and unbind all the Pitch, Roll and Yaw entries.

Checkpoint

So now in SC, no yaw, pitch and roll is bound to any joystick input. Return to the game and move around the controller. It should not pitch, roll or yaw. If it does, you missed something in the steps above.

Let s take a look at what happening in SC. Even though we disabled all joystick inputs, SC can still receive inputs directly from the Spacemouse driver. We have no idea why this is possible, but it is the cause of most of the frustration in setting this up.  It could be that there is a hidden Joystick/HOTAS0 that we can t unbind. So we are stuck with this, and it s the reason we need to use voice commands for binding the axis.

The Wrong Way to Bind

To see this problem in action(it s good idea to try this as it will help make sense of it all), try this:

  1. Go to the Options/Keybindings/Advanced Controls Customization and on the lower-right corner of the screen, cycle to Joystick/Hotas.
  2. Go to flight-movement and try to bind the Pitch axis. Move the controller pitch when prompted and it might put something like rotx in there. That is bad, because it didn t come through CMJ s virtual joystick driver.
  3. Go back into the game and try pitching. It isn t very good and may be inverted. After you have experimented with this incorrect method, clear those bindings again so that there are no bindings for yaw, pitch or roll for Joystick/Hotas.

The Correct Way to Bind

We ll use CMJ voice commands to send the binding data through the CMJ virtual joystick driver. Our hands will never touch the controller as we do this.

  1. Go to the Controls tab and on the lower-right corner of the screen, select Joystick/HOTAS1(it should be #1, though if you have many joysticks, it may be a different HOTAS#). Enable the Flight Movement (set to Yes for flight(pitch), flight(yaw), flight(roll) and the other flight() ones to under movement if you like.
  2. Go to the Options/Keybindings/Advanced Controls Customization and on the lower-right corner of the screen, cycle to Joystick/Hotas.
  3. Go to Flight-Movement and dbl-click on Pitch and then speak Bind Rotation on X Axis into the microphone. This causes CMJ to simulate the rotation of the controller along x axis (pitch) and send this movement data via the virtual joystick driver to the game. The game should bind it as rotx(input2) . If you hadn t used a voice command and bound it by physically moving the controller, it would have just said rotx which is wrong. In fact if when you are binding you physically move the controller around a bit you will see it flicker from rotx to rotx(input2) as SC is receiving inputs from both and displays the one last received. This is why we use voice commands instead.

Testing

Now return to the game with only pitch configured. Just doing one axis for now will make the next steps easier as we don t want axis cross talk messing up our configuration changes. Try pitching up and down with the controller. The ship should pitch up and down, though it might be inverted. That ok, we can fix that in CMJ.

Adjust Curves, Inversion and Deadzones in CMJ, not SC.

Let s try inverting the pitch, tweaking the axis response curve and deadzones.

  1. In CMJ, open the 3DxWare panel and in the grid with the axis, enabled, invert, etc columns, double-click on RX. RX (Rotation around the X Axis) is the axis used for pitch. The curve editor window will open and this is where we will tweak this axis. Any changes you make here take immediate effect, so you do not need to close the Rx window or press a button to save your changes. You could keep the CMJ window on top of the SC game window and tweak the curves while you fly.
  2. Now try pitch in-game and get a feel for how much you need to move the controller to get the ship to move.
  3. Go back to CMJ and set the Invert checkbox in the curve editor. Go back to the game and try pitching and now it pitches the opposite direction. This is a good way we know that the axis binding was done correctly as we know the axis data is actually coming from CMJ.

Checkpoint

So now we have bound a controller axis through CMJ in SC. Time to tweak that curve so that it has a smoother response.

Curves, Deadzones and Curves

Use curves to adjust the axis responsiveness and deadzones to limit the cross-talk among axis. With no deadzone, just touching the controller with your fingertip will cause axis movement on pretty well all six axis. This will make controlling your ship difficult.

Add a deadzone so that you can actually just touch the controller or rest your hand on it without it generating any axis inputs. Use Trim to fix a controller that always seems to be off-axis a bit even though you are not touching the controller, giving you a constant pitch etc.

The deadzone and trim values are based on a controller axis input range from -328 to +328. That is the granularity or precision of the data that we get from the controller driver. So that s 656 positions for each axis. Since the controller puck moves over a very small physical distance, this is plenty of precision unless you have the steadiest hands in the world. So if you set a deadzone to 100, that means that the center 100/656 or %15 of the physical movement range is deadzone and CMJ will report the axis position as centered throughout this range.

  1. Right-click on the curve editor graph and select Soft - No Explicit Deadzone. This means that you need to set the deadzone in the Deadzone edit box at the top of the screen. If it has an Explicit Deadzone, the deadzone is built-in to the shape of the curve and it ignores the deadzone edit box.
  2. Go back to the game and try pitch again. It should respond differently now.
  3. Go back to the curve editor and drag the curve graph nodes (squares) around with your mouse. Go back to the game and test. Repeat until you have a good curve.
  4. Enter a deadzone of 100 in the deadzone edit box at the top of the curve editor screen. Go back to the game and test pitch again. You will need to move the controller more before your ship starts moving and that is good. Adjust the deadzone value so that it feels right. Often you don t can t finalize a deadzone value until you have all the axis bindings complete and the curves are set. Only then you can really know how much cross-talk you will have.

Visualizing the Effects of Curves, Trim and Deadzone without running SC


In CMJ, you can see the raw axis data coming in from the controller and the adjusted (curved) data being sent to the CMJ joystick driver. This is really useful for learning how the curve editor works without having to go into the game.

  1. Expand the Joystick panel. This shows exactly controller inputs modified by CMJ curves., but scaled from -16384 to + 16384. This is the axis data that is used by the game. Move the controller puck around and you will see that the indicator movements in the 3DxWare panel don t exactly match what you see in the Joystick panel. This is because the 3DxWare panel is raw controller data and the Joystick panel shows raw data adjusted with curves. If went and reset your curves so that they are flat x1.00, the Joystick and 3DxWare indicators would match perfectly.
  2. In the 3DxWare panel, double-click on the Rx row in the grid to bring up the curve editor.
  3. Move the controller around the Rx axis and observe the curve-modified results in two places: in the joystick panel and in the area just below the curve grid. That last one is what we will use for tweaking the curve.
  4. Right-click on the curve and reset it to a flat default curve. Move the controller in around Rx and observe the two indicators moving just below the curve grid. The top indicator is the raw unaltered (except for smoothing if you have it enabled) position. The indicator below it shows the curve modified position data. Both indicators should be moving in lockstep since the curve is flat.
  5. Check the Invert box and move the controller and watch the indicators. They should be moving in opposite directions. This is also happening in the 3DxWware vs Joystick panels.

Now for the Other Axis

Go and bind the other axis with your voice commands and tweak the curves.

Checkpoint

Your ship should now be flyable with your bound axis. You can also bind the Tx, Ty, and Tz to thrusters to allow lateral, forward/back and vertical movement respectively.

Axis Groups

One set of axis curves seldom is adequate for all flight scenarios. Up to this point, you have been editing the curves in the Default Curve Group. This is shown in the grid just above the axis grid in the 3DxWare panel. The settings for the six axis are contained within the Default group and you may use these for combat, for example. But what if you want different curves general non-combat flying around?

You can create a new axis group for that and then switch which group to use while in-game. So if you are in-game and just flying around using one group and combat is imminent, you could use a CMJ trigger such as voice or a controller button to change to the combat curve group.

Let s create a new axis group

  1. Right-click on the Default axis group row in the grid and select Duplicate from the popup menu and give it a name. You now have two axis groups.
  2. Select your new axis group in the grid and the edit some curves. Your curve edits are assigned to your new group. You can switch back to the original default group by clicking on it in the grid or by trigger.

Smoothing

In the curve editor indicators, you may have noticed that your hands are a bit shaky an even though you may try to hold your hand and the controller puck perfectly still, it is pretty well impossible and it will move around a bit. If you don t want this shakiness sent to the game, go back to the Input/3DxWare menu and enable Smoothing with a depth of 2 or 3. Any higher will cause noticeable controller lag but be really smooth. 2 or 3 is usually enough. Close this window and go back to the curve editor and move the controller around. You should be able to hold it pretty still now. You will see that it lags a bit though.

Binding a Controller Button to a Virtual Joystick Button

This also uses voice commands. Don t touch the controller while doing this. Let s bind a button on the controller to bring up the scoreboard in-game.

  1. In SC, go to the Options/Keybindings/Advanced Controls Customization and on the lower-right corner of the screen, cycle to Joystick/Hotas. Go to Flight - HUD. We ll bind this with a voice command.
  2. In CMJ, open the Joystick panel. There is a grid numbered from 1-128. Dbl-click on row#1 and rename it Scoreboard . Each row here is a virtual joystick button, and we are saying that we want to use #1 for the scoreboard.
  3. Sending button # 1 to the game requires a macro, trigger and script. Create a macro and call it Scoreboard or whatever. Add a trigger for 3DxWare Key Combo and then press the button on the controller that you want to bring up the scoreboard with. You can also add another trigger here for voice if you like. So you could bring up the keyboard by pressing the controller button or speaking a command like show scoreboard .
  4. Under script, add Joystick Button Down and select button #1 Scoreboard. Then add a pause for say 3000 milliseconds. Then add Joystick Button up and select button #1 keyboard.
  5. Test this macro by clicking the Run button above the macro grid, or pressing the button on the controller, or using that voice trigger if you made it. The scoreboard should appear and then 3 seconds later disappear.

You could also bind a keyboard key or mouse button in SC instead of using a joystick button to bring up the scoreboard. In the script, just send keystrokes instead and use profile app targeting while gaming in windowed mode. You ll need profile app targeting enabled for this to work while windowed gaming though.  Some games ignore keystrokes sent by other apps though, so this may not always work.  But the virtual joystick driver is seen as a real physical joystick, so it won t be ignored.

Known Issues

OLE Error

Issue

You get an OLE Error when you start up ControlMyJoystick.  It usually mentions the microphone.

Solution

This error occurs if you do not have speech recognition set up in the Windows Control Panel.  To set up speech recognition, you may need to install a language pack from Microsoft for your language.  Then you need to train the speech recognition engine.  When you have that working, run ControlMyJoystick again and enable the microphone and try voice commands.

Sending us Bug Reports

If ControlMyJoystick crashes, this window is displayed along with a lot of good debug information instead of a cryptic windows error message. Our developers can use this information to troubleshoot the issue and get it fixed.

  • Send Bug Report - Click this and enter your name and email address and it will attempt to send this bug report along with a screenshot of ControlMyJoystick using you default email application.  It will be sent to support@tetherscript.com.
  • Save Bug Report -  Saves the report to a file so that you can email it later on.  Please send all bug reports to support@tetherscript.com.
  • Close Application - Click this and it will shut down ControlMyJoystick.  It has to be shut down after the error dialog is displayed.

To see this window without having to wait for a bug to happen, you can force an error by going to the help/about menu item and opening the about window.  Press F12 on your keyboard and it will generate a harmless error and cause the debug window to come up.