Skip to content

grenudi/EasyEffectPresets

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EasyEffects Presets — Deep Voice, Voice Changers & True-Stereo HRTF Surround for Linux

Broadcast-grade microphone chains, cinematic voice changers, and a real 4-channel HRTF crossfeed for EasyEffects on PipeWire.

Noise suppression that doesn't gut your low end · a demonic voice changer that isn't just a pitch-down · a child voice that isn't a chipmunk · and JamesDSP's "Joe0Bloggs Realistic Surround" ported to EasyEffects as a true-stereo impulse response.

Requires EasyEffects 8.x (Qt). Presets use the 8.x JSON schema and will not load correctly on 7.x.

easyeffects · pipewire · linux-audio · noise-suppression · deepfilternet · voice-changer · hrtf · crossfeed · impulse-response · convolver · nixos


Table of Contents


Highlights

🎙️ A deep-voice chain that preserves vocal fry. Most Linux microphone presets high-pass at 80 Hz and run a neural denoiser at full strength. Both of those delete creak/vocal fry, which lives at 20–50 Hz — the exact band every denoiser was trained to call "rumble." These presets high-pass at 25 Hz, cap DeepFilterNet's attenuation limit, and replace the broadband noise gate with a multiband gate that protects the sub band and gates only where hiss actually lives.

👹 A demonic voice changer built on layering, not pitch-shifting. A pitch shift alone sounds like a slowed-down tape. EasyEffects' Pitch plugin exposes independent dry/wet, so each instance can emit the original and the shifted copy simultaneously. Two stacked instances = four voices at once, plus a sub-octave rumble bed, harmonic snarl, asymmetric slapback and a convolved cavern.

🧒 A child voice with a formant-corrective EQ. Pitch and formants scale by different factors between an adult and a 7-year-old (≈2.9× vs ≈1.5×), and SoundTouch physically cannot separate them. So the shift stops short of "correct," and an EQ re-carves the spectral envelope back toward where a child's formants belong. That difference is chipmunk vs. child.

🎧 joe0bloggs-realistic-surround.irs — the headline. JamesDSP's "Joe0Bloggs Realistic Surround" is not a crossfeed. It's a four-tap FIR matrix (L→L, L→R, R→L, R→R) — a 683 ms binaural room response with genuine inter-aural crosstalk. It has been extracted from JamesDSP's embedded FLAC blob and rebuilt as a 4-channel true-stereo .irs that EasyEffects loads natively. As far as we know, this is the first port of it to EasyEffects.


Repository layout

input_microphone/               # microphone (input) presets
output_headphones_speakers/     # playback (output) presets
irs/                            # impulse responses (.irs)

Microphone presets (input)

Preset Use for Added latency
clear-deep-voice-rich-textured-no-gate.json Everyday calls, streaming, recording. The flagship. Low (~25 ms)
clean-less-gate-more-filter.json Quiet rooms. Minimal gating, leans on filtering. Low
deep-voice-demonic.json Voice changer — algorithmic reverb version. High (~100–150 ms)
deep-voice-demonic-ir.json Voice changer — convolution reverb version. High (~100–150 ms)
child-voice.json Voice changer — ~9–10 year old. Medium (~50 ms)

clear-deep-voice-rich-textured-no-gate.json

The flagship. A rich, textured, broadcast-style chain for a deep male voice that keeps the creak and rumble most presets scrub away.

Stereo Tools → Deep Noise Remover → [Gate: off] → Multiband Gate
   → EQ (cleanup) → Compressor → EQ (tone) → De-esser → Convolver → Limiter
  • High-pass at 25 Hz, not 80 Hz — creak glottal pulses run 20–50 Hz.
  • DeepFilterNet capped at 18 dB attenuation (default is 100) with the post-filter at 0 — the post-filter is what sandpapers creaky texture.
  • The broadband gate is bypassed. A gate is a level switch: your fry is quieter than a keystroke, so no threshold separates them. The multiband gate does the job per-band instead, leaving the sub band open.
  • Convolver at −12 dB wet puts the voice in a subtle room rather than a dead booth.

clean-less-gate-more-filter.json

A leaner variant for quiet rooms. Fewer dynamics, more surgical filtering — including a −36 dB notch at 16.5 kHz to kill a specific mic whine.

Deep Noise Remover → Gate → EQ → Compressor → EQ → De-esser → Stereo Tools → Limiter

deep-voice-demonic.json / deep-voice-demonic-ir.json

Cinematic monster voice: deep, rumbling, vast, with a pinch of echo.

Stereo Tools → Deep Noise Remover → [Gate: off] → Multiband Gate → EQ → Compressor
   → De-esser → Pitch −4 st → Pitch −1 oct → EQ → Exciter → Delay → SPACE → Limiter
  • Pitch #1 drops the body −4 semitones while blending the original back in at −8 dB. The two beat against each other — that interference is what stops it sounding human.
  • Pitch #2 adds a copy one octave below everything, at −9 dB: a subterranean bed, felt more than heard.
  • Bass Enhancer generates harmonics of that sub layer so the rumble survives on laptop and phone speakers.
  • EQ hollows out 500 Hz. Counterintuitive, but "cavernous" comes from removing midrange, not adding bass.
  • Delay throws a single slap at 95 ms left / 135 ms right — the asymmetry spreads the echo while the voice stays centred and legible.
  • The front end denoises harder than the clean preset (DFN at 30, sub band gated, high-pass at 70 Hz). Preserving natural fry is pointless here — the entire low end is synthesised downstream, and feeding rumble into a pitch shifter turns a desk bump into a cannon.

Which one? deep-voice-demonic.json uses the Calf reverb (adjustable decay, damping, predelay, bass-cut). deep-voice-demonic-ir.json swaps it for convolution reverb using a real impulse response — better space, but you lose the send-side bass-cut, because convolution is linear and commutes with every EQ in the chain. Pick your impulse accordingly.

child-voice.json

Stereo Tools → Deep Noise Remover → [Gate: off] → Multiband Gate
   → EQ (band-limit) → Compressor → De-esser → Pitch +16 st → EQ (formants) → Limiter
  • +16 semitones, deliberately short of a true 7-year-old's pitch. Those last few semitones would drag the formants past where any human vocal tract could put them — that overshoot is the chipmunk sound.
  • dry is off (−100 dB). A single dB of the original leaves an adult ghost under the child and the illusion collapses.
  • The second EQ is a fake vocal tract: −3.5 dB at 2.8 kHz removes the chipmunk honk, +3 dB at 1.1 kHz rebuilds an F1 so it's round rather than merely squeaky, and the high-pass sits at 170 Hz because a child has no chest resonance at all.

Output presets (headphones / speakers)

Bass-PerfectEQ-RealisticSurround.json

Perfect EQ (10-band) → Convolver: Razor Surround → Convolver: Joe0Bloggs → EQ (corrective) → Limiter

Bass-enhanced Perfect-EQ curve, then two complementary convolvers:

  • Razor Surround is a 2-channel impulse → EasyEffects convolves it diagonally (L→L, R→R only). No crosstalk. It provides tonal and room colouration.
  • Joe0Bloggs Realistic Surround is a 4-channel impulse → EasyEffects builds the full matrix including L→R and R→L. This is what actually moves the sound outside your head.

They do different jobs, so stacking them is intended, not redundant.


Impulse responses

File Channels Rate Length What it does
joe0bloggs-realistic-surround.irs 4 (true-stereo) 48 kHz 683 ms Real HRTF binaural crosstalk. 8.2 dB direct-to-cross separation.
Razor Surround ((48k Z-Edition)) 2.Stereo +20 bass.irs 2 (diagonal) 48 kHz 186 ms Headphone tonal/room colouration + bass.

EasyEffects supports true-stereo (4-channel) impulse responses — a fact almost nobody uses. When a kernel has 4 channels it calls impdata_create(0,1) and impdata_create(1,0), wiring the cross-paths. The interleave order is [L→L, L→R, R→L, R→R].

⚠️ ir-width must stay at 100 for the HRTF. It's not a "more surround" knob — it stretches the geometry of a virtual head.

⚠️ Run at 48 kHz. The HRTF is native 48 kHz; resampling it smears the interaural time differences, which are precisely the cue that puts sound outside your skull.


Dependencies

Component Provides Required by
EasyEffects ≥ 8.0 the host everything
PipeWire audio server everything
LSP Plugins Gate, Multiband Gate, Compressor, Limiter, Equalizer, De-esser, Delay all presets
Calf Bass Enhancer, Exciter, Reverb, Stereo Tools all presets
DeepFilterNet (LADSPA) Deep Noise Remover all mic presets
zita-convolver Convolver IR presets (usually bundled with EasyEffects)
SoundTouch Pitch voice changers (bundled with EasyEffects)

Install — NixOS

configuration.nix

{ pkgs, ... }:
{
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    pulse.enable = true;
  };

  environment.systemPackages = with pkgs; [
    easyeffects
    lsp-plugins
    calf
    deepfilternet     # Deep Noise Remover (LADSPA)
    rnnoise-plugin    # optional
  ];
}

Then:

sudo nixos-rebuild switch

Home Manager — declarative presets (recommended)

Track this repo as a flake input and let Home Manager place the presets and impulses for you. Nothing to copy by hand, and it survives a reinstall.

# flake.nix
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    home-manager.url = "github:nix-community/home-manager";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";

    easyeffects-presets = {
      url = "github:grenudi/EasyEffectPresets";
      flake = false;
    };
  };

  outputs = { nixpkgs, home-manager, easyeffects-presets, ... }: {
    homeConfigurations."you" = home-manager.lib.homeManagerConfiguration {
      pkgs = nixpkgs.legacyPackages.x86_64-linux;
      extraSpecialArgs = { inherit easyeffects-presets; };
      modules = [ ./home.nix ];
    };
  };
}
# home.nix
{ pkgs, easyeffects-presets, ... }:
{
  home.packages = with pkgs; [
    easyeffects
    lsp-plugins
    calf
    deepfilternet
  ];

  # recursive = true symlinks each file individually,
  # so EasyEffects can still save your own presets alongside these.
  home.file.".local/share/easyeffects/input" = {
    source = "${easyeffects-presets}/input_microphone";
    recursive = true;
  };

  home.file.".local/share/easyeffects/output" = {
    source = "${easyeffects-presets}/output_headphones_speakers";
    recursive = true;
  };

  home.file.".local/share/easyeffects/irs" = {
    source = "${easyeffects-presets}/irs";
    recursive = true;
  };

  services.easyeffects.enable = true;   # autostart
}
home-manager switch

If Deep Noise Remover doesn't appear in EasyEffects' plugin list, it's a LADSPA discovery problem, not a preset problem. Check that LADSPA_PATH includes /run/current-system/sw/lib/ladspa.


Install — other distros

Arch / Manjaro / EndeavourOS

sudo pacman -S easyeffects lsp-plugins calf pipewire pipewire-pulse
# Deep Noise Remover (AUR):
yay -S deep-filter-ladspa

Fedora

sudo dnf install easyeffects lsp-plugins calf pipewire pipewire-pulseaudio

DeepFilterNet isn't packaged — grab the LADSPA .so from Rikorose/DeepFilterNet releases and drop it in ~/.ladspa/.

openSUSE

sudo zypper install easyeffects lsp-plugins calf pipewire pipewire-pulseaudio

Debian / Ubuntu

Debian and Ubuntu repositories generally still ship EasyEffects 7.x, and these presets need 8.x. Use the Flatpak.

sudo apt install flatpak
flatpak install flathub com.github.wwmm.easyeffects

Flatpak (any distro)

flatpak install flathub com.github.wwmm.easyeffects
flatpak run com.github.wwmm.easyeffects

The Flatpak bundles the LSP and Calf plugin sets. Confirm Deep Noise Remover appears in the plugin list; if not, add the DeepFilterNet Flatpak extension.


Installing the presets

Manual (native install)

git clone https://github.com/grenudi/EasyEffectPresets.git
cd EasyEffectPresets

mkdir -p ~/.local/share/easyeffects/{input,output,irs}
cp input_microphone/*.json            ~/.local/share/easyeffects/input/
cp output_headphones_speakers/*.json  ~/.local/share/easyeffects/output/
cp irs/*.irs                          ~/.local/share/easyeffects/irs/

Restart EasyEffects. The presets appear under Presets on the Input and Output tabs.

Flatpak paths

BASE=~/.var/app/com.github.wwmm.easyeffects/data/easyeffects
mkdir -p $BASE/{input,output,irs}
cp input_microphone/*.json           $BASE/input/
cp output_headphones_speakers/*.json $BASE/output/
cp irs/*.irs                         $BASE/irs/

Copy the .irs files first. Impulses must exist before a preset that references them is loaded, or the convolver silently passes audio straight through.

Declarative (NixOS)

See the Home Manager section above.


Usage

  1. Open EasyEffects → Input tab (microphone) or Output tab (playback).
  2. Presets → select one.
  3. Point your app (Discord, OBS, Zoom, browser) at the EasyEffects virtual source.

Set your sample rate to 48 kHz:

pw-metadata -n settings 0 clock.force-rate 48000

Halves CPU versus 96 kHz, puts DeepFilterNet on its native rate, and avoids resampling the HRTF.


Tuning

Two knobs matter more than everything else combined.

The Gate / Multiband Gate thresholds depend on your room. Sit silent, watch each band's meter, and set the threshold ~5 dB above where the noise rests. Every value shipped here is a starting point, not a law.

DeepFilterNet's attenuation limit is the noise-vs-texture dial. Higher = cleaner and flatter. Lower = noisier and more alive. There is no setting that gives you both, because a 35 Hz creak and a 35 Hz air conditioner look nearly identical to any denoiser.

Want Change
More noise removed Raise Deep Noise Remover → Attenuation limit (18 → 24 → 30)
More vocal texture Lower it (18 → 12)
More monstrous pitch#0 semitones (−4 → −6)
Older child pitch#0 semitones (+4 → +1)
More reverb Convolver wet
Less sibilance De-esser threshold

Troubleshooting

The convolver does nothing / no reverb / no surround. kernel-name in the preset must exactly match the .irs filename without its extension. If EasyEffects imported an impulse twice you'll get a name (1) suffix baked into the saved preset, and it will never resolve. A missing kernel doesn't error — it silently passes audio through.

Audio only in the left ear. Your microphone is mono and PipeWire is presenting it as left-only. Stereo Tools must be the first effect, with the matrix set to LR > LL (Mono Left Channel). Every sidechain downstream uses "Middle" (L+R), so before this fix they all read ~6 dB quiet — recalibrate your gate thresholds afterwards.

A constant tone / whine that survives muting the mic. Self-oscillation. Check that the routing gains inside Gate/Compressor/Limiter (input-to-sidechain, sidechain-to-input, …) are at −80.01 dB, not 0.0. In EasyEffects 8 these are dB gains, so 0.0 means unity — fully connected, which closes a feedback loop inside the plugin. Presets converted from 7.x are a common source of this.

Deep Noise Remover missing. LADSPA discovery. Confirm the DeepFilterNet .so is on LADSPA_PATH.

Voice changers feel laggy. They are: SoundTouch adds real latency and the demonic presets stack two instances. Do not monitor yourself live while speaking — delayed auditory feedback in the 100–200 ms window is a documented speech disruptor and will make you stumble over your own words. Bypass pitch#1 to roughly halve it.

Vocal fry / low rumble disappears. Something is eating it. In order of likelihood: Deep Noise Remover's attenuation limit is too high; the high-pass is above ~40 Hz; the gate threshold is above your creak's level.


How it works

Details worth knowing if you plan to fork these.

Convolution is linear, so it commutes with EQ. In deep-voice-demonic-ir.json no EQ can pre-filter the reverb send independently of the dry voice — the Calf reverb's bass-cut has no equivalent. Only the nonlinear plugins care where they sit relative to the convolver, which is why the Bass Enhancer moved after it: it fabricates harmonics of the octave-down layer, and convolving those with a long tail produces a sustained low-mid drone that swallows the voice.

A gate is a switch, not a filter. While it's open, everything passes — which is why noise sits inside your voice while silence stays clean. Only per-frequency processing (multiband gate, or a neural denoiser) removes noise during speech.

The HRTF port. JamesDSP stores mode 5's impulse as a FLAC blob (CCConv) in binaryBlobs.c with four hardcoded per-channel gains (0.436 / 0.076 / 0.052 / 0.455 — the large pair are the direct paths, the small pair the contralateral cross-paths). Its loader signature is (irLL, irLR, irRL, irRR) — identical to EasyEffects' 4-channel de-interleave order. Decode, apply the gains, write as a 4-channel WAV with an .irs extension, and EasyEffects reproduces it exactly. autogain is safe to leave on, incidentally: it applies a single shared scalar to all four channels, so the direct/cross ratio survives.


Credits & licence

  • EasyEffects by Wellington Wallace — GPL-3.0
  • JamesDSP — GPL-3.0. joe0bloggs-realistic-surround.irs is derived from its embedded HRTF data; the surround profile is credited to Joe0Bloggs.
  • LSP Plugins, Calf Studio Gear, DeepFilterNet, zita-convolver, SoundTouch — their respective licences.
  • Razor Surround is a third-party impulse response included for convenience; check its own terms before redistributing.

Licensed GPL-3.0, required for compatibility with the JamesDSP-derived HRTF data.


Keywords

EasyEffects presets · PipeWire · Linux microphone noise suppression · DeepFilterNet · RNNoise · noise gate · multiband gate · LSP Plugins · Calf · vocal fry · deep voice preset · broadcast voice chain · voice changer Linux · demonic voice · child voice · pitch shifter · SoundTouch · convolver · impulse response · IRS · HRTF · crossfeed · true-stereo impulse response · binaural · out-of-head · headphone surround · JamesDSP · Joe0Bloggs Realistic Surround · NixOS · Home Manager · Arch Linux · Fedora · Debian · Ubuntu · Flatpak · Discord · OBS · streaming

Suggested GitHub topics: easyeffects pipewire linux-audio audio-presets noise-suppression deepfilternet voice-changer pitch-shift hrtf crossfeed binaural impulse-response convolution-reverb jamesdsp nixos home-manager microphone obs discord

About

my selection of EasyEffect Presets

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors