2016-09-05 6 views
1

Je veux ouvrir un fichier MIDI et analyser chaque octet. Mais je suis très peu familier avec la manipulation des octets et des bits. Les Midi sont écrits en hexadécimal si cela fait une différence.Comment puis-je obtenir chaque octet dans une liste

Ce que je veux faire est de mettre chaque octet dans une liste, puis faire une boucle pour vérifier chacun d'eux. Comment ferais-je cela?

Je suis venu jusqu'ici (ce qui est pas très loin):

# Open MIDI file 
mFile = open("test.mid", 'rb') 

# Checks if file is MIDI 
hChunk = mFile.read(4) 
if hChunk != b'MThd': 
    raise ValueError('Not a MIDI file') 

print(mFile.read()) 

Aussi, si quelqu'un a des liens faciles à comprendre d'explication du format MIDI, ce serait apprécié! :)

+1

'contenu = mFile.read()'. 'contents' est maintenant un tableau d'octets, auquel vous pouvez accéder avec' contents [n] 'n étant le décalage. Il vous donnera la valeur des octets –

+0

@ Jean-FrançoisFabre Qu'entendez-vous par "la valeur de l'octet"? Quand j'imprime le contenu j'obtiens _b'MThd \ x00 \ x00 \ x00 \ x06 \ x00_ (etc) et si je prends le contenu de fx [0] j'obtiens 77. Que représente le 77? Et comment puis-je l'obtenir au format xFF? Merci! – Sorrells

+0

77 est la valeur ASCII de "M". Si vous avez besoin de séquences d'octets au lieu de nombres, découpez-les à la place. –

Répondre

1

vient de terminer votre code pour scanner les 40 premiers octets de données. Il imprime la valeur décimale ainsi que la valeur hexadécimale en utilisant à la fois le format % en forme de C et la méthode plus pythonique format, ce qui peut être plus compréhensible si la spécification de format est en hexadécimal.

fichier midi a été téléchargé here et enregistré dans le répertoire du script (d'où le stuff __file__ étrange pour calculer dir correct lors du test)

import os 

# Open MIDI file 
mFile = open(os.path.join(os.path.dirname(__file__),"MIDI_sample.mid"), 'rb') 

# Checks if file is MIDI 
hChunk = mFile.read(4) 
if hChunk != b'MThd': 
    raise ValueError('Not a MIDI file') 

contents = mFile.read() 
mFile.close() 

total_len = len(contents) 

for i in range(0,40): 
    print(contents[i],"x%02X"% contents[i],"x{:02X}".format(contents[i])) 
+0

Cela fonctionne parfaitement! Merci! J'ai une dernière question cependant; que fait la ligne "x% 02X"% contenu [i]/comment ça marche? Est-ce que ça change simplement le 77 en une valeur hexadécimale? – Sorrells

+1

il convertit la valeur en chaîne hexadécimale, uniquement à des fins d'affichage/de débogage. Pour comparer des entiers avec des valeurs données, vous pouvez simplement faire: 'contents [i] == 0x4d' –

+0

Ah, c'est logique. Merci beaucoup pour votre aide! – Sorrells