// MANUAL · VERSION 1.3
Janus

Janus

A linear-phase Linkwitz-Riley crossover
for multi-way active loudspeakers.

VST3/WIN · LINUX x64 · ARM64/STEREO/1 – 96 DB/OCT/LR · ERF
// CONTENTS
  1. Overview
  2. Quick Start
  3. Controls
  4. Latency Modes & Limits
  5. Building a Crossover
  6. LR or ERF?
  7. Readout, Graph & Meter
  8. How It Works
  9. Specifications
  10. FAQ & Troubleshooting
§01

Overview

Janus is a stereo VST3 crossover filter. Each instance has a high-pass (low cut) and a low-pass (high cut) section, which you can enable separately. HPF only, LPF only or both together give you the three building blocks of any multi-way crossover: the low band, the high band and the band-pass between them.

Every filter Janus produces is linear phase. Instead of the phase rotation of an analog or IIR crossover, all frequencies come out delayed by exactly the same amount. The slopes follow the Linkwitz-Riley magnitude law: −6 dB at the crossover frequency, so a high-pass and a low-pass at the same frequency and slope add up to a flat response, in both magnitude and phase.

From 48 dB/oct each section can also use an ERF (Gaussian) transition instead of the Linkwitz-Riley one: the same attenuation half an octave out, less pre-ringing, and a much deeper stopband. A live graph shows the response as you set it.

Slopes run continuously from 1 to 96 dB/oct in 0.1 dB steps. A linear-phase filter can't be free, though: it rings before the transient as well as after it, and it needs latency. Janus makes that trade-off explicit. You pick a latency budget, and Janus tells you exactly how much pre-ringing your settings produce. It won't let you set a filter that would ring for longer than the budget allows.

Janus interface: Latency Mode selector, HPF and LPF panels each with Enable, ERF, Frequency and Slope, stereo output meter, response graph, latency and pre-ring readout
§02

Quick Start

§03

Controls

Latency Mode
Low (50 ms) · Normal (250 ms) · Maximum (700 ms) · default Normal

Sets the time budget for the filter's impulse response, and with it the latency Janus reports to the host. A longer budget allows lower crossover frequencies and steeper slopes; a shorter one keeps latency down. See Latency Modes & Limits.

Latency changes only when you change this mode. Moving frequency, slope or the enable switches never changes the reported latency, so your host's delay compensation never has to recalculate mid-playback.

Enable
HPF and LPF, independently · default off

Switches a section in or out. HPF only makes a high-pass, for a tweeter or the top band. LPF only makes a low-pass, for a woofer or the bottom band. Both makes a band-pass, for a midrange.

With both sections off, Janus is a pure delay matching its reported latency. That makes it a clean, time-aligned bypass, and a handy delay-matched path for a full-range channel that sits alongside crossed-over ones.

Frequency
10 Hz – 20 kHz · log scale · defaults HPF 80 Hz, LPF 4 kHz

The crossover frequency: the point where the filter is 6 dB down. You can drag the knob, use the scroll wheel, or type a value into the box below it, in Hz or kHz (2.5k works).

How low you can go depends on the slope and the latency mode. If a setting would need more pre-ring than the mode allows, Janus stops the knob at the lowest valid frequency. Hovering over the knob then shows why, for example "Limited to 155.6 Hz at 24.0 dB/oct in Low latency mode. Switch to Normal mode for full range."

Slope
1 – 96 dB/oct · 0.1 dB steps · default 24 dB/oct

How steeply the filter rolls off beyond the crossover frequency. The classic Linkwitz-Riley orders fall at 12 (LR2), 24 (LR4), 48 (LR8) and 96 dB/oct (LR16), but any value in between is valid and behaves the same way: −6 dB at the crossover frequency, summing flat with its complement.

Steeper slopes reduce the overlap between drivers. That helps with drivers that have break-up modes, limited excursion or poor off-axis behaviour near the crossover. The cost is longer pre-ringing, which grows in proportion to slope ÷ frequency.

ERF
HPF and LPF, independently · available from 48 dB/oct · default off

Replaces the section's Linkwitz-Riley transition with a Gaussian (erf) one. The slope knob keeps its meaning: half an octave into the stopband, the ERF filter has exactly the attenuation LR has at the same slope. Beyond that it falls away much faster, and it rings less before transients. See LR or ERF? for the numbers.

Below 48 dB/oct the switch is greyed out and the section stays Linkwitz-Riley, because there the Gaussian would ring as long as LR or longer. The switch keeps its setting while greyed, so raising the slope back to 48 dB/oct brings ERF back.

§04

Latency Modes & Limits

A linear-phase filter is symmetric in time: whatever ringing it has after a transient, it has the same amount before it. The ringing lasts longer at lower frequencies and with steeper slopes. Each latency mode gives the filter a fixed amount of time on each side of its peak:

ModeTime budget each sideReported latencyTypical use
Low45 ms≈ 50 msMid/high crossovers, video playback
Normal245 ms≈ 250 msMost music playback crossovers
Maximum695 ms≈ 700 msSubwoofer and deep-bass crossovers, steep slopes

The exact reported latency is the time budget plus a small amount that depends on your host's buffer size. The readout at the bottom of the window shows the precise figure.

Lowest crossover frequency per mode

Janus will not let a filter need more pre-ring than its mode allows. These are the lowest frequencies you can set:

SlopeLowNormalMaximum
12 dB/oct78 Hz14 Hz10 Hz
24 dB/oct156 Hz29 Hz10 Hz
48 dB/oct311 Hz57 Hz20 Hz
96 dB/oct622 Hz114 Hz40 Hz

The limit is conservative. Even at the extreme corner of each mode, at 96 dB/oct, the measured −60 dB pre-ring uses only about 17% of the budget. The limit applies to each enabled section separately; disabled sections are ignored.

Switching to a shorter mode moves your frequencies up. If a section is set below the new mode's limit, Janus raises its frequency to the lowest valid value. The same happens when a saved project is reopened. Switching back does not restore the old value, so check your frequencies after changing mode.

§05

Building a Crossover

Use one Janus instance per band, each feeding its own amplifier channel. Three rules make the bands add up to a flat whole:

Two-way example

Woofer   LPF  2.2 kHz  24 dB/oct      (HPF off)
Tweeter  HPF  2.2 kHz  24 dB/oct      (LPF off)
Mode     Normal on both

Three-way example

Woofer   LPF  300 Hz   24 dB/oct                       (HPF off)
Mid      HPF  300 Hz   24 dB/oct  +  LPF 3 kHz  48 dB/oct
Tweeter  HPF  3 kHz    48 dB/oct                       (LPF off)
Mode     Normal on all three

With crossover points about a decade apart, as here, the three filters sum flat to within a thousandth of a dB. The one thing to watch is spacing. The woofer's low-pass and the tweeter's high-pass still overlap slightly in the middle of the mid band, and that overlap adds a small rise between the two crossover points. It is about +0.9 dB with the points one octave apart at 12 dB/oct, and +0.3 dB at 24 dB/oct or two octaves apart. Steeper slopes or wider spacing make it vanish.

Hosting the bands

Janus filters channels 1 and 2 of whatever bus it is given. On a wider bus, such as JRiver's 8- or 12-channel output, all other channels pass through untouched. To give each band its own filter on a multichannel rig, run one Janus per channel pair inside MetaHost, one column per band. In a DAW, put each instance on its own stereo track or send.

Janus is purely a crossover filter. Driver level matching, time alignment between drivers and correction EQ belong elsewhere in the chain, for example in Chronos with a measured correction filter.

§06

LR or ERF?

A Linkwitz-Riley transition is a single curve: the slope you choose sets both how sharp the knee is at the crossover frequency and how fast the filter falls far from it. That is what makes steep LR filters ring: a sharp knee means a long, slowly decaying ring before and after every transient.

The ERF transition separates the two. Its knee is a little softer, and its stopband does not settle at a fixed number of dB per octave: it keeps getting steeper. Janus matches the two shapes where it matters for driver protection, half an octave into the stopband, so at any slope from 48 dB/oct you get:

48 dB/oct LR48 dB/oct ERF96 dB/oct LR96 dB/oct ERF
¼ octave out−14.0 dB−13.3 dB−24.6 dB−20.8 dB
½ octave out−24.6 dB−24.6 dB−48.2 dB−48.2 dB
1 octave out−48 dB−61 dB−96 dB−146 dB
Pre-ring at 300 Hz, −40 / −60 dB6.0 / 8.4 ms4.9 / 7.3 ms9.5 / 16.2 ms7.9 / 11.7 ms
Pre-ring at 2.5 kHz, −40 / −60 dB0.7 / 1.0 ms0.6 / 0.9 ms1.1 / 1.9 ms0.9 / 1.4 ms

The pre-ring figures are for a single section. They scale with 1/frequency, so the percentages hold at any crossover point. Like LR, an ERF high-pass and an ERF low-pass at the same frequency and slope add up to exactly one, so ERF crossovers sum flat and stay linear phase.

When to use it. ERF pays off most at low crossover points with steep slopes, where LR pre-ringing gets long enough to matter, such as a woofer/midrange crossover at a few hundred Hz. At a midrange/tweeter crossover in the kHz range both shapes ring for only a millisecond or two, so the choice makes little audible difference there; the slightly softer ERF knee is a fair trade for its much deeper stopband.

Why not below 48 dB/oct? At gentler slopes the Gaussian's wide transition rings as long as LR or longer (at 24 dB/oct about 20% longer at −60 dB), so Janus keeps those slopes Linkwitz-Riley.

§07

Readout, Graph & Meter

Latency and pre-ring

The line along the bottom shows Latency, the delay reported to your host in milliseconds. It also shows Pre-ring at two thresholds: the time from where the filter's impulse response first rises above −40 dB, and −60 dB, relative to its peak, until the peak itself. These figures are measured on the filter actually being used, not estimated from a formula, so they update every time you change a setting.

As a rough guide, the −40 dB figure tells you what is most likely to be audible as a pre-echo on sharp transients. The −60 dB figure shows how far the filter really extends.

On a band-pass instance the figures describe the combined filter, so they are set by whichever section rings longer, which is nearly always the lower-frequency one. Ringing time scales with 1/frequency, so a 400 Hz high-pass rings several times longer than a 2.6 kHz low-pass at the same slope. Switching ERF on the low-pass of such a band then leaves the readout unchanged even though the low-pass itself now rings less, while switching ERF on the high-pass shortens it. The graph and the audio change either way.

Response graph

The graph shows this instance's magnitude response from 10 Hz to 20 kHz and +6 to −90 dB, and redraws as you change any setting, including from host automation. A white dot marks each crossover frequency on the curve. Each enabled section also shows its complement as a faint dashed line: the response the neighbouring band must have at that crossover point for the two to sum flat. When the next instance's solid curve lies on that dashed line, the crossover point is set up correctly.

The graph is drawn from the same function the filter is designed from, and is checked against the delivered impulse response to within 0.00001 dB, so it shows what you hear, not an approximation.

Output meter

A stereo peak meter for the filtered output of channels 1 and 2, from −90 to 0 dBFS. The upper half (0 to −24 dB) is linear in dB for detail; the lower half is compressed. Green, yellow and red zones change at −12 and −3 dBFS.

§08

How It Works

Janus designs each filter directly in the frequency domain from the Linkwitz-Riley magnitude law, with s the slope in dB/oct:

LPF:  |H(f)| = 1 / (1 + (f / fc)^(s/6))
HPF:  |H(f)| = 1 / (1 + (fc / f)^(s/6))

With ERF on, a section uses a Gaussian transition in log-frequency instead, with σ solved so the attenuation half an octave out matches LR at slope s:

LPF:  |H(f)| = ½ · erfc( ln(f / fc) / (σ·√2) )
HPF:  |H(f)| = ½ · erfc( −ln(f / fc) / (σ·√2) )

At f = fc both shapes are exactly 0.5 (−6 dB), and the LPF and HPF at the same fc, s and shape always add up to exactly 1. That identity is why the bands sum flat. With both sections enabled the two targets are multiplied, giving one combined band-pass response. Each instance therefore runs one filter per channel, never two in series.

§09

Specifications

Plugin format
VST3
OS support
Windows 10+ (64-bit); Linux x64 with glibc 2.28+ (Ubuntu 20.04+, Debian 10+, RHEL 8+); Linux ARM64 with glibc 2.28+ (Raspberry Pi OS 64-bit on Pi 4/5, Ubuntu 20.04+ arm64)
Channels
Stereo; on wider buses channels 1–2 are filtered and the rest pass through (input and output widths must match)
Sample rates
44.1 – 192 kHz; frequency response and latency identical across rates
Filter type
Linear-phase FIR, Linkwitz-Riley magnitude (−6 dB at fc); optional ERF (Gaussian) transition per section from 48 dB/oct
Sections
HPF + LPF per instance; HPF only, LPF only, band-pass, or pure delay
Frequency
10 Hz – 20 kHz, log, limited by slope and latency mode
Slope
1 – 96 dB/oct, 0.1 dB steps
Latency
≈ 50 / 250 / 700 ms (Low / Normal / Maximum), reported to host; independent of filter settings
Precision
64-bit double-precision design and convolution; 32-bit path for 32-bit hosts
Parameter changes
30 ms crossfade, no clicks
Parameters
HPF Enable / Frequency / Slope / ERF, LPF Enable / Frequency / Slope / ERF, Latency Mode — all automatable
Display
Live response graph, 10 Hz – 20 kHz, +6 to −90 dB
Bundle size
~6 MB
License
Donationware — pay what you want, including €0
§10

FAQ & Troubleshooting

The frequency knob won't go any lower.

That setting would need more pre-ring than the current latency mode allows. Hover over the knob to see the limit, then either switch to a longer mode, reduce the slope, or accept the higher frequency. The table in §04 shows the limits.

Why so much latency?

A linear-phase filter's delay has to be at least as long as its pre-ring, and low, steep crossovers ring for a long time. For music playback the host compensates and you never notice it. For video, use Low mode where your crossover points allow it, or set your player's audio/video offset to match.

Will I hear the pre-ringing?

Usually not at sensible settings: the pre-ring sits in a narrow band around the crossover frequency, at low level, and is largely masked. It becomes more audible at low frequencies with very steep slopes. Watch the −40 dB figure. If it is long and you hear a soft "swish" before kick drums or piano attacks, try a gentler slope.

Is there a bypass?

Turn both Enable switches off. Janus then passes audio through with exactly its reported delay, so the timing of the rest of your chain stays put. Your host's own bypass works too, but not every host keeps the delay matched when bypassing.

Can I use a non-standard slope like 30 dB/oct?

Yes. Every slope follows the same law: −6 dB at the crossover frequency, and a flat sum with a matching opposite filter. The classic LR2/LR4/LR8/LR16 values are just familiar points along a continuous range.

Should I switch ERF on?

If you use 48 dB/oct or steeper, it is worth trying, especially at low crossover points where LR pre-ringing gets long. Switch it on for both sides of a crossover point. At gentler slopes it is not available, because it would not help. See §06.

Ticking ERF doesn't change the pre-ring figures.

On a band-pass instance the readout shows the longer-ringing section, nearly always the lower-frequency one. ERF on the higher-frequency section still works, as the graph shows, but its shorter ring is hidden inside the other one. See §07. Also check the slope: below 48 dB/oct the switch is greyed out and has no effect.

My bands don't sum flat.

Check, in order: the same latency mode on every instance; the same frequency, slope and shape (LR or ERF) on both sides of each crossover point; and that no frequency was silently raised by a mode change (see the callout in §04). The dashed complement curves in the graph make the first two easy to check. If those are right, the remaining differences are in the drivers and the room, not in Janus.

I put Janus on a 12-channel JRiver bus and only the front pair is filtered.

That's by design: Janus filters channels 1 and 2 and passes the rest through. For per-band filtering on a multichannel output, use MetaHost with one Janus per channel pair.

Something went wrong. What should I send with a bug report?

If Janus hits an internal error it outputs silence instead of crashing the host, and writes a log to %LOCALAPPDATA%\PatakiAudio\Janus\trace.log. Send that file, your host, sample rate, buffer size and settings to info@patakiaudio.com.