diff options
Diffstat (limited to 'graphics/src/audio/program.rs')
| -rw-r--r-- | graphics/src/audio/program.rs | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/graphics/src/audio/program.rs b/graphics/src/audio/program.rs index 270a214..b5cc363 100644 --- a/graphics/src/audio/program.rs +++ b/graphics/src/audio/program.rs @@ -1,5 +1,5 @@ use crate::audio::{ - AUDIO_FPS, Channels, + Channels, channel::{Channel, DutyCycle}, parse, }; @@ -15,8 +15,8 @@ pub enum ChanSpec { #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Instruction { Pause, + PauseLen(u32), Jump(usize), - Tempo(u32), SetVolume(ChanSpec, u8), SetPitch(ChanSpec, u8), SetPulseDutyA(DutyCycle), @@ -42,8 +42,8 @@ pub struct Program { ins: Vec<Instruction>, pc: usize, looping: bool, - tempo: u32, - pause: u32, + pause_cnt: u32, + pause_len: u32, } impl Program { pub const fn new(ins: Vec<Instruction>, looping: bool) -> Self { @@ -52,8 +52,8 @@ impl Program { ins, pc, looping, - tempo: 120, - pause: 0, + pause_cnt: 0, + pause_len: 4, } } @@ -98,15 +98,14 @@ impl Program { use Instruction as I; match ins { I::Pause => { - // pause execution until next `exec` call - self.pause = (AUDIO_FPS * 8) / self.tempo.clamp(1, 240); + self.pause_cnt = self.pause_len; + } + I::PauseLen(pause_len) => { + self.pause_len = pause_len; } I::Jump(pc) => { self.pc = pc; } - I::Tempo(tempo) => { - self.tempo = tempo; - } I::SetVolume(chan_spec, volume) => { // set the volume (amplitude) on a given channel use ChanSpec as C; @@ -142,11 +141,11 @@ impl Program { } pub fn exec(&mut self, channels: &mut Channels) { - if self.pause > 0 { - self.pause -= 1; + if self.pause_cnt > 0 { + self.pause_cnt -= 1; } loop { - if self.pause > 0 { + if self.pause_cnt > 0 { break; } if self.finished() { |