summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-11-22 01:00:53 -0500
committerFreya Murphy <freya@freyacat.org>2025-11-22 01:00:53 -0500
commit20dc6941752047a2e94176340a1297304dc7f123 (patch)
tree032826be32887e777138fa199025fa0f77670ce1
parentaudio: fix tempo (off by one, rahhhgit status!) (diff)
downloadDungeonCrawl-20dc6941752047a2e94176340a1297304dc7f123.tar.gz
DungeonCrawl-20dc6941752047a2e94176340a1297304dc7f123.tar.bz2
DungeonCrawl-20dc6941752047a2e94176340a1297304dc7f123.zip
audio: change tempo -> pause_len
-rw-r--r--graphics/src/audio/data.rs3
-rw-r--r--graphics/src/audio/parse/lex.rs6
-rw-r--r--graphics/src/audio/parse/parser.rs4
-rw-r--r--graphics/src/audio/program.rs27
4 files changed, 19 insertions, 21 deletions
diff --git a/graphics/src/audio/data.rs b/graphics/src/audio/data.rs
index 5011758..8ed95bb 100644
--- a/graphics/src/audio/data.rs
+++ b/graphics/src/audio/data.rs
@@ -3,7 +3,7 @@ use crate::audio::{parse, program::Program};
const MELODY: &str = r#"
; setup
a v100 d50
-o120
+P4
%define notes
a p$1 v100 - a v0 -
@@ -34,7 +34,6 @@ const BASE: &str = r#"
; setup
b v100 d50
-o120
%define notes
b p$1 v100 -- b v0 --
diff --git a/graphics/src/audio/parse/lex.rs b/graphics/src/audio/parse/lex.rs
index a349c53..9969c9e 100644
--- a/graphics/src/audio/parse/lex.rs
+++ b/graphics/src/audio/parse/lex.rs
@@ -12,8 +12,8 @@ pub enum Token {
Eof,
LineSeparator,
Pause(usize),
+ PauseLen(u32),
Jump(usize),
- Tempo(u32),
ChanSpec(ChanSpec),
SetVolume(u8),
SetPitch(u8),
@@ -179,8 +179,8 @@ impl<'s> Lexer<'s> {
'-' => self.next_pause()?,
// jump
'j' => T::Jump(self.next_int()?),
- // tempO
- 'o' => T::Tempo(self.next_int()?),
+ // pause len
+ 'P' => T::PauseLen(self.next_int()?),
// eof
'\0' => T::Eof,
// new line
diff --git a/graphics/src/audio/parse/parser.rs b/graphics/src/audio/parse/parser.rs
index 23ba8a4..5157fa1 100644
--- a/graphics/src/audio/parse/parser.rs
+++ b/graphics/src/audio/parse/parser.rs
@@ -87,9 +87,9 @@ impl<'s> Parser<'s> {
self.next()?;
prog.push(Instruction::Jump(pc));
}
- Token::Tempo(tempo) => {
+ Token::PauseLen(pause_len) => {
self.next()?;
- prog.push(Instruction::Tempo(tempo));
+ prog.push(Instruction::PauseLen(pause_len));
}
_ => self.parse_line(&mut prog)?,
}
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() {