def _readData(self, file, track): dt = read_VLV(file) value, = struct.unpack('>B', file.read(1)) if value == 0xFF: temp = MetaEvent() return temp.read(file, dt) elif value in [0xF0, 0xF7]: file.seek(file.tell() - 1) temp = SysExEvent() return temp.read(file, dt) elif ((value & 0xF0) >> 4) in [0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE]: # le type d'un MidiEvent est decrit sur les bits y : yyyynnnn et les bits n signifient le channel temp = MidiEvent() return temp.read(file, dt, value) else: # On passe par ici lorsque la valeur censee correspondre a un type d'event n'y correspond pas, # l'on sait donc d'après la spec MIDI que cette valeur ne correspond pas a un event # et qu'il faut instancier le dernier event joue file.seek(file.tell() - 1) # on retourne d'un octet en arriere vu que la valeur ne correspond pas a un event before_event = track.data[-1].__class__(dt) # on instancie le type d'event du dernier event if isinstance(before_event, midiformat.MidiEvent): temp = MidiEvent() return temp.read(file, dt, (((track.data[-1].event.value << 4) & 0xF0) | (track.data[-1].event.midichan & 0x0F)), before=True) # le parametre before permettra au programme de garder en memoire qu'il ne faut pas ecrire la valeur d'un event à ce moment la elif isinstance(before_event, midiformat.MetaEvent): temp = MetaEvent() return temp.read(file, dt, before=True) elif isinstance(before_event, midiformat.SysExEvent): temp = SysExEvent() return temp.read(file, dt, before=True)
def read(self, file, event): event.length = read_VLV(file) buffer, = struct.unpack('>B', file.read(1)) event.framep = (buffer & 0x60) >> 5 event.hour = buffer & 0x1F event.min, event.sec, event.fr, event.subfr = struct.unpack('>' + ('B' * (event.length - 1)), file.read(event.length-1))
def read(self, file, dt, before = False): data = midiformat.SysExEvent(dt) type, = struct.unpack('>B', file.read(1)) length = read_VLV(file) datas = list(struct.unpack('>' + ('B' * length), file.read(length))) temp = None if type == 0xF0 and datas[-1] == 0xF7: data.event = midiformat.NormalSysExEvent(before) temp = NormalSysExEvent() temp.read(length, datas, data.event) elif type == 0xF7: data.event = midiformat.AuthSysExEvent(before) temp = AuthSysExEvent() temp.read(length, datas, data.event) else: raise Exception('DivSysEx non implemente') #DivSysEx Unsupported, manque de documentation return data
def read(self, file, event): event.length = read_VLV(file) for i in xrange(event.length): event.data.append(struct.unpack('>B', file.read(1))[0])
def read(self, file, event): event.length = read_VLV(file) event.key, event.scale = struct.unpack('>bB', file.read(2))
def read(self, file, event): event.length = read_VLV(file) event.numer, event.denom, event.metro, event._32nds = struct.unpack('>' + ('B' * event.length), file.read(event.length))
def read(self, file, event): event.length = read_VLV(file) tup = struct.unpack('>' + ('B' * event.length), file.read(event.length)) event.MPQN = ((tup[0] << 16) | ((tup[1] << 8) | tup[2])) #MPQN est code sur 3 octets qu'on a recupere sous forme de tuple un par un, il faut donc effectuer une operation binaire pour retrouver la vraie valeur
def read(self, file, event): event.length = read_VLV(file)
def read(self, file, event): event.length = read_VLV(file) event.chan, = struct.unpack('>B', file.read(1))
def read(self, file, event): event.length = read_VLV(file) event.text = file.read(event.length)
def read(self, file, event): event.length = read_VLV(file) event.MSB_number, event.LSB_number = struct.unpack('>BB', file.read(2))