-
Notifications
You must be signed in to change notification settings - Fork 6
Macros
Fire action sequences from controller inputs. Hold a combo, deflect a stick, push the D-pad, or run a macro every frame with no trigger at all.

Each slot has its own macro list. Open a slot, switch to the Macros tab, and click Add.
- Open a slot. Click the Macros tab.
- Click Add and name the macro.
- Set a trigger. The input combo that fires the macro.
- Add one or more actions. The steps that run when the trigger fires.
- Pick a fire mode and a repeat mode.
Each row has an enable checkbox. Unchecked macros stay in your settings but do not fire.
A trigger can mix buttons, axes, and D-pad directions. Up to 8 inputs in one combo. All of them must be active at the same time. Combo entries can come from more than one physical controller. A left-hand pad and a right-hand pad can fire one shared macro.
You pick where the trigger reads its inputs:
| Source | Reads from | Use when |
|---|---|---|
| Output Controller | The virtual controller after mapping (A, B, X, Y, LB, LT, etc.) | Most setups. The trigger keeps working when you swap physical devices. |
| Input Device | Raw inputs on one specific physical controller | The button is outside the standard 11 (touchpad click, pressure buttons, flight-stick extras), or you want a device-specific combo. |
- Click Record Trigger.
- Hold the buttons you want.
- Push a stick or pull a trigger past the threshold to add an axis input.
- Tap a D-pad direction to add a hat input.
- Click Stop when the inputs you want are listed.
| Type | Behavior |
|---|---|
| Button | Pressed buttons go into the combo. LB + A means both held. |
| Axis | Fires when the stick or trigger crosses the threshold. Each axis entry has its own Invert, Half, Bidirectional, and Deadzone options, the same set the merge-mapping editor uses on axis-to-button sources. Half by itself picks one side of center (Invert flips which side). Half plus Bidirectional fires past the deadzone on either side. This lets you bind separate macros to left-stick-left and left-stick-right, or one macro to "deflected past N percent in any direction". |
| D-pad / POV hat | Fires when the hat matches the recorded direction. The match is a 45-degree sector, so "Up" also catches small diagonals. |
A mixed example: LB + Right Stick X (Positive) + D-pad Up. All three must hold for the macro to fire.
When the trigger has an axis, a threshold slider appears (1 to 100 percent, default 50). The axis must cross that percent to count.
- 10 percent. A tiny push fires the macro.
- 90 percent. You need to push almost all the way.
- With a direction filter, the threshold only applies to that half of the axis.
Pick Custom Expression in the Trigger picker when the shape you want is bigger than a fixed combo. Chords across two pads. "Press this only if that other thing isn't pressed." Axes crossing a threshold that depends on another axis. Anything you can write as a small expression.
Add as many variables as the formula needs. Each one becomes a letter: a for the first, b for the second, then c, d, e, and as many more as you add. The formula refers to those letters.
Each variable binds to one of two things:
- An Input Device input: any button, POV direction, or axis on any physical device assigned to the slot.
- An Output Controller channel: any button or axis on the slot's combined virtual controller output. The macro reacts to what the slot is emitting after merge, so a macro can fire on its own virtual controller's behavior.
Click Record on a variable row, push the input you want it to follow, and PadForge fills it in. Click Clear to wipe a binding.
The Trigger Formula text box accepts:
- Variables:
a,b,c, … (or the indexed forms[0],s[1], …). - Operators:
+,-,*,/,&&,||,?:. - Math functions:
abs,min,max,clamp,sign,lerp.
| Recipe | What it does |
|---|---|
| a alone | Fire when variable a goes from 0 to 1. |
| a and b | Fire only when both a AND b are active (chord). |
| a or b | Fire when either a OR b is active. |
| a but not b | Fire when a is active and b is NOT active. |
| Axis past 50% | Fire when stick axis a is deflected more than 50% from rest. |
Click a recipe to drop it into the formula box.
Rising-edge detection. The macro fires once when the formula's value crosses 0.5 going up. It does not fire again until the value drops below 0.5 and rises past it.
Boolean variables (button held, POV match) read as 0 or 1. Axis variables read from 0 to 1 by deflection. A chord of two buttons crosses 0.5 when both go high. An axis past 50 percent crosses 0.5 on the first frame the deflection exceeds half-range.
See Button and Axis Mappings for the cross-device input picker the variable rows share with the rest of the app, and for the operator palette the Trigger Formula box uses.
| Mode | When it fires |
|---|---|
| On Press | Once, the moment the trigger becomes active. Good for one-shot commands and toggles. |
| On Release | Once, the moment the trigger releases. Good for charged shots. |
| While Held | Every frame while the trigger is active. Good for turbo fire and live mouse control. |
| Always | Every frame, with no trigger. Good for stick-to-mouse and a permanent volume knob. |
Actions run in list order, top to bottom, each time the macro fires.
Press or release a virtual controller button. Button Press has a duration in milliseconds and auto-releases.
- Names follow the slot's output type (Xbox labels, PlayStation labels, or numbered buttons for Extended Custom).
- Select more than one button to fire them together.
Send a keyboard keystroke. The game sees it as a real key.
- Combos work (Ctrl+C, Ctrl+Alt+Delete, etc.). Keys press in order and release in reverse.
- Type the combo string or pick from the dropdown.
Pause the sequence for the given number of milliseconds.
Force a virtual controller axis to a fixed value.
| Axis | Value range |
|---|---|
| Stick (LX, LY, RX, RY) | -32768 to 32767. 0 is center. |
| Trigger (LT, RT) | 0 to 32767. 0 is released. |
Map an axis to Windows master volume. Updates every frame.
- Axis. Which axis drives volume.
- Invert. Release-to-louder.
- Show volume OSD. The Windows volume flyout. On by default. Updates at about 5 Hz so it does not spam.
- Volume Limit. Caps the maximum. 30 to 50 percent is a safe start for protecting your ears.
Same as System Volume, but it drives one app in the Windows audio mixer.
- Process name. The app to control (Spotify, Firefox, Discord). The dropdown lists apps that are playing audio right now.
- The other options match System Volume.
Map an axis to cursor movement. Updates every frame.
- Sensitivity (1 to 100). Pixels per frame at full deflection. 10 to 15 is a good start.
- X axes move horizontally, Y axes move vertically.
- Sub-pixel accumulation keeps the cursor smooth at low sensitivity.
Press or release a mouse button. Press has a duration in milliseconds and auto-releases. Buttons: Left, Right, Middle, X1 (Back), X2 (Forward).
Map an axis to scroll wheel movement. Updates every frame.
- Sensitivity. Scroll units per frame at full deflection. 3 to 5 is a good start.
- Stick Y scrolls in both directions. Triggers scroll one way.
Push an RGB color to every Sony pad on the slot as a temporary override. The override beats the base lightbar mode and the Input Reactive overlay. Game-driven writes still win at the packet level.
Two hold modes:
- Reactive. Run at full brightness, then fade to black over the Fade window. Good for damage flashes and kill confirms.
- Sticky. Hold the color at full brightness until a Lightbar Color Clear action or a fresh override replaces it. Good for armed / disarmed markers.
Available on slots that have at least one Sony pad (DualShock 4, DualSense, DualSense Edge).
Drop any active macro lightbar override on the slot. The base mode and Input Reactive overlay come back.
Change the slot's base lightbar mode to a specific value (Static, Rainbow, Audio Pulse, etc.). Every Sony pad on the slot renders the new mode with its own palette and decay settings. Old Input Reactive base values translate to LightbarMode = Off plus the matching overlay.
Step through an ordered list of base lightbar modes. Each fire advances one step. The list wraps at the end.
Drive the slot's physical rumble from a macro. Per-motor strength from 0 to 100 percent, so a macro can hit one motor by itself or both together. Two hold modes match Lightbar Color:
- Reactive. Run at full strength across the Hold window, then fade to zero across the Fade window. Good for hit / shoot / confirm pulses.
- Sticky. Hold at full strength until a Stop Rumble action runs. Good for armed states and click-and-hold sustain.
Macro rumble layers over game rumble with max(), so user feedback always reaches the motors. The merged rumble flows through the same per-pad-family writer the game uses: the dispatcher on Sony pads (DualShock 4, DualSense, DualSense Edge), raw HID on Xbox One+ pads (Xbox One, Elite, Series), and SDL on everything else.
End any active macro rumble override on the slot, no matter which motor was running. Pair this with a Sticky Rumble action to give the macro a clean release.
System Volume, App Volume, Mouse Move, and Mouse Scroll all read from one of two sources:
| Source | What you get |
|---|---|
| Output Controller (default) | The virtual controller's combined output after deadzone, range, and inversion. Device-independent. |
| Input Device | Raw input on one specific physical controller. Pick the device and axis from dropdowns. |
Pick Input Device when the axis is unmapped (a throttle lever you want for volume) or you want to skip the deadzone and curve math.
- Invert axis. Reverse the direction. Volume: release-to-louder. Mouse: opposite cursor.
- Show volume OSD. The Windows volume flyout. System Volume only. On by default.
- Click Add Action and pick the type.
- Set it up (button, key, delay, etc.).
- Add more rows. They run top to bottom.
- Use the delete icon to remove a row.
Quick melee combo:
- Button Press: Y (50 ms)
- Delay: 100 ms
- Button Press: B (50 ms)
Stick-to-mouse aiming (Always mode):
- Mouse Move: Right Stick X, sensitivity 15
- Mouse Move: Right Stick Y, sensitivity 15
| Mode | Behavior |
|---|---|
| Once | Runs one time. |
| Fixed Count | Runs N times in a row. |
| Until Release | Loops while the trigger is held. Requires While Held. |
Fixed Count and Until Release both have a Repeat Delay in milliseconds between runs.
Turbo fire: While Held plus Until Release, Button Press A (50 ms), repeat delay 50 ms. A presses every 100 ms (about 10 times a second) while held.
On by default. The trigger's buttons are stripped from the virtual controller output, so the game only sees the macro's actions.
| State | Game sees |
|---|---|
| On (default) | Macro output only. LB + RB are hidden. |
| Off | The trigger buttons and the macro output, both. |
Consume only applies to buttons on the Output Controller source. Input Device triggers are not part of the combined gamepad state, so there is nothing to consume.
| Type | Actions | Behavior |
|---|---|---|
| Sequential | Button Press / Release, Key Press / Release, Mouse Button Press / Release, Delay, Axis Set | One at a time, top to bottom. |
| Continuous | System Volume, App Volume, Mouse Move, Mouse Scroll | Every frame, all in parallel. |
Both types mix in one macro. Two Mouse Move actions (X and Y) run in parallel while a Button Press in the same list runs in sequence next to them.
- Fire mode: Always
- Action: System Volume. Axis: Left Trigger. Volume Limit 50 percent. OSD on.
Always mode means there is no trigger combo. The Volume Limit prevents an accidental blast.
- Fire mode: Always
- Actions:
- Mouse Move: Right Stick X, sensitivity 15
- Mouse Move: Right Stick Y, sensitivity 15
Lower sensitivity gives you precision. Higher gives you speed. Pair this with the bumper recipe below for full mouse control.
| Macro | Fire mode | Trigger | Action |
|---|---|---|---|
| Left Click | On Press | LB | Mouse Button Press: Left (50 ms) |
| Right Click | On Press | RB | Mouse Button Press: Right (50 ms) |
- Fire mode: While Held
- Trigger: Right Trigger axis, threshold 50 percent
- Repeat: Until Release, delay 50 ms
- Action: Button Press: A (30 ms)
A presses about every 80 ms (30 ms press plus 50 ms delay) while the trigger is past 50 percent. Release to stop.
- Fire mode: While Held
- Trigger: LB
- Consume trigger buttons: On
- Action: App Volume. Axis: Left Stick Y. Process: Spotify. Volume Limit 80 percent.
Hold LB and move the left stick up or down to set Spotify volume. The game never sees LB. The level stays where you leave it.
- Fire mode: On Press
- Trigger: D-pad Down + A
- Actions:
- Key Press: T (50 ms). Opens chat.
- Delay: 100 ms
- Key Press: G (50 ms)
- Delay: 50 ms
- Key Press: G (50 ms)
- Delay: 50 ms
- Key Press: Return (50 ms). Sends the message.
Increase the delays if the game needs more time between keystrokes.
Extended slots set to Custom support up to 128 buttons. The trigger recorder and the Button Press dropdown grow to match the slot's ButtonCount. Xbox, PlayStation, and gamepad-shaped HIDMaestro profiles use the standard button names.
- Delays under 10 ms may not register in some games. Start at 50 ms and work down.
- Test in the actual game. Timing needs change per title.
- Mixing button and axis inputs in one trigger cuts down on accidental fires.
- Mouse sensitivity 10 to 15 for cursor work. 3 to 5 for scrolling.
- Macros save per profile. Different games can have different macro lists through Profiles.
- Macro lightbar overrides do not override what the game writes at the packet level. A game that drives the lightbar each frame wins.
- Macro rumble layers with
max(), so a game holding a motor at full strength masks a weaker macro pulse. - Input Device triggers cannot use Consume trigger buttons. The raw input layer is upstream of the combined gamepad state.
- Button and Axis Mappings: set up base mappings before you add macros.
- Controller Slots: every slot has its own macro list.
- Devices: pick the physical device for Input Device triggers.
- Force Feedback: rumble and vibration settings the macro layers over.
- Profiles: Macros save per profile, so each game can have its own set.
- Troubleshooting: fixes for macros that do not fire.