summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/asm/attack.asm8
-rw-r--r--assets/asm/discover.asm8
-rw-r--r--assets/asm/drop_item.asm22
-rw-r--r--assets/asm/pickup_item.asm22
-rw-r--r--assets/asm/speak.asm8
-rw-r--r--assets/asm/test.asm2
-rw-r--r--assets/asm/use_bomb.asm11
-rw-r--r--assets/asm/use_potion.asm8
-rw-r--r--audio/src/channel.rs46
-rw-r--r--audio/src/program.rs2
-rw-r--r--game/src/music.rs16
11 files changed, 125 insertions, 28 deletions
diff --git a/assets/asm/attack.asm b/assets/asm/attack.asm
new file mode 100644
index 0000000..01ab330
--- /dev/null
+++ b/assets/asm/attack.asm
@@ -0,0 +1,8 @@
+; setup
+P5
+
+a v100 w50
+a p b2 -
+a p a2 -
+a p b2 -
+a p a2 -
diff --git a/assets/asm/discover.asm b/assets/asm/discover.asm
new file mode 100644
index 0000000..d385872
--- /dev/null
+++ b/assets/asm/discover.asm
@@ -0,0 +1,8 @@
+; setup
+P5
+
+a v100 w50
+a p b2 -
+a p b3 -
+a p b4 -
+a v0
diff --git a/assets/asm/drop_item.asm b/assets/asm/drop_item.asm
new file mode 100644
index 0000000..db649b3
--- /dev/null
+++ b/assets/asm/drop_item.asm
@@ -0,0 +1,22 @@
+; setup
+b v100 w12
+P1
+
+%macro note
+b v100 p$1
+%endmacro
+
+note g4 -
+note f4 -
+note e4 -
+note d4 -
+note c4 -
+note b4 -
+note a4 -
+note g3 -
+note f3 -
+note e3 -
+note d3 -
+note c3 -
+note b3 -
+note a3 -
diff --git a/assets/asm/pickup_item.asm b/assets/asm/pickup_item.asm
new file mode 100644
index 0000000..28769e4
--- /dev/null
+++ b/assets/asm/pickup_item.asm
@@ -0,0 +1,22 @@
+; setup
+b v100 w12
+P1
+
+%macro note
+b v100 p$1
+%endmacro
+
+note a3 -
+note b3 -
+note c3 -
+note d3 -
+note e3 -
+note f3 -
+note g3 -
+note a4 -
+note b4 -
+note c4 -
+note d4 -
+note e4 -
+note f4 -
+note g4 -
diff --git a/assets/asm/speak.asm b/assets/asm/speak.asm
new file mode 100644
index 0000000..a4b5657
--- /dev/null
+++ b/assets/asm/speak.asm
@@ -0,0 +1,8 @@
+
+; setup
+t v0
+P2
+
+t v100 p g3 -
+t v100 p e3 -
+t v100 p g3 -
diff --git a/assets/asm/test.asm b/assets/asm/test.asm
index d65f0e5..e9dd72a 100644
--- a/assets/asm/test.asm
+++ b/assets/asm/test.asm
@@ -1,7 +1,7 @@
; setup
t v0
-P1
+P5
%macro note
t p$1 v100 -
diff --git a/assets/asm/use_bomb.asm b/assets/asm/use_bomb.asm
new file mode 100644
index 0000000..2006df7
--- /dev/null
+++ b/assets/asm/use_bomb.asm
@@ -0,0 +1,11 @@
+; setup
+P5
+
+n v100 m1
+n p b3 -
+n p a3 -
+n p g2 -
+n p f2 -
+n p d2 -
+n p c2 -
+n p a2 -
diff --git a/assets/asm/use_potion.asm b/assets/asm/use_potion.asm
new file mode 100644
index 0000000..e02d19f
--- /dev/null
+++ b/assets/asm/use_potion.asm
@@ -0,0 +1,8 @@
+; setup
+P5
+
+a v100 w12
+a p a4 -
+a p c4 -
+a p e4 -
+a v0 -
diff --git a/audio/src/channel.rs b/audio/src/channel.rs
index b74792e..2b4be02 100644
--- a/audio/src/channel.rs
+++ b/audio/src/channel.rs
@@ -44,7 +44,21 @@ impl ChannelKind {
Self::Noise { mode: false }
}
- fn sample(self, phase: f32, lsr_ptr: &mut i16) -> i16 {
+ const fn on_phase(self, lsr_ptr: &mut i16) {
+ if let Self::Noise { mode } = self {
+ let mut lsr = *lsr_ptr;
+ let feedback = if mode {
+ (lsr & 1) ^ ((lsr >> 1) & 1)
+ } else {
+ (lsr & 1) ^ ((lsr >> 6) & 1)
+ };
+ lsr >>= 1;
+ lsr |= feedback << 14;
+ *lsr_ptr = lsr;
+ }
+ }
+
+ fn sample(self, phase: f32, lsr: i16) -> i16 {
match self {
Self::Pulse { duty_cycle } => {
let duty = duty_cycle as f32 / 100.0;
@@ -57,17 +71,12 @@ impl ChannelKind {
let value = ((step as f32 / (steps - 1) as f32) * 4.0) - 1.0;
(value * i16::MAX as f32) as i16
}
- Self::Noise { mode } => {
- let mut lsr = *lsr_ptr;
- let feedback = if mode {
- (lsr & 1) ^ ((lsr >> 1) & 1)
+ Self::Noise { .. } => {
+ if (lsr & 0x1) == 1 {
+ i16::MAX
} else {
- (lsr & 1) ^ ((lsr >> 6) & 1)
- };
- lsr >>= 1;
- lsr |= feedback << 14;
- *lsr_ptr = lsr;
- lsr
+ i16::MIN
+ }
}
}
}
@@ -98,8 +107,9 @@ impl Channel {
phase += step;
if phase >= 1.0 {
phase -= 1.0;
+ self.kind.on_phase(lsr_ptr);
}
- let real_note = self.kind.sample(phase, lsr_ptr);
+ let real_note = self.kind.sample(phase, *lsr_ptr);
let note = (real_note as f32 * volume) as i16;
*sample += note / 4;
}
@@ -113,7 +123,7 @@ struct RuntimeState {
pulse_b_phase: f32,
triangle_phase: f32,
noise_phase: f32,
- noise_lsfr: i16,
+ noise_lsr: i16,
}
impl RuntimeState {
const fn new() -> Self {
@@ -122,7 +132,7 @@ impl RuntimeState {
pulse_b_phase: 0.0,
triangle_phase: 0.0,
noise_phase: 0.0,
- noise_lsfr: 1,
+ noise_lsr: 1,
}
}
}
@@ -170,13 +180,13 @@ impl<'s> Device<'s> {
set_audio_stream_callback(&stream, move |buffer| {
let chan = cb_data.load(Ordering::Relaxed);
chan.pulse_a
- .sample(buffer, &mut state.pulse_a_phase, &mut state.noise_lsfr);
+ .sample(buffer, &mut state.pulse_a_phase, &mut state.noise_lsr);
chan.pulse_b
- .sample(buffer, &mut state.pulse_b_phase, &mut state.noise_lsfr);
+ .sample(buffer, &mut state.pulse_b_phase, &mut state.noise_lsr);
chan.triangle
- .sample(buffer, &mut state.triangle_phase, &mut state.noise_lsfr);
+ .sample(buffer, &mut state.triangle_phase, &mut state.noise_lsr);
chan.noise
- .sample(buffer, &mut state.noise_phase, &mut state.noise_lsfr);
+ .sample(buffer, &mut state.noise_phase, &mut state.noise_lsr);
})?;
stream.set_volume(1.0);
stream.set_pitch(1.0);
diff --git a/audio/src/program.rs b/audio/src/program.rs
index cd050e3..efda90b 100644
--- a/audio/src/program.rs
+++ b/audio/src/program.rs
@@ -246,6 +246,6 @@ impl PartialOrd for Program {
}
impl Ord for Program {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
- other.priority.cmp(&self.priority)
+ self.priority.cmp(&other.priority)
}
}
diff --git a/game/src/music.rs b/game/src/music.rs
index 366e79d..58bdbc0 100644
--- a/game/src/music.rs
+++ b/game/src/music.rs
@@ -48,16 +48,16 @@ pub struct Music {
}
impl Music {
pub fn load() -> crate::Result<Self> {
- // TODO: create REAL audio files
- let attack = load_asm!("assets/asm/placeholder.asm");
- let discover = load_asm!("assets/asm/placeholder.asm");
+ // TODO: create REAL audio files
+ let attack = load_asm!("assets/asm/attack.asm");
+ let discover = load_asm!("assets/asm/discover.asm");
let background = load_asm!("assets/asm/placeholder.asm");
let game_over = load_asm!("assets/asm/placeholder.asm");
- let speak = load_asm!("assets/asm/placeholder.asm");
- let use_potion = load_asm!("assets/asm/placeholder.asm");
- let use_bomb = load_asm!("assets/asm/placeholder.asm");
- let drop_item = load_asm!("assets/asm/placeholder.asm");
- let pickup_item = load_asm!("assets/asm/placeholder.asm");
+ let speak = load_asm!("assets/asm/speak.asm");
+ let use_potion = load_asm!("assets/asm/use_potion.asm");
+ let use_bomb = load_asm!("assets/asm/use_bomb.asm");
+ let drop_item = load_asm!("assets/asm/drop_item.asm");
+ let pickup_item = load_asm!("assets/asm/pickup_item.asm");
Ok(Self {
attack: Sound::new(attack, false, 2),