Project goals: Pinball Simulator

How did I get here, back in the pinball game?

We were at a family wedding. Rehearsal dinner, the night before, was at a bodega owned by the groom’s family. In the back corner was one of my all time favorite pinball machines, the Pat Lawlor project from Williams: Fun House.

Fun House Pinball Pamphlet Front
Fun House Pinball Pamphlet Back

Watching the kids play it brought back the excitement I always felt. Is Rudy alive? I must have spent $20 just watching my (then 4 yr old) daughter and her cousins just try to reach the buttons to play it. It had been years since I had sold my 1977 Bally Eight Ball project. I had the fever again.

After pricing what it would cost to find even a well worn Fun House, I looked into other pinball machines that I loved. Medieval Madness, Jurassic Park, Addams Family, Getaway: High Speed 2, Twilight Zone: they were all astronomical in price. I thought, these things are already so huge, I’ll only be able to fit one in the game room anyhow. How to choose?

Why not all of them?

I’ve got an arcade emulator, I’ve got it tweaked to as close as I can to the exact feel of the games I so miss from my youth in the noisy arcade. Why couldn’t we do that with a pinball cabinet? Luckily I found that there’s already a wonderful like-minded community for just that!

Here are a few links right off the bat that were instrumental and are absolutely mandatory resources for this journey:

TerryRed’s Youtube ChannelAmazing tutorials on Video overlays, LEDs, Toys, Building, and general inspiration.
Nailbuster SoftwarePinUp System: Amazing front end and media trigger setup
VPForumsOne of the main forums for Virtual Pinball. It’s a great community willing to help when you’ve tried, but need a push.
VP UniverseOne of the main forums for Virtual Pinball. Also a great community, some different content than vpforums.
Major Frenchy’s Youtube ChannelMore amazing tutorials on tech, builds, and other virtual pinball ideas.
Zen StudiosFun and modern remakes of classic tables and originals, you can get a free cabinet mode unlock code whenever you’re ready. Just buy the game packs and send them an email. We’ll cover this.
MJR NetPinscape controller, plug real pinball buttons, plunger, some lighting, and it’ll treat you to a great interface into the games. It also has an accelerometer to detect tilts and shakes. We’ll cover this.
Marco SpecialtiesReal pinball parts, a great source for plungers, buttons, switches, legs, hinges etc.
Discord: Virtual Pinball ChatIf you can’t find it, send me a contact, I’ll invite you. This is hands down the place to go when you need to talk something out. You can also just try searching for it on the discord channel list.

What are we doing next?

We are going to research, sketch, and plan. We’ll make a lot of mistakes, hopefully not many of them that we’re unable to recover from. See you soon!


Extra tricks for linux on your arcade machine

Want your linux arcade machine to boot right into, and shut down from your attract-mode front end?

Change to OpenBox as your window manager:

log out, select openbox above
log in

Add attract mode to autostart with openbox

vim ~/.config/openbox/autostart

paste this:

#AutoStart Attract-Mode

:wq to save and exit vim

Hide the UI even further by changing the default colors to black

sudo vim /usr/lib/x86_64-linux-gnu/openbox-autostart

change the line under
# Set a background color

and this line:
#test -z $BG || $BG -solid “#303030”
#test -z $BG || $BG -solid “#000000”

Enable shutdown directly from exiting attract-mode:

sudo visudo -f /etc/sudoers

NOTE: this has implications, it basically allows everyone to do super user commands without a password. In the case of my arcade cab, I don’t care. Be aware of the risks.



Then in attract mode:

Set: exit command

sudo shutdown now


How do I enable the attract-mode intro video?

I had a little downtime at lunch today so I made a new intro video for the quasicade.

This video will play immediately as attract mode loads, before it shows the wheel.

This is great for showing someone the machine start up for the first time. You can really build some hype before showing them the wheel interface.

Here’s the clip:

Note: the killer music here is The Algorithm.
Check him out:

Adding the clip to attract-mode is super easy.

Just upload it into your /home/USERNAME/.attract/media/video folder in mp4 format (make sure it’s owned by the user that’s running attract-mode)

Then, in attract mode, enter the menu, select INTRO:

Set Play Intro to YES
enter the path to your video intro in the Default Video section and apply.

Note: you can add other shapes of videos specifically if you wish (e.g. your screen is 9×16 vertical)


How do I install Lubuntu 16 for MAME Cabinet?

Lubuntu 16.04, MAME 0.179, and Attract-mode 2.20 on older hardware:

We’re still using the old HP DV9700 series entertainment laptop for this example, it’s pretty old at this stage..

Here are some details:

ManufacturerHewlett Packard
Intel(R) Core(TM)2 Duo CPU T5550 @ 1.83GHz
Intel(R) Core(TM)2 Duo CPU T5550 @ 1.83GHz
Intel(R) Core(TM)2 Duo CPU T5550 @ 1.83GHz
Hard Drive250GB 7200RPM (Replaced with new)
MediaBluRay / DVD-RW+-
Video Memory1024MB GDDR2
Video GPUNVIDIA Corporation G86M [GeForce 8600M GS]

I just pulled the hard drive so the hyperspin install could stay intact.

Step 1: Make your linux installer.

You’ll need an empty flash drive of at least 4G capacity, I used unetbootin and created a lubuntu installer. Here’s how:

Get the UNetbootin package for your operating system:

Start UNetbootin (with administrator level permissions if needed).

Select the Lubuntu Distrubution 16.04_live (Select _x64 if you want to install 64 bit mame, which we do in this case.)

Be sure to select the proper USB drive mountpoint above.

If your usb flash disk has been used before, it’s best to format it first.

If you have to format flash media I recommend the official SD formatter at

UNetbootin will load the bootable lubuntu image onto that USB stick and tell you when it’s done.

Step 2: Boot the linux installer and install Lubuntu:

Most semi-ancient machines can boot to USB volumes, but some need a special key or bios setting enabled.
On this machine it was pressing f10 at boot time to select a boot device.

I’ll link outward to the official docs for installing lubuntu, they did a great job at explaining it:

note: it’s easiest if you DON’T encrypt homedir, and you tell it to auto-login your user.

The time it takes depends a lot on your hardware and the speed of your flash drive. But it’s not too bad to perform the install.

Step 3: Boot up and install some tweaks and tools: (Technically Optional)

Some of these are just things I did that I find useful for managing the system.

  • remote SSH access for remote management
  • VNC for remote-screen access over the network
  • SSH Greeter (stolen from RetroPie)

Install OpenSSH server for remote management:

Open LXterminal and use these commands to install and configure.

sudo apt update
sudo apt install openssh-server
chkconfig sshd on
ufw allow 22

the “ufw” command allows connections to port 22 through the firewall

You should be able to connect to your lubuntu host from the network, use puTTY on windows or terminal on mac or linux.

A quick way to find your ip address on lubuntu is:

 ifconfig |grep -w inet

Then, you can use your remote machine to connect over SSH


x11VNC to remotely manage system:

Open LXterminal and use these commands to install and configure.

sudo apt install x11vnc

This is probably a machine on your home network, but you should create a password for your user:

x11vnc -usepw

This command will set the password file on it’s first run.

Your user should already be set to auto-login, so you should be able to start x11VNC remotely when you need it.
SSH to your machine, Start X11 VNC with Password, use VNC client to log into it.

The following command will start an x11vnc session in your ssh session or terminal.

x11vnc -usepw

by default it should open port 5900 for VNC

SSH Greeter (Super Optional)

This is completely unnecessary. But I like to see this info when I first log into SSH. When you log into a RetroPie system with the SSH Greeter tweak installed you get this nice ascii art greeting with some quick system facts. I’ve modified it for this install.

At a glance I can see if I have updates, What my filesystem space looks like, How long the machine has been up, Temps etc.

There’s a hidden file in your Lubuntu user’s home directory that you’ll want to paste the code below into.

NOTE: you can seriously screw up your install if you do this wrong, if you’re not comfortable with linux, you might want to skip this step.

Do this from an SSH session or Terminal window:
I prefer editing text in VIM so I installed it first (sudo apt-get install vim) but you can use Nano or some other text editor if you prefer.

cp ~/.bashrc ~/.bashrc.backup
sudo vim ~/.bashrc

Next, scroll to the absolute bottom of the file. You’ll want to paste the following code in (Press “I” to enter VIM insert mode first):


function quasicade_welcome() {
    local upSeconds="$(/usr/bin/cut -d. -f1 /proc/uptime)"
    local secs=$((upSeconds%60))
    local mins=$((upSeconds/60%60))
    local hours=$((upSeconds/3600%24))
    local days=$((upSeconds/86400))
    local UPTIME=$(printf "%d days, %02dh%02dm%02ds" "$days" "$hours" "$mins" "$secs")

    # calculate rough CPU and GPU temperatures:
    local cpuTempC
    local cpuTempF
    local gpuTempC
    local gpuTempF
    if [[ -f "/sys/class/thermal/thermal_zone0/temp" ]]; then
        cpuTempC=$(($(cat /sys/class/thermal/thermal_zone0/temp)/1000)) && cpuTempF=$((cpuTempC*9/5+32))

    if [[ -f "/opt/vc/bin/vcgencmd" ]]; then
        if gpuTempC=$(/opt/vc/bin/vcgencmd measure_temp); then

    local df_out=()
    local line
    while read line; do
    done < <(df -h /) local rst="$(tput sgr0)" local fgblk="${rst}$(tput setaf 0)" # Black - Regular local fgred="${rst}$(tput setaf 1)" # Red local fggrn="${rst}$(tput setaf 2)" # Green local fgylw="${rst}$(tput setaf 3)" # Yellow local fgblu="${rst}$(tput setaf 4)" # Blue local fgpur="${rst}$(tput setaf 5)" # Purple local fgcyn="${rst}$(tput setaf 6)" # Cyan local fgwht="${rst}$(tput setaf 7)" # White local bld="$(tput bold)" local bfgblk="${bld}$(tput setaf 0)" local bfgred="${bld}$(tput setaf 1)" local bfggrn="${bld}$(tput setaf 2)" local bfgylw="${bld}$(tput setaf 3)" local bfgblu="${bld}$(tput setaf 4)" local bfgpur="${bld}$(tput setaf 5)" local bfgcyn="${bld}$(tput setaf 6)" local bfgwht="${bld}$(tput setaf 7)" local logo=( "${fggrn} _ ${fgrst} " "${fggrn} /\ \ ${fgrst} " "${fggrn} / \ \ ${fgrst} " "${fggrn} / /\ \ \ ${fgrst} " "${fggrn} / / /\ \ \ ${fgrst} " "${fggrn} / / / \ \_\ ${fgrst}" "${fggrn} / / / _ / / / ${fgrst}" "${fggrn} / / / /\ \/ / ${fgrst} " "${fggrn} / / /__\ \ \/ ${fgrst} " "${fggrn}/ / /____\ \ \ ${fgrst} " "${fggrn}\/________\_\/ ${fgrst} " "${fggrn} ${fgrst}" ) local out local i for i in "${!logo[@]}"; do out+=" ${logo[$i]} " case "$i" in 0) out+="${fggrn}$(date +"%A, %e %B %Y, %r")" ;; 1) out+="${fggrn}$(uname -srmo)" ;; 3) out+="${fgylw}${df_out[0]}" ;; 4) out+="${fgwht}${df_out[1]}" ;; 5) out+="${fgred}Uptime.............: ${UPTIME}" ;; 6) out+="${fgred}Memory.............: $(grep MemFree /proc/meminfo | awk {'print $2'})kB (Free) / $(grep MemTotal /proc/meminfo | awk {'print $2'})kB (Total)" ;; 7) out+="${fgred}Running Processes..: $(ps ax | wc -l | tr -d " ")" ;; 8) out+="${fgred}IP Address.........: $(ip route get 2>/dev/null | head -1 | cut -d' ' -f8)"
                out+="Temperature........: CPU: $cpuTempC°C/$cpuTempF°F GPU: $gpuTempC°C/$gpuTempF°F"
                out+="${fgwht}I am quasicade, Feed me quarters.${fgrst}"
    echo -e "\n$out"


Press ESC to exit INSERT mode when your modifications are done.

Next type “:wq” to write the file and quit VIM
You should see the greeter on the next login.

If you can’t see the CPU temp (and want to) you need to install the ‘lm-sensors’ modules

sudo apt-get install lm-sensors
sudo sensors-detect

NOTE: if something goes sideways with your bashrc file, restore the backup we made above like this:

cp ~/.bashrc.backup ~/.bashrc

Step 4: Install MAME and Attract-Mode

First we need to install the PPA repository for MAME, then update our repo list, then install MAME:

sudo add-apt-repository ppa:c.falco/mame && sudo apt-get update && sudo apt-get install mame

Then, we’ll do the same for Attract-Mode:

sudo add-apt-repository ppa:daveg/attract &&; sudo apt-get update && sudo apt-get install attract


This could be 30 posts in itself, and really depends on your particular goals.

I will link the readme docs and wikis for Attract-mode and MAME here:

I will cover my experience, tips, and findings on configuring and tweaking the various aspects of MAME and Front-end on linux in future posts.

You’re probably best to start by thinking about what you want your machine to be.

I’ve decided to refine the quasicade into a gallery of my most favorite machines. While they’re all there, I’ll only be presenting 80 or so in the front-end.

Good luck!


Vade Retro Microsoft. Hello Linux.

It’s been some time since an update on the Quasicade.

It’s been sitting in the garage lonely. We’ve got family coming for the holidays so I figured I’d bring it out and get it running. Then, I remembered the pain points. It ran windows under all that hyperspin. I’d always lamented that I couldn’t get a flashy front-end on linux.

Enter Attract-mode.


It’s not as feature heavy or as community heavy as Hyperspin. But, it’s not as, heavy.

The layouts are written in Squirrel, it’s pretty hyperspin-theme compatible. All around, it’s great.

This finally allowed me to feel confident I could get a nicely designed front end on linux. So I ripped out the hyperspin drive from the quasicade and tossed it somewhere safe, just in case I wasn’t able to get the open source machine tuned in time. I at least knew I could get the clunky hyperspin install back up again.

Choosing a distro

I wanted something light, without extra fluff if possible, and something that was pretty supported. I didn’t have time or desire to screw around building my own graphics drivers.

I tested #! linux (crunchbang) on my old EEEPC Nintendo emulator, I got RetroPi working on it, but I felt I needed to go 64Bit and something that was still alive and supported.
I chose Lubuntu: Lubuntu is a fast and lightweight operating system. The core of the system is based on Linux and Ubuntu. Lubuntu uses the minimal desktop LXDE, and a selection of light applications. We focus on speed and energy-efficiency. Because of this, Lubuntu has very low hardware requirements.

So, How’d it go?

Great, actually. Over the next few posts, I’ll be going into detail on what I did to build and configure MAME 0.179, Attract-Mode, and Lubuntu. Some tricks I learned from the project that you might want in your build, and a few things I stole from the RetroPie project to use on this machine.

Progress and Video

You got a quarter?

Someone mentioned to me the other day that I’ve not posted on the Quasicade in a LONG TIME.

I guess I should post a little something.

Here’s a video of the current setup and operation.

I’m toying with the idea of beefing up the hardware a little, even though it runs perfectly (other than Windows).


The Front End

MAME is amazing at what it does, Emulation.

But by itself it doesn’t quite give you that “arcade machine” feel. It’s designed to be operated using a keyboard and mouse.

This is where the Front End comes in.

There are several options for front ends online:

  • Maximus Arcade
  • MameWAH
  • GameEX
  • Hyperspin

I did quite a bit of testing with the various front ends, and I chose the one that I enjoyed best.

Enter: Hyperspin.

Hyperspin is highly customizable, from themes on each system, all the way down to custom themes at the game level.

Its user interface allows for control using only the arcade sticks and buttons, which gives it a more packaged feel.

Here are some examples of what can be done using Hyperspin themes and Emumovies snaps:

For further information about this front end, please visit:

Hyperspin- FE

For info about the game preview snaps:


For Emulation info visit the devs at: