Skip to content
hifihedgehog edited this page Jun 6, 2026 · 56 revisions
PadForge

PadForge

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.

Dashboard

HIDMaestro

Powered by HIDMaestro. One driver, 225+ device profiles.


What's new

3.3: Touchpad outputs, gesture engine, gyro passthrough toggle, per-device Copy / Paste

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: Mapping engine, gyro, impulse triggers

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.

The mapping engine, rebuilt

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.

Gyro at Steam Input parity

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.

Impulse Triggers tab

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.

Custom Expression macros

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.

Bulk virtual-controller toggle

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.

Lightbar Strobe and Battery

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.

Platform

  • 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.


Get started

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.

Pick a virtual controller type

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.

Map a button or axis

Recognized gamepads auto-map the moment you assign them. To rebind or to set up an unrecognized device, three ways:

  1. Press the button on your physical controller while the Mappings tab is open. PadForge records it.
  2. Pick from a dropdown. Every input the controller exposes is in the list (including raw HID buttons past the standard 11).
  3. 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, Sticky, Cycle, and Custom modes. Per-layer color and emoji icon.

Tune the feel

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.
💥 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 Thirteen DualSense and DualShock 4 lightbar modes including audio-pulse, audio-band, input-reactive, Strobe, and Battery.
🌀 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.

Power features

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. Four 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.
➡️ 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.
✏️ Touchpad Overlay On-screen transparent touch surface pinned to any monitor. Drives the DS4 / DualSense touchpad without a phone or physical pad.

Behind the scenes

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.

Developer reference

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.
🔧 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.

Clone this wiki locally