Skip to content

Button and Axis Mappings

hifihedgehog edited this page May 21, 2026 · 33 revisions

Button and Axis Mappings

The Mappings tab is per virtual controller. One table per slot, no matter how many physical devices are assigned. Cross-device input combines naturally inside a single row.

Button and axis mapping grid with source, value, and record columns


Mapping grid

Column What it does
Output The virtual output this row controls ("A", "Left Stick X", "D-Pad Up"). What the game sees.
Sources One or more physical inputs that drive this output. Pick by hand, use Record, or click + Add source to add another. Sources get letter tags a, b, c, … in the order you add them.
Value Live readout of the row's combined output. Updates in real time so you can verify on the spot.
Combine How multiple sources merge into the row's output. Hidden until a row has two or more sources. See Combine modes.
Record Press a button or move an axis on any assigned physical controller. PadForge fills in the source automatically.
Clear Removes every source on the row, resets per-source options to defaults, and blanks the dropdowns.
Options Per-source toggles: Kind, Inv (Invert), Half (Half-axis), Bidirectional, Deadzone. Axes-only options stay hidden for button-only sources.
Axis-to-Button Deadzone Slider (0-100%) for how far an axis must move before a discrete output fires. Per source. See Axis-to-Button Deadzone.

Tip: The Value column reflects deadzone, center offset, max range, and combine math in real time. What you see is what the game gets.

Rows group by category: Buttons (face, shoulder, stick clicks, system), Left Stick / Right Stick (X and Y axes), Triggers (left and right), D-Pad (four directions).


Three ways to bind

1. Record

The fastest way to assign one source.

  1. Click Record on the target row.
  2. The button changes to "Recording..." and the row pulses blue.
  3. Press the button or move the axis on any physical controller assigned to this slot.
  4. PadForge detects the input, fills in the source, and stops recording.

PadForge detects buttons (first press), axes (movement past a threshold), D-pad / POV directions, and mouse axes.

Tip: Move only the input you want. Wiggling a stick while pressing a button can catch the stick instead. Push sticks firmly and pull triggers far enough to cross the detection threshold.

2. Source dropdown

Each source has a cascading dropdown: first pick the device, then the input. The manual alternative to recording.

  • Recognized gamepads (Xbox, DualSense, DualShock 4, Switch Pro, etc.) show friendly names. "A", "B", "Left Stick X", "Right Trigger".
  • Raw or unrecognized devices (generic joysticks, racing wheels, flight sticks, Force Raw Joystick Mode) show numbered names. "Button 0", "Axis 0", "POV 0 Up".
  • All raw buttons are listed, including ones past the standard gamepad set of 11. Devices like the DualShock 3 (via DsHidMini SDF) expose up to 17 raw buttons. Buttons 11 to 16 all appear in the dropdown for mapping.
  • Offline devices keep their last known inputs. If a controller is disconnected, its dropdown still shows the full input list from the previous session. You can edit mappings without the device plugged in.

Picking an input assigns it on the spot. Same result as recording. The blank entry at the top clears the source.

When to use dropdown vs. recording

Dropdown Recording
You know the exact input you want ("Axis 3") You're setting up a new controller from scratch
Recording caught the wrong input You want to press each button in turn
The input is hard to isolate physically (a specific D-pad direction)

Tip: If recording keeps catching the wrong input (a stick when you meant a button), use the dropdown to pick the exact source by hand.

3. Map All

Map All walks through every row in order. The fastest way to set up a controller from scratch.

  1. Click Map All (on the Controller tab or the Mappings tab toolbar).
  2. PadForge highlights the first row and starts recording.
  3. A blue prompt shows which output it expects ("Press A").
  4. Press the matching button or move the matching axis.
  5. PadForge captures the input and moves to the next row.
  6. Repeat until done. Click Stop (or press Escape) to stop early.

Rows that already have a source are still in the sequence. Pressing an input overwrites the existing source. Skipping keeps it.

On PlayStation virtual controllers, TouchpadClick is appended to the recording sequence as the final step. The 2D and 3D controller views render the touchpad as a clickable surface. Clicking it (mouse or touch) records the same TouchpadClick assignment.

Tip: Start with Map All to assign everything in one pass, then fine-tune individual rows.


Auto-mapping

When you assign a recognized gamepad (Xbox, DualSense, DualShock 4, Switch Pro, etc.) to a slot, PadForge fills in default rows matching the standard layout. All sticks, triggers, buttons, and D-pad directions pre-assigned.

Assigning a second physical device to the same slot extends existing rows with new sources rather than overwriting them. The combine mode picks per output type:

  • Buttons and D-pad directions: Either (any source fires the output).
  • Sticks and triggers: Strongest (the source pushing hardest wins).

Existing custom rows are left alone. Auto-mapping never clobbers a row you edited by hand.

Unrecognized devices (generic joysticks, flight sticks, raw-mode devices) do not get auto-mapping. Use Map All, recording, or the source dropdown to set them up.


Multiple sources per row

A row can drive its output from any number of physical inputs, across any combination of assigned devices.

Adding sources

Click + Add source on any existing source to add another. The new source gets the next letter tag (a is the first, b the second, c the third, …). Letter tags appear next to the source on the row and inside the formula editor as variable names.

Per-source options

Each source carries its own settings:

Option What it does
Kind How the source is read. Direct, Incremental, or Invert On Hold. See Source kinds.
Inv Flips the source's value sign before the combine step.
Half Treats a bipolar axis source as half-range (one side of center only).
Bidirectional Half-axis only. Fires the axis-to-button gate when the input moves past the deadzone in either direction from center. Renamed from "Either" in 3.2.
Deadzone Per-source axis-to-button activation threshold. See Axis-to-Button Deadzone.
Sensitivity Gyro sources only. Per-source multiplier on the calibrated rate. 1.0 is the engine default (500°/s reaches full deflection). Above 1.0 = more sensitive, below 1.0 = less.

Direction badges

On a bipolar-axis source feeding a stick or trigger, the row shows a direction badge next to the source:

  • → + the positive half of the axis maps to the positive output.
  • ← − the positive half of the axis maps to the negative output.

The badge updates when you toggle Inv or Half on that source, so the visible badge always reflects what the source will do at runtime.


Combine modes

The Combine picker is hidden on rows with one source (there is nothing to combine). It appears as soon as you add a second source.

Mode What it does
Strongest Use whichever source has the strongest push
Combined Add the sources together
Average Halfway between the sources
Either Fire when any source is active (good for buttons)
Both Fire only when all sources are active
Only one Fire only when exactly one source is active
Custom Build your own with the formula editor

For axis rows, Strongest is the auto-mapping default. For button and D-pad rows, Either is the default.


Custom formula editor

Pick Custom in the Combine column to open the formula editor under the row.

Variables

Name Refers to
a, b, c, … The row's sources in order. a is the first source, b the second, and so on.
s[0], s[1], … Index-based alias for the same sources. s[0] is a, s[1] is b, …

Operator palette

The operator palette sits next to the formula box. Drag an operator into the formula or click Insert to drop it at the cursor.

Group Operators
Arithmetic +, , ×, ÷, (, ), -a
Comparisons <, >, , , =,
Logic &&, ||, !
Branch if ? : else
Math abs, min, max, clamp, sign, lerp, round, sqrt
Constants 0.5

Live preview

Under the formula box, PadForge shows:

  • The formula's current numeric value, recomputed every frame.
  • Parse status: ✓ valid, parse error, or ✓ empty (evaluates to 0).
  • A "refs" line listing any variables the formula uses that have no source yet ("a and c have no source, treated as 0").

Starter recipes

The Starter recipes section lists ready-made formulas you can drop into the box and tweak.

Recipe What it does
Half scale a at half strength.
Quarter scale a at quarter strength.
Reverse a Flip a's sign.
Cap to ±1 Sum a + b but never exceed ±1.
Weighted blend 70% of a plus 30% of b.
Difference a minus b.
a unless idle Use a. If a is at rest, fall back to b.
Threshold gate Fire fully if a is past halfway, otherwise zero. Turns an axis into a button.
Both pressed Fire only when a and b are both pushed.
Stronger wins Whichever of a or b is pushed harder, with sign.

Source kinds

The Kind dropdown on a source picks how PadForge evaluates that source per frame.

Kind What it reads
Direct The source descriptor's raw value. The default.
Incremental Ramps an accumulator via Up / Down buttons you pick. Configurable rate (units per second), sticky-vs-snap behavior (hold value when both released, or snap back to floor), and clamp range (Min / Max).
Invert On Hold The inner source's value, flipped while a modifier button you pick is held.

Direct sources read the descriptor you assigned. Incremental sources ignore the descriptor and read the Up / Down buttons you configure. Invert On Hold sources read the descriptor, then flip while the modifier is held.


Modifiers

The per-source toggles in the Options column. These are per source, not per row.

Inv (Invert)

Flips the source's value sign. Push a stick up and the source reports "down". Use this when a controller reports an axis opposite to what the virtual output expects.

Half (Half-axis)

Treats a bipolar axis source as half-range (0 to max) instead of full-range (-max to +max). Use this when:

  • Mapping a trigger (0-100%) to a full stick axis (-100% to +100%).
  • Mapping a stick axis to a trigger where only positive deflection should register.

Bidirectional

Half-axis only. The axis-to-button gate fires on absolute deflection past the deadzone, so either side of center counts. Renamed from "Either" in 3.2. Inv has no effect in this mode (mirroring around center already covers both directions).

Descriptor prefixes

On raw or unrecognized devices, the Inv and Half toggles also surface as prefixes on the descriptor itself.

Prefix Meaning Example
I Inverted "IAxis 1"
H Half-axis "HAxis 0"
IH Both "IHAxis 2"

Recognized gamepads show friendly names instead. You only see these prefixes on numbered raw descriptors.


Shift layers

A shift layer is a second mapping table on the same slot, active only while a button is held, a chord is engaged, or an axis is past a threshold. Same outputs, different bindings. Useful for double-duty controllers (driving / on-foot, weapon swap, menu nav) without juggling profiles.

Each slot can carry any number of shift layers, each with its own activator and its own row set. Unmapped targets on a layer fall through to the Base layer by default (toggleable per layer).

See Shift Layers for the full activator reference, mode list (Hold, Toggle, Custom, Cycle, Sticky), and per-layer options.


Axis-to-Button Deadzone

When a source feeds a discrete output (button, D-pad direction, keyboard key, MIDI note, or Extended HID button), the Axis-to-Button Deadzone column controls how far the source must travel before the output fires. This stops small joystick movement from triggering button presses by accident.

  • Each source has its own slider (0-100%) with an editable text field and a reset button.
  • The default is 50%. The source must pass the halfway point to fire.
  • The column is only enabled when the source is an axis or slider and the target is a discrete output. Axis-to-axis mappings (sticks, triggers, mouse movement, MIDI CCs) are not affected. Use the Stick Deadzones and Trigger Deadzones tabs for those.
  • A higher value (80%) means a firmer push before the button fires. A lower value (20%) makes it more sensitive.
  • Values persist per source and ride along with Copy, Paste, and Copy From operations.

Mapping a centered axis to two buttons

Flight sticks, racing wheels, and other devices with a centered axis (resting at 50%) need a special setup when mapped to two opposing buttons (left and right). Two rows, one source each.

Direction Source Inv Half Deadzone
Left Axis 0 Yes Yes 50%
Right Axis 0 No Yes 50%

Why this works:

  1. Half tells PadForge to use only one side of the axis range (center to edge) instead of the full swing.
  2. Inv on the left direction flips the active half. "Left of center" fires "Left". "Right of center" fires "Right".
  3. Deadzone at 50% means the source must travel 50% of the half range (25% of the full range) before the button fires. That gives a comfortable deadzone around the center rest position.

Without Half, a 50% deadzone would reference the full axis range, requiring 75% total travel to fire. Much less intuitive. With Half on, the deadzone percentage applies only within the active half, so the numbers behave the way you expect.

Tip: Start with 50% deadzone and adjust up or down depending on how much stick travel you want before the button fires. A higher value gives a wider neutral zone around center. A lower value makes the button respond sooner.


Raw descriptor names

For unrecognized devices or Force Raw Joystick Mode, the source picker shows numbered descriptors instead of friendly names.

Descriptor Meaning
Button 0, Button 1, ... Physical button by zero-based index
Axis 0, Axis 1, ... Physical axis by zero-based index. Typical order: LX(0), LY(1), LT(2), RX(3), RY(4), RT(5), but varies by device
POV 0 Up, POV 0 Right, ... Direction on POV hat 0 (most controllers have one)
Slider 0, Slider 1 Slider axes (flight sticks, throttles)
Mouse X, Mouse Y Mouse movement axes
Gyro Pitch, Gyro Yaw, Gyro Roll Calibrated gyro rate axes on devices with motion

The I and H modifier prefixes can appear before any of these.


Copy, Paste, Copy From

The toolbar above the mapping grid has bulk operations.

Button Action
Clear All Removes every source and resets every Axis-to-Button Deadzone to 50% for this slot.
Copy Copies the current mapping table to the clipboard.
Paste Applies a copied table. Translates automatically if source and target controller types differ.
Copy From Copies the table from another slot. Translates automatically if types differ.
Map All Starts the Map All wizard.

Multi-source rows round-trip whole. Every source on a row, its kind, every per-source option, the combine mode, and the custom formula all copy together.

Per-row Copy and Paste are available from the row's context menu. Same round-trip rules apply.

Cross-type translation

Copy From and Paste translate mappings between controller types automatically.

Translation Example
Xbox to PlayStation A → Cross, B → Circle, X → Square, Y → Triangle, LB → L1, RB → R1, etc.
PlayStation to Xbox Cross → A, Circle → B, Square → X, Triangle → Y, etc.
To or from DirectInput Translated via the standardized gamepad mapping

Both buttons and axes translate. Pasting to the same controller type applies mappings unchanged.

Tip: Copy From saves time with multiple controllers. Set up the first, then Copy From on the rest.


Custom DirectInput mappings

For Extended (HIDMaestro) slots, the mapping grid adjusts to match the active HIDMaestro profile's layout (or your override values when Customize is on).

Category Rows shown Axis pool
Sticks X and Y per stick (0-4 sticks) 2 axes per stick
Triggers One per trigger (0-8 triggers) 1 axis per trigger
Buttons One per button (0-128 buttons) .
POVs Four directions per POV hat (0-4 hats) .

Sticks and triggers share a pool of 8 axes. Example: 2 sticks (4 axes) + 2 triggers (2 axes) = 6 of 8 used. Changing the DirectInput config rebuilds the mapping grid automatically.


Troubleshooting

  • An axis moves the wrong direction. Turn on Inv on that source.
  • A trigger mapped to a stick only reaches 50%. Turn on Half to expand half-range input to full-range output.
  • Recording keeps catching the wrong input. Use the source dropdown to pick the exact input by hand.
  • Buttons or axes are missing or numbered wrong. Try Force Raw Joystick Mode on the Devices page to bypass gamepad remapping.
  • A joystick axis fires a button on the slightest touch. Raise the Axis-to-Button Deadzone on that source.
  • A centered axis mapped to two buttons fires both at rest. Turn on Half on both sources, Inv on one direction, set deadzone to 50%. See Mapping a centered axis to two buttons.
  • Two sources on the same row fight each other. Switch the row to Either (buttons) or Strongest (axes), or pick Custom and write a rule that resolves the conflict.
  • A custom formula shows "parse error". The status line points at the bad token. Common causes: a stray operator, a missing close paren, = used for equality instead of ==.

Related pages

Last updated for PadForge 3.2.0.

Clone this wiki locally