LMMS VST plugins

I’m new to nixos and lmms. I recently installed lmms and it worked great out of the box, but now I want to install Vital and other VSTs, but I’m not sure how to get them to work.
I noticed lmms doesn’t come with Vestige, so maybe there is some extra configuring I have to do, but otherwise, I think if I add a symlink to Vital in the lmms plugins directory it should work.
I’m running nixos stable 23.11 as a flake.

You’re right. LMMS needs wine for VST support, which isn’t present in the nixpkgs version.

You can open an issue here to get this fixed. I was going to suggest trying the AppImage, but it didn’t work for me. I see VeSTige, but it just hangs when I load a DLL.

I tried tunning the WIndows version in Wine with Lutris, and it the VST loads and works, but it has visual bugs.

Edit: I got everything working with LMMS in nixpkgs and I can load Linux and Windows VSTs now :partying_face:

Alright, these are the results of a few trips down the rabbit hole :rabbit:

I hid each section to make the post more readable, so just click the parts that interest you.

Native VSTs

Applications don’t know where the plugins are by default, so we need to define their paths in order to make them discoverable.

Setting VST Paths

Environment Variables

Setting the following variables in your configuration.nix will make audio programs detect any installed plugins:

  environment.variables =
    let
      makePluginPath = format:
        (lib.makeSearchPath format [
          "$HOME/.nix-profile/lib"
          "/run/current-system/sw/lib"
          "/etc/profiles/per-user/$USER/lib"
        ])
        + ":$HOME/.${format}";
    in
    {
      DSSI_PATH = makePluginPath "dssi";
      LADSPA_PATH = makePluginPath "ladspa";
      LV2_PATH = makePluginPath "lv2";
      LXVST_PATH = makePluginPath "lxvst";
      VST_PATH = makePluginPath "vst";
      VST3_PATH = makePluginPath "vst3";
    };

If this is enough for you, then that’s great! If you want to tweak your system more towards audio production then follow the next section.


musnix

musnix is a great project for real-time audio in NixOS. By default, it automatically sets the environment variables from the previous section and enables some performance settings.

After you install it, either enable it as a flake or from configuration.nix:

  musnix.enable = true;
  users.users.<user>.extraGroups = [ "audio" ];

This is quite enough as far as making VSTs work, but to configure and optimize settings it even more check out the project documentation

Edit: I noticed some major slowdowns in my system using musnix with the Zen kernel. Perhaps it works better with a real-time kernel?

:warning: If you want to try this make sure you have older generations you can roll back to in case you also face the same issue as I couldn’t even rebuild the system to disable it.


After setting the paths, reboot your system.

LMMS

Scanning Plugins

After you have the VTS paths set, open LMMS, grab the Carla Rack from the Instrument Plugins, open it and click Show GUI. Then, go to Add Plugin > Refresh > Scan.

That’s it! You can now choose any VST and click Add Plugin. For me I installed the following packages for testing, and they showed up there:

  vital
  infamousPlugins
  lsp-plugins

After you add the VST, you can click the gear icon and configure it. Here is Vital as an example:


Windows VSTs

To enable these VSTs, we need to run them through Wine. Fortunately, there are some packages that automatically handle this and allow us to load Windows plugins as if they were Native.

Yabridge (recommended)

The best thing is that yabridge is already packaged in the repos and supports both 32 and 64bit VSTs.

Prerequisite

If you’re running NixOS-23.11, you can skip this. If you’re on the unstable release, there is an ongoing compatibility issue with Wine versions greater than 9.4. That’s why, you need to add the following overlay to roll back its version:


# inside `configuration.nix`

  nixpkgs.overlays = [
    (final: prev:
      let
        nixpkgs-wine94 = import
          (prev.fetchFromGitHub {
            owner = "NixOS";
            repo = "nixpkgs";
            rev = "f60836eb3a850de917985029feaea7338f6fcb8a"; #wineWow64Packages.stable: 9.3 -> 9.4
            sha256 = "Ln3mD5t96hz5MoDwa8NxHFq76B+V2BOppYf1tnwFBIc=";
          })
          {
            system = "x86_64-linux";
          };
      in
      {
        inherit (nixpkgs-wine94) yabridge yabridgectl;
      })
  ];

Installation & Usage

To install it, just add the following packages to your system:

  yabridge
  yabridgectl

To use it, you need to put/install your plugin inside a wine prefix. As an example, let’s assume we have a piano instrument in ~/.wine/drive_c/VST2/Awesome Piano/Awesome Piano.dll

To add it to yabridge, we just have to add the common path for plugins:

$ yabridgectl add "~/.wine/drive_c/VST2"

Then, after we run the sync command, all plugins should be detected and loaded:

$ yabridgectl sync

If you want to know which plugins are loaded, just run the following command and it will show you the path and type for each plugin and if it’s synced or not:

$ yabridgectl status
...
/home/<user>/.wine/drive_c/VST2/
  Awesome Piano/Awesome Piano.dll :: VST2, 32-bit, synced

Once that’s all done, we can load the VST like we did in the LMMS section.

For more usage details and performance tuning, check out yabridge’s github page.


LinVst

This bridge is similar to yabridge, but it’s not packaged in nixpkgs, despite the fact that we have a package to manage it called linvstmanager.

I somehow managed to compile LinVst (VST2) for nixpkgs, but only for 64bit plugins as I couldn’t figure out how to do it for 32bit. Using it also needs manually copying a library file for each plugin, which yabridge does automatically.

I might try to make it work in the future, but I think yabridge is the better solution for now.

PS: This is the package I wrote if anyone is interested in compiling or improving it

LinVst Package (WIP)
{ lib
, autoPatchelfHook
, fetchFromGitHub
, gcc_multi
, multiStdenv
, wineWowPackages
, xorg
}:
let
  wine = wineWowPackages.stable;
in

multiStdenv.mkDerivation rec {
  pname = "linvst";
  version = "4.9";

  src = fetchFromGitHub {
    owner = "osxmidi";
    repo = "LinVst";
    rev = version;
    hash = "sha256-zy2Roe5/mgxCzND+oALcusrwMN5/AvfzqoO4zQOGqFI=";
  };

  nativeBuildInputs = [
    autoPatchelfHook
    gcc_multi
    wine
    xorg.libX11
  ];

  buildPhase = ''
    make all PREFIX=$out
  '';

  installPhase = ''
    make install PREFIX=$out VST_DIR=$out/lib/vst
  '';

  meta = with lib; {
    description = "Linux Windows vst wrapper/bridge";
    mainProgram = "linvst";
    homepage = "https://github.com/osxmidi/LinVst";
    license = with licenses; [ gpl3 ];
    platforms = platforms.linux;
    maintainers = [ ];
  };
}

Airwave

Also in the repos, but it’s pretty old at this point that’s why I didn’t test it.


Congratulations, you did it! :tada:

PS: I appreciate any suggestion or correction as I’m still learning as well :snowflake:

1 Like