Check and Windows preview / check (anvil) (push) Canceled after 0s
Check and Windows preview / check (braze) (push) Canceled after 0s
Check and Windows preview / check (crucible) (push) Canceled after 0s
Check and Windows preview / check (knurl) (push) Canceled after 0s
Check and Windows preview / check (lathe) (push) Canceled after 0s
Check and Windows preview / check (patina) (push) Canceled after 0s
Check and Windows preview / check (planish) (push) Canceled after 0s
Check and Windows preview / check (rivet) (push) Canceled after 0s
Check and Windows preview / check (temper) (push) Canceled after 0s
Check and Windows preview / check (weld) (push) Canceled after 0s
Check and Windows preview / previews (push) Canceled after 0s
Check and Windows preview / windows (push) Canceled after 0s
Independent plugin release / publish (push) Successful in 8s
Independent plugin release / plan (push) Successful in 8s
Independent plugin release / build (push) Successful in 3m12s
- Anvil 0.3.0: Ghost harmonics, Phone listen, Kick lock and the offset audition. Anvil now has a Kick sidechain input. - Weld 0.3.0: delay spread display. - Braze 0.1.0: first release. - Mark the released items in docs/ideas.md and add Braze to the release table.
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.3.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.
|