use wasm4_sys::tone;
use super::{adsr::Adsr, frequency_slide::FrequencySlide, tone_flags::ToneFlags, volume::Volume};
#[derive(Clone, Default)]
#[cfg_attr(not(target_family = "wasm"), derive(PartialEq, Eq, Debug))]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
pub struct Tone {
pub frequency: FrequencySlide,
pub duration: Adsr,
pub volume: Volume,
pub flags: ToneFlags,
}
impl Tone {
pub const fn builder() -> ToneBuilder {
ToneBuilder::new()
}
pub const fn new() -> Self {
Self {
frequency: FrequencySlide::new(220),
duration: Adsr::new(0, 0, 1, 0),
volume: Volume::new(100),
flags: ToneFlags::new(),
}
}
pub fn with_frequency(&self, freq: FrequencySlide) -> Tone {
let mut new_tone = self.clone();
new_tone.frequency = freq;
new_tone
}
pub fn to_binary(&self) -> (u32, u32, u16, u16) {
(
u32::from(self.frequency),
u32::from(self.duration),
u16::from(self.volume),
u16::from(self.flags),
)
}
pub fn play(&self) {
tone(
self.frequency.into(),
self.duration.into(),
u16::from(self.volume) as u32,
u16::from(self.flags) as u32,
);
}
}
pub struct ToneBuilder {
tone: Tone,
}
impl ToneBuilder {
pub const fn new() -> Self {
Self { tone: Tone::new() }
}
pub const fn with_frequency(mut self, frequency: FrequencySlide) -> Self {
self.tone.frequency = frequency;
self
}
pub const fn with_duration(mut self, duration: Adsr) -> Self {
self.tone.duration = duration;
self
}
pub const fn with_volume(mut self, volume: Volume) -> Self {
self.tone.volume = volume;
self
}
pub const fn with_flags(mut self, flags: ToneFlags) -> Self {
self.tone.flags = flags;
self
}
pub const fn build(self) -> Tone {
self.tone
}
pub fn play(&self) {
self.tone.play()
}
}
impl Default for ToneBuilder {
fn default() -> Self {
Self::new()
}
}