66 lines
1.7 KiB
Rust
66 lines
1.7 KiB
Rust
use crate::insert_coin::SimplePwmCore;
|
|
use ch32_hal::println;
|
|
use ch32_hal::timer::GeneralInstance16bit;
|
|
use wavetable_synth::{synthesizer::SimpleWavetableSynthesizer, wavetable::SimpleWavetable};
|
|
|
|
const SQUARE_WAVETABLE: [u8; 2] = [0, 100];
|
|
// const SQUARE_WAVETABLE: [u8; 32] = [
|
|
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
// 100, 100, 100, 100, 100, 100, 100,
|
|
// ];
|
|
|
|
pub struct SynthesizerService {
|
|
pub synth: SimpleWavetableSynthesizer<SimpleWavetable<'static, u8>>,
|
|
pub enabled: bool,
|
|
pub need_service: bool,
|
|
}
|
|
|
|
impl SynthesizerService {
|
|
pub fn new(clock_freq_hz: usize) -> Self {
|
|
let square_wt = SimpleWavetable::new(&SQUARE_WAVETABLE);
|
|
let synth = SimpleWavetableSynthesizer::new(square_wt, clock_freq_hz);
|
|
|
|
Self {
|
|
synth,
|
|
enabled: true,
|
|
need_service: false,
|
|
}
|
|
}
|
|
|
|
pub fn tick(&mut self) {
|
|
if self.enabled {
|
|
self.synth.tick();
|
|
}
|
|
}
|
|
|
|
pub fn need_service(&self) -> bool {
|
|
self.need_service || (self.enabled && self.synth.has_new_output())
|
|
}
|
|
|
|
pub fn service(&mut self) -> Option<u8> {
|
|
self.need_service = false;
|
|
if self.enabled {
|
|
Some(self.synth.get_output())
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
}
|
|
|
|
impl SynthesizerService {
|
|
pub fn set_freq(&mut self, freq_hz: usize) {
|
|
self.synth.set_freq(freq_hz);
|
|
}
|
|
|
|
pub fn enable(&mut self) {
|
|
self.enabled = true;
|
|
self.need_service = true;
|
|
// TODO: write the enable function
|
|
}
|
|
|
|
pub fn disable(&mut self) {
|
|
self.enabled = false;
|
|
self.need_service = true;
|
|
// TODO: write the disable function
|
|
}
|
|
}
|