zk-audio 0.1.0

Audio processing library for voice recording and enhancement
Documentation
use super::models::MicrophoneSimModel;

#[derive(Debug, Clone, Copy)]
pub struct ResonanceBand {
    pub frequency_hz: f32,
    pub gain_db: f32,
    pub q: f32,
}

#[derive(Debug, Clone, Copy)]
pub struct MicrophoneVoicing {
    pub body_gain_db: f32,
    pub body_cutoff_hz: f32,
    pub proximity_gain_db: f32,
    pub proximity_cutoff_hz: f32,
    pub low_mid_gain_db: f32,
    pub low_mid_center_hz: f32,
    pub low_mid_q: f32,
    pub presence_gain_db: f32,
    pub presence_center_hz: f32,
    pub presence_q: f32,
    pub air_gain_db: f32,
    pub air_cutoff_hz: f32,
    pub resonances: &'static [ResonanceBand],
    pub saturation_amount: f32,
}

const U87_RESONANCES: [ResonanceBand; 2] = [
    ResonanceBand {
        frequency_hz: 1_600.0,
        gain_db: 0.7,
        q: 1.1,
    },
    ResonanceBand {
        frequency_hz: 5_800.0,
        gain_db: 1.2,
        q: 0.9,
    },
];

const C414_XLII_RESONANCES: [ResonanceBand; 2] = [
    ResonanceBand {
        frequency_hz: 2_800.0,
        gain_db: 0.9,
        q: 1.05,
    },
    ResonanceBand {
        frequency_hz: 8_700.0,
        gain_db: 1.15,
        q: 0.8,
    },
];

const TLM103_RESONANCES: [ResonanceBand; 2] = [
    ResonanceBand {
        frequency_hz: 4_800.0,
        gain_db: 1.1,
        q: 0.95,
    },
    ResonanceBand {
        frequency_hz: 10_200.0,
        gain_db: 1.35,
        q: 0.75,
    },
];

const SM7B_RESONANCES: [ResonanceBand; 2] = [
    ResonanceBand {
        frequency_hz: 1_950.0,
        gain_db: 0.55,
        q: 1.0,
    },
    ResonanceBand {
        frequency_hz: 4_300.0,
        gain_db: 0.75,
        q: 1.2,
    },
];

const RCA44_RESONANCES: [ResonanceBand; 2] = [
    ResonanceBand {
        frequency_hz: 240.0,
        gain_db: 0.75,
        q: 0.85,
    },
    ResonanceBand {
        frequency_hz: 2_150.0,
        gain_db: 0.45,
        q: 1.1,
    },
];

pub fn voicing_for(model: MicrophoneSimModel) -> Option<MicrophoneVoicing> {
    match model {
        MicrophoneSimModel::Off => None,
        MicrophoneSimModel::C414Xlii => Some(c414_xlii_voicing()),
        MicrophoneSimModel::SM7B => Some(sm7b_voicing()),
        MicrophoneSimModel::Rca44 => Some(rca44_voicing()),
        MicrophoneSimModel::Tlm103 => Some(tlm103_voicing()),
        MicrophoneSimModel::U87 => Some(u87_voicing()),
    }
}

fn u87_voicing() -> MicrophoneVoicing {
    MicrophoneVoicing {
        body_gain_db: 1.1,
        body_cutoff_hz: 190.0,
        proximity_gain_db: 0.9,
        proximity_cutoff_hz: 120.0,
        low_mid_gain_db: -0.9,
        low_mid_center_hz: 380.0,
        low_mid_q: 0.85,
        presence_gain_db: 2.4,
        presence_center_hz: 3_100.0,
        presence_q: 0.95,
        air_gain_db: 1.8,
        air_cutoff_hz: 10_000.0,
        resonances: &U87_RESONANCES,
        saturation_amount: 0.03,
    }
}

fn c414_xlii_voicing() -> MicrophoneVoicing {
    MicrophoneVoicing {
        body_gain_db: 0.7,
        body_cutoff_hz: 180.0,
        proximity_gain_db: 0.6,
        proximity_cutoff_hz: 115.0,
        low_mid_gain_db: -1.0,
        low_mid_center_hz: 340.0,
        low_mid_q: 0.95,
        presence_gain_db: 2.9,
        presence_center_hz: 3_450.0,
        presence_q: 1.0,
        air_gain_db: 2.5,
        air_cutoff_hz: 11_000.0,
        resonances: &C414_XLII_RESONANCES,
        saturation_amount: 0.02,
    }
}

fn tlm103_voicing() -> MicrophoneVoicing {
    MicrophoneVoicing {
        body_gain_db: 0.4,
        body_cutoff_hz: 165.0,
        proximity_gain_db: 0.3,
        proximity_cutoff_hz: 105.0,
        low_mid_gain_db: -1.25,
        low_mid_center_hz: 330.0,
        low_mid_q: 1.0,
        presence_gain_db: 3.2,
        presence_center_hz: 4_000.0,
        presence_q: 0.95,
        air_gain_db: 2.9,
        air_cutoff_hz: 11_800.0,
        resonances: &TLM103_RESONANCES,
        saturation_amount: 0.01,
    }
}

fn sm7b_voicing() -> MicrophoneVoicing {
    MicrophoneVoicing {
        body_gain_db: 1.9,
        body_cutoff_hz: 165.0,
        proximity_gain_db: 1.3,
        proximity_cutoff_hz: 105.0,
        low_mid_gain_db: -1.2,
        low_mid_center_hz: 420.0,
        low_mid_q: 0.95,
        presence_gain_db: 1.1,
        presence_center_hz: 2_650.0,
        presence_q: 1.15,
        air_gain_db: -0.5,
        air_cutoff_hz: 9_000.0,
        resonances: &SM7B_RESONANCES,
        saturation_amount: 0.05,
    }
}

fn rca44_voicing() -> MicrophoneVoicing {
    MicrophoneVoicing {
        body_gain_db: 2.2,
        body_cutoff_hz: 185.0,
        proximity_gain_db: 1.7,
        proximity_cutoff_hz: 110.0,
        low_mid_gain_db: 0.6,
        low_mid_center_hz: 315.0,
        low_mid_q: 0.80,
        presence_gain_db: -1.0,
        presence_center_hz: 2_950.0,
        presence_q: 0.95,
        air_gain_db: -2.8,
        air_cutoff_hz: 7_400.0,
        resonances: &RCA44_RESONANCES,
        saturation_amount: 0.06,
    }
}