def _instantiate_library(): 'Initialize Portmidi library' global SINGLETON SINGLETON = ffi.new('PortMidiStream **') num = lib.Pm_Initialize() if num: raise MidiException(errno=num)
def write_many(self, events): num = len(events) cdata = ffi.new('PmEvent []', num) for i, e in enumerate(events): cdata[i].message, cdata[i].timestamp = e.message, e.timestamp ret = lib.Pm_Write(self.stream, cdata, num) try: assert(ret == 0) except AssertionError: raise MidiException('Error writing PmEvents to stream')
def write_one(self, event): cdata = ffi.new('PmEvent []', 1) cdata[0].message = event.message cdata[0].timestamp = event.timestamp ret = lib.Pm_Write(self.stream, cdata, 1) try: assert(ret == 0) except AssertionError: raise MidiException( 'Error writing PmEvent to stream: {}'.format(ret))
def open_stream(self): pp_stream = ffi.new('PortMidiStream **') try: err = lib.Pm_OpenInput(pp_stream, self.device_id, self.PNULL, self.buffer_size, self.PNULL, self.PNULL) self.stream = pp_stream[0] assert(err == 0) except AssertionError: self.stream = None raise MidiException(text='Invalid Device ID')
def __init__(self, device_id, buffer_size=4096): '''Initialize a new MIDI Input Stream and open it If the stream fails to open a MidiException will be raised. :param device_id :param buffer_size is the num of PmEvents that can be stored at a time ''' if not _is_instantiated(): _instantiate_library() self.buffer_size = buffer_size self.buffer = ffi.new('PmEvent []', buffer_size) self.device_id = device_id self.stream = None self.open_stream()
def open_stream(self): 'Open portmidi Output Stream and assert that everything went well' pp_stream = ffi.new('PortMidiStream **') try: err = lib.Pm_OpenOutput(pp_stream, self.device_id, self.PNULL, self.buffer_size, self.PNULL, self.PNULL, 0) self.stream = pp_stream[0] assert(err == 0) except AssertionError: self.stream = None raise MidiException(text='Invalid Device ID')