Pour — DSP Manual
Carbonated Audio · v1.0.0 Stereo imager / width tool for modern mix engineers.
This document explains the signal processing inside Pour from the top down: what each control does mathematically, why it's there, and how to reason about it on a mix. It's written for engineers and producers who want to know what they're pushing air around with.
1. Overview
Pour is a Mid/Side (M/S) stereo imager built on the classical Blumlein Stereo Shuffling technique (Alan Blumlein, 1931), with the tonal architecture of the SSL Fusion Stereo Image module as its spiritual reference. Everything in the plug-in reduces to three core ideas:
- Encode the stereo signal into Mid (centre) and Side (difference) components.
- Reshape those two components independently — tonally with a shelf filter, gain-wise with a side trim, spatially with rotation and asymmetry.
- Decode back into Left/Right.
No mid/side plug-in does anything that isn't a variation of those three steps. Pour's job is to expose the right controls, in the right order, with sensible ranges.
2. Signal Flow
In ─► Input Trim ─► M/S Encode ─┬─► Mid ───────────────────────────────┐
│ │
└─► Side ─► Space Shelf ─► Width Gain ──┤
│
┌──── Rotation (M/S vector) ◄─────────────────┘
▼
M/S Decode ─► Solo Side tap ─► Asymmetry Pan ─► Output Trim ─► Out
Every stage runs per sample with parameter smoothing, so automation and knob tweaks are click-free. Parameter smoothing is linear, 20 ms for most controls and 50 ms for Shuffle (the filter crossover) to avoid zipper artefacts when the user sweeps it.
3. Mid/Side Encoding and Decoding
Pour uses the standard energy-preserving M/S formulation:
M = 0.5 × (L + R) // Mid (mono sum, phantom centre)
S = 0.5 × (L − R) // Side (difference, stereo content only)
On decode:
L = M + S
R = M − S
Because the encoder uses 0.5 scaling on both components, the round trip with no processing in between is bit-accurate and unity-gain. Anything that sounds different after Pour with all knobs at their defaults (0 dB, 0°) is a bug, not a feature.
Why M/S? Because the stereo field of a typical master is asymmetric by content: kick, snare, bass, and lead vocal sit in the Mid; reverb tails, guitar doubles, cymbal decays, and stereo synths sit in the Side. Treating them independently is the only way to widen a mix without washing out the centre, or to tighten the low end without collapsing the whole stereo image.
4. Input Trim
Range: −12 dB to +12 dB, default 0 dB. Linear parameter smoothing, 20 ms.
Pre-M/S, applied equally to L and R. Mathematically:
L' = L × 10^(InputTrim_dB / 20)
R' = R × 10^(InputTrim_dB / 20)
Use this to match gain staging when Pour is pushed hard by Space or Width. Because it's pre-encode, Input Trim does not affect the M/S ratio — it's a pure level matcher.
5. Space — Low-Shelf on the Side Signal
Range: −12 dB to +12 dB, default 0 dB. Linear smoothing, 20 ms.
Space is a low-shelf filter applied only to the Side signal. Its corner is set by the Shuffle control (Section 6). This is the heart of Blumlein Stereo Shuffling.
Implementation: a classic RBJ biquad low-shelf, Q = 0.707 (Butterworth-flat — broad and gentle, not a resonant shelf).
S' = LowShelf(S, fc = Shuffle_Hz, Q = 0.707, gain = Space_dB)
Musical meaning: - Positive Space (e.g. +3 dB) — boosts low frequencies in the Side signal only, creating a sense of low-end width and "air" below the Shuffle frequency. Blumlein showed in 1931 that a moderate LF boost on the difference channel reproduces the low-frequency interaural cues that microphone spacing would have captured but that stereo recording loses. It's the reason your master can feel bigger without actually getting louder. - Negative Space (e.g. −3 dB) — cuts low frequencies in the Side signal, collapsing the low end toward mono. This is the "tighten the bass" move on a mix bus or a kick/bass submix. The kick stays centred and punchy; sub rumble stops fighting the stereo field.
At 0 dB, the shelf is bypassed internally (gain = 1.0 means the biquad passes signal unchanged).
6. Shuffle — The Shelf Crossover
Range: 40 Hz to 400 Hz, default 100 Hz. Logarithmic skew so 160 Hz sits roughly at the centre of the knob. Linear smoothing, 50 ms (slow on purpose — sweeping a filter corner is perceptible and needs longer smoothing to avoid warble).
Shuffle sets the corner frequency of the Space shelf. It does nothing on its own — only when Space is non-zero does Shuffle change the sound.
Practical landmarks: - 40–80 Hz — sub-only. Lets kick/sub be widened or tightened without touching the body of a mix. - 100–160 Hz — kick/bass fundamentals. The classic Blumlein sweet spot. - 200–400 Hz — extends into low mids. Useful when a mix has wide guitars or keys with body you want to reshape.
7. Width — Side Gain
Range: −6 dB to +6 dB, default 0 dB. Linear smoothing, 20 ms.
Width is a broadband gain on the Side signal, applied after the Space shelf.
S'' = S' × 10^(Width_dB / 20)
- +6 dB doubles the Side amplitude — maximum widening. Things that were barely off-centre move hard to the edges.
- −6 dB halves the Side amplitude — gentle narrowing toward mono.
- 0 dB is neutral.
Why −6/+6 and not wider? Because above +6 dB on the Side, comb filtering and mono compatibility problems get ugly fast. Below −6 dB you're basically summing to mono and no longer imaging. The range is narrow on purpose; engineers who want extreme width should stack Pour instances or use rotation.
8. Rotation — M/S Vector Tilt
Range: −45° to +45°, default 0°. Linear smoothing, 20 ms.
Rotation treats (M, S) as a 2-D vector and rotates it by an angle θ:
M'' = M × cos(θ) − S' × sin(θ)
S''' = M × sin(θ) + S' × cos(θ)
Geometrically, this tilts the stereo image without changing its total energy. A small positive rotation leans the whole mix slightly to one side of the M/S plane; the perceptual effect is that off-centre elements shift and the overall image feels like it's been rotated clockwise or counter-clockwise around the listener.
At θ = 0, rotation is a no-op (the matrix is identity). At θ = ±45°, Mid and Side swap roles — a strong creative effect, rarely musical on a full mix but useful on stems.
When to reach for it: asymmetric mixes that pull too hard to one side, stereo guitar doubles where the spread sits off-axis, or as a subtle "walking the image" tool on a chorus.
9. Asymmetry — Constant-Power Pan on Output
Range: −90° to +90°, default 0°. Linear smoothing, 20 ms.
Applied after M/S decode, Asymmetry is a constant-power pan law on the final L/R output:
t = (Asymmetry / 90° × 0.5 + 0.5) × π/2 // 0..π/2
panL = cos(t) × √2
panR = sin(t) × √2
L_out = L' × panL
R_out = R' × panR
The √2 scaling means that at t = π/4 (centre), both panL and panR equal 1.0, so the pan law is unity at the centre and follows a −3 dB constant-power curve as it moves off-centre. This is the same curve used by most modern DAW pan knobs and avoids the centre dip or centre bump you get from linear or equal-power-without-compensation pans.
Asymmetry vs Rotation: both move the image, but differently. - Rotation reshapes the M/S balance — it changes how much Mid and Side exist relative to each other, tilting the whole stereo perspective. - Asymmetry is a pure output pan — the phantom centre shifts left or right, but the M/S balance is untouched.
Use Asymmetry to fix a mix that lands off-centre. Use Rotation to reshape what the stereo field is doing internally.
10. Solo Side
Boolean toggle. When active, the decoded output is replaced by the Side signal on both channels:
L_out = S'''
R_out = S'''
This is a diagnostic listening mode — you hear only the difference information. It's the fastest way to audition what Space, Shuffle, and Width are actually doing, and to find phase issues or mis-panned elements on a stereo bus. Anything that appears in Solo Side is, by definition, what would collapse to silence if the mix were summed to mono.
Not intended as a processing mode. Toggle it off before rendering.
11. Output Trim
Range: −12 dB to +12 dB, default 0 dB. Linear smoothing, 20 ms.
Post-everything, applied equally to L and R. Use to match bypass level after pushing Space or Width.
12. IN (Bypass)
Boolean, default on. When off, Pour passes the input through untouched at unity gain. The meters and scope continue to display so the user can still see the signal.
Bypass is implemented inside the audio thread, not by the host — so automation, crossfades, and sample-accurate timing are preserved.
13. Presets (shipping set)
Pour ships with a minimal hand-tuned preset bank — each one is a starting point, not a destination.
| Name | Category | Shuffle (Hz) | Space (dB) | Width (dB) |
|---|---|---|---|---|
| Default Preset | Default | 100 | 0.0 | 0.0 |
| Tight Low End | Bass | 60 | −4.0 | −1.5 |
| Wide Sub | Bass | 80 | +6.0 | +2.0 |
| Intimate Vocal | Vocal | 180 | −1.5 | −1.5 |
| Open Vocal | Vocal | 220 | +2.5 | +3.0 |
| Punchy Drum Bus | Drums | 100 | +1.5 | +2.0 |
| Wide Room | Drums | 280 | +4.0 | +4.0 |
| Doubled Guitars | Guitar | 160 | +1.0 | +3.5 |
| Stereo Spread Guitar | Guitar | 340 | +3.0 | +4.5 |
Input Trim, Output Trim, Rotation, and Asymmetry are left at 0 by every factory preset. Presets touch only the three "sound" controls so the user can hear the idea without a hidden gain change.
14. Metering and Vectorscope
Pour's goniometer is a half-polar vectorscope, plotting each sample as:
x = 0.5 × (L − R) // Side — horizontal axis
y = 0.5 × (L + R) // Mid — vertical axis (upper half only, magnitude)
The scope shows the post-processing signal, so the user sees what Pour is producing, not what it received. A persistence-of-vision fade (≈ 10% decay per frame at 45 fps) leaves a short trail so transient content remains readable.
The cyan triangle overlay on the scope is a live read-out of the Width / Rotation / Asymmetry state — a visual summary of the stereo field that updates as parameters move.
The left and right LED meters show peak input and peak output levels per channel, updated every audio block (≈ 30 Hz on the UI).
15. Parameter Smoothing Summary
All continuous parameters are linearly smoothed. Smoothing times:
| Parameter | Smoothing time |
|---|---|
| Input Trim | 20 ms |
| Output Trim | 20 ms |
| Width | 20 ms |
| Space | 20 ms |
| Rotation | 20 ms |
| Asymmetry | 20 ms |
| Shuffle | 50 ms |
Shuffle is slower because it moves a filter corner, which is perceptually more sensitive to discontinuity than a gain change. The longer window makes automation of the crossover sound like a filter sweep rather than a series of stepped tone shifts.
16. Channel Configuration
- Main input / output: stereo (2-channel) or mono (1-channel).
- Mono input: the plug-in passes the signal through unchanged (imaging a single channel has no meaning).
- Sample rates: all sample rates supported. Filter coefficients recompute when the host changes sample rate.
- Block sizes: arbitrary. Internal processing is sample-accurate, not block-rate.
17. Latency and CPU
Pour is zero-latency. Every filter used is IIR (not linear-phase FIR), and there is no lookahead buffer anywhere in the chain.
CPU is dominated by the Input Trim / Output Trim / Width smoothers and the single biquad on the Side signal. Expect roughly the cost of a two-band parametric EQ. Pour is safe to stack on many tracks in a large session.
18. Credits and References
- Alan Blumlein, Improvements in and relating to Sound-transmission, Sound-recording and Sound-reproducing systems (British Patent 394,325, 1931) — the original M/S stereo shuffling paper.
- SSL Fusion Stereo Image — the modern reference for the Space/Shuffle/Width control philosophy.
- Robert Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients — source of the low-shelf biquad Pour uses for Space.
Questions, bug reports, or sound-design notes: mixedbysoda@gmail.com.