use crate::unit::{GroupIdx, GroupSamples};
#[must_use]
pub struct Overdrive {
pub on: bool,
pub group: GroupIdx,
pub cut_percent: f32,
pub amp_mul: f32,
pub(crate) cut_16bit_top: i32,
}
impl Default for Overdrive {
fn default() -> Self {
Self {
on: false,
group: GroupIdx(0),
cut_percent: 0.0,
amp_mul: 0.0,
cut_16bit_top: 0,
}
}
}
impl Overdrive {
pub const CUT_VALID_RANGE: std::ops::RangeInclusive<f32> = 50.0..=99.9;
pub const AMP_VALID_RANGE: std::ops::RangeInclusive<f32> = 0.1..=8.0;
#[expect(clippy::cast_possible_truncation, clippy::cast_precision_loss)]
pub(crate) fn tone_supple(&self, group_smps: &mut GroupSamples) {
if !self.on {
return;
}
let mut work: i32 = group_smps[self.group.usize()];
if work > self.cut_16bit_top {
work = self.cut_16bit_top;
} else if work < -self.cut_16bit_top {
work = -self.cut_16bit_top;
}
group_smps[self.group.usize()] = (work as f32 * self.amp_mul) as i32;
}
#[expect(clippy::cast_possible_truncation)]
pub fn rebuild(&mut self) {
self.cut_16bit_top = (32767.0 * (100.0 - self.cut_percent) / 100.0) as i32;
}
}