Jump to content

Electric guitar interface setup

From Official NixOS Wiki

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.

⚠️ 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.

Introduction

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, config, ... }:

{
  # 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. NVIDIA Workaround (If applicable)
  # 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
  environment.sessionVariables = let
    makePluginPath = format = (pkgs.lib.makeSearchPath format [
      "/run/current-system/sw/lib"
      "${config.users.users.yourname.home}/.nix-profile/lib"  # Adjust if using home-manager
    ]) + ":$HOME/.${format}";
  in {
    LV2_PATH = makePluginPath "lv2";
    VST3_PATH = makePluginPath "vst3";
    CLAP_PATH = makePluginPath "clap";  # Modern plugin format, supported by LSP/Chow
  };

  # 6. 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
    # tonelib-gfx       # NOTE: Currently marked as broken in nixpkgs; install from vendor if needed

    # --- 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
    # airwindows-lv2        # NOTE: Large package (~400 plugins); consider selective install

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

    # --- Windows VST Compatibility ---
    yabridge
    yabridgectl
    wineWowPackages.stable  # Use stable, not staging, for VST compatibility
  ];
}

Note on musnix: For advanced users, the musnix flake automates many low-level audio optimizations (such as PREEMPT_RT kernel patching, rtirq tuning, and das_watchdog). If you experience persistent Xruns with the standard Zen kernel, replacing manual tweaks with musnix.enable = true; is highly recommended. Warning: musnix may require replacing your kernel and can affect compatibility with Steam/Wine applications.

Applying Changes

sudo nixos-rebuild switch

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

Hardware & Connection

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

Verified compatible devices (2026)

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.

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. 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
# For detailed interface capabilities:
arecord --dump-hw-params -D hw:<card>,<device>

Audio Server Setup

Pro Audio Profile

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

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

Note: If "Pro Audio" profile is missing, ensure pipewire-alsa 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.

# 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

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

Software Guide: Choosing Your Rig

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

Digital Audio Workstations (DAWs)

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 & Neural Modelers

Software Purpose Notes
Neural Amp Modeler (NAM) (neural-amp-modeler-lv2) 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.

⚠️ 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.

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 (chow-centaur, chow-phaser) 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

Note: Ensure glibc versions match between Wine and system. Check with ldd /path/to/plugin.dll.

Rocksmith 2014 Remastered (Optional)

Rocksmith 2014 runs on NixOS via Proton and PipeWire.

Connection Options

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

  1. Install dependencies:
# In configuration.nix:
programs.steam.enable = true;
programs.gamemode.enable = true;  # For launch option below
  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 <64 may cause crashes.

  1. Sample Rate: Rocksmith strictly requires 48000 Hz. Do not force 96000 Hz while playing.
  1. If using Real Tone Cable and experiencing issues, try ALSA backend as fallback (warning: exclusive device access):
# Only use if Pulse backend fails. May silence other apps.
protontricks 221680 sound=alsa
  1. For interface users (no Real Tone Cable): Install RS_ASIO mod to enable direct interface support. This bypasses the 48kHz limitation and allows using your professional interface.

Measuring Latency

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.

  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

Latency Perception
< 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 (buffer / sample_rate) * 2 * 1000, check: USB interface hardware buffers, PipeWire extra quantum settings, kernel interrupt latency.

Troubleshooting

Symptom Cause & Solution
Xruns (audio glitches) • Ensure powerManagement.cpuFreqGovernor = "performance" is active (cpupower frequency-info).
• Check pw-top for high-CPU nodes.
• Close browsers/heavy apps during playing.
• Disable Wi-Fi: sudo modprobe -r iwlwifi.
• As 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.
• Check plugin installation: ls ~/.lv2, ls /run/current-system/sw/lib/lv2.
NVIDIA audio glitches • Disable GPU power management: hardware.nvidia.powerManagement.enable = false;
• For RTX 40/50 series: add boot.extraModprobeConfig = "options nvidia NVreg_EnableGpuFirmware=0";
• 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.

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

See Also