Sweepers & Station IDs (sweepers)
Sweepers are the voice of the station: a voice tag ("LOKLOK FM…") mixed over a
real music bed with the bed ducked under the voice, the voice landing on a
musical beat. Station IDs (ID_*) are the shorter "who we are" stickers. All
live in media/sweepers, are Break-tagged, and are R128-mastered to
−14 LUFS / −1.5 dBTP so they sit at exactly the same loudness as the songs
around them.
| Generator | File prefix | What it is | Typical length |
|---|---|---|---|
imaging.renderSweeper | SWP_INTRO_* | Voice over a real music bed, sidechain-ducked | ~8.5–9 s |
imaging.renderSweeper (song-specific) | SWP_DROP_* | Voice sliced from an actual song, beat-aligned | ~8.5–9 s |
imaging.renderVoiceDrop | SWP_VOX_* | Voice over a pink-noise whoosh | ~3.5–4 s |
imaging.renderStationId | ID_* | Station IDs | ~4–5 s |
The sweeper recipe (renderSweeper)
Voice chain
deesser=i=0.12 → highpass 100 → presence EQ (4k +3dB, 300 −2dB)
→ acompressor (−24dB, 3.5:1) → alimiter 0.92 → adelay → asplit [vc][vcs]
The de-esser removes sibilance energy, the highpass kills room rumble, the presence EQ adds air at 4 kHz and de-muds at 300 Hz, and the compressor rides the level so the voice sits consistently over the bed.
Bed chain
lowpass 15k → stereotools (mlev=1, slev=0.6) → soft fades
The bed is low-passed to leave headroom for the voice and slightly narrowed
(slev=0.6) so it does not fight the voice for the centre image.
Mix (the critical parts)
[vcs] apad=pad_dur=total ← CRITICAL
[bed0][vcsP] sidechaincompress=threshold=0.1:ratio=6:attack=8:release=350
→ amix=inputs=2:normalize=0:dropout_transition=0 → alimiter
→ two-pass normalizeR128 (−14 LUFS / −1.5 dBTP)
The apad trap: sidechaincompress truncates its output to the shorter of
its two inputs. The voice is short and the bed is long, so without
[vcs]apad=pad_dur=total the bed tail was cut to ~3 s. Padding the (voice-side)
duck control to the full target length keeps the bed swelling back after the
voice ends.
The ducking equation
The sidechain compressor drops the bed gain whenever the voice control signal is above threshold. In its simplest (dB-domain) form the gain reduction is:
with attack = 8 ms (the bed ducks almost instantly under the voice) and
release = 350 ms (the bed swells back smoothly after). The voice itself never
passes through the sidechain — it stays full level; only the bed is pulled down.
Beat-aligned placement
Song-specific sweepers slice an actual track at a musically meaningful offset.
detectBpmAndOnsets analyses the file, then beatAlignedStart picks the
closest onset to the wanted time:
- Intro lead-in: start the bed ~1.5 s into the song so the voice lands right after the intro hits.
- Energy drop: start ~45 % of the way into the track (
min(duration*0.45, 120)) — the chorus/build that carries energy.
Onset detection (tempogram)
The engine computes a BPM and an onset track from a 3-second spectral flux analysis:
An autocorrelation over the flux (lag for candidate BPM
lag = hopsPerSecond * 60 / bpm) selects the strongest candidate, and a
harmonic check prefers 2·bpm when it correlates ≥ 5 % better — avoiding the
half-time lock that makes 128 BPM read as 64: