GBA音乐循环
【警告】
这些步骤可能或可能不影响你操作系统的行动。这些可能包括DLL文件相关错误。
使用它您自己承担风险!(别告诉我我没有警告你)
人名(偷懒= =)的代码入门帖,(如果没有那个帖子,我就不能知道如何编辑手动S文件   【不会翻译了= ||】)http://www.pokecommunity.com/showthread.php?p=2936767#post2936767
Kawa的Sappy代码帮助文件
【让我们开始吧】
-在其他事之前,你需要通过MIDI2GBA工具将你的MIDI文件转换成GBA的S文件。转换完毕后,用文本编辑器,打开那个S文件(记住选择“显示所有文件”哈
提示:用文本处理器合并S文件可能影响Sappy的执行尤其是在他集合好以后,您可能会在kernel32上留下一个永久性的汇编错误。 
让我们熟悉代码吧:
复制内容到剪贴板
代码:
 .include "MPlayDef.s" 
.equ newbark_grp, voicegroup000 
.equ newbark_pri, 0 
.equ newbark_rev, 0 
.equ newbark_mvl, 127 
.equ newbark_key, 0 
.equ newbark_tbs, 1 
.equ newbark_exg, 0 
.equ newbark_cmp, 1 
.section .rodata 
.global newbark 
.align 2 
@**************** Track 1 (Midi-Chn.5) ****************@ 
newbark_1: --------------------------> label 
.byte KEYSH , newbark_key+0 
@ 000 ---------------------------------------- --------------> measure number 
.byte TEMPO , 100*newbark_tbs/2 
.byte VOICE , 48 
.byte VOL , 100*newbark_mvl/mxv 
.byte PAN , c_v+0 
.byte W24 
.byte VOL , 100*newbark_mvl/mxv 
.byte N06 , Dn3 , v100 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Fn3 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
@ 001 ---------------------------------------- 
newbark_1_001: 
.byte N12 , Fs3 , v100 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Gn3 
.byte W12 
.byte N06 , Dn3 
.byte W12 
.byte N06 
.byte W12 
.byte As2 
.byte W12 
.byte PEND 
@ 002 ---------------------------------------- 
newbark_1_002: 
.byte N12 , Gs3 , v100 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Gn2 
.byte W12 
.byte Ds2 
.byte W12 
.byte N12 , Ds3 
.byte W12 
.byte N06 , Gn2 
.byte W12 
.byte N06 
.byte W12 
.byte En2 
.byte W12 
.byte PEND 
@ 003 ---------------------------------------- 
.byte N12 , Cn3 
.byte W12 
.byte N06 , Gn2 
.byte W12 
.byte An2 
.byte W12 
.byte Fn2 
.byte W12 
.byte N12 , Ds3 
.byte W12 
.byte Dn3 
.byte W12 
.byte N06 , Cn3 
.byte W06 
.byte Dn3 
.byte W06 
.byte Cn3 
.byte W06 
.byte As2 
.byte W06 
@ 004 ---------------------------------------- 
.byte An2 
.byte W06 
.byte Gn2 
.byte W06 
.byte Fn2 
.byte W06 
.byte Ds2 
.byte W06 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Fn3 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
@ 005 ---------------------------------------- 
.byte PATT 
.word newbark_1_001 
@ 006 ---------------------------------------- 
.byte PATT 
.word newbark_1_002 
@ 007 ---------------------------------------- 
.byte N12 , Cn3 , v100 
.byte W12 
.byte N06 , Gn2 
.byte W12 
.byte An2 
.byte W12 
.byte Fn2 
.byte W12 
.byte N12 , Ds3 
.byte W12 
.byte An2 
.byte W12 
.byte N06 , Fn2 
.byte W06 
.byte An2 
.byte W06 
.byte Cn3 
.byte W06 
.byte Ds3 
.byte W06 
@ 008 ---------------------------------------- 
.byte Fn3 
.byte W06 
.byte An3 
.byte W06 
.byte Cn4 
.byte W06 
.byte Fn4 
.byte W06 
.byte VOL , 80*newbark_mvl/mxv 
.byte N12 , Ds2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Gn2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , As2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N24 , Dn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N24 , Ds3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
@ 009 ---------------------------------------- 
newbark_1_009: 
.byte VOL , 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N12 , As2 , v100 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Fn2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , An2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Cn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N24 , Ds3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N24 , Fn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte PEND 
@ 010 ---------------------------------------- 
newbark_1_010: 
.byte VOL , 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N12 , Cn3 , v100 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Ds2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Gn2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , As2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N24 , Dn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N24 , Ds3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte PEND 
@ 011 ---------------------------------------- 
.byte PATT 
.word newbark_1_009 
@ 012 ---------------------------------------- 
.byte PATT 
.word newbark_1_010 
@ 013 ---------------------------------------- 
.byte PATT 
.word newbark_1_009 
@ 014 ---------------------------------------- 
.byte PATT 
.word newbark_1_010 
@ 015 ---------------------------------------- 
.byte PATT 
.word newbark_1_009 
@ 016 ---------------------------------------- 
.byte VOL , 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N12 , Gn3 , v100 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
@ 017 ---------------------------------------- 
.byte FINE 
... 
@******************************************************@ 
.align 2 
newbark: 
.byte 4 @ NumTrks 
.byte 0 @ NumBlks 
.byte newbark_pri @ Priority 
.byte newbark_rev @ Reverb. 
.word newbark_grp 
.word newbark_1 
... 
.end(Code部分UBB代码失效)
--想要实现循环,你需要首先找到音轨的结尾处。而它往往在这样的地方结束:
复制内容到剪贴板
代码:
@ 017 ---------------------------------------- 
.byte FINE--在FINE语句之后加入以下代码:
复制内容到剪贴板
代码:
@ 017 ---------------------------------------- 
.byte GOTO 
.word newbark_1_loop 
.byte W06 
@ 018 ---------------------------------------- 
.byte FINE【提示】加入".byte W06" 在GOTO和行号之后的目的是给GBA和内存足够的时间去前往指定的行号,避开执行过程中的错误。 加入额外的测量名在fine之后是可选的。但是建议避免混乱(的写文件)。(@符号在S文件中表示注释符).
-然后放置你设定的标签 (在这里是newbark_1_loop) 后跟一个英文半角冒号 ( : ) 在你想循环的地方。
像这样
复制内容到剪贴板
代码:
@ 000 ---------------------------------------- 
.byte TEMPO , 100*newbark_tbs/2 
.byte VOICE , 48 
.byte VOL , 100*newbark_mvl/mxv 
.byte PAN , c_v+0 
.byte W24 
newbark_1_loop: 
.byte VOL , 100*newbark_mvl/mxv 
.byte N06 , Dn3 , v100 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Fn3 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12你的最终结果必须像如下一样的代码一样:
复制内容到剪贴板
代码:
 .include "MPlayDef.s" 
.equ newbark_grp, voicegroup000 
.equ newbark_pri, 0 
.equ newbark_rev, 0 
.equ newbark_mvl, 127 
.equ newbark_key, 0 
.equ newbark_tbs, 1 
.equ newbark_exg, 0 
.equ newbark_cmp, 1 
.section .rodata 
.global newbark 
.align 2 
@**************** Track 1 (Midi-Chn.5) ****************@ 
newbark_1: 
.byte KEYSH , newbark_key+0 
@ 000 ---------------------------------------- 
.byte TEMPO , 100*newbark_tbs/2 
.byte VOICE , 48 
.byte VOL , 100*newbark_mvl/mxv 
.byte PAN , c_v+0 
.byte W24 
newbark_1_loop: 
.byte VOL , 100*newbark_mvl/mxv 
.byte N06 , Dn3 , v100 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Fn3 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
@ 001 ---------------------------------------- 
newbark_1_001: 
.byte N12 , Fs3 , v100 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Gn3 
.byte W12 
.byte N06 , Dn3 
.byte W12 
.byte N06 
.byte W12 
.byte As2 
.byte W12 
.byte PEND 
@ 002 ---------------------------------------- 
newbark_1_002: 
.byte N12 , Gs3 , v100 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Gn2 
.byte W12 
.byte Ds2 
.byte W12 
.byte N12 , Ds3 
.byte W12 
.byte N06 , Gn2 
.byte W12 
.byte N06 
.byte W12 
.byte En2 
.byte W12 
.byte PEND 
@ 003 ---------------------------------------- 
.byte N12 , Cn3 
.byte W12 
.byte N06 , Gn2 
.byte W12 
.byte An2 
.byte W12 
.byte Fn2 
.byte W12 
.byte N12 , Ds3 
.byte W12 
.byte Dn3 
.byte W12 
.byte N06 , Cn3 
.byte W06 
.byte Dn3 
.byte W06 
.byte Cn3 
.byte W06 
.byte As2 
.byte W06 
@ 004 ---------------------------------------- 
.byte An2 
.byte W06 
.byte Gn2 
.byte W06 
.byte Fn2 
.byte W06 
.byte Ds2 
.byte W06 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
.byte N12 , Fn3 
.byte W12 
.byte N06 , As2 
.byte W12 
.byte Dn3 
.byte W12 
.byte As2 
.byte W12 
@ 005 ---------------------------------------- 
.byte PATT 
.word newbark_1_001 
@ 006 ---------------------------------------- 
.byte PATT 
.word newbark_1_002 
@ 007 ---------------------------------------- 
.byte N12 , Cn3 , v100 
.byte W12 
.byte N06 , Gn2 
.byte W12 
.byte An2 
.byte W12 
.byte Fn2 
.byte W12 
.byte N12 , Ds3 
.byte W12 
.byte An2 
.byte W12 
.byte N06 , Fn2 
.byte W06 
.byte An2 
.byte W06 
.byte Cn3 
.byte W06 
.byte Ds3 
.byte W06 
@ 008 ---------------------------------------- 
.byte Fn3 
.byte W06 
.byte An3 
.byte W06 
.byte Cn4 
.byte W06 
.byte Fn4 
.byte W06 
.byte VOL , 80*newbark_mvl/mxv 
.byte N12 , Ds2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Gn2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , As2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N24 , Dn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N24 , Ds3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
@ 009 ---------------------------------------- 
newbark_1_009: 
.byte VOL , 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N12 , As2 , v100 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Fn2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , An2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Cn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N24 , Ds3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N24 , Fn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte PEND 
@ 010 ---------------------------------------- 
newbark_1_010: 
.byte VOL , 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N12 , Cn3 , v100 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Ds2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , Gn2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N12 , As2 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 80*newbark_mvl/mxv 
.byte N24 , Dn3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N24 , Ds3 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
.byte PEND 
@ 011 ---------------------------------------- 
.byte PATT 
.word newbark_1_009 
@ 012 ---------------------------------------- 
.byte PATT 
.word newbark_1_010 
@ 013 ---------------------------------------- 
.byte PATT 
.word newbark_1_009 
@ 014 ---------------------------------------- 
.byte PATT 
.word newbark_1_010 
@ 015 ---------------------------------------- 
.byte PATT 
.word newbark_1_009 
@ 016 ---------------------------------------- 
.byte VOL , 115*newbark_mvl/mxv 
.byte W12 
.byte 80*newbark_mvl/mxv 
.byte N12 , Gn3 , v100 
.byte W06 
.byte VOL , 95*newbark_mvl/mxv 
.byte W06 
@ 017 ---------------------------------------- 
.byte GOTO 
.word newbark_1_loop 
.byte W06 
@ 018 ---------------------------------------- 
.byte FINE 
@******************************************************@ 
.align 2 
newbark: 
.byte 1 @ NumTrks 
.byte 0 @ NumBlks 
.byte newbark_pri @ Priority 
.byte newbark_rev @ Reverb. 
.word newbark_grp 
.word newbark_1 
.end- 完成后别忘记保存。下一步就是插入到Sappy中。你可以参考帮助文件或者在论坛中搜索这方面的介绍。
【注意】 
·你可以用Sappy来测试你的S文件。警告是注意它有可能在第一次运行的时候关闭程序。最安全的方法还是用GBA模拟器来进行测试。(preview我翻译成测试没意见吧= =)
·如果你打算使用多轨S文件,你可能需要缩减你的MIDI的单个循环的长度以更简单的进行编码。
·开启S档案后产生的多轨MIDI, 可能会有一些以W96编码或Wnn值的空的标记,他们可以保证轨道有相同长度的值
·你也必须参考你的MIDI软件的"事件清单"来找出在你的S文件的什么地方进行循环(例如,找到行标). 
·你也可以用一个单轨S文件并且使它与最高处数字(行号)的轨道合拍。我将稍后放上相关文件。
·别忘记备份你的文件。
【范例】
此帖包含了一些范例文件,你可以在附件中下载到。
祝你在完成GBA音乐重复的过程中好运!
HOHO~汉化:Woodu
如果觉得不对的地方请参考原文~汉化过程中比较匆忙~请多多见谅!