summaryrefslogtreecommitdiff
path: root/graphics/src/audio/program.rs
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/src/audio/program.rs')
-rw-r--r--graphics/src/audio/program.rs27
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() {