summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-11-22 16:00:35 -0500
committerFreya Murphy <freya@freyacat.org>2025-11-22 16:29:28 -0500
commitfbfb3ad0f70ebbc5db9e5d5fc41c53c15b082d9d (patch)
treea41968431e016403aa3956bbdc075dd4a2203e1e
parentaudio: refactor into seperate crate (diff)
downloadDungeonCrawl-fbfb3ad0f70ebbc5db9e5d5fc41c53c15b082d9d.tar.gz
DungeonCrawl-fbfb3ad0f70ebbc5db9e5d5fc41c53c15b082d9d.tar.bz2
DungeonCrawl-fbfb3ad0f70ebbc5db9e5d5fc41c53c15b082d9d.zip
audio: some changes
-rw-r--r--assets/asm/explore_harmony1.asm74
-rw-r--r--assets/asm/explore_harmony2.asm26
-rw-r--r--assets/asm/explore_melody.asm80
-rw-r--r--audio/src/data.rs13
-rw-r--r--audio/src/lib.rs1
-rw-r--r--audio/src/parse/macros.rs4
-rw-r--r--audio/src/program.rs22
-rw-r--r--game/src/lib.rs3
8 files changed, 214 insertions, 9 deletions
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<Self> {
+ 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<Cow<'_, str>>, 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<Instruction>,
pc: usize,
- looping: bool,
pause_cnt: u32,
pause_len: u32,
+ looping: bool,
+ playing: bool,
}
impl Program {
pub const fn new(ins: Vec<Instruction>, 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