-
Notifications
You must be signed in to change notification settings - Fork 6
Home
Make any input look like any controller.
Plug in a steering wheel. The game sees a PlayStation pad. Use a DualSense. The game sees an Xbox 360. Map your keyboard. The game sees a flight stick. Open a tab on your phone. That tab becomes a gamepad your PC games can use.

Powered by HIDMaestro. One driver, 225+ device profiles.
The headline is Wii controller support. PadForge pairs a Wii Remote over Bluetooth itself, because Windows can't, and reads it through SDL. Several mapping additions land alongside it.
Wii Controllers pair over Bluetooth from a new Pair button on the Devices page. PadForge runs the handshake itself, because the Wii PIN is six raw bytes Windows will not generate. A bare Wii Remote maps its 11 buttons on the MISC slots. Add a Nunchuk for a stick plus the C and Z buttons. The Classic Controller and Wii U Pro Controller map as standard gamepads. The accelerometer and Motion Plus gyro flow through the Gyro pipeline. Attach or detach a Nunchuk mid-session and it re-identifies without a restart.
Two new sources, Mouse Position X and Mouse Position Y, read the absolute desktop cursor position and drive a stick, trigger, or button, each with a per-source Sensitivity control. New macro actions move the cursor too: Recenter Mouse, Fix Mouse Position, and Limit Mouse Region. See Button and Axis Mappings and Macros.
Shift Layers gain a queue. A Cycle activator now carries a Next button and a Previous button that walk one shared cursor through a checklist of layers, with Wrap Around and Include Base options. The old Custom mode is now Latch: press to hold a layer, press again for Base. A new No Button passive mode owns a tab you reach only through a Cycle queue. A Configure Base flyout names and colors the Base tab.
The Force Feedback tab gains a Trigger Routing card. It pushes the main rumble-motor strength into the trigger motors, one trigger at a time, with a per-trigger Source, a Duplicate-or-Redirect Mode, a Scale, and an optional Activator. It reaches Xbox impulse triggers and DualSense Adaptive Trigger Vibration on any output type.
A mapping's primary source picks its Kind from a Primary Mode dropdown: Direct, Incremental, Invert On Hold, or the new Ramp. Ramp turns two held keyboard keys into a smooth analog stick axis with Attack, Release, Reverse, and Autocenter. Macros pick up Duplicate, Copy, Paste, and Copy From for moving a macro between virtual controllers. See Button and Axis Mappings and Macros.
Four headline additions.
Remote Link connects the PadForge PCs on your network. A wheel, pad, or HOTAS plugged into one drives a game on another, both ways at once, and the feedback comes home: rumble, force feedback, adaptive triggers, lightbar, player LEDs, and the controller speaker all play on the physical device wherever it lives. Connect as many PCs as you like. Pair each pair of PCs once by matching a six-digit code on both screens. Trusted PCs reconnect on their own. A gamepad-only switch keeps a paired PC away from your keyboard, mouse, and macros.
Wheel force feedback now reaches Logitech, Fanatec, and Thrustmaster wheels in their own native protocols: constant force plus spring, damper, and friction from the game. A dedicated Wheel tab sets rotation range in degrees, auto-center strength, and the RPM shift LEDs. Other force-feedback wheels still work through the generic Force Feedback path.
A MIDI keyboard or pad controller is now a mapping source. MIDI Input reads notes, Control Change knobs, pitch bend, and encoder dials and binds them like buttons and axes, so a piano key can press A and a mod wheel can pull a trigger. It rides the same Windows MIDI Services stack the MIDI virtual controller uses.
The DualSense and DualShock 4 have a speaker in the pad, and PadForge can drive it. Controller Audio mirrors a Windows output to the pad or plays a slot's macro sounds through it. The DualSense plays over USB or Bluetooth, the DualShock 4 over Bluetooth.
The Touchpad tab grew two output cards. Mouse Output maps a touchpad finger to mouse X/Y with per-axis sensitivity and invert. Stick / D-Pad Output turns a touchpad finger into a virtual analog stick (anchor-relative) and wedge-thresholded D-pad. Both save per slot, per device, per pad.
Behind the scenes the gesture engine fanned out per slot. The same physical touchpad can sit in two slots with different toggles, thresholds, and stick / D-pad tuning. Slot 1's "4-way OFF" truly stops 4-way fires from reaching slot 1's mapping rows even when slot 0 has 4-way ON.
Every touchpad feature toggle is off by default. Gestures and outputs are opt-in.
The Gyro tab grew a Motion Passthrough card. One slot-wide checkbox controls whether the rest of the tab's tuning (deadzone, sensitivity, smoothing, response curve, invert) reaches the motion the virtual controller reports and the DSU motion server. Off by default, so a fresh profile sends the calibrated reading and lets the game handle its own feel. Calibration drift correction always applies. See Gyro.
Copy, Paste, and Copy From snapshot every assigned device's per-device tuning (gyro, touchpad, FFB, impulse triggers, adaptive triggers, lighting), not just the device selected at copy time. Devices on the target slot match the source by InstanceGuid first (same physical pad), then ProductGuid (same controller model on a different physical unit). Unmatched target devices are left alone. See Button and Axis Mappings.
The Keyboard / Mouse virtual controller adds Print Screen, Scroll Lock, Pause, and Num Lock to the mappable-output list, and the keyboard preview now includes the matching PrtSc / ScrLk / Pause cluster.
3.2 is the release where the mapping engine grew up. One row can read from many physical inputs at once. Shift layers turn your face buttons into a Pit Stop menu when you hold a paddle. A drag-and-drop formula editor lets you bind "fire only when this axis is past halfway AND that other button is held." Behind it sits a gyro pass that closes the gap with Steam Input, and a dedicated Impulse Triggers tab so Forza shakes your real Xbox pad.
One mapping row can now read from any number of physical inputs across any number of devices. Six combine modes (Strongest, Combined, Average, Either, Both, Only one) plus a drag-and-drop custom formula editor. Cross-device chords. Shift Layers for an entire second mapping table on the side. Source kinds (Direct, Incremental, Invert On Hold) so one source ramps an accumulator while another flips a modifier. See Button and Axis Mappings.
A new Gyro tab on every slot whose pad has a motion sensor. Reference frames: Local, Player, World. Real-world calibration. A cross-device Aim Engage button (hold a paddle on the wheel to wake the gyro on the handheld). Tuning saves per pad per slot. Gyro Pitch / Yaw / Roll bind in the Mappings table as first-class sources.
PadForge passes Xbox impulse trigger data straight to your physical Xbox One, Elite, or Series pad. The same data routes to a DualSense as Adaptive Trigger Vibration so a DualSense playing Forza buzzes the triggers in step with an Xbox One pad doing the same. Audio-bass-driven trigger rumble and a constant trigger force that resumes when the game stops live on the same tab. See Impulse Triggers.
A new macro trigger mode that fires when a formula crosses 0.5. Bind any number of variables to physical inputs or to the slot's combined virtual controller output. Same drag-and-drop operator palette and starter recipes as the mapping formula editor. See Macros.
A new Profile Shortcut mode toggles every created controller on or off with one combo press. A flyout pops at the bottom of the screen to confirm. Great for "stepping away" without unplugging everything.
Lighting picks up two new modes. Strobe is a hard square-wave flash at the period you set. Battery paints the lightbar with your charge level: red at low, yellow at mid, green at full.
- 2026 Steam Controller works through the bundled SDL3 fork. Shows up on the Devices page like any other pad.
-
TouchpadClick is a first-class button (
SDL_GAMEPAD_BUTTON_TOUCHPAD). Web Controller and overlays use the canonical channel. - Misc 1 → Share on the Xbox virtual controller, with auto-map.
-
SDL3 and OpenXInput forks rebuilt for 16-slot XInput. SDL3 surfaces the Share button through OpenXInput's
XInputGetSystemButtons. - KBM mouse delta and scroll use a sub-pixel accumulator. Slow stick motion finally moves the cursor at low sensitivity.
-
App and Engine assemblies share
SharedVersion.cs. Versions cannot drift between the two projects again.
See the Release Notes for the full per-version change list.
Three pages cover everything you need to install PadForge and create your first virtual controller.
| Page | What it covers | |
|---|---|---|
| ⬇️ | Installation | Download the portable EXE. System requirements (Windows 10/11, x64). First-run setup. Optional drivers. |
| 🎮 | Dashboard | The main screen. Engine status, controller slots, motion server, web controller, and driver health on one screen. |
| ➕ | Controller Slots | How to add, configure, reorder, enable, disable, and delete virtual controllers. Up to 16, across five types. |
Each type maps your physical inputs to a different shape of virtual device. Pick the one matching the game you're playing.
| Type | Use when |
|---|---|
| Xbox (360 / One / Series / Elite / Adaptive) | The game wants an Xbox-style controller. The most common choice for Steam, Epic, and Microsoft Store games. |
| PlayStation (DualShock 4 / DualSense / DualSense Edge) | The game has special DualShock or DualSense features (PlayStation prompts, touchpad, gyro, adaptive triggers, lightbar). |
| Extended | Flight sticks, racing wheels, HOTAS throttles, third-party gamepads. 225+ HIDMaestro profiles cover specific hardware. A Custom mode lets you build a HID descriptor from scratch (up to 8 axes, 128 buttons, 4 POV hats). |
| MIDI | You're using the controller for music. Sticks become Control Change. Buttons become Note On / Off. |
| Keyboard + Mouse | The game has no controller support at all. Map physical inputs to virtual key presses and mouse moves. |
Recognized gamepads auto-map the moment you assign them. To rebind or to set up an unrecognized device, three ways:
- Press the button on your physical controller while the Mappings tab is open. PadForge records it.
- Pick from a dropdown. Every input the controller exposes is in the list (including raw HID buttons past the standard 11).
- Click Map All. PadForge walks you through every output button and axis one at a time. PlayStation slots end the sequence with TouchpadClick.
| Page | What it covers | |
|---|---|---|
| 🎯 | Button and Axis Mappings | The Mappings tab end-to-end. Multi-source rows. Cross-device chords. Six combine modes plus a drag-and-drop custom formula editor. |
| ⇧ | Shift Layers | A second mapping table that turns on while a button, chord, or axis is held. Hold, Toggle, Latch, Cycle, Sticky, and No Button modes. Per-layer color and emoji icon. |
| Page | What it covers | |
|---|---|---|
| ○ | Stick Deadzones | Six deadzone shapes (Scaled Radial, Radial, Axial, Hybrid, Sloped Scaled Axial, Sloped Axial). Per-axis anti-deadzone. Draggable sensitivity curves. Per-direction max range. Center calibration. |
| ◑ | Steering | Make a stick or controller tilt act like a steering wheel. Winding stick, 2D angle-to-axis, and gravity-based motion lean. At-lock rumble, lightbar, and adaptive-trigger feedback. |
| ▮ | Trigger Deadzones | Trigger floor and ceiling. Anti-deadzone. Sensitivity curves. Up to 8 triggers shared with sticks for Extended profiles. |
| 〰 | Force Feedback | Body rumble passthrough. HID PID 1.0 force feedback for wheels and joysticks. Audio bass rumble synthesized from system audio. Constant force vector. |
| 🏎 | Wheel | Native force feedback for Logitech, Fanatec, and Thrustmaster wheels. Rotation range, auto-center, and RPM shift LEDs on a tab of their own. |
| 💥 | Impulse Triggers | Xbox impulse trigger passthrough for Forza, Gears, and Halo. The same data routes to DualSense as Adaptive Trigger Vibration. Audio-bass-driven trigger rumble. Constant trigger force. |
| ∧ | Adaptive Triggers | Seven DualSense trigger effect modes. Live preview that draws the resistance and amplitude curve. One-click GameCube preset. |
| ☀ | Lighting | Fifteen DualSense and DualShock 4 lightbar modes including audio-pulse, audio-band, input-reactive, Strobe, and Battery. |
| 🔊 | Controller Audio | Play sound through the DualSense or DualShock 4 speaker. Mirror a Windows output or route macro sounds to the pad. USB and Bluetooth. |
| 🌀 | Gyro | Motion-sensor mapping at Steam Input parity. Local, Player, and World reference frames. Real-world calibration. Cross-device Aim Engage button. Tuning saves per pad per slot. |
| 👆 | Touchpad | Touchpad finger as virtual mouse (per-axis sensitivity + invert), virtual analog stick (anchor-relative), or D-pad. Gesture stack: swipes, taps, longpress, pinch, rotate, custom shapes. Per slot. |
| Page | What it covers | |
|---|---|---|
| ⚡ | Macros | Combo triggers (up to 8 buttons, axes, POV directions). Custom Expression triggers fire on a formula. Action sequences with key presses, mouse moves, scroll, volume, lightbar overrides, rumble overrides. Five fire modes. |
| 🔄 | Profiles | Per-app profiles that switch when a matching game gains focus. Controller-shortcut combos to cycle profiles, toggle the PadForge window, or toggle every virtual controller on or off in one combo. |
| 🧷 | Devices | Every detected gamepad, joystick, keyboard, mouse, and touchpad as a card. Per-device hiding. Live raw input. Force Raw Joystick mode for SDL3 misidentification. |
| 🎮 | Wii Controllers | Pair a Wii Remote, Nunchuk, Classic Controller, or Wii U Pro Controller over Bluetooth from the Devices page. Eleven Wii Remote buttons, the Nunchuk stick, and Motion Plus gyro. |
| 🎹 | MIDI Input | Use a MIDI keyboard or pad controller as a mapping source. Notes, CC, pitch bend, and encoders bind like buttons and axes. |
| ➡️ | DSU Motion Server | Broadcast gyro and accelerometer to Cemu, Dolphin, Yuzu, and Ryujinx over UDP port 26760. |
| 🌐 | Web Controller | Built-in server. Open a browser tab on any phone over Wi-Fi. Touch buttons, sticks, triggers, rumble feedback. Up to 16 phones at once. Multi-touch touchpad layout for the DS4 / DualSense touchpad. |
| 🔗 | Remote Link | Share a controller, wheel, or HOTAS with your other PCs on the network. Both directions, with rumble and force feedback returning to the real hardware. Pair each pair of PCs once with a six-digit code. |
| ✏️ | Touchpad Overlay | On-screen transparent touch surface pinned to any monitor. Drives the DS4 / DualSense touchpad without a phone or physical pad. |
| Page | What it covers | |
|---|---|---|
| ⚙️ | Settings | Language (10 locales). Theme. Polling interval. Auto-start. Window behavior. Driver install controls. |
| ⚒ | Driver Management | HIDMaestro (required, auto-installed on first run). HidHide (optional, for hiding physical controllers). Windows MIDI Services (optional, for the MIDI controller type). |
| ⏱ | Input Precision | 1000 Hz polling with sub-millisecond jitter. Bit-perfect axis pipeline. The math behind deadzones and sensitivity curves. |
| ❓ | Troubleshooting | Common problems and fixes. No devices detected. Virtual controller not appearing in games. Double input. Driver install failures. Rumble issues. |
PadForge is open source. These pages document every layer of the codebase for contributors and forks.
| Page | What it covers | |
|---|---|---|
| 🏗 | Architecture Overview | The 2-project .NET 10 solution. Project layout. SDL3-only input philosophy. MVVM model. Multi-thread layout. |
| 🔁 | Input Pipeline | The 6-step polling loop from SDL device enumeration through mapping, merge, macros, virtual controller output. |
| 📡 | SDL3 Integration | The P/Invoke layer. Hint configuration. Device enumeration with HIDMaestro filter. Gamepad vs joystick API dispatch. Custom SDL3 fork. |
| 🕹 | Virtual Controllers | The IVirtualController interface across five backends. HM lifecycle. Bubble-up cascade. |
| 📝 | HIDMaestro Deep Dive | The contract between PadForge and HIDMaestro. SDK surface. OpenXInput shim. Four-surface filter architecture. |
| 💾 | Settings and Serialization | PadForge.xml file format. UserDevice / UserSetting / PadSetting. AppSettingsData. Cross-layout mapping translation. Backward compatibility. |
| 🔗 | Services Layer | InputService, SettingsService, DeviceService, RecorderService, DsuMotionServer, ForegroundMonitorService, WebControllerServer. |
| 📊 | ViewModels | ViewModelBase. MainViewModel. DashboardViewModel. PadViewModel. DevicesViewModel. SettingsViewModel. Weak-event CultureChanged for live language switching. |
| 🖼 | XAML Views | MainWindow shell, page hierarchy, custom controls, value converters, theme switching. |
| 🎮 | 3D Model System | HelixToolkit rendering. ControllerModelBase. Per-controller meshes. Click-to-record via ray-cast hit testing. |
| 🗺 | 2D Overlay System | Resolution-independent PNG overlays. ControllerOverlayLayout generation. Schematic view for Extended profiles. |
| 📨 | DSU Protocol Implementation | MotionSnapshot. DsuMotionServer UDP socket. Packet format. CRC32. Subscription management. |
| 🛰 | Remote Link Internals | LinkDiscovery, LinkServer, the X25519 / Ed25519 pairing handshake and six-digit SAS, PeerTrustStore, the reverse output relay (OutputEffectCodec), gamepad-only enforcement. |
| 🔊 | Controller Audio Internals | AudioPassthroughService. The per-device sink model, WASAPI loopback mirror, USB and Bluetooth transports, Opus and clean-room SBC encoders. |
| 🏎 | Wheel Force Feedback | HID PID decode (HMaestroFfbDecoder), the three clean-room vendor writers, host-sampled vs firmware effects, and the RPM-LED telemetry sources. |
| 🎹 | MIDI Input Internals | MidiInputDevice as an ISdlInputDevice, the Windows MIDI Services runtime, the UMP parser, descriptor resolution and source coercion. |
| 🎯 | Wii Controllers Internals | WiiPairingService Bluetooth pairing ceremony (a port of Dolphin's IOWin), the SDL hidapi_wii read path, the RescanWiiControllers hint-toggle recovery, and the stickless-axis capability gate. |
| 🔧 | Driver Installation Internals | DriverInstaller class. HidHide WiX bootstrapper. Windows MIDI Services release query. HIDMaestro registers itself in-engine via HMContext.InstallDriver() and is not a DriverInstaller responsibility. |
| 📦 | Engine Library | PadForge.Engine assembly. Gamepad struct. ExtendedRawState. KbmRawState. ForceFeedbackState. IInputDevice surface. |
| 🛠 | Build and Publish | Building from source. Single-file publish. Native DLL packaging. Release workflow. |
Built on SDL3, HIDMaestro, OpenXInput, HelixToolkit, .NET 10 WPF, and Fluent Design.
