use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)]
pub struct Envelope {
pub constant: bool,
pub volume: usize,
pub divider: usize,
pub decay: usize,
}
impl Envelope {
pub fn clock(&mut self, restart: bool) {
if self.divider == 0 {
self.divider = self.volume;
if self.decay == 0 {
if restart {
self.decay = 0xF;
}
} else {
self.decay -= 1;
}
} else {
self.divider -= 1;
}
}
pub fn value(&self) -> u32 {
if self.constant {
self.volume as u32
} else {
self.decay as u32
}
}
}