From fbfb3ad0f70ebbc5db9e5d5fc41c53c15b082d9d Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Sat, 22 Nov 2025 16:00:35 -0500 Subject: audio: some changes --- assets/asm/explore_harmony1.asm | 74 ++++++++++++++++++++++++++++++++++++++ assets/asm/explore_harmony2.asm | 26 ++++++++++++++ assets/asm/explore_melody.asm | 80 +++++++++++++++++++++++++++++++++++++++++ audio/src/data.rs | 13 +++++-- audio/src/lib.rs | 1 + audio/src/parse/macros.rs | 4 ++- audio/src/program.rs | 22 ++++++++---- game/src/lib.rs | 3 ++ 8 files changed, 214 insertions(+), 9 deletions(-) create mode 100644 assets/asm/explore_harmony1.asm create mode 100644 assets/asm/explore_harmony2.asm create mode 100644 assets/asm/explore_melody.asm diff --git a/assets/asm/explore_harmony1.asm b/assets/asm/explore_harmony1.asm new file mode 100644 index 0000000..d313de2 --- /dev/null +++ b/assets/asm/explore_harmony1.asm @@ -0,0 +1,74 @@ +; explore +; track: harmony1 + +; setup +P5 +a d12 + +%define first +-- +a v50 +a pe3 -- +a pa4 -- +a pc4 -- +a pe4 -- +a pc4 -- +a pa4 -- +a pe3 -- +a v0 +%end + +%define second +-- +a v50 +a pe3 -- +a pg3 -- +a pb4 -- +a pe4 -- +a pb4 -- +a pg3 -- +a pe3 -- +a v0 +%end + +%define third +-- +a v50 +a pe3 v50 -- +a pg3 v50 -- +a pc4 v50 -- +a pe4 v50 -- +a pc4 v50 -- +a pg3 v50 -- +a pe3 v50 -- +a v0 +%end + +%define fourth +-- +a v50 +a pd3 v50 -- +a pg3 v50 -- +a pb4 v50 -- +a pd4 v50 -- +a pb4 v50 -- +a pg3 v50 -- +a pd3 v50 -- +a v0 +%end + +%define notes +first +first +second +second +third +third +fourth +fourth +%end + +notes +notes +notes +notes diff --git a/assets/asm/explore_harmony2.asm b/assets/asm/explore_harmony2.asm new file mode 100644 index 0000000..9046fbb --- /dev/null +++ b/assets/asm/explore_harmony2.asm @@ -0,0 +1,26 @@ +; explore +; track: harmony2 + +; setup +P5 +t v50 + +%define note +t p$1 -32 +%end + +%define notes +note a5 +note b5 +note c5 +note b5 +note b5b +note a5 +note b5b +note b5 +%end + +notes +notes +notes +notes diff --git a/assets/asm/explore_melody.asm b/assets/asm/explore_melody.asm new file mode 100644 index 0000000..4642395 --- /dev/null +++ b/assets/asm/explore_melody.asm @@ -0,0 +1,80 @@ +; explore +; track: melody + +; wait +-256 + +; setup +b v100 d50 + +%define rest +b v0 -1 +b v100 +%end + +%define erest +b v0 -4 +b v100 +%end + +%define snote +b p$1 -2 +%end + +%define enote +b p$1 -4 +%end + +%define qnote +b p$1 -8 +%end + +%define hnote +b p$1 -16 +%end + +%define cnote +b p$1 -$2 +%end + +qnote a4 +qnote e3 +qnote a4 +qnote c4 +qnote b4 +qnote a4 +hnote g3 + +qnote c4 +qnote g3 +qnote c4 +qnote e4 +qnote d4 +cnote c4 3 +cnote d4 3 +cnote c4 2 +cnote b4 11 +rest +snote b4 +snote c4 + +qnote d4 +qnote b4b +qnote g3 +enote a4 +enote b4 +qnote c4 +qnote a4 +cnote f3 12 +enote a4 + +cnote b4b 12 +enote c4 +qnote d4 +enote c4 +enote b4 +rest +cnote b4 11 +enote c4 +qnote b4 +qnote g3 diff --git a/audio/src/data.rs b/audio/src/data.rs index 2d1bdc5..e63254d 100644 --- a/audio/src/data.rs +++ b/audio/src/data.rs @@ -11,20 +11,29 @@ macro_rules! load_asm { Program::parse(&src, true)? } }}; - ($first:tt, $($arg:tt)*) => { + ($first:tt, $($arg:tt),*) => { load_asm!($first)$(.merge(load_asm!($arg)))* }; } pub struct Data { + pub explore: Program, pub megalovania: Program, } impl Data { pub fn load() -> crate::Result { + let explore = load_asm!( + "assets/asm/explore_melody.asm", + "assets/asm/explore_harmony1.asm", + "assets/asm/explore_harmony2.asm" + ); let megalovania = load_asm!( "assets/asm/megalovania_melody.asm", "assets/asm/megalovania_base.asm" ); - Ok(Self { megalovania }) + Ok(Self { + explore, + megalovania, + }) } } diff --git a/audio/src/lib.rs b/audio/src/lib.rs index b2d3e87..97121f5 100644 --- a/audio/src/lib.rs +++ b/audio/src/lib.rs @@ -85,6 +85,7 @@ impl Audio { pub fn update(&mut self) { if self.last.elapsed() >= TIME_SLICE { + self.data.explore.exec(&mut self.channels); self.data.megalovania.exec(&mut self.channels); self.last = Instant::now(); } diff --git a/audio/src/parse/macros.rs b/audio/src/parse/macros.rs index 1dc33eb..d33208a 100644 --- a/audio/src/parse/macros.rs +++ b/audio/src/parse/macros.rs @@ -75,7 +75,9 @@ fn fill_macro(contents: &mut Vec>, name: &str, body: &str) -> usize break; } let line = &contents[idx]; - if line.starts_with(name) { + if line.starts_with(name) + && matches!(line.chars().nth(name.len()), None | Some(' ')) + { fill_macro_once(contents, idx, body); count += 1; } diff --git a/audio/src/program.rs b/audio/src/program.rs index 28a5f41..d8ece2c 100644 --- a/audio/src/program.rs +++ b/audio/src/program.rs @@ -41,19 +41,20 @@ const fn map_volume(volume: u8) -> f32 { pub struct Program { ins: Vec, pc: usize, - looping: bool, pause_cnt: u32, pause_len: u32, + looping: bool, + playing: bool, } impl Program { pub const fn new(ins: Vec, looping: bool) -> Self { - let pc = ins.len(); Self { ins, - pc, - looping, + pc: 0, pause_cnt: 0, pause_len: 4, + looping, + playing: false, } } @@ -150,6 +151,9 @@ impl Program { } pub fn exec(&mut self, channels: &mut Channels) { + if !self.playing { + return; + } if self.pause_cnt > 0 { self.pause_cnt -= 1; } @@ -157,10 +161,11 @@ impl Program { if self.pause_cnt > 0 { break; } - if self.finished() { + if self.is_finished() { if self.looping { self.pc = 0; } else { + self.playing = false; break; } } @@ -170,11 +175,16 @@ impl Program { } } - pub const fn finished(&self) -> bool { + pub const fn is_finished(&self) -> bool { self.pc >= self.ins.len() } + pub const fn is_playing(&self) -> bool { + self.playing + } + pub const fn play(&mut self) { + self.playing = true; self.pc = 0; } diff --git a/game/src/lib.rs b/game/src/lib.rs index 4572d8e..f20ece2 100644 --- a/game/src/lib.rs +++ b/game/src/lib.rs @@ -79,6 +79,9 @@ impl Game { } pub fn run(&mut self) { + // debug music + self.window.audio().data.explore.play(); + // Main game loop while self.window.is_open() { // Handle debug keys -- cgit v1.2.3-freya