3个版本

0.1.2 2023年1月16日
0.1.1 2022年12月27日
0.1.0 2022年12月25日

音频类别中排名336

每月下载量27
ffmmlc中使用

MIT/Apache

1.5MB
3K SLoC

ffmml

ffmml Documentation Actions Status License

FFamicon风味音乐宏语言(FFMML)的解析器和播放器。

Famicon也称为NES(任天堂娱乐系统)。

🎵 Web播放器

📝 VSCode扩展

FFMML的语言规范基于MCK。但FFMML和MCK之间(已知)存在以下差异

  • FFMML不支持以下功能
    • #INCLUDE指令
    • #OCTAVE-REV指令
    • @n命令(直接频率选择)
    • n命令(直接音符选择)
    • y命令(直接内存条目)
    • DPCM通道
  • FFMML具有定义自定义通道的#CHANNEL <CHANNEL_NAME> <OSCILLATOR>指令
    • <CHANNEL_NAME>: A..=Z
    • <OSCILLATOR>: 1(脉冲波), 2(三角形波)或3(噪声)

示例

以下示例解析MML脚本并生成音频数据

let mml = r#"; From https://www.nesdev.org/mck_guide_v1.0.txt
#TITLE My First NES Chip
#COMPOSER Nullsleep
#PROGRAMER 2003 Jeremiah Johnson

@v0 = { 10 9 8 7 6 5 4 3 2 }
@v1 = { 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 }
@v2 = { 15 12 10 8 6 3 2 1 0 }
@v3 = { 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 }

ABCD t150

A l8 o4 @01 @v0
A [c d e f @v1 g4 @v0 a16 b16 >c c d e f @v1 g4 @v0 a16 b16 >c<<]2

C l4 o3 q6
C [c e g8 g8 a16 b16 >c8 c e g8 g8 a16 b16 >c8<<]4

D l4 @v2 @0
D [@v2 b @v3 e @v2 b @v3 e @v2 b @v3 e @v2 b @v3 e8 @v2 b8]4"#;

let music = mml.parse::<ffmml::Music>().unwrap_or_else(|e| panic!("{e}"));
let mut player = music.play(48000);
let audio_data = (&mut player).collect::<Vec<_>>();
player.take_last_error().map(|e| panic!("{e}"));

要播放上述MML脚本定义的音乐,请运行以下命令

$ cargo install ffmmlc
$ cat examples/music01.mml | ffmmlc > music01.wav
$ play music01.wav

参考资料

关于MML

关于Famicon声音

依赖项

~4MB
~85K SLoC