0

我编写了一个程序来解析一个 midi 文件并找到所有 Note_On 事件。

我进入我的 DAW 钢琴卷并画出D4、D5、F4

我的程序正确找到 Note_One 事件并正确识别它们。

然后我去我的midi键盘弹奏完全相同的音符,然后保存midi文件。

我的程序发现,D4,D4,D5,D5,F4,F4

即它使音符翻倍!为什么我得到不同的结果?两个 MIDI 文件在 DAW 中看起来是一样的:它们都有三个音符。

这是两个midi文件:

https://drive.google.com/drive/folders/1CUgTJNH-jD5rPJEmT0aSwRp4PhaatxYq?usp=sharing

这是我从文件中读取 Midi 数据的代码:

for i, track in enumerate(Ians_midi.tracks):
    for msg in track:
        if msg.type == 'note_on':   ... 
4

1 回答 1

0

MIDI 规范说:

MIDI 提供了两种大致等效的关闭音符(声音)的方法。可以通过为相同的音符编号和通道发送 Note-Off 消息,或者通过为该音符和通道发送一个力度值为零的 Note-On 消息来关闭一个音符。使用“Note-On at zero velocity”的好处是可以避免在使用 Running Status 时发送额外的状态字节。

由于这种效率,发送速度值为零的 Note-On 消息是最常用的方法。然而,一些键盘乐器实现释放速度,其中使用伴随“速度关闭”字节的 Note-Off 代码 (8nH)。接收者必须能够识别关闭音符的任何一种方法,并且应该以相同的方式对待它们。

因此,当您收到一条note_on消息时,您还必须检查它的velocity.

于 2019-07-02T06:33:34.377 回答