Skip to content
hifihedgehog edited this page May 20, 2026 · 63 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.


New in PadForge 3.2

The headline change in 3.2 is a rebuilt mapping engine. One virtual output can read from any number of physical sources, with shift layers and a chip-based formula editor sitting on top. The other big change is a gyro overhaul that closes the gap with Steam Input. Plus a dedicated Impulse Triggers tab and a year's worth of smaller fixes.

Mapping

  • Shift Layers. Each slot can carry extra mapping tables that activate while a button, chord, or axis is engaged. Five activation modes (Hold, Toggle, Sticky, Cycle, Custom jump-to). Per-layer color, emoji icon, and a Win11-style flyout that confirms the active layer. Layers replace the Base table or overlay it (with per-row no-inherit). Layers are cross-device. Activator chords work across two pads.
  • Multi-source rows. The Mappings tab is now per-virtual-controller, not per-device. One row can take input from any number of physical sources, on any device. Combine modes: Strongest, Combined, Average, Either, Both, Only one, Custom formula.
  • Custom formula editor. Drag-and-drop chips for arithmetic, comparisons, logic, if-then-else, abs / min / max / clamp / sign / lerp. Live parse status. Starter recipes (Half scale, Weighted blend, Threshold gate, Both pressed, A unless idle, …).
  • Source kinds. Each source can be Direct, Incremental (rate-of-change via Up/Down buttons with sticky/clamp), or Invert On Hold (flip the row while a modifier is held).
  • Bidirectional half-axis. A half-axis source can fire past the deadzone in either direction. Renamed from "Either" to spell out what it does.
  • Per-source gyro sensitivity. When a row reads from a Gyro source, the sensitivity dial sits on the row, not buried in the Sticks tab.

Gyro (Steam Input parity)

  • Dedicated Gyro Pad-page tab. Moved out of Devices, given proper section cards (Calibration, Sensitivity, Response Shaping, Engage, Easy Aim).
  • Reference frames. Local, Player, World.
  • Aim Engage. Cross-device button picker that gates gyro to a button hold or stick deflection. Device-name subtitle under the picker.
  • Dual-threshold smoothing, real-world calibration, per-axis invert, per-(device, slot) persistence.
  • Gyro-to-virtual-stick is rate-direct (not integrated). Stick recenters on engage release.
  • Gyro motion bindings in the Mappings table. Bind Gyro Pitch / Yaw / Roll like any other source.

Impulse Triggers

  • Dedicated tab for Xbox One / Elite / Series and DualSense pads. Three sections in one place.
  • Game-driven passthrough. Forza, Gears, Halo, and any game that drives Xbox impulse trigger motors reaches the real trigger motors on the assigned pad. DualSense receives the same data as Adaptive Trigger Vibration. No setup.
  • Constant Trigger Force. Per-device toggle plus Left / Right sliders apply a continuous force to each trigger motor until you turn it off. Game-driven force overrides while active and resumes when the game stops.
  • Audio Bass Trigger Rumble. Trigger motors run their own audio-driven rumble with separate sensitivity, bass cutoff, and per-trigger level. Runs alongside the existing main-motor audio rumble.
  • Xbox One+ rumble now writes raw HID directly. Fixes inconsistent rumble across XInput, WGI, and GameInput backends.
  • Custom Expression trigger mode. Macros can fire on a formula crossing 0.5. Variables a, b, c, … bound to Input Device (a button / POV / axis) or Output Controller (the slot's combined virtual output). Same chip palette and recipes as the mapping formula editor.
  • Multi-device combos in macro triggers, axes included.
  • Per-entry axis options for axis triggers: Invert, Half-axis, Deadzone. Matches the merge-mapping options.

Profiles and shortcuts

  • Bulk virtual-controller toggle. A new Profile Shortcut mode toggles every created controller on or off with one combo press. A bottom-of-screen flyout confirms the new state.
  • Stable selection across language switches. The Profile Shortcuts dropdowns no longer clear their selection when you change the app language.
  • Strobe mode for DualSense and DualShock 4. Square-wave flash at the configured period.
  • Battery mode. Lightbar color reflects current battery level (red → yellow → green). Push-driven refresh.

Devices and platform

  • 2026 Steam Controller supported. Once Valve's mainline change landed in upstream SDL, PadForge's SDL3 fork picked it up. The new pad shows up on the Devices page and maps like any other gamepad.
  • TouchpadClick is now a first-class button (Buttons[21] = SDL_GAMEPAD_BUTTON_TOUCHPAD). Web Controller and overlays use the canonical channel.
  • Misc 1 → Share label on the Xbox virtual controller, with auto-map.
  • SDL3 and OpenXInput forks bumped to 16-slot XInput builds. SDL3 surfaces the Share button via OpenXInput's XInputGetSystemButtons.
  • KBM virtual controller: sub-pixel accumulator on mouse delta and scroll.
  • App and Engine assemblies share SharedVersion.cs so versions cannot drift.

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

Three ways to bind a mapping. Pick whichever feels faster for what you're doing.

  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 chip-based 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.
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. Per-(device, slot) tuning persistence.

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.

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. Three-surface 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. HIDMaestro INF install. HidHide WiX bootstrapper. Windows MIDI Services release query.
📦 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