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

3.2 is a feature release. The headline change is a rebuilt mapping engine that lets one virtual output read from many physical sources at once, with shift layers and a formula editor sitting on top. Plus a gyro overhaul that closes the Steam Input gap, a dedicated Impulse Triggers tab, and a long list of smaller wins.

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

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

See Button and Axis Mappings for the full mapping reference.


Tune the feel

PadForge has six deadzone shapes (Scaled Radial, Radial, Axial, Hybrid, Sloped Scaled Axial, Sloped Axial), per-axis anti-deadzone, draggable sensitivity curves, and per-direction max range. The defaults are set so most controllers feel right with zero changes.

Page What it covers
Stick Deadzones Per-axis deadzone shapes, anti-deadzone, center calibration, sensitivity curves with draggable points, per-direction max range.
Trigger Deadzones Trigger floor and ceiling. Anti-deadzone. Sensitivity curves. Up to 8 triggers shared with sticks for Extended profiles.
Force Feedback Rumble passthrough. HID PID 1.0 force feedback for wheels and joysticks. Audio bass rumble synthesized from system audio.
Adaptive Triggers Seven DualSense trigger effect modes. Live preview that draws the resistance and amplitude curve. One-click GameCube preset.
Lighting Thirteen DualSense / DualShock 4 lightbar modes including audio-pulse, audio-band, and input-reactive.

Power features

Page What it covers
Macros Combo triggers (up to 8 buttons, axes, POV directions). 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 or toggle the PadForge window.
🧷 Devices Every detected gamepad, joystick, keyboard, and mouse 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