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?