Jump to content

Electric guitar interface setup: Difference between revisions

From Official NixOS Wiki
update: fixed PipeWire/Pulse config, switched to sessionVariables for GUI plugin paths, added memlock limits, expanded software guide with categorized explanations
Electric guitar interface setup: clean up, fix Wine package, add Audient iD4, remove unavailable plugins, comply with MOS
 
Line 1: Line 1:
= Electric guitar interface setup =
= Electric guitar interface setup =


This guide covers setting up an electric guitar with NixOS to achieve professional, low-latency audio processing. It targets live playing with round-trip latency (RTL) under 6 ms using the modern PipeWire/JACK stack.
This guide covers setting up an '''electric guitar''' with NixOS to achieve professional, low-latency audio processing. It targets live playing with round-trip latency (RTL) under 6 ms using the modern PipeWire/JACK stack.


'''⚠️ Safety Warning''': Always start with monitoring volume at minimum when testing new signal chains. A sudden, loud feedback loop can be generated during loopback testing. Increase volume gradually only after the plugin is open and stable.
{{Warning|Always start with monitoring volume at minimum when testing new signal chains. A sudden, loud feedback loop can be generated during loopback testing. Increase volume gradually only after the plugin is open and stable.}}
 
== Introduction ==


The digital signal chain for a guitar consists of:
The digital signal chain for a guitar consists of:
Line 12: Line 10:
# '''Real-time processing''' on NixOS using a low-latency kernel and specialized software.
# '''Real-time processing''' on NixOS using a low-latency kernel and specialized software.


'''Note''': Software-reported latency values are often inaccurate. Physical measurement via loopback test is mandatory for verification.
{{Note|Software-reported latency values are often inaccurate. Physical measurement via loopback test is mandatory for verification.}}


== Installation ==
== Installation ==


=== System Configuration ===
=== System configuration ===


Add the following to your <code>/etc/nixos/configuration.nix</code>. This configuration is optimized for high-performance CPUs like the AMD Ryzen 7 9700X (Zen 5 architecture).
Add the following to your <code>/etc/nixos/configuration.nix</code>. This configuration is optimized for high-performance CPUs like the AMD Ryzen 7 9700X (Zen 5 architecture).


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
{ pkgs, config, ... }:
{ pkgs, ... }:


{
{
Line 59: Line 57:
   # Critical: Allow unlimited memlock for real-time audio buffers
   # Critical: Allow unlimited memlock for real-time audio buffers
   security.pam.loginLimits = [
   security.pam.loginLimits = [
     {
     { domain = "@audio"; item = "memlock"; type = "-"; value = "unlimited"; }
      domain = "@audio";
     { domain = "@audio"; item = "rtprio"; type = "-"; value = "95"; }
      item = "memlock";
      type = "-";
      value = "unlimited";
    }
     {
      domain = "@audio";
      item = "rtprio";
      type = "-";
      value = "95";
    }
   ];
   ];
    
    
Line 90: Line 78:
   programs.gamemode.enable = true;
   programs.gamemode.enable = true;


   # 4. NVIDIA Workaround (If applicable)
   # 4. Plugin Search Paths (Crucial for NixOS DAWs)
  # For RTX 40/50 series: disable GSP firmware to prevent DPC latency spikes
  # hardware.nvidia.powerManagement.enable = false;
  # hardware.nvidia.modesetting.enable = true;
  # boot.extraModprobeConfig = "options nvidia NVreg_EnableGpuFirmware=0";
 
  # 5. Plugin Search Paths (Crucial for NixOS DAWs)
   # Use sessionVariables for GUI apps launched from DE menu
   # Use sessionVariables for GUI apps launched from DE menu
   environment.sessionVariables = let
   environment.sessionVariables = let
     makePluginPath = format = (pkgs.lib.makeSearchPath format [
     makePluginPath = format:
      "/run/current-system/sw/lib"
      (pkgs.lib.makeSearchPath format [
      "${config.users.users.yourname.home}/.nix-profile/lib" # Adjust if using home-manager
        "$HOME/.nix-profile/lib"
    ]) + ":$HOME/.${format}";
        "/run/current-system/sw/lib"
        "/etc/profiles/per-user/$USER/lib"
      ]) + ":$HOME/.${format}";
   in {
   in {
     LV2_PATH = makePluginPath "lv2";
     LV2_PATH = makePluginPath "lv2";
Line 109: Line 93:
   };
   };


   # 6. Essential Packages
   # 5. Essential Packages
   nixpkgs.config.allowUnfree = true; # Required for REAPER, Tonelib, etc.
   nixpkgs.config.allowUnfree = true; # Required for REAPER, Tonelib, etc.
   environment.systemPackages = with pkgs; [
   environment.systemPackages = with pkgs; [
Line 129: Line 113:
     # --- Standalone Guitar Processors ---
     # --- Standalone Guitar Processors ---
     guitarix
     guitarix
    # tonelib-gfx      # NOTE: Currently marked as broken in nixpkgs; install from vendor if needed


     # --- Plugins (LV2/CLAP) ---
     # --- Plugins (LV2/CLAP) ---
Line 140: Line 123:
     chow-centaur            # Klon Centaur emulation
     chow-centaur            # Klon Centaur emulation
     chow-phaser
     chow-phaser
    # airwindows-lv2        # NOTE: Large package (~400 plugins); consider selective install


     # --- Practice & Learning ---
     # --- Practice & Learning ---
Line 149: Line 131:
     yabridge
     yabridge
     yabridgectl
     yabridgectl
     wineWowPackages.stable  # Use stable, not staging, for VST compatibility
     wineWow64Packages.stable  # Use wineWow64Packages, as wineWowPackages is deprecated
   ];
   ];
}
}
</syntaxhighlight>
</syntaxhighlight>


'''Note on <code>musnix</code>''': For advanced users, the [https://github.com/musnix/musnix musnix] flake automates many low-level audio optimizations (such as <code>PREEMPT_RT</code> kernel patching, <code>rtirq</code> tuning, and <code>das_watchdog</code>). If you experience persistent Xruns with the standard Zen kernel, replacing manual tweaks with <code>musnix.enable = true;</code> is highly recommended. '''Warning''': musnix may require replacing your kernel and can affect compatibility with Steam/Wine applications.
{{Note|1=For advanced users, the [https://github.com/musnix/musnix musnix] flake automates many low-level audio optimizations (such as PREEMPT_RT kernel tuning and rtirq). If you experience persistent Xruns with the standard Zen kernel, replacing manual tweaks with <code>musnix.enable = true;</code> is highly recommended. For Linux kernels 6.12 and newer, PREEMPT_RT is built-in.}}
 
== Configuration ==


=== Applying Changes ===
=== Applying changes ===


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Line 165: Line 149:
</syntaxhighlight>
</syntaxhighlight>


== Hardware & Connection ==
=== Pro audio profile ===
 
To achieve minimal latency, you must bypass standard software mixing:
 
# Open <code>pavucontrol</code>.
# Go to the '''Configuration''' tab.
# Set your interface profile to '''Pro Audio'''.
 
If the "Pro Audio" profile is missing, ensure <code>pipewire-alsa</code> is installed and restart PipeWire. This profile disables software mixing and enables hardware-exclusive mode, which is critical for achieving the lowest latency.
 
=== Dynamic buffer control ===
 
You can change latency without rebuilding the system. Note that these settings affect PipeWire clients only; ALSA-direct applications (like Ardour with ALSA backend) use their own buffer settings.
 
<syntaxhighlight lang="bash">
# Modern syntax (PipeWire 0.3.65+):
pw-cli set-param 0 clock.force-quantum 64/48000
 
# Verify current settings:
pw-cli dump settings | grep -E "quantum|rate"
</syntaxhighlight>
 
Use <code>pw-top</code> in a separate terminal to monitor which applications are consuming the most DSP processing time. Look for the <code>ERR</code> column — values greater than zero indicate Xruns.


Standard PC line-ins are unsuitable for guitar. Use a dedicated interface with a '''Hi-Z (Instrument)''' input.
== Hardware and connection ==


=== Verified compatible devices (2026) ===
Standard PC line-ins are unsuitable for guitar. Use a dedicated interface with a Hi-Z (Instrument) input.
 
=== Verified compatible devices ===


{| class="wikitable"
{| class="wikitable"
Line 181: Line 189:
|-
|-
| '''Arturia MiniFuse 1''' || Stable performance under PipeWire.
| '''Arturia MiniFuse 1''' || Stable performance under PipeWire.
|-
| '''Audient iD4 (Gen 1)''' || Fully functional on NixOS. No special drivers needed.
|}
|}


=== Hardware Rules ===
=== Hardware rules ===


# Connect the interface '''directly to the motherboard''' (rear panel USB 3.0/3.2). Avoid USB hubs — they add latency and can cause Xruns.
# Connect the interface '''directly to the motherboard''' (rear panel USB 3.0/3.2). Avoid USB hubs — they add latency and can cause Xruns.
# Use a high-quality, shielded USB cable. Audio dropouts are frequently caused by cheap cables acting as antennas for electrical interference.
# Use a high-quality, shielded USB cable. Audio dropouts are frequently caused by cheap cables acting as antennas for electrical interference.
# '''Disable Bluetooth''' during live playing: <code>rfkill block bluetooth</code>. BT audio stack can generate interrupt storms causing Xruns.
# '''Disable Bluetooth''' during live playing: <code>rfkill block bluetooth</code>. The BT audio stack can generate interrupt storms causing Xruns.


=== Verification ===
=== Verification ===
Line 195: Line 205:
arecord -l              # Verify ALSA sees the capture input
arecord -l              # Verify ALSA sees the capture input
aplay -l                # Verify ALSA sees the playback output
aplay -l                # Verify ALSA sees the playback output
# For detailed interface capabilities:
arecord --dump-hw-params -D hw:<card>,<device>
</syntaxhighlight>
</syntaxhighlight>


== Audio Server Setup ==
== Software guide ==
 
=== Pro Audio Profile ===
 
To achieve minimal latency, you must bypass standard software mixing:
 
# Open <code>pavucontrol</code>.
# Go to '''Configuration''' tab.
# Set your interface profile to '''Pro Audio'''.
 
'''Note''': If "Pro Audio" profile is missing, ensure <code>pipewire-alsa</code> is installed and restart PipeWire. This profile disables software mixing and enables hardware-exclusive mode, critical for achieving lowest latency.
 
=== Dynamic Buffer Control ===
 
You can change latency without rebuilding the system. Note: these settings affect PipeWire clients only; ALSA-direct applications (like Ardour with ALSA backend) use their own buffer settings.
 
<syntaxhighlight lang="bash">
# Modern syntax (PipeWire 0.3.65+):
pw-cli set-param 0 clock.force-quantum 64/48000
 
# Verify current settings:
pw-cli dump settings | grep -E "quantum|rate"
 
# Alternative: use wpctl (WirePlumber CLI)
wpctl set-default-rate 48000
</syntaxhighlight>
 
Use <code>pw-top</code> in a separate terminal to monitor which applications are consuming the most DSP processing time. Look for the <code>ERR</code> column — values >0 indicate Xruns.
 
== Software Guide: Choosing Your Rig ==


This section explains the available software for guitar processing on NixOS, organized by purpose.
This section explains the available software for guitar processing on NixOS, organized by purpose.


=== Digital Audio Workstations (DAWs) ===
=== Digital audio workstations ===


{| class="wikitable"
{| class="wikitable"
Line 242: Line 221:
|}
|}


=== Amp Simulators & Neural Modelers ===
=== Amp simulators and neural modelers ===


{| class="wikitable"
{| class="wikitable"
! Software !! Purpose !! Notes
! Software !! Purpose !! Notes
|-
|-
| '''Neural Amp Modeler (NAM)''' (<code>neural-amp-modeler-lv2</code>) || Loads <code>.nam</code> files — AI captures of real tube amps || '''No built-in GUI in LV2 version'''. In Carla/Ardour: look for <code>atom:Path</code> parameter and point to your <code>.nam</code> file. Models: [https://tonehunt.org tonehunt.org]
| '''Neural Amp Modeler (NAM)''' || Loads <code>.nam</code> files — AI captures of real tube amps || No built-in GUI in LV2 version. In Carla/Ardour: look for <code>atom:Path</code> parameter and point to your <code>.nam</code> file. Models: [https://tonehunt.org tonehunt.org]
|-
|-
| '''Kapitonov Plugins Pack (KPP)''' || Profile-based traditional amp modeling || Excellent for classic rock/metal. Lower CPU than neural nets.
| '''Kapitonov Plugins Pack (KPP)''' || Profile-based traditional amp modeling || Excellent for classic rock/metal. Lower CPU than neural nets.
Line 254: Line 233:
|}
|}


'''⚠️ Critical''': Neural amps (NAM, KPP) only model preamp/poweramp. '''You must load a Cabinet IR''' (via LSP IR Loader or similar) to get a usable guitar tone. Without IR, it sounds like a swarm of bees.
{{Warning|Neural amps (NAM, KPP) only model preamp/poweramp. You must load a Cabinet IR (via LSP IR Loader or similar) to get a usable guitar tone. Without an IR, it sounds like a swarm of angry bees.}}


=== Effects Plugins ===
=== Effects plugins ===


{| class="wikitable"
{| class="wikitable"
! Plugin Pack !! Key Features
! Plugin Pack !! Key Features
|-
|-
| '''LSP Plugins''' || Professional EQ, compression, gating. '''Includes LSP Latency Meter''' and '''LSP Impulse Response Loader''' (required for cabinet sims).
| '''LSP Plugins''' || Professional EQ, compression, gating. Includes LSP Latency Meter and LSP Impulse Response Loader (required for cabinet sims).
|-
|-
| '''Dragonfly Reverb''' || High-quality algorithmic reverb (Hall, Room, Plate).
| '''Dragonfly Reverb''' || High-quality algorithmic reverb (Hall, Room, Plate).
|-
|-
| '''Chow Plugins''' (<code>chow-centaur</code>, <code>chow-phaser</code>) || High-fidelity emulations of classic pedals using RNN/WDF.
| '''Chow Plugins''' || High-fidelity emulations of classic pedals using RNN/WDF.
|-
|-
| '''Calf Studio Gear''' || Vintage-style effects with "warm" analog character.
| '''Calf Studio Gear''' || Vintage-style effects with "warm" analog character.
Line 272: Line 251:
|}
|}


=== Modular Hosts ===
=== Modular hosts ===


{| class="wikitable"
{| class="wikitable"
Line 282: Line 261:
|}
|}


=== Windows VST Compatibility ===
=== Windows VST compatibility ===


{| class="wikitable"
{| class="wikitable"
Line 295: Line 274:
</syntaxhighlight>
</syntaxhighlight>


'''Note''': Ensure glibc versions match between Wine and system. Check with <code>ldd /path/to/plugin.dll</code>.
== Tips and tricks ==


== Rocksmith 2014 Remastered (Optional) ==
=== Rocksmith 2014 ===


Rocksmith 2014 runs on NixOS via Proton and PipeWire.
Rocksmith 2014 runs on NixOS via Proton and PipeWire.
=== Connection Options ===
{| class="wikitable"
! Method !! Pros !! Cons
|-
| '''Real Tone Cable''' || Official, plug-and-play || Proprietary, limited to 48kHz
|-
| '''Your Audio Interface + RS_ASIO''' || Use professional interface, any sample rate || Requires modding game files
|}
=== Setup Steps ===


# '''Install dependencies''':
# '''Install dependencies''':
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
# In configuration.nix:
programs.steam.enable = true;
programs.steam.enable = true;
programs.gamemode.enable = true; # For launch option below
programs.gamemode.enable = true;
</syntaxhighlight>
</syntaxhighlight>


# '''Steam Launch Options''' (force low latency + real-time priority):
# '''Steam Launch Options''' (force low latency + real-time priority):
<pre>
<pre>PIPEWIRE_LATENCY=128/48000 gamemoderun %command%</pre>
PIPEWIRE_LATENCY=128/48000 gamemoderun %command%
Start with <code>128/48000</code> (~5ms). If stable, try <code>64/48000</code> (~2.5ms). Values below 64 may cause crashes.
</pre>
Start with <code>128/48000</code> (~5ms). If stable, try <code>64/48000</code> (~2.5ms). Values <64 may cause crashes.


# '''Sample Rate''': Rocksmith strictly requires '''48000 Hz'''. Do not force 96000 Hz while playing.
# '''Sample Rate''': Rocksmith strictly requires 48000 Hz. Do not force 96000 Hz while playing.
# '''For interface users''' (no Real Tone Cable): Install the [https://github.com/mdias/rs_asio RS_ASIO] mod to enable direct interface support.


# '''If using Real Tone Cable and experiencing issues''', try ALSA backend as fallback (warning: exclusive device access):
=== Measuring latency ===
<syntaxhighlight lang="bash">
# Only use if Pulse backend fails. May silence other apps.
protontricks 221680 sound=alsa
</syntaxhighlight>


# '''For interface users (no Real Tone Cable)''': Install [https://github.com/mdias/rs_asio RS_ASIO] mod to enable direct interface support. This bypasses the 48kHz limitation and allows using your professional interface.
Always perform a physical loopback test.


== Measuring Latency ==
{{Warning|Before starting, turn output volume on your audio interface all the way down. A sudden, loud feedback loop can be generated if the connection is unstable. Increase volume gradually only after the plugin is open.}}
 
Never trust software reports. Always perform a physical loopback test.
 
=== Procedure ===
 
'''⚠️ Warning''': Before starting, turn output volume on your audio interface '''all the way down'''. A sudden, loud feedback loop can be generated if the connection is unstable. Increase volume gradually only after the plugin is open.


# Connect a cable from your interface '''Output''' back into the '''Input''' (use a TS/TRS patch cable).
# Connect a cable from your interface '''Output''' back into the '''Input''' (use a TS/TRS patch cable).
Line 355: Line 310:
# Play a sharp transient (string scratch) and read the '''Round-trip Latency (RTL)''' value.
# Play a sharp transient (string scratch) and read the '''Round-trip Latency (RTL)''' value.


=== Target Values ===
'''Target values''':
 
* < 5 ms: Professional / Imperceptible
{| class="wikitable"
* 5–10 ms: Acceptable for practice
! Latency !! Perception
* > 12 ms: Noticeable "lag", difficult to play in time
|-
| '''< 5 ms''' || Professional / Imperceptible
|-
| '''5–10 ms''' || Acceptable for practice
|-
| '''> 12 ms''' || Noticeable "lag", difficult to play in time
|}
 
'''Note''': If measured latency exceeds calculated buffer latency <code>(buffer / sample_rate) * 2 * 1000</code>, check: USB interface hardware buffers, PipeWire extra quantum settings, kernel interrupt latency.
 
== Troubleshooting ==
 
{| class="wikitable"
! Symptom !! Cause & Solution
|-
| '''Xruns (audio glitches)''' || • Ensure <code>powerManagement.cpuFreqGovernor = "performance"</code> is active (<code>cpupower frequency-info</code>).<br>• Check <code>pw-top</code> for high-CPU nodes.<br>• Close browsers/heavy apps during playing.<br>• Disable Wi-Fi: <code>sudo modprobe -r iwlwifi</code>.<br>• As last resort: add <code>processor.max_cstate=1</code> to <code>boot.kernelParams</code> (disables CPU sleep — high power draw).
|-
| '''No sound''' || • Check <code>qpwgraph</code> — PipeWire does not auto-connect hardware.<br>• Verify Pro Audio profile in <code>pavucontrol</code>.<br>• Run <code>sudo lsof /dev/snd/*</code> to find conflicting processes.
|-
| '''DAW cannot find plugins''' || • Ensure <code>environment.sessionVariables</code> block is applied. Log out/in after rebuild.<br>• Verify paths: <code>echo $LV2_PATH</code>.<br>• Check plugin installation: <code>ls ~/.lv2</code>, <code>ls /run/current-system/sw/lib/lv2</code>.
|-
| '''NVIDIA audio glitches''' || • Disable GPU power management: <code>hardware.nvidia.powerManagement.enable = false;</code><br>• For RTX 40/50 series: add <code>boot.extraModprobeConfig = "options nvidia NVreg_EnableGpuFirmware=0";</code><br>• Prefer X11 over Wayland for lowest latency.
|-
| '''Bluetooth causing Xruns''' || • Disable Bluetooth stack: <code>rfkill block bluetooth</code> during live sessions.
|-
| '''PipeWire config not applying''' || • Restart user services after rebuild: <code>systemctl --user restart pipewire wireplumber</code>.<br>• Check for WirePlumber overrides: <code>wpctl status</code>.
|}


== Quick Start Checklist ==
=== Quick start checklist ===


Before playing, verify:
Before playing, verify:
Line 408: Line 336:
</syntaxhighlight>
</syntaxhighlight>


== See Also ==
== Troubleshooting ==
 
{| class="wikitable"
! Symptom !! Cause & Solution
|-
| '''Xruns (audio glitches)''' || Ensure <code>powerManagement.cpuFreqGovernor = "performance"</code> is active. Check <code>pw-top</code> for high-CPU nodes. Close browsers/heavy apps during playing. Disable Wi-Fi. As a last resort, add <code>processor.max_cstate=1</code> to <code>boot.kernelParams</code> (disables CPU sleep — high power draw).
|-
| '''No sound''' || Check <code>qpwgraph</code> — PipeWire does not auto-connect hardware. Verify Pro Audio profile in <code>pavucontrol</code>. Run <code>sudo lsof /dev/snd/*</code> to find conflicting processes.
|-
| '''DAW cannot find plugins''' || Ensure <code>environment.sessionVariables</code> block is applied. Log out/in after rebuild. Verify paths: <code>echo $LV2_PATH</code>.
|-
| '''GPU causing audio glitches''' || Disable GPU power management. Prefer X11 over Wayland for lowest latency.
|-
| '''Bluetooth causing Xruns''' || Disable Bluetooth stack: <code>rfkill block bluetooth</code> during live sessions.
|-
| '''PipeWire config not applying''' || Restart user services after rebuild: <code>systemctl --user restart pipewire wireplumber</code>. Check for WirePlumber overrides: <code>wpctl status</code>.
|}
 
== See also ==


* [[PipeWire]] — Official NixOS PipeWire documentation
* [[PipeWire]] — Official NixOS PipeWire documentation
* [[Audio production]] — General audio configuration and plugin paths
* [https://github.com/musnix/musnix musnix] — Deep NixOS audio optimizations module
* [https://github.com/musnix/musnix musnix] — Deep NixOS audio optimizations module
* [https://linuxmusicians.com/ LinuxMusicians Forum] — Community support
* [https://linuxmusicians.com/ LinuxMusicians Forum] — Community support

Latest revision as of 17:26, 15 May 2026

Electric guitar interface setup

This guide covers setting up an electric guitar with NixOS to achieve professional, low-latency audio processing. It targets live playing with round-trip latency (RTL) under 6 ms using the modern PipeWire/JACK stack.

⚠︎
Warning: Always start with monitoring volume at minimum when testing new signal chains. A sudden, loud feedback loop can be generated during loopback testing. Increase volume gradually only after the plugin is open and stable.

The digital signal chain for a guitar consists of:

  1. Instrument-level signal from Hi-Z pickups.
  2. Analog-to-Digital conversion via an external audio interface.
  3. Real-time processing on NixOS using a low-latency kernel and specialized software.
Note: Software-reported latency values are often inaccurate. Physical measurement via loopback test is mandatory for verification.

Installation

System configuration

Add the following to your /etc/nixos/configuration.nix. This configuration is optimized for high-performance CPUs like the AMD Ryzen 7 9700X (Zen 5 architecture).

{ pkgs, ... }:

{
  # 1. Sound Server: PipeWire with JACK/PulseAudio support
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true; # Required for yabridge/wine VST bridging
    pulse.enable = true;
    jack.enable = true;
    wireplumber.enable = true;
    
    # Global low-latency defaults for native JACK clients
    extraConfig.pipewire."92-low-latency" = {
      "context.properties" = {
        "default.clock.rate" = 48000;  # Fixed rate avoids resampling latency
        "default.clock.quantum" = 128;      # ~5ms latency at 48kHz
        "default.clock.min-quantum" = 64;   # ~2.5ms latency at 48kHz
        "default.clock.max-quantum" = 512;
      };
    };

    # Crucial: Match low-latency for PulseAudio clients (browsers, Steam/Rocksmith)
    extraConfig.pipewire-pulse."92-low-latency" = {
      "pulse.properties" = {
        "pulse.min.req" = "64/48000";    # Start with 64, not 32, for stability
        "pulse.default.req" = "64/48000";
        "pulse.max.req" = "128/48000";
      };
    };
  };

  # 2. Real-time Scheduling
  # RTKit handles real-time privileges via D-Bus/Polkit.
  security.rtkit.enable = true;
  
  # Critical: Allow unlimited memlock for real-time audio buffers
  security.pam.loginLimits = [
    { domain = "@audio"; item = "memlock"; type = "-"; value = "unlimited"; }
    { domain = "@audio"; item = "rtprio"; type = "-"; value = "95"; }
  ];
  
  users.users.yourname.extraGroups = [ "audio" ]; # Replace 'yourname' with your username

  # 3. Kernel and Performance Tweaks
  boot.kernelPackages = pkgs.linuxPackages_zen; 
  boot.kernelParams = [ 
    "threadirqs"
    "preempt=full"              # Optional: add if experiencing Xruns
    "amd_pstate=passive"        # Zen 4/5: passive + performance governor = stable freq
    # For Intel or older AMD: remove amd_pstate or use "intel_pstate=active"
    "usbcore.autosuspend=-1"    # Prevent USB audio interface sleep
  ];

  powerManagement.cpuFreqGovernor = "performance";
  
  # GameMode can elevate priorities for real-time audio applications
  programs.gamemode.enable = true;

  # 4. Plugin Search Paths (Crucial for NixOS DAWs)
  # Use sessionVariables for GUI apps launched from DE menu
  environment.sessionVariables = let
    makePluginPath = format:
      (pkgs.lib.makeSearchPath format [
        "$HOME/.nix-profile/lib"
        "/run/current-system/sw/lib"
        "/etc/profiles/per-user/$USER/lib"
      ]) + ":$HOME/.${format}";
  in {
    LV2_PATH = makePluginPath "lv2";
    VST3_PATH = makePluginPath "vst3";
    CLAP_PATH = makePluginPath "clap";  # Modern plugin format, supported by LSP/Chow
  };

  # 5. Essential Packages
  nixpkgs.config.allowUnfree = true; # Required for REAPER, Tonelib, etc.
  environment.systemPackages = with pkgs; [
    # --- Utilities & Routing ---
    qpwgraph            # Visual patchbay for PipeWire
    pavucontrol         # Profile selection (Pro Audio mode)
    pw-top              # Real-time CPU usage per audio node
    pw-cli              # Modern alternative to pw-metadata
    cpupower            # CPU frequency scaling controls
    alsa-scarlett-gui   # Hardware mixer for Focusrite Scarlett (may require firmware)

    # --- DAWs ---
    ardour
    reaper

    # --- Plugin Hosts ---
    carla               # Modular plugin host / pedalboard, supports Windows VST via yabridge

    # --- Standalone Guitar Processors ---
    guitarix

    # --- Plugins (LV2/CLAP) ---
    neural-amp-modeler-lv2  # NAM: loads .nam files from https://tonehunt.org
    lsp-plugins             # Includes latency meter, compressors, IR loader
    calf
    dragonfly-reverb
    gxplugins-lv2
    kapitonov-plugins-pack  # Profile-based amp models (KPP)
    chow-centaur            # Klon Centaur emulation
    chow-phaser

    # --- Practice & Learning ---
    tuxguitar
    hydrogen

    # --- Windows VST Compatibility ---
    yabridge
    yabridgectl
    wineWow64Packages.stable  # Use wineWow64Packages, as wineWowPackages is deprecated
  ];
}
Note: For advanced users, the musnix flake automates many low-level audio optimizations (such as PREEMPT_RT kernel tuning and rtirq). If you experience persistent Xruns with the standard Zen kernel, replacing manual tweaks with musnix.enable = true; is highly recommended. For Linux kernels 6.12 and newer, PREEMPT_RT is built-in.

Configuration

Applying changes

sudo nixos-rebuild switch

# Apply PipeWire configuration changes (required after rebuild):
systemctl --user restart pipewire pipewire-pulse wireplumber

Pro audio profile

To achieve minimal latency, you must bypass standard software mixing:

  1. Open pavucontrol.
  2. Go to the Configuration tab.
  3. Set your interface profile to Pro Audio.

If the "Pro Audio" profile is missing, ensure pipewire-alsa is installed and restart PipeWire. This profile disables software mixing and enables hardware-exclusive mode, which is critical for achieving the lowest latency.

Dynamic buffer control

You can change latency without rebuilding the system. Note that these settings affect PipeWire clients only; ALSA-direct applications (like Ardour with ALSA backend) use their own buffer settings.

# Modern syntax (PipeWire 0.3.65+):
pw-cli set-param 0 clock.force-quantum 64/48000

# Verify current settings:
pw-cli dump settings | grep -E "quantum|rate"

Use pw-top in a separate terminal to monitor which applications are consuming the most DSP processing time. Look for the ERR column — values greater than zero indicate Xruns.

Hardware and connection

Standard PC line-ins are unsuitable for guitar. Use a dedicated interface with a Hi-Z (Instrument) input.

Verified compatible devices

Device Notes
Focusrite Scarlett Solo (4th Gen) Plug-and-play. Use alsa-scarlett-gui for hardware monitoring. May require firmware update.
MOTU M2 / M4 Native ALSA kernel support for direct hardware mixer control via alsamixer. Exceptionally stable USB-C latency.
Universal Audio Volt 276 Reliable USB-C class-compliant interface.
Arturia MiniFuse 1 Stable performance under PipeWire.
Audient iD4 (Gen 1) Fully functional on NixOS. No special drivers needed.

Hardware rules

  1. Connect the interface directly to the motherboard (rear panel USB 3.0/3.2). Avoid USB hubs — they add latency and can cause Xruns.
  2. Use a high-quality, shielded USB cable. Audio dropouts are frequently caused by cheap cables acting as antennas for electrical interference.
  3. Disable Bluetooth during live playing: rfkill block bluetooth. The BT audio stack can generate interrupt storms causing Xruns.

Verification

lsusb                    # Confirm hardware connection
arecord -l               # Verify ALSA sees the capture input
aplay -l                 # Verify ALSA sees the playback output

Software guide

This section explains the available software for guitar processing on NixOS, organized by purpose.

Digital audio workstations

Software Purpose Notes
Ardour Professional recording, mixing, editing For absolute minimum RTL, use ALSA backend (bypasses PipeWire). Warning: ALSA locks device exclusively — no other app can produce sound.
REAPER Commercial DAW, lightweight, scriptable Uses PipeWire-JACK natively. Excellent Linux support. Unlimited trial.

Amp simulators and neural modelers

Software Purpose Notes
Neural Amp Modeler (NAM) Loads .nam files — AI captures of real tube amps No built-in GUI in LV2 version. In Carla/Ardour: look for atom:Path parameter and point to your .nam file. Models: tonehunt.org
Kapitonov Plugins Pack (KPP) Profile-based traditional amp modeling Excellent for classic rock/metal. Lower CPU than neural nets.
Guitarix All-in-one virtual amp + pedals Standalone or LV2. Good for quick practice.
⚠︎
Warning: Neural amps (NAM, KPP) only model preamp/poweramp. You must load a Cabinet IR (via LSP IR Loader or similar) to get a usable guitar tone. Without an IR, it sounds like a swarm of angry bees.

Effects plugins

Plugin Pack Key Features
LSP Plugins Professional EQ, compression, gating. Includes LSP Latency Meter and LSP Impulse Response Loader (required for cabinet sims).
Dragonfly Reverb High-quality algorithmic reverb (Hall, Room, Plate).
Chow Plugins High-fidelity emulations of classic pedals using RNN/WDF.
Calf Studio Gear Vintage-style effects with "warm" analog character.
GxPlugins.lv2 Guitarix project pedals (distortion, overdrive, fuzz) as standalone LV2.

Modular hosts

Software Purpose
Carla Modular plugin host. Chain plugins visually: Input → Tuner → NAM → IR Loader → Reverb → Output. Hosts Windows VSTs via yabridge.
qpwgraph Visual patchbay for PipeWire/JACK. Manually connect hardware inputs to software hosts (PipeWire does not auto-connect).

Windows VST compatibility

Tool Purpose
yabridge + yabridgectl Bridge for running Windows VST2/VST3 plugins on Linux via Wine. Essential for commercial plugins (Neural DSP, STL Tones, Amplitube).
# After installing Windows plugins via Wine:
yabridgectl sync  # Required to register plugins with Linux hosts

Tips and tricks

Rocksmith 2014

Rocksmith 2014 runs on NixOS via Proton and PipeWire.

  1. Install dependencies:
programs.steam.enable = true;
programs.gamemode.enable = true;
  1. Steam Launch Options (force low latency + real-time priority):
PIPEWIRE_LATENCY=128/48000 gamemoderun %command%

Start with 128/48000 (~5ms). If stable, try 64/48000 (~2.5ms). Values below 64 may cause crashes.

  1. Sample Rate: Rocksmith strictly requires 48000 Hz. Do not force 96000 Hz while playing.
  2. For interface users (no Real Tone Cable): Install the RS_ASIO mod to enable direct interface support.

Measuring latency

Always perform a physical loopback test.

⚠︎
Warning: Before starting, turn output volume on your audio interface all the way down. A sudden, loud feedback loop can be generated if the connection is unstable. Increase volume gradually only after the plugin is open.
  1. Connect a cable from your interface Output back into the Input (use a TS/TRS patch cable).
  2. Launch LSP Latency Meter:
# Option A: Via Carla (recommended for beginners)
carla  # Add plugin "LSP Latency Meter Stereo", connect wires

# Option B: Via jalv (terminal)
jalv http://lsp-plug.in/plugins/lv2/latency_meter_stereo
  1. Play a sharp transient (string scratch) and read the Round-trip Latency (RTL) value.

Target values:

  • < 5 ms: Professional / Imperceptible
  • 5–10 ms: Acceptable for practice
  • > 12 ms: Noticeable "lag", difficult to play in time

Quick start checklist

Before playing, verify:

# 1. CPU governor is performance
cpupower frequency-info | grep "current policy"  # Should show "performance"

# 2. PipeWire buffer is set
pw-cli dump settings | grep quantum  # Should show 64 or 128

# 3. No Xruns reported
pw-top | grep -E "ERR|XRUN"  # Should show 0 or empty

# 4. Pro Audio profile active
pavucontrol  # Configuration tab → your interface → Pro Audio

# 5. Plugin paths are set (for GUI apps)
echo $LV2_PATH  # Should include /run/current-system/sw/lib/lv2

Troubleshooting

Symptom Cause & Solution
Xruns (audio glitches) Ensure powerManagement.cpuFreqGovernor = "performance" is active. Check pw-top for high-CPU nodes. Close browsers/heavy apps during playing. Disable Wi-Fi. As a last resort, add processor.max_cstate=1 to boot.kernelParams (disables CPU sleep — high power draw).
No sound Check qpwgraph — PipeWire does not auto-connect hardware. Verify Pro Audio profile in pavucontrol. Run sudo lsof /dev/snd/* to find conflicting processes.
DAW cannot find plugins Ensure environment.sessionVariables block is applied. Log out/in after rebuild. Verify paths: echo $LV2_PATH.
GPU causing audio glitches Disable GPU power management. Prefer X11 over Wayland for lowest latency.
Bluetooth causing Xruns Disable Bluetooth stack: rfkill block bluetooth during live sessions.
PipeWire config not applying Restart user services after rebuild: systemctl --user restart pipewire wireplumber. Check for WirePlumber overrides: wpctl status.

See also