c++ - midifile : getDurationInSeconds is 0 for all events

标签 c++ midi

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

我的代码如下:

#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 文件中,事件没有持续时间; notes 包含两个事件,note on 和 note off。

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

显然,Midifile 出于某种原因不会自动执行此操作,但需要您调用 MidiFile::linkNotePairs()

关于c++ - midifile : getDurationInSeconds is 0 for all events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41876331/

相关文章:

c++ - C++ 中的 typedef 总结和定义一个具有两个函数的新类型

c++ - 如何使用纯 C++ 而不是 C++/CLI 开发通用 Windows 10 应用程序?

c++ - 如果手动关闭程序,是否会调用析构函数?

java midi 延迟

java - 如何创建声音淡出效果

java - 将弯音发送到 Java 中的 MIDI 音序器

c++ - 如何将 Scala 函数转换为 C++ 中的参数?

c++ - Mac 上的 clang 不支持统一初始化吗?

c++ - (C++) 特定位数的整数(MIDI 文件)

Midi 设置速度元事件