Electric guitar interface setup: Difference between revisions
Mr.Smith1970 (talk | contribs) Electric guitar interface setup: clean up, fix Wine package, add Audient iD4, remove unavailable plugins, comply with MOS |
Mr.Smith1970 (talk | contribs) Update: add PipeASIO, TONE3000, modernize kernel tweaks and Rocksmith setup |
||
| Line 1: | Line 1: | ||
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 and WirePlumber 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 | |||
{{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.}} | ||
| Line 16: | Line 14: | ||
=== 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> or your flake. This configuration is optimized for high-performance CPUs like the AMD Ryzen 7 9700X (Zen 5 architecture) running NixOS 26.05 "Yarara" or newer. | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
| Line 31: | Line 29: | ||
wireplumber.enable = true; | wireplumber.enable = true; | ||
# Global low-latency defaults for native JACK clients | # Global low-latency defaults for native JACK and ALSA clients | ||
# Note: PulseAudio specific latency settings (pulse.min.req) are deprecated | |||
# in PipeWire 0.3.80+ and handled globally by default.clock.* parameters. | |||
extraConfig.pipewire."92-low-latency" = { | extraConfig.pipewire."92-low-latency" = { | ||
"context.properties" = { | "context.properties" = { | ||
"default.clock.rate" = 48000; # Fixed rate avoids resampling latency | "default.clock.rate" = 48000; # Fixed rate avoids resampling latency | ||
"default.clock.quantum" = 128; # ~5ms latency at 48kHz | "default.clock.quantum" = 128; # ~5ms latency at 48kHz | ||
"default.clock.min-quantum" = | "default.clock.min-quantum" = 32; # Allows top-tier interfaces to achieve ~1.5ms | ||
"default.clock.max-quantum" = 512; | "default.clock.max-quantum" = 512; | ||
}; | }; | ||
}; | }; | ||
# | # Disable node suspension to prevent audio pops on USB interfaces | ||
extraConfig | wireplumber.extraConfig."99-disable-suspend" = { | ||
" | "monitor.alsa.rules" = [{ | ||
" | matches = [ | ||
{ "node.name" = "~alsa_input.*"; } | |||
" | { "node.name" = "~alsa_output.*"; } | ||
}; | ]; | ||
actions = { | |||
update-props = { | |||
"session.suspend-timeout-seconds" = 0; | |||
}; | |||
}; | |||
}]; | |||
}; | }; | ||
}; | }; | ||
| Line 55: | Line 61: | ||
security.rtkit.enable = true; | security.rtkit.enable = true; | ||
# Critical: Allow unlimited memlock for real-time audio buffers | # Critical: Allow unlimited memlock and high rtprio for real-time audio buffers | ||
security.pam.loginLimits = [ | security.pam.loginLimits = [ | ||
{ domain = "@audio"; item = "memlock"; type = "-"; value = "unlimited"; } | { domain = "@audio"; item = "memlock"; type = "-"; value = "unlimited"; } | ||
{ domain = "@audio"; item = "rtprio"; type = "-"; value = " | { domain = "@audio"; item = "rtprio"; type = "-"; value = "99"; } | ||
{ domain = "@audio"; item = "nice"; type = "-"; value = "-19"; } | |||
]; | ]; | ||
| Line 64: | Line 71: | ||
# 3. Kernel and Performance Tweaks | # 3. Kernel and Performance Tweaks | ||
boot.kernelPackages = pkgs. | # Since kernel 6.12, PREEMPT_RT patches are merged into mainline, but distros | ||
# generally ship with CONFIG_PREEMPT_DYNAMIC. 'preempt=full' enables dynamic | |||
# preemption for best-effort low latency. For hard real-time requirements, | |||
# a custom kernel with CONFIG_PREEMPT_RT=y is still needed. | |||
boot.kernelPackages = pkgs.linuxPackages_latest; | |||
boot.kernelParams = [ | boot.kernelParams = [ | ||
"threadirqs" | "threadirqs" | ||
"preempt=full" | "preempt=full" | ||
"amd_pstate= | "amd_pstate=active" # Zen 4/5: active mode provides best EPP and responsiveness | ||
"usbcore.autosuspend=-1" # Prevent USB audio interface sleep | "usbcore.autosuspend=-1" # Prevent USB audio interface sleep | ||
]; | ]; | ||
# Disable power-profiles-daemon to prevent conflicts with manual cpuFreqGovernor | |||
services.power-profiles-daemon.enable = false; | |||
powerManagement.cpuFreqGovernor = "performance"; | powerManagement.cpuFreqGovernor = "performance"; | ||
| Line 79: | Line 91: | ||
# 4. Plugin Search Paths (Crucial for NixOS DAWs) | # 4. Plugin Search Paths (Crucial for NixOS DAWs) | ||
# Use | # Use environment.variables for reliable global access in Wayland/X11 sessions | ||
environment. | environment.variables = let | ||
makePluginPath = format: | makePluginPath = format: | ||
(pkgs.lib.makeSearchPath format [ | (pkgs.lib.makeSearchPath format [ | ||
| Line 90: | Line 102: | ||
LV2_PATH = makePluginPath "lv2"; | LV2_PATH = makePluginPath "lv2"; | ||
VST3_PATH = makePluginPath "vst3"; | VST3_PATH = makePluginPath "vst3"; | ||
CLAP_PATH = makePluginPath "clap"; # Modern plugin format, supported by | CLAP_PATH = makePluginPath "clap"; # Modern plugin format, supported by Bitwig/REAPER | ||
}; | }; | ||
# 5. Essential Packages | # 5. Essential Packages | ||
nixpkgs.config.allowUnfree = true; # Required for REAPER, | nixpkgs.config.allowUnfree = true; # Required for REAPER, Bitwig, etc. | ||
environment.systemPackages = with pkgs; [ | environment.systemPackages = with pkgs; [ | ||
# --- Utilities & Routing --- | # --- Utilities & Routing --- | ||
qpwgraph # Visual patchbay for PipeWire | qpwgraph # Visual patchbay for PipeWire | ||
pavucontrol # | pwvucontrol # Modern native PipeWire volume control | ||
pavucontrol # Fallback for Pro Audio profile selection | |||
pw-top # Real-time CPU usage per audio node | pw-top # Real-time CPU usage per audio node | ||
easyeffects # System-wide real-time EQ and effects | |||
# --- DAWs --- | # --- DAWs --- | ||
ardour | ardour | ||
reaper | reaper | ||
bitwig-studio # Native Linux commercial DAW, excellent CLAP support | |||
# --- Plugin Hosts --- | # --- Plugin Hosts --- | ||
| Line 115: | Line 127: | ||
# --- Plugins (LV2/CLAP) --- | # --- Plugins (LV2/CLAP) --- | ||
neural-amp-modeler-lv2 # NAM: loads .nam files from | neural-amp-modeler-lv2 # NAM: loads .nam files from tone3000.com | ||
lsp-plugins | proteus # Neural network modeling (LSTM) by GuitarML | ||
lsp-plugins # Includes latency meter, compressors, IR loader | |||
calf | calf | ||
dragonfly-reverb | dragonfly-reverb | ||
gxplugins-lv2 | gxplugins-lv2 | ||
kapitonov-plugins-pack | kapitonov-plugins-pack # Profile-based amp models (KPP) | ||
chow-centaur | chow-centaur # Klon Centaur emulation | ||
chow-phaser | chow-phaser | ||
| Line 130: | Line 143: | ||
# --- Windows VST Compatibility --- | # --- Windows VST Compatibility --- | ||
yabridge | yabridge | ||
yabridgectl | (yabridgectl.override { wine = wineWowPackages.stable; }) # Explicit Wine path | ||
wineWow64Packages.stable # Use wineWow64Packages, as wineWowPackages is deprecated | wineWow64Packages.stable # Use wineWow64Packages, as wineWowPackages is deprecated | ||
]; | ]; | ||
| Line 136: | Line 149: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Note|1=For advanced users, the [https://github.com/musnix/musnix musnix] flake automates many low-level audio optimizations (such as | {{Note|1=For advanced users, the [https://github.com/musnix/musnix musnix] flake automates many low-level audio optimizations (such as <code>rtirq</code> and environment variables). In NixOS 26.05, while <code>musnix</code> kernel patches may lag behind mainline, its <code>rtirq</code> and ulimits automation remain highly useful. You can enable it with <code>musnix.enable = true;</code>.}} | ||
== Configuration == | == Configuration == | ||
| Line 146: | Line 159: | ||
# Apply PipeWire configuration changes (required after rebuild): | # Apply PipeWire configuration changes (required after rebuild): | ||
systemctl --user restart pipewire | systemctl --user restart pipewire wireplumber | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Line 157: | Line 170: | ||
# Set your interface profile to '''Pro Audio'''. | # 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. | If the "Pro Audio" profile is missing (or listed as "Digital Stereo" / "Multichannel" depending on the interface), 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 === | === Dynamic buffer control === | ||
You can change latency without rebuilding the system. Note that | You can change latency without rebuilding the system. Note that this setting is temporary and will be lost after restarting PipeWire. | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
# | # Force quantum to 64 samples (pw-metadata syntax): | ||
pw- | pw-metadata -n settings 0 clock.force-quantum 64 | ||
# Verify current settings: | # Verify current settings: | ||
pw- | pw-metadata -n settings | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Line 182: | Line 195: | ||
! Device !! Notes | ! Device !! Notes | ||
|- | |- | ||
| '''Focusrite Scarlett | | '''Focusrite Scarlett 4th Gen (Solo/2i2/4i4)''' || Plug-and-play. Requires disabling MSD Mode (hold 48V button while powering on). <code>alsa-scarlett-gui</code> works natively without extra packages. | ||
|- | |- | ||
| '''MOTU M2 / M4''' || Native ALSA kernel support | | '''Focusrite Scarlett 4th Gen (16i16/18i16/18i20)''' || Requires kernel ≥6.14, <code>fcp-support</code>, and a firmware update via <code>alsa-scarlett-gui</code>. | ||
|- | |||
| '''MOTU M2 / M4''' || Native ALSA kernel support (requires kernel ≥6.1+). Direct hardware mixer control via <code>alsamixer</code>. Exceptionally stable USB-C latency. | |||
|- | |- | ||
| '''Universal Audio Volt 276''' || Reliable USB-C class-compliant interface. | | '''Universal Audio Volt 276''' || Reliable USB-C class-compliant interface. | ||
| Line 198: | Line 213: | ||
# 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>. The 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. | ||
# '''Limit GPU FPS''': High frame rates in 3D applications or GUI-heavy plugins (like Neural DSP) can generate PCIe interrupt storms causing DPC latency spikes. Cap your FPS or enable VSync in your compositor/games. | |||
=== Verification === | === Verification === | ||
| Line 219: | Line 235: | ||
|- | |- | ||
| '''REAPER''' || Commercial DAW, lightweight, scriptable || Uses PipeWire-JACK natively. Excellent Linux support. Unlimited trial. | | '''REAPER''' || Commercial DAW, lightweight, scriptable || Uses PipeWire-JACK natively. Excellent Linux support. Unlimited trial. | ||
|- | |||
| '''Bitwig Studio''' || Modern commercial DAW || Native Linux support. Superior CLAP format integration and modular sound design. | |||
|} | |} | ||
| Line 226: | Line 244: | ||
! Software !! Purpose !! Notes | ! Software !! Purpose !! Notes | ||
|- | |- | ||
| '''Neural Amp Modeler (NAM)''' || Loads <code>.nam</code> files — AI captures of real tube amps || No built-in GUI | | '''Neural Amp Modeler (NAM)''' || LV2 plugin. Loads <code>.nam</code> files — AI captures of real tube amps || No built-in GUI. In Carla/Ardour: look for <code>atom:Path</code> parameter and point to your <code>.nam</code> file. Models: [https://tone3000.com TONE3000] (formerly ToneHunt). | ||
|- | |||
| '''Proteus''' || LV2 plugin. Neural network modeling (LSTM) by GuitarML || Faster preset switching than NAM. Models: [https://github.com/GuitarML/Proteus GuitarML GitHub]. | |||
|- | |- | ||
| '''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 233: | Line 253: | ||
|} | |} | ||
{{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, | {{Warning|Neural amps (NAM, Proteus, 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, the sound will be thin and unpleasant.}} | ||
=== Effects plugins === | === Effects plugins === | ||
| Line 240: | Line 260: | ||
! 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). Available in CLAP. | ||
|- | |- | ||
| '''Dragonfly Reverb''' || High-quality algorithmic reverb (Hall, Room, Plate). | | '''Dragonfly Reverb''' || High-quality algorithmic reverb (Hall, Room, Plate). | ||
| Line 266: | Line 286: | ||
! Tool !! Purpose | ! Tool !! Purpose | ||
|- | |- | ||
| '''yabridge + yabridgectl''' || Bridge for running Windows VST2/VST3 plugins on Linux via Wine. Essential for commercial plugins (Neural DSP, STL Tones, Amplitube). | | '''yabridge + yabridgectl''' || Bridge for running Windows VST2/VST3/CLAP plugins on Linux via Wine. Essential for commercial plugins (Neural DSP, STL Tones, Amplitube). | ||
|- | |||
| '''PipeASIO''' || [https://github.com/M0n7y5/pipeasio Experimental] ASIO-to-PipeWire driver. Bypasses JACK entirely, connecting ASIO directly to PipeWire. Early testing recommended for Windows DAWs (FL Studio, Ableton) in Proton. | |||
|} | |} | ||
| Line 278: | Line 300: | ||
=== Rocksmith 2014 === | === Rocksmith 2014 === | ||
Rocksmith 2014 runs on NixOS via Proton and PipeWire. | Rocksmith 2014 runs on NixOS via Proton and PipeWire. There are two distinct approaches depending on your preferred audio routing. '''Do not mix them''', as they are mutually exclusive. | ||
# | ==== Approach A: Declarative via nixos-rocksmith (WineASIO + JACK) ==== | ||
This method uses the [https://github.com/re1n0/nixos-rocksmith nixos-rocksmith] flake, which patches Steam to preload <code>libjack.so</code> and use <code>RS_ASIO</code> with WineASIO. | |||
# Add the module to your flake and enable it: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
programs.steam | programs.steam = { | ||
enable = true; | |||
rocksmithPatch.enable = true; | |||
}; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
# '''Steam Launch Options''': | |||
<pre>LD_PRELOAD=/usr/lib32/libjack.so PIPEWIRE_LATENCY=128/48000 %command%</pre> | |||
==== Approach B: PipeASIO (Direct ASIO to PipeWire) ==== | |||
This method bypasses JACK and WineASIO entirely, connecting ASIO directly to PipeWire. It is experimental but offers excellent performance inside the Steam Runtime container. | |||
# '''Steam Launch Options''' ( | # Build and install [https://github.com/M0n7y5/pipeasio PipeASIO] under <code>$HOME/.local</code> (Proton cannot see system-wide <code>/usr/lib/wine</code>). | ||
<pre> | # Register the driver in the game's Wine prefix: | ||
<syntaxhighlight lang="bash"> | |||
env WINEPREFIX="$HOME/.steam/steam/steamapps/compatdata/221680/pfx" pipeasio-register | |||
</syntaxhighlight> | |||
# '''Steam Launch Options''' (point Proton to the local Wine libs): | |||
<pre>WINEDLLPATH=$HOME/.local/lib/wine gamemoderun %command%</pre> | |||
# Note: When using PipeASIO, buffer size is negotiated directly via the ASIO control panel inside the game or PipeASIO settings, so <code>PIPEWIRE_LATENCY</code> may not be required. | |||
{{Note|1=Rocksmith strictly requires a sample rate of 48000 Hz. Do not force 96000 Hz while playing.}} | |||
=== Measuring latency === | === Measuring latency === | ||
| Line 324: | Line 360: | ||
# 2. PipeWire buffer is set | # 2. PipeWire buffer is set | ||
pw- | pw-metadata -n settings # Should show clock.force-quantum 64 or 128 | ||
# 3. No Xruns reported | # 3. No Xruns reported (run pw-top in batch mode for clean output) | ||
pw-top | grep | pw-top -b -n 1 | grep ERR # Should show 0 or empty | ||
# 4. Pro Audio profile active | # 4. Pro Audio profile active | ||
| Line 341: | Line 377: | ||
! Symptom !! Cause & Solution | ! 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 — | | '''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 — results in extreme power draw and heat, use with caution). | ||
|- | |- | ||
| '''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. | | '''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. | | '''DAW cannot find plugins''' || Ensure <code>environment.variables</code> block is applied. Log out/in after rebuild. Verify paths: <code>echo $LV2_PATH</code>. | ||
|- | |||
| '''Audio pops a few seconds after playback stops''' || WirePlumber suspends the ALSA node after 5 seconds of inactivity. Ensure <code>session.suspend-timeout-seconds = 0</code> is set in <code>wireplumber.extraConfig</code>. | |||
|- | |- | ||
| '''GPU causing audio glitches''' || Disable GPU power management. Prefer X11 over Wayland for lowest latency. | | '''GPU causing audio glitches''' || Disable GPU power management. Limit FPS in games/DAW to reduce PCIe interrupt storms (DPC latency). Prefer X11 over Wayland for lowest latency if using JUCE-based plugins that render incorrectly. | ||
|- | |- | ||
| '''Bluetooth causing Xruns''' || Disable Bluetooth stack: <code>rfkill block bluetooth</code> during live sessions. | | '''Bluetooth causing Xruns''' || Disable Bluetooth stack: <code>rfkill block bluetooth</code> during live sessions. | ||
| Line 360: | Line 398: | ||
* [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 | ||
* [https:// | * [https://tone3000.com TONE3000] — Largest library of NAM models and IRs (formerly ToneHunt) | ||
* [https://github.com/ | * [https://github.com/M0n7y5/pipeasio PipeASIO] — Experimental ASIO to PipeWire bridge for Wine/Proton | ||
* [https://codeberg.org/nizo/linux-rocksmith linux-rocksmith] — Comprehensive guide to Rocksmith on Linux | |||
[[Category:Guides]] | [[Category:Guides]] | ||
[[Category:Hardware]] | [[Category:Hardware]] | ||
[[Category:Sound]] | [[Category:Sound]] | ||
Latest revision as of 17:56, 17 June 2026
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 and WirePlumber stack.
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.
Installation
System configuration
Add the following to your /etc/nixos/configuration.nix or your flake. This configuration is optimized for high-performance CPUs like the AMD Ryzen 7 9700X (Zen 5 architecture) running NixOS 26.05 "Yarara" or newer.
{ 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 and ALSA clients
# Note: PulseAudio specific latency settings (pulse.min.req) are deprecated
# in PipeWire 0.3.80+ and handled globally by default.clock.* parameters.
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" = 32; # Allows top-tier interfaces to achieve ~1.5ms
"default.clock.max-quantum" = 512;
};
};
# Disable node suspension to prevent audio pops on USB interfaces
wireplumber.extraConfig."99-disable-suspend" = {
"monitor.alsa.rules" = [{
matches = [
{ "node.name" = "~alsa_input.*"; }
{ "node.name" = "~alsa_output.*"; }
];
actions = {
update-props = {
"session.suspend-timeout-seconds" = 0;
};
};
}];
};
};
# 2. Real-time Scheduling
# RTKit handles real-time privileges via D-Bus/Polkit.
security.rtkit.enable = true;
# Critical: Allow unlimited memlock and high rtprio for real-time audio buffers
security.pam.loginLimits = [
{ domain = "@audio"; item = "memlock"; type = "-"; value = "unlimited"; }
{ domain = "@audio"; item = "rtprio"; type = "-"; value = "99"; }
{ domain = "@audio"; item = "nice"; type = "-"; value = "-19"; }
];
users.users.yourname.extraGroups = [ "audio" ]; # Replace 'yourname' with your username
# 3. Kernel and Performance Tweaks
# Since kernel 6.12, PREEMPT_RT patches are merged into mainline, but distros
# generally ship with CONFIG_PREEMPT_DYNAMIC. 'preempt=full' enables dynamic
# preemption for best-effort low latency. For hard real-time requirements,
# a custom kernel with CONFIG_PREEMPT_RT=y is still needed.
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.kernelParams = [
"threadirqs"
"preempt=full"
"amd_pstate=active" # Zen 4/5: active mode provides best EPP and responsiveness
"usbcore.autosuspend=-1" # Prevent USB audio interface sleep
];
# Disable power-profiles-daemon to prevent conflicts with manual cpuFreqGovernor
services.power-profiles-daemon.enable = false;
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 environment.variables for reliable global access in Wayland/X11 sessions
environment.variables = 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 Bitwig/REAPER
};
# 5. Essential Packages
nixpkgs.config.allowUnfree = true; # Required for REAPER, Bitwig, etc.
environment.systemPackages = with pkgs; [
# --- Utilities & Routing ---
qpwgraph # Visual patchbay for PipeWire
pwvucontrol # Modern native PipeWire volume control
pavucontrol # Fallback for Pro Audio profile selection
pw-top # Real-time CPU usage per audio node
easyeffects # System-wide real-time EQ and effects
# --- DAWs ---
ardour
reaper
bitwig-studio # Native Linux commercial DAW, excellent CLAP support
# --- 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 tone3000.com
proteus # Neural network modeling (LSTM) by GuitarML
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.override { wine = wineWowPackages.stable; }) # Explicit Wine path
wineWow64Packages.stable # Use wineWow64Packages, as wineWowPackages is deprecated
];
}
rtirq and environment variables). In NixOS 26.05, while musnix kernel patches may lag behind mainline, its rtirq and ulimits automation remain highly useful. You can enable it with musnix.enable = true;.Configuration
Applying changes
sudo nixos-rebuild switch
# Apply PipeWire configuration changes (required after rebuild):
systemctl --user restart pipewire wireplumber
Pro audio profile
To achieve minimal latency, you must bypass standard software mixing:
- Open
pavucontrol. - Go to the Configuration tab.
- Set your interface profile to Pro Audio.
If the "Pro Audio" profile is missing (or listed as "Digital Stereo" / "Multichannel" depending on the interface), 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 this setting is temporary and will be lost after restarting PipeWire.
# Force quantum to 64 samples (pw-metadata syntax):
pw-metadata -n settings 0 clock.force-quantum 64
# Verify current settings:
pw-metadata -n settings
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 4th Gen (Solo/2i2/4i4) | Plug-and-play. Requires disabling MSD Mode (hold 48V button while powering on). alsa-scarlett-gui works natively without extra packages.
|
| Focusrite Scarlett 4th Gen (16i16/18i16/18i20) | Requires kernel ≥6.14, fcp-support, and a firmware update via alsa-scarlett-gui.
|
| MOTU M2 / M4 | Native ALSA kernel support (requires kernel ≥6.1+). 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
- 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. The BT audio stack can generate interrupt storms causing Xruns. - Limit GPU FPS: High frame rates in 3D applications or GUI-heavy plugins (like Neural DSP) can generate PCIe interrupt storms causing DPC latency spikes. Cap your FPS or enable VSync in your compositor/games.
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. |
| Bitwig Studio | Modern commercial DAW | Native Linux support. Superior CLAP format integration and modular sound design. |
Amp simulators and neural modelers
| Software | Purpose | Notes |
|---|---|---|
| Neural Amp Modeler (NAM) | LV2 plugin. Loads .nam files — AI captures of real tube amps |
No built-in GUI. In Carla/Ardour: look for atom:Path parameter and point to your .nam file. Models: TONE3000 (formerly ToneHunt).
|
| Proteus | LV2 plugin. Neural network modeling (LSTM) by GuitarML | Faster preset switching than NAM. Models: GuitarML GitHub. |
| 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. |
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). Available in CLAP. |
| 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/CLAP plugins on Linux via Wine. Essential for commercial plugins (Neural DSP, STL Tones, Amplitube). |
| PipeASIO | Experimental ASIO-to-PipeWire driver. Bypasses JACK entirely, connecting ASIO directly to PipeWire. Early testing recommended for Windows DAWs (FL Studio, Ableton) in Proton. |
# 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. There are two distinct approaches depending on your preferred audio routing. Do not mix them, as they are mutually exclusive.
Approach A: Declarative via nixos-rocksmith (WineASIO + JACK)
This method uses the nixos-rocksmith flake, which patches Steam to preload libjack.so and use RS_ASIO with WineASIO.
- Add the module to your flake and enable it:
programs.steam = {
enable = true;
rocksmithPatch.enable = true;
};
- Steam Launch Options:
LD_PRELOAD=/usr/lib32/libjack.so PIPEWIRE_LATENCY=128/48000 %command%
Approach B: PipeASIO (Direct ASIO to PipeWire)
This method bypasses JACK and WineASIO entirely, connecting ASIO directly to PipeWire. It is experimental but offers excellent performance inside the Steam Runtime container.
- Build and install PipeASIO under
$HOME/.local(Proton cannot see system-wide/usr/lib/wine). - Register the driver in the game's Wine prefix:
env WINEPREFIX="$HOME/.steam/steam/steamapps/compatdata/221680/pfx" pipeasio-register
- Steam Launch Options (point Proton to the local Wine libs):
WINEDLLPATH=$HOME/.local/lib/wine gamemoderun %command%
- Note: When using PipeASIO, buffer size is negotiated directly via the ASIO control panel inside the game or PipeASIO settings, so
PIPEWIRE_LATENCYmay not be required.
Measuring latency
Always perform a physical loopback test.
- 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:
- < 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-metadata -n settings # Should show clock.force-quantum 64 or 128
# 3. No Xruns reported (run pw-top in batch mode for clean output)
pw-top -b -n 1 | grep ERR # 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 — results in extreme power draw and heat, use with caution).
|
| 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.variables block is applied. Log out/in after rebuild. Verify paths: echo $LV2_PATH.
|
| Audio pops a few seconds after playback stops | WirePlumber suspends the ALSA node after 5 seconds of inactivity. Ensure session.suspend-timeout-seconds = 0 is set in wireplumber.extraConfig.
|
| GPU causing audio glitches | Disable GPU power management. Limit FPS in games/DAW to reduce PCIe interrupt storms (DPC latency). Prefer X11 over Wayland for lowest latency if using JUCE-based plugins that render incorrectly. |
| 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
- PipeWire — Official NixOS PipeWire documentation
- Audio production — General audio configuration and plugin paths
- musnix — Deep NixOS audio optimizations module
- LinuxMusicians Forum — Community support
- TONE3000 — Largest library of NAM models and IRs (formerly ToneHunt)
- PipeASIO — Experimental ASIO to PipeWire bridge for Wine/Proton
- linux-rocksmith — Comprehensive guide to Rocksmith on Linux