From 696ab0aadc346f1046f35419a558c291097c521f Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Sat, 22 Nov 2025 00:12:34 -0500 Subject: audio: add temp changing --- graphics/src/audio/data.rs | 8 +++++--- graphics/src/audio/mod.rs | 4 +++- graphics/src/audio/parse/lex.rs | 7 +++++-- graphics/src/audio/parse/parser.rs | 4 ++++ graphics/src/audio/program.rs | 8 ++++++-- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/graphics/src/audio/data.rs b/graphics/src/audio/data.rs index 8cbdf45..5011758 100644 --- a/graphics/src/audio/data.rs +++ b/graphics/src/audio/data.rs @@ -3,13 +3,14 @@ use crate::audio::{parse, program::Program}; const MELODY: &str = r#" ; setup a v100 d50 +o120 %define notes a p$1 v100 - a v0 - a p$1 v100 - a v0 - a pd4 v100 -- a v0 -- a pa4 v100 -- a v0 -- -- -a pg3s v100 - a v0 - -- +a pg3# v100 - a v0 - -- a pg3 v100 - a v0 - -- a pf3 v100 --- a v0 - a pd3 v100 - a v0 - @@ -20,12 +21,12 @@ a pg3 v100 - a v0 - notes d3 notes c3 notes b3 -notes b3f +notes b3b notes d3 notes c3 notes b3 -notes b3f +notes b3b "#; const BASE: &str = r#" @@ -33,6 +34,7 @@ const BASE: &str = r#" ; setup b v100 d50 +o120 %define notes b p$1 v100 -- b v0 -- diff --git a/graphics/src/audio/mod.rs b/graphics/src/audio/mod.rs index 473c05b..a8c24ad 100644 --- a/graphics/src/audio/mod.rs +++ b/graphics/src/audio/mod.rs @@ -12,7 +12,9 @@ mod data; mod parse; mod program; -pub const TIME_SLICE: Duration = Duration::from_millis(1000 / 60); +const AUDIO_FPS: u32 = 60; + +pub const TIME_SLICE: Duration = Duration::from_millis(1000 / AUDIO_FPS as u64); /// Holds each audio channel pub struct Channels { diff --git a/graphics/src/audio/parse/lex.rs b/graphics/src/audio/parse/lex.rs index f2500da..a349c53 100644 --- a/graphics/src/audio/parse/lex.rs +++ b/graphics/src/audio/parse/lex.rs @@ -13,6 +13,7 @@ pub enum Token { LineSeparator, Pause(usize), Jump(usize), + Tempo(u32), ChanSpec(ChanSpec), SetVolume(u8), SetPitch(u8), @@ -96,11 +97,11 @@ impl<'s> Lexer<'s> { }?; let off = match self.peek()? { - 's' => { + '#' => { self.next()?; 1 } - 'f' => { + 'b' => { self.next()?; -1 } @@ -178,6 +179,8 @@ impl<'s> Lexer<'s> { '-' => self.next_pause()?, // jump 'j' => T::Jump(self.next_int()?), + // tempO + 'o' => T::Tempo(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 fbe5f4c..23ba8a4 100644 --- a/graphics/src/audio/parse/parser.rs +++ b/graphics/src/audio/parse/parser.rs @@ -87,6 +87,10 @@ impl<'s> Parser<'s> { self.next()?; prog.push(Instruction::Jump(pc)); } + Token::Tempo(tempo) => { + self.next()?; + prog.push(Instruction::Tempo(tempo)); + } _ => self.parse_line(&mut prog)?, } } diff --git a/graphics/src/audio/program.rs b/graphics/src/audio/program.rs index f31be06..91f0608 100644 --- a/graphics/src/audio/program.rs +++ b/graphics/src/audio/program.rs @@ -1,5 +1,5 @@ use crate::audio::{ - Channels, + AUDIO_FPS, Channels, channel::{Channel, DutyCycle}, parse, }; @@ -16,6 +16,7 @@ pub enum ChanSpec { pub enum Instruction { Pause, Jump(usize), + Tempo(u32), SetVolume(ChanSpec, u8), SetPitch(ChanSpec, u8), SetPulseDutyA(DutyCycle), @@ -98,11 +99,14 @@ impl Program { match ins { I::Pause => { // pause execution until next `exec` call - self.pause = self.tempo / 60; + self.pause = (AUDIO_FPS * 4) / self.tempo.clamp(1, 240); } 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; -- cgit v1.2.3-freya