#gameboy-advance #music #tracker #agb #playing #format #channel

agb_tracker

用于播放tracker音乐的库。专为与Game Boy Advance(GBA)的agb库一起使用而设计。

13个版本 (4个破坏性更新)

0.20.5 2024年6月18日
0.20.4 2024年6月13日
0.20.2 2024年5月25日
0.19.1 2024年3月6日
0.16.0 2023年10月3日

#427 in 音频

Download history 332/week @ 2024-05-12 164/week @ 2024-05-19 36/week @ 2024-05-26 10/week @ 2024-06-02 305/week @ 2024-06-09 157/week @ 2024-06-16 3/week @ 2024-06-23 10/week @ 2024-06-30 124/week @ 2024-07-28

每月下载量124次

MPL-2.0许可证

485KB
11K SLoC

agb_tracker

agb_tracker是一个库,用于在Game Boy Advance(GBA)上使用agb库播放tracker音乐。

使用agb播放背景音乐的默认机制是将整个音乐作为原始声音文件包含在内。然而,对于只有几分钟的音乐,这可能导致文件非常大(>8MB),占用大部分有限的ROM空间。

使用tracker,您可以在仅几个KB的ROM中存储许多分钟的音乐,这使得格式在牺牲一些CPU性能的情况下更加节省空间。

此库每帧大约占用GBA CPU时间的20-30%,用于4个通道,但其中大部分是agb的混音。主要的step函数大约使用2000个周期(<1%)。

示例

#![no_std]
#![no_main]

use agb::{Gba, sound::mixer::Frequency};
use agb_tracker::{include_xm, Track, Tracker};

static DB_TOFFE: Track = include_xm!("examples/db_toffe.xm");

#[agb::entry]
fn main(mut gba: Gba) -> ! {
    let vblank_provider = agb::interrupt::VBlank::get();

    let mut mixer = gba.mixer.mixer(Frequency::Hz32768);
    mixer.enable();

    let mut tracker = Tracker::new(&DB_TOFFE);

    loop {
        tracker.step(&mut mixer);
        mixer.frame();

        vblank_provider.wait_for_vblank();
    }
}

请注意,当前您必须将32768Hz作为混音器的频率进行选择。这个限制将在未来的版本中取消。

概念

agb_tracker库的主要概念是将尽可能多的工作移到构建时间,以使实际播放尽可能快。传递的tracker文件将被解析并转换为简化的格式,然后在游戏运行时进行播放。

理论上,tracker文件被转换成的格式与基本格式无关。目前,仅实现了XM格式,但根据需求,未来可以添加更多格式。

依赖项

~8.5MB
~154K SLoC