TT-SPECTRAL — User Manual

JSFX plug-in for REAPER // Version 1.2.0 // TimTechlor

TT-SPECTRAL works like a surgeon, not a compressor: every ~21 ms it compares each spectral bin against a robust local baseline of its neighbours and cuts only the bins that stick out — dynamically, exactly while the resonance rings. Broadband signal passes untouched (measured 0.000 dB loss at full depth); a harsh 3 kHz ringing gets carved without dulling the rest.

01The concept

A static EQ notch removes a frequency always — also when nothing is ringing there. A multiband compressor squashes whole bands. TT-SPECTRAL asks a sharper question on every analysis hop: is this bin louder than its own neighbourhood justifies? Only then, and only there, does it cut.

cut[bin] = min( MAX CUT, DEPTH % × max(0, level[bin] − baseline[bin] + focus[bin] − threshold) )

The engine resolves the spectrum into 2049 populated bins (≈ 11.7 Hz apart at 48 kHz — honest numbers in section 06), so a ringing resonance is carved while the programme material between the bins keeps its level. Measured: pure pink noise passes at full suppression depth with 0.000 dB level loss, and the bands ±60 Hz around a suppressed tone move by 0.00 dB.

TT-SPECTRAL front panel — spectral display with FOCUS strip, SUPPRESSION and DETECTOR knob panels, STEREO/OUTPUT/AUDITION panels
FRONTThe TT-SPECTRAL front. Spectral display with mask edges and the FOCUS strip, SUPPRESSION and DETECTOR panels below, STEREO, OUTPUT and AUDITION in the bottom row, latency readouts and the preset bar in the header.

02Quick start

  1. Insert TT-SPECTRAL on a harsh track (cymbals, a sibilant vocal, a resonant snare, an aggressive bus).
  2. Optional shortcut: pick a starting point in the preset bar in the header (for example Vocal Harshness or Surgical Ring) — see Presets.
  3. Set DEPTH to ~80 and SHARPNESS to ~70. The display shows the live spectrum (grey), the robust baseline (cyan) and the suppression teeth — resonances appear as spikes through the baseline.
  4. Adjust SENSITIVITY: higher = lower threshold = more bins count as resonant.
  5. Press DELTA to hear exactly what is being removed. If you hear music instead of just the ringing, back off SENSITIVITY or raise SHARPNESS.
  6. Limit the working range with LOW CUT / HIGH CUT — e.g. only hunt 200 Hz–8 kHz — and lift a stubborn spot with the FOCUS bell.

03In practice

Three field-tested recipes. The pattern never changes: let the display show where the energy sits, tune the detector until only the resonant bins grow teeth, then prove it with DELTA — the golden rule is that the delta must sound like isolated ringing or noise-like fizz, never like music. If you recognise the song in the delta, the detector is eating programme material.

Finding and taming a harsh resonance

Goal. Kill the ring on a harsh source — a whistling synth, a snarling bass, a spitty vocal — without dulling the tone around it.

  1. Loop the worst phrase and watch the spectrum. Resonances are the stationary narrow spikes that keep standing while the rest of the spectrum moves (on a spectrogram they would be persistent horizontal lines). In the shot below, the 3 kHz ring pokes straight through the cyan baseline and carries an amber suppression tooth.
  2. Start at DEPTH 80, SHARPNESS 70, SENSITIVITY 65. A real ring teeths immediately. If nothing shows, raise SENSITIVITY until the spike appears; if broadband material starts toothing too, back it off — SENSITIVITY moves the threshold from 15 dB down to 1 dB of overhang.
  3. Keep MAX CUT at 12–15 dB while hunting: the per-bin ceiling stops an over-eager setting from gutting the signal.
  4. Flip DELTA on (the figure shows this state). You should hear thin, toneless ringing. If you hear music, raise SHARPNESS — a narrower baseline stops wide harmonic structure counting as resonance — or reduce SENSITIVITY.
  5. Set SPEED last: it scales the per-bin attack/release time constants logarithmically (50→0.5 ms attack, 300→15 ms release). Slow settings suit long sustained rings; faster ballistics track short, spiky ringing. Then switch DELTA off.

Pitfalls. Chasing a resonance that is not narrow (raise SHARPNESS, it will leave the teeth anyway if it is real); running DELTA too long and EQ-ing by what remains instead of what is removed; letting MAX CUT exceed ~15 dB on the first pass — rather solve a stubborn ring with the FOCUS bell (section 08).

TT-SPECTRAL while suppressing a 3 kHz resonance — stationary spike through the baseline with an amber suppression tooth, DELTA engaged in the AUDITION panel, GR readout 15.0 dB
DELTAResonance hunt with DELTA on. The 3 kHz ring stands through the baseline, the suppression tooth eats exactly that spike (GR 15.0 dB), and the lit DELTA button lets you hear only the removed ringing.

Gentle bus cleanup

Goal. Take the edge off an entire bus — set-and-forget, transparent, no pumping.

  1. Dial in moderation everywhere: DEPTH 30–40, SHARPNESS ~75, SENSITIVITY ~45, SPEED ~60. Only needle-sharp peaks count, the ballistics are a touch lazy, and removal stays shallow.
  2. Cap MAX CUT at 6 dB — nothing can ever be cut harder, so the bus cannot be hollowed out by a loud section.
  3. Switch AUTO GAIN on. It compares long-term dry/wet power (~400 ms averaging) and re-adds up to +12 dB through a 150 ms smoother — it compensates the energy the resonances carried away. It is deliberately not a loudness normaliser: quiet programme stays quiet.
  4. If it still feels like it is doing something, blend with MIX ~70–80 %. MIX scales only the removed energy, so the blend can never comb-filter against the dry path.

Watch. The header GR should idle at a few dB (6 dB in the figure), not double digits. Dullness, level swimming or a ‘breathing’ top end mean DEPTH, SENSITIVITY or MAX CUT are too hot — check with DELTA; on a bus the delta should be nearly inaudible.

TT-SPECTRAL in bus-cleanup state — DEPTH 35, SENSITIVITY 45, MAX CUT 6 dB, AUTO GAIN lit, MAKE-UP ON readout, GR 6.0 dB
BUSSet-and-forget bus cleanup. Mild detector settings, a hard 6 dB ceiling and AUTO GAIN engaged — the MAKE-UP ON readout confirms the compensating gain is active.

Targeted work: mask, FOCUS and stereo modes

Goal. Process exactly one region or one channel — nothing else.

  1. Restrict the band first: drag the LOW CUT / HIGH CUT mask edges in the display (or use the LOW/HIGH knobs). Outside the band the detector threshold is effectively infinite — the cut there is measurably 0.0000 dB. The figure hunts only 250 Hz–5 kHz; the regions outside are darkened and stay untouched even though a ring at ~6 kHz is plainly visible.
  2. Point the FOCUS bell at the stubborn frequency: FREQ on the ring, GAIN +6…+12 dB, and Q narrow (2–4) so only that neighbourhood becomes extra sensitive. The strip under the display draws the exact threshold offset — the bump at 3 kHz in the figure is +9 dB at Q 2.0.
  3. Pick the channel mode deliberately: L/R for normal stereo, MID when the problem sits in the centre (vocal harshness), SIDE for wide harshness (cymbals, reverb tails) while the centre passes untouched, M+S to process both components independently.
  4. Keep STEREO LINK at 100 % unless the image suffers — at full link both channels share one detection and the cuts are bit-identical, so a centred source cannot be pulled sideways. Lower it only if a hard-panned source sounds dragged toward the centre.

Pitfalls. Ringing in MID mode when the ring lives in the sides (check where it sits before committing); a mask edge forgotten from a previous session — right-click the markers to reset to 100 Hz / 16 kHz; FOCUS GAIN left positive while hunting elsewhere (it raises sensitivity only near FREQ, but still counts).

TT-SPECTRAL with frequency mask 250 Hz to 5 kHz and FOCUS bell +9 dB at 3 kHz, Q 2.0 — mask markers on the display, FOCUS strip showing the bell bump
TARGETMasked hunting with a FOCUS bell. Only the 250 Hz–5 kHz band can be cut (mask markers on the display), and the FOCUS bump makes 3 kHz count as resonant much earlier — the ~6 kHz ring outside the mask is ignored.

04Display & handling

All REAPER sliders are hidden by design — the 900×570 front panel is the interface. The resonance display plots 20 Hz–20 kHz on a logarithmic axis against −100…−10 dBFS and draws three curves:

CurveColourMeaning
SIGNALgrey fill + lineLive level per column (maximum of both channels); rises instantly, decays smoothed
BASELINEcyan lineThe robust local baseline the detector compares against — resonances show as spikes through it
SUPPRESSIONacid / amber / red teeth from the topCurrent per-bin cut growing downward: ≤6 dB acid green, 6–15 dB amber, >15 dB red; a 24 dB cut spans half the plot height
TT-SPECTRAL spectral display — log-frequency plot with mask edge markers at 100 Hz and 16000 Hz, SIGNAL/BASELINE/SUPPRESSION legend, FOCUS strip below
DISPLAYThe spectral plot. Signal, baseline and suppression curves on a log axis, mask edges as draggable markers, and the FOCUS strip — frequency by horizontal drag, gain by vertical, Q by wheel.
TT-SPECTRAL header with the OPTIONS box open: ten colour swatches, the factory scheme ACID is marked
OPTIONSOptions / Color. Click OPTIONS at the right end of the header (right of the preset bar), then a swatch. A click outside the box closes it.

Options / Color. The OPTIONS button at the right end of the header opens the box; COLOR offers ten schemes: ACID, CYAN, ORANGE, MAGENTA, YELLOW, RED, BLUE, VIOLET, MINT and ICE. A scheme changes the accent colour (knob rings, active buttons, LEDs, mask handles, the light suppression teeth), the second colour and, for RED to ICE, the slightly tinted panel background of the whole front at once. Colours that carry a meaning stay fixed: the cyan BASELINE curve and the amber and red suppression teeth (6–15 dB and above 15 dB). The choice applies per plug-in instance, is saved with the project and with FX-chain copies, and is not touched by parameter changes or randomising. The factory colour is ACID. The colour is stored in the hidden parameter 32 (UI Color, 0–9).

05Presets

Header of TT-SPECTRAL with the preset bar left of the OPTIONS button and the open preset list with the FACTORY section (six factory presets) and the USER section
PRESETSThe preset bar sits in the header, directly left of OPTIONS: < name > SAVE .... The name opens the list with the FACTORY and USER sections.

The bar loads and saves the whole sound setting of the instance in one step: DEPTH, SHARPNESS, SPEED, SENS, MAXCUT, LOW and HIGH cut, the three FOCUS values, LINK, the PROCESS mode (L/R, M+S, MID, SIDE), OUT and AUTO GAIN (14 values). Not part of a preset: MIX, DELTA and BYPASS (they describe how you use the plug-in on a track, not the sound of the setting), the colour scheme (OPTIONS) and the hidden test parameters. Loading a preset therefore never switches your audition or bypass state and never changes the wet/dry balance.

ControlFunction
< / >Previous / next preset: first the six factory presets, then the used user slots; wraps around and loads immediately.
Name fieldOpens the list: FACTORY (6 presets) and USER (32 slots, empty ones show - empty -). Mouse wheel scrolls, click loads. A * behind the name means a value differs from the loaded preset.
SAVESaves the current setting into the selected user slot; with a factory preset (or none) selected, into the first free slot. A name box opens (up to 24 characters, default User 01): type, Enter or OK saves, CANCEL or a click outside cancels.
...RENAME, COPY (into the next free slot), DELETE (a second click confirms) for the selected user preset, and INIT (all 14 values back to the factory defaults: DEPTH 60, SHARPNESS 50, SPEED 50, SENS 50, MAXCUT 12 dB, LOW 100 Hz, HIGH 16 kHz, FOCUS 3 kHz / 0 dB / Q 1, LINK 100 %, L/R, OUT 0 dB, AUTO GAIN off).

Factory presets

Starting points, not final settings. Each preset was measured on the test signal (pink noise at −18 dBFS plus steady tones at 1, 3 and 6 kHz, 9 to 15 dB above the noise floor; MIX 100 %, offline render, level change against the same signal with DEPTH 0):

PresetIdeaTones 1 / 3 / 6 kHzBroadband
Gentle MasterLight polish for a full mix: low depth and sensitivity, 6 dB ceiling, mask 60 Hz–18 kHz.−2.2 / −3.3 / −3.3 dB0.00 dB
Vocal HarshnessTames ringing and edge in a voice: mask from 150 Hz to 12 kHz, FOCUS bell at 3.5 kHz, +4 dB so that region counts as resonant earlier.−5.7 / −9.8 / −8.7 dB−0.09 dB
Surgical RingNarrow, deep cuts for stubborn resonances: high SHARPNESS and SENS, 18 dB ceiling.−8.3 / −10.8 / −11.0 dB−0.04 dB
Drum Bus RingFast ballistics (SPEED 75) for drum-room ring; FOCUS bell at 800 Hz, +3 dB, Q 0.8.−6.4 / −6.6 / −6.5 dB−0.02 dB
Mid Only CleanPROCESS = MID: only the centre is cleaned, the side signal stays untouched.−7.0 / −8.4 / −8.9 dB (mid); side tone 5 kHz: 0.00 dB−0.03 dB
Wide Mix BusPROCESS = M+S, LINK 60 %, AUTO GAIN on: gentle stereo-aware bus cleanup with make-up.−3.7 / −5.1 / −5.2 dB (relative to the broadband level)0.00 dB (AUTO GAIN)

A factory preset changes exactly the 14 values above; MIX, DELTA, BYPASS and the colour stay as they are. The numbers depend on the material — on real music the amount of cut is set by how far the resonances stand above their own neighbourhood.

Where the user bank lives. Plug-ins cannot write files, so the 32 user slots are part of the plug-in state: they are saved with the project, with FX-chain and track-template copies, and in every REAPER preset of this plug-in (the + button in the FX window toolbar). To take your bank to another project or computer, save a REAPER preset once (+ → Save preset) and load it there: the whole bank comes with it. Projects saved with earlier versions load unchanged with an empty bank.

Typing names. REAPER keeps Space for the transport, so type Shift+Space for a blank. Depending on your REAPER settings Esc closes the whole FX window; use CANCEL instead. (The + menu of the FX window also has Send all keyboard input to plug-in.)

06How detection works

On every 1024-sample hop the engine converts each bin's power into a dB level against a sine calibration, smooths it over three bins (0.25/0.5/0.25 — this tames the ±5.6 dB Rayleigh scatter of noise, and costs a real resonance only ~0.7 dB), optionally blends in the stereo link, and builds a robust local baseline: a three-pass winsorised moving average — each bin's own peak is clipped to +3 dB, then +1.5 dB above the running average before averaging, so a resonance cannot inflate its own baseline by more than a fraction of a dB. The window half-width scales with frequency (roughly an octave) and follows SHARPNESS — higher = narrower neighbourhood = only needle-thin spikes count.

ControlRange / defaultFunction
SENSITIVITY0–100 %, def. 50Detection threshold above the baseline: 15 dB at 0 %, 8 dB at 50 %, 1 dB at 100 % — how far a bin must exceed its baseline to count as resonant
SHARPNESS0–100 %, def. 50Baseline window width — higher means only very narrow resonances are caught
DEPTH0–100 %, def. 60Fraction of the detected overhang removed (80 % removes 0.8 dB per dB overhang)
MAX CUT3–30 dB, def. 12Hard ceiling per bin — keeps the process transparent
SPEED0–100 %, def. 50Scales the per-bin one-pole ballistics logarithmically: attack 50→0.5 ms, release 300→15 ms (measured: 50.0/300.0 ms at 0 %; 8 dB of cut within 7.8 ms on 50 ms bursts at 100 %)

Before the ballistics run, the target notch is dilated ±2 bins — an STFT frame cannot carve a notch narrower than a few bins — and smoothed with a 1-2-1 kernel against gurgle; then the frequency mask is applied, so outside the band the target is exactly 0 dB. Tiny states under 0.005 dB snap to zero instead of lingering. Detection is level-relative, not absolute — the same setting works on quiet and loud passages alike.

TT-SPECTRAL SUPPRESSION panel (DEPTH, SHARPNESS, SPEED) and DETECTOR panel (SENS, MAXCUT, FOC Hz, FOC dB, FOC Q, LOW, HIGH)
PARAMETERSSUPPRESSION and DETECTOR. DEPTH/SHARPNESS/SPEED shape how much and how fast the engine cuts; SENS/MAXCUT plus the FOCUS bell and LOW/HIGH mask edges decide where and when.

07Spectral engine

The shared TimTechlor STFT core windows 4096 samples (√Hann), zero-pads to 8192 and runs a real transform on a 1024-sample hop (4× overlap, 21.3 ms at 48 kHz / 23.2 ms at 44.1 kHz). The 8192-point transform yields 4097 addressable pair slots — but only the even-indexed slots ever carry energy (verified empirically: odd pairs are zero at every test frequency), leaving 2049 populated bins spaced srate/4096 ≈ 11.72 Hz apart at 48 kHz. The detector grid covers the 2048 bins j = 0…2047; DC and Nyquist are zeroed before resynthesis and can never be cut.

The removed energy — not the residual — is reconstructed through its own overlap-add path, so the output is dry − removal. That is why DELTA audition and MIX come free, why MIX can never comb-filter, and why BYPASS is bit-exact.

Broadband passthrough 0.000 dB loss · cut exact to ±1 dB of the detection model · LINK 100 % produces bit-identical cuts on both channels · outside the mask 0.0000 dB of change, removal energy < −60 dB · delta/dry null below −300 dBFS · BYPASS difference exactly 0 · ~3 % of one core at 48 kHz stereo (≈34× real time).

08Controls

ControlValues / defaultFunction
DEPTH0–100 %, def. 60Removal depth of the detected overhang
SHARPNESS0–100 %, def. 50Baseline neighbourhood width
SPEED0–100 %, def. 50Attack/release scaling of the per-bin state (section 05)
SENSITIVITY0–100 %, def. 50Detection threshold, 15→1 dB of overhang
MAX CUT3–30 dB, def. 12Per-bin cut ceiling
LOW CUT / HIGH CUT20–500 Hz / 4–20 kHz, def. 100 / 16 kHard processing mask (draggable in the display); HIGH CUT is held ≥ 1.5× LOW CUT internally
FOCUS FREQ / GAIN / Q100–16 kHz / ±12 dB / 0.3–8, def. 3 k / 0 / 1Bell that shifts the threshold locally (section 08)
STEREO LINK0–100 %, def. 100Shared detection between channels (section 09)
PROCESSL/R · MID · SIDE · M+S, def. L/RChannel mode
MIX / OUT0–100 % / ±12 dB, def. 100 / 0Parallel blend of the removal and post trim
AUTO GAINOFF/ON, def. OFFMake-up proportional to the removed energy (section 10)
DELTA / BYPASSOFF/ONAudition the removed part / latency-aligned bypass

All parameters are automatable — the sliders stay hidden by design (- prefix); the front panel is the interface. A diagnostic readout block lives on hidden sliders 18–31 for tests and automation queries (section 11). Slider 32 (UI Color) stores the colour scheme of the OPTIONS box (section 04).

09Mask & focus bell

The frequency mask is surgical: below LOW CUT and above HIGH CUT the detector threshold is effectively infinite — bins there cannot be cut at all (measured: a 60 Hz tone inside a masked-out region receives 0.0000 dB of reduction, and the removed spectrum carries < −60 dB outside the band). The two lowest and two highest transform bins are excluded regardless, so DC and the top edge stay safe with any setting.

The FOCUS bell adds a Gaussian dB offset to the detection threshold around FREQ, with an octave width σ = 0.7/Q — positive GAIN makes bins near FREQ count as resonant much earlier, negative GAIN protects them:

FOCUS GAINEffectUse
+6…+12 dBBins near FREQ count as resonant much earlier — measured +12 dB lifts a marginal 5.9 dB cut to 15.5 dBA known ring frequency (snare shell, room mode, vocal harshness)
0 dBNeutral—
−6…−12 dBBins near FREQ are protected — measured −12 dB keeps the cut at 0.00 dBProtect the body of the signal while the rest is cleaned

The strip under the display draws exactly this offset — what you see in the FOCUS curve is the dB value added to each bin's threshold.

10Stereo link & M/S

With both channels processed, STEREO LINK blends each channel's detector level toward the combined level in the dB domain: at 100 % both sides see the same spectrum, so the cuts are bit-identical (measured maximum deviation 0.000000 dB); at 0 % each channel cuts only what it actually has. In MID- or SIDE-only modes LINK is idle.

PROCESSBehaviour
L/RNormal stereo operation — separate detection per channel, blended by LINK
MIDOnly the mid signal is analysed and cleaned — the side passes untouched (measured −0.00 dB)
SIDEOnly the side signal — tame wide harshness (cymbals, reverb) while keeping the centre intact
M+SMid and side are both processed independently (LINK blends their detection)

M/S processing happens per bin in the frequency domain (mid = (L+R)/2, side = (L−R)/2) — measured isolation: 11–13 dB of cut in the processed channel, −0.00 dB in the other.

11Audition, mix & output

TT-SPECTRAL bottom row — STEREO panel (LINK %, L/R, M+S, MID, SIDE), OUTPUT panel (MIX, OUT, AUTO GAIN), AUDITION panel (DELTA, BYPASS)
OUTPUTStereo, output and audition. LINK % and the PROCESS mode buttons on the left, MIX/OUT/AUTO GAIN in the middle, DELTA and BYPASS on the right — latency readout in the footer.

12Latency, PDC & diagnostics

SourceAmount
STFT window (fixed)4096 samples — reported exactly to REAPER's plug-in delay compensation (85.3 ms at 48 kHz, 92.9 ms at 44.1 kHz)

The header shows the live latency in samples and ms plus the current maximum gain reduction (GR) of both channels.

Hidden diagnostic readouts

Hidden sliders 18–31 and 33–36 (the Q … family) are test/automation readouts. Normal use never needs them, but they are readable via REAPER's parameter list and drive the header meters:

ReadoutMeaning
Q IDX / Q VALQuery interface: IDX selects an address — first the per-hop log ring at the tracked bin (state, target, overhang, level; 2048 hops each), then the per-bin arrays (cut state, level, baseline per channel) — VAL returns the value
Q TRKBINBin observed by the per-hop log ring (1–2046, def. 256 ≈ 3 kHz at 48 k)
Q PDCReported delay = 4096 samples
Q HOPSProcessed analysis-hop counter
Q SRATECurrent host sample rate
Q GMAX0 / Q GMAX1Current maximum cut per channel in dB — the header GR meter
Q LINKERRMax |cut L − cut R| across bins (exactly 0 dB at LINK 100 %)
Q THRCurrent detection threshold in dB (derived from SENSITIVITY)
Q MASKERRReserved — currently always 0
Q PEAKBINIndex of the bin with the largest cut on channel 0
Q PB CMD / Q PB IDX / Q PB A / Q PB BPreset-bank test interface (sliders 33–36): command, slot or factory index, and two readouts. Only used by the test suite; leave at 0
Q TAUA / Q TAURCurrent attack/release time constants in ms (derived from SPEED)

13Troubleshooting