Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def check(self, name, value):
if name == 'frame_rate':
if value not in _smpte_framerate_encode:
valid = ', '.join(sorted(_smpte_framerate_encode.keys()))
raise ValueError('frame_rate must be one of {}'.format(valid))
elif name == 'hours':
check_int(value, 0, 255)
elif name in ['minutes', 'seconds']:
check_int(value, 0, 59)
elif name == 'frames':
check_int(value, 0, 255)
elif name == 'sub_frames':
check_int(value, 0, 99)
class MetaSpec_time_signature(MetaSpec):
type_byte = 0x58
# Todo: these need more sensible names.
attributes = ['numerator',
'denominator',
'clocks_per_click',
'notated_32nd_notes_per_beat']
defaults = [4, 2, 24, 8]
def decode(self, message, data):
message.numerator = data[0]
message.denominator = 2 ** data[1]
message.clocks_per_click = data[2]
message.notated_32nd_notes_per_beat = data[3]
def encode(self, message):
return [
defaults = ['C']
def decode(self, message, data):
key = signed('byte', data[0])
mode = data[1]
message.key = _key_signature_decode[(key, mode)]
def encode(self, message):
key, mode = _key_signature_encode[message.key]
return [unsigned('byte', key), mode]
def check(self, name, value):
if not value in _key_signature_encode:
raise ValueError('invalid key {!r}'.format(value))
class MetaSpec_sequencer_specific(MetaSpec):
type_byte = 0x7f
attributes = ['data']
defaults = [[]]
def decode(self, message, data):
message.data = tuple(data)
def encode(self, message):
return list(message.data)
_specs = {}
def add_meta_spec(klass):
spec = klass()
if not hasattr(spec, 'type'):
name = klass.__name__.replace('MetaSpec_', '')
def decode(self, message, data):
if len(data) == 0:
# Message with length 0 can occur in some files.
# (See issues 42 and 93.)
message.port = 0
else:
message.port = data[0]
def encode(self, message):
return [message.port]
def check(self, name, value):
check_int(value, 0, 255)
class MetaSpec_end_of_track(MetaSpec):
type_byte = 0x2f
attributes = []
defaults = []
def decode(self, message, data):
pass
def encode(self, message):
return []
class MetaSpec_set_tempo(MetaSpec):
type_byte = 0x51
attributes = ['tempo']
defaults = [500000]
check_int(value, 0, 255)
class MetaSpec_end_of_track(MetaSpec):
type_byte = 0x2f
attributes = []
defaults = []
def decode(self, message, data):
pass
def encode(self, message):
return []
class MetaSpec_set_tempo(MetaSpec):
type_byte = 0x51
attributes = ['tempo']
defaults = [500000]
def decode(self, message, data):
message.tempo = (data[0] << 16) | (data[1] << 8) | (data[2])
def encode(self, message):
tempo = message.tempo
return [tempo >> 16, tempo >> 8 & 0xff, tempo & 0xff]
def check(self, name, value):
check_int(value, 0, 0xffffff)
class MetaSpec_smpte_offset(MetaSpec):
class MetaSpec_sequence_number(MetaSpec):
type_byte = 0x00
attributes = ['number']
defaults = [0]
def decode(self, message, data):
message.number = (data[0] << 8) | data[1]
def encode(self, message):
return [message.number >> 8, message.number & 0xff]
def check(self, name, value):
check_int(value, 0, 255)
class MetaSpec_text(MetaSpec):
type_byte = 0x01
attributes = ['text']
defaults = ['']
def decode(self, message, data):
message.text = decode_string(data)
def encode(self, message):
return encode_string(message.text)
def check(self, name, value):
check_str(value)
class MetaSpec_copyright(MetaSpec_text):
type_byte = 0x02
def __init__(self, type_, **kwargs):
# Todo: allow type_ to be a type byte?
# Todo: handle unknown type.
if isinstance(type_, MetaSpec):
self.__dict__['_spec'] = type_
else:
self.__dict__['_spec'] = _specs[type_]
self.__dict__['type'] = self._spec.type
for name in kwargs:
if name == 'time':
continue # Time is always allowed.
if name not in self._spec.settable_attributes:
raise ValueError(
'{} is not a valid argument for this message type'.format(
name))
for name, value in zip(self._spec.attributes, self._spec.defaults):
raise ValueError('attribute must be in range {}..{}'.format(low, high))
if PY2:
def check_str(value):
if not isinstance(value, basestring):
raise TypeError('attribute must be unicode or string')
else:
def check_str(value):
if not isinstance(value, str):
raise TypeError('attribute must a string')
class MetaSpec(object):
def check(self, name, value):
pass
class MetaSpec_sequence_number(MetaSpec):
type_byte = 0x00
attributes = ['number']
defaults = [0]
def decode(self, message, data):
message.number = (data[0] << 8) | data[1]
def encode(self, message):
return [message.number >> 8, message.number & 0xff]
def check(self, name, value):
check_int(value, 0, 255)
class MetaSpec_text(MetaSpec):
type_byte = 0x01
attributes = ['text']
type_byte = 0x51
attributes = ['tempo']
defaults = [500000]
def decode(self, message, data):
message.tempo = (data[0] << 16) | (data[1] << 8) | (data[2])
def encode(self, message):
tempo = message.tempo
return [tempo >> 16, tempo >> 8 & 0xff, tempo & 0xff]
def check(self, name, value):
check_int(value, 0, 0xffffff)
class MetaSpec_smpte_offset(MetaSpec):
type_byte = 0x54
attributes = ['frame_rate',
'hours',
'minutes',
'seconds',
'frames',
'sub_frames'
]
# TODO: What are some good defaults?
defaults = [24, 0, 0, 0, 0, 0]
def decode(self, message, data):
message.frame_rate = _smpte_framerate_decode[(data[0] >> 6)]
message.hours = (data[0] & 0x3f)
message.minutes = data[1]
message.seconds = data[2]
def check(self, name, value):
if name == 'denominator':
# This allows for the ridiculous time signature of
# 4/57896044618658097711785492504343953926634...
# 992332820282019728792003956564819968
check_int(value, 1, 2 ** 255)
encoded = math.log(value, 2)
encoded_int = int(encoded)
if encoded != encoded_int:
raise ValueError('denominator must be a power of 2')
else:
check_int(value, 0, 255)
class MetaSpec_key_signature(MetaSpec):
type_byte = 0x59
attributes = ['key']
defaults = ['C']
def decode(self, message, data):
key = signed('byte', data[0])
mode = data[1]
try:
message.key = _key_signature_decode[(key, mode)]
except KeyError:
if key < 7:
msg = ('Could not decode key with {} '
'flats and mode {}'.format(abs(key), mode))
else:
msg = ('Could not decode key with {} '
'sharps and mode {}'.format(key, mode))
def check(self, name, value):
if name == 'frame_rate':
if value not in _smpte_framerate_encode:
valid = ', '.join(sorted(_smpte_framerate_encode.keys()))
raise ValueError('frame_rate must be one of {}'.format(valid))
elif name == 'hours':
check_int(value, 0, 255)
elif name in ['minutes', 'seconds']:
check_int(value, 0, 59)
elif name == 'frames':
check_int(value, 0, 255)
elif name == 'sub_frames':
check_int(value, 0, 99)
class MetaSpec_time_signature(MetaSpec):
type_byte = 0x58
# TODO: these need more sensible names.
attributes = ['numerator',
'denominator',
'clocks_per_click',
'notated_32nd_notes_per_beat']
defaults = [4, 4, 24, 8]
def decode(self, message, data):
message.numerator = data[0]
message.denominator = 2 ** data[1]
message.clocks_per_click = data[2]
message.notated_32nd_notes_per_beat = data[3]
def encode(self, message):
return [message.numerator,