diff options
| -rw-r--r-- | assets/asm/attack.asm | 8 | ||||
| -rw-r--r-- | assets/asm/discover.asm | 8 | ||||
| -rw-r--r-- | assets/asm/drop_item.asm | 22 | ||||
| -rw-r--r-- | assets/asm/pickup_item.asm | 22 | ||||
| -rw-r--r-- | assets/asm/speak.asm | 8 | ||||
| -rw-r--r-- | assets/asm/test.asm | 2 | ||||
| -rw-r--r-- | assets/asm/use_bomb.asm | 11 | ||||
| -rw-r--r-- | assets/asm/use_potion.asm | 8 | ||||
| -rw-r--r-- | audio/src/channel.rs | 46 | ||||
| -rw-r--r-- | audio/src/program.rs | 2 | ||||
| -rw-r--r-- | game/src/music.rs | 16 |
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), |