Stoatworks Labs

Proximate

One knob against the proximity effect

Betav0.1.0Plugin & ModuleC++ / JUCE
Proximate — One knob against the proximity effect
The plugin in a host on synthesised speech run through a model of a cardioid microphone at 4 cm, at 65 %: the balance reads +5.2 dB against a ceiling of −1 dB, and the shelf is taking 10.5 dB off.

What it does

Every directional microphone picks up more bass the closer the source is: a handheld dynamic at a few centimetres reads something like +10 dB at 100 Hz against the same voice at arm's length. On a presenter who wanders towards and away from the mic, or a singer who works it, that is a tone that keeps changing — boomy when they are close, thin when they step back — and a static EQ can only be right at one distance. The usual answer is a dynamic EQ with a low shelf keyed off the low band, which has a threshold, a ratio, an attack and a release to set, and reacts to a talker who simply gets louder.

Proximate reacts to balance instead: the energy under 250 Hz against the energy over it, measured over 200 ms. Speech at a steady distance keeps that within about 3 dB of itself from phrase to phrase; a talker who leans in tips it towards the low end by 4 to 7 dB on top. The plugin holds the balance at or under a ceiling and takes whatever is over it off with a first-order low shelf whose zero is fixed at 120 Hz and whose corner climbs as the cut deepens — the inverse of a handheld dynamic's published proximity curve, to within a dB. The one knob sets the ceiling; everything else is tuning, fixed and written down in the guide, because a version with a threshold, a ratio, an attack and a release would be a dynamic EQ, and there are plenty of those.

It never boosts: the shelf only cuts, and at 0 % the plugin is transparent to the bit. It adds no latency — no look-ahead, no buffering beyond the host's block. And when nobody is talking the cut freezes where it is, because a pause is not a change of distance and the balance of the room's noise floor is not information.

  • One control: Amount, from off at 0 % to a deliberately thin balance at 100 %, and a balance meter with the ceiling drawn on it so the knob can be set by looking
  • Cut only — the output is the input with less low end, or the input untouched; 0 % is bit-for-bit transparent
  • Zero latency: no look-ahead, no internal buffering, reported latency 0 — safe to monitor through
  • A balance detector, not a level detector: the same signal 20 dB quieter gets the same cut
  • A first-order shelf shaped like the proximity rise it undoes, flattening at 120 Hz and reaching further up the spectrum the deeper it goes
  • Holds through pauses: under −50 dBFS in the high band the cut stays where it is rather than chasing the noise floor
  • Stereo-linked: one detector on the mean, one shelf on both channels
  • VST3 and AU for macOS, VST3 for Windows and Linux, plus a standalone app for trying it on a real microphone

Where it stands

Released at v0.1.0, whose macOS builds are signed and notarised by Apple. Beta: the compensator is pinned by 85 unit checks over a standard-library-only DSP (it never boosts at any frequency, amount 0 is bit-for-bit transparent, an impulse comes out on its own sample, a step in the low band is followed in and out within a second, the same signal 20 dB quieter gets the same cut, both channels of a stereo pair get the identical filter, a NaN from the host is dropped rather than remembered); on synthesised speech run through a model of a cardioid at 4 cm it takes about 40 % of the modelled boost off at every band from 63 to 630 Hz at 65 %, and about two thirds at 80 %; the built VST3 and AU, loaded the way a host loads them, produce output identical sample for sample to the bare DSP; pluginval passes at strictness 10 on both and auval passes, with a reported latency of 0. It has not yet been used on a real microphone in a real room, and it has met few hosts. The standalone opens no audio input on its first run and has been launched, not used on a mic.

Watch it running

Proximate video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead