我在尝试解析midi文件时遇到问题。我试图解析frets on fire游戏使用的音符文件(它只使用midi文件所以我认为这不是相关的)如果你们中的任何人都熟悉它,我遇到的问题是一般的midi问题。我有一个名为吉他部分的音轨文件,十六进制,在十六进制编辑器中查看如下:
4D 54 72 6B 00 00 1E 74 00 FF 03 0B 50 41 52 54 20 47 55 49 54 41 52 A9 20 90 61 40 9A 20 61 00 83 60 63 40 BC
我的程序按如下方式解析这个问题:
4D M
54 T
72 R
6B K
00< -
00尺寸
1E轨道部分
74 - >
本次活动的00时间
FF事件类型(这是元)
03元事件类型
0B数据长度
50“P”
41“A”
52“R”
54“T”
20“”
47“G”
55“U”
49“我”
54“T”
41“A”
52“R”
A9事件发生时间(可变长度) 1 0101001
20次事件(可变长度) 0 0100000
90事件,频道(非元)1001 =音符开,频道= 0000
61注意有2个参数这是第一个
40这是第二个
9A可变时间 1 0011010
20变量时间 0 0100000
这是我的问题所在,没有事件类型为0x6的事件,因为0x61是01100001我们必须假设它是非元,因此事件类型应该是6(0110)并且通道是(0001)但midi规范没有包含此事件的标识..我已经添加了一些字节后,它们在某种程度上是相关的但很明显,当我的程序到达下一个字节时,无法识别事件和炸弹爆炸。
61
00
83
60
63
40
BC
如果有人认为他们可以解释我的解析逻辑出错的地方我会非常感激,抱歉格式化,我想不出更好的方式来说明我的问题。
我一直在使用这个网站:http://www.sonicspot.com/guide/midifiles.html作为参考,到目前为止它并没有让我错误。我认为这可能是直接与烦恼着火有关的东西,但它似乎并不像我下载了游戏的另一个备注文件而且该文件不包含此事件。
提前致谢。
答案 0 :(得分:7)
它被称为running status。如果事件与前一事件的类型相同,则可以消除MIDI状态字节。因此,如果定时信息之后的第一个字节是< 80美元,使用以前的状态。在$ 61字节的情况下,之前的状态是$ 90,所以它是Note On,channel 0.这是有道理的,因为前一个事件是音符号$ 61速度$ 40。此事件是音符编号$ 61速度0(释放先前播放的音符)。下一个活动是票号63美元,速度40美元。