Merge branch 'c_o_n_j_u_r' of https://github.com/langolierz/r_e_c_u_r into c_o_n_j_u_r

This commit is contained in:
Tristan Rowley
2019-12-06 18:19:38 +00:00
12 changed files with 836 additions and 168 deletions

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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
@@ -73,10 +72,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()
@@ -271,13 +272,16 @@ 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')
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'
@@ -301,6 +305,53 @@ 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)
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']
@@ -398,17 +449,60 @@ 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_continuous(self, amount):
self.shaders.set_param_to_amount(3, amount)
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_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))
@@ -440,6 +534,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):
@@ -458,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:
@@ -605,10 +702,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']
@@ -733,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()
@@ -752,20 +851,15 @@ 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')
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()
#something has changed!
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'])

View File

@@ -6,13 +6,14 @@ from random import randint
import inspect
from itertools import cycle
from omxplayer.player import OMXPlayer
from shutil import copyfile
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'
@@ -23,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
@@ -42,19 +44,31 @@ class Data(object):
self.update_screen = True
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)])
self.next_bankslot = '0-0'
self.current_bankslot = '0-0'
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)
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):
self.settings = self._read_json(self.SETTINGS_JSON)
@@ -62,13 +76,18 @@ class Data(object):
self.midi_mappings = self._read_json(self.MIDI_MAPPING_JSON)
self.analog_mappings = self._read_json(self.ANALOG_MAPPING_JSON)
@staticmethod
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 +123,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 +170,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 +325,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 +364,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(["SHDR_BNK",'PLAY_SHADER'])
if self.settings['detour']['TRY_DEMO']['value'] == 'enabled':
display_modes.append(["FRAMES",'NAV_DETOUR'])
if not with_nav_mode:
@@ -331,6 +381,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):

View File

@@ -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 == '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,6 +88,8 @@ class Display(object):
self._load_sampler()
elif self.data.display_mode == 'SHADERS':
self._load_shaders()
elif self.data.display_mode == 'SHDR_BNK':
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,12 +169,12 @@ 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 \
(self.shaders.selected_status,shader['shad_type'][0], \
format(shader['shad_index'],'02d'), shader['name'].lstrip()[0:17] ))
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_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_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))
@@ -194,6 +196,37 @@ 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} {:<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_list[self.data.shader_layer][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.shaders.selected_shader_list[self.data.shader_layer].get('slot', None)
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)
self._highlight_this_param(self.shaders.focused_param)
def _load_detour(self):
line_count = 0
@@ -224,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):
@@ -239,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))

View File

@@ -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"]
}
}

View File

@@ -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,17 +16,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"]
},
"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"],
"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"],
@@ -34,11 +38,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 +57,49 @@
},
"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": {
"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", "toggle_screen_mirror"]
},
"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", "toggle_feedback"],
"PLAY_SHADER": ["play_shader_8", "toggle_feedback"]
},
"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"]
}
}

View File

@@ -1,173 +1,252 @@
{
"control_change 1": {
"DEFAULT": ["set_the_shader_param_0_continuous"],
"control_change 0": {
"DEFAULT": ["set_the_shader_param_0_layer_offset_0_continuous"],
"NAV_DETOUR": ["set_detour_mix_continuous"]
},
"control_change 2": {
"DEFAULT": ["set_the_shader_param_1_continuous"],
"control_change 1": {
"DEFAULT": ["set_the_shader_param_1_layer_offset_0_continuous"],
"NAV_DETOUR": ["set_detour_speed_position_continuous"]
},
"control_change 3": {
"DEFAULT": ["set_the_shader_param_2_continuous"],
"control_change 2": {
"DEFAULT": ["set_the_shader_param_2_layer_offset_0_continuous"],
"NAV_DETOUR": ["set_detour_start_continuous"]
},
"control_change 4": {
"DEFAULT": ["set_the_shader_param_3_continuous"],
"control_change 3": {
"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_layer_offset_1_continuous"]
},
"control_change 5": {
"DEFAULT": ["set_the_shader_param_0_continuous"]
"DEFAULT": ["set_the_shader_param_1_layer_offset_1_continuous"]
},
"control_change 6": {
"DEFAULT": ["set_the_shader_param_1_continuous"]
"DEFAULT": ["set_the_shader_param_2_layer_offset_1_continuous"]
},
"control_change 7": {
"DEFAULT": ["set_the_shader_param_2_continuous"]
"DEFAULT": ["set_the_shader_param_3_layer_offset_1_continuous"]
},
"control_change 8": {
"DEFAULT": ["set_the_shader_param_3_continuous"]
"DEFAULT": ["set_the_shader_param_0_layer_offset_2_continuous"]
},
"control_change 74": {
"DEFAULT": ["set_the_shader_param_0_continuous"]
"control_change 9": {
"DEFAULT": ["set_the_shader_param_1_layer_offset_2_continuous"]
},
"control_change 71": {
"DEFAULT": ["set_the_shader_param_1_continuous"]
"control_change 10": {
"DEFAULT": ["set_the_shader_param_2_layer_offset_2_continuous"]
},
"control_change 76": {
"DEFAULT": ["set_the_shader_param_2_continuous"]
"control_change 11": {
"DEFAULT": ["set_the_shader_param_3_layer_offset_2_continuous"]
},
"control_change 77": {
"DEFAULT": ["set_the_shader_param_3_continuous"]
"control_change 12": {
"DEFAULT": ["set_strobe_amount_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"],
"PLAY_SHADER": ["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"],
"PLAY_SHADER": ["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", "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"],
"PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"]
},
"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"],
"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"]
"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": {
"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"],
"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"]
"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"]
"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"]
"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"]
"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"]
"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","quit_the_program"]
},
"note_on 0": {
"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"],
"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"]
},
"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_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"],
"PLAY_SHADER": ["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"],
"PLAY_SHADER": ["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", "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"],
"PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"]
},
"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"],
"PLAY_SHADER": ["decrease_param_focus"],
"NAV_DETOUR": ["decrease_mix_shader"]
},
"note_on 41": {
"DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]},
"note_on 42": {
"DEFAULT": ["cycle_display_mode"]
"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 43": {
"DEFAULT": ["toggle_function"]
"DEFAULT": ["cycle_display_mode", "cycle_display_mode_back"]
},
"note_on 44": {
"DEFAULT": ["load_slot_0_into_next_player","previous_bank"]
"DEFAULT": ["toggle_function"]
},
"note_on 45": {
"DEFAULT": ["load_slot_1_into_next_player","next_bank"]
"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 46": {
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
"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 47": {
"DEFAULT": ["load_slot_3_into_next_player"]
"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 48": {
"DEFAULT": ["load_slot_4_into_next_player"]
"DEFAULT": ["load_slot_3_into_next_player"],
"PLAY_SHADER": ["play_shader_3"],
"NAV_DETOUR": ["switch_to_detour_3"]
},
"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"]
"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"]
"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","quit_the_program"]
}
"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"]
}
}

View File

@@ -163,13 +163,46 @@
},
"shader": {
"USE_SHADER": {
"action": "update_capture_settings",
"action": null,
"options": [
"enabled",
"disabled"
],
"value": "enabled"
},
"USE_SHADER_BANK": {
"action": null,
"options": [
"enabled",
"disabled"
],
"value": "disabled"
},
"FIX_PARAM_OFFSET_LAYER": {
"action": null,
"options": [
"enabled",
"disabled"
],
"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": [
@@ -366,7 +399,9 @@
"action": "change_hdmi_settings",
"options": [
"preferred",
"CEA 4 HDMI"
"CEA 4 HDMI",
"CEA 1 HDMI",
"CEA 17 HDMI"
],
"value": "CEA 4 HDMI"
},

View File

@@ -0,0 +1,193 @@
[
[
{
"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": "luma_key.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/2-input/luma_key.frag",
"shad_type": "-",
"slot": 1
},
{
"name": "blend_add.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/2-input/blend_add.frag",
"shad_type": "-",
"slot": 2
},
{
"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": "hsv_control.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control.frag",
"shad_type": "-",
"slot": 0
},
{
"name": "hsv_control_fine.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control_fine.frag",
"shad_type": "-",
"slot": 1
},
{
"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": "wobble.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/1-input/wobble.frag",
"shad_type": "-"
},
{
"name": "rotate.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/1-input/rotate.frag",
"shad_type": "-"
},
{
"name": "rotate_fine.frag",
"param_number": 4,
"path": "/home/pi/r_e_c_u_r/Shaders/1-input/rotate_fine.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": "-"
}
]
]

View File

@@ -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()

View File

@@ -1,40 +1,39 @@
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)
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.focused_param = None
self.selected_shader_list = [self.EMPTY_SHADER for i in range(3)]
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_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()
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
@@ -47,7 +46,7 @@ class Shaders(object):
return False, ''
def determine_shader_type(self, path):
with open(path, 'r') as selected_shader:
with open(path, 'r', errors='ignore') as selected_shader:
shader_text = selected_shader.read()
if '//0-input' in shader_text:
return '0in'
@@ -55,10 +54,10 @@ class Shaders(object):
return '1in'
elif '//2-input' in shader_text:
return '2in'
else:
return '-'
def determine_shader_parameter_number(self, path):
max_amount = 4
if True: # for now always assume 4 params
@@ -71,46 +70,75 @@ class Shaders(object):
return max_amount
def load_selected_shader(self):
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']])
if not self.selected_status == '':
self.selected_status = ''
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]
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_list[self.data.shader_layer] == '':
self.selected_status_list[self.data.shader_layer] = ''
def start_selected_shader(self):
self.osc_client.send_message("/shader/start", True)
self.selected_status = ''
self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), True)
self.selected_status_list[self.data.shader_layer] = ''
def stop_selected_shader(self):
self.osc_client.send_message("/shader/stop", True)
self.selected_status = ''
self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), False)
self.selected_status_list[self.data.shader_layer] = ''
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):
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:
@@ -120,10 +148,23 @@ 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=None):
start_layer = self.data.shader_layer
if self.data.settings['shader']['FIX_PARAM_OFFSET_LAYER']['value'] == 'enabled':
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.osc_client.send_message("/shader/speed", [param, amount] )
self.set_speed_to_amount(amount, layout_offset=layout_offset)
else:
self.osc_client.send_message("/shader/param", [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