[Python] Python e MIDI

Riccardo Lemmi riccardo a reflab.it
Lun 8 Set 2008 10:25:57 CEST


Mr.SpOOn wrote:

> Salve,
> ho bisogno di utilizzare Python in combinazione con il protocollo
> MIDI. In realtà l'unica cosa di cui avrei bisogno sarebbe la
> possibilità di leggere dei fil MIDI e lavorare con i valori numerici
> delle note.
> 
> Mi è stato suggerito questo pacchetto:
> http://www.mxm.dk/products/public/pythonmidi
> Il problema è che non è molto documentato, comunque, dando un'occhiata
> a un paio di esempi si può capire.
> 
> Per fare qualche prova, però, ho creato un file MIDI usando l'editor
> MIDI MUsE, su Ubuntu, e quando provo a usare questo file in uno degli
> esempi di prima, ricevo questo errore:
> 
> format: 1, nTracks: 1, division: 384
> ----------------------------------
> 
> Start - track #0
> tempo: 500000
> Traceback (most recent call last):
>   File "example_print_file.py", line 19, in <module>
>     midiIn.read()
>   File "/home/ilsignorcarlo/ordinami/midi/MidiInFile.py", line 48, in read
>     p.parseMTrkChunks()
>   File "/home/ilsignorcarlo/ordinami/midi/MidiFileParser.py", line
> 169, in parseMTrkChunks
>     self.parseMTrkChunk() # this is where it's at!
>   File "/home/ilsignorcarlo/ordinami/midi/MidiFileParser.py", line
> 118, in parseMTrkChunk
>     dispatch.meta_event(meta_type, meta_data)
>   File "/home/ilsignorcarlo/ordinami/midi/EventDispatcher.py", line
> 258, in meta_event
>     nn, dd, cc, bb = toBytes(data)
> ValueError: need more than 2 values to unpack
> 
> 
> E non ho idea di dove sia il problema.
> Qualcuno ha pratica con il MIDI (possibilmente in combinazione con
> Python) e sa suggerirmi qualche altro pacchetto che possa fare al caso
> mio o aiutarmi a capire il problema?
> 
> Grazie,
> Carlo

Il problema è che 'data' non contiene abbastanza caratteri da poter essere
scompattato in una tupla di 4 elementi (sono solo 2).
Dato che lo standard midi prevede 4 valori per 'time signature, come riportato
correttamente nel commento:

   # TIME_SIGNATURE = 0x58 (58 04 nn dd cc bb)

l'impressione è che il file midi utilizzato non sia corretto, e che il valore
meta_length (MidiFileParser.py linea 116) che dovrebbe essere '04' non lo sia.
Controlla con un print e prova un file midi generato da un altro programma.

Nota: per time signature è previsto:
Meta Event      Type         Length     Numer   Denom   Metro   32nds
255 (0xFF)      88 (0x58)       4       0-255   0-255   0-255   1-255
i primi tre byte sono a valore fisso, il comando è sempre lungo 7 byte.
-- 
Riccardo Lemmi



Maggiori informazioni sulla lista Python