---
title: XeniAudio SpectralMediator — User Manual
subtitle: Anti-masking spectral dynamics — v1.3.1
author: Tony Cuny — XeniAudio
date: May 2026
---

# XeniAudio SpectralMediator

**Anti-masking spectral dynamics plugin — v1.3.1**

SpectralMediator solves the most common problem in mixing: two tracks fighting
for the same frequency range. By exchanging FFT magnitude bins and per-band
energies through shared memory between two instances on different channels,
each instance dynamically carves room out of itself wherever its peer has
content — automatically, in real time, frequency by frequency.

| Format | Description                                  |
|--------|----------------------------------------------|
| VST3   | Universal format (Windows, Linux, macOS)     |
| CLAP   | Modern plugin format (Windows, Linux, macOS) |

---

<!-- pagebreak -->

# Installation

## System requirements

| Platform | Minimum                                                            |
|----------|--------------------------------------------------------------------|
| OS       | Windows 10+ (64-bit), Linux (x86-64-v3), macOS 10.13+ (Intel / Apple Silicon) |
| DAW      | Any VST3 or CLAP host                                              |
| CPU      | x86-64 with AVX2                                                   |
| RAM      | 2 GB                                                               |

## Windows

1. Run `XeniAudio-SpectralMediator-V1.3.1-Installer.exe`.
2. Follow the prompts. The installer places:
   - VST3 in `C:\Program Files\Common Files\VST3\`
   - CLAP in `C:\Program Files\Common Files\CLAP\SpectralMediator\`
3. Restart your DAW and rescan plugins.

## Linux

```bash
tar xzf SpectralMediator-1.3.1-Linux.tar.gz
cd SpectralMediator-1.3.1-Linux
./install.sh
```

VST3 lands in `~/.vst3/`, CLAP in `~/.clap/`. Pass alternative paths as
positional arguments to `install.sh`.

## macOS

1. Mount `SpectralMediator-1.3.1-macOS.dmg`.
2. Double-click the `.pkg` inside.
3. The default install scope is the current user
   (`~/Library/Audio/Plug-Ins/`). Click *Customize* → *Install for all users*
   to install system-wide.
4. Restart your DAW and rescan plugins.

**Signed and notarized.** As of v1.3.1 the macOS installer is signed with an
Apple Developer ID and notarized by Apple, so it installs with no warning and
no right-click workaround. The certificate is issued to *Tony Cuny* — Apple
issues Developer ID certificates to the individual behind an independent
business, not to the trade name, so that is the name macOS shows rather than
XeniAudio.

If macOS still complains, the download was almost certainly damaged or
incomplete — re-download rather than trying to bypass the warning.

---

<!-- pagebreak -->

# Concept

## What "anti-masking" means

When two instruments share the same frequency range, the ear can only resolve
one at a time clearly. The classic fixes are:

- **Static EQ cuts** on one of them. Effective but unconditional — even when
  the masker is silent, the EQ stays cut.
- **Sidechain compression**. Effective for level but not for spectrum — it
  ducks everything, including frequencies that weren't actually fighting.

SpectralMediator is the surgical alternative. It looks at *what frequencies
are actually clashing right now* and ducks only those, only on the masked
instrument, only while the masker is loud. Static EQ and sidechain become
redundant for the cases SpectralMediator handles.

## How the two instances talk

Insert one instance on each track. The two SpectralMediators discover each
other through a shared-memory segment (Boost.Interprocess) and pair via the
*REMOTE* dropdown at the top of each editor. After pairing, every FFT hop:

1. Each instance writes its own magnitude bins (1024 linear bins) and
   per-band energies (3 bands) into its slot in shared memory.
2. Each instance reads its peer's bins.
3. Each instance compares, per bin, its own level to its peer's level inside
   each user-defined band. Where the peer is louder than the band's
   threshold, this instance attenuates that bin proportionally to the
   ratio.

Result: when the kick hits, the bass-low region in the bass track ducks; when
the kick is silent, no ducking. Same logic in reverse for the kick on the
upper bass region. Both tracks get out of each other's way without a single
EQ move.

## What it isn't

- **Not a sidechain compressor.** A sidechain compressor ducks the whole
  signal based on a level threshold. SpectralMediator ducks only the
  frequencies that are actually masked.
- **Not a dynamic EQ.** A dynamic EQ reacts to its own input. SpectralMediator
  reacts to a *peer's* input through inter-instance communication.
- **Not a multiband compressor.** A multiband compressor splits one signal
  and compresses each band against itself. SpectralMediator compares one
  signal against another, per band, dynamically.

---

<!-- pagebreak -->

# Quick start (kick + bass)

1. Insert SpectralMediator on the **kick** track. Rename the instance from
   the title field — type `Kick`.
2. Insert SpectralMediator on the **bass** track. Rename it `Bass`.
3. On either instance, click the *--- disconnected ---* dropdown above the
   *REMOTE* analyzer and select the other instance's name. Both instances
   are now paired (both dropdowns will show the peer's name; the small SHM
   dot in the top-right turns green).
4. The default 1-band layout (20 Hz → 20 kHz) is too broad. **Right-click**
   inside the *LOCAL* analyzer at around 200 Hz to add a band split. The
   band now has two halves; right-click again at around 1 kHz to add a
   third split if you want more precision.
5. Drag each band's threshold (the orange horizontal handle inside the
   band) down to about -20 dB. Drag the ratio (right-edge handle) up to
   about 4:1.
6. Play the song. The bass should now duck under the kick wherever the
   kick has spectral content, without affecting any other frequency range.

---

<!-- pagebreak -->

# Interface tour

```
+-------------------------------------------------------------------------+
|  X SM   SpectralMediator #1                  LOCAL          [DEMO] *SHM |  <- header
+-------------------------------------------------------------------------+
|                                                                         |
|  HP                       (local FFT spectrum)                       LP |  <- LOCAL
|   |                                                                  |  |     analyzer
|  20Hz                                                              20kHz|
+-------------------------------------------------------------------------+
|  [Kick               (v)]                     REMOTE                    |  <- REMOTE
|   |                       (peer FFT spectrum)                        |  |     analyzer
|  20Hz                                                              20kHz|
+-------------------------------------------------------------------------+
|  LOCAL OUTPUT                                          REMOTE OUTPUT    |  <- controls
|   (Attack)  (Release)  (Makeup)            (Attack)  (Release)  (Makeup)|
+-------------------------------------------------------------------------+
```

## Top header

- **X badge**: XeniAudio brand mark. Decorative.
- **SM** wordmark, in orange.
- **Instance name** (editable). Click to enter rename mode, type, press Enter.
  This is the name your peer will see in their REMOTE dropdown.
- **LOCAL** label, centered, purple. Identifies the analyzer below as your
  own track.
- **BYP** toggle (right of the LOCAL label): bypasses this instance —
  audio passes through untouched, but the pairing stays alive, so you can
  A/B without having to re-pair afterwards. Note that a bypassed instance
  also stops feeding its peer, so ducking stops in *both* directions.
- **DUCK** toggle (right of BYP, present in both the LOCAL and the REMOTE
  header): controls whether that track gives way.
  Lit (the default) is the two-way behaviour — both tracks duck each other.
  Turn it off and this track is no longer reduced, while it keeps feeding
  the peer, so the peer goes on ducking against it. That is **one-sided
  ducking**: one track takes priority and only the other moves out of the
  way. See *One-sided ducking* below.
- **DEMO badge** (red, top-right): only visible while the plugin is in demo
  mode. Click it to open the activation dialog. The badge pulses while the
  5 s mute window is active.
- **SHM dot** (far top-right): green when paired, dim grey otherwise.

## LOCAL analyzer (top band)

- **FFT spectrum** in purple — your track's content.
- **HP / LP draggable handles** at left and right edges. Drag the small
  rectangles inward to set the high-pass / low-pass detection limits. Bins
  outside `[HP, LP]` are excluded from ducking detection (passed through
  unattenuated).
- **Bands**: vertical splits define independent ducking regions. Created
  by **right-click** anywhere inside the LOCAL analyzer. Drag the vertical
  split to move the boundary between bands. To delete a band, right-click
  on its split.
- **Threshold handle** (orange horizontal bar inside each band): drag up
  / down to set the dB threshold. The peer's level inside the band is
  compared to this; above threshold, ducking starts.
- **Ratio handle** (right-edge inside each band): drag up to make the
  ducking more aggressive. 1:1 = no ducking (effectively disabled).
  20:1 ~ hard ducking.

## REMOTE header (between the two analyzers)

- **REMOTE dropdown** (left): lists every other SpectralMediator instance
  the host has loaded. Pick one to pair. Selecting `--- disconnected ---`
  unpairs.
- **REMOTE** label, centered, orange. Identifies the analyzer below as your
  peer's track.

## REMOTE analyzer (bottom band)

Same controls as the LOCAL analyzer but they edit your peer's settings
remotely (changes are pushed into the peer's SHM slot). Useful when you
want to dial in the entire pairing without switching plugin windows.
The peer's FFT spectrum is shown in orange.

## Output controls (bottom strip)

Two mirrored panels:

- **LOCAL OUTPUT** (purple, left): Attack, Release, Makeup. Apply to your
  own audio.
- **REMOTE OUTPUT** (orange, right): same three controls but they push
  values into the peer's slot. The peer's audio thread picks them up and
  applies them locally on its side.

## Resize

Drag the small grip in the bottom-right corner to resize the editor. The
host frame follows live (Bitwig, FL Studio, Studio One; Reaper Linux + CLAP).
On Reaper Windows VST3, the frame catches up only at button release —
**switch to the CLAP build** to get live frame resize on that host (see
*Known issues*).

The size is persisted in the project: when you reopen, the editor returns
to the size you left it at.

---

<!-- pagebreak -->

# Parameters

## Band layout (per side)

| Parameter   | Range                | Default | Unit | Notes                                 |
|-------------|----------------------|---------|------|---------------------------------------|
| FreqLow     | 20 Hz to 2000 Hz     | 200 Hz  | Hz   | Low / Mid crossover                   |
| FreqHigh    | 500 Hz to 20000 Hz   | 5000 Hz | Hz   | Mid / High crossover                  |
| HP          | 20 Hz to 1000 Hz     | 20 Hz   | Hz   | Detection high-pass — bins below pass through |
| LP          | 1000 Hz to 20000 Hz  | 20 kHz  | Hz   | Detection low-pass — bins above pass through  |

Band layout is also editable interactively: right-click in either analyzer
to add a split, drag splits to move boundaries.

## Per-band ducking (3 bands)

| Parameter      | Range          | Default | Unit |
|----------------|----------------|---------|------|
| Threshold      | -60 dB to 0 dB | -20 dB  | dB   |
| Ratio          | 1:1 to 20:1    | 4:1     | —    |

When the peer's level inside a band exceeds Threshold, this instance
attenuates the same band proportionally to the Ratio. 1:1 effectively
disables ducking for that band.

## Envelope and output (LOCAL + REMOTE, six knobs total)

| Knob    | Range            | Default  | Snap   | Role                                  |
|---------|------------------|----------|--------|---------------------------------------|
| Attack  | 0.1 ms to 300 ms | 10 ms    | 0.1 ms | Time constant when GR is increasing   |
| Release | 5 ms to 2000 ms  | 100 ms   | 1 ms   | Time constant when GR is releasing    |
| Makeup  | -12 dB to +24 dB | 0 dB     | 0.1 dB | Output gain after ducking             |

**Drag**: 1 px ~ 0.9 ms of Attack. Hold **Shift** for ~3× finer drag (~ 0.25 ms / px).
The values snap to the column above (Attack: 0.1 ms, Release: 1 ms, Makeup:
0.1 dB) so you can land on round values like Attack = 10.0 exactly.

REMOTE knobs write directly into the peer's slot — your peer's audio thread
will pick them up and apply locally. The peer's own UI knobs will move to
match.

## One-sided ducking

By default a pair of instances trade: each one steps out of the way of the
other where they collide. That is what makes SpectralMediator different from a
classic sidechain, and most of the time it is what you want.

Sometimes it is not. A lead vocal, a kick, a hook line — some tracks should
never move, and everything else should work around them. The **DUCK** toggle
in the header decides that per instance:

| DUCK on this instance | What happens to this track | What happens to the peer |
|------------------------|----------------------------|--------------------------|
| Lit (default)          | Ducks against the peer     | Ducks against this track |
| Unlit                  | **Never reduced**          | Still ducks against it   |

Turning DUCK off does **not** disconnect the pair, and it is not the same as
bypassing. This instance keeps analysing and keeps feeding the peer — it simply
stops applying any reduction to itself. Turn it off on the track that should
win, and leave it on everywhere else.

**Both sides from one window.** There are two DUCK toggles, one in the LOCAL
header and one in the REMOTE header, exactly like the BYP toggles and the
REMOTE knobs. Which of the two tracks gives way is a decision about the *pair*,
so you can take it from either instance without switching windows — the REMOTE
toggle writes straight into your partner's slot and its own UI follows. The
REMOTE toggle is greyed out until a peer is selected.

> **DUCK off is not BYP.** Bypassing an instance stops it feeding the peer as
> well, so ducking stops in both directions. If you want one track to keep
> priority while the other still gives way, DUCK is the control you want.

Both instances can have DUCK off at once — that just means neither ducks, which
is the same as having no pairing at all.

---

<!-- pagebreak -->

# Use cases

## Kick + bass

Insert SM on kick, insert SM on bass, pair.

- **Bass-side band layout**: 1 band 20 Hz → 200 Hz, threshold around
  -24 dB, ratio 6:1.
- **Kick-side band layout**: leave default 1 band 20 Hz → 20 kHz, threshold
  -20 dB, ratio 2:1 (light, just to clean up the very low bass leakage on
  the kick mic).

When the kick hits, only the bass-low band ducks. The bass mid/highs
(string body, harmonics) are untouched. When the kick stops, full bass
returns instantly within the Release time.

## Voice + guitar

Vocal in front, rhythm guitar masking the formant region.

- **Guitar-side**: split bands at 800 Hz and 3 kHz. Set the middle band's
  threshold around -22 dB and ratio 5:1. Leave the low and high bands
  almost off (ratio 1.5:1).
- **Vocal-side**: 1 band, ratio 1.5:1 — light reciprocal ducking just to
  prevent the guitar from popping out of the bed when the vocal pauses.

The guitar yields in the formant band whenever the vocal is active, while
keeping its body and brilliance.

## Snare + overheads

The snare hits leak into the overheads. With static EQ, you'd cut the
overheads' snare region all the time. With SM, you cut only when the
snare is actually hitting.

- **Overheads-side**: 1 band 200 Hz → 800 Hz, threshold -18 dB, ratio 8:1,
  Attack 1 ms (very fast — match the transient), Release 60 ms.
- **Snare-side**: leave at 1:1 ratio (don't duck the snare).

Tightens the drum image audibly. The cymbals stay full because their
spectrum is above the band.

## Two backing vocals on the same syllable

Two BV stacks on different tracks competing for presence. Pair them.

- Both sides: 1 band 1.5 kHz → 5 kHz, ratio 2:1, Threshold around -18 dB.

Whichever stack is louder at any instant wins that band; the other yields
slightly. The blend feels glued without manual rides.

---

<!-- pagebreak -->

# Cross-instance shared memory

Up to **16** SpectralMediator instances can coexist in the same DAW process.
Every instance has:

- A unique ID (PID + pointer hash)
- A user-editable display name (the *Instance name* field)
- A persisted pairing target (saved with the project)

The shared data per instance is:

| Field             | Used by      | Notes                              |
|-------------------|--------------|------------------------------------|
| 1024-bin FFT      | audio thread | Linear magnitude, per FFT hop      |
| 256-bin display   | UI thread    | Smoothed dB spectrum for the analyzer |
| 3 band energies   | both         | RMS per band                       |
| 3 gain reductions | both         | dB per band, <= 0                   |
| Bands definition  | both         | Frequencies + threshold + ratio + enabled flag |
| HP / LP           | both         | Global detection limits            |
| Attack / Release / Makeup | both | Output controls                    |
| Plugin latency    | both         | Samples (for compensation)         |

Edits made on either side of a pair propagate **bidirectionally**: moving
a band on the bottom analyzer of one instance updates the top analyzer of
the other.

## Latency

Each instance reports its own FFT analysis latency to the host (typically
1024 samples at 44/48 kHz, scaled at higher sample rates to keep a ~21 ms
analysis window). Modern DAWs compensate automatically.

The peer's reported latency is read from SHM and used by the SHM read
side to align the bins it consumes with what the peer was processing — so
the ducking stays in time even when the two tracks have different routing
delays inside the DAW.

---

<!-- pagebreak -->

# Demo mode and licensing

Without a license, every 60 seconds the audio is faded out for 5 seconds
with smooth 256-sample fades. The DEMO badge in the top-right pulses
during the silent window.

## Activating

1. Click the DEMO badge to open the activation dialog.
2. Paste your license key (Ctrl+V) or type it.
3. Click *Activate* (or press Enter).

The dialog displays *Verifying...* while the key is checked online with
the Gumroad license server. On success the dialog closes and the DEMO
badge disappears. On failure, the server's exact message is shown
(invalid key, refunded, disputed, etc.) — fix and retry.

The verified key is saved to:

- Linux/macOS: `~/.config/XeniAudio/SpectralMediator/license.key`
- Windows: `%APPDATA%\XeniAudio\SpectralMediator\license.key`

Subsequent plugin loads validate the saved key offline (no network) so
SpectralMediator works without an internet connection once activated.

## SpectralMediator vs McPlugins keys

SpectralMediator has its own product on Gumroad. A McPlugins key does
**not** unlock SpectralMediator (and vice-versa). The two products use
distinct hash keyspaces and store their license files in separate
directories.

---

<!-- pagebreak -->

# Known issues

## Reaper VST3 on Windows: live grip resize doesn't update the FX dialog

When you drag the resize grip in the bottom-right of the editor, the
plugin content resizes correctly but Reaper's outer FX dialog frame
**does not follow** — neither during the drag nor on release. The plugin
becomes embedded in a too-small or too-large host frame.

**Cause**: Reaper's VST3 host implementation does not honor
`plugFrame->resizeView()` callbacks coming from the plugin UI thread.
Every other tested host (Bitwig, FL Studio, Studio One, Live, Cubase on
Windows; all hosts on Linux and macOS) honors the API correctly.

**Workaround**: insert SpectralMediator using its **CLAP** format
(`Add FX → CLAP → SpectralMediator`) instead of VST3. CLAP works
correctly in Reaper Windows. Reaper supports CLAP natively since v6.71.

## macOS Gatekeeper: "unidentified developer" warning

Fixed in v1.3.1 — the macOS installer is now signed and notarized, so this
warning no longer appears. If you still see it, the download was damaged;
re-download it. See *Installation → macOS*.

Note that the **Windows** installer is not code-signed, so SmartScreen may
still warn on first run there.

---

<!-- pagebreak -->

# Troubleshooting

**Two instances don't see each other in the dropdown.**
Both must run inside the same DAW process. Some hosts isolate plugin
processes (sandbox / process-per-plugin mode); shared memory cannot
cross process boundaries. Disable plugin sandboxing in your DAW
preferences.

**Plugin scan hangs after a host crash.**
SpectralMediator detects stale shared-memory segments at startup and
wipes them automatically once every registered instance has gone silent
for 10 seconds. If the issue persists:

- Linux: `rm /dev/shm/sm_spectral_registry`
- Windows: reboot, or kill any leftover host process holding the segment.

**No spectrum on the REMOTE panel.**
Make sure your peer instance is actively processing audio (track not
muted, not on a frozen track). The peer's spectrum is only updated while
audio flows through it.

**Activation dialog says "Server: ..." with a network error.**
Your machine cannot reach the Gumroad API. Check connectivity and
firewall rules. The license check is a one-time online verification;
once the saved key is on disk, no network access is needed.

**Editor renders in the bottom-left quarter on a Retina Mac.**
You're running a build older than v1.3.1. Update to the latest release.

---

<!-- pagebreak -->

# License

XeniAudio SpectralMediator is licensed software. See the `license.txt` file
shipped with the installer for full terms.

For support, visit [https://xeni-audio.com](https://xeni-audio.com) or
contact `support@xeni-audio.com`.

Copyright © 2025–2026 Tony Cuny / XeniAudio. All rights reserved.
