docs(ideas): add findings from the research collection

Adds a Research findings section with sourced numbers (Schmedeke fatness
model, virtual bass weighting, group-delay audibility, timbral tension,
coupled controls, layer coherence, heard timing of layered hits, loopback
FM, beat rates of detuned layers) and where each goes in the suite.

New problems 19-21, new ideas Braze, Arc and the fatness lane, additions
to Anvil, Weld, Crucible, Forge and Loupe, and a research track in the
build order. Also updates stale release notes for Patina and Planish.
This commit is contained in:
nvrl committed 2026-11-06 13:17:29 +01:00
1 parent d536e3127a
commit 8ecdc03832
1 file changed
+133 -10
+133 -10
View File
@@ -41,6 +41,13 @@ Each entry names the problem first. Entries are grouped as released or idea. Nam
the low end into distortion.
18. Resampled basslines have no MIDI, so tools that need the notes have nothing
to follow.
19. A clean sub carries the note on a club system but vanishes on phones and
laptops. Distortion makes the note readable there, but also changes the
patch.
20. Detuned layers (reese) beat at a rate that changes with every note and every
harmonic, so the movement is never in time with the track.
21. Kick and sub on the same MIDI tick are not heard at the same moment: the
heard hit depends on the attack shapes and on the offset between them.
## Signal flow and suite audit (2026-11)
@@ -84,6 +91,64 @@ Patina. Findings from the audit:
- **Settings handling differs.** Patina has presets and A/B; the others do not.
Lathe's drawn gains and Knurl's drawn pattern cannot be automated.
## Research findings (2026-11)
From the papers in `research/` (local, not committed). Each finding names where
it goes in the suite. They are starting points to test by ear, not rules.
- **A published bass fatness model.** Schmedeke's dissertation (Hamburg 2021,
"BASS DROP!") fits a regression on 4,070 ratings by DJs and club-goers,
measured at sixteenth-note resolution:
`Fatness = 1.743 − 0.013·Centroid<200Hz + 0.080·Loudness<200Hz − 0.041·Loudness>200Hz + 5.923·SNR<200Hz`
(adjusted R² 0.597). The strongest term is how tonal the band below 200 Hz
is (β 0.616), and loudness above 200 Hz lowers fatness. Anvil's clean sine
maximises the strongest term; Quench keeps it when the top is clipped. Goes
into Assay as one lane, never as an overall score. Before building, check the
thesis's exact SNR and loudness definitions (units, windows).
- **Virtual bass from known harmonics.** Moliner, Rämö and Välimäki (DAFx 2020)
boost the harmonics that exist with weights that follow the sound's spectral
envelope (limits 10 dB/oct below, 3 dB/oct above) and generate the missing
ones, so a small speaker suggests the fundamental. Their nonlinear stage fails
intermodulation tests, so they use it on transients only. The suite knows f0,
so it can add harmonics at exactly k·f0 with no intermodulation (problem 19).
Anvil's sub is a pure sine, so Lathe has no harmonics there to boost.
- **Group-delay audibility.** Liski, Mäkivirta and Välimäki (2021): between
500 Hz and 4 kHz, listeners hear a group-delay peak from about 0.64 ms
(positive) or 0.56 ms (negative) on clicks over headphones; a fast-decaying
hi-hat hides it. Weld's allpass sections add positive group delay there.
Done: Weld shows the delay spread (unreleased). Measured: common fits from
Weld's own tests spread 0.82–1.03 ms, above the click threshold, so the
display gives a note, not a warning.
- **Timbral tension.** Farbood and Price (2017): more roughness, inharmonicity
and spectral flatness raise judged tension; brightness (centroid) gives no
clear result. These are the measures planned for Loupe, and the controls a
tension macro would move.
- **Coupled one-knob controls.** A 2026 distance renderer derives five distance
cues from one control, so they always agree; in its listening test it roughly
halved placement error and every participant preferred it. A pattern for
macros in Forge.
- **Shared motion binds layers.** Temporal coherence (Elhilali et al. 2009) is
a grouping cue: sub, body and top sound like one sound when their main
movements line up. One modulation source inside Forge gives that by
construction; across separate `.clap` files it needs the shared memory
rejected below.
- **Heard timing of layered hits.** Danielsen et al. (2026): attack shape and
the offset between two layers together set when the compound hit is heard
and whether it fuses. Hove et al. (2014): timing deviations are heard more
clearly in lower voices, so the bass sets the grid (problem 21).
- **Loopback FM.** Smyth (DAFx 2026): an oscillator that frequency-modulates
itself shifts its own sounding pitch as feedback rises. Her closed-form
solution gives the sounding frequency, so a growl can stay on the tracked
note at any feedback.
- **Beating depends on note and harmonic.** For two layers detuned by ratio r,
harmonic k beats at k·f0·(r − 1) Hz (Plomp and Levelt 1965 for the roughness
context). Fixed cents beat faster up the keyboard; fixed Hz beats the same on
every harmonic (problem 20).
- **Do not encode as rules:** a best sub frequency, crossover or kick/bass
offset; one number for loudness, roughness, groove and preference; random
jitter sold as humanisation; more harmonics sold as more physical bass;
largest correlation sold as the best alignment.
## Released
### Anvil — sub anchor (problems 1, 6)
@@ -136,14 +201,20 @@ is the same on every note. Slow per-harmonic drift is postponed. See
Upward and downward compression in four bands whose edges are harmonic numbers
of the tracked note (default 1, 2–4, 5–16, 17 and up), so the same setting
squashes the same harmonics on every note. Each band's level is measured over
one period of the note, so heavy settings do not ripple at f0. Built, not yet
released. See [Planish](planish/README.md).
one period of the note, so heavy settings do not ripple at f0. See [Planish](planish/README.md).
## Next for released plugins
- **Anvil**: *Kick lock*: the kick through the sidechain ducks the sub on each
hit and restarts its phase so kick and sub sum (problem 6). A sub shape from
sine to rounded triangle. A note attack counted in cycles.
hit and restarts its phase so kick and sub sum (problem 6). With it, an
*offset audition*: a sweep of sub offsets against the kick (−30 to +30 ms,
then finer) and a marker for where the hit is heard, kept apart from the
low-band cancellation reading (problem 21). A sub shape from sine to rounded
triangle. A note attack counted in cycles. *Ghost harmonics*: harmonics 2–5
of the sub sine above a cutoff you set, with weights that follow the
patch's own harmonic slope, so phones hear the note; separate from the sub
level, so the physical sub does not change (problem 19). A *small speaker*
listen button that band-limits the output to judge it.
- **Lathe**: A/B gain snapshots with one automatable Morph parameter. A
keyswitch note that selects the drawn shape (EQ switch-ups without
automation). A dynamic mode per harmonic.
@@ -153,9 +224,12 @@ released. See [Planish](planish/README.md).
only. Drift (planned for 0.3).
- **Patina**: Tone guard (done, unreleased). MIDI as its pitch source. M/S
processing.
- **Weld**: alignment slots per note or per switch-up. The External
- **Weld**: delay spread display (done, unreleased). A *gentle* fit option
that keeps the delay spread under a limit, for plucky layers. Alignment slots
per note or per switch-up. The External
sender/receiver fallback if FL's sidechain does not arrive.
- **Crucible**: a switch-up slicer that cuts where the spectrum changes, for
- **Crucible**: a heard-onset marker per slice next to the technical cut, set
by ear and written to the WAV (problem 21). A switch-up slicer that cuts where the spectrum changes, for
legato basses. Optional retune of slices to one root. Reopening saved takes
from the `takes` folder in the take list.
- **Rivet**: more than two sound roles, one per switch-up patch. Its MIDI
@@ -170,13 +244,17 @@ released. See [Planish](planish/README.md).
([Signal chain](chain.md)), Crucible Keep takes. Open: Weld test with delay
compensation (in FL), MIDI mode without lookahead (needs an FL check that a
latency change at runtime is accepted).
2. Patina pitch-aware mode. Done as **Tone guard** (unreleased): bumps that
2. Patina pitch-aware mode. Done as **Tone guard** (Patina 0.4.0): bumps that
follow the note are protected, bumps fixed in Hz are cut. Measured first:
Patina already cut fixed formants on every note, but it also cut a boosted
harmonic as hard (5.7 dB), at a position that moved with the note.
Open: MIDI as the pitch source.
3. Planish (done, unreleased), then Quench and Ballast: they fill the mix and
master gap.
3. Planish (done, released 0.1.0), then Quench and Ballast: they fill the mix
and master gap.
- In parallel, from the research findings, in this order: Weld delay
spread (done, unreleased); the fatness lane, as the first Assay piece;
Anvil Ghost harmonics and small speaker listen; Braze; Anvil Kick lock
with offset audition.
4. Forge, when enough modules exist.
5. Assay, one plugin for the display-only ideas.
6. Texture plugins (Anneal, Swarf, Etch, Bellows) and the note-keyed sequencer.
@@ -188,12 +266,35 @@ are all "step grid, note selects the pattern", so they become one sequencer.
### Forge — one tracked channel strip (problems 9, 11, latency)
One tracker, one latency, and Lathe, Temper, Knurl and later Anneal as modules
in an order you choose. It removes the stacked lookahead, the trackers that
in an order you choose. Two further reasons from the research findings: one
modulation source for all modules moves sub, body and top together, which
binds them into one sound; and coupled macros become possible, for example a
*Tension* knob that raises roughness (Knurl), inharmonicity and noise (Anneal)
together at matched loudness, measured by the same descriptors as Loupe. It removes the stacked lookahead, the trackers that
disagree (Knurl's sub-octave cannot confuse a tracker that reads the input
before Knurl) and the repeated MIDI routing. The standalone plugins stay.
Sharing one tracker between separate `.clap` files would need named shared
memory across DLLs, which is fragile; one strip is simpler.
### Braze — tempo-locked beating (problem 20)
Brazing joins two metals with a filler. Braze adds a detuned copy of the bass
whose beating is in time with the track on every note. With the tracked f0, it
sets the detune ratio for each note so that a chosen harmonic beats at a
tempo-synced rate: r = 1 + B/(k·f0), for example an eighth at 140 BPM is
B = 4.67 Hz. A second mode adds a frequency-shifted copy, so every harmonic
beats at the same rate. Controls: rate (synced), target harmonic, depth,
spread across harmonics, mode. It reuses the tracker, and Weld should not
"fix" this beating: put Weld before Braze.
### Arc — self-FM growl (research spike)
An arc welds with a sustained spark. Arc runs loopback FM (Smyth, DAFx 2026)
on the tracked note: a time-varying delay line modulated by its own output.
The closed-form sounding frequency lets Arc retune the carrier, so the growl
stays in key while feedback sweeps from clean to torn. Needs listening and an
aliasing check before it becomes a plugin.
### Quench — sub-safe clipper (problem 17)
Quenching hardens hot metal in one fast step. Quench clips only above a split
@@ -245,6 +346,14 @@ 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.
### Fatness lane (problems 2, 8)
Momentary fatness per sixteenth note from Schmedeke's model (see Research
findings), drawn as one lane next to sub/mid energy, for a patch and a
reference. It explains why two drops at the same LUFS feel different in weight:
noise below 200 Hz and loud upper bands both lower the value. The first piece
of Assay.
### Drop compare (problem 8)
Loudness-matched A/B of a drop against a reference, with sub, low-mid, mid and
@@ -328,7 +437,21 @@ over time:
- inharmonicity, which shows how metallic a sound is;
- brightness relative to the note (harmonic centroid, not centroid in Hz).
Roughness, inharmonicity and flatness are also the three timbre measures that
raise judged tension (Farbood and Price 2017), so the same lanes show a build-up
getting tenser without a note change.
It places every switch-up of a drop as a point on a texture map. Two patches
that sit on the same point are why a drop sounds repetitive. A reference track
can be loaded for comparison. Display only, so it is a small build, and it fits
with Gauge and Drop compare.
### Further leads
- **Creative extrema stretch** for Crucible: Nielsen (DAFx 2026) drives an
overlap-add stretch by the spacing of local extrema, a free measure of
detail. Cheap and gritty, not transparent; a bass has few extrema per cycle,
so the stretch stays close to cycle-synchronous.
- **Reference to preset:** an offline search over a bounded set of Lathe and
Temper parameters that matches a reference switch-up (ST-ITO, TAPE). Large;
needs learned audio features.