Check and Windows preview / check (anvil) (push) Successful in 2m1s
Check and Windows preview / check (crucible) (push) Successful in 1m31s
Check and Windows preview / check (knurl) (push) Successful in 2m4s
Check and Windows preview / check (lathe) (push) Successful in 1m27s
Check and Windows preview / check (patina) (push) Successful in 1m54s
Check and Windows preview / check (rivet) (push) Successful in 1m30s
Check and Windows preview / check (temper) (push) Successful in 1m31s
Check and Windows preview / check (weld) (push) Successful in 2m31s
Check and Windows preview / previews (push) Successful in 1m26s
Independent plugin release / plan (push) Successful in 7s
Check and Windows preview / windows (push) Successful in 2m26s
Independent plugin release / build (push) Successful in 3m0s
Independent plugin release / publish (push) Successful in 8s
Knurl follows the played note and treats every cycle of the wave on its own: a repeating level pattern over 1-16 cycles makes subharmonics in tune with every note, random level and timing per cycle add rattle, and a noise burst per cycle, highpassed at a multiple of f0, adds grit. Amounts are counted in cycles, so the texture is the same on F1 and on C2. - Cycle clock from the shared note tracker, restarted at each note; the audio is delayed by the lookahead plus 4.2 ms of timing-jitter headroom. - Per-cycle randomness from a hash of the cycle number: Same every note or Free. - Patterns Off, Double, Triple, Fry (default), Gallop, Stutter or drawn; grit switchable per step. Pattern persisted as knurl-pattern. - Editor: last eight cycles overlaid, pattern bars with the playing step. - Tests match the prototype: Double gives f0/2 at -8.19 dB, Triple f0/3 at -10.68 dB, equal on F1 and C2, no added clicks, bit-exact when off, no allocation on the audio thread.
87 lines
4.4 KiB
Markdown
87 lines
4.4 KiB
Markdown
# Knurl
|
||
|
||
Knurl gives every cycle of the note its own level, timing and grit. Current
|
||
version **0.1.0**.
|
||
|
||
Knurling presses a ridged pattern into metal. Riddim and dubstep basses get their
|
||
character the same way, from surface texture: rattle, growl, fry, grit. Usually
|
||
that texture comes from long chains of distortion, comb filters, formants and
|
||
resampling, and it changes from note to note. Knurl works on single cycles of the
|
||
wave instead. It follows the played note and treats each cycle on its own, and
|
||
every amount is counted in cycles, not in Hz or tempo. So the texture has the
|
||
same grain on F1 and on C2.
|
||
|
||

|
||
|
||
## Install on Windows
|
||
|
||
Copy `Knurl.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 Knurl in a mixer slot of the bass. Keep the font license with
|
||
redistributed packages.
|
||
|
||
## Work with it
|
||
|
||
1. Play the bass. The note readout shows what Knurl tracks; the scope overlays
|
||
the last eight cycles of the output, so the texture is visible cycle by cycle.
|
||
2. Choose a **Pattern**. The pattern sets the level of each cycle and repeats:
|
||
- **Double** (0, −9 dB): every second cycle quieter. This makes a sub-octave
|
||
growl, exactly in tune, about 8 dB under the fundamental.
|
||
- **Triple** (0, −12, −12 dB): a growl an octave and a fifth down.
|
||
- **Fry** (0, −14, −5, −14 dB, the default): an uneven vocal-fry rattle.
|
||
- **Gallop** and **Stutter**: rhythmic patterns over six and eight cycles.
|
||
- **Off**: every cycle at full level.
|
||
3. Draw your own pattern on the bars: drag a bar to set the level of that cycle,
|
||
double-click to reset it. **Steps** sets the length (1–16 cycles).
|
||
4. Add surface:
|
||
- **Level** gives every cycle a random level (standard deviation in dB).
|
||
- **Time** moves every cycle a little in time (percent of a period): rattle
|
||
and scrape.
|
||
- **Grit** adds a short noise burst inside every cycle. **Tone** sets its
|
||
lowest frequency in harmonics of the note, **Position** where in the cycle
|
||
it sits, and **Length** how long it is. The squares under the pattern bars
|
||
switch the burst per step.
|
||
5. **Edge** sets how soft each step change is. Low values are sharper and
|
||
buzzier; high values smoother.
|
||
|
||
**Random**: **Same every note** (default) restarts every random sequence at each
|
||
note, so identical notes sound identical, which keeps a riddim line tight.
|
||
**Free** lets the sequences run on, so every note differs.
|
||
|
||
**Mix** blends with the delayed dry signal; **Output** trims the level.
|
||
|
||
### 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 Knurl. In FL Studio, set the
|
||
bass channel's MIDI output port and Knurl's input port to the same number.
|
||
**Gate** sets the input level that counts as a note in AUDIO mode; **Snap to
|
||
semitone** rounds the detected pitch (turn it off for slides).
|
||
|
||
## Timing and limits
|
||
|
||
Knurl delays the audio by about 71 ms: 67 ms of pitch-detection lookahead plus
|
||
4 ms of room for the timing jitter. The delay is reported to the host for delay
|
||
compensation, so the cycle clock knows every note before its attack leaves the
|
||
plugin. The cycle clock restarts at every note start, so the pattern always
|
||
begins with step 1 on the attack. Pitch range is 30–500 Hz, one note at a time.
|
||
Between notes the effects fade out over 20 ms, so tails stay clean.
|
||
|
||
Knurl works per cycle of the tracked pitch; it does not look for cycle borders in
|
||
the waveform. With a stable pitch that is the same thing. With heavy pitch
|
||
modulation inside a note the pattern follows the tracked pitch, which can lag a
|
||
fast bend. Both channels get the same treatment, so the effect is mono-safe.
|
||
|
||
## How it works
|
||
|
||
A note tracker (shared with Anvil, Lathe and Temper) detects pitch and note
|
||
starts ahead of the delayed audio. A cycle clock starts at 0 on every note and
|
||
advances by f0 / sample rate. Each cycle gets its step gain and its random level
|
||
and time offset from a hash of the cycle number, so the result is deterministic.
|
||
Step changes are raised-cosine crossfades over the last **Edge** of a cycle;
|
||
level jitter crossfades over half a cycle and time jitter over the whole cycle,
|
||
read from the delay line with cubic interpolation. The grit is white noise
|
||
through a state-variable highpass at **Tone** × f0, shaped by a sin² window and
|
||
scaled to the input level. There is no nonlinearity, so no oversampling is
|
||
needed.
|