积分 18
注册时间 2015-12-24
最后登录 1970-1-1
本帖最后由 chaoliu1 于 2015-12-25 16:16 编辑
上图虽是一张图,但内容是2个,此处就暂时称为图1图2吧。
现象一:在FL studio中验证
图1:用FL软件写3个音符,长度相同,开始时间不同(为看清,所以用PS画图时故意上下错位一点)。保存为midi文件
图2:用FL软件再次打开这个MIDI文件,发现3个音符的长度变了!仔细看又发现3个开始时间与图一相同,3个中止时间也与图一相同。
现象二:用C语言验证
根据midi格式技术文档编写程序,读取该midi文件,有关这3个音符的事件代码如下:
{
"AbsTicks": 0,"DeltaTicks": 0,"Status": 144,"MsgType": "Channel",
"Msg": [{"MidiChannel": 0,"Command": "NoteOn","Data1": 60,"Data2": 100}]
},
{
"AbsTicks": 24,"DeltaTicks": 24,"Status": 144,"MsgType": "Channel",
"Msg": [{"MidiChannel": 0,"Command": "NoteOn","Data1": 60,"Data2": 100}]
},
{
"AbsTicks": 48,"DeltaTicks": 24,"Status": 144,"MsgType": "Channel",
"Msg": [{"MidiChannel": 0,"Command": "NoteOn","Data1": 60,"Data2": 100}]
},
{
"AbsTicks": 192,"DeltaTicks": 144,"Status": 128,"MsgType": "Channel",
"Msg": [{"MidiChannel": 0,"Command": "NoteOff","Data1": 60,"Data2": 64}]
},
{
"AbsTicks": 216,"DeltaTicks": 24,"Status": 128,"MsgType": "Channel",
"Msg": [{"MidiChannel": 0,"Command": "NoteOff","Data1": 60,"Data2": 64}]
},
{
"AbsTicks": 240,"DeltaTicks": 24,"Status": 128,"MsgType": "Channel",
"Msg": [{"MidiChannel": 0,"Command": "NoteOff","Data1": 60,"Data2": 64}]
}
可以看出,3个noteOn的AbsoluteTicks分别是0、24、48,DeltaTicks与上一事件相对间隔分别为0,24,24
3个noteOff的AbsoluteTicks分别是192、216、240,DeltaTicks与上一事件相对间隔分别为144,24,24
这都很好理解,但由于note事件没有ID,当3个音符都开始发声之后,它们的参数完全相同(音高都是C5,Data1=60)
而发生第1个noteOff的时候(音高是C5),此时就不知道是哪个音符应该停止发声 ,反正FL软件是按图2来的,先让最近的一个C5停止发声,这算不算Bug呢?
疑问:
因为要编写一个音乐节奏游戏类似vos那样,所以这个问题就成了问题。我能说midi文件功能不全吗?
虽说为了节约几个字节便于设备传输,但几十年过去了,技术已经进步,完全没必要处处省略控制字符,50KB和100KB的midi在设备上差别很大吗,干嘛不制定midi2标准呢?
评分
查看全部评分