MIDI音符计数程序产生不正确的结果

时间:2017-11-12 21:42:37

标签: c++ midi

我用c ++编写了一个程序来计算.mid文件中的音符数,输出每个音符的数量(A到G#),然后将其输出到文件中。它找不到足够的音符,但我无法弄清楚原因。我是基于midi.org的MIDI文件文档构建的。

在读取文件时,它所做的只是查找note on的状态字节,1001nnnn,然后将下一个字节作为注释读取。我使用Anvil Studio制作一个只有1个音符的MIDI文件,并使用该程序对其进行分析,结果发现它只有1个正确的音符,但是当我在更大的文件(2000+音符)上使用它时,它几乎找不到所有这些,有时会发现90%以上的音符是一两个音高。

这是搜索笔记的程序段。该文件以字节模式打开,带有ios :: binary

//Loop through every byte of the file
        for (int i = 0; i <= size; i++) {

            //Read next byte of file to tempblock
            myfile.read(tempblock, 1);

            //Put int value of byte in b
            int b = tempblock[0];


            //x = first 4 binary digits of b, appended with 0000
            unsigned int x = b & 0xF0;

            //If note is next, set the next empty space of notearray to the notes value, and then set notenext to 0
            if (notenext) {

                myfile.read(tempblock, 1);
                int c = tempblock[0];
                i++;

                //Add the note to notearray if the velocity data byte is not set to 0
                if (c != 0) {
                    notearray[notecount] = b;
                    notenext = 0;
                    notecount++;
                }


            }

            //If note is not next, and x is 144 (int of 10010000, status byte for MIDI "Note on" message), set note next to true
            else if (x == 144) {

                notenext = 1;

            }

        }

有谁知道最近发生了什么?我只是缺少文件类型的组件,还是我正在使用的文件有问题?我主要看的是从midi存储库下载的古典钢琴作品

2 个答案:

答案 0 :(得分:2)

当信道消息状态字节与最后一个字节相同时,可以省略它们;这称为运行状态。

此外,{delta}时间值内可能会出现1001nnnn个字节。

您必须正确解析所有邮件才能检测到笔记。

答案 1 :(得分:0)

问题很可能是MIDI编辑器创建文件的方式。许多MIDI编辑器实际上并没有关闭音符 - 它们只是将它们的速度设置为0.这可能会使它们成为解析的王室痛苦。

查看文件中包含的原始MIDI消息,您应该会看到很多速度消息。