2017-01-26 2 views
0

J'ai téléchargé la bibliothèque midifile de sapp.org aujourd'hui. J'ai créé un fichier de test dans Guitar Pro 5, l'ai exporté en tant que midi et l'ai ouvert avec C++. Jusqu'ici, tout va bien. Je peux lire toutes les pistes et le BPM sont corrects.
Je veux maintenant aller d'un événement à l'autre et lire la clé et la durée de l'événement. Pendant que j'obtiens l'information clé correspondante, la durée retourne zéro.midifile: getDurationInSeconds est 0 pour tous les événements

Mon code est le suivant:

#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; 
} 

Mon exemple de fichier MIDI est ici: http://wikisend.com/download/186754/drumtest.mid
La bibliothèque se trouve ici: http://midifile.sapp.org/

Répondre

0

Dans un fichier MIDI, les événements ne sont pas durées; les notes se composent de deux événements, note sur et note off.

Pour connaître la longueur d'une note, vous devez rechercher les paires d'événements correspondantes.

Apparemment, Midifile ne le fait pas automatiquement pour une raison quelconque, mais nécessite que vous appeliez MidiFile::linkNotePairs().