From 0911ca44c59eb2320c2ce22bbbb26e7b3d00e684 Mon Sep 17 00:00:00 2001 From: Gwilym Inzani Date: Sun, 23 Jul 2023 20:54:24 +0100 Subject: [PATCH] Try a new song and add memory support --- .../examples/algar_-_ninja_on_speed.xm | Bin 0 -> 54255 bytes tracker/agb-tracker/examples/basic.rs | 2 +- tracker/agb-tracker/src/lib.rs | 2 +- tracker/agb-xm-core/src/lib.rs | 17 +++++++++++++---- 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 tracker/agb-tracker/examples/algar_-_ninja_on_speed.xm diff --git a/tracker/agb-tracker/examples/algar_-_ninja_on_speed.xm b/tracker/agb-tracker/examples/algar_-_ninja_on_speed.xm new file mode 100644 index 0000000000000000000000000000000000000000..9f08454498aac9e5bc420d7cf37644a4c314f778 GIT binary patch literal 54255 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 literal 0 HcmV?d00001 diff --git a/tracker/agb-tracker/examples/basic.rs b/tracker/agb-tracker/examples/basic.rs index bab1e138..e09bc425 100644 --- a/tracker/agb-tracker/examples/basic.rs +++ b/tracker/agb-tracker/examples/basic.rs @@ -6,7 +6,7 @@ use agb::Gba; use agb_tracker::{include_xm, Track, Tracker}; // Found on: https://modarchive.org/index.php?request=view_by_moduleid&query=36662 -const DB_TOFFE: Track = include_xm!("examples/db_toffe.xm"); +const DB_TOFFE: Track = include_xm!("examples/algar_-_ninja_on_speed.xm"); #[agb::entry] fn main(mut gba: Gba) -> ! { diff --git a/tracker/agb-tracker/src/lib.rs b/tracker/agb-tracker/src/lib.rs index eecf2a32..4a349e3d 100644 --- a/tracker/agb-tracker/src/lib.rs +++ b/tracker/agb-tracker/src/lib.rs @@ -124,7 +124,7 @@ impl Tracker { tick: 0, current_row: 0, - current_pattern: 0, + current_pattern: 2, } } diff --git a/tracker/agb-xm-core/src/lib.rs b/tracker/agb-xm-core/src/lib.rs index c75d076e..68455a56 100644 --- a/tracker/agb-xm-core/src/lib.rs +++ b/tracker/agb-xm-core/src/lib.rs @@ -106,6 +106,8 @@ pub fn parse_module(module: &Module) -> TokenStream { let mut patterns = vec![]; let mut pattern_data = vec![]; + let mut effect_parameters = [0; u8::MAX as usize]; + for pattern in &module.pattern { let start_pos = pattern_data.len(); @@ -166,6 +168,13 @@ pub fn parse_module(module: &Module) -> TokenStream { }; } + let effect_parameter = if slot.effect_parameter != 0 { + effect_parameters[slot.effect_type as usize] = slot.effect_parameter; + slot.effect_parameter + } else { + effect_parameters[slot.effect_type as usize] + }; + let effect2 = match slot.effect_type { 0x0 => { if slot.effect_parameter == 0 { @@ -203,7 +212,7 @@ pub fn parse_module(module: &Module) -> TokenStream { let c4_speed = note_to_speed(Note::C4, 0.0, 0, module.frequency_type); let speed = note_to_speed( Note::C4, - slot.effect_parameter as f64, + effect_parameter as f64, 0, module.frequency_type, ); @@ -216,7 +225,7 @@ pub fn parse_module(module: &Module) -> TokenStream { let c4_speed = note_to_speed(Note::C4, 0.0, 0, module.frequency_type); let speed = note_to_speed( Note::C4, - -(slot.effect_parameter as f64), + -(effect_parameter as f64), 0, module.frequency_type, ); @@ -229,8 +238,8 @@ pub fn parse_module(module: &Module) -> TokenStream { PatternEffect::Panning(Num::new(slot.effect_parameter as i16 - 128) / 128) } 0xA => { - let first = slot.effect_parameter >> 4; - let second = slot.effect_parameter & 0xF; + let first = effect_parameter >> 4; + let second = effect_parameter & 0xF; if first == 0 { PatternEffect::VolumeSlide(-Num::new(second as i16) / 16)