use super::value::integer_control; use crate::parameter::bin_enum; use mfctl_derive::author; #[author] #[serde(default, rename_all = "camelCase", deny_unknown_fields)] pub struct Vocoder { /// Off disables hiss; Switched uses noise for unvoiced sounds; Pass mixes input above 5 kHz with the vocoder output. pub hiss_mode: Mode, /// Hiss volume in dB for Switched and Pass modes. pub hiss_level: HissLevel, } impl Default for Vocoder { fn default() -> Self { Self { hiss_mode: Mode::default(), hiss_level: HissLevel(0), } } } bin_enum! { pub enum Mode { #[default] Off, Switched, Pass, } } integer_control!(HissLevel, i8, -20, 0); #[cfg(test)] mod tests { use super::*; use crate::parameter::{RegisterCodec, StoredValue}; use crate::patch::value::tests::check_integer_controls; use garde::Validate; #[test] fn integer_controls_round_trip_their_entire_author_ranges() { check_integer_controls!(HissLevel: -20 => 0); } }