mod discrete;
mod linear;
mod linear_base;
mod log2;
mod power;
pub use discrete::DiscreteMap;
pub use linear::LinearMap;
pub use log2::Log2Map;
pub use power::PowerMap;
#[derive(Debug)]
pub enum Mapper {
Lin(LinearMap),
Pow(PowerMap),
Log2(Log2Map),
Discrete(DiscreteMap),
}
#[derive(Debug)]
pub enum Unit {
Generic,
Decibels { neg_infinity_clamp: Option<f32> },
}
#[derive(Debug)]
pub struct NormalMap {
pub mapper: Mapper,
}
impl NormalMap {
pub fn linear(min: f32, max: f32, unit: Unit) -> Self {
Self {
mapper: Mapper::Lin(LinearMap::new(min, max, unit)),
}
}
pub fn power(min: f32, max: f32, exponent: f32, unit: Unit) -> Self {
Self {
mapper: Mapper::Pow(PowerMap::new(min, max, exponent, unit)),
}
}
pub fn log2(min: f32, max: f32) -> Self {
Self {
mapper: Mapper::Log2(Log2Map::new(min, max)),
}
}
pub fn discrete<T>(min: T, max: T) -> Self
where
T: From<isize> + Into<isize> + Copy + Clone,
{
Self {
mapper: Mapper::Discrete(DiscreteMap::new(min, max)),
}
}
pub fn normalize(&self, value: f32) -> f32 {
match &self.mapper {
Mapper::Lin(mapper) => mapper.normalize(value),
Mapper::Pow(mapper) => mapper.normalize(value),
Mapper::Log2(mapper) => mapper.normalize(value),
Mapper::Discrete(mapper) => mapper.normalize_float(value),
}
}
pub fn normalize_array(&self, in_values: &[f32], out_normalized: &mut [f32]) {
match &self.mapper {
Mapper::Lin(mapper) => mapper.normalize_array(in_values, out_normalized),
Mapper::Pow(mapper) => mapper.normalize_array(in_values, out_normalized),
Mapper::Log2(mapper) => mapper.normalize_array(in_values, out_normalized),
Mapper::Discrete(mapper) => mapper.normalize_array_float(in_values, out_normalized),
}
}
pub fn denormalize(&self, normalized: f32) -> f32 {
match &self.mapper {
Mapper::Lin(mapper) => mapper.denormalize(normalized),
Mapper::Pow(mapper) => mapper.denormalize(normalized),
Mapper::Log2(mapper) => mapper.denormalize(normalized),
Mapper::Discrete(mapper) => mapper.denormalize_float(normalized),
}
}
pub fn denormalize_array(&self, in_normalized: &[f32], out_values: &mut [f32]) {
match &self.mapper {
Mapper::Lin(mapper) => mapper.denormalize_array(in_normalized, out_values),
Mapper::Pow(mapper) => mapper.denormalize_array(in_normalized, out_values),
Mapper::Log2(mapper) => mapper.denormalize_array(in_normalized, out_values),
Mapper::Discrete(mapper) => mapper.denormalize_array_float(in_normalized, out_values),
}
}
}