Esempio n. 1
0
 def __init__(self, matrix, top_buttons, side_buttons, config_button):
     assert isinstance(matrix, ButtonMatrixElement)
     assert ((matrix.width() == 8) and (matrix.height() == 8))
     assert isinstance(top_buttons, tuple)
     assert (len(top_buttons) == 8)
     assert isinstance(side_buttons, tuple)
     assert (len(side_buttons) == 8)
     assert isinstance(config_button, ButtonElement)
     ModeSelectorComponent.__init__(self)
     self._session = SpecialSessionComponent(self, len(self.song().tracks),
                                             matrix.height(), side_buttons)
     self._session.name = "Session_Control"
     self._matrix = matrix
     self._side_buttons = side_buttons
     self._nav_buttons = top_buttons[:4]
     self._config_button = config_button
     self._all_buttons = []
     for button in (self._side_buttons + self._nav_buttons):
         self._all_buttons.append(button)
     self._sub_modes = SpecialMixerSelectorComponent(
         matrix, side_buttons, self._session)
     self._sub_modes.name = "Mixer_Modes"
     self._sub_modes.set_update_callback(self._update_control_channels)
     self._init_session()
     self._all_buttons = tuple(self._all_buttons)
     self.set_modes_buttons(top_buttons[4:])
     # mixer-session hack
     self._buttons_for_mixer = []
     for button in (self._side_buttons[5:]):
         self._buttons_for_mixer.append(button)
     for scene_index in range(self._matrix.height()):
         for track_index in range(self._matrix.width()):
             if scene_index > SESSION_HEIGHT_FOR_MIXER:
                 self._buttons_for_mixer.append(
                     self._matrix.get_button(track_index, scene_index))
	def __init__(self, matrix, top_buttons, side_buttons, config_button):
		assert isinstance(matrix, ButtonMatrixElement)
		assert ((matrix.width() == 8) and (matrix.height() == 8))
		assert isinstance(top_buttons, tuple)
		assert (len(top_buttons) == 8)
		assert isinstance(side_buttons, tuple)
		assert (len(side_buttons) == 8)
		assert isinstance(config_button, ButtonElement)
		ModeSelectorComponent.__init__(self)
		self._session = SpecialSessionComponent(self, len(self.song().tracks), matrix.height(), side_buttons)
		self._session.name = "Session_Control"
		self._matrix = matrix
		self._side_buttons = side_buttons
		self._nav_buttons = top_buttons[:4]
		self._config_button = config_button
		self._all_buttons = []
		for button in (self._side_buttons + self._nav_buttons):
			self._all_buttons.append(button)
		self._sub_modes = SpecialMixerSelectorComponent(matrix, side_buttons, self._session)
		self._sub_modes.name = "Mixer_Modes"
		self._sub_modes.set_update_callback(self._update_control_channels)
		self._init_session()
		self._all_buttons = tuple(self._all_buttons)
		self.set_modes_buttons(top_buttons[4:])
		# mixer-session hack
		self._buttons_for_mixer = []
		for button in (self._side_buttons[5:]):
			self._buttons_for_mixer.append(button)
		for scene_index in range(self._matrix.height()):
			for track_index in range(self._matrix.width()):
				if scene_index > SESSION_HEIGHT_FOR_MIXER:
					self._buttons_for_mixer.append(self._matrix.get_button(track_index, scene_index))
Esempio n. 3
0
class MainSelectorComponent(ModeSelectorComponent):
    " CLASS THAT REASSIGNS THE BUTTON ON THE LAUNCHPAD TO DIFFERENT FUNCTIONS "

    " INIT "

    def __init__(self, matrix, top_buttons, side_buttons, config_button):
        assert isinstance(matrix, ButtonMatrixElement)
        assert ((matrix.width() == 8) and (matrix.height() == 8))
        assert isinstance(top_buttons, tuple)
        assert (len(top_buttons) == 8)
        assert isinstance(side_buttons, tuple)
        assert (len(side_buttons) == 8)
        assert isinstance(config_button, ButtonElement)
        ModeSelectorComponent.__init__(self)
        self._session = SpecialSessionComponent(self, len(self.song().tracks),
                                                matrix.height(), side_buttons)
        self._session.name = "Session_Control"
        self._matrix = matrix
        self._side_buttons = side_buttons
        self._nav_buttons = top_buttons[:4]
        self._config_button = config_button
        self._all_buttons = []
        for button in (self._side_buttons + self._nav_buttons):
            self._all_buttons.append(button)
        self._sub_modes = SpecialMixerSelectorComponent(
            matrix, side_buttons, self._session)
        self._sub_modes.name = "Mixer_Modes"
        self._sub_modes.set_update_callback(self._update_control_channels)
        self._init_session()
        self._all_buttons = tuple(self._all_buttons)
        self.set_modes_buttons(top_buttons[4:])
        # mixer-session hack
        self._buttons_for_mixer = []
        for button in (self._side_buttons[5:]):
            self._buttons_for_mixer.append(button)
        for scene_index in range(self._matrix.height()):
            for track_index in range(self._matrix.width()):
                if scene_index > SESSION_HEIGHT_FOR_MIXER:
                    self._buttons_for_mixer.append(
                        self._matrix.get_button(track_index, scene_index))

    " DISCONNECT "

    def disconnect(self):
        for button in self._modes_buttons:
            button.remove_value_listener(self._mode_value)
        self._session = None
        for button in self._all_buttons:
            button.set_on_off_values(127, LED_OFF)
        self._config_button.turn_off()
        self._matrix = None
        self._side_buttons = None
        self._nav_buttons = None
        self._config_button = None
        self._buttons_for_mixer = None
        ModeSelectorComponent.disconnect(self)

    " GET SESSION COMPONENT "

    def session_component(self):
        return self._session

    " SET THE MODE BUTTONS "

    def set_modes_buttons(self, buttons):
        assert ((buttons == None)
                or (isinstance(buttons, tuple) or
                    (len(buttons) == self.number_of_modes())))
        identify_sender = True
        for button in self._modes_buttons:
            button.remove_value_listener(self._mode_value)
        self._modes_buttons = []
        if (buttons != None):
            for button in buttons:
                assert isinstance(button, ButtonElement)
                self._modes_buttons.append(button)
                button.add_value_listener(self._mode_value, identify_sender)
        self.set_mode(0)

    " GET AMOUNT OF MODES "

    def number_of_modes(self):
        return 4

    " CHANGE CALLBACK "

    def on_enabled_changed(self):
        self.update()

    " SET THE MODE "

    def set_mode(self, mode):
        assert (mode in range(self.number_of_modes()))
        if ((self._mode_index != mode) or (mode == 3) or True):
            self._mode_index = mode
            self.update()

    " UPDATE MODE BUTTONS "

    def _update_mode_buttons(self):
        for index in range(4):
            if (index == self._mode_index):
                self._modes_buttons[index].turn_on()
            else:
                self._modes_buttons[index].turn_off()

    " SET CHANNEL FOR THE CURRONT MODE "

    def channel_for_current_mode(self):
        #trying to keep
        if self._mode_index == 0:
            return 0
        elif self._mode_index == 1:
            new_channel = 4  #user 1
        elif self._mode_index == 2:
            new_channel = 5  #user 2
        elif self._mode_index == 3:
            new_channel = 6 + self._sub_modes.mode()  #mixer modes
        return new_channel

    " UPDATE THE SHIT "

    def update(self):
        assert (self._modes_buttons != None)
        if self.is_enabled():
            self._update_mode_buttons()
            #update matrix and side buttons
            for scene_index in range(self._matrix.height()):
                #update scene button
                self._side_buttons[scene_index].set_enabled(True)
                for track_index in range(self._matrix.width()):
                    #update matrix
                    self._matrix.get_button(track_index,
                                            scene_index).set_enabled(True)
            for button in self._nav_buttons:
                button.set_enabled(True)
            as_active = True
            as_enabled = True
            self._session.set_allow_update(False)
            self._config_button.send_value(40)
            self._config_button.send_value(1)
            release_buttons = (self._mode_index == 1)

            if (self._mode_index == 0):
                #session
                self._setup_mixer((not as_active))
                self._setup_session(as_active, as_enabled, False)
            elif (self._mode_index == 1):
                #user mode 1
                self._setup_mixer((not as_active))
                self._setup_session((not as_active), (not as_enabled), False)
                self._setup_user1(True, True, True)
            elif (self._mode_index == 2):
                #user mode 2
                self._setup_mixer((not as_active))
                self._setup_session((not as_active), (not as_enabled), False)
                self._setup_user2(release_buttons)
            elif (self._mode_index == 3):
                #mixer
                self._setup_session((as_active), as_enabled, True)
                self._setup_mixer(as_active)
            else:
                assert False
            self._session.set_allow_update(True)
            self._update_control_channels()

    " UPDATE THE CHANNELS OF THE BUTTONS IN THE USER MODES.. "

    def _update_control_channels(self):
        new_channel = self.channel_for_current_mode()
        if self._mode_index == 3:
            # skip the upper part of the matrix and buttons
            for button in self._buttons_for_mixer:
                button.set_channel(new_channel)
                button.set_force_next_value()
        else:
            for button in self._all_buttons:
                button.set_channel(new_channel)
                button.set_force_next_value()

    " SETUP THE SESSION "

    def _setup_session(self, as_active, as_enabled, for_mixer):
        #log("setup_session (active: " + str(as_active) + ", enabled: " + str(as_enabled) + ", forMixer: " + str(for_mixer) + ")")
        assert isinstance(as_active, type(False))
        assert isinstance(as_enabled, type(False))
        assert isinstance(for_mixer, type(False))
        # --------------------------------------------------------------------- nav button color
        for button in self._nav_buttons:
            if as_enabled:
                button.set_on_off_values(GREEN_FULL, GREEN_THIRD)
            else:
                button.set_on_off_values(127, LED_OFF)
        # --------------------------------------------------------------------- matrix
        for scene_index in range(self._matrix.height()):
            scene = self._session.scene(scene_index)
            if for_mixer:
                if scene_index <= SESSION_HEIGHT_FOR_MIXER:
                    scene_button = self._side_buttons[scene_index]
                    scene_button.set_on_off_values(127, GREEN_THIRD)
                    scene.set_launch_button(scene_button)
                else:
                    scene.set_launch_button(None)
            elif as_active and (not for_mixer):
                scene_button = self._side_buttons[scene_index]
                scene_button.set_on_off_values(127, GREEN_THIRD)
                scene.set_launch_button(scene_button)
            else:
                scene.set_launch_button(None)
            # SLOT BUTTONS
            button_index = 0
            for track_index in range(len(self.song().tracks)):
                if self.song().tracks[track_index].is_foldable:
                    if button_index < GROUPS_CONSIDERED:
                        if for_mixer:
                            if scene_index <= SESSION_HEIGHT_FOR_MIXER:
                                button = self._matrix.get_button(
                                    button_index, scene_index)
                                button.set_on_off_values(127, LED_OFF)
                                scene.clip_slot(track_index).set_launch_button(
                                    button)
                            else:
                                scene.clip_slot(track_index).set_launch_button(
                                    None)
                        elif as_active and (not for_mixer):
                            button = self._matrix.get_button(
                                button_index, scene_index)
                            button.set_on_off_values(127, LED_OFF)
                            scene.clip_slot(track_index).set_launch_button(
                                button)
                        else:
                            scene.clip_slot(track_index).set_launch_button(
                                None)
                        button_index = button_index + 1
                else:
                    scene.clip_slot(track_index).set_launch_button(None)
        # --------------------------------------------------------------------- nav buttons
        if as_enabled or for_mixer:
            self._session.set_scene_bank_buttons(self._nav_buttons[1],
                                                 self._nav_buttons[0])
        else:
            self._session.set_scene_bank_buttons(None, None)

    " SETUP THE MIXER "

    def _setup_mixer(self, as_active):
        assert isinstance(as_active, type(False))
        self._sub_modes.set_enabled(as_active)

    " SETUP USER 1 "

    def _setup_user1(self,
                     release_matrix=True,
                     release_side_buttons=True,
                     release_nav_buttons=True):
        for scene_index in range(8):
            if (release_side_buttons):
                scene_button = self._side_buttons[scene_index]
                scene_button.set_on_off_values(127, LED_OFF)
                scene_button.turn_off()
                scene_button.set_enabled((not release_side_buttons))
            for track_index in range(8):
                button = self._matrix.get_button(track_index, scene_index)
                button.set_on_off_values(127, LED_OFF)
                button.turn_off()
                button.set_enabled((not release_matrix))
        for button in self._nav_buttons:
            if (release_nav_buttons):
                button.set_on_off_values(127, LED_OFF)
                button.turn_off()
                button.set_enabled((not release_nav_buttons))
        if release_matrix:
            self._config_button.send_value(2)
        self._config_button.send_value(32, force_send=True)

    " SETUP USER 2 "

    def _setup_user2(self, release_buttons):
        for scene_index in range(8):
            scene_button = self._side_buttons[scene_index]
            scene_button.set_on_off_values(127, LED_OFF)
            scene_button.turn_off()
            scene_button.set_enabled((not release_buttons))
            for track_index in range(8):
                button = self._matrix.get_button(track_index, scene_index)
                button.set_on_off_values(127, LED_OFF)
                button.turn_off()
                button.set_enabled((not release_buttons))
        for button in self._nav_buttons:
            button.set_on_off_values(127, LED_OFF)
            button.turn_off()
            button.set_enabled((not release_buttons))
        if release_buttons:
            self._config_button.send_value(2)
        self._config_button.send_value(32, force_send=True)

    " INIT THE SESSION "

    def _init_session(self):
        self._session.set_stop_track_clip_value(AMBER_BLINK)
        # SCENES
        for scene_index in range(self._matrix.height()):
            scene = self._session.scene(scene_index)
            scene.set_triggered_value(GREEN_BLINK)
            scene.name = ("Scene_" + str(scene_index))
            # SLOTS
            button_index = 0
            for track_index in range(len(self.song().tracks)):
                if button_index < GROUPS_CONSIDERED:
                    if self.song().tracks[track_index].is_foldable:
                        clip_slot = scene.clip_slot(track_index)
                        clip_slot.set_triggered_to_play_value(GREEN_BLINK)
                        clip_slot.set_triggered_to_record_value(RED_BLINK)
                        clip_slot.set_stopped_value(AMBER_FULL)
                        clip_slot.set_started_value(GREEN_FULL)
                        clip_slot.set_recording_value(RED_FULL)
                        clip_slot.name = ((str(track_index) + "_Clip_Slot_") +
                                          str(scene_index))
                        self._all_buttons.append(
                            self._matrix.get_button(button_index, scene_index))
                        button_index = button_index + 1
class MainSelectorComponent(ModeSelectorComponent):
	" CLASS THAT REASSIGNS THE BUTTON ON THE LAUNCHPAD TO DIFFERENT FUNCTIONS "

	" INIT "
	def __init__(self, matrix, top_buttons, side_buttons, config_button):
		assert isinstance(matrix, ButtonMatrixElement)
		assert ((matrix.width() == 8) and (matrix.height() == 8))
		assert isinstance(top_buttons, tuple)
		assert (len(top_buttons) == 8)
		assert isinstance(side_buttons, tuple)
		assert (len(side_buttons) == 8)
		assert isinstance(config_button, ButtonElement)
		ModeSelectorComponent.__init__(self)
		self._session = SpecialSessionComponent(self, len(self.song().tracks), matrix.height(), side_buttons)
		self._session.name = "Session_Control"
		self._matrix = matrix
		self._side_buttons = side_buttons
		self._nav_buttons = top_buttons[:4]
		self._config_button = config_button
		self._all_buttons = []
		for button in (self._side_buttons + self._nav_buttons):
			self._all_buttons.append(button)
		self._sub_modes = SpecialMixerSelectorComponent(matrix, side_buttons, self._session)
		self._sub_modes.name = "Mixer_Modes"
		self._sub_modes.set_update_callback(self._update_control_channels)
		self._init_session()
		self._all_buttons = tuple(self._all_buttons)
		self.set_modes_buttons(top_buttons[4:])
		# mixer-session hack
		self._buttons_for_mixer = []
		for button in (self._side_buttons[5:]):
			self._buttons_for_mixer.append(button)
		for scene_index in range(self._matrix.height()):
			for track_index in range(self._matrix.width()):
				if scene_index > SESSION_HEIGHT_FOR_MIXER:
					self._buttons_for_mixer.append(self._matrix.get_button(track_index, scene_index))

	" DISCONNECT "
	def disconnect(self):
		for button in self._modes_buttons:
			button.remove_value_listener(self._mode_value)
		self._session = None
		for button in self._all_buttons:
			button.set_on_off_values(127, LED_OFF)
		self._config_button.turn_off()
		self._matrix = None
		self._side_buttons = None
		self._nav_buttons = None
		self._config_button = None
		self._buttons_for_mixer = None
		ModeSelectorComponent.disconnect(self)
		
	" GET SESSION COMPONENT "
	def session_component(self):
		return self._session

	" SET THE MODE BUTTONS "
	def set_modes_buttons(self, buttons):
		assert ((buttons == None) or (isinstance(buttons, tuple) or (len(buttons) == self.number_of_modes())))
		identify_sender = True
		for button in self._modes_buttons:
			button.remove_value_listener(self._mode_value)
		self._modes_buttons = []
		if (buttons != None):
			for button in buttons:
				assert isinstance(button, ButtonElement)
				self._modes_buttons.append(button)
				button.add_value_listener(self._mode_value, identify_sender)
		self.set_mode(0)

	" GET AMOUNT OF MODES "
	def number_of_modes(self):
		return 4

	" CHANGE CALLBACK "
	def on_enabled_changed(self):
		self.update()

	" SET THE MODE "
	def set_mode(self, mode):
		assert (mode in range(self.number_of_modes()))
		if ((self._mode_index != mode) or (mode == 3) or True):
			self._mode_index = mode
			self.update()

	" UPDATE MODE BUTTONS "
	def _update_mode_buttons(self):
		for index in range(4):
			if (index == self._mode_index):	
				self._modes_buttons[index].turn_on()
			else:
				self._modes_buttons[index].turn_off()

	" SET CHANNEL FOR THE CURRONT MODE "
	def channel_for_current_mode(self):
		#trying to keep 
		if self._mode_index==0:
			return 0
		elif self._mode_index==1:
			new_channel=4#user 1
		elif self._mode_index==2:	
			new_channel=5#user 2		
		elif self._mode_index==3:
			new_channel = 6 + self._sub_modes.mode() #mixer modes
		return new_channel

	" UPDATE THE SHIT "
	def update(self):
		assert (self._modes_buttons != None)
		if self.is_enabled():		
			self._update_mode_buttons()			
			#update matrix and side buttons
			for scene_index in range(self._matrix.height()):
				#update scene button
				self._side_buttons[scene_index].set_enabled(True)
				for track_index in range(self._matrix.width()):
					#update matrix
					self._matrix.get_button(track_index, scene_index).set_enabled(True)
			for button in self._nav_buttons:
				button.set_enabled(True)
			as_active = True
			as_enabled = True
			self._session.set_allow_update(False)
			self._config_button.send_value(40)
			self._config_button.send_value(1)			
			release_buttons = (self._mode_index == 1)
			
			if (self._mode_index == 0):
				#session
				self._setup_mixer((not as_active))
				self._setup_session(as_active, as_enabled, False)
			elif (self._mode_index == 1):
				#user mode 1
				self._setup_mixer((not as_active))
				self._setup_session((not as_active), (not as_enabled), False)
				self._setup_user1(True,True,True)				
			elif (self._mode_index == 2):
				#user mode 2
				self._setup_mixer((not as_active))
				self._setup_session((not as_active), (not as_enabled), False)				
				self._setup_user2(release_buttons)						
			elif (self._mode_index == 3):
				#mixer
				self._setup_session((as_active), as_enabled, True)
				self._setup_mixer(as_active)
			else:
				assert False				
			self._session.set_allow_update(True)
			self._update_control_channels()

	" UPDATE THE CHANNELS OF THE BUTTONS IN THE USER MODES.. "
	def _update_control_channels(self):
		new_channel = self.channel_for_current_mode()
		if self._mode_index == 3:
			# skip the upper part of the matrix and buttons
			for button in self._buttons_for_mixer:
				button.set_channel(new_channel)
				button.set_force_next_value()
		else:
			for button in self._all_buttons:
				button.set_channel(new_channel)
				button.set_force_next_value()
			
	" SETUP THE SESSION "
	def _setup_session(self, as_active, as_enabled, for_mixer):
		#log("setup_session (active: " + str(as_active) + ", enabled: " + str(as_enabled) + ", forMixer: " + str(for_mixer) + ")")
		assert isinstance(as_active, type(False))
		assert isinstance(as_enabled, type(False))
		assert isinstance(for_mixer, type(False))
		# --------------------------------------------------------------------- nav button color
		for button in self._nav_buttons:
			if as_enabled:
				button.set_on_off_values(GREEN_FULL, GREEN_THIRD)
			else:
				button.set_on_off_values(127, LED_OFF)
		# --------------------------------------------------------------------- matrix
		for scene_index in range(self._matrix.height()):
			scene = self._session.scene(scene_index)				
			if for_mixer:
				if scene_index <= SESSION_HEIGHT_FOR_MIXER:
					scene_button = self._side_buttons[scene_index]
					scene_button.set_on_off_values(127, GREEN_THIRD)
					scene.set_launch_button(scene_button)
				else:
					scene.set_launch_button(None)
			elif as_active and (not for_mixer):				
				scene_button = self._side_buttons[scene_index]
				scene_button.set_on_off_values(127, GREEN_THIRD)
				scene.set_launch_button(scene_button)
			else:
				scene.set_launch_button(None)				
			# SLOT BUTTONS
			button_index = 0
			for track_index in range(len(self.song().tracks)):
				if self.song().tracks[track_index].is_foldable:
					if button_index < GROUPS_CONSIDERED:				
						if for_mixer:
							if scene_index <= SESSION_HEIGHT_FOR_MIXER:
								button = self._matrix.get_button(button_index, scene_index)
								button.set_on_off_values(127, LED_OFF)
								scene.clip_slot(track_index).set_launch_button(button)
							else:
								scene.clip_slot(track_index).set_launch_button(None)
						elif as_active and (not for_mixer):
							button = self._matrix.get_button(button_index, scene_index)
							button.set_on_off_values(127, LED_OFF)
							scene.clip_slot(track_index).set_launch_button(button)
						else:
							scene.clip_slot(track_index).set_launch_button(None)
						button_index = button_index + 1
				else:
					scene.clip_slot(track_index).set_launch_button(None)						
		# --------------------------------------------------------------------- nav buttons
		if as_enabled or for_mixer:
			self._session.set_scene_bank_buttons(self._nav_buttons[1], self._nav_buttons[0])
		else:
			self._session.set_scene_bank_buttons(None, None)

	" SETUP THE MIXER "
	def _setup_mixer(self, as_active):
		assert isinstance(as_active, type(False))
		self._sub_modes.set_enabled(as_active)

	" SETUP USER 1 "
	def _setup_user1(self, release_matrix=True,release_side_buttons =True,release_nav_buttons = True):	
		for scene_index in range(8):
			if(release_side_buttons):
				scene_button = self._side_buttons[scene_index]
				scene_button.set_on_off_values(127, LED_OFF)
				scene_button.turn_off()
				scene_button.set_enabled((not release_side_buttons))				
			for track_index in range(8):
				button = self._matrix.get_button(track_index, scene_index)
				button.set_on_off_values(127, LED_OFF)
				button.turn_off()
				button.set_enabled((not release_matrix))
		for button in self._nav_buttons:
			if(release_nav_buttons):
				button.set_on_off_values(127, LED_OFF)
				button.turn_off()
				button.set_enabled((not release_nav_buttons))
		if release_matrix:
			self._config_button.send_value(2)
		self._config_button.send_value(32, force_send=True)

	" SETUP USER 2 "
	def _setup_user2(self, release_buttons):
		for scene_index in range(8):
			scene_button = self._side_buttons[scene_index]
			scene_button.set_on_off_values(127, LED_OFF)
			scene_button.turn_off()
			scene_button.set_enabled((not release_buttons))
			for track_index in range(8):
				button = self._matrix.get_button(track_index, scene_index)
				button.set_on_off_values(127, LED_OFF)
				button.turn_off()
				button.set_enabled((not release_buttons))
		for button in self._nav_buttons:
			button.set_on_off_values(127, LED_OFF)
			button.turn_off()
			button.set_enabled((not release_buttons))
		if release_buttons:
			self._config_button.send_value(2)
		self._config_button.send_value(32, force_send=True)

	" INIT THE SESSION "
	def _init_session(self):
		self._session.set_stop_track_clip_value(AMBER_BLINK)
		# SCENES
		for scene_index in range(self._matrix.height()):
			scene = self._session.scene(scene_index)
			scene.set_triggered_value(GREEN_BLINK)
			scene.name = ("Scene_" + str(scene_index))
			# SLOTS
			button_index = 0
			for track_index in range(len(self.song().tracks)):
				if button_index < GROUPS_CONSIDERED:
					if self.song().tracks[track_index].is_foldable:
						clip_slot = scene.clip_slot(track_index)
						clip_slot.set_triggered_to_play_value(GREEN_BLINK)
						clip_slot.set_triggered_to_record_value(RED_BLINK)
						clip_slot.set_stopped_value(AMBER_FULL)
						clip_slot.set_started_value(GREEN_FULL)
						clip_slot.set_recording_value(RED_FULL)
						clip_slot.name = ((str(track_index) + "_Clip_Slot_") + str(scene_index))
						self._all_buttons.append(self._matrix.get_button(button_index, scene_index))
						button_index = button_index + 1