From c90ddeb703518bf81c656a78fe11aeee51fefa8f Mon Sep 17 00:00:00 2001 From: langolierz Date: Fri, 29 Nov 2019 07:24:01 +0000 Subject: [PATCH 1/6] v2 bug fixes --- json_objects/midi_action_mapping.json | 150 ++++++++++++++++---------- json_objects/settings_default.json | 3 +- user_input/numpad_input.py | 2 +- video_centre/shaders.py | 8 +- 4 files changed, 103 insertions(+), 60 deletions(-) diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index 97d5503..192d926 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -1,90 +1,109 @@ { - "control_change 1": { + "control_change 0": { "DEFAULT": ["set_the_shader_param_0_continuous"], "NAV_DETOUR": ["set_detour_mix_continuous"] }, - "control_change 2": { + "control_change 1": { "DEFAULT": ["set_the_shader_param_1_continuous"], "NAV_DETOUR": ["set_detour_speed_position_continuous"] }, - "control_change 3": { + "control_change 2": { "DEFAULT": ["set_the_shader_param_2_continuous"], "NAV_DETOUR": ["set_detour_start_continuous"] }, - "control_change 4": { + "control_change 3": { "DEFAULT": ["set_the_shader_param_3_continuous"], "NAV_DETOUR": ["set_detour_end_continuous"] }, - "control_change 5": { + "control_change 4": { "DEFAULT": ["set_the_shader_param_0_continuous"] }, + "control_change 5": { + "DEFAULT": ["set_the_shader_param_1_continuous"] + }, "control_change 6": { - "DEFAULT": ["set_the_shader_param_1_continuous"] + "DEFAULT": ["set_the_shader_param_2_continuous"] }, "control_change 7": { - "DEFAULT": ["set_the_shader_param_2_continuous"] - }, - "control_change 8": { "DEFAULT": ["set_the_shader_param_3_continuous"] }, - "control_change 74": { + "control_change 8": { "DEFAULT": ["set_the_shader_param_0_continuous"] }, - "control_change 71": { + "control_change 9": { "DEFAULT": ["set_the_shader_param_1_continuous"] }, - "control_change 76": { + "control_change 10": { "DEFAULT": ["set_the_shader_param_2_continuous"] }, - "control_change 77": { + "control_change 11": { "DEFAULT": ["set_the_shader_param_3_continuous"] }, "note_on 72": { "NAV_BROWSER": ["move_browser_selection_up"], - "PLAYER": ["seek_back_on_player"], + "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], "NAV_SETTINGS": ["move_settings_selection_up"], - "LENGTH_SET": ["return_to_default_control_mode"] + "NAV_SHADERS": ["move_shaders_selection_up"], + "LENGTH_SET": ["return_to_default_control_mode"], + "CONFIRM": ["return_to_default_control_mode"], + "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"] }, "note_on 73": { "NAV_BROWSER": ["move_browser_selection_down"], - "PLAYER": ["seek_forward_on_player"], + "DEFAULT": ["seek_forward_on_player", "increase_seek_time"], "NAV_SETTINGS": ["move_settings_selection_down"], - "LENGTH_SET": ["return_to_default_control_mode"] + "NAV_SHADERS": ["move_shaders_selection_down"], + "LENGTH_SET": ["return_to_default_control_mode"], + "CONFIRM": ["return_to_default_control_mode"], + "SHADER_PARAM": ["increase_this_param", "increase_shader_param"] }, "note_on 74": { "NAV_BROWSER": ["enter_on_browser_selection"], - "PLAYER": ["toggle_action_on_player","toggle_show_on_player"], + "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], "NAV_SETTINGS": ["enter_on_settings_selection"], - "LENGTH_SET": ["record_fixed_length"] + "NAV_SHADERS": ["enter_on_shaders_selection"], + "LENGTH_SET": ["record_fixed_length"], + "SHADER_PARAM": ["return_to_default_control_mode"], + "CONFIRM": ["perform_confirm_action"], + "NAV_DETOUR": ["toggle_detour_play"] }, "note_on 75": { - "DEFAULT": ["switch_to_next_player", "toggle_player_mode"] + "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], + "NAV_DETOUR": ["toggle_detour_record", "toggle_detour_record_loop"] }, "note_on 76": { - "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"] + "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"], + "SHADER_PARAM": ["decrease_param_focus"], + "NAV_DETOUR": ["decrease_mix_shader"] }, "note_on 77": { - "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"] + "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"], + "SHADER_PARAM": ["increase_param_focus"], + "NAV_DETOUR": ["increase_mix_shader"] }, "note_on 78": { "DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]}, "note_on 79": { - "DEFAULT": ["cycle_display_mode"] + "DEFAULT": ["cycle_display_mode", "cycle_display_mode_back"] }, "note_on 80": { "DEFAULT": ["toggle_function"] }, "note_on 81": { - "DEFAULT": ["load_slot_0_into_next_player","previous_bank"] + "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "note_on 82": { - "DEFAULT": ["load_slot_1_into_next_player","next_bank"] + "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "note_on 83": { - "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"] + "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "note_on 84": { - "DEFAULT": ["load_slot_3_into_next_player"] + "DEFAULT": ["load_slot_3_into_next_player"], + "NAV_DETOUR": ["switch_to_detour_3"] }, "note_on 85": { "DEFAULT": ["load_slot_4_into_next_player"] @@ -93,63 +112,82 @@ "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] }, "note_on 87": { - "DEFAULT": ["load_slot_6_into_next_player"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] }, "note_on 88": { - "DEFAULT": ["load_slot_7_into_next_player"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] }, "note_on 89": { "DEFAULT": ["load_slot_8_into_next_player"] }, "note_on 90": { - "DEFAULT": ["load_slot_9_into_next_player","quit_the_program"] - }, - "note_on 0": { - "NAV_BROWSER": ["move_browser_selection_up"], - "PLAYER": ["seek_back_on_player"], - "NAV_SETTINGS": ["move_settings_selection_up"], - "LENGTH_SET": ["return_to_default_control_mode"] + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] }, "note_on 36": { - "NAV_BROWSER": ["move_browser_selection_down"], - "PLAYER": ["seek_forward_on_player"], - "NAV_SETTINGS": ["move_settings_selection_down"], - "LENGTH_SET": ["return_to_default_control_mode"] + "NAV_BROWSER": ["move_browser_selection_up"], + "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], + "NAV_SETTINGS": ["move_settings_selection_up"], + "NAV_SHADERS": ["move_shaders_selection_up"], + "LENGTH_SET": ["return_to_default_control_mode"], + "CONFIRM": ["return_to_default_control_mode"], + "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"] }, "note_on 37": { - "NAV_BROWSER": ["enter_on_browser_selection"], - "PLAYER": ["toggle_action_on_player","toggle_show_on_player"], - "NAV_SETTINGS": ["enter_on_settings_selection"], - "LENGTH_SET": ["record_fixed_length"] + "NAV_BROWSER": ["move_browser_selection_down"], + "DEFAULT": ["seek_forward_on_player", "increase_seek_time"], + "NAV_SETTINGS": ["move_settings_selection_down"], + "NAV_SHADERS": ["move_shaders_selection_down"], + "LENGTH_SET": ["return_to_default_control_mode"], + "CONFIRM": ["return_to_default_control_mode"], + "SHADER_PARAM": ["increase_this_param", "increase_shader_param"] }, "note_on 38": { - "DEFAULT": ["switch_to_next_player", "toggle_player_mode"] + "NAV_BROWSER": ["enter_on_browser_selection"], + "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], + "NAV_SETTINGS": ["enter_on_settings_selection"], + "NAV_SHADERS": ["enter_on_shaders_selection"], + "LENGTH_SET": ["record_fixed_length"], + "SHADER_PARAM": ["return_to_default_control_mode"], + "CONFIRM": ["perform_confirm_action"], + "NAV_DETOUR": ["toggle_detour_play"] }, "note_on 39": { - "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"] + "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], + "NAV_DETOUR": ["toggle_detour_record", "toggle_detour_record_loop"] }, "note_on 40": { - "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"] + "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"], + "SHADER_PARAM": ["decrease_param_focus"], + "NAV_DETOUR": ["decrease_mix_shader"] }, "note_on 41": { - "DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]}, + "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"], + "SHADER_PARAM": ["increase_param_focus"], + "NAV_DETOUR": ["increase_mix_shader"] + }, "note_on 42": { - "DEFAULT": ["cycle_display_mode"] + "DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]}, + "note_on 79": { + "DEFAULT": ["cycle_display_mode", "cycle_display_mode_back"] }, "note_on 43": { "DEFAULT": ["toggle_function"] }, "note_on 44": { - "DEFAULT": ["load_slot_0_into_next_player","previous_bank"] + "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "note_on 45": { - "DEFAULT": ["load_slot_1_into_next_player","next_bank"] + "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "note_on 46": { - "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"] + "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "note_on 47": { - "DEFAULT": ["load_slot_3_into_next_player"] + "DEFAULT": ["load_slot_3_into_next_player"], + "NAV_DETOUR": ["switch_to_detour_3"] }, "note_on 48": { "DEFAULT": ["load_slot_4_into_next_player"] @@ -158,16 +196,16 @@ "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] }, "note_on 50": { - "DEFAULT": ["load_slot_6_into_next_player"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] }, "note_on 51": { - "DEFAULT": ["load_slot_7_into_next_player"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] }, "note_on 52": { "DEFAULT": ["load_slot_8_into_next_player"] }, "note_on 53": { - "DEFAULT": ["load_slot_9_into_next_player","quit_the_program"] + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] } } diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index 6106e9d..b629557 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -366,7 +366,8 @@ "action": "change_hdmi_settings", "options": [ "preferred", - "CEA 4 HDMI" + "CEA 4 HDMI", + "CEA 17 HDMI" ], "value": "CEA 4 HDMI" }, diff --git a/user_input/numpad_input.py b/user_input/numpad_input.py index 34cdd1f..f4b19ae 100644 --- a/user_input/numpad_input.py +++ b/user_input/numpad_input.py @@ -20,7 +20,7 @@ class NumpadInput(object): def on_key_press(self, event): numpad = list(string.ascii_lowercase[0:19]) - if event.char is '.': + if event.char is '.' or event.char is 'z': self.actions.quit_the_program() if event.char is 's': event.char = self.on_0_key_press() diff --git a/video_centre/shaders.py b/video_centre/shaders.py index 2491b6e..df2c3e5 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -1,6 +1,7 @@ import display_centre.menu as menu import os + class Shaders(object): MENU_HEIGHT = 10 EMPTY_SHADER = dict(name='none',is_shader=True,shad_type='-',param_number=0,path='-',shad_index=0) @@ -47,7 +48,8 @@ class Shaders(object): return False, '' def determine_shader_type(self, path): - with open(path, 'r') as selected_shader: + #try: + with open(path, 'r', errors='ignore') as selected_shader: shader_text = selected_shader.read() if '//0-input' in shader_text: return '0in' @@ -55,9 +57,11 @@ class Shaders(object): return '1in' elif '//2-input' in shader_text: return '2in' - else: return '-' + #except Exception as e: + #self.message_handler.set_message('INFO', 'cannot inspect shader text') + #return '-' def determine_shader_parameter_number(self, path): max_amount = 4 From b7e0919277ba411ca33ee17b831c2a15360d17d1 Mon Sep 17 00:00:00 2001 From: langolierz Date: Fri, 29 Nov 2019 10:50:30 +0000 Subject: [PATCH 2/6] wip new shader banks feature --- actions.py | 50 ++++++- data_centre/data.py | 56 ++++++- display_centre/display.py | 38 ++++- json_objects/keypad_action_mapping.json | 36 +++-- json_objects/settings_default.json | 8 + json_objects/shader_bank_data.json | 188 ++++++++++++++++++++++++ video_centre/shaders.py | 52 ++++--- 7 files changed, 389 insertions(+), 39 deletions(-) create mode 100644 json_objects/shader_bank_data.json diff --git a/actions.py b/actions.py index 0af73ec..a465ca2 100644 --- a/actions.py +++ b/actions.py @@ -73,10 +73,12 @@ class Actions(object): def enter_on_shaders_selection(self): ##want to select shader if its not selected, and want to enter 'param' mode if it already is is_shader, is_selected_shader, selected_shader = self.shaders.enter_on_shaders_selection() - print('is selected shader: {}'.format(is_selected_shader)) if is_selected_shader and selected_shader['param_number'] > 0: self.set_shader_param_mode() + def map_on_shaders_selection(self): + self.shaders.map_on_shaders_selection() + def clear_all_slots(self): self.data.clear_all_slots() self.display.browser_menu.generate_browser_list() @@ -301,6 +303,48 @@ class Actions(object): self.data.detour_settings['is_playing'] = is_playing self.video_driver.osc_client.send_message("/detour/is_playing", is_playing) + def play_shader_0(self): + self.play_this_shader(0) + + def play_shader_1(self): + self.play_this_shader(1) + + def play_shader_2(self): + self.play_this_shader(2) + + def play_shader_3(self): + self.play_this_shader(3) + + def play_shader_4(self): + self.play_this_shader(4) + + def play_shader_5(self): + self.play_this_shader(5) + + def play_shader_6(self): + self.play_this_shader(6) + + def play_shader_7(self): + self.play_this_shader(7) + + def play_shader_8(self): + self.play_this_shader(8) + + def play_shader_9(self): + self.play_this_shader(9) + + def play_this_shader(self, number): + self.shaders.play_this_shader(number) + + def previous_shader_layer(self): + self.data.update_shader_layer_by_amount(-1) + + def next_shader_layer(self): + self.data.update_shader_layer_by_amount(1) + + def clear_shader_bank(self): + self.data.clear_all_shader_slots() + def toggle_detour_record(self): if self.data.settings['detour']['TRY_DEMO']['value'] == 'enabled': is_recording = not self.data.detour_settings['is_recording'] @@ -605,10 +649,10 @@ class Actions(object): self.shaders.decrease_this_param(self.data.settings['shader']['SHADER_PARAM']['value']) def increase_param_focus(self): - self.shaders.focused_param = (self.shaders.focused_param + 1)%self.shaders.selected_shader['param_number'] + self.shaders.focused_param = (self.shaders.focused_param + 1)%self.shaders.selected_shader_list[self.data.shader_layer]['param_number'] def decrease_param_focus(self): - self.shaders.focused_param = (self.shaders.focused_param - 1)%self.shaders.selected_shader['param_number'] + self.shaders.focused_param = (self.shaders.focused_param - 1)%self.shaders.selected_shader_list[self.data.shader_layer]['param_number'] def increase_shader_param(self): options = self.data.settings['shader']['SHADER_PARAM']['options'] diff --git a/data_centre/data.py b/data_centre/data.py index c5c92dd..b479914 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -13,6 +13,7 @@ from omxplayer.player import OMXPlayer class Data(object): BANK_DATA_JSON = 'display_data.json' + SHADER_BANK_DATA_JSON = 'shader_bank_data.json' SETTINGS_JSON = 'settings.json' DEFAULT_SETTINGS_JSON = 'settings_default.json' KEYPAD_MAPPING_JSON = 'keypad_action_mapping.json' @@ -42,17 +43,25 @@ class Data(object): self.update_screen = True self.confirm_action = None self.player_mode = 'now' + self.detour_active = False self.detour_mix_shaders = self.get_list_of_two_input_shaders() self.detour_settings = collections.OrderedDict([('current_detour',0), ('is_playing', False), ('is_recording', False), ('record_loop', False), ('detour_size', False), ('detour_speed', 0), ('memory_full', False), ('mix_shader', self.detour_mix_shaders[0]), ('detour_position', 5), ('detour_start', 0), ('detour_end', 0), ('detour_mix', 0), ('is_delay', False)]) + + self.next_bankslot = '0-0' + self.current_bankslot = '0-0' + + self.shader_layer = 0 + self.shader_slots = [None, None, None] ### persisted data (use default if doesnt exits): self.bank_data = [self.create_empty_bank()] if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.BANK_DATA_JSON): self.bank_data = self._read_json(self.BANK_DATA_JSON) - self.next_bankslot = '0-0' - self.current_bankslot = '0-0' + self.shader_bank_data = [self.create_empty_shader_bank() for i in range(3)] + if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SHADER_BANK_DATA_JSON): + self.shader_bank_data = self._read_json(self.SHADER_BANK_DATA_JSON) self.settings = self._read_json(self.DEFAULT_SETTINGS_JSON) if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SETTINGS_JSON): @@ -69,6 +78,11 @@ class Data(object): def create_empty_bank(): empty_slot = dict(name='', location='', length=-1, start=-1, end=-1, rate=1) return [empty_slot for i in range(10)] + + @staticmethod + def create_empty_shader_bank(): + empty_slot = dict(name='', path='', param_number=4, shad_type='-') + return [empty_slot for i in range(10)] def _read_json(self, file_name): with open(self.PATH_TO_DATA_OBJECTS + file_name) as data_file: @@ -104,6 +118,8 @@ class Data(object): if setting_key == setting_name: return folder_key, setting_key, setting_item +##### setting and adding to sample mapping ###### + def create_new_slot_mapping_in_first_open(self, file_name): ######## used for mapping current video to next available slot ######## for index, slot in enumerate(self.bank_data[self.bank_number]): @@ -149,6 +165,33 @@ class Data(object): self.next_bankslot = '{}-{}'.format(self.bank_number,new_value) return True + ######## setting and adding to shader mapping + + + def create_new_shader_mapping_in_first_open(self, file_name): + ######## used for mapping current shader to next available slot ######## + for index, slot in enumerate(self.shader_bank_data[self.shader_layer]): + if (not slot['name']): + self.create_new_shader_mapping(index, file_name) + return True + return False + + def create_new_shader_mapping(self, slot_number, file_name): + ######## used for mapping current shader to a specific slot ######## + has_location, location = self._get_path_for_file(file_name) + print('file_name:{},has_location:{}, location:{}'.format(file_name,has_location, location)) + new_slot = dict(name=file_name, path=location, shad_type='-', param_number=4) + self._update_a_shader_slots_data(slot_number, new_slot) + + def clear_all_shader_slots(self): + self.shader_bank_data[self.shader_layer] = self.create_empty_shader_bank() + self._update_json(self.SHADER_BANK_DATA_JSON, self.shader_bank_data) + + def update_shader_layer_by_amount(self, amount): + self.shader_layer = (self.shader_layer + amount) % len(self.shader_bank_data) + + + def update_setting_value(self, setting_folder, setting_name, setting_value): self.settings[setting_folder][setting_name]['value'] = setting_value self._update_json(self.SETTINGS_JSON, self.settings) @@ -277,7 +320,7 @@ class Data(object): def _get_path_for_file(self, file_name): ######## returns full path for a given file name ######## - for path in self.PATHS_TO_BROWSER: + for path in self.PATHS_TO_BROWSER + self.PATHS_TO_SHADERS: for root, dirs, files in os.walk(path): if file_name in files: return True, '{}/{}'.format(root, file_name) @@ -316,6 +359,8 @@ class Data(object): display_modes = [[ "SAMPLER",'PLAYER'], ["BROWSER",'NAV_BROWSER'],["SETTINGS",'NAV_SETTINGS']] if self.settings['video']['VIDEOPLAYER_BACKEND']['value'] != 'omxplayer' and self.settings['shader']['USE_SHADER']['value'] == 'enabled': display_modes.append(["SHADERS",'NAV_SHADERS']) + if self.settings['shader']['USE_SHADER_BANK']['value'] == 'enabled' and ["SHADERS",'NAV_SHADERS'] in display_modes: + display_modes.append(["SHADBANK",'PLAY_SHADER']) if self.settings['detour']['TRY_DEMO']['value'] == 'enabled': display_modes.append(["FRAMES",'NAV_DETOUR']) if not with_nav_mode: @@ -331,6 +376,11 @@ class Data(object): ######## overwrite a given slots info with new data ######## self.bank_data[self.bank_number][slot_number] = slot_info self._update_json(self.BANK_DATA_JSON, self.bank_data) + + def _update_a_shader_slots_data(self, slot_number, slot_info): + ######## overwrite a given slots info with new data ######## + self.shader_bank_data[self.shader_layer][slot_number] = slot_info + self._update_json(self.SHADER_BANK_DATA_JSON, self.shader_bank_data) @staticmethod def make_empty_if_none(input): diff --git a/display_centre/display.py b/display_centre/display.py index efa4da9..39dd43d 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -52,7 +52,7 @@ class Display(object): self.display_text.pack() def _load_title(self): - if self.data.display_mode == 'SHADERS': + if self.data.display_mode == 'SHADERS' or self.data.display_mode == 'SHADBANK': self.display_text.insert(END, self.TITLES[1] + ' \n') self.display_text.tag_add("TITLE", 1.19, 1.31) elif self.data.display_mode == 'FRAMES': @@ -88,6 +88,8 @@ class Display(object): self._load_sampler() elif self.data.display_mode == 'SHADERS': self._load_shaders() + elif self.data.display_mode == 'SHADBANK': + self._load_shader_bank() elif self.data.display_mode == 'FRAMES': self._load_detour() self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29) @@ -167,10 +169,10 @@ class Display(object): self.display_text.insert(END, '{} \n'.format(self.body_title)) ## showing current shader info: - shader = self.shaders.selected_shader - self.display_text.insert(END, '{:<1}:{:<1}{:<2} {:<17} '.format \ + shader = self.shaders.selected_shader_list[self.data.shader_layer] + self.display_text.insert(END, '{:<1}:{:<2} {:<17} '.format \ (self.shaders.selected_status,shader['shad_type'][0], \ - format(shader['shad_index'],'02d'), shader['name'].lstrip()[0:17] )) + shader['name'].lstrip()[0:17] )) for i in range(min(4,shader['param_number'])): display_param = self.format_param_value(self.shaders.selected_param_values[i]) if display_param == 100: @@ -194,6 +196,34 @@ class Display(object): if self.data.control_mode == "SHADER_PARAM": self._highlight_this_param(self.shaders.focused_param) + def _load_shader_bank(self): + shader_bank_data = self.data.shader_bank_data[self.data.shader_layer] + + self.display_text.insert(END, '{} \n'.format(self.body_title)) + + self.display_text.insert(END, '{:>6} {:<5} {:<5} '.format( + '{}-layer'.format(self.data.shader_layer), 'name', 'type')) + + shader = self.shaders.selected_shader_list[self.data.shader_layer] + + for i in range(min(4,shader['param_number'])): + display_param = self.format_param_value(self.shaders.selected_param_values[i]) + if display_param == 100: + display_param == 99 + self.display_text.insert(END, 'x{}:{:02d}'.format(i, display_param)) + self.display_text.insert(END, '\n') + + for index, slot in enumerate(shader_bank_data): + name_without_extension = slot['name'].rsplit('.',1)[0] + self.display_text.insert(END, '{:^6} {:<17} {:<5} \n'.format(index, name_without_extension[0:17], slot['shad_type'])) + if index % 2: + self.display_text.tag_add("ZEBRA_STRIPE", self.ROW_OFFSET + index, + self.ROW_OFFSET + self.SELECTOR_WIDTH + index) + # highlight the slot of the selected player + current_slot = self.data.shader_slots[self.data.shader_layer] + if current_slot: + self._highlight_this_row(current_slot) + def _load_detour(self): line_count = 0 diff --git a/json_objects/keypad_action_mapping.json b/json_objects/keypad_action_mapping.json index 1c0709e..b097926 100644 --- a/json_objects/keypad_action_mapping.json +++ b/json_objects/keypad_action_mapping.json @@ -6,7 +6,8 @@ "NAV_SHADERS": ["move_shaders_selection_up"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"] + "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], + "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] }, "b": { "NAV_BROWSER": ["move_browser_selection_down"], @@ -15,13 +16,15 @@ "NAV_SHADERS": ["move_shaders_selection_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["increase_this_param", "increase_shader_param"] + "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], + "PLAY_SHADER": ["increase_this_param", "increase_shader_param"] + }, "c": { "NAV_BROWSER": ["enter_on_browser_selection"], "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], "NAV_SETTINGS": ["enter_on_settings_selection"], - "NAV_SHADERS": ["enter_on_shaders_selection"], + "NAV_SHADERS": ["enter_on_shaders_selection", "map_on_shaders_selection"], "LENGTH_SET": ["record_fixed_length"], "SHADER_PARAM": ["return_to_default_control_mode"], "CONFIRM": ["perform_confirm_action"], @@ -34,11 +37,13 @@ "e": { "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"], "SHADER_PARAM": ["decrease_param_focus"], + "PLAY_SHADER": ["decrease_param_focus"], "NAV_DETOUR": ["decrease_mix_shader"] }, "f": { "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"], "SHADER_PARAM": ["increase_param_focus"], + "PLAY_SHADER": ["increase_param_focus"], "NAV_DETOUR": ["increase_mix_shader"] }, "g": { @@ -51,36 +56,47 @@ }, "j": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "k": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "PLAY_SHADER": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "l": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "m": { "DEFAULT": ["load_slot_3_into_next_player"], + "PLAY_SHADER": ["play_shader_3"], "NAV_DETOUR": ["switch_to_detour_3"] }, "n": { - "DEFAULT": ["load_slot_4_into_next_player"] + "DEFAULT": ["load_slot_4_into_next_player"], + "PLAY_SHADER": ["play_shader_4"] }, "o": { - "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] + "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"], + "PLAY_SHADER": ["play_shader_5"] }, "p": { - "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"], + "PLAY_SHADER": ["play_shader_6","toggle_shaders"] }, "q": { - "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"], + "PLAY_SHADER": ["play_shader_7","toggle_detour_mode"] }, "r": { - "DEFAULT": ["load_slot_8_into_next_player"] + "DEFAULT": ["load_slot_8_into_next_player"], + "PLAY_SHADER": ["play_shader_8"] }, "s": { - "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] - } + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], + "PLAY_SHADER": + ["play_shader_9","confirm_shutdown"] +} } diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index b629557..f881d11 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -170,6 +170,14 @@ ], "value": "enabled" }, + "USE_SHADER_BANK": { + "action": "update_capture_settings", + "options": [ + "enabled", + "disabled" + ], + "value": "disabled" + }, "X3_AS_SPEED": { "action": null, "options": [ diff --git a/json_objects/shader_bank_data.json b/json_objects/shader_bank_data.json new file mode 100644 index 0000000..82424ad --- /dev/null +++ b/json_objects/shader_bank_data.json @@ -0,0 +1,188 @@ +[ + [ + { + "name": "wipe.frag", + "param_number": 4, + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/wipe.frag", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + } + ], + [ + { + "name": "add_mix.frag", + "param_number": 4, + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/add_mix.frag", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + } + ], + [ + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + } + ] +] \ No newline at end of file diff --git a/video_centre/shaders.py b/video_centre/shaders.py index df2c3e5..3c0a050 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -4,14 +4,14 @@ import os class Shaders(object): MENU_HEIGHT = 10 - EMPTY_SHADER = dict(name='none',is_shader=True,shad_type='-',param_number=0,path='-',shad_index=0) + EMPTY_SHADER = dict(name='none',is_shader=True,shad_type='-',param_number=4,path='-') def __init__(self, root, osc_client, message_handler, data): self.root = root self.osc_client = osc_client self.message_handler = message_handler self.data = data self.shaders_menu = menu.ShadersMenu(self.data, self.message_handler, self.MENU_HEIGHT ) - self.selected_shader = self.EMPTY_SHADER + self.selected_shader_list = [self.EMPTY_SHADER for i in range(3)] self.focused_param = None self.shaders_menu_list = self.generate_shaders_list() if self.shaders_menu_list is not None: @@ -24,18 +24,17 @@ class Shaders(object): def generate_shaders_list(self): shaders_menu_list = [] raw_list = self.shaders_menu.generate_raw_shaders_list() - shad_i = 0 for line in raw_list: if line['is_shader']: stripped_name = line['name'].lstrip() has_path, path = self.get_path_for_shader(stripped_name) shad_type = self.determine_shader_type(path) parameter_number = self.determine_shader_parameter_number(path) - #print('shader index is {}'.format(shad_i)) - shaders_menu_list.append(dict(name=line['name'],is_shader=True,shad_type=shad_type,param_number=parameter_number,path=path,shad_index=shad_i)) - shad_i = shad_i +1 + + shaders_menu_list.append(dict(name=line['name'],is_shader=True,shad_type=shad_type,param_number=parameter_number,path=path)) + else: - shaders_menu_list.append(dict(name=line['name'],is_shader=False,shad_type='',param_number=None,path=None,shad_index=None)) + shaders_menu_list.append(dict(name=line['name'],is_shader=False,shad_type='',param_number=None,path=None)) return shaders_menu_list @@ -48,7 +47,6 @@ class Shaders(object): return False, '' def determine_shader_type(self, path): - #try: with open(path, 'r', errors='ignore') as selected_shader: shader_text = selected_shader.read() if '//0-input' in shader_text: @@ -59,9 +57,7 @@ class Shaders(object): return '2in' else: return '-' - #except Exception as e: - #self.message_handler.set_message('INFO', 'cannot inspect shader text') - #return '-' + def determine_shader_parameter_number(self, path): max_amount = 4 @@ -75,33 +71,51 @@ class Shaders(object): return max_amount def load_selected_shader(self): + selected_shader = self.selected_shader_list[self.data.shader_layer] self.selected_param_values = [0.0,0.0,0.0,0.0] - self.osc_client.send_message("/shader/load", [self.selected_shader['path'],self.selected_shader['shad_type'] == '2in',self.selected_shader['param_number']]) + print("select shader: ", selected_shader) + self.osc_client.send_message("/shader/load".format(str(self.data.shader_layer)), [selected_shader['path'],selected_shader['shad_type'] == '2in',selected_shader['param_number']]) if not self.selected_status == '▶': self.selected_status = '■' def start_selected_shader(self): - self.osc_client.send_message("/shader/start", True) + self.osc_client.send_message("/shader/start".format(str(self.data.shader_layer)), True) self.selected_status = '▶' def stop_selected_shader(self): - self.osc_client.send_message("/shader/stop", True) + self.osc_client.send_message("/shader/stop".format(str(self.data.shader_layer)), True) self.selected_status = '■' + def map_on_shaders_selection(self): + index = self.shaders_menu.selected_list_index + is_file, name = self.shaders_menu.extract_file_type_and_name_from_menu_format( + self.shaders_menu_list[index]['name']) + if is_file: + is_successful = self.data.create_new_shader_mapping_in_first_open(name) + if not is_successful: + self.message_handler.set_message('INFO', 'current bank is full') + else: + self.message_handler.set_message('INFO', 'can not map folder') + def enter_on_shaders_selection(self): + selected_shader = self.selected_shader_list[self.data.shader_layer] index = self.shaders_menu.selected_list_index is_file, name = self.shaders_menu.extract_file_type_and_name_from_menu_format( self.shaders_menu_list[index]['name']) is_selected_shader = False - if is_file and name == self.selected_shader['name'].lstrip(): + if is_file and name == selected_shader['name'].lstrip(): is_selected_shader = True elif is_file: - self.selected_shader = self.shaders_menu_list[index] + self.selected_shader_list[self.data.shader_layer] = self.shaders_menu_list[index] self.load_selected_shader() else: self.shaders_menu.update_open_folders(name) self.shaders_menu_list = self.generate_shaders_list() - return is_file, is_selected_shader, self.selected_shader + return is_file, is_selected_shader, selected_shader + + def play_this_shader(self, slot): + self.selected_shader_list[self.data.shader_layer] = self.data.shader_bank_data[self.data.shader_layer][slot] + self.load_selected_shader() def increase_this_param(self, amount_change): param = self.focused_param @@ -126,8 +140,8 @@ class Shaders(object): def set_param_to_amount(self, param, amount): if self.data.settings['shader']['X3_AS_SPEED']['value'] == 'enabled' and param == 3: - self.osc_client.send_message("/shader/speed", [param, amount] ) + self.osc_client.send_message("/shader/{}/speed".format(str(self.data.shader_layer)), [param, amount] ) else: - self.osc_client.send_message("/shader/param", [param, amount] ) + self.osc_client.send_message("/shader/{}/param".format(str(self.data.shader_layer)), [param, amount] ) self.selected_param_values[param] = amount From 4313c4b0608e69c5a4f40ca95f93bf87560fe467 Mon Sep 17 00:00:00 2001 From: langolierz Date: Tue, 3 Dec 2019 17:31:28 +0000 Subject: [PATCH 3/6] working on new shader bank feature --- actions.py | 53 ++++++++++++++++++++---- data_centre/data.py | 4 +- display_centre/display.py | 41 +++++++++++-------- json_objects/analog_action_mapping.json | 16 ++++---- json_objects/keypad_action_mapping.json | 17 ++++---- json_objects/midi_action_mapping.json | 24 +++++------ json_objects/settings_default.json | 13 +++++- json_objects/shader_bank_data.json | 42 ++++++++++--------- video_centre/shaders.py | 54 +++++++++++++++++-------- 9 files changed, 174 insertions(+), 90 deletions(-) diff --git a/actions.py b/actions.py index a465ca2..610f73b 100644 --- a/actions.py +++ b/actions.py @@ -280,6 +280,9 @@ class Actions(object): else: self.message_handler.set_message('INFO', 'no shader loaded') + def toggle_shader_speed(self): + self.shaders.toggle_shader_speed() + def toggle_player_mode(self): if self.data.player_mode == 'now': self.data.player_mode = 'next' @@ -303,6 +306,11 @@ class Actions(object): self.data.detour_settings['is_playing'] = is_playing self.video_driver.osc_client.send_message("/detour/is_playing", is_playing) + def toggle_feedback(self): + print('toggle here') + self.data.feedback_active = not self.data.feedback_active + self.video_driver.osc_client.send_message("/toggle_feedback", self.data.feedback_active) + def play_shader_0(self): self.play_this_shader(0) @@ -442,17 +450,42 @@ class Actions(object): def set_the_next_video_alpha_continuous(self, amount): self.video_driver.next_player.set_alpha_value(amount*255) - def set_the_shader_param_0_continuous(self, amount): - self.shaders.set_param_to_amount(0, amount) + def set_the_shader_param_0_layer_offset_0_continuous(self, amount): + self.shaders.set_param_to_amount(0, amount, layer_offset=0) - def set_the_shader_param_1_continuous(self, amount): - self.shaders.set_param_to_amount(1, amount) + def set_the_shader_param_1_layer_offset_0_continuous(self, amount): + self.shaders.set_param_to_amount(1, amount, layer_offset=0) - def set_the_shader_param_2_continuous(self, amount): - self.shaders.set_param_to_amount(2, amount) + def set_the_shader_param_2_layer_offset_0_continuous(self, amount): + self.shaders.set_param_to_amount(2, amount, layer_offset=0) + + def set_the_shader_param_3_layer_offset_0_continuous(self, amount): + self.shaders.set_param_to_amount(3, amount, layer_offset=0) + + def set_the_shader_param_0_layer_offset_1_continuous(self, amount): + self.shaders.set_param_to_amount(0, amount, layer_offset=1) + + def set_the_shader_param_1_layer_offset_1_continuous(self, amount): + self.shaders.set_param_to_amount(1, amount, layer_offset=1) + + def set_the_shader_param_2_layer_offset_1_continuous(self, amount): + self.shaders.set_param_to_amount(2, amount, layer_offset=1) + + def set_the_shader_param_3_layer_offset_1_continuous(self, amount): + self.shaders.set_param_to_amount(3, amount, layer_offset=1) + + def set_the_shader_param_0_layer_offset_2_continuous(self, amount): + self.shaders.set_param_to_amount(0, amount, layer_offset=2) + + def set_the_shader_param_1_layer_offset_2_continuous(self, amount): + self.shaders.set_param_to_amount(1, amount, layer_offset=2) + + def set_the_shader_param_2_layer_offset_2_continuous(self, amount): + self.shaders.set_param_to_amount(2, amount, layer_offset=2) + + def set_the_shader_param_3_layer_offset_2_continuous(self, amount): + self.shaders.set_param_to_amount(3, amount, layer_offset=2) - def set_the_shader_param_3_continuous(self, amount): - self.shaders.set_param_to_amount(3, amount) def get_midi_status(self): self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status)) @@ -484,6 +517,10 @@ class Actions(object): subprocess.call(['tvservice --preferred'], shell=True) elif self.data.settings['video']['HDMI_MODE']['value'] == 'CEA 4 HDMI': subprocess.call(['tvservice -e=\"CEA 4 HDMI\"'], shell=True) + elif self.data.settings['video']['HDMI_MODE']['value'] == 'CEA 17 HDMI': + subprocess.call(['tvservice -e=\"CEA 17 HDMI\"'], shell=True) + elif self.data.settings['video']['HDMI_MODE']['value'] == 'CEA 1 HDMI': + subprocess.call(['tvservice -e=\"CEA 1 HDMI\"'], shell=True) self.refresh_frame_buffer_and_restart_openframeworks() def check_and_set_output_mode_on_boot(self): diff --git a/data_centre/data.py b/data_centre/data.py index b479914..2e09c80 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -44,6 +44,7 @@ class Data(object): self.confirm_action = None self.player_mode = 'now' + self.feedback_active = False self.detour_active = False self.detour_mix_shaders = self.get_list_of_two_input_shaders() self.detour_settings = collections.OrderedDict([('current_detour',0), ('is_playing', False), ('is_recording', False), ('record_loop', False), ('detour_size', False), ('detour_speed', 0), ('memory_full', False), ('mix_shader', self.detour_mix_shaders[0]), ('detour_position', 5), ('detour_start', 0), ('detour_end', 0), ('detour_mix', 0), ('is_delay', False)]) @@ -52,7 +53,6 @@ class Data(object): self.current_bankslot = '0-0' self.shader_layer = 0 - self.shader_slots = [None, None, None] ### persisted data (use default if doesnt exits): self.bank_data = [self.create_empty_bank()] @@ -360,7 +360,7 @@ class Data(object): if self.settings['video']['VIDEOPLAYER_BACKEND']['value'] != 'omxplayer' and self.settings['shader']['USE_SHADER']['value'] == 'enabled': display_modes.append(["SHADERS",'NAV_SHADERS']) if self.settings['shader']['USE_SHADER_BANK']['value'] == 'enabled' and ["SHADERS",'NAV_SHADERS'] in display_modes: - display_modes.append(["SHADBANK",'PLAY_SHADER']) + display_modes.append(["SHDR_BNK",'PLAY_SHADER']) if self.settings['detour']['TRY_DEMO']['value'] == 'enabled': display_modes.append(["FRAMES",'NAV_DETOUR']) if not with_nav_mode: diff --git a/display_centre/display.py b/display_centre/display.py index 39dd43d..4f6c4ae 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -52,7 +52,7 @@ class Display(object): self.display_text.pack() def _load_title(self): - if self.data.display_mode == 'SHADERS' or self.data.display_mode == 'SHADBANK': + if self.data.display_mode == 'SHADERS' or self.data.display_mode == 'SHDR_BNK': self.display_text.insert(END, self.TITLES[1] + ' \n') self.display_text.tag_add("TITLE", 1.19, 1.31) elif self.data.display_mode == 'FRAMES': @@ -88,7 +88,7 @@ class Display(object): self._load_sampler() elif self.data.display_mode == 'SHADERS': self._load_shaders() - elif self.data.display_mode == 'SHADBANK': + elif self.data.display_mode == 'SHDR_BNK': self._load_shader_bank() elif self.data.display_mode == 'FRAMES': self._load_detour() @@ -170,11 +170,11 @@ class Display(object): ## showing current shader info: shader = self.shaders.selected_shader_list[self.data.shader_layer] - self.display_text.insert(END, '{:<1}:{:<2} {:<17} '.format \ - (self.shaders.selected_status,shader['shad_type'][0], \ - shader['name'].lstrip()[0:17] )) + self.display_text.insert(END, '{:<1}lay{:<1}:{:<2} {:<16} '.format \ + (self.data.shader_layer,self.shaders.selected_status,shader['shad_type'][0], \ + shader['name'].lstrip()[0:16] )) for i in range(min(4,shader['param_number'])): - display_param = self.format_param_value(self.shaders.selected_param_values[i]) + display_param = self.format_param_value(self.shaders.selected_param_list[self.data.shader_layer][i]) if display_param == 100: display_param == 99 self.display_text.insert(END, 'x{}:{:02d}'.format(i, display_param)) @@ -200,14 +200,14 @@ class Display(object): shader_bank_data = self.data.shader_bank_data[self.data.shader_layer] self.display_text.insert(END, '{} \n'.format(self.body_title)) - - self.display_text.insert(END, '{:>6} {:<5} {:<5} '.format( + + self.display_text.insert(END, '{:>6} {:<11} {:<5} '.format( '{}-layer'.format(self.data.shader_layer), 'name', 'type')) shader = self.shaders.selected_shader_list[self.data.shader_layer] for i in range(min(4,shader['param_number'])): - display_param = self.format_param_value(self.shaders.selected_param_values[i]) + display_param = self.format_param_value(self.shaders.selected_param_list[self.data.shader_layer][i]) if display_param == 100: display_param == 99 self.display_text.insert(END, 'x{}:{:02d}'.format(i, display_param)) @@ -220,9 +220,12 @@ class Display(object): self.display_text.tag_add("ZEBRA_STRIPE", self.ROW_OFFSET + index, self.ROW_OFFSET + self.SELECTOR_WIDTH + index) # highlight the slot of the selected player - current_slot = self.data.shader_slots[self.data.shader_layer] - if current_slot: - self._highlight_this_row(current_slot) + current_slot = self.shaders.selected_shader_list[self.data.shader_layer].get('slot', None) + not_playing_tag = self.shaders.selected_status != '▶' + if current_slot is not None: + self._highlight_this_row(current_slot, gray=not_playing_tag) + + self._highlight_this_param(self.shaders.focused_param) def _load_detour(self): @@ -254,13 +257,19 @@ class Display(object): self.display_text.insert(END, '{:^47} \n'.format('< FUNCTION KEY ON >')) self.display_text.tag_add('FUNCTION', 16.0,16.0 + self.SELECTOR_WIDTH) else: - self.display_text.insert(END, '{:8} {:<10} \n'.format('CONTROL:', self.data.control_mode)) + feedback = '' + if self.data.feedback_active: + feedback = 'FDBCK' + self.display_text.insert(END, '{:8} {:<28} {:>5} \n'.format('CONTROL:', self.data.control_mode, feedback)) self.display_text.tag_add('TITLE', 16.0,16.0 + self.SELECTOR_WIDTH) - def _highlight_this_row(self, row): + def _highlight_this_row(self, row, gray=False): + highlight_tag = "SELECT" + if gray: + highlight_tag = "BROKEN_PATH" self.display_text.tag_remove("ZEBRA_STRIPE", self.ROW_OFFSET + row, self.ROW_OFFSET + self.SELECTOR_WIDTH + row) - self.display_text.tag_add("SELECT", self.ROW_OFFSET + row, + self.display_text.tag_add(highlight_tag, self.ROW_OFFSET + row, self.ROW_OFFSET + self.SELECTOR_WIDTH + row) def _unhighlight_this_row(self, row): @@ -269,7 +278,7 @@ class Display(object): def _highlight_this_param(self, param_num): param_row = self.ROW_OFFSET - 1 - column_offset = 0.24 + column_offset = 0.26 param_length = 0.05 self.display_text.tag_add("SHADER_PARAM", round(param_row + column_offset + param_num*param_length,2), round(param_row + column_offset + (param_num+1)*param_length, 2)) diff --git a/json_objects/analog_action_mapping.json b/json_objects/analog_action_mapping.json index c2782ff..a022ac7 100644 --- a/json_objects/analog_action_mapping.json +++ b/json_objects/analog_action_mapping.json @@ -1,34 +1,34 @@ { "0": { - "DEFAULT": ["set_the_shader_param_0_continuous"], + "DEFAULT": ["set_the_shader_param_0_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_mix_continuous"] }, "1": { - "DEFAULT": ["set_the_shader_param_1_continuous"], + "DEFAULT": ["set_the_shader_param_1_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_speed_position_continuous"] }, "2": { - "DEFAULT": ["set_the_shader_param_2_continuous"], + "DEFAULT": ["set_the_shader_param_2_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_start_continuous"] }, "3": { - "DEFAULT": ["set_the_shader_param_3_continuous"], + "DEFAULT": ["set_the_shader_param_3_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_end_continuous"] }, "4": { - "DEFAULT": ["set_the_shader_param_0_continuous"], + "DEFAULT": ["set_the_shader_param_0_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_mix_continuous"] }, "5": { - "DEFAULT": ["set_the_shader_param_1_continuous"], + "DEFAULT": ["set_the_shader_param_1_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_speed_position_continuous"] }, "6": { - "DEFAULT": ["set_the_shader_param_2_continuous"], + "DEFAULT": ["set_the_shader_param_2_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_start_continuous"] }, "7": { - "DEFAULT": ["set_the_shader_param_3_continuous"], + "DEFAULT": ["set_the_shader_param_3_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_end_continuous"] } } diff --git a/json_objects/keypad_action_mapping.json b/json_objects/keypad_action_mapping.json index b097926..836e46e 100644 --- a/json_objects/keypad_action_mapping.json +++ b/json_objects/keypad_action_mapping.json @@ -28,7 +28,8 @@ "LENGTH_SET": ["record_fixed_length"], "SHADER_PARAM": ["return_to_default_control_mode"], "CONFIRM": ["perform_confirm_action"], - "NAV_DETOUR": ["toggle_detour_play"] + "NAV_DETOUR": ["toggle_detour_play"], + "PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"] }, "d": { "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], @@ -57,16 +58,19 @@ "j": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], + "NAV_SHADERS": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "k": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], "PLAY_SHADER": ["play_shader_1","next_shader_layer"], + "NAV_SHADERS": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "l": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], + "NAV_SHADERS": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "m": { @@ -80,7 +84,7 @@ }, "o": { "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"], - "PLAY_SHADER": ["play_shader_5"] + "PLAY_SHADER": ["play_shader_5", "toggle_screen_mirror"] }, "p": { "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"], @@ -91,12 +95,11 @@ "PLAY_SHADER": ["play_shader_7","toggle_detour_mode"] }, "r": { - "DEFAULT": ["load_slot_8_into_next_player"], - "PLAY_SHADER": ["play_shader_8"] + "DEFAULT": ["load_slot_8_into_next_player", "toggle_feedback"], + "PLAY_SHADER": ["play_shader_8", "toggle_feedback"] }, "s": { "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], - "PLAY_SHADER": - ["play_shader_9","confirm_shutdown"] -} + "PLAY_SHADER": ["play_shader_9","confirm_shutdown"] + } } diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index 192d926..34361df 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -1,43 +1,43 @@ { "control_change 0": { - "DEFAULT": ["set_the_shader_param_0_continuous"], + "DEFAULT": ["set_the_shader_param_0_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_mix_continuous"] }, "control_change 1": { - "DEFAULT": ["set_the_shader_param_1_continuous"], + "DEFAULT": ["set_the_shader_param_1_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_speed_position_continuous"] }, "control_change 2": { - "DEFAULT": ["set_the_shader_param_2_continuous"], + "DEFAULT": ["set_the_shader_param_2_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_start_continuous"] }, "control_change 3": { - "DEFAULT": ["set_the_shader_param_3_continuous"], + "DEFAULT": ["set_the_shader_param_3_layer_offset_0_continuous"], "NAV_DETOUR": ["set_detour_end_continuous"] }, "control_change 4": { - "DEFAULT": ["set_the_shader_param_0_continuous"] + "DEFAULT": ["set_the_shader_param_0_layer_offset_1_continuous"] }, "control_change 5": { - "DEFAULT": ["set_the_shader_param_1_continuous"] + "DEFAULT": ["set_the_shader_param_1_layer_offset_1_continuous"] }, "control_change 6": { - "DEFAULT": ["set_the_shader_param_2_continuous"] + "DEFAULT": ["set_the_shader_param_2_layer_offset_1_continuous"] }, "control_change 7": { - "DEFAULT": ["set_the_shader_param_3_continuous"] + "DEFAULT": ["set_the_shader_param_3_layer_offset_1_continuous"] }, "control_change 8": { - "DEFAULT": ["set_the_shader_param_0_continuous"] + "DEFAULT": ["set_the_shader_param_0_layer_offset_2_continuous"] }, "control_change 9": { - "DEFAULT": ["set_the_shader_param_1_continuous"] + "DEFAULT": ["set_the_shader_param_1_layer_offset_2_continuous"] }, "control_change 10": { - "DEFAULT": ["set_the_shader_param_2_continuous"] + "DEFAULT": ["set_the_shader_param_2_layer_offset_2_continuous"] }, "control_change 11": { - "DEFAULT": ["set_the_shader_param_3_continuous"] + "DEFAULT": ["set_the_shader_param_0_layer_offset_3_continuous"] }, "note_on 72": { "NAV_BROWSER": ["move_browser_selection_up"], diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index f881d11..03071bc 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -163,7 +163,7 @@ }, "shader": { "USE_SHADER": { - "action": "update_capture_settings", + "action": null, "options": [ "enabled", "disabled" @@ -171,7 +171,15 @@ "value": "enabled" }, "USE_SHADER_BANK": { - "action": "update_capture_settings", + "action": null, + "options": [ + "enabled", + "disabled" + ], + "value": "disabled" + }, + "FIX_PARAM_OFFSET_LAYER": { + "action": null, "options": [ "enabled", "disabled" @@ -375,6 +383,7 @@ "options": [ "preferred", "CEA 4 HDMI", + "CEA 1 HDMI", "CEA 17 HDMI" ], "value": "CEA 4 HDMI" diff --git a/json_objects/shader_bank_data.json b/json_objects/shader_bank_data.json index 82424ad..c3291d3 100644 --- a/json_objects/shader_bank_data.json +++ b/json_objects/shader_bank_data.json @@ -1,22 +1,25 @@ [ [ { - "name": "wipe.frag", + "name": "add_mix.frag", "param_number": 4, - "path": "/home/pi/r_e_c_u_r/Shaders/2-input/wipe.frag", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/add_mix.frag", + "shad_type": "-", + "slot": 0 }, { - "name": "", + "name": "luma_key.frag", "param_number": 4, - "path": "", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/luma_key.frag", + "shad_type": "-", + "slot": 1 }, { - "name": "", + "name": "blend_add.frag", "param_number": 4, - "path": "", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/blend_add.frag", + "shad_type": "-", + "slot": 2 }, { "name": "", @@ -66,13 +69,15 @@ "name": "add_mix.frag", "param_number": 4, "path": "/home/pi/r_e_c_u_r/Shaders/2-input/add_mix.frag", - "shad_type": "-" + "shad_type": "-", + "slot": 0 }, { - "name": "", + "name": "hsv_control.frag", "param_number": 4, - "path": "", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control.frag", + "shad_type": "-", + "slot": 1 }, { "name": "", @@ -125,15 +130,16 @@ ], [ { - "name": "", + "name": "wobble.frag", "param_number": 4, - "path": "", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/wobble.frag", + "shad_type": "-", + "slot": 0 }, { - "name": "", + "name": "rotate.frag", "param_number": 4, - "path": "", + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/rotate.frag", "shad_type": "-" }, { diff --git a/video_centre/shaders.py b/video_centre/shaders.py index 3c0a050..7182237 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -12,13 +12,12 @@ class Shaders(object): self.data = data self.shaders_menu = menu.ShadersMenu(self.data, self.message_handler, self.MENU_HEIGHT ) self.selected_shader_list = [self.EMPTY_SHADER for i in range(3)] - self.focused_param = None + self.focused_param = 0 self.shaders_menu_list = self.generate_shaders_list() - if self.shaders_menu_list is not None: - pass self.selected_status = '-' ## going to try using symbols for this : '-' means empty, '▶' means running, '■' means not running, '!' means error - self.selected_param_values = [0.0,0.0,0.0,0.0] + self.selected_param_list = [[0.0,0.0,0.0,0.0] for i in range(3)] + self.selected_speed_list = [1.0, 1.0, 1.0] #self.load_selected_shader() def generate_shaders_list(self): @@ -72,18 +71,18 @@ class Shaders(object): def load_selected_shader(self): selected_shader = self.selected_shader_list[self.data.shader_layer] - self.selected_param_values = [0.0,0.0,0.0,0.0] + self.selected_param_list[self.data.shader_layer] = [0.0,0.0,0.0,0.0] print("select shader: ", selected_shader) - self.osc_client.send_message("/shader/load".format(str(self.data.shader_layer)), [selected_shader['path'],selected_shader['shad_type'] == '2in',selected_shader['param_number']]) + self.osc_client.send_message("/shader/{}/load".format(str(self.data.shader_layer)), [selected_shader['path'],selected_shader['shad_type'] == '2in',selected_shader['param_number']]) if not self.selected_status == '▶': self.selected_status = '■' def start_selected_shader(self): - self.osc_client.send_message("/shader/start".format(str(self.data.shader_layer)), True) + self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), True) self.selected_status = '▶' def stop_selected_shader(self): - self.osc_client.send_message("/shader/stop".format(str(self.data.shader_layer)), True) + self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), False) self.selected_status = '■' def map_on_shaders_selection(self): @@ -114,21 +113,32 @@ class Shaders(object): return is_file, is_selected_shader, selected_shader def play_this_shader(self, slot): - self.selected_shader_list[self.data.shader_layer] = self.data.shader_bank_data[self.data.shader_layer][slot] - self.load_selected_shader() + print(self.data.shader_bank_data[self.data.shader_layer]) + if self.data.shader_bank_data[self.data.shader_layer][slot]['path']: + self.selected_shader_list[self.data.shader_layer] = self.data.shader_bank_data[self.data.shader_layer][slot] + self.selected_shader_list[self.data.shader_layer]['slot'] = slot + self.load_selected_shader() + else: + self.message_handler.set_message('INFO', 'this slot is empty') def increase_this_param(self, amount_change): param = self.focused_param - current_amount = self.selected_param_values[param] + current_amount = self.selected_param_list[self.data.shader_layer][param] amount = self.get_new_param_amount(current_amount,amount_change) self.set_param_to_amount(param, amount) def decrease_this_param(self, amount_change): param = self.focused_param - current_amount = self.selected_param_values[param] + current_amount = self.selected_param_list[self.data.shader_layer][param] amount = self.get_new_param_amount(current_amount,-amount_change) self.set_param_to_amount(param, amount) + def toggle_shader_speed(self): + if self.selected_speed_list[self.data.shader_layer] > 0.62: + self.set_speed_to_amount(0.5) + else: + self.set_speed_to_amount(0.75) + @staticmethod def get_new_param_amount(current, change): if current + change > 1: @@ -138,10 +148,20 @@ class Shaders(object): else: return current + change - def set_param_to_amount(self, param, amount): + def set_param_to_amount(self, param, amount, layer_offset=0): + start_layer = self.data.shader_layer + if self.data.settings['shader']['FIX_PARAM_OFFSET_LAYER']['value'] == 'enabled': + start_layer = 0 + layer = start_layer + layer_offset % 4 if self.data.settings['shader']['X3_AS_SPEED']['value'] == 'enabled' and param == 3: - self.osc_client.send_message("/shader/{}/speed".format(str(self.data.shader_layer)), [param, amount] ) + self.set_speed_to_amount(amount, layout_offset=layout_offset) else: - self.osc_client.send_message("/shader/{}/param".format(str(self.data.shader_layer)), [param, amount] ) - self.selected_param_values[param] = amount - + self.osc_client.send_message("/shader/{}/param".format(str(layer)), [param, amount] ) + self.selected_param_list[layer][param] = amount + + def set_speed_to_amount(self, amount, layer_offset=0): + layer = self.data.shader_layer + layer_offset % 4 + self.osc_client.send_message("/shader/{}/speed".format(str(layer)), amount ) + self.selected_speed_list[layer] = amount + + From 2e133df8c3f3e5c851ee6f3945b71c2fb480de67 Mon Sep 17 00:00:00 2001 From: langolierz Date: Tue, 3 Dec 2019 19:40:42 +0000 Subject: [PATCH 4/6] adding strobe feature --- actions.py | 32 +++++++++++++++++++-------- json_objects/midi_action_mapping.json | 5 ++++- json_objects/settings_default.json | 17 ++++++++++++++ json_objects/shader_bank_data.json | 16 ++++++-------- video_centre/shaders.py | 7 ++++-- 5 files changed, 56 insertions(+), 21 deletions(-) diff --git a/actions.py b/actions.py index 610f73b..54152ed 100644 --- a/actions.py +++ b/actions.py @@ -486,6 +486,24 @@ class Actions(object): def set_the_shader_param_3_layer_offset_2_continuous(self, amount): self.shaders.set_param_to_amount(3, amount, layer_offset=2) + def set_the_shader_param_0_layer_offset_3_continuous(self, amount): + self.shaders.set_param_to_amount(0, amount, layer_offset=2) + + def set_the_shader_param_1_layer_offset_3_continuous(self, amount): + self.shaders.set_param_to_amount(1, amount, layer_offset=2) + + def set_the_shader_param_2_layer_offset_3_continuous(self, amount): + self.shaders.set_param_to_amount(2, amount, layer_offset=2) + + def set_the_shader_param_3_layer_offset_3_continuous(self, amount): + self.shaders.set_param_to_amount(3, amount, layer_offset=2) + + def set_strobe_amount_continuous(self, amount): + scaled_amount = int(amount * 10) + if self.data.settings['shader']['STROBE_AMOUNT']['value'] != scaled_amount: + print(scaled_amount) + self.video_driver.osc_client.send_message("/set_strobe", scaled_amount) + self.data.settings['shader']['STROBE_AMOUNT']['value'] = scaled_amount def get_midi_status(self): self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status)) @@ -835,18 +853,14 @@ class Actions(object): if current_recur_hash != new_recur_hash or current_conjur_hash != new_conjur_hash or current_ofxVideoArtTools_hash != new_ofxVideoArtTools_hash : #something has changed! os.remove('/home/pi/r_e_c_u_r/json_objects/settings.json') - if current_conjur_hash != new_conjur_hash or current_ofxVideoArtTools_hash != new_ofxVideoArtTools_hash : - self.message_handler.set_message('INFO', 'compiling OF pls wait') - self.tk.after(100,self.complie_openframeworks) - else: - self.restart_the_program() + self.restart_the_program() else: self.message_handler.set_message('INFO', 'up to date !') - def complie_openframeworks(self): - subprocess.call(['make', '--directory=' + self.data.PATH_TO_OPENFRAMEWORKS + 'apps/myApps/c_o_n_j_u_r' ]) - self.message_handler.set_message('INFO', 'finished compiling!') - self.restart_the_program() +# def complie_openframeworks(self): +# subprocess.call(['make', '--directory=' + self.data.PATH_TO_OPENFRAMEWORKS + 'apps/myApps/c_o_n_j_u_r' ]) +# self.message_handler.set_message('INFO', 'finished compiling!') +# self.restart_the_program() def shutdown_pi(self): subprocess.call(['sudo', 'shutdown', '-h', 'now']) diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index 34361df..48fc683 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -37,7 +37,10 @@ "DEFAULT": ["set_the_shader_param_2_layer_offset_2_continuous"] }, "control_change 11": { - "DEFAULT": ["set_the_shader_param_0_layer_offset_3_continuous"] + "DEFAULT": ["set_the_shader_param_3_layer_offset_2_continuous"] + }, + "control_change 12": { + "DEFAULT": ["set_strobe_amount_continuous"] }, "note_on 72": { "NAV_BROWSER": ["move_browser_selection_up"], diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index 03071bc..b3b4a2a 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -186,6 +186,23 @@ ], "value": "disabled" }, + "STROBE_AMOUNT": { + "action": null, + "options": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "value": 0 + }, "X3_AS_SPEED": { "action": null, "options": [ diff --git a/json_objects/shader_bank_data.json b/json_objects/shader_bank_data.json index c3291d3..6f85937 100644 --- a/json_objects/shader_bank_data.json +++ b/json_objects/shader_bank_data.json @@ -65,19 +65,17 @@ } ], [ - { - "name": "add_mix.frag", - "param_number": 4, - "path": "/home/pi/r_e_c_u_r/Shaders/2-input/add_mix.frag", - "shad_type": "-", - "slot": 0 - }, { "name": "hsv_control.frag", "param_number": 4, "path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control.frag", - "shad_type": "-", - "slot": 1 + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" }, { "name": "", diff --git a/video_centre/shaders.py b/video_centre/shaders.py index 7182237..78bdc24 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -148,10 +148,13 @@ class Shaders(object): else: return current + change - def set_param_to_amount(self, param, amount, layer_offset=0): + def set_param_to_amount(self, param, amount, layer_offset=None): start_layer = self.data.shader_layer if self.data.settings['shader']['FIX_PARAM_OFFSET_LAYER']['value'] == 'enabled': - start_layer = 0 + start_layer = 0 + if layer_offset is None: + start_layer = self.data.shader_layer + layer_offset = 0 layer = start_layer + layer_offset % 4 if self.data.settings['shader']['X3_AS_SPEED']['value'] == 'enabled' and param == 3: self.set_speed_to_amount(amount, layout_offset=layout_offset) From 0d32e5aa1aeeab8e1d7bf534b318a478f26f81aa Mon Sep 17 00:00:00 2001 From: langolierz Date: Tue, 3 Dec 2019 20:42:03 +0000 Subject: [PATCH 5/6] some fine tune shaders --- Shaders/1-input/hsv_control_fine.frag | 59 +++++++++++++++ Shaders/1-input/rotate_fine.frag | 54 ++++++++++++++ actions.py | 4 +- display_centre/display.py | 4 +- json_objects/midi_action_mapping.json | 100 ++++++++++++++++++-------- json_objects/shader_bank_data.json | 17 ++--- video_centre/shaders.py | 12 ++-- 7 files changed, 201 insertions(+), 49 deletions(-) create mode 100644 Shaders/1-input/hsv_control_fine.frag create mode 100644 Shaders/1-input/rotate_fine.frag diff --git a/Shaders/1-input/hsv_control_fine.frag b/Shaders/1-input/hsv_control_fine.frag new file mode 100644 index 0000000..f763972 --- /dev/null +++ b/Shaders/1-input/hsv_control_fine.frag @@ -0,0 +1,59 @@ +//1-input +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 v_texcoord; +uniform sampler2D u_tex0; +uniform sampler2D u_tex1; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_x0; +uniform float u_x1; +uniform float u_x2; +uniform float u_x3; + +vec3 rgb2grayscale(vec3 c) +{ + return(vec3(dot(c, vec3(0.299, 0.587, 0.114)))); +} + +vec3 rgb2hsv(vec3 c) +{ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +vec3 hsv2rgb(vec3 c) +{ + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main(){ + +vec2 pos = v_texcoord; +vec4 color = texture2D(u_tex0, pos); + +vec3 hsv = rgb2hsv(color.rgb); +hsv.x += 0.1*u_x0 - 0.05; +hsv.y += 0.1*u_x1 - 0.05; +hsv.z += 0.1*u_x2 - 0.05; +//hsv.x += -0.2; +vec3 rgb = hsv2rgb(hsv.xyz); + + +gl_FragColor = vec4(rgb, color.a); + +} + + + + + diff --git a/Shaders/1-input/rotate_fine.frag b/Shaders/1-input/rotate_fine.frag new file mode 100644 index 0000000..69cb61e --- /dev/null +++ b/Shaders/1-input/rotate_fine.frag @@ -0,0 +1,54 @@ +//1-input +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 v_texcoord; +uniform sampler2D u_tex0; +uniform sampler2D u_tex1; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_x0; +uniform float u_x1; +uniform float u_x2; +uniform float u_x3; + +vec4 rotate(sampler2D tex, vec2 pos){ + + vec4 texColourRotate; + vec2 center; + //center = vec2(u_x3 / u_resolution.x, u_x4 / u_resolution.y); + center = vec2(0.45 + 0.1*u_x1,0.45 + 0.1*u_x2); + + pos.x = (pos.x - center.x)*(0.5 / (0.45 + 0.1*u_x3)) + center.x; + pos.y = (pos.y - center.y)*(0.5 / (0.45 + 0.1*u_x3)) + center.y; + + float r = distance(center, pos); + float a = atan(pos.x - center.x, pos.y - center.y); + + pos.x = r * cos(a + 2.0 * 3.141592 * (0.2 + 0.1*u_x0)) + 0.5; + pos.y = r * sin(a + 2.0 * 3.141592 * (0.2 + 0.1*u_x0)) + 0.5; + pos.x = 1.0 - pos.x; + if((pos.x < 0.0)||(pos.y < 0.0)||(pos.x > 1.0)||(pos.y > 1.0)){ + texColourRotate = vec4(0.0); + } + else{ + texColourRotate = texture2D(tex, pos); + } + return texColourRotate; +} + +void main(){ + + vec2 pos = v_texcoord; + vec4 texColour0; + texColour0 = rotate(u_tex0, v_texcoord); + + gl_FragColor = texColour0; + +} + + + + + diff --git a/actions.py b/actions.py index 54152ed..1bec308 100644 --- a/actions.py +++ b/actions.py @@ -273,9 +273,9 @@ class Actions(object): self.message_handler.set_message('INFO', 'cant mirror in dev mode') def toggle_shaders(self): - if self.shaders.selected_status == '▶': + if self.shaders.selected_status_list[self.data.shader_layer] == '▶': self.shaders.stop_selected_shader() - elif self.shaders.selected_status == '■': + elif self.shaders.selected_status_list[self.data.shader_layer] == '■': self.shaders.start_selected_shader() else: self.message_handler.set_message('INFO', 'no shader loaded') diff --git a/display_centre/display.py b/display_centre/display.py index 4f6c4ae..17afa99 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -171,7 +171,7 @@ class Display(object): ## showing current shader info: shader = self.shaders.selected_shader_list[self.data.shader_layer] self.display_text.insert(END, '{:<1}lay{:<1}:{:<2} {:<16} '.format \ - (self.data.shader_layer,self.shaders.selected_status,shader['shad_type'][0], \ + (self.data.shader_layer,self.shaders.selected_status_list[self.data.shader_layer],shader['shad_type'][0], \ shader['name'].lstrip()[0:16] )) for i in range(min(4,shader['param_number'])): display_param = self.format_param_value(self.shaders.selected_param_list[self.data.shader_layer][i]) @@ -221,7 +221,7 @@ class Display(object): self.ROW_OFFSET + self.SELECTOR_WIDTH + index) # highlight the slot of the selected player current_slot = self.shaders.selected_shader_list[self.data.shader_layer].get('slot', None) - not_playing_tag = self.shaders.selected_status != '▶' + not_playing_tag = self.shaders.selected_status_list[self.data.shader_layer] != '▶' if current_slot is not None: self._highlight_this_row(current_slot, gray=not_playing_tag) diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index 48fc683..c2eae1b 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -49,7 +49,8 @@ "NAV_SHADERS": ["move_shaders_selection_up"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"] + "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], + "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] }, "note_on 73": { "NAV_BROWSER": ["move_browser_selection_down"], @@ -58,17 +59,20 @@ "NAV_SHADERS": ["move_shaders_selection_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["increase_this_param", "increase_shader_param"] + "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], + "PLAY_SHADER": ["increase_this_param", "increase_shader_param"] + }, "note_on 74": { "NAV_BROWSER": ["enter_on_browser_selection"], "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], "NAV_SETTINGS": ["enter_on_settings_selection"], - "NAV_SHADERS": ["enter_on_shaders_selection"], + "NAV_SHADERS": ["enter_on_shaders_selection", "map_on_shaders_selection"], "LENGTH_SET": ["record_fixed_length"], "SHADER_PARAM": ["return_to_default_control_mode"], "CONFIRM": ["perform_confirm_action"], - "NAV_DETOUR": ["toggle_detour_play"] + "NAV_DETOUR": ["toggle_detour_play"], + "PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"] }, "note_on 75": { "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], @@ -77,11 +81,13 @@ "note_on 76": { "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"], "SHADER_PARAM": ["decrease_param_focus"], + "PLAY_SHADER": ["decrease_param_focus"], "NAV_DETOUR": ["decrease_mix_shader"] }, "note_on 77": { "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"], "SHADER_PARAM": ["increase_param_focus"], + "PLAY_SHADER": ["increase_param_focus"], "NAV_DETOUR": ["increase_mix_shader"] }, "note_on 78": { @@ -94,46 +100,60 @@ }, "note_on 81": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], + "NAV_SHADERS": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "note_on 82": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "PLAY_SHADER": ["play_shader_1","next_shader_layer"], + "NAV_SHADERS": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "note_on 83": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], + "NAV_SHADERS": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "note_on 84": { "DEFAULT": ["load_slot_3_into_next_player"], + "PLAY_SHADER": ["play_shader_3"], "NAV_DETOUR": ["switch_to_detour_3"] }, "note_on 85": { - "DEFAULT": ["load_slot_4_into_next_player"] + "DEFAULT": ["load_slot_4_into_next_player"], + "PLAY_SHADER": ["play_shader_4"] }, "note_on 86": { - "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] + "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"], + "PLAY_SHADER": ["play_shader_5", "toggle_screen_mirror"] }, "note_on 87": { - "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"], + "PLAY_SHADER": ["play_shader_6","toggle_shaders"] }, "note_on 88": { - "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"], + "PLAY_SHADER": ["play_shader_7","toggle_detour_mode"] }, "note_on 89": { - "DEFAULT": ["load_slot_8_into_next_player"] + "DEFAULT": ["load_slot_8_into_next_player", "toggle_feedback"], + "PLAY_SHADER": ["play_shader_8", "toggle_feedback"] }, "note_on 90": { - "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] - }, - "note_on 36": { + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], + "PLAY_SHADER": ["play_shader_9","confirm_shutdown"] + }, + "note_on 36": { "NAV_BROWSER": ["move_browser_selection_up"], "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], "NAV_SETTINGS": ["move_settings_selection_up"], "NAV_SHADERS": ["move_shaders_selection_up"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"] + "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], + "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] }, "note_on 37": { "NAV_BROWSER": ["move_browser_selection_down"], @@ -142,17 +162,20 @@ "NAV_SHADERS": ["move_shaders_selection_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["increase_this_param", "increase_shader_param"] + "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], + "PLAY_SHADER": ["increase_this_param", "increase_shader_param"] + }, "note_on 38": { "NAV_BROWSER": ["enter_on_browser_selection"], "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], "NAV_SETTINGS": ["enter_on_settings_selection"], - "NAV_SHADERS": ["enter_on_shaders_selection"], + "NAV_SHADERS": ["enter_on_shaders_selection", "map_on_shaders_selection"], "LENGTH_SET": ["record_fixed_length"], "SHADER_PARAM": ["return_to_default_control_mode"], "CONFIRM": ["perform_confirm_action"], - "NAV_DETOUR": ["toggle_detour_play"] + "NAV_DETOUR": ["toggle_detour_play"], + "PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"] }, "note_on 39": { "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], @@ -161,54 +184,69 @@ "note_on 40": { "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"], "SHADER_PARAM": ["decrease_param_focus"], + "PLAY_SHADER": ["decrease_param_focus"], "NAV_DETOUR": ["decrease_mix_shader"] }, "note_on 41": { "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"], "SHADER_PARAM": ["increase_param_focus"], + "PLAY_SHADER": ["increase_param_focus"], "NAV_DETOUR": ["increase_mix_shader"] }, "note_on 42": { "DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]}, - "note_on 79": { + "note_on 43": { "DEFAULT": ["cycle_display_mode", "cycle_display_mode_back"] }, - "note_on 43": { + "note_on 44": { "DEFAULT": ["toggle_function"] }, - "note_on 44": { + "note_on 45": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], + "NAV_SHADERS": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, - "note_on 45": { + "note_on 46": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "PLAY_SHADER": ["play_shader_1","next_shader_layer"], + "NAV_SHADERS": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, - "note_on 46": { + "note_on 47": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], + "NAV_SHADERS": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, - "note_on 47": { + "note_on 48": { "DEFAULT": ["load_slot_3_into_next_player"], + "PLAY_SHADER": ["play_shader_3"], "NAV_DETOUR": ["switch_to_detour_3"] }, - "note_on 48": { - "DEFAULT": ["load_slot_4_into_next_player"] - }, "note_on 49": { - "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] + "DEFAULT": ["load_slot_4_into_next_player"], + "PLAY_SHADER": ["play_shader_4"] }, "note_on 50": { - "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] + "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"], + "PLAY_SHADER": ["play_shader_5", "toggle_screen_mirror"] }, "note_on 51": { - "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"], + "PLAY_SHADER": ["play_shader_6","toggle_shaders"] }, "note_on 52": { - "DEFAULT": ["load_slot_8_into_next_player"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"], + "PLAY_SHADER": ["play_shader_7","toggle_detour_mode"] }, "note_on 53": { - "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] - } + "DEFAULT": ["load_slot_8_into_next_player", "toggle_feedback"], + "PLAY_SHADER": ["play_shader_8", "toggle_feedback"] + }, + "note_on 54": { + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], + "PLAY_SHADER": ["play_shader_9","confirm_shutdown"] + } } diff --git a/json_objects/shader_bank_data.json b/json_objects/shader_bank_data.json index 6f85937..a85d327 100644 --- a/json_objects/shader_bank_data.json +++ b/json_objects/shader_bank_data.json @@ -69,13 +69,15 @@ "name": "hsv_control.frag", "param_number": 4, "path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control.frag", - "shad_type": "-" + "shad_type": "-", + "slot": 0 }, { - "name": "", + "name": "hsv_control_fine.frag", "param_number": 4, - "path": "", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control_fine.frag", + "shad_type": "-", + "slot": 1 }, { "name": "", @@ -131,8 +133,7 @@ "name": "wobble.frag", "param_number": 4, "path": "/home/pi/r_e_c_u_r/Shaders/1-input/wobble.frag", - "shad_type": "-", - "slot": 0 + "shad_type": "-" }, { "name": "rotate.frag", @@ -141,9 +142,9 @@ "shad_type": "-" }, { - "name": "", + "name": "rotate_fine.frag", "param_number": 4, - "path": "", + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/rotate_fine.frag", "shad_type": "-" }, { diff --git a/video_centre/shaders.py b/video_centre/shaders.py index 78bdc24..0d93ae6 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -15,7 +15,7 @@ class Shaders(object): self.focused_param = 0 self.shaders_menu_list = self.generate_shaders_list() - self.selected_status = '-' ## going to try using symbols for this : '-' means empty, '▶' means running, '■' means not running, '!' means error + self.selected_status_list = ['-','-','-'] ## going to try using symbols for this : '-' means empty, '▶' means running, '■' means not running, '!' means error self.selected_param_list = [[0.0,0.0,0.0,0.0] for i in range(3)] self.selected_speed_list = [1.0, 1.0, 1.0] #self.load_selected_shader() @@ -71,19 +71,19 @@ class Shaders(object): def load_selected_shader(self): selected_shader = self.selected_shader_list[self.data.shader_layer] - self.selected_param_list[self.data.shader_layer] = [0.0,0.0,0.0,0.0] + #self.selected_param_list[self.data.shader_layer] = [0.0,0.0,0.0,0.0] print("select shader: ", selected_shader) self.osc_client.send_message("/shader/{}/load".format(str(self.data.shader_layer)), [selected_shader['path'],selected_shader['shad_type'] == '2in',selected_shader['param_number']]) - if not self.selected_status == '▶': - self.selected_status = '■' + if not self.selected_status_list[self.data.shader_layer] == '▶': + self.selected_status_list[self.data.shader_layer] = '■' def start_selected_shader(self): self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), True) - self.selected_status = '▶' + self.selected_status_list[self.data.shader_layer] = '▶' def stop_selected_shader(self): self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), False) - self.selected_status = '■' + self.selected_status_list[self.data.shader_layer] = '■' def map_on_shaders_selection(self): index = self.shaders_menu.selected_list_index From 7507cbe4e46c27bbdea3120ae24316f245586356 Mon Sep 17 00:00:00 2001 From: langolierz Date: Fri, 6 Dec 2019 15:52:27 +0000 Subject: [PATCH 6/6] fixing update code --- actions.py | 7 +++---- data_centre/data.py | 11 ++++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/actions.py b/actions.py index 1bec308..1e44d57 100644 --- a/actions.py +++ b/actions.py @@ -7,7 +7,6 @@ import os from pythonosc import osc_message_builder from pythonosc import dispatcher from pythonosc import osc_server -from pythonosc import dispatcher import git import threading import argparse @@ -557,7 +556,6 @@ class Actions(object): self.change_hdmi_settings('CEA 4 HDMI') - def check_dev_mode(self): #### check if in dev mode:(ie not using the lcd screen) with open('/boot/config.txt', 'r') as config: @@ -832,6 +830,8 @@ class Actions(object): current_recur_hash = recur_repo.head.object.hexsha current_conjur_hash = conjur_repo.head.object.hexsha current_ofxVideoArtTools_hash = ofxVideoArtTools_repo.head.object.hexsha + os.remove('/home/pi/r_e_c_u_r/json_objects/settings.json') + os.remove(self.data.PATH_TO_DATA_OBJECTS + self.data.SETTINGS_JSON ) try: recur_repo.remotes.origin.pull() conjur_repo.remotes.origin.pull() @@ -851,8 +851,7 @@ class Actions(object): new_conjur_hash = conjur_repo.head.object.hexsha new_ofxVideoArtTools_hash = ofxVideoArtTools_repo.head.object.hexsha if current_recur_hash != new_recur_hash or current_conjur_hash != new_conjur_hash or current_ofxVideoArtTools_hash != new_ofxVideoArtTools_hash : - #something has changed! - os.remove('/home/pi/r_e_c_u_r/json_objects/settings.json') + #something has changed! self.restart_the_program() else: self.message_handler.set_message('INFO', 'up to date !') diff --git a/data_centre/data.py b/data_centre/data.py index 2e09c80..7c18d20 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -6,7 +6,7 @@ from random import randint import inspect from itertools import cycle from omxplayer.player import OMXPlayer - +from shutil import copyfile @@ -24,6 +24,7 @@ class Data(object): PATH_TO_EXTERNAL_DEVICES = '/media/pi' PATH_TO_OPENFRAMEWORKS = '/home/pi/openframeworks10.1/' PATH_TO_CONJUR_DATA = PATH_TO_OPENFRAMEWORKS + 'apps/myApps/c_o_n_j_u_r/bin/data/settings.xml' + PATH_TO_DEFAULT_CONJUR_DATA = PATH_TO_OPENFRAMEWORKS + 'apps/myApps/c_o_n_j_u_r/bin/data/settings_default.xml' def __init__(self, message_handler): self.message_handler = message_handler @@ -55,6 +56,10 @@ class Data(object): self.shader_layer = 0 ### persisted data (use default if doesnt exits): + if not os.path.isfile(self.PATH_TO_CONJUR_DATA): + os.remove(self.PATH_TO_DATA_OBJECTS + self.SETTINGS_JSON ) # keep the, in sync + copyfile(self.PATH_TO_DEFAULT_CONJUR_DATA, self.PATH_TO_CONJUR_DATA) + self.bank_data = [self.create_empty_bank()] if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.BANK_DATA_JSON): self.bank_data = self._read_json(self.BANK_DATA_JSON) @@ -62,8 +67,8 @@ class Data(object): self.shader_bank_data = [self.create_empty_shader_bank() for i in range(3)] if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SHADER_BANK_DATA_JSON): self.shader_bank_data = self._read_json(self.SHADER_BANK_DATA_JSON) - self.settings = self._read_json(self.DEFAULT_SETTINGS_JSON) + if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SETTINGS_JSON): self.settings = self._read_json(self.SETTINGS_JSON) @@ -71,7 +76,7 @@ class Data(object): self.midi_mappings = self._read_json(self.MIDI_MAPPING_JSON) self.analog_mappings = self._read_json(self.ANALOG_MAPPING_JSON) - + @staticmethod