Exemplo n.º 1
0
	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)
Exemplo n.º 2
0
	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))
Exemplo n.º 3
0
	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
Exemplo n.º 4
0
	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])
Exemplo n.º 5
0
	def read(self, file, event):
		event.length = read_VLV(file)
		event.key, event.scale = struct.unpack('>bB', file.read(2))
Exemplo n.º 6
0
	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))
Exemplo n.º 7
0
	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
Exemplo n.º 8
0
	def read(self, file, event):
		event.length = read_VLV(file)
Exemplo n.º 9
0
	def read(self, file, event):
		event.length = read_VLV(file)
		event.chan, = struct.unpack('>B', file.read(1))	
Exemplo n.º 10
0
	def read(self, file, event):
		event.length = read_VLV(file)
		event.text = file.read(event.length)
Exemplo n.º 11
0
	def read(self, file, event):
		event.length = read_VLV(file)
		event.MSB_number, event.LSB_number = struct.unpack('>BB', file.read(2))