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
如果觉得不对的地方请参考原文~汉化过程中比较匆忙~请多多见谅!