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:
1 parent
d536e3127a
commit
8ecdc03832
1 file changed
+133
-10
+133
-10
@@ -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.
|
||||
Reference in new issue
Block a user