Chargement...
 
[Voir/Cacher menus de gauche]
[Voir/Cacher menus de droite]

7 - Développer/Traduire/Documenter/Annoncer une application

> Forums de discussion > 7 - Développer/Traduire/Documenter/Annoncer une application > [RÉSOLU] codage fichier midi - besoin d'aide
Dernier post

[RÉSOLU] codage fichier midi - besoin d'aide

Thy06 utilisateur non connecté
Bonjour à tous

Nouveau ici, je cherche à résoudre un problème de codage de fichier MIDI.

Je crée en ce moment une application pour écouter des suites de notes sur des accords (pour expérimenter différentes combinaisons, je ne rentre pas dans le détail, ce serait long).
J'utilise un logiciel de gestion de base de données (File Maker pro) pour éditer et exporter du code midi, puis VLC pour écouter le fichier.

Je bute sur un problème de formatage de données concernant les délais :

1 - Entête du fichier :
codage de la division pour 1 temps (valeur de la note noire). Jusqu'à présent j'utilisais la valeur décimale 16 suffisante pour coder jusqu'à la quadruple croche.
Mais depuis que j'ai intégré des séquences batterie avec triolets de croches, cette division ne peut plus fonctionner.
Je vais donc utiliser la valeur 480 qui est assez répandue qui codée en hexa donne : 01 E0

2 - Délais des événements :
Mon problème est qu'avec cette valeur 480 je n'arrive plus à coder les délais des notes. Il doivent être codés sur 2 octets.

Je me réfère donc à la page du site : Decryptage-fichier-MIDI
paragraphe : "Le décalage ou délai pour traiter le code"

(j'ai du mal avec les bits à ignorer... je ne comprends pas tout)

D'après le peu que j'ai compris, pour coder le délai d'une noire je fais :
       ENT (480 / 128) = 3
       reste 96
       ce qui donne en hexa : 03 60

Bien évidemment, ça ne marche pas, voire même pas du tout.

Quand je décortique des séquences de notes exportées depuis MUSESCORE
ex une noire qui démarre à la fin de la précédente note : 19 3C 50 83 47 3C 00

je trouve ces valeurs de délai :
       le délai de note ON 19 devrait être 00 (puisque collé à la précédente note), je ne comprends pas la valeur 19
       le délai de note OFF 83 47, si je le convertis en ticks, j'obtiens
              83 = d131 = 131*128 = 16768
              47 = d71
              total 16768 + 71 = 16839 ticks
              soit 16839/480 = 35,08 noires ???? je devrais obtenir 1 noire
       je n'y comprends rien

Si quelqu'un peut venir à mon secours, merci....

Cordialement
Thierry

ardoisebleue utilisateur non connecté France
Je me replonge dans le MIDI et j'essaye de te répondre !
En attendant regardes le paragraphe "Codage de notes avec jeu simultané" si tu ne l'as pas encore lu.
Le délai est bien l'écart entre deux evénements MIDI quels qu'ils soient. Donc si les evénements doivent être simultanés le délai=0.
Pour le bit de début d'octet du délai :
Le codage du délai est compris entre 1 et 4 octets, si un octet suffit pour la valeur du délai, ce seul octet à son premier à 0, si 2 octets sont nécessaires, le premier octet à son premier bit à 1 et le deuxième octet à son premier bit à 0, pour indiquer qu'il n'y a plus d'octet de délai après lui, mais que l'octet qui le suit est le code MIDI.
je continue ma plogée en apnée et je remonte !

ardoisebleue utilisateur non connecté France
En premier j'ai trouvé une erreur dans l'exemple du paragraphe "Le décalage ou délai pour traiter le code".
Je l'ai corrigé dans la fiche au lieu de :
le premier bit est ignorer => 100101 = d165
il faut lire :
le premier bit est ignorer => 100101 = d37

Trouver le début de l'exécution des notes est compliqué, il faut d'abord trouver la séquence : "4d 54 72 6b" (Mtrk) est le code de départ de la piste, ensuite passer tous le codage du paramètrage de cette piste qui devrait se terminer par une série de :
xx 51 ..... valeurs des codes contrôles utilisés dans cette piste au démarrage.
Et enfin tomber :
- soit sur une séquence du genre :
00 90 2c 7F : 00 = dés le départ, 90 = départ d'un note, 2c(sol), 7F vélocité.
- soit sur : xx ff 2f 00 qui indique la fin de la piste.

Ensuite le décryptage devient plus compliqué car il y a des exceptions où les codes 90 ou 80 sont omis (à l'époque il fallait compresser au maximum les données car le matériel électronique était " lent ").
Pour éclairer tout çà il est préférable de lire le paragraphe "codage des notes".
Dans tous les cas dans le codage note, il y a un octet final qui donne la valeur de la vélocité, celle-ci est à 00 quand la note est finie :
xx 90 2c 7F
...
xx xx 80 2c 00
ou
xx xx 2c 00 (omission du code noteoff 80)

Enfin pour répondre à ta question, maintenant que j'ai réussi à me remettre dans le jus :
h83 en binaire = 10000011, on ignore le premier bit donc = d3
3*128+71 = 455
Là tu es plus proche de la valeur.
Pour effectuer mes essais avec rosegarden, j'ai placé toutes les notes et codes contrôles utilisés pour la rédaction de la fiche avec l'éditeur d'événements, pour écrire des valeurs précises, il ne faut pas utiliser un autre éditeur sinon il peut y avoir des millisecondes qui se baladent.
Je te souhaite une bonne journée.

Thy06 utilisateur non connecté
Merci ardoisebleue

Je suis bien d'accord pour le délai à 0.
Que ce soit une note jouée de suite après la fin de la précédente
ou que ce soit un accord où toutes les notes sont jouées simultanément.

Mon problème ce sont les délais > 0 et codés sur 2 octets.
J'ai bien lu ce que tu écris, mais les bits à 1 ou 0... je ne sais pas trop quoi en faire

En fait mon problème peut être posé simplement :
J'ai choisi une valeur de division de noire de 480 (valeur hexa "01 E0" qui est définie dans l'entête du fichier)
A partir de là, comment coder un délai égal à une noire, à une croche, triolet de croche...

Pense à respirer de temps en temps :-)

Thy06 utilisateur non connecté
on s'est répondu presque en même temps !

pour faire suite à ma précédente réponse, est-ce que tu peux m'expliquer comment je peux faire l'inverse, soit :
- partir d'une valeur de note exemple une croche (qui correspondrait dont à 240 ticks dans mon cas)
- et obtenir un codage sur 2 octets

quelle méthode de calcul

je commence un peu à comprendre, mais il m'en manque encore.
En reprenant l'exemple que j'ai donné tout en haut : h83 h47

h83 : 10000011 : d3
h47 : 1000111 : d71 ?
et en final ça fait quelle valeur décimale ces deux octets ?

ardoisebleue utilisateur non connecté France
calcul "manuel" :

Pour d240 :

240 / 128 = 1,.. donc un premier octet à 1 parce que : 1*128
240 - 128 = 112 valeur du dernier octet

- codage pour le premier octet :
d1 = h01 = b00000001 pour le codage mettre le premier bit à 1 :
b10000001 = h81 = d129
- codage pour le deuxième octet :
d112 = h70 = b01110000 pour le codage laisser le premier bit à 0.

Pour 2587522 (chiffre quelconque)

2587522 / 128³ = 1,.... premier octet = 1*(128³)
2587522 - 1*(128³) = 490370
490370 / 128² = 29,.... deuxième octet = 29*(128²)
490370 - 29*(128²) = 15234
15234 / 128 = 119,.... troisième octet = 119*128
dernier octet = 15234 - 119*128 = 2

nous aurons donc :
b00000001
b00011101
b01110111
b00000010

soit en hexa avec le premier bit à 1 pour les trois premiers octets :
h81
h9D
hF7
h02

pour la valeur décimale de :
H83 d3
H47 d71
3*128 + 71 = 455.

J'espère que tu trouveras là-dedans de quoi cogiter.
bonne journée

Thy06 utilisateur non connecté
C'est très clair maintenant.
Et ça marche.
Un grand merci à toi d'avoir pris le temps de m'expliquer,
bonne continuation, bonne musique

bonne soirée
Thierry

ardoisebleue utilisateur non connecté France
Nous sommes là pour cela, répondre quand on peut et faire avancer la MAO libre.
N'oublies pas de mettre un [résolu] devant le titre.
bye!

Afficher les articles :
Aller au forum :

Documentation [Afficher / Cacher]

Faire un don
[Afficher / Cacher]

Connexion
[Afficher / Cacher]

tongo


Mégaphone [Afficher / Cacher]

sub26nico, 10:25, dim. 09 mai 2021: Salut et bienvenue à ZatGuy et Xdl :-)
r1, 21:23, jeu. 06 mai 2021: Les zigotos de l'édito sont vraiment de super héros !
allany, 07:38, jeu. 06 mai 2021: Héoooo, du bateau ! C'est l'édito, matelots ! [Lien]
eric_p, 21:54, mar. 04 mai 2021: News glanée à l'instant: "Audacity has just joined Muse Group, a collection of brands that includes another popular open source music app called MuseScore" [Lien]
Samuel, 13:56, mar. 04 mai 2021: Dernières 24h pour proposer des idées de thèmes pour les prochaines joutes musicales de linuxmao. C'est par ici [Lien]
sub26nico, 23:09, dim. 02 mai 2021: Salut et bienvenue à citronvert :-)
sub26nico, 16:52, dim. 02 mai 2021: Bonjour et bienvenue à midve :-)
youki, 16:34, ven. 30 Apr 2021: Je ne sais pas si ça a déjà été évoqué. Je regardais par hasard cette vidéo : A et surprise, il y a une version vst3 Linux de ce compresseur gratuit. [Lien]
olinuxx, 12:01, mar. 27 Apr 2021: Bonjour et bienvenue à ThM cool
sub26nico, 23:51, lun. 26 Apr 2021: Salut et bienvenue à prederour, jchmsq et caster33 :-)
olinuxx, 13:48, sam. 24 Apr 2021: Bonjour et bienvenue à astroblush cool
calixtus06, 14:45, ven. 23 Apr 2021: Bienvenue à toi miko974 :-)