Weld's allpass sections add group delay between 500 Hz and 4 kHz, where listeners hear it best. Liski et al. (2021) measured a threshold of about 0.64 ms for a positive group-delay peak on clicks. Weld now reports how much its delay varies over that range and, above the threshold, suggests comparing attacks in SUM and SUM DRY. Common fits from Weld's own tests spread 0.82-1.03 ms, so the line is a neutral note, not a warning: sustained bass hides much more than a click. - Fit::group_delay (analytic, per section) and Fit::smear_ms in weld-core. - Report::smear_ms, filled by the analyzer from the applied fit. - Tests against the numeric phase slope and the analog 4Q/w0 peak. - Display only; the audio path does not change.
116 lines
6.1 KiB
Markdown
116 lines
6.1 KiB
Markdown
# Weld
|
||
|
||
Weld fuses two bass layers so they add up instead of cancelling. Current version
|
||
**0.2.0**.
|
||
|
||
Bass patches are layered: a sub, one or more mid growls, a top. Where the layers
|
||
overlap in the mids, they partly cancel. The causes are a polarity difference, a
|
||
small time offset between the layers, and the phase shift of the filters and EQs
|
||
in one chain. The result is a thin, hollow sum that changes with every
|
||
switch-up. Anvil fixes this for the sub band; Weld fixes it for the mids.
|
||
|
||
Weld sits on one layer and hears the other one through the sidechain input. It
|
||
measures how the two layers line up, then turns the phase of its own layer with
|
||
a polarity flip and up to four allpass filters. An allpass changes only phase,
|
||
so the layer on its own sounds the same; only the sum changes. Weld adds no
|
||
latency.
|
||
|
||

|
||
|
||
## Install on Windows
|
||
|
||
Copy `Weld.clap` into `C:\Program Files\Common Files\CLAP\`. In FL Studio 2024.1
|
||
or newer, open Options → Manage plugins, enable Verify plugins, and Find installed
|
||
plugins. Keep the font license with redistributed packages.
|
||
|
||
## Set up in FL Studio
|
||
|
||
1. Put each layer on its own mixer track. Load Weld on the track of one layer,
|
||
the main layer.
|
||
2. Select the other layer's track. Right-click the route arrow under the main
|
||
layer's track and choose **Sidechain to this track**. The other layer still
|
||
goes to the master on its own; the sidechain only lets Weld hear it.
|
||
3. In Weld's plugin wrapper, open the settings (gear icon) and set Weld's
|
||
sidechain input to that track.
|
||
4. Play both layers. The SIDECHAIN meter must move. If the display says "No
|
||
sidechain signal", check step 3.
|
||
|
||
## Work with it
|
||
|
||
1. Leave **Mode** on **FOLLOW** and play the part where both layers sound. After
|
||
a second or two, Weld shows its alignment: polarity, and the allpass sections
|
||
with their frequency and Q.
|
||
2. Read the display:
|
||
- **Recovered** is how much level the sum gains, as an average per band
|
||
between Low and High. **Cancellation cost** is how much a perfect alignment
|
||
would gain. When the two numbers are close, Weld got nearly everything.
|
||
- The upper plot shows each band against a perfectly aligned sum (0 dB). Red
|
||
is what the unprocessed sum loses to cancellation; pink is the part Weld
|
||
wins back. The white line is the level with Weld.
|
||
- The lower plot shows the phase of this layer against the other one, before
|
||
(grey) and after (pink), and Weld's own phase curve (blue). After alignment
|
||
the pink line sits near 0°.
|
||
- **Delay spread** under the sections is how much Weld's delay changes
|
||
between 500 Hz and 4 kHz. On clicks, listeners hear about 0.6 ms of change
|
||
there (Liski et al. 2021); sustained bass hides much more, and common fits
|
||
reach 0.8–1 ms. Above that threshold Weld adds a note: on a plucky layer,
|
||
compare the attacks in SUM and SUM DRY. Fewer sections usually spread less.
|
||
3. Compare by ear: mute the other layer's own route to the master, set
|
||
**Listen** to **SUM**, then to **SUM DRY**. Set Listen back to **LAYER** and
|
||
unmute the route for the mix.
|
||
4. When the alignment is right, switch to **HOLD**. It is saved with the project
|
||
and comes back when the project opens.
|
||
|
||
For one drop or switch-up, use **LEARN**: press it, play the part, then press
|
||
**HOLD** (or LEARN again). Weld measures the whole take with equal weight and
|
||
applies the result when Learn ends.
|
||
|
||
## Controls
|
||
|
||
- **Mode**:
|
||
- **Follow** keeps measuring and refits only when a new alignment is clearly
|
||
better (at least 0.3 dB on average), so the filter does not wander.
|
||
- **Learn** starts a fresh measurement and applies its result when Learn ends.
|
||
- **Hold** keeps the current alignment. The display keeps measuring.
|
||
- **Sections** (1–4) is the largest number of allpass sections the fit may use.
|
||
Weld uses fewer when fewer are enough.
|
||
- **Response** (0.3–5 s) is the averaging time in Follow. Longer is steadier.
|
||
- **Low** and **High** set the range the fit listens to. Low defaults to 60 Hz,
|
||
leaving the sub to Anvil. The allpass still acts below Low, and the display
|
||
shows that honestly.
|
||
- **Gate** (−70 to −30 dB): moments where either layer is quieter are not
|
||
measured, so tails and silence do not pull the fit.
|
||
- **Listen**: **Layer** outputs this layer, aligned, for the mix. **Sum** outputs
|
||
this layer aligned plus the sidechain layer. **Sum dry** outputs both
|
||
unprocessed.
|
||
- **Output** trims the level; **Bypass** passes this layer unchanged.
|
||
|
||
## Limits
|
||
|
||
- **A late layer cannot be moved earlier.** An allpass only delays. If the layer
|
||
Weld sits on is the later one, the display shows "This layer is late" and the
|
||
offset in ms. Put Weld on the other layer instead.
|
||
- **Free-running layers cannot be aligned.** Without oscillator retrigger, or
|
||
with detuned unison, the phase between the layers drifts all the time. Weld
|
||
marks those bands as *loose* (hatched) and does not fit them. Enable retrigger
|
||
in the synth if you want Weld to align the layers.
|
||
- **Delays leave a comb.** A time offset between the layers cancels at regular
|
||
frequencies. A few allpass sections cannot follow a delay all the way up, so
|
||
Weld aligns the lower range and moves the higher notches rather than removing
|
||
them. For a large offset, move the layer in time first.
|
||
- **One alignment for the whole patch.** Weld does not change the alignment per
|
||
note. If switch-ups need different alignments, use Follow, or automate Mode.
|
||
- **The sidechain must arrive.** With no sidechain signal Weld changes nothing.
|
||
|
||
## How it works
|
||
|
||
Every 256 samples the audio thread hands mono copies of both layers to a worker
|
||
thread through a lock-free queue. The worker estimates their cross-spectrum
|
||
(Welch, Hann window, about 11.7 Hz per bin, 50 % overlap) and their coherence.
|
||
It fits polarity plus up to four second-order allpass sections so that
|
||
Σ w(f)·Re(S(f)·H(f)) is largest, with w = 1/f so every octave counts, ignoring
|
||
bins where the layers are not coherent, and with a penalty for any band that
|
||
would lose more than 1 dB. A new fit fades in over 40 ms after its filters have
|
||
settled for 40 ms, so there are no clicks. One fit takes about 15 ms on one
|
||
core, twice per second in Follow.
|