couch-parsec turns a keyboard into a real virtual Xbox 360 controller on Windows, so a friend with no gamepad can play local co-op FIFA / EA FC with you over Parsec, or on the same PC. It fixes the specific failure where Windows merges every keyboard into one input stream and Parsec re-injects a guest's keystrokes as the host's own — the reason "just have Player 2 use the keyboard" doesn't work by default.
Also useful for: turning a keyboard into an Xbox controller for any game that only supports one keyboard device, remote co-op without a second gamepad, and split-input local multiplayer on Windows in general.
- The problem: why FIFA co-op over Parsec breaks with two keyboards
- The fix: a real virtual gamepad, not a keystroke hack
- Quick start
- How it works
- Requirements
- FAQ
- Honest limits
- License
You and a remote friend want to play offline co-op on your copy of FIFA. Only one of you has a controller; the other only has a keyboard on their end of the Parsec call. That doesn't work, for two stacked reasons:
- Windows only ever exposes one "keyboard." Every physical keyboard attached to a PC gets merged into a single input stream, and FIFA's controller-assignment screen can only bind one player to it. There's no in-game setting that splits it — the OS itself has already flattened the distinction before the game ever sees a keystroke.
- Parsec makes it worse, not better. When your friend (the guest) presses a key, Parsec injects that keystroke on your PC (the host) as if you had typed it yourself. Both players end up feeding the exact same input stream, so FIFA sees one keyboard being mashed by two people — not two players.
Parsec does forward real gamepads correctly, creating a distinct virtual controller per guest. So the fix isn't a FIFA setting or a Parsec setting — it's to stop presenting a keyboard as a keyboard.
couch-parsec uses the ViGEmBus
driver to turn a keystroke stream into a real virtual Xbox 360 controller —
one that Windows, Parsec, and FIFA all enumerate as genuine hardware, fully
independent of the host's own keyboard/controller. Run it on the guest's PC
and Parsec forwards their virtual pad like any other gamepad, so FIFA sees
two separate, correctly assignable devices and each player claims their own
side at team select.
The core tool (kb2pad.py) itself doesn't know anything about FIFA — it just
maps keys to gamepad axes/buttons — so it works for any game that reads a
controller, but the config, docs, and default key layout in this repo are
tuned specifically for FIFA/EA FC Kick-Off co-op.
- Install ViGEmBus (reboot after).
- Install Python (tick "Add python.exe to PATH").
- Double-click
START_kb2pad.bat. It elevates to Administrator, installsvgamepad+keyboard, and starts the tool usingkb2pad_config.json. - Verify with
Win+R→joy.cpl→ Xbox 360 Controller for Windows.
Full walkthrough — topology choices, Parsec/FIFA settings, remapping, and troubleshooting — is in SETUP.md.
If you're Player 2 and just need to know which keys do what, see PLAYER2_KEYS.md.
keyboard ──► kb2pad (keystrokes) ──► virtual XInput pad ──► Parsec / game
kb2pad.py hooks a configurable set of keys, tracks their state, and drives
a vgamepad virtual controller at up to 120 Hz — WASD-style keys become an
analog stick (with diagonals normalized so holding two keys isn't faster than
one), other keys map to face buttons, shoulders, triggers, and the d-pad.
Everything is remappable in kb2pad_config.json.
py kb2pad.py --show-layout # print the current key map and exit
Pause (Ctrl+Alt+P) hands the keyboard back to Windows instantly; quit
(Ctrl+Alt+Q) releases the virtual pad.
- Windows (ViGEmBus is Windows-only)
- Python 3.9+
- ViGEmBus driver
pip install -r requirements.txt(handled bySTART_kb2pad.bat)- Administrator rights (needed for global key hooks / suppression)
No — Windows merges every attached physical keyboard into a single logical
input device, so a game can only ever assign "the keyboard" to one player.
There is no OS or game setting that splits one keyboard into two independent
inputs. couch-parsec works around this by converting one player's
keystrokes into a virtual gamepad instead, which Windows treats as a
completely separate device.
Because Parsec forwards a guest's keystrokes to the host by injecting them into the host's own keyboard input stream — the host OS can't tell they came from a different machine. If both players are typing, FIFA just sees one keyboard being pressed by two people, not two separate players.
Parsec supports multiple gamepads per session — it creates a distinct
virtual controller on the host for each connected guest gamepad. It does not
support splitting keyboard input by player. That's the gap couch-parsec
fills: it gives the guest a virtual gamepad (built from their keystrokes) so
Parsec's existing per-guest gamepad support kicks in.
Have the friend run couch-parsec on their own PC. It creates a virtual
Xbox 360 controller from their keystrokes using the ViGEmBus driver. Their
Parsec client detects it as a real gamepad and forwards it to your PC, where
FIFA sees it as a second, independently assignable controller — no physical
gamepad required on either end. See Quick start.
Yes. kb2pad.py just maps configurable keys to standard Xbox 360 gamepad
axes and buttons — it has no FIFA-specific logic. It works with any game that
reads a real XInput controller. This repo's default config and key layout
are simply tuned for FIFA/EA FC Kick-Off co-op.
No. Only the player without a physical controller needs it — typically the Parsec guest. The other player keeps using their keyboard or controller normally on the host PC.
- Offline modes only — online modes need per-player accounts and often run anti-cheat that objects to global key hooks.
- A keyboard is a digital input; it can't match a real analog stick for
dribbling/shot-power finesse. The
walk_modifierkey narrows the gap but doesn't close it. - If either player has an actual USB/Bluetooth gamepad, just use that — Parsec forwards real controllers natively with zero setup.
See SETUP.md for the full list.
MIT — see LICENSE.
