我正在用 VB.NET 编写一个 MIDI 文件解析器。该程序非常适合单轨/格式 0 MIDI 文件,但在处理多轨时会出错。 这是我用于阅读曲目的代码:
For x As Integer = 0 To metadata.NumberTracks - 1
Dim trk As New Track
Dim numberBytes As Integer = 0
For z As Integer = 0 To 3
numberBytes = (256 * numberBytes) + reader.ReadByte
Next
Dim runningStatusType As Byte
Dim runningStatusChannel As Byte
Do
trk.addEvent(getNextEvent(reader, runningStatusType, runningStatusChannel))
Loop Until GetType(EndOfTrack) = trk.getLastEvent().GetType
Next
getNextEvent
函数判断事件是channel-voice还是meta-event并返回正确的事件类型,通过引用将BinaryReader对象传递给事件的构造函数,以便它可以独立读取自己的事件数据。
问题是 BinaryReader 到达文件末尾并在上述 For 循环遍历所有轨道之前抛出 EndOfStream 异常
我尝试使用每个轨道中的字节数作为添加事件的
Do
循环的条件,而不是读取直到收到 EndOfTrack 消息,但是这会产生类似的错误。
我再次强调,这个问题只发生在多轨 MIDI 文件中,并且看到多轨文件与单轨文件相同,除了第一条之后有额外的轨道,我希望我的程序能够运行。
是否有我没有考虑到的 MIDI 文件元素,例如轨道中的轨道,导致程序问题或我从错误的角度处理问题?
我正在第二次重写这个项目,我已经使用 MIDI 文件大约 2 年了,但我仍然不明白为什么多轨文件不起作用
如果有人能帮助指出问题,我将不胜感激。 非常感谢, 罗伊H
正如我们在下面突出显示的代码行中看到的那样:
trk.addEvent(getNextEvent(reader, runningStatusType, runningStatusChannel))
你没有确定VB文件中的构造函数类没有分配与后面出现的函数相同数量的内存。