feat(anvil): add Kick lock with offset audition
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
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
Anvil gets a sidechain input named Kick. With Kick lock on, kicks are found on the undelayed sidechain, so with the lookahead each hit ducks the sub (Duck, Release) when the delayed kick plays and restarts the sub at Phase, shifted by Offset (-30 to +30 ms, also before the kick). The Audition steps the offset from -30 to +30 ms, 4 kicks each, and measures how kick and sub sum below 150 Hz after each hit; Keep takes the offset heard. On a 55 Hz kick burst against a 55 Hz sub the sum peaks at 0 ms (+2.4 dB) and nearly again one period away (+/-20 ms), so the bars check the choice by ear rather than make it.
This commit is contained in:
1 parent
330ec54150
commit
fadea4c471
15 files changed
+798
-39
No files matched your search
@@ -44,8 +44,30 @@ pub struct Settings {
|
||||
/// Round detected pitch to the nearest semitone.
|
||||
pub snap: bool,
|
||||
pub bypass: bool,
|
||||
/// Kick lock: on each kick in the sidechain, duck the sub and restart its phase.
|
||||
#[serde(default)]
|
||||
pub kick_lock: bool,
|
||||
/// How far the sub dips on each kick, in dB.
|
||||
#[serde(default = "default_kick_duck")]
|
||||
pub kick_duck: f32,
|
||||
/// Time for the sub to come back after a kick, in ms.
|
||||
#[serde(default = "default_kick_release")]
|
||||
pub kick_release: f32,
|
||||
/// When the sub restarts against the kick's start, in ms. Negative: before the kick.
|
||||
#[serde(default)]
|
||||
pub kick_offset: f32,
|
||||
}
|
||||
const GHOST_FROM: f32 = 300.;
|
||||
const KICK_DUCK: f32 = 6.;
|
||||
const KICK_RELEASE: f32 = 80.;
|
||||
/// Range of the kick offset, in ms either side of the kick.
|
||||
pub const KICK_OFFSET_MAX: f32 = 30.;
|
||||
fn default_kick_duck() -> f32 {
|
||||
KICK_DUCK
|
||||
}
|
||||
fn default_kick_release() -> f32 {
|
||||
KICK_RELEASE
|
||||
}
|
||||
fn default_ghost_from() -> f32 {
|
||||
GHOST_FROM
|
||||
}
|
||||
@@ -68,6 +90,10 @@ impl Default for Settings {
|
||||
retrigger: true,
|
||||
snap: true,
|
||||
bypass: false,
|
||||
kick_lock: false,
|
||||
kick_duck: KICK_DUCK,
|
||||
kick_release: KICK_RELEASE,
|
||||
kick_offset: 0.,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -85,6 +111,9 @@ impl Settings {
|
||||
self.gate,
|
||||
self.keep,
|
||||
self.output,
|
||||
self.kick_duck,
|
||||
self.kick_release,
|
||||
self.kick_offset,
|
||||
]
|
||||
.iter()
|
||||
.all(|v| v.is_finite());
|
||||
@@ -102,7 +131,10 @@ impl Settings {
|
||||
&& (0.0..=360.).contains(&self.phase)
|
||||
&& (-60.0..=-20.).contains(&self.gate)
|
||||
&& (0.0..=100.).contains(&self.keep)
|
||||
&& (-12.0..=12.).contains(&self.output);
|
||||
&& (-12.0..=12.).contains(&self.output)
|
||||
&& (0.0..=24.).contains(&self.kick_duck)
|
||||
&& (10.0..=300.).contains(&self.kick_release)
|
||||
&& (-KICK_OFFSET_MAX..=KICK_OFFSET_MAX).contains(&self.kick_offset);
|
||||
if ok {
|
||||
Ok(())
|
||||
} else {
|
||||
|
||||
Reference in new issue
Block a user