#[derive(Debug, Clone)]
pub struct Gate {
source_hz: f64,
target_hz: f64,
acc: f64,
}
impl Gate {
pub(crate) fn from_hz(source_hz: f64, target_hz: f64) -> Self {
assert!(
source_hz.is_finite() && source_hz > 0.0,
"source_hz must be finite and greater than zero"
);
assert!(
target_hz.is_finite() && target_hz > 0.0,
"target_hz must be finite and greater than zero"
);
assert!(
target_hz <= source_hz,
"target_hz must be less than or equal to source_hz"
);
Self {
source_hz,
target_hz,
acc: 0.0,
}
}
pub fn source_hz(&self) -> f64 {
self.source_hz
}
pub fn target_hz(&self) -> f64 {
self.target_hz
}
#[inline]
pub fn tick(&mut self) -> bool {
self.acc += self.target_hz;
if self.acc >= self.source_hz {
self.acc -= self.source_hz;
true
} else {
false
}
}
}