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,
}
}