Posted by JibbSmartJibbSmart on 29 Mar 2021 06:13

JoyShockMapper 3

Over the weekend, JoyShockMapper 3 (JSM 3) came out. Get it here!

This is by far the biggest update ever. If you have ViGEm Bus installed, JSM 3 will let you set up virtual XBox or PS4 controllers that the game can see. This means instead of having to map the left stick to WASD to move around with it, you can just map it to the left stick of a virtual controller and keep all the freedom of movement you'd get on console, and if the game is able to combine controller and mouse input properly, you can enjoy full analog movement and gyro aiming + flick stick at the same time. Having a virtual controller also gives you rumble support.

This update also provides "SDL2" versions, adding support for almost every common controller out there — Xbox, Stadia, Gamecube, and many generic PC controllers. These won't have gyro, but you'll still be able to use JSM's powerful customisation options.

You can now use the DualShock 4 and the DualSense's touchpads, use a stick like a scroll wheel, and control the rate at which JSM updates the mouse so that even low-report-rate controllers like Joy-Cons (reporting at 66.7 Hz) can provide a smooth aiming experience on high refresh rate monitors.

There's a lot more, and it's worth checking out the changelog.

This is also the first official release of JSM that I didn't build. That's because JSM is now in the very capable hands of long-time contributor Nicolas/Electronicks.

The Future of JoyShockMapper

Known in the gyro gaming discord and on GitHub as Electronicks, Nicolas has done more work on JoyShockMapper than any other contributor. While JSM has always offered the best gyro controls around and was for a long time the only way to play with flick stick, the software was pretty light on features as a general input remapper before Nicolas got involved. He was responsible for a wide variety of quality-of-life features we take for granted (such as AutoLoad, whitelisting, and the tray menu), more advanced control mapping features (like chords, simultaneous press, and advanced binding modifiers), and many more things in between — not to mention most of the great new features in JSM 3!

Search for "Nicolas" in that changelog linked earlier and see how much his name comes up.

As early as November 2019, I was trying to find a balance between working on new videos, articles for GyroWiki, and game prototypes to further explore better controls. I had vague plans to gradually improve JSM, but it wasn't my highest priority. Meanwhile, Nicolas had already contributed to JSM 1.3 and had some cool features in the works for the next update.

I didn't want to slow him down, but also had my own vision for the software and concerns about the time it takes to prepare each new build. Every update needs documentation, testing, and at the time I was making a new video for every update, too. I was trying to find a balance of still holding onto JSM and guiding its overall direction, trying to make time for these other gyro/control-related projects, while also trying not to stifle the generous work of Nicolas and other contributors.

To be really clear: Nicolas has always been very respectful of my ownership of JoyShockMapper.

But Nicolas has proven without a shadow of a doubt that he has a great vision for the future of JSM. He knows it inside-out. Even a lot of the features that haven't changed outwardly have been refactored by him. No one knows it better than he does. As I've tried to keep JSM updated, I have had almost no time to work on anything else. My other projects are just getting nowhere without dedicating my time and attention to them. But thanks to Nicolas, JoyShockMapper can keep improving without demanding so much of my time. Clearly, this is better for everyone!

This means JoyShockMapper lives on his GitHub page now — Electronicks/JoyShockMapper. I'll update my GitHub page to point people there, so no one should have trouble finding the latest version. JSM will follow Nicolas' vision going forward. This also means he has final say on what features get included and what don't. And if one day he wants to move on to other things, it's up to him to decide what that means for JoyShockMapper.

But just as Nicolas was able to be very involved in JSM when it was mine, I will continue to be involved now that it's not. Sometimes I'll work on features specifically for JSM. But there are a few other things I'm working on, some of which will improve JSM indirectly, and some are more for the benefit of the gyro gaming community generally. Hopefully you'll like them.

What I'm Working On


Most videos on my channel and gifs on this website make use of JoyShockOverlay, which displays a 3D controller on screen in real-time. You can see examples with some of the supported controllers below.

People have been asking for a public version of this for a long time. I should have more time to work on it now.


SDL2 is an incredibly helpful open source library for cross-platform game development. This isn't my project. But I have recently gotten involved with it as well. My main interest in SDL2 is in its controller support. While dozens of different controllers have essentially the same layout, they often expose the buttons to developers in different orders. This is tricky for game developers — should I map "jump" to button 1, 2, 3…? SDL2 has a large database of different controllers and how their button order best maps to a standard Xbox 360 controller layout.

SDL2 can be used in a controller-only mode, so regardless of what tools you're using for rendering and so on, you can still use SDL2 for controller support. But it didn't have a way of accessing gyro from controllers that have it, so it wasn't useful to me for JoyShockMapper. I made JoyShockLibrary so that developers can easily use Switch and PlayStation controllers interchangeably with access to gyro and accelerometer (converted to the same space and units), but it's still inconvenient for developers to have to deal with more than one input library.

At the end of 2020, SDL version 2.0.14 came out, adding functions to read the gyro and accelerometer from supported controllers. At the time, only PlayStation's DualShock 4 and DualSense were supported, and so I got involved and added support for Switch Pro Controller and Joy-Cons. These will likely be included in the next update. This also means SDL2 now supports all the controllers that JoyShockLibrary and JoyShockMapper support and more, so we made a new version of JoyShockMapper that uses SDL2 instead of JoyShockLibrary. This is why JSM 3 supports so many more controllers — it's using SDL2.

I will continue to be involved with SDL2. It is already well supported and widely used, and we can reasonably expect more controllers to be added in future — and as they do, JoyShockMapper will support them, too!


JoyShockLibrary does more than just provide input from PlayStation and Switch controllers in a platform-agnostic way. It also includes calibration features that JoyShockMapper has always relied upon and a sensor fusion solution that JSM uses for lean and motion-stick bindings.

In order to complete the move from JoyShockLibrary to SDL2, I created GamepadMotionHelpers. This very simple single-header library makes it easy to calibrate your gyro and to combine gyro and accelerometer to detect real-world orientation. Now that this functionality is separated from the library that actually reads the controller input, this can be used with SDL2 or any other input library.

It already covers all the features users were used to with JoyShockLibrary, but I'm also working on options for automatic calibration, like what players are used to encountering when playing Switch and PlayStation games with gyro aiming. While I still urge developers to let the player manually calibrate their gyro if they so wish, automatic calibration is a helpful default, and I think this is a good way to make it available to as many developers as possible. Of course, when that's ready, it may be included as an option in JoyShockMapper, too!


I want to make more time to work on GyroWiki articles to help developers, including the long-awaited Good Gyro Controls Part 3. I have prototypes that I want get out there for people to play with and explore better controls (gyro or otherwise). I have a lot more videos I want to make on the Gyro Gaming YouTube channel.

I hope you're looking forward to these, as well as whatever else Nicolas has in store for JoyShockMapper!