我今天从 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/