MIDI 文件解析器在读取所有曲目之前到达文件末尾

问题描述 投票:0回答:1

我正在用 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

vb.net media-player media midi audio-player
1个回答
0
投票

正如我们在下面突出显示的代码行中看到的那样:

trk.addEvent(getNextEvent(reader, runningStatusType, runningStatusChannel))

你没有确定VB文件中的构造函数类没有分配与后面出现的函数相同数量的内存。

© www.soinside.com 2019 - 2024. All rights reserved.