feat: add Lathe harmonic EQ and Temper tracked distortion
Check and Windows preview / check (anvil) (push) Successful in 2m8s
Check and Windows preview / check (crucible) (push) Successful in 1m32s
Check and Windows preview / check (lathe) (push) Successful in 2m13s
Check and Windows preview / check (patina) (push) Successful in 2m5s
Check and Windows preview / check (rivet) (push) Successful in 1m34s
Check and Windows preview / check (temper) (push) Successful in 2m12s
Check and Windows preview / previews (push) Successful in 1m19s
Check and Windows preview / windows (push) Successful in 2m13s
Independent plugin release / publish (push) Successful in 8s
Independent plugin release / plan (push) Successful in 6s
Independent plugin release / build (push) Successful in 2m57s

Lathe places EQ bands on harmonics 1-32 of the played note, so a cut on
harmonic 3 stays on harmonic 3 on every note. Temper normalises each
note's level before an oversampled shaper and tunes its floor, push and
bright filters to the note, so every note distorts the same.

The note tracker moves from Anvil into common-dsp, together with a
state-variable filter, 4x oversampler and harmonic meter. Anvil's
behaviour and editor render are unchanged.

docs/ideas.md collects all plugin ideas and their status.
This commit is contained in:
nvrl committed 2026-11-06 06:08:51 +01:00
1 parent f36ff0780c
commit b3ebe4d952
48 files changed
+9862 -339

No files matched your search

+6
View File
@@ -27,6 +27,8 @@ python scripts/check-plugin.py --plugin rivet
python scripts/check-plugin.py --plugin patina
python scripts/check-plugin.py --plugin anvil
python scripts/check-plugin.py --plugin crucible
python scripts/check-plugin.py --plugin lathe
python scripts/check-plugin.py --plugin temper
python -m unittest discover -s scripts/tests -v
```
@@ -49,6 +51,8 @@ python scripts/build-plugin.py --plugin rivet --target x86_64-pc-windows-gnu
python scripts/build-plugin.py --plugin patina --target x86_64-pc-windows-gnu
python scripts/build-plugin.py --plugin anvil --target x86_64-pc-windows-gnu
python scripts/build-plugin.py --plugin crucible --target x86_64-pc-windows-gnu
python scripts/build-plugin.py --plugin lathe --target x86_64-pc-windows-gnu
python scripts/build-plugin.py --plugin temper --target x86_64-pc-windows-gnu
python scripts/package-windows.py
python scripts/package-windows.py --plugin rivet
python scripts/package-windows.py --plugin patina
@@ -77,6 +81,8 @@ cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/patina.png --plu
cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/patina-compact.png --plugin patina --compact
cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/anvil.png --plugin anvil
cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/crucible.png --plugin crucible
cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/lathe.png --plugin lathe
cargo run --manifest-path tools/editor-check/Cargo.toml -- /tmp/temper.png --plugin temper
```
Patina also accepts `--silent`, `--delta`, and `--bypass` as render fixtures.
+101
View File
@@ -0,0 +1,101 @@
# Plugin ideas
A running list of plugin ideas for riddim, dubstep and bass-music sound design.
Each entry names the problem first. Entries are grouped as released or idea. Names follow the metalwork theme of Rivet, Patina, Anvil and Crucible.
## Problems seen in bass-music production
1. Every bass patch brings its own sub level and phase, so the weight of a drop
jumps between switch-ups, and layered patches cancel in the sub.
2. Patches at the same peak level still differ in perceived loudness and
brightness. The usual fix is hand-set gain or clipping per patch.
3. Resampling is repetitive: bounce, chop, trim, declick, normalise, find the
root key, name, save, load into a sampler.
4. Writing wobbles: LFO shapes are drawn, synced, copied and edited for every
variation. Triplet and dotted patterns plus per-note changes take long.
5. Unison, OTT and stereo distortion widen the mids. Parts disappear in mono or
on club systems.
6. Kick and bass clash. Sidechain helps, but the sub phase at each note start
changes how the kick hits.
7. Distortion chains build up harsh resonances. (Patina covers this.)
8. Comparing a drop with a reference: the difference is usually sub/mid balance
over time, which generic meters do not show clearly.
9. Fixed-frequency tools act differently on every note. An EQ boost at 300 Hz
lifts the 4th harmonic of one note and the 7th of another; a distortion with
a fixed tone filter sounds brighter on low notes than on high notes.
10. Layered bass patches partly cancel in the mids, not only in the sub.
## Released
### Anvil — sub anchor (problems 1, 6)
Replaces the band below a split frequency with a clean mono sine that follows
the bass pitch, at one level and one start phase for every note. Pitch comes
from detection with 80 ms lookahead or from MIDI. See [Anvil](anvil/README.md).
### Crucible — resampler (problem 3)
Records the input continuously. One click captures the last bars on the host
bar grid, slices on a grid or on hits, trims, declicks, normalises, detects the
root key and exports labelled WAVs, a full loop and an optional Serum/Vital
wavetable. See [Crucible](crucible/README.md).
### Lathe — harmonic EQ (problem 9)
EQ bands placed on harmonics 1–32 of the detected note instead of fixed
frequencies. "+4 dB on harmonic 3, −6 dB on harmonic 7" sounds the same on F1
and on C2. Odd/even balance, tilt over harmonic number, and a Focus control
that lifts or cuts everything between the harmonics. Uses Anvil's pitch
tracker, or MIDI. See [Lathe](lathe/README.md).
### Temper — note-tracked distortion (problem 9)
A waveshaper whose tone filters before and after the shaper follow the note, so
every note distorts with the same character and the same harmonic content.
Input level is normalised before the shaper, so drive does not depend on how
loud the patch is, and the output is gain-matched. Oversampled to keep aliasing
(which is never harmonic) out. See [Temper](temper/README.md).
## Ideas
### Weld — layer phase alignment (problem 10)
Takes a second bass layer through the sidechain. Per band, it rotates phase
with allpass filters (no added delay) and flips polarity so the layers sum
instead of cancel. A display shows how much level the cancellation cost. Anvil
solves the sub band; Weld solves the mids. Hardest of the list: phase matching
against a moving sidechain.
### Ballast — switch-up loudness leveller (problem 2)
Measures short-term perceived loudness per note or per switch-up against a
target or a reference patch and adjusts gain only, so each switch-up lands at
the same loudness without compression changing its character. Earlier working
name: Hit Leveler. Pairs with Anvil: Anvil levels the sub, Ballast the whole
patch.
### Bellows — pitch-tracked resonator
A comb or Karplus-style resonator tuned to the detected note. It turns noise,
distortion or drums into pitched metallic tone that is in key on every note.
Damping, harmonic spread, single or multiple combs.
### Gauge — low-end mono check (problem 5)
Shows phase correlation and mono-sum loss per band and per note in the bass
range, and marks the notes where widening breaks the mono sum. Optional fixes:
mono below a chosen frequency and phase rotation on the mids. Display-first, so
it is a small build. Earlier working name: Bass Mono Check.
### Wobble sequencer (problem 4)
Step patterns for volume, filter, formant and pitch with triplet and dotted
grids built in. Each MIDI note selects a different pattern, so a switch-up is a
different note in the piano roll. ShaperBox overlaps, but it has no note-keyed
patterns. No name yet.
### Drop compare (problem 8)
Loudness-matched A/B of a drop against a reference, with sub, low-mid, mid and
high energy over time: for example "your sub is 3 dB under the reference in
bars 2–4". No name yet.
+13
View File
@@ -0,0 +1,13 @@
# Lathe changelog
## 0.1.0
- Introduce Lathe, a harmonic EQ for bass sound design.
- Bands sit on harmonics 1–32 of the played note instead of fixed frequencies,
so a cut on harmonic 3 stays on harmonic 3 on every note.
- Draw a gain per harmonic; Tilt, Odd/Even and Between shape the whole series.
- Detect pitch and note starts from the audio with 67 ms lookahead, or follow
MIDI notes sent to the effect. Filters retune at each note's attack.
- Controls: Tilt, Odd/Even, Between, Width, Harmonics, Smooth, Gate, Mix,
Output, Snap to semitone, Bypass. Shapes: Flat, Odd only, Even only, Hollow.
- Harmonic editor shows the measured level of each harmonic before and after.
+66
View File
@@ -0,0 +1,66 @@
# Lathe
Lathe is an EQ whose bands sit on the harmonics of the note being played.
Current version **0.1.0**.
A normal EQ works in fixed frequencies. A cut at 130 Hz takes out the 3rd
harmonic of an F1 bass, the 2nd of a C2, and the fundamental of a C3, so the
same bass sounds different on every note of a riddim line. Lathe follows the
pitch and places one band on each harmonic: "−12 dB on harmonic 3" stays on
harmonic 3 whatever note plays.
![Lathe](assets/editor.png)
## Install on Windows
Copy `Lathe.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. Load Lathe in a mixer slot of the bass, after the synth and before bus
processing. Keep the font license with redistributed packages.
## Work with it
1. Play the bass. The note readout shows what Lathe tracks; the lower strip of the
editor shows each harmonic's level going in (grey) and coming out (pink).
2. Draw gains on the harmonic bars. Drag across bars to paint a shape;
Shift-drag for fine steps; double-click a bar to reset it.
3. Use the macros for the whole series:
- **Tilt** brightens or darkens in dB per octave of harmonic number. The
fundamental is the pivot.
- **Odd/Even** lifts odd harmonics and lowers even ones (positive, more
square-like) or the reverse (negative, more octave-like).
- **Between** sets the gain halfway between harmonics. Cut it to clean up noise,
beating and inharmonic grit; lift it for dirt.
4. **Width** sets every band's bandwidth as a share of the harmonic spacing. Narrow
bands touch only the harmonic; wide bands also move its surroundings.
Other controls:
- **Harmonics** is how many harmonics are shaped (8–32). Higher harmonics pass
unchanged.
- **Smooth** is the retune time for slides and pitch bends. A new note always
retunes at once, on its attack.
- **Gate** is the input level that counts as a note. Raise it if tails or reverb
start new notes.
- **Mix** blends with the delayed dry signal; **Output** trims the level.
- **Snap to semitone** rounds the detected pitch. Turn it off for slides.
- **Shapes** set the drawn gains: Flat, Odd only, Even only, or Hollow (harmonics
2–4 cut).
The drawn gains are saved with the project but are not automation parameters;
the macros are.
### Pitch from MIDI
For basses whose fundamental is unclear (heavy FM, formant or noise patches),
select **MIDI** and route the bass's MIDI notes to Lathe. In FL Studio, set the
bass channel's MIDI output port and Lathe's input port to the same number.
## Timing and limits
Detection uses about 67 ms of lookahead, reported to the host for delay
compensation, so the bands are tuned before each note's attack leaves the
plugin. Pitch range is 30–500 Hz, one note at a time; chords are not separated.
Before the first note Lathe passes audio unchanged; between notes it holds the
last tuning so tails keep their shape. Bands above 0.45 × the sample rate are
skipped.
Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

+14
View File
@@ -0,0 +1,14 @@
# Temper changelog
## 0.1.0
- Introduce Temper, a note-tracked distortion for bass sound design.
- Normalises each note's level before the shaper, so quiet and loud patches are
driven the same.
- Floor (highpass), Push (one harmonic boosted or cut) and Bright (lowpass) sit
at multiples of the played note, so every note keeps the same character.
- Curves: Soft, Hard, Fold and Tube, with Bias for even harmonics. The shaper runs
at 4× oversampling.
- Auto gain keeps the output at the input loudness while Drive changes.
- Detect pitch and note starts from the audio with 67 ms lookahead, or follow
MIDI notes sent to the effect.
+66
View File
@@ -0,0 +1,66 @@
# Temper
Temper is a distortion that drives every note the same. Current version **0.1.0**.
A distortion with a fixed tone filter acts differently on each note: a lowpass
at 2 kHz lets through 45 harmonics of an F1 but only 22 of an F2, and
a patch that is 6 dB quieter is driven 6 dB less. Across a riddim line that makes
some notes fizzy and others dull. Temper evens out each note's level before the
shaper and moves its tone filters with the pitch, so the character stays the same
on every note.
![Temper](assets/editor.png)
## Install on Windows
Copy `Temper.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. Load Temper in a mixer slot of the bass. Keep the font license
with redistributed packages.
## Work with it
1. Choose a **Curve**:
- **Soft**: tanh, smooth and rounded.
- **Hard**: clipping with a narrow knee, dense and square-like.
- **Fold**: the wave folds back on itself; Drive moves the upper harmonics.
- **Tube**: the negative half clips earlier, adding even harmonics.
2. Set **Drive**. The transfer plot shows the curve over the range a normalised
note covers; the **Into shaper** meter shows how far past the knee it goes.
3. Add **Bias** for asymmetry and even harmonics.
4. Shape the tone around the shaper, all in multiples of the note:
- **Floor** is a highpass before the shaper (0.25–2 × the fundamental; 0 is
off). It keeps sub mud out of the distortion. Put Anvil after Temper to add a
clean sub back.
- **Push** boosts or cuts one harmonic (**Push at**, 1–16) before the shaper,
so the distortion bites in the same place on every note.
- **Bright** is a lowpass after the shaper at a harmonic number (4–64; 0 is
off), so the top end stops at the same harmonic on every note.
Other controls:
- **Normalize** is how far each note's level is evened out before Drive. At 100 %
a quiet and a loud patch distort the same; at 0 % Temper acts like a normal
distortion.
- **Auto gain** keeps the output at the input's loudness, so turning up Drive
changes the character, not the level.
- **Gate** is the input level that counts as a note.
- **Mix** blends with the delayed dry signal; **Output** trims the level.
### Pitch from MIDI
Select **MIDI** and route the bass's MIDI notes to Temper when detection
struggles. In FL Studio, set the bass channel's MIDI output port and Temper's
input port to the same number.
## Timing and limits
Detection uses about 67 ms of lookahead; the 4× oversampling filters add under
1 ms. Both are reported to the host for delay compensation. Pitch range is
30–500 Hz, one note at a time. Before the first note the tracked filters are off;
between notes they hold the last tuning.
Aliasing stays below −60 dB for bass material (tested with a 2 kHz tone at 24 dB
drive and a 440 Hz tone at full drive, on every curve). High-pitched content at
full drive aliases more: a 5 kHz tone at 36 dB on the Hard curve reaches about
−31 dB.
Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB