Split slew computation in Hard Vacuum
This commit is contained in:
parent
c748d79963
commit
b9045a2aa8
|
@ -56,6 +56,26 @@ impl HardVacuum {
|
||||||
///
|
///
|
||||||
/// Output scaling and dry/wet mixing should be done externally.
|
/// Output scaling and dry/wet mixing should be done externally.
|
||||||
pub fn process(&mut self, input: f32, params: &Params) -> f32 {
|
pub fn process(&mut self, input: f32, params: &Params) -> f32 {
|
||||||
|
let slew = self.compute_slew(input);
|
||||||
|
|
||||||
|
self.process_with_slew(input, params, slew)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compute only the slew value. Used together with `process_with_slew()` to compute the slews,
|
||||||
|
/// upsample that, and then process the upsampled signal using those upsampled slews so the
|
||||||
|
/// oversampled version ends up sounding more similar to the original algorithm.
|
||||||
|
pub fn compute_slew(&mut self, input: f32) -> f32 {
|
||||||
|
// AW: skew will be direction/angle
|
||||||
|
let skew = input - self.last_sample;
|
||||||
|
self.last_sample = input;
|
||||||
|
|
||||||
|
skew
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The same as `process()`, but with an externally computed slew value (`input - last_value`).
|
||||||
|
/// This is useful for the oversampled version of this algorithm as we can upsample the slew
|
||||||
|
/// signal separately.
|
||||||
|
pub fn process_with_slew(&self, input: f32, params: &Params, slew: f32) -> f32 {
|
||||||
// We'll skip a couple unnecessary things here like the dithering and the manual denormal
|
// We'll skip a couple unnecessary things here like the dithering and the manual denormal
|
||||||
// evasion
|
// evasion
|
||||||
nih_debug_assert!((0.0..=2.0).contains(¶ms.drive));
|
nih_debug_assert!((0.0..=2.0).contains(¶ms.drive));
|
||||||
|
@ -69,7 +89,7 @@ impl HardVacuum {
|
||||||
// AW: We're doing all this here so skew isn't incremented by each stage
|
// AW: We're doing all this here so skew isn't incremented by each stage
|
||||||
let skew = {
|
let skew = {
|
||||||
// AW: skew will be direction/angle
|
// AW: skew will be direction/angle
|
||||||
let skew = input - self.last_sample;
|
let skew = slew;
|
||||||
// AW: for skew we want it to go to zero effect again, so we use full range of the sine
|
// AW: for skew we want it to go to zero effect again, so we use full range of the sine
|
||||||
let bridge_rectifier = skew.abs().min(PI).sin();
|
let bridge_rectifier = skew.abs().min(PI).sin();
|
||||||
|
|
||||||
|
@ -79,7 +99,6 @@ impl HardVacuum {
|
||||||
// and this one has an additional 5 in there.
|
// and this one has an additional 5 in there.
|
||||||
skew.signum() * bridge_rectifier * params.aura * input * ALMOST_FRAC_PI_2
|
skew.signum() * bridge_rectifier * params.aura * input * ALMOST_FRAC_PI_2
|
||||||
};
|
};
|
||||||
self.last_sample = input;
|
|
||||||
|
|
||||||
// AW: WE MAKE LOUD NOISE! RAWWWK!
|
// AW: WE MAKE LOUD NOISE! RAWWWK!
|
||||||
let mut remaining_distortion_stages = if params.drive > 1.0 {
|
let mut remaining_distortion_stages = if params.drive > 1.0 {
|
||||||
|
|
Loading…
Reference in a new issue