Electric guitar interface setup: Difference between revisions
Mr.Smith1970 (talk | contribs) initial creation: Guide for low-latency electric guitar setup |
Mr.Smith1970 (talk | contribs) update: fixed PipeWire/Pulse config, switched to sessionVariables for GUI plugin paths, added memlock limits, expanded software guide with categorized explanations |
||
| 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 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. | |||
== Introduction == | == Introduction == | ||
| Line 9: | Line 11: | ||
# '''Analog-to-Digital conversion''' via an external audio interface. | # '''Analog-to-Digital conversion''' via an external audio interface. | ||
# '''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. | |||
== Installation == | == Installation == | ||
| Line 14: | Line 18: | ||
=== System Configuration === | === System Configuration === | ||
Add the following to your | 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, ... }: | { pkgs, config, ... }: | ||
{ | { | ||
| Line 24: | Line 28: | ||
enable = true; | enable = true; | ||
alsa.enable = true; | alsa.enable = true; | ||
alsa.support32Bit = true; | alsa.support32Bit = true; # Required for yabridge/wine VST bridging | ||
pulse.enable = true; | pulse.enable = true; | ||
jack.enable = true; | jack.enable = true; | ||
wireplumber.enable = true; | wireplumber.enable = true; | ||
# Global low-latency defaults | # Global low-latency defaults for native JACK clients | ||
extraConfig.pipewire."92-low-latency" = { | extraConfig.pipewire."92-low-latency" = { | ||
"context.properties" = { | "context.properties" = { | ||
"default.clock.rate" = 48000; | "default.clock.rate" = 48000; # Fixed rate avoids resampling latency | ||
"default.clock.quantum" = 128; # ~5ms latency | "default.clock.quantum" = 128; # ~5ms latency at 48kHz | ||
"default.clock.min-quantum" = 64; # ~2.5ms latency | "default.clock.min-quantum" = 64; # ~2.5ms latency at 48kHz | ||
"default.clock.max-quantum" = 512; | "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 | # 2. Real-time Scheduling | ||
# RTKit handles real-time privileges via D-Bus/Polkit. | |||
security.rtkit.enable = true; | security.rtkit.enable = true; | ||
users.users.yourname.extraGroups = [ "audio | |||
# 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 | # 3. Kernel and Performance Tweaks | ||
boot.kernelPackages = pkgs.linuxPackages_zen; | boot.kernelPackages = pkgs.linuxPackages_zen; | ||
boot.kernelParams = [ | boot.kernelParams = [ | ||
"preempt=full" | "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"; | 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; | nixpkgs.config.allowUnfree = true; # Required for REAPER, Tonelib, etc. | ||
environment.systemPackages = with pkgs; [ | environment.systemPackages = with pkgs; [ | ||
qpwgraph | # --- Utilities & Routing --- | ||
pavucontrol | 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 | ardour | ||
reaper | reaper | ||
carla | |||
# --- Plugin Hosts --- | |||
carla # Modular plugin host / pedalboard, supports Windows VST via yabridge | |||
# --- Standalone Guitar Processors --- | |||
guitarix | guitarix | ||
# tonelib-gfx # NOTE: Currently marked as broken in nixpkgs; install from vendor if needed | |||
lsp-plugins | |||
# --- Plugins (LV2/CLAP) --- | |||
neural-amp-modeler-lv2 # NAM: loads .nam files from https://tonehunt.org | |||
lsp-plugins # Includes latency meter, compressors, IR loader | |||
calf | calf | ||
dragonfly-reverb | 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 | tuxguitar | ||
hydrogen | hydrogen | ||
# --- Windows VST Compatibility --- | |||
yabridge | |||
yabridgectl | |||
wineWowPackages.stable # Use stable, not staging, for VST compatibility | |||
]; | ]; | ||
} | } | ||
</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. | |||
=== Applying Changes === | === Applying Changes === | ||
| Line 82: | Line 160: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
sudo nixos-rebuild switch | sudo nixos-rebuild switch | ||
# Apply PipeWire configuration changes (required after rebuild): | |||
systemctl --user restart pipewire pipewire-pulse wireplumber | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Hardware & Connection == | == Hardware & Connection == | ||
Standard PC line-ins are unsuitable for guitar. Use a dedicated interface with a '''Hi-Z (Instrument)''' input. | |||
=== Verified compatible devices (2026) === | |||
{| class="wikitable" | |||
! Device !! Notes | |||
|- | |||
| '''Focusrite Scarlett Solo (4th Gen)''' || Plug-and-play. Use <code>alsa-scarlett-gui</code> for hardware monitoring. May require firmware update. | |||
|- | |||
| '''MOTU M2 / M4''' || Native ALSA kernel support for direct hardware mixer control via <code>alsamixer</code>. Exceptionally stable USB-C latency. | |||
|- | |||
| '''Universal Audio Volt 276''' || Reliable USB-C class-compliant interface. | |||
|- | |||
| '''Arturia MiniFuse 1''' || Stable performance under PipeWire. | |||
|} | |||
=== 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. | ||
# 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. | |||
=== Verification === | === Verification === | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
lsusb | lsusb # Confirm hardware connection | ||
aplay -l | 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> | |||
</syntaxhighlight> | </syntaxhighlight> | ||
| Line 106: | Line 204: | ||
To achieve minimal latency, you must bypass standard software mixing: | To achieve minimal latency, you must bypass standard software mixing: | ||
# Open < | |||
# Go to '''Configuration'''. | # Open <code>pavucontrol</code>. | ||
# Go to '''Configuration''' tab. | |||
# Set your interface profile to '''Pro Audio'''. | # 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 === | === Dynamic Buffer Control === | ||
You can change latency without rebuilding the system: | 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"> | <syntaxhighlight lang="bash"> | ||
# | # Modern syntax (PipeWire 0.3.65+): | ||
pw- | pw-cli set-param 0 clock.force-quantum 64/48000 | ||
# Verify current | # Verify current settings: | ||
pw- | pw-cli dump settings | grep -E "quantum|rate" | ||
# Alternative: use wpctl (WirePlumber CLI) | |||
wpctl set-default-rate 48000 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Software | 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. | |||
=== Digital Audio Workstations (DAWs) === | |||
{| class="wikitable" | |||
! 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 === | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! 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] | ||
|- | |- | ||
| ''' | | '''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 === | ||
{| class="wikitable" | |||
! 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''' (<code>chow-centaur</code>, <code>chow-phaser</code>) || 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 === | ||
{| class="wikitable" | |||
! 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 === | |||
{| class="wikitable" | |||
! Tool !! Purpose | |||
|- | |||
| '''yabridge + yabridgectl''' || Bridge for running Windows VST2/VST3 plugins on Linux via Wine. Essential for commercial plugins (Neural DSP, STL Tones, Amplitube). | |||
|} | |||
<syntaxhighlight lang="bash"> | |||
# After installing Windows plugins via Wine: | |||
yabridgectl sync # Required to register plugins with Linux hosts | |||
</syntaxhighlight> | |||
'''Note''': Ensure glibc versions match between Wine and system. Check with <code>ldd /path/to/plugin.dll</code>. | |||
== Rocksmith 2014 Remastered (Optional) == | |||
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''': | |||
<syntaxhighlight lang="nix"> | |||
# In configuration.nix: | |||
programs.steam.enable = true; | |||
programs.gamemode.enable = true; # For launch option below | |||
</syntaxhighlight> | |||
# '''Steam Launch Options''' (force low latency + real-time priority): | |||
<pre> | |||
PIPEWIRE_LATENCY=128/48000 gamemoderun %command% | |||
</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. | |||
# '''If using Real Tone Cable and experiencing issues''', try ALSA backend as fallback (warning: exclusive device access): | |||
<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. | |||
== Measuring Latency == | == Measuring Latency == | ||
Never trust software reports. Always perform a physical loopback test: | Never trust software reports. Always perform a physical loopback test. | ||
# Connect a cable from your interface '''Output''' back into the '''Input'''. | |||
# | === 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). | |||
# Launch LSP Latency Meter: | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
# Play a sharp transient (string scratch) and read the '''Round-trip Latency (RTL)''' value. | |||
=== Target Values === | |||
{| class="wikitable" | {| class="wikitable" | ||
! Latency !! Perception | ! Latency !! Perception | ||
|- | |- | ||
| < 5 ms || Professional / Imperceptible | | '''< 5 ms''' || Professional / Imperceptible | ||
|- | |- | ||
| | | '''5–10 ms''' || Acceptable for practice | ||
|- | |- | ||
| > 12 ms || | | '''> 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 == | == 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 == | |||
Before playing, verify: | |||
<syntaxhighlight lang="bash"> | |||
# 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 | |||
</syntaxhighlight> | |||
== See Also == | == See Also == | ||
* [[PipeWire]] | |||
* [https://github.com/musnix/musnix musnix] | * [[PipeWire]] — Official NixOS PipeWire documentation | ||
* [https://github.com/musnix/musnix musnix] — Deep NixOS audio optimizations module | |||
* [https://linuxmusicians.com/ LinuxMusicians Forum] — Community support | |||
* [https://tonehunt.org ToneHunt] — Free NAM model library | |||
* [https://github.com/mdias/rs_asio RS_ASIO] — Rocksmith interface mod | |||
[[Category:Guides]] | [[Category:Guides]] | ||
[[Category:Hardware]] | [[Category:Hardware]] | ||
[[Category:Sound]] | [[Category:Sound]] | ||
Latest revision as of 14:05, 17 April 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.
⚠️ 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:
- Instrument-level signal from Hi-Z pickups.
- Analog-to-Digital conversion via an external audio interface.
- 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
- 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.
- 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:
- Open
pavucontrol. - Go to Configuration tab.
- 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
- Install dependencies:
# In configuration.nix:
programs.steam.enable = true;
programs.gamemode.enable = true; # For launch option below
- 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.
- Sample Rate: Rocksmith strictly requires 48000 Hz. Do not force 96000 Hz while playing.
- 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
- 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.
- Connect a cable from your interface Output back into the Input (use a TS/TRS patch cable).
- 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
- 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
- PipeWire — Official NixOS PipeWire documentation
- musnix — Deep NixOS audio optimizations module
- LinuxMusicians Forum — Community support
- ToneHunt — Free NAM model library
- RS_ASIO — Rocksmith interface mod