implemented some crossfade curves

This commit is contained in:
Weird Constructor 2021-08-07 10:00:42 +02:00
parent ca871c78d1
commit d529156bb8

View file

@ -249,11 +249,54 @@ impl SplitMix64 {
} }
} }
/// Linear crossfade.
///
/// * `v1` - signal 1, range -1.0 to 1.0
/// * `v2` - signal 2, range -1.0 to 1.0
/// * `mix` - mix position, range 0.0 to 1.0, mid is at 0.5
#[inline] #[inline]
pub fn crossfade(v1: f32, v2: f32, mix: f32) -> f32 { pub fn crossfade(v1: f32, v2: f32, mix: f32) -> f32 {
v1 * (1.0 - mix) + v2 * mix v1 * (1.0 - mix) + v2 * mix
} }
/// Constant power crossfade.
///
/// * `v1` - signal 1, range -1.0 to 1.0
/// * `v2` - signal 2, range -1.0 to 1.0
/// * `mix` - mix position, range 0.0 to 1.0, mid is at 0.5
#[inline]
pub fn crossfade_cpow(v1: f32, v2: f32, mix: f32) -> f32 {
let s1 = (mix * std::f32::consts::FRAC_PI_2).sin();
let s2 = ((1.0 - mix) * std::f32::consts::FRAC_PI_2).sin();
v1 * s2 + v2 * s1
}
const CROSS_LOG_MIN : f32 = -13.815510557964274; // (0.000001_f32).ln();
const CROSS_LOG_MAX : f32 = 0.0; // (1.0_f32).ln();
/// Logarithmic crossfade.
///
/// * `v1` - signal 1, range -1.0 to 1.0
/// * `v2` - signal 2, range -1.0 to 1.0
/// * `mix` - mix position, range 0.0 to 1.0, mid is at 0.5
#[inline]
pub fn crossfade_log(v1: f32, v2: f32, mix: f32) -> f32 {
let x =
(mix * (CROSS_LOG_MAX - CROSS_LOG_MIN) + CROSS_LOG_MIN)
.exp();
crossfade(v1, v2, x)
}
/// Exponential crossfade.
///
/// * `v1` - signal 1, range -1.0 to 1.0
/// * `v2` - signal 2, range -1.0 to 1.0
/// * `mix` - mix position, range 0.0 to 1.0, mid is at 0.5
#[inline]
pub fn crossfade_exp(v1: f32, v2: f32, mix: f32) -> f32 {
crossfade(v1, v2, mix * mix)
}
#[inline] #[inline]
pub fn clamp(f: f32, min: f32, max: f32) -> f32 { pub fn clamp(f: f32, min: f32, max: f32) -> f32 {
if f < min { min } if f < min { min }