Mini Padder

Free Mini Padder 5.0.0

This update brings a change to MegaPad skin after I actually learned about the terrible present that is all the differences between two modern sega gamepads: Retro-Bit ones and 8BitDo's M30. It was so exhausting to realize the truth so I am gonna share what I could find in the journey below. I'll put changelog right below because the journey was quite long.
  • replaced MegaPad skin variations
    removed button label variations, and added mapping variations
    This may render any custom mappings of the mentioned gamepads on XInput not working properly on MegaPad skins,
    so if you have one you need to remap them on Mini Padder.
  • removed some skins from the default skin list residing inside GamepadRenderer
    Disc D-pad, MegaPad, HBox
  • update message now can show bold texts and links


The existing MegaPad skin didn't really match the mapping of either of the two gamepads, so I think anyone who's using the gamepad had to remap before using this skin. It was weird, the skin's layout was based on M30's DInput mapping, at least it should've worked on M30.

I was wrong. Even the M30's mapping was different if it's connected on XInput.

No Info Available


Retro-Bit manuals can be found on their support site. There are total of 14 manuals for each of the available models, divided by the region, the connection method, the existence of the shoulder buttons. That's after excluding 'Wireless Receiver' ones.


Aside that their manuals are not even in the same format, it was frustrating to find out parts of the available information there seemingly related were actually all irrelevant, to this case where I am trying to find mapping for the gamepad API of Javascript. The 'numbers' for each buttons for DInput are not the numbers the browser will show, and even that was not available on all of the manuals. XInput mapping was all shown as Xbox controller button labels, which was really unhelpful because there are so many controllers that support XInput while having completely different mapping from the standard mapping. Mainly 8BitDo ones, but that's on later.


None of the numbers you can see above are relevant to my case, and none of the non-numbers are useful for the obvious reason. What you can grab is button indexes.


This looked easy to find the working mapping at first because the "information" was available right there on their FAQ page for M30.


Such a simple explanation, very easy to consume. But gamepads often support at least two methods: XInput and DInput, 8BitDo's cases usually much more than that. How can they end up writing such simple info on the FAQ page? I should've doubted this obvious thing when I saw it first.

It turned out their manual shows yet different mapping.


Even worse, the good feature of their products that is firmware update support, apparently sometimes updates the mapping of the gamepads as well. Terribly, they don't list that on their changelog, and the latest issue I can find on the internet was this 2-year-old archived reddit post.


8BitDo always had rather erratic layout when it comes to XInput mapping of their gamepads. I had the most gamepads of this manufacturers, but I know this little more of experiences will not earn me any useful general knowledge as I can't be sure about anything on their gamepads they released and will in the future.


As all their official materials are not helpful for Mini Padder which uses the gamepad API on Javascript, the only way I have left is googling. But it's 2021, websites have to prepare a message to ask their visitors to enable Javascript when they find their browser is blocking it. Googling was impossible for various reasons. Even if you get few search results, most of them are suspicious pages that redirect you to somewhere only to immediately close themselves.

I have put a star on the repository that collects all the found gamepad mapping for SDL2 Game Controller. It's obviously something else, and I really wish such thing also exists for Javascript Gamepad API. This is a bit unrelated, but the website I often ask any users to use to see the mapping decided to put their dataset on sale some times ago. The dataset is not the perfect one that has everything I need, but it was the only one of the kind I could easily find on the internet.

Anyway, I decided that it's impossible to gather any necessary info on the gamepads. Unless I find someone who's willing to help me. This definitely happens really scarcely, though.

The Mappings (I Guess)

Based on one friend I could bother asking (thank you CaptainGordon again), I could find out how Retro-Bit's sega pad is mapped. For it's Saturn USB varient. When I asked him to find the mappings, he told me that this gamepad doesn't work properly on DInput. Shoulder buttons and button combinations were not detected. So based on the only information I can acquire, I decided to forget about making mappings for sega pads and instead make copies of MegaPad skins that maps each button sprites differently, on their *expected* default mapping on XInput.

This is the mapping of the original MegaPad, if used on a standard XInput controller. Which is deprecated as of now.


This is the mapping of Retro-Bit Saturn pads and Megadrive pads, USB ones. Look how they manage to differ completely while all being made by the same manufacturers. I can't stop wondering if the Triggers and Bumpers difference was really necessary.


This is 8BitDo M30's mapping, "according" to their manual. One user I recently found told me how they were mapped, and that was again different to the manual. I decided to give up and follow the manual blindly. The mapping is also really different if connected as DInput, but it will take another ages for me to find someone who uses M30 on DInput.


Since DInput support looks impossible, and there's no way to tell different controllers if they're connected on XInput, I decided to just remove the MegaPad variations that has XInput and DInput button labels. If you want it back, you have to download it from past versions of the repository and manually arrange buttons.

This was exhausting. Especially because I am something of a Sega fanboy, only to find out the most popular choices of sega gamepad products had to be this different on things like button mappings.

Dividing MegaPad skin into layout variations was my best attempt to make this easier to deal with, but that will definitely look confusing to new users as they are all visually identical. This was exhausting.
In previous update I made a change to set deadzone for each stick separately, but at once when you click the corresponding button. This turned out to be not so great as I often find out I got one stick set but not the others. I needed to set one stick while keeping the other's value, and I ended up editing the mapping json manually.


So in this update, the deadzone setting buttons are finally divided into two representing each sticks. When it's not applicable, the button will say 'N/A'. Click the representing button to change the deadzone value of single stick you want.

  • Super Pad skin uses dpad sprite for Left Stick
    • Due to how fade-out works different for LS and dpad, there will be two sets of the same sprite showing up. If I can see which method is preferred by the gamepads users are using with this skin, I can either make dpad performing like stick, or remove the stick support.
  • add a guide message for the skin menu
    • OBS Interact window works not so smooth with dropdown lists.
  • trim gamepad names on saving its mapping
  • make deadzone feature to set deadzone for each stick separately
  • change deadzone panel to let users change each stick separately

Diagonal Indicator
Since I added Disc D-pad and Mega Pad skins, the lack of a diagonal indicator in default skins always bothered me. Accidental diagonal inputs are bane of my existence, so being able to properly tell if such happened is very important to me, hence this release.
The sprite for the indicator is not final, and I'll keep contemplating about a possibly better sprite for it. But current sprite managed to look good on me, so it's included on the release.

Shoulder Buttons
I spent lots of times thinking of the design for shoulder buttons in default skins, and while I was satisfied with it, I was bothered that first area of trigger input is not visibly standing, because it comes down diagonally from a corner of a rectangle.
I shifted the trigger button shape into parallelogram, and shorten the width of shoulder bumpers to keep the overall width same. Now earlier press of a trigger button will light up as same amount of pixels as when it's just fully pressed.

Proper Dpad for Super Famicom skin
After I made Disc D-pad skins, I called it a day after making a variation of it with the SFC button layout. Later I changed the shoulder button shape and position of face buttons to make it close to the actual controller. It was but not enough, and I managed to get some time to make a proper dpad that would go with the controller. I hope it looks good enough to you.
I decided to go with still including the Disc D-pad when the skin receives a left stick input, on a new layer below the d-pad layer. This decision is not final, and I will see if it's better to just cut off the stick input from the skin.
This update is made thanks to my 3-year-old DualShock4, of which the right stick started to shift wildly.



I made a change so I can continue using my DualShock4 with Mini Padder, and I believe this will help other people having a gamepad with unbalanced analog sticks. I meant to make this update sometime ago, but having to touch various places in the code scared me. I did it, and as I expected it took too much time. A whole night and a whole evening before it are gone.



I also added a way to announce updates in the control panel. I don't know how often you interact with it before starting a stream. But if you do, you can be now notified when something changed. The only way to get notified before was visiting the forum or the repository, if you happened to notice the very small version number at the end of the control panel is changed. This update is better than that, at least.

The DualSense mapping in the 3.11.2 update turned out to be not actually applied to clients of existing users. This is embarrassing, but it's fixed now.

  • modified Biker skin
    • reflected in-game behaviour of overriding triggers with buttons
    • added labels to each trigger parts to help telling how much each triggers are pressed
  • slightly changed the control panel colour to follow the palette used for all default skins
  • modified the alert system
    • alerts now disappear on click
    • a latest update can be announced via an alert
  • more descriptions on the control panel to hope each features becoming more clear
  • fixed DualSense mapping not actually being added for existing users
  • deadzone value is set and applied separately for each sticks
There are some small changes in the control panel to help understanding it better at a glance. The order of the items are changed based on what I expect to be used more frequently. And now there's a prompt telling a user that it's waiting for an input. 'I don't see anything' is the first sentence most frequently said by people I watched trying to set up Mini Padder, so I think there should be a bigger amount of people who were confused by that and stopped using. I hope this prompt will prevent that from happening again.

You can make a new mapping for DualSense with current assignment system, but I am worried that people who haven't used Mini Padder would say it doesn't work then leave. Thanks to Gordon I could get the button mapping information and add that to the list of default mappings.

  • Fixed in-app updater's version comparison mechanic
    It turns out it was comparing version numbers as strings, which was overseen because there were not many needs to apply a change to the local storage, while the minor version number passed 10.
  • Placement changes in the control panel
    • Input assignment and deadzone buttons are now laid vertically, to tell each buttons on the same row are for the same gamepad slot.
    • Panel items are sorted by the frequency a user is expected to use after they set up.
    • Added a prompt for first input.
  • Added mapping for DualSense

Added a new skin Biker which is made to imitate the input overlay of Trials Rising. While trying to make this skin, I found some ways to expand the skin customization capability. Making this skin also got me into fixing a lasting bug, where the sticks were stuttering during fading out if they're not at the exact centre position.

  • make drawImageByPos to accept single axis inputs
    Now you can use this instruction for trigger buttons which have a single axis input.
  • apply alpha values for button fading-out process
    This change removes duplicated lines in Disc D-pad skins. Corresponding changes were also made on the wiki page.
  • add an alternative stick state check
    This change adds a new property option for skin customization. See the wiki page linked above.
  • fix stick stuttering when fading out
  • add Biker skin
    This is a simple looking skin only showing one analog stick and both trigger buttons. This skin uses the new property option, and some long chains of instruction to achieve some effects. Here's a link to the skin file.

  • changed the sprite for shoulder buttons of Disc (Super) skin to a new one instead of the inherited one from gamepad skins
  • moved shoulder buttons and other buttons of MegaPad skin away from each other by 2px

The dpad and buttons felt distanced a bit much, but I wasn't sure if it's better to put them closer.
I adjusted their position, and also added a semi-transparent background for the buttons as they're not placed over a right stick, not like in the modern gamepad skin.

  • Adjusted the position of sub buttons in M layouts so it looks less different to the actual joystick while keeping the buttons in a row.
  • The button row and the main area of the stick and face buttons are slightly distanced so there is a space for the start button between them, if someone wants to add it in the skin.
  • Sprites for a smaller button for joystick skins are added to the spritesheets.
An input fading right after being released makes it much easier to tell inputs that were just involved in the action a moment ago, and ones that are not involved in the action currently happening. I decided to make this a default set of values after using it for a while.

Time8, 16, 320, 8, 12
Opacity0.5, 0.1, 00.5, 0.1, 0