midifile: getDurationInSeconds 对于所有事件均为 0

midifile: getDurationInSeconds is 0 for all events

本文关键字:事件 于所 getDurationInSeconds midifile      更新时间:2023-10-16

我今天从 sapp.org 下载了midifile库。我在 guitar pro 5 中创建了一个测试文件,将其导出为 midi 并用 c++ 打开它。目前为止,一切都好。我可以阅读所有曲目,BPM 是正确的。
我现在想从一个事件转到另一个事件并读取密钥和事件持续时间。当我得到相应的关键信息时,持续时间返回零。

我的代码如下:

#include <iostream>
#include <string>
#include "../midi/include/Options.h"
#include "../midi/include/MidiFile.h"
int main(int argc, char** argv){
    if( argc != 4 ){
        std::cout << "Error: Invalid argument count. Use: ./drumgen srcmid outwav map" << std::endl;
        exit(1);
    }
    MidiFile drumInput;
    bool readFile = drumInput.read(argv[1]);
    if( !readFile ){
        std::cout << "Error: File " << argv[1] << " not found." << std::endl;
        exit(1);
    }
    int tracks = drumInput.getTrackCount();
    std::cout << "Tracks: " << tracks << std::endl;
    for( int i = 0; i < tracks; i++ ){
        int eventCount = drumInput.getEventCount(i);
        for( int j = 0; j < eventCount; j++ ){
            MidiEvent ev = drumInput.getEvent(i, j);
            int key = ev.getKeyNumber();
            int dur = ev.getDurationInSeconds();
            std::cout << key << " " << dur << ";";
        }
        std::cout << std::endl;
        std::cout << "Eventcount: " << eventCount << std::endl;
    }
    return 0;
}

我的示例 MIDI 文件在这里:
http://wikisend.com/download/186754/drumtest.mid该库可在此处找到:http://midifile.sapp.org/

在 MIDI 文件中,事件没有持续时间;音符由两个事件组成,音符开启和音符关闭。

要找出音符的长度,您必须搜索相应的事件对。

显然,由于某种原因,Midifile 不会自动执行此操作,而是要求您调用 MidiFile::linkNotePairs()