-
Notifications
You must be signed in to change notification settings - Fork 2
Batocera
Written for Beta version 42
Note
While there is an official Batocera Visual Pinball wiki page, much of VPX Standalone is still in beta. This guide provides practical steps to get VPX working today.
- Batocera Wiki – Visual Pinball
- Virtual Pinball Discord
- VPX Standalone Table Patches (by jsm174)
- Interview with @jsm174 about VPX Standalone and Batocera
Follow the official Batocera wiki for detailed installation steps. Here's a quick summary:
- Flash the Batocera image to a USB drive.
- Boot your PC from the USB.
- Navigate to System Settings > Install Batocera on a New Disk to install it on your internal drive.
Avoid running Batocera permanently from USB — it's meant for installation or testing only.
Alternatively, you can flash the image directly onto the internal drive.
For wireless networking, follow the Batocera guide: Wi-Fi Configuration
To enable VPX-specific features and updates, it's recommended to use the beta channel:
- Go to Updates & Downloads.
- Change Update Type to
BUTTERFLY. - Select Start Update.
- Reboot your system.
From the Batocera Release Wiki:
“Butterfly” builds are not expected to introduce significant stability issues.
If you're building a pinball cabinet:
- Go to System Settings > Multi Screen.
- Disable “Auto” and manually assign each screen (playfield, DMD, backglass).
- Rotate your playfield (usually 270° for vertical orientation).
- Set individual resolutions for each monitor.
Detailed instructions: Multi-Monitor Setup Guide
For 3-screen setups (playfield, DMD, backglass):
- Go to Game Settings > Per System Advanced Configuration.
- Adjust settings (like display assignments and DMD scaling).
- These are equivalent to editing
.inifiles in Windows-based VPX setups.
To copy your VPX tables:
- On your host computer, open your file explorer.
- In the address bar, enter:
Example:
smb://<Batocera-IP>smb://192.168.1.10 - Navigate to:
Roms/VPinball/
Example using Jurassic Park (Data East 1993):
Roms/VPinball/
└── Jurassic Park/
├── Jurassic Park (Data East 1993) VPW 1.0.vpx
├── Jurassic Park (Data East 1993) VPW 1.0.vbs # (optional)
├── Jurassic Park (Data East 1993) VPW 1.0.ini # (optional, table-specific settings)
├── Jurassic Park (Data East 1993) VPW 1.0.directb2s # (optional, backglass)
├── music/ # (if the table uses music)
│ └── *.mp3 / *.ogg / etc.
├── pupvideos/ # (if using PuP-Pack videos)
│ └── *
└── pinmame/
├── roms/
│ └── jpark_l5.zip # ROM file
├── altcolor/
│ └── jpark/
│ └── jpark.cRZ # (optional, color DMD)
├── altsound/
│ └── jpark/
│ └── * # (optional, alternate sound packs)
├── nvram/
├── ini/
├── cfg/
Some VPX tables require ROMs (used by PinMAME). Instead of using the global folder (as done in Windows), keep everything together:
- Create a
pinmame/roms/folder inside each table folder. - Place
.zipROM files there.
If your table layout is misaligned:
- Load the table.
- Press
ESCto open the table menu. - Use arrow keys to access Table Settings.
If keyboard inputs don’t work, confirm you're running the beta version of Batocera.
If prompted to set window size:
- Go to Game Settings > Per System Advanced Configuration
- Enable Custom Display Physical Setup
- Set your monitor dimensions (in cm):
Width = physical width of the TV or monitor (not cabinet)
Height = physical height
VPXBCT is a utility for capturing backglass and playfield images and videos from your Visual Pinball X (VPX) Standalone cabinet running Batocera 42.
For detailed instructions and the project files, visit the GitHub repository:
https://github.com/jsm174/vpxbct
If tables exit to menu or fail to load:
-
Download the VPX standalone patches: https://github.com/jsm174/vpx-standalone-scripts
-
Replace the patched files into your existing:
/Roms/VPinball/<Table Folder>/
These patches resolve compatibility issues in Batocera for certain tables.
You can use a convenient script created by @jsm174 that automatically downloads and installs the latest Visual Pinball build straight from the "master" branch on GitHub. This means you can keep your setup up to date without having to manually compile the program or hunt for official releases. Since many new features are still in beta (as discussed on Discord), using this script gives you early access to the latest improvements and fixes.
If you don’t already have one, you’ll need to create a free account at github.com.
This token allows the script to securely access the Visual Pinball repository on GitHub.
Follow GitHub's official instructions to create a new PAT.
Important: When creating the token, make sure to select the repo scope to allow the script to access the repository.
Copy the generated token — you’ll need to paste it into the script in the next steps.
Save the batocera-vpx-upgrade.sh script to a convenient location on your Batocera system. We recommend placing it in:
/userdata/system/configs/vpinball/
to keep all your VPX-related files organized.
Open the script file to edit it. If you’re comfortable with the terminal, you can use a simple text editor like nano on Linux or Batocera by running:
nano /userdata/system/configs/vpinball/batocera-vpx-upgrade.shFind line 3 where it says:
PAT="PUT YOU OWN github_pat HERE"Paste your GitHub PAT between the quotes, so it looks like this example:
GITHUB_PAT="abcdef123456"By default, the script downloads the BGFX (modern graphics backend) version from the master branch. If you want the OpenGL version instead, edit line 93 and replace "BGFX" with "GL". You can also specify a different GitHub branch to install other than master by modifying the same line.
For more details about the different VPX flavors and rendering backends, see the About Visual Pinball — VPX Flavors page.
Before you can run the script, you need to give it execute permission. Open a terminal on your Batocera system or ssh into Batocera and run:
chmod +x /userdata/system/configs/vpinball/batocera-vpx-upgrade.shRun the script by entering this command in the terminal (assuming you are in the directory where the script is located):
./batocera-vpx-upgrade.shAfter it runs successfully, you will see the new version folder created inside /system/configs/vpinball.
Note
If your tables fail to launch after running the script:
- Make sure Batocera is running the latest beta version (v42 or newer).
- Delete your
VPinballX.inifile — it will regenerate automatically the next time you launch VPX.
I'm trying to make changes in Batocera's Advanced per Emulator Settings for Visual Pinball but the values don't seem to "stick" between reboots.
When Batocera starts up, the very first thing it does is read the Advanced Settings values from batocera.conf and put them into the VPinballX.ini file using their configgen tool. That .ini file is in turn read by Visual Pinball when it starts up. The batocera.conf entries for Visual Pinball will look something like this:
# ------------ User-generated Configurations ----------- #
system.cpu.governor=performance
ScrollLoadMedias=0
global.videooutput2=DP-4
global.videooutput3=DP-3
vpinball.tdp=100.000000
vpinball.vpinball_b2sgrill=0
vpinball.vpinball_screenheight=61.183998
vpinball.vpinball_screenwidth=106.846001
vpinball.vpinball_screeninclination=14.000000
vpinball.vpinball_screenplayery=0.000000
vpinball.vpinball_screenplayerz=70.000000
vpinball.vpinball_vsync=0
backglass.theme=backglass-boxart
global.netplay.nickname=BATOCERA Player
vpinball.vpinball_b2sdmd=0
es.resolution3=1360x768.60.02
vpinball.vpinball_flexdmd=manual
vpinball.vpinball_pinmame=manual
global.exithotkeyonly=0
vpinball.vpinball_customphysicalsetup=1
Note the last line above. If vpinball.vpinball_customphysicalsetup is not present or not set =1, the Advanced Configuration settings will be reset each time. There seems to be a bug somewhere in the configgen script that causes this line to not be included. Manually add this line to the file and see if that solves the problem (Reference: Discord discussion)
I'm having difficulty getting EmulationStation and Batocera to treat my controller inputs the same way. How can I fix this?
You've probably sunk a lot of time messing with SDL Game Controller and gamecontrollerdb. An easier way is to set things up for joystick controls. To do that...
- Set
GamepadOverride = 0in yourVPinballX.inifile - Use joystick values for all settings (retrieve by doing
sdl2-jstest -t 0and adding+1to each value) and set them in yourVPinballX.inifile. You might end up with something that looks like this:
JoyLFlipKey = 2 (these values are +1 from whatever button sdl2-jstest reports)
JoyRFlipKey = 7
JoyStagedLFlipKey =
JoyStagedRFlipKey =
JoyPlungerKey = 6
JoyAddCreditKey = 0
JoyAddCredit2Key = 9
JoyLMagnaSave = 1
JoyRMagnaSave = 8
JoyStartGameKey = 3
JoyExitGameKey = 4
- Create a script that, on the launch of every game, wipes out the
evmaptrickery that Batocera does behind the scenes. The script can be named whatever you like but it must have a filename extension of.sh.
#!/bin/bash
case $1 in
gameStart)
echo '{}' | tee /usr/share/evmapy/vpinball.keys > /dev/null
echo '{}' | tee /userdata/system/configs/evmapy/vpinball.keys > /dev/null
;;
esac
- Save that file to Batocera's
/userdata/system/scriptsdirectory, making sure to make it executable by runningchmod +x <scriptname.sh>once it has been copied over. (Reference: Discord discussion).
evsieve to the rescue!
This example is courtesy of @jsm174 from this Discord post that maps the hat on an XBox360 joystick to keyboard input. Note that it includes wiping out the evmap trickery that Batocera does behind the scenes as discussed in the Troubleshooting section. Like the example above, the file can be named whatever you like but it will require the .sh extension and must be made executable with chmod +x <scriptname.sh>.
#!/bin/bash
logfile=/tmp/vpinball-evsieve.log
pidfile=/tmp/evsieve-vpinball.pid
case $1 in
gameStart)
echo '{}' | tee /usr/share/evmapy/vpinball.keys > /dev/null
echo '{}' | tee /userdata/system/configs/evmapy/vpinball.keys > /dev/null
echo "$(date): Game starting - System: $2, Emulator: $3, Core: $4, ROM: $5" >> $logfile
if [ "$2" = "vpinball" ]; then
echo "$(date): Starting evsieve for VPinball system, ROM: $5" >> $logfile
evsieve --input /dev/input/by-id/*Microsoft_Controller_*-event-joystick* \
--map abs:hat0y:-1 key:1:1 \
--map abs:hat0y:0 key:1:0 \
--map abs:hat0x:1 key:f4:1 \
--map abs:hat0x:0 key:f4:0 \
--output key create-link=/dev/input/evsieve-keyboard name="Virtual Keyboard" &
echo $! > $pidfile
echo "$(date): Evsieve started with PID: $!" >> $logfile
fi
;;
gameStop)
echo "$(date): Game stopping - System: $2" >> $logfile
if [ -f $pidfile ]; then
PID=$(cat $pidfile)
echo "$(date): Stopping evsieve (PID: $PID)" >> $logfile
kill $PID 2>/dev/null
rm -f $pidfile
rm -f /dev/input/evsieve-keyboard
echo "$(date): Evsieve stopped and cleaned up" >> $logfile
fi
;;
esac
This script only runs when a Visual Pinball game starts and ends (thanks to the check if [ "$2" = "vpinball" ]). This way the hat generates keyboard events only in Visual Pinball and not in EmulationStation.
Visual Pinball is brought to you by The Visual Pinball Team under the GPLv3+ License - Github Repo
- Optimizations for iOS, iPad, & Android
- Fixing Broken Tables
- Research
- The VPX .ini file (Deprecated)
- Backing Up
- Debugging