+ # Note: Unlike other methods, this code pops bytes out of self.cmd
+ # to isolate the data.
+ msg = self.cmd.pop(0)
+ if len(self.cmd) < 1:
+ self.putx([2, ['%s: truncated manufacturer code (<1 bytes)' % \
+ status_bytes[msg][0],
+ '%s: truncated manufacturer (<1 bytes)' % \
+ status_bytes[msg][1],
+ '%s: trunc. manu.' % status_bytes[msg][2]]])
+ self.cmd, self.state = [], 'IDLE'
+ return
+ # Extract the manufacturer name (or SysEx realtime or non-realtime).
+ m1 = self.cmd.pop(0)
+ manu = (m1,)
+ if m1 == 0x00: # If byte == 0, then 2 more manufacturer bytes follow.
+ if len(self.cmd) < 2:
+ self.putx([2, ['%s: truncated manufacturer code (<3 bytes)' % \
+ status_bytes[msg][0],
+ '%s: truncated manufacturer (<3 bytes)' % \
+ status_bytes[msg][1],
+ '%s: trunc. manu.' % status_bytes[msg][2]]])
+ self.cmd, self.state = [], 'IDLE'
+ return
+ manu = (m1, self.cmd.pop(0), self.cmd.pop(0))
+ default_name = 'undefined'
+ manu_name = sysex_manufacturer_ids.get(manu, default_name)
+ if manu_name == default_name:
+ if len(manu) == 3:
+ manu_name = ('%s (0x%02x 0x%02x 0x%02x)' % \
+ (default_name, manu[0], manu[1], manu[2]),
+ default_name)
+ else:
+ manu_name = ('%s (0x%02x)' % (default_name, manu[0]),
+ default_name)
+ else:
+ manu_name = (manu_name, manu_name)
+ # Extract the payload, display in 1 of 2 formats
+ # TODO: Write methods to decode SysEx realtime & non-realtime payloads.
+ payload0 = ''
+ payload1 = ''
+ while len(self.cmd) > 0:
+ byte = self.cmd.pop(0)
+ payload0 += '0x%02x ' % (byte)
+ payload1 += '%02x ' % (byte)
+ if payload0 == '':
+ payload0 = '<empty>'
+ payload1 = '<>'
+ payload = (payload0, payload1)
+ self.putx([0, ['%s: for \'%s\' with payload %s' % \
+ (status_bytes[msg][0], manu_name[0], payload[0]),
+ '%s: \'%s\', payload %s' % \
+ (status_bytes[msg][1], manu_name[1], payload[1]),
+ '%s: \'%s\', payload %s' % \
+ (status_bytes[msg][2], manu_name[1], payload[1])]])
+ self.cmd, self.state = [], 'IDLE'
+
+ def handle_syscommon_midi_time_code_quarter_frame_msg(self, newbyte):
+ # MIDI time code quarter frame: F1 nd
+ # n = message type
+ # d = values
+ #
+ # Note: All System message codes don't utilize self.status_byte,
+ # and System Exclusive and System Common clear it.
+ c = self.cmd
+ if len(c) < 2:
+ if newbyte is None:
+ self.handle_garbage_msg(None)
+ return
+ msg = c[0]
+ nn, dd = (c[1] & 0x70) >> 4, c[1] & 0x0f
+ group = ('System Common', 'SysCom', 'SC')
+ self.es_block = self.es
+ if nn != 7: # If message type does not contain SMPTE type.
+ self.putx([0, ['%s: %s of %s, value 0x%01x' % \
+ (group[0], status_bytes[msg][0],
+ quarter_frame_type[nn][0], dd),
+ '%s: %s of %s, value 0x%01x' % \
+ (group[1], status_bytes[msg][1],
+ quarter_frame_type[nn][1], dd),
+ '%s: %s of %s, value 0x%01x' % \
+ (group[2], status_bytes[msg][2],
+ quarter_frame_type[nn][1], dd)]])
+ self.cmd, self.state = [], 'IDLE'
+ return
+ tt = (dd & 0x6) >> 1
+ self.putx([0, ['%s: %s of %s, value 0x%01x for %s' % \
+ (group[0], status_bytes[msg][0], \
+ quarter_frame_type[nn][0], dd, smpte_type[tt]),
+ '%s: %s of %s, value 0x%01x for %s' % \
+ (group[1], status_bytes[msg][1], \
+ quarter_frame_type[nn][1], dd, smpte_type[tt]),
+ '%s: %s of %s, value 0x%01x for %s' % \
+ (group[2], status_bytes[msg][2], \
+ quarter_frame_type[nn][1], dd, smpte_type[tt])]])