From 37e9626b240883567c2fb35f82f852337aa552bd Mon Sep 17 00:00:00 2001 From: annieversary Date: Thu, 16 Sep 2021 15:26:41 +0200 Subject: [PATCH] [utils] add various crossfading things --- crates/utils/src/crossfade.rs | 30 ++++++++++++++++++++++++++++++ crates/utils/src/lib.rs | 1 + 2 files changed, 31 insertions(+) create mode 100644 crates/utils/src/crossfade.rs diff --git a/crates/utils/src/crossfade.rs b/crates/utils/src/crossfade.rs new file mode 100644 index 0000000..fe41fc7 --- /dev/null +++ b/crates/utils/src/crossfade.rs @@ -0,0 +1,30 @@ +/// Linear crossfade +/// x is the crossfading param, [0, 1] +/// Returns (fade_in, fade_out) +pub fn lin_crossfade(x: f32) -> (f32, f32) { + (x, 1.0 - x) +} + +// next two are from https://signalsmith-audio.co.uk/writing/2021/cheap-energy-crossfade/ + +/// Amplitude preserving crossfade +/// x is the crossfading param, [0, 1] +/// Returns (fade_in, fade_out) +pub fn ap_crossfade(x: f32) -> (f32, f32) { + let fin = x * x * (3.0 - 2.0 * x); + + (fin, 1.0 - fin) +} + +/// Energy preserving crossfade +/// x is the crossfading param, [0, 1] +/// Returns (fade_in, fade_out) +pub fn ep_crossfade(x: f32) -> (f32, f32) { + let x2 = 1.0 - x; + let a = x * x2; + let b = a * (1.0 + 1.4186 * a); + let c = b + x; + let d = b + x2; + + (c * c, d * d) +} diff --git a/crates/utils/src/lib.rs b/crates/utils/src/lib.rs index ca2b3c2..adbb2ee 100644 --- a/crates/utils/src/lib.rs +++ b/crates/utils/src/lib.rs @@ -1,4 +1,5 @@ pub mod buffers; +pub mod crossfade; pub mod delay; pub mod envelope; pub mod logs;