From 436b49c80df375870d9d72cf80017e67c02599a7 Mon Sep 17 00:00:00 2001 From: Gwilym Inzani Date: Wed, 12 Jul 2023 18:52:29 +0100 Subject: [PATCH] Get closer to some reasonable sounding --- tracker/agb-tracker-interop/src/lib.rs | 6 ++-- tracker/agb-tracker/examples/basic.rs | 2 +- tracker/agb-tracker/examples/db_toffe.xm | Bin 0 -> 83642 bytes .../agb-tracker/examples/final_countdown.xm | Bin 0 -> 69650 bytes tracker/agb-tracker/src/lib.rs | 24 +++++++++------ tracker/agb-xm-core/src/lib.rs | 28 ++++++++---------- tracker/agb-xm-core/src/main.rs | 2 +- 7 files changed, 32 insertions(+), 30 deletions(-) create mode 100644 tracker/agb-tracker/examples/db_toffe.xm create mode 100644 tracker/agb-tracker/examples/final_countdown.xm diff --git a/tracker/agb-tracker-interop/src/lib.rs b/tracker/agb-tracker-interop/src/lib.rs index cf655e05..54cc4758 100644 --- a/tracker/agb-tracker-interop/src/lib.rs +++ b/tracker/agb-tracker-interop/src/lib.rs @@ -8,6 +8,7 @@ pub struct Track<'a> { pub pattern_data: &'a [PatternSlot], pub patterns: &'a [Pattern], + pub num_channels: usize, pub frames_per_step: u16, } @@ -19,7 +20,6 @@ pub struct Sample<'a> { #[derive(Debug)] pub struct Pattern { - pub num_channels: usize, pub length: usize, pub start_position: usize, } @@ -42,6 +42,7 @@ impl<'a> quote::ToTokens for Track<'a> { pattern_data, patterns, frames_per_step, + num_channels, } = self; tokens.append_all(quote! { @@ -58,6 +59,7 @@ impl<'a> quote::ToTokens for Track<'a> { patterns: PATTERNS, frames_per_step: #frames_per_step, + num_channels: #num_channels, } } }) @@ -136,7 +138,6 @@ impl quote::ToTokens for Pattern { use quote::{quote, TokenStreamExt}; let Pattern { - num_channels, length, start_position, } = self; @@ -146,7 +147,6 @@ impl quote::ToTokens for Pattern { use agb_tracker_interop::*; Pattern { - num_channels: #num_channels, length: #length, start_position: #start_position, } diff --git a/tracker/agb-tracker/examples/basic.rs b/tracker/agb-tracker/examples/basic.rs index 2581f1e0..2913a4d0 100644 --- a/tracker/agb-tracker/examples/basic.rs +++ b/tracker/agb-tracker/examples/basic.rs @@ -5,7 +5,7 @@ use agb::sound::mixer::Frequency; use agb::Gba; use agb_tracker::{import_xm, Track, Tracker}; -const AJOJ: Track = import_xm!("examples/ajoj.xm"); +const AJOJ: Track = import_xm!("examples/db_toffe.xm"); #[agb::entry] fn main(mut gba: Gba) -> ! { diff --git a/tracker/agb-tracker/examples/db_toffe.xm b/tracker/agb-tracker/examples/db_toffe.xm new file mode 100644 index 0000000000000000000000000000000000000000..b2b22a104506fc5f764a36af5addd7f846faf4be GIT binary patch literal 83642 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 gD1YQJHDkt%X*77?HKY0sZ8U0F) -> Self { - agb::println!("{}", track.frames_per_step); + let mut channels = Vec::new(); + channels.resize_with(track.num_channels, || None); Self { track, - channels: vec![], + channels, step: 0, current_row: 0, @@ -49,16 +50,21 @@ impl Tracker { let current_pattern = &self.track.patterns[self.current_pattern]; - let channels_to_play = current_pattern.num_channels; - self.channels.resize_with(channels_to_play, || None); - - let pattern_data_pos = current_pattern.start_position + self.current_row * channels_to_play; + let pattern_data_pos = + current_pattern.start_position + self.current_row * self.track.num_channels; let pattern_slots = - &self.track.pattern_data[pattern_data_pos..pattern_data_pos + channels_to_play]; + &self.track.pattern_data[pattern_data_pos..pattern_data_pos + self.track.num_channels]; for (channel_id, pattern_slot) in self.channels.iter_mut().zip(pattern_slots) { if pattern_slot.sample == 0 { - // do nothing + if pattern_slot.speed == 0.into() { + if let Some(channel) = channel_id + .take() + .and_then(|channel_id| mixer.channel(&channel_id)) + { + channel.stop(); + } + } } else { if let Some(channel) = channel_id .take() diff --git a/tracker/agb-xm-core/src/lib.rs b/tracker/agb-xm-core/src/lib.rs index ca643010..b701080c 100644 --- a/tracker/agb-xm-core/src/lib.rs +++ b/tracker/agb-xm-core/src/lib.rs @@ -99,7 +99,6 @@ pub fn parse_module(module: &Module) -> TokenStream { let mut pattern_data = vec![]; for pattern in &module.pattern { - let mut num_channels = 0; let start_pos = pattern_data.len(); for row in pattern.iter() { @@ -122,19 +121,21 @@ pub fn parse_module(module: &Module) -> TokenStream { } }; - let volume = Num::new( - if slot.volume == 0 { - 64 - } else { - slot.volume as i16 - } / 64, - ); + let volume = Num::new(if slot.volume == 0 { + 64 + } else { + slot.volume as i16 + }) / 64; if sample == 0 { // TODO should take into account previous sample played on this channel pattern_data.push(agb_tracker_interop::PatternSlot { volume: Num::new(0), - speed: Num::new(0), + speed: if matches!(slot.note, Note::KeyOff) { + 0.into() + } else { + note_to_speed(slot.note, 0.0, 0) + }, panning: Num::new(0), sample: 0, }) @@ -156,12 +157,9 @@ pub fn parse_module(module: &Module) -> TokenStream { }); } } - - num_channels = row.len(); } patterns.push(agb_tracker_interop::Pattern { - num_channels, length: pattern.len(), start_position: start_pos, }); @@ -175,15 +173,13 @@ pub fn parse_module(module: &Module) -> TokenStream { }) .collect(); - let frames_per_step = - ((60.0 * 60.0) / module.default_bpm as f64 / module.default_tempo as f64) as u16; - let interop = agb_tracker_interop::Track { samples: &samples, pattern_data: &pattern_data, patterns: &patterns, + num_channels: module.get_num_channels(), - frames_per_step, + frames_per_step: 2, // TODO calculate this correctly }; quote!(#interop) diff --git a/tracker/agb-xm-core/src/main.rs b/tracker/agb-xm-core/src/main.rs index 2e2ba88f..026485eb 100644 --- a/tracker/agb-xm-core/src/main.rs +++ b/tracker/agb-xm-core/src/main.rs @@ -1,6 +1,6 @@ fn main() -> Result<(), Box> { let module = agb_xm_core::load_module_from_file(&std::path::Path::new( - "../agb-tracker/examples/ajoj.xm", + "../agb-tracker/examples/final_countdown.xm", ))?; let output = agb_xm_core::parse_module(&module);