Due to a combination of Microsoft's push for AI/Copilot in Windows and an urge to divest from American-made commercial software due to trade tariffs on Canada, I recently set out to return to using Linux as my main desktop operating system. My studio is set up with two desktop computers; one for gaming and streaming while the other, an Intel NUC 12, is dedicated to music production. Both would be migrated over to Linux though the gaming system setup will probably be a separate write-up.
I decided to go with Kubuntu Desktop 24.10 in spite of traditionally being a Gnome user. This choice was mainly due to KDE/Plasma support for my gaming system and my desire for consistency of OS across my computers, but KDE is by no means a bad choice and I'm getting along with it just fine.
After installing Kubuntu on the Intel NUC 12 (a process that went very smoothly) I installed Bitwig Studio's native Linux version. I was pleasantly surprised to find it had Ubuntu packages and worked with the builtin Pipewire audio (older versions I'd tried in past required JACKaudio which is a separate, not-always-easy install). I then configured it to use the correct Pipewire device (my Scarlett 18i20) and my midi keyboard.
Now that Bitwig was installed I could move on to trying to get some audio plugins working.
Native Plugins
There isn't a huge number of native plugins for Linux but they do exist. Here's a short list of plugins I use that offer a Linux native version:
- Surge XT (free)
- Dexed (free)
- Vital (paid)
- VCV Rack 2 Pro (paid; CLAP plugin seems to have issues, but no problem with VST2)
- OsTirus (free but requires Access Virus Ti/Ti2 firmware)
All of these worked fine with either their default installers or with plugin files placed in the appropriate folders within my home directory (eg: /home/litui/.clap
, /home/litui/.vst
, or /home/litui/.vst3
).
Wine Setup
Wine is a Windows-compatible environment for Linux that works quite well, but unfortunately not all plugins work in Wine. I was prepared to make some sacrifices to migrate to Linux. Plugins that use arcane licensing tools probably won't work. Plugins using bleeding edge Windows APIs also probably won't work. I was disappointed to learn two of my favourite plugins, Plogue Chipsynth C64 and Plogue Chipsynth MD rely on too new a version of the Direct2D API and don't work in Linux.
Wine is also known to occasionally introduce breaking changes as I've learned is the case with current versions newer than 9.21 – these versions break how graphical scaling works which misaligns the mouse cursor in VSTs. Ho hum. We'll need to install a downgraded version of wine to make our windows plugins work.
From instructions here:
# Add winehq key to Ubuntu keyring
sudo mkdir -pm755 /etc/apt/keyrings
wget -O - https://dl.winehq.org/wine-builds/winehq.key | sudo gpg --dearmor -o /etc/apt/keyrings/winehq-archive.key -
# Add winehq sources file
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/oracular/winehq-oracular.sources
# Install wine-staging 9.21 packages
sudo apt update
sudo apt install --install-recommends wine-staging=9.21~oracular-1 winehq-staging=9.21~oracular-1 wine-staging-i386=9.21~oracular-1 wine-staging-amd64=9.21~oracular-1 wine-staging-dev=9.21~oracular-1
# Hold versions of wine-staging at 9.21
sudo apt-mark hold wine-staging winehq-staging wine-staging-i386 wine-staging-amd64 wine-staging-dev
Give wine a run to test and get it to create its directories in your home path:
wine explorer
Yabridge Setup
Yabridge is a tool and management system allowing Windows plugins to be run as though they're native in Linux using Wine. It is available in binary form but I needed to compile it myself to make it work in my environment. Here's how:
# Install prerequisites
apt install meson xcb-proto libxcb1-dev cmake libdbus-1-dev wine-staging-dev cargo
# Download and build yabridge
cd ~
git clone https://github.com/robbert-vdh/yabridge.git
cd yabridge
meson setup build --buildtype=release --cross-file=cross-wine.conf
ninja -C build
# Install yabridge
mkdir -p ~/.local/share/yabridge
cp build/*.so ~/.local/share/yabridge
cp build/*.exe ~/.local/share/yabridge
# Make and install yabridge tool
cd tools/yabridgectl
cargo build --release
cp target/release/yabridgectl ~/.local/share/yabridge
# Add yabridge directory to path
echo "PATH=\"$HOME/.local/share/yabridge:$PATH\"" >> ~/.profile
Following this you'll need to log out and log in again or restart your computer to make sure the path is accessible.
Assuming you're using bash, you may also want to add the following to your .bashrc file to remove memory complaints and ensure everything runs smoothly:
set -x ULIMIT_MEMLOCK unlimited
ulimit -m unlimited
The above wine/yabridge setup was helped along by this forum post from Yuuka Yuki Linux on Bluesky.
Using Yabridge
Once set up, you'll need to make the typical plugin install directories and add them to yabridge's search paths:
mkdir -p "$HOME/.wine/drive_c/Program Files/Common Files/CLAP"
mkdir -p "$HOME/.wine/drive_c/Program Files/Common Files/VST3"
mkdir -p "$HOME/.wine/drive_c/Program Files/Steinberg/VstPlugins"
mkdir -p "$HOME/.wine/drive_c/Program Files/VstPlugins"
yabridgectl add "$HOME/.wine/drive_c/Program Files/Common Files/CLAP"
yabridgectl add "$HOME/.wine/drive_c/Program Files/Common Files/VST3"
yabridgectl add "$HOME/.wine/drive_c/Program Files/Steinberg/VstPlugins"
yabridgectl add "$HOME/.wine/drive_c/Program Files/VstPlugins"
You can then try installing plugins using wine <installer>.exe
. Most plugins I've installed so far had a smooth install process but required some fiddling or the use of offline mode (in the case of Korg plugins) to register them. Your mileage may vary.
Once installed, assuming plugins were installed to one of the above locations, running yabridgectl sync
will tell yabridge to find new plugins and set them up. If your installer installed plugins to a nonstandard location, just rerun yabridgectl add "<your path>"
to add additional locations.
If a plugin is uninstalled, run yabridgectl sync --prune
to trim the list of plugins.
And that's it!
Working Plugins
Following all the above, I've got these Windows plugins working so far (keeping a running list):
- Arturia Pigments (this runs okayish, but the UI gets bogged down when it's playing)
- Arturia V Collection 7 (these seem to run well enough)
- Klevgrand Brusfri (runs very well)
- Korg Gadget Collection 2 (runs very well)
- Korg Collection 2 (runs very well)
- Native Instruments Absynth 5 (runs well, a bit CPU heavy)
- Native Instruments Battery 4 (runs very well)
- Native Instruments Bite (runs very well)
- Native Instruments Choral (runs very well)
- Native Instruments Dirt (runs very well)
- Native Instruments Driver (runs very well)
- Native Instruments Flair (runs very well)
- Native Instruments Freak (runs very well)
- Native Instruments Guitar Rig 6 (runs well, a bit CPU heavy)
- Native Instruments Kontakt 6 (runs well enough)
- Native Instruments Kontakt 7 Player (runs well enough but it's only 7.6 which means many of the 7.7 libraries do not work with it)
- Native Instruments Massive (runs well)
- Native Instruments Massive X (works with init & user presets but broken factory preset detection)
- Native Instruments Phasis (runs very well)
- Native Instruments Raum (runs very well)
- Native Instruments Reaktor 6 (runs well; seems to have issues restoring past settings and loading in Bitwig startup)
- Native Instruments Replika (runs very well)
- Native Instruments Solid Bus Comp (runs very well)
- Native Instruments Solid Dynamics (runs very well)
- Native Instruments Solid EQ (runs very well)
- Native Instruments Supercharger (runs very well)
- Native Instruments Transient Master (runs very well)
- Plugin Boutique Scaler 2 (runs very well)
- Soundtoys Little AlterBoy (runs decent; display issue with readouts below the knobs; requires iLok which seems to work)
- Soundtoys Microshift (runs decent; requires iLok which seems to work)
- Toontrack EZbass (runs very well)
- XLN Audio XO (runs very well)
- Klevgrand Brusfri (runs very well)
Native Instruments Plugins
All Native Instruments plugins above were installed using Native Access 1.x or manually from .iso files using the instructions here, which I've adapted into a quick and dirty script (no error checking) you can save to ~/.local/bin/wine_install_from_iso.sh
:
# Change to the wine download directory
cd "$HOME/.wine/drive_c/users/$USER/Downloads"
# Mount your ISO file
ISO_FILE="$1"
LOOP_DEVICE=$(udisksctl loop-setup -f "$ISO_FILE" | sed -e 's/.* as \(.*\)\./\1/')
MOUNT_PATH=$(udisksctl mount -t udf -o unhide -b $LOOP_DEVICE | sed -e "s/^Mounted [A-Za-z0-9\/]* at \(.*\)$/\1/")
# Run first executable on ISO in wine
EXECUTABLE=$(ls "$MOUNT_PATH"/*.exe | head -n 1)
wine "$EXECUTABLE"
# Unmount ISO and free up loop device
udisksctl unmount -b $LOOP_DEVICE
udisksctl loop-delete -b $LOOP_DEVICE
I added the following path to yabridge for syncing plugins: ~/.wine/drive_c/Program Files/Native Instruments/VSTPlugins 64 bit/
. When manually installing, the license registration doesn't always go through until I quit and relaunch Native Access.
Only plugins (.vst, .dll) are included in the list above. Many libraries were installed in addition and run fine in their respective plugins.
