怎么统计midi文件里的具体音高的音符数量?

比如给一个mid文件,统计C3有多少个,D3有多少个这样的功能。

1 Like

首先要知道MIDI系统、MIDI事件等的含义。比如MIDI事件Note On和Note Off,以及知道MIDI系统中“通道”的概念。如果我写一个MIDI事件串,比如92 3C 6B,或者80 44 7F,或者9A 26 00能一下子反应出含义,就可以了。要是不知道是什么含义的话,需要先了解MIDI系统和MIDI事件的含义,可以参考如“MIDI原理与开发应用”等书籍。

然后要知道MIDI文件的结构,可以看我写过的一些帖子:

OK,到这里就基本上了。我只介绍思路,没有代码,因为我也没写过~

大概思路的话,就在MIDI文件的各个MTrk Chunk中统计9p qq xx字串的数目,其中p是通道号,qq是想统计的音符号,xx是力度,只要不为0就行。因为Note On事件的力度为零时,等同于Note Off,MIDI文件里经常这么用。

另外,不能简单地就那么统计9p qq xx的事件。因为MIDI文件中会有“状态字省略”的特点,就是下一个事件如果和前一个事件有相同的状态字,那么下一个事件的状态字会省略。具体看我写的这个帖子:

哦对,如果是想在某个DAW软件里,统计某个音有多少个的话,那算我这贴白写 :slight_smile:

2 Likes