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) |
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
- Run
XeniAudio-SpectralMediator-V1.3.1-Installer.exe. - Follow the prompts. The installer places:
- VST3 in
C:\Program Files\Common Files\VST3\ - CLAP in
C:\Program Files\Common Files\CLAP\SpectralMediator\
- VST3 in
- Restart your DAW and rescan plugins.
Linux
tar xzf SpectralMediator-1.3.1-Linux.tar.gz
cd SpectralMediator-1.3.1-Linux
./install.shVST3 lands in ~/.vst3/, CLAP in ~/.clap/. Pass alternative paths as
positional arguments to install.sh.
macOS
- Mount
SpectralMediator-1.3.1-macOS.dmg. - Double-click the
.pkginside. - The default install scope is the current user
(
~/Library/Audio/Plug-Ins/). Click Customize → Install for all users to install system-wide. - 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.
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:
- Each instance writes its own magnitude bins (1024 linear bins) and per-band energies (3 bands) into its slot in shared memory.
- Each instance reads its peer's bins.
- 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.
Quick start (kick + bass)
- Insert SpectralMediator on the kick track. Rename the instance from
the title field — type
Kick. - Insert SpectralMediator on the bass track. Rename it
Bass. - 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).
- 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.
- 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.
- Play the song. The bass should now duck under the kick wherever the kick has spectral content, without affecting any other frequency range.
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.
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.
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.
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.
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
- Click the DEMO badge to open the activation dialog.
- Paste your license key (Ctrl+V) or type it.
- 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.
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.
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.
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 or
contact support@xeni-audio.com.
Copyright © 2025–2026 Tony Cuny / XeniAudio. All rights reserved.
Something unclear, or missing from this manual? Write to support@xeni-audio.com.