gpt4 book ai didi

java - 解码未知的 MIDI 事件

转载 作者:行者123 更新时间:2023-11-30 07:32:01 26 4
gpt4 key购买 nike

我正在用 Java 编写一个 MIDI 文件读取器(主要作为练习,可能用于 Android 项目,因为它不包含 javax.sound.midi 库)。我正在关注 this规范。

我在我的项目中很好地实现了规范细节,实际阅读是逐个事件进行的。在文件上打开一个 InputStream,并传递相同的对象来解析各种事件对象,这样当一个事件完成解析自身时,流就会定位到下一个事件。这一切都非常出色。

我的第一个测试文件只是一个速度图,其中包含一个在 Sonar 8 中创建的空数据轨道。速度轨道被完美解析。空轨道在其 block 标识符和轨道名称之后具有以下数据:

00 B0 07 47 00 0A 40 00 FF 2F 00

第一个字节被成功解析。 00 = 0 的增量时间,B0 = channel 0 上的 Controller 事件,07 = 主音量控制,47 = 体积值为 71。

接下来的字节让我感到困惑。 00 0A 40 最有可能的情况是它是一个值为 64 的 Pan 事件。0A 是一种 Controller 事件,我希望它前面有 B0 音量事件也是如此。但由于它前面没有已知的事件标识符字节,因此我的阅读器无法解析此事件。

所以我想我的问题是如何解释此类事件?在文件格式中是否可以接受将 Controller 事件像这样与单个 B0 标识符串在一起?此外,如果我在文件中遇到无法识别的事件类型,如果我不知道事件应该是什么,真的有办法知道我可以跳过多少数据吗?我希望能够跳过未知事件,这样我的读者就不会失败,但如果我无法识别事件,我不确定如何跳过它。希望对这些具体案例有所了解。

最佳答案

那叫运行状态。它是 MIDI 规范的一部分。你正在做的是完全正确的事情。抱歉,您必须通过对 MIDI 数据流进行逆向工程来解决这个问题。 Here is a longer explanation of running status.

是的,力度为 0 的音符开启事件是音符关闭。实际的 Note Off 事件具有关联的速度,但几乎没有设备实现 Note Off 速度,因此看到零速度的 Note On 更为常见。

关于java - 解码未知的 MIDI 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com