2016-12-22 2 views
0

J'essaie d'écrire une interface simple pour créer des fichiers MIDI. Comme un test, j'ai essayé de créer un fichier qui joue une grande échelle, toutes les notes de la même longueur. Le fichier que je reçois est le suivant (en retrait pour la lisibilité)Création d'un fichier MIDI et codage des temps d'événement: pourquoi les notes qui doivent être espacées uniformément dans le temps ralentissent-elles réellement?

4d 54 68 64 00 00 00 06 00 01 00 02 00 08 
    4d 54 72 6b 00 00 00 0b 
     00 ff 51 03 00 27 0f 
     00 ff 2f 00 
    4d 54 72 6b 00 00 00 54 
     00 c0 00 
     00 90 40 7f 
     7d 80 40 7f 
     7d 90 42 7f 
     81 7a 80 42 7f 
     81 7a 90 44 7f 
     82 77 80 44 7f 
     82 77 90 45 7f 
     83 74 80 45 7f 
     83 74 90 47 7f 
     84 71 80 47 7f 
     84 71 90 49 7f 
     85 6e 80 49 7f 
     85 6e 90 4b 7f 
     86 6b 80 4b 7f 
     86 6b 90 4c 7f 
     87 68 80 4c 7f 
     00 ff 2f 00 

Explications: La ligne 1 est l'en-tête du fichier. La ligne 2 est un en-tête de piste. (Dans mon interface, je réserve une piste pour les percussions, et aussi pour régler le tempo. Comme je n'ai pas de percussion dans cet exemple, il n'y a pas de notes.) La ligne 3 règle le tempo, la ligne 4 termine la piste. La ligne 5 est un autre en-tête de piste. Cette piste contient la mélodie. La ligne 6 règle l'instrument pour le canal 0. Viennent ensuite 8 événements alternatifs de note-on et 8 de note-off pour le canal 0, puis la fin de la piste. Les temps de démarrage et la fin des notes sont:

00, 7d, 81 7a, 82 77, 83 74, 84 71, 85 6e, 86 6b, 87 68 

Pour autant que je comprends, ils doivent être espacés uniformément, parce que pour les temps d'événements MIDI utilise un format octet 7 bits où la longueur du nombre est flexible et tous octets sauf le dernier ont leur ensemble msnzb. Donc 00 devrait se traduire par 0, 7d devrait traduire par 125, 81 7a devrait se traduire par 250, etc. Mais pour une raison quelconque, lorsque vous jouez le fichier, il ne semble pas uniforme dans le temps, mais ralentit plutôt. Pourquoi est-ce vrai? Ai-je mal compris la bonne façon d'encoder le timing de l'événement, et si oui alors quelle serait la bonne façon? Ou y a-t-il un autre problème avec mon fichier qui cause le problème?

Répondre

1

Les horodatages dans un fichier MIDI sont des delta-times - vous n'encodez pas le moment où un événement se produit, vous encodez la différence de temps entre les événements séquentiels sur cette piste. Si les événements sont espacés uniformément dans le temps, leurs temps delta devraient être les mêmes.

de la norme:

La syntaxe d'un événement MTRK est très simple:

<MTrk event> = <delta-time><event>

<delta-time> est stockée en tant que quantité de longueur variable. Il représente la quantité de temps avant l'événement suivant. Si le premier événement d'une piste se produit au tout début d'une piste, ou si deux événements se produisent simultanément, un delta-time de zéro est utilisé. Les delta-times sont toujours présents. (Ne pas stocker les delta-times de 0 nécessite au moins deux octets pour toute autre valeur, et la plupart des delta-times ne sont pas nuls.) Delta-time est dans une fraction de temps (ou une seconde, pour enregistrer une piste avec SMPTE times), comme spécifié dans le bloc d'en-tête.

voir par ex. http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html