def __init__(self, c_instance):
        self._ProjectMixIO__c_instance = c_instance
        self._ProjectMixIO__components = []
        self._ProjectMixIO__main_display = MainDisplay(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__main_display)
        self._ProjectMixIO__main_display_controller = MainDisplayController(
            self, self._ProjectMixIO__main_display)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__main_display_controller)
        self._ProjectMixIO__software_controller = SoftwareController(self)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__software_controller)
        self._ProjectMixIO__transport = Transport(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__transport)
        self._ProjectMixIO__channel_strips = [
            ChannelStrip(self, i) for i in range(NUM_CHANNEL_STRIPS)
        ]
        for s in self._ProjectMixIO__channel_strips:
            self._ProjectMixIO__components.append(s)

        self._ProjectMixIO__master_strip = MasterChannelStrip(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__master_strip)
        self._ProjectMixIO__channel_strip_controller = ChannelStripController(
            self, self._ProjectMixIO__channel_strips,
            self._ProjectMixIO__master_strip,
            self._ProjectMixIO__main_display_controller)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__channel_strip_controller)
        self._ProjectMixIO__shift_is_pressed = False
        self._ProjectMixIO__option_is_pressed = False
        self._ProjectMixIO__ctrl_is_pressed = False
        self._ProjectMixIO__alt_is_pressed = False
        self.is_pro_version = False
    def __init__(self, c_instance):
        self.__c_instance = c_instance
        self.__components = []
        self.__main_display = MainDisplay(self)
        self.__components.append(self.__main_display)
        self.__main_display_controller = MainDisplayController(self, self.__main_display)
        self.__components.append(self.__main_display_controller)
        self.__software_controller = SoftwareController(self)
        self.__components.append(self.__software_controller)
        self.__transport = Transport(self)
        self.__components.append(self.__transport)
        self.__channel_strips = [ ChannelStrip(self, i) for i in range(NUM_CHANNEL_STRIPS) ]
        for s in self.__channel_strips:
            self.__components.append(s)

        self.__master_strip = MasterChannelStrip(self)
        self.__components.append(self.__master_strip)
        self.__channel_strip_controller = ChannelStripController(self, self.__channel_strips, self.__master_strip, self.__main_display_controller)
        self.__components.append(self.__channel_strip_controller)
        self.__shift_is_pressed = False
        self.__option_is_pressed = False
        self.__ctrl_is_pressed = False
        self.__alt_is_pressed = False
class ProjectMixIO(object):
    def __init__(self, c_instance):
        self._ProjectMixIO__c_instance = c_instance
        self._ProjectMixIO__components = []
        self._ProjectMixIO__main_display = MainDisplay(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__main_display)
        self._ProjectMixIO__main_display_controller = MainDisplayController(
            self, self._ProjectMixIO__main_display)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__main_display_controller)
        self._ProjectMixIO__software_controller = SoftwareController(self)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__software_controller)
        self._ProjectMixIO__transport = Transport(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__transport)
        self._ProjectMixIO__channel_strips = [
            ChannelStrip(self, i) for i in range(NUM_CHANNEL_STRIPS)
        ]
        for s in self._ProjectMixIO__channel_strips:
            self._ProjectMixIO__components.append(s)

        self._ProjectMixIO__master_strip = MasterChannelStrip(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__master_strip)
        self._ProjectMixIO__channel_strip_controller = ChannelStripController(
            self, self._ProjectMixIO__channel_strips,
            self._ProjectMixIO__master_strip,
            self._ProjectMixIO__main_display_controller)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__channel_strip_controller)
        self._ProjectMixIO__shift_is_pressed = False
        self._ProjectMixIO__option_is_pressed = False
        self._ProjectMixIO__ctrl_is_pressed = False
        self._ProjectMixIO__alt_is_pressed = False
        self.is_pro_version = False

    def disconnect(self):
        for c in self._ProjectMixIO__components:
            c.destroy()

    def disconnect(self):
        for c in self._ProjectMixIO__components:
            c.destroy()

    def connect_script_instances(self, instanciated_scripts):
        pass

    def application(self):
        return Live.Application.get_application()

    def song(self):
        return self._ProjectMixIO__c_instance.song()

    def handle(self):
        return self._ProjectMixIO__c_instance.handle()

    def refresh_state(self):
        for c in self._ProjectMixIO__components:
            c.refresh_state()

    def is_extension(self):
        return False

    def request_rebuild_midi_map(self):
        self._ProjectMixIO__c_instance.request_rebuild_midi_map()

    def can_lock_to_devices(self):
        return False

    def build_midi_map(self, midi_map_handle):
        for s in self._ProjectMixIO__channel_strips:
            s.build_midi_map(midi_map_handle)

        self._ProjectMixIO__master_strip.build_midi_map(midi_map_handle)
        for i in range(SID_FIRST, SID_LAST + 1):
            if i not in function_key_control_switch_ids:
                Live.MidiMap.forward_midi_note(self.handle(), midi_map_handle,
                                               0, i)

        Live.MidiMap.forward_midi_cc(self.handle(), midi_map_handle, 0,
                                     JOG_WHEEL_CC_NO)

    def update_display(self):
        for c in self._ProjectMixIO__components:
            c.on_update_display_timer()

    def send_midi(self, midi_event_bytes):
        self._ProjectMixIO__c_instance.send_midi(midi_event_bytes)

    def receive_midi(self, midi_bytes):
        if midi_bytes[0] & 240 == NOTE_ON_STATUS or midi_bytes[
                0] & 240 == NOTE_OFF_STATUS:
            note = midi_bytes[1]
            value = BUTTON_PRESSED if midi_bytes[2] > 0 else BUTTON_RELEASED
            if note in range(SID_FIRST, SID_LAST + 1):
                if note in display_switch_ids:
                    self.handle_display_switch_ids(note, value)
                if note in channel_strip_switch_ids + fader_touch_switch_ids:
                    for s in self._ProjectMixIO__channel_strips:
                        s.handle_channel_strip_switch_ids(note, value)

                if note in channel_strip_control_switch_ids:
                    self._ProjectMixIO__channel_strip_controller.handle_assignment_switch_ids(
                        note, value)
                if note in function_key_control_switch_ids:
                    self._ProjectMixIO__software_controller.handle_function_key_switch_ids(
                        note, value)
                if note in software_controls_switch_ids:
                    self._ProjectMixIO__software_controller.handle_software_controls_switch_ids(
                        note, value)
                if note in transport_control_switch_ids:
                    self._ProjectMixIO__transport.handle_transport_switch_ids(
                        note, value)
                if note in marker_control_switch_ids:
                    self._ProjectMixIO__transport.handle_marker_switch_ids(
                        note, value)
                if note in jog_wheel_switch_ids:
                    self._ProjectMixIO__transport.handle_jog_wheel_switch_ids(
                        note, value)
        elif midi_bytes[0] & 240 == CC_STATUS:
            cc_no = midi_bytes[1]
            cc_value = midi_bytes[2]
            if cc_no == JOG_WHEEL_CC_NO:
                self._ProjectMixIO__transport.handle_jog_wheel_rotation(
                    cc_value)
            elif cc_no in range(FID_PANNING_BASE,
                                FID_PANNING_BASE + NUM_CHANNEL_STRIPS):
                for s in self._ProjectMixIO__channel_strips:
                    s.handle_vpot_rotation(cc_no - FID_PANNING_BASE, cc_value)

    def shift_is_pressed(self):
        return self._ProjectMixIO__shift_is_pressed

    def set_shift_is_pressed(self, pressed):
        self._ProjectMixIO__shift_is_pressed = pressed

    def option_is_pressed(self):
        return self._ProjectMixIO__option_is_pressed

    def set_option_is_pressed(self, pressed):
        self._ProjectMixIO__option_is_pressed = pressed

    def control_is_pressed(self):
        return self._ProjectMixIO__control_is_pressed or self._ProjectMixIO__option_is_pressed

    def set_control_is_pressed(self, pressed):
        self._ProjectMixIO__control_is_pressed = pressed

    def alt_is_pressed(self):
        return self._ProjectMixIO__alt_is_pressed

    def set_alt_is_pressed(self, pressed):
        self._ProjectMixIO__alt_is_pressed = pressed

    def force_time_display_update(self):
        pass

    def handle_display_switch_ids(self, switch_id, value):
        if switch_id == SID_DISPLAY_NAME_VALUE:
            if value == BUTTON_PRESSED:
                self._ProjectMixIO__channel_strip_controller.toggle_meter_mode(
                )
class ProjectMixIO:
    """Subset of the Mackie Control Script, that works with the ProjectMix in
       Live Mackie Control Mode.
    """

    def __init__(self, c_instance):
        self.__c_instance = c_instance
        self.__components = []
        self.__main_display = MainDisplay(self)
        self.__components.append(self.__main_display)
        self.__main_display_controller = MainDisplayController(self, self.__main_display)
        self.__components.append(self.__main_display_controller)
        self.__software_controller = SoftwareController(self)
        self.__components.append(self.__software_controller)
        self.__transport = Transport(self)
        self.__components.append(self.__transport)
        self.__channel_strips = [ ChannelStrip(self, i) for i in range(NUM_CHANNEL_STRIPS) ]
        for s in self.__channel_strips:
            self.__components.append(s)

        self.__master_strip = MasterChannelStrip(self)
        self.__components.append(self.__master_strip)
        self.__channel_strip_controller = ChannelStripController(self, self.__channel_strips, self.__master_strip, self.__main_display_controller)
        self.__components.append(self.__channel_strip_controller)
        self.__shift_is_pressed = False
        self.__option_is_pressed = False
        self.__ctrl_is_pressed = False
        self.__alt_is_pressed = False

    def disconnect(self):
        for c in self.__components:
            c.destroy()

    def disconnect(self):
        for c in self.__components:
            c.destroy()

    def connect_script_instances(self, instanciated_scripts):
        pass

    def application(self):
        """returns a reference to the application that we are running in"""
        return Live.Application.get_application()

    def song(self):
        """returns a reference to the Live Song that we do interact with"""
        return self.__c_instance.song()

    def handle(self):
        """returns a handle to the c_interface that is needed when forwarding MIDI events
           via the MIDI map
        """
        return self.__c_instance.handle()

    def refresh_state(self):
        for c in self.__components:
            c.refresh_state()

    def is_extension(self):
        return False

    def request_rebuild_midi_map(self):
        self.__c_instance.request_rebuild_midi_map()

    def build_midi_map(self, midi_map_handle):
        for s in self.__channel_strips:
            s.build_midi_map(midi_map_handle)

        self.__master_strip.build_midi_map(midi_map_handle)
        for i in range(SID_FIRST, SID_LAST + 1):
            if i not in function_key_control_switch_ids:
                Live.MidiMap.forward_midi_note(self.handle(), midi_map_handle, 0, i)

        Live.MidiMap.forward_midi_cc(self.handle(), midi_map_handle, 0, JOG_WHEEL_CC_NO)

    def update_display(self):
        for c in self.__components:
            c.on_update_display_timer()

    def send_midi(self, midi_event_bytes):
        self.__c_instance.send_midi(midi_event_bytes)

    def receive_midi(self, midi_bytes):
        if midi_bytes[0] & 240 == NOTE_ON_STATUS or midi_bytes[0] & 240 == NOTE_OFF_STATUS:
            channel = midi_bytes[0] & 15
            note = midi_bytes[1]
            velocity = midi_bytes[2]
            if note in range(SID_FIRST, SID_LAST + 1):
                if note in display_switch_ids:
                    self.handle_display_switch_ids(note, velocity)
                if note in channel_strip_switch_ids + fader_touch_switch_ids:
                    for s in self.__channel_strips:
                        s.handle_channel_strip_switch_ids(note, velocity)

                if note in channel_strip_control_switch_ids:
                    self.__channel_strip_controller.handle_assignment_switch_ids(note, velocity)
                if note in function_key_control_switch_ids:
                    self.__software_controller.handle_function_key_switch_ids(note, velocity)
                if note in software_controls_switch_ids:
                    self.__software_controller.handle_software_controls_switch_ids(note, velocity)
                if note in transport_control_switch_ids:
                    self.__transport.handle_transport_switch_ids(note, velocity)
                if note in marker_control_switch_ids:
                    self.__transport.handle_marker_switch_ids(note, velocity)
                if note in jog_wheel_switch_ids:
                    self.__transport.handle_jog_wheel_switch_ids(note, velocity)
        elif midi_bytes[0] & 240 == CC_STATUS:
            channel = midi_bytes[0] & 15
            cc_no = midi_bytes[1]
            cc_value = midi_bytes[2]
            if cc_no == JOG_WHEEL_CC_NO:
                self.__transport.handle_jog_wheel_rotation(cc_value)
            elif cc_no in range(FID_PANNING_BASE, FID_PANNING_BASE + NUM_CHANNEL_STRIPS):
                for s in self.__channel_strips:
                    s.handle_vpot_rotation(cc_no - FID_PANNING_BASE, cc_value)

    def shift_is_pressed(self):
        return self.__shift_is_pressed

    def set_shift_is_pressed(self, pressed):
        self.__shift_is_pressed = pressed

    def option_is_pressed(self):
        return self.__option_is_pressed

    def set_option_is_pressed(self, pressed):
        self.__option_is_pressed = pressed

    def control_is_pressed(self):
        return self.__control_is_pressed or self.__option_is_pressed

    def set_control_is_pressed(self, pressed):
        self.__control_is_pressed = pressed

    def alt_is_pressed(self):
        return self.__alt_is_pressed

    def set_alt_is_pressed(self, pressed):
        self.__alt_is_pressed = pressed

    def force_time_display_update(self):
        pass

    def handle_display_switch_ids(self, switch_id, value):
        if switch_id == SID_DISPLAY_NAME_VALUE:
            if value == BUTTON_PRESSED:
                self.__channel_strip_controller.toggle_meter_mode()
class ProjectMixIO:
    __module__ = __name__
    __doc__ = 'Subset of the Mackie Control Script, that works with the ProjectMix in \n     Live Mackie Control Mode.\n  '

    def __init__(self, c_instance):
        self._ProjectMixIO__c_instance = c_instance
        self._ProjectMixIO__components = []
        self._ProjectMixIO__main_display = MainDisplay(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__main_display)
        self._ProjectMixIO__main_display_controller = MainDisplayController(
            self, self._ProjectMixIO__main_display)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__main_display_controller)
        self._ProjectMixIO__software_controller = SoftwareController(self)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__software_controller)
        self._ProjectMixIO__transport = Transport(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__transport)
        self._ProjectMixIO__channel_strips = [
            ChannelStrip(self, i) for i in range(NUM_CHANNEL_STRIPS)
        ]
        for s in self._ProjectMixIO__channel_strips:
            self._ProjectMixIO__components.append(s)

        self._ProjectMixIO__master_strip = MasterChannelStrip(self)
        self._ProjectMixIO__components.append(self._ProjectMixIO__master_strip)
        self._ProjectMixIO__channel_strip_controller = ChannelStripController(
            self, self._ProjectMixIO__channel_strips,
            self._ProjectMixIO__master_strip,
            self._ProjectMixIO__main_display_controller)
        self._ProjectMixIO__components.append(
            self._ProjectMixIO__channel_strip_controller)
        self._ProjectMixIO__shift_is_pressed = False
        self._ProjectMixIO__option_is_pressed = False
        self._ProjectMixIO__ctrl_is_pressed = False
        self._ProjectMixIO__alt_is_pressed = False

    def disconnect(self):
        for c in self._ProjectMixIO__components:
            c.destroy()

    def disconnect(self):
        for c in self._ProjectMixIO__components:
            c.destroy()

    def connect_script_instances(self, instanciated_scripts):
        pass

    def application(self):
        """returns a reference to the application that we are running in"""
        return Live.Application.get_application()

    def song(self):
        """returns a reference to the Live Song that we do interact with"""
        return self._ProjectMixIO__c_instance.song()

    def handle(self):
        """returns a handle to the c_interface that is needed when forwarding MIDI events
       via the MIDI map
    """
        return self._ProjectMixIO__c_instance.handle()

    def refresh_state(self):
        for c in self._ProjectMixIO__components:
            c.refresh_state()

    def is_extension(self):
        return False

    def request_rebuild_midi_map(self):
        self._ProjectMixIO__c_instance.request_rebuild_midi_map()

    def build_midi_map(self, midi_map_handle):
        for s in self._ProjectMixIO__channel_strips:
            s.build_midi_map(midi_map_handle)

        self._ProjectMixIO__master_strip.build_midi_map(midi_map_handle)
        for i in range(SID_FIRST, (SID_LAST + 1)):
            if (i not in function_key_control_switch_ids):
                Live.MidiMap.forward_midi_note(self.handle(), midi_map_handle,
                                               0, i)

        Live.MidiMap.forward_midi_cc(self.handle(), midi_map_handle, 0,
                                     JOG_WHEEL_CC_NO)

    def update_display(self):
        for c in self._ProjectMixIO__components:
            c.on_update_display_timer()

    def send_midi(self, midi_event_bytes):
        self._ProjectMixIO__c_instance.send_midi(midi_event_bytes)

    def receive_midi(self, midi_bytes):
        if (((midi_bytes[0] & 240) == NOTE_ON_STATUS)
                or ((midi_bytes[0] & 240) == NOTE_OFF_STATUS)):
            channel = (midi_bytes[0] & 15)
            note = midi_bytes[1]
            velocity = midi_bytes[2]
            if (note in range(SID_FIRST, (SID_LAST + 1))):
                if (note in display_switch_ids):
                    self.handle_display_switch_ids(note, velocity)
                if (note in (channel_strip_switch_ids +
                             fader_touch_switch_ids)):
                    for s in self._ProjectMixIO__channel_strips:
                        s.handle_channel_strip_switch_ids(note, velocity)

                if (note in channel_strip_control_switch_ids):
                    self._ProjectMixIO__channel_strip_controller.handle_assignment_switch_ids(
                        note, velocity)
                if (note in function_key_control_switch_ids):
                    self._ProjectMixIO__software_controller.handle_function_key_switch_ids(
                        note, velocity)
                if (note in software_controls_switch_ids):
                    self._ProjectMixIO__software_controller.handle_software_controls_switch_ids(
                        note, velocity)
                if (note in transport_control_switch_ids):
                    self._ProjectMixIO__transport.handle_transport_switch_ids(
                        note, velocity)
                if (note in marker_control_switch_ids):
                    self._ProjectMixIO__transport.handle_marker_switch_ids(
                        note, velocity)
                if (note in jog_wheel_switch_ids):
                    self._ProjectMixIO__transport.handle_jog_wheel_switch_ids(
                        note, velocity)
        elif ((midi_bytes[0] & 240) == CC_STATUS):
            channel = (midi_bytes[0] & 15)
            cc_no = midi_bytes[1]
            cc_value = midi_bytes[2]
            if (cc_no == JOG_WHEEL_CC_NO):
                self._ProjectMixIO__transport.handle_jog_wheel_rotation(
                    cc_value)
            elif (cc_no in range(FID_PANNING_BASE,
                                 (FID_PANNING_BASE + NUM_CHANNEL_STRIPS))):
                for s in self._ProjectMixIO__channel_strips:
                    s.handle_vpot_rotation((cc_no - FID_PANNING_BASE),
                                           cc_value)

    def shift_is_pressed(self):
        return self._ProjectMixIO__shift_is_pressed

    def set_shift_is_pressed(self, pressed):
        self._ProjectMixIO__shift_is_pressed = pressed

    def option_is_pressed(self):
        return self._ProjectMixIO__option_is_pressed

    def set_option_is_pressed(self, pressed):
        self._ProjectMixIO__option_is_pressed = pressed

    def control_is_pressed(self):
        return (self._ProjectMixIO__control_is_pressed
                or self._ProjectMixIO__option_is_pressed)

    def set_control_is_pressed(self, pressed):
        self._ProjectMixIO__control_is_pressed = pressed

    def alt_is_pressed(self):
        return self._ProjectMixIO__alt_is_pressed

    def set_alt_is_pressed(self, pressed):
        self._ProjectMixIO__alt_is_pressed = pressed

    def force_time_display_update(self):
        pass

    def handle_display_switch_ids(self, switch_id, value):
        if (switch_id == SID_DISPLAY_NAME_VALUE):
            if (value == BUTTON_PRESSED):
                self._ProjectMixIO__channel_strip_controller.toggle_meter_mode(
                )