Electric guitar interface setup: Difference between revisions

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