diff --git a/actions.py b/actions.py index 7fac677..41eb955 100644 --- a/actions.py +++ b/actions.py @@ -200,14 +200,14 @@ class Actions(object): def increase_seek_time(self): options = self.data.settings['sampler']['SEEK_TIME']['options'] current_index = [index for index, item in enumerate(options) if item == self.data.settings['sampler']['SEEK_TIME']['value'] ][0] - self.data.settings['sampler']['SEEK_TIME']['value'] = options[(current_index + 1) % len(options) ] + self.data.update_setting_value('sampler', 'SEEK_TIME', options[(current_index + 1) % len(options) ]) self.message_handler.set_message('INFO', 'The Seek Time is now ' + str(self.data.settings['sampler']['SEEK_TIME']['value']) + 's') def decrease_seek_time(self): options = self.data.settings['sampler']['SEEK_TIME']['options'] current_index = [index for index, item in enumerate(options) if item == self.data.settings['sampler']['SEEK_TIME']['value'] ][0] - self.data.settings['sampler']['SEEK_TIME']['value'] = options[(current_index - 1) % len(options) ] + self.data.update_setting_value('sampler', 'SEEK_TIME', options[(current_index - 1) % len(options) ]) self.message_handler.set_message('INFO', 'The Seek Time is now ' + str(self.data.settings['sampler']['SEEK_TIME']['value']) + 's') @@ -549,7 +549,7 @@ class Actions(object): 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 + self.data.update_setting_value('shader', 'STROBE_AMOUNT', scaled_amount) def get_midi_status(self): self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status)) @@ -760,13 +760,13 @@ class Actions(object): def increase_shader_param(self): options = self.data.settings['shader']['SHADER_PARAM']['options'] current_index = [index for index, item in enumerate(options) if item == self.data.settings['shader']['SHADER_PARAM']['value'] ][0] - self.data.settings['shader']['SHADER_PARAM']['value'] = options[(current_index + 1) % len(options) ] + self.data.update_setting_value('shader', 'SHADER_PARAM', options[(current_index + 1) % len(options) ]) self.message_handler.set_message('INFO', 'The Param amountis now ' + str(self.data.settings['shader']['SHADER_PARAM']['value'])) def decrease_shader_param(self): options = self.data.settings['shader']['SHADER_PARAM']['options'] current_index = [index for index, item in enumerate(options) if item == self.data.settings['shader']['SHADER_PARAM']['value'] ][0] - self.data.settings['shader']['SHADER_PARAM']['value'] = options[(current_index - 1) % len(options) ] + self.data.update_setting_value('shader', 'SHADER_PARAM', options[(current_index - 1) % len(options) ]) self.message_handler.set_message('INFO', 'The Param amountis now ' + str(self.data.settings['shader']['SHADER_PARAM']['value'])) @@ -841,19 +841,22 @@ class Actions(object): self.server.shutdown() def create_client_and_shutdown_osc_server(self): - from pythonosc import udp_client - client_parser = argparse.ArgumentParser() - client_parser.add_argument("--ip", default=self.data.get_ip_for_osc_client(), help="the ip") - client_parser.add_argument("--port", type=int, default=8080, help="the port") + try: + from pythonosc import udp_client + client_parser = argparse.ArgumentParser() + client_parser.add_argument("--ip", default=self.data.get_ip_for_osc_client(), help="the ip") + client_parser.add_argument("--port", type=int, default=8080, help="the port") - client_args = client_parser.parse_args() + client_args = client_parser.parse_args() - client = udp_client.SimpleUDPClient(client_args.ip, client_args.port) - client.send_message("/shutdown", True) + client = udp_client.SimpleUDPClient(client_args.ip, client_args.port) + client.send_message("/shutdown", True) + except: + pass def toggle_access_point(self, setting_value): osc_setting_state = self.data.settings['user_input']['OSC_INPUT']['value'] - self.data.settings['user_input']['OSC_INPUT']['value'] = 'disabled' + self.data.update_setting_value('user_input', 'OSC_INPUT', 'disabled') self.tk.after(2000, self.toggle_access_point_delay, setting_value, osc_setting_state) def toggle_access_point_delay(self, setting_value, osc_setting_state ): @@ -865,7 +868,7 @@ class Actions(object): def toggle_remote_server(self, setting_value): osc_setting_state = self.data.settings['user_input']['OSC_INPUT']['value'] - self.data.settings['user_input']['OSC_INPUT']['value'] = 'disabled' + self.data.update_setting_value('user_input', 'OSC_INPUT', 'disabled') self.tk.after(2000, self.toggle_remote_server_delay, setting_value, osc_setting_state) def toggle_remote_server_delay(self, setting_value, osc_setting_state): @@ -873,10 +876,10 @@ class Actions(object): self.remote_process = subprocess.Popen(['node', '/home/pi/r_e_m_o_t_e/webserver.js']) else: self.stop_remote_process() - self.data.settings['user_input']['OSC_INPUT']['value'] = osc_setting_state + self.data.update_setting_value('user_input', 'OSC_INPUT', osc_setting_state) def enable_osc(self, osc_setting_state): - self.data.settings['user_input']['OSC_INPUT']['value'] = osc_setting_state + self.data.update_setting_value('user_input', 'OSC_INPUT', osc_setting_state) def show_ip(self, *args): diff --git a/data_centre/data.py b/data_centre/data.py index dfd8fcb..3d171fd 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -133,7 +133,7 @@ class Data(object): tag = tree.find("delayMode") tag.text = str(int(value)) tree.write(self.PATH_TO_CONJUR_DATA) - + def get_setting_and_folder_from_name(self, setting_name): for folder_key , folder_item in self.settings.items(): for setting_key, setting_item in folder_item.items(): diff --git a/user_input/midi_input.py b/user_input/midi_input.py index 5834578..1e23e71 100644 --- a/user_input/midi_input.py +++ b/user_input/midi_input.py @@ -51,38 +51,30 @@ class MidiInput(object): def poll_midi_input(self): i = 0 cc_dict = dict() - for message in self.midi_device.iter_pending(): - i = i + 1 - message_dict = message.dict() - midi_channel = midi_setting = self.data.settings['user_input']['MIDI_CHANNEL']['value'] - 1 + midi_channel = self.data.settings['user_input']['MIDI_CHANNEL']['value'] - 1 - if not message_dict.get('channel', None) == midi_channel: - pass - ## turning off noisey clock messages for now - may want to use them at some point - elif message_dict['type'] == 'clock': - pass - ## trying to only let through step cc messages to increase response time - elif message_dict['type'] == 'control_change': - control_number = message_dict['control'] - print('control number is {} , cc_dict.keys is {}'.format(control_number, cc_dict.keys() )) - if not control_number in cc_dict.keys(): - cc_dict[control_number] = message_dict['value'] - self.on_midi_message(message_dict) - else: - step_size = 3 - ignore_range = range(cc_dict[control_number] - step_size,cc_dict[control_number] + step_size) - #print('value is {} and ignore range is {}'.format(message_dict['value'], ignore_range )) - if not message_dict['value'] in ignore_range: - cc_dict[control_number] = message_dict['value'] - #print(message_dict) - self.on_midi_message(message_dict) - #print(cc_dict) + current_message_buffer = [i.dict() for i in self.midi_device.iter_pending()] + + refined_buffer = [] + #refine buffer from lastest messages first + current_message_buffer.reverse() + for message in current_message_buffer: + # discard notes from wrong channel + if message.get('channel') != midi_channel: + pass + # process all note messages (in order) + if 'note' in message['type']: + refined_buffer.append(message) + # only take the latest cc message per cc_channel + elif message['type'] == 'control_change': + if not message['control'] in [i.get('control') for i in refined_buffer]: + refined_buffer.append(message) + # process buffer from oldest messages first + refined_buffer.reverse() + + for message in refined_buffer: + self.on_midi_message(message) - else: - print(message_dict) - self.on_midi_message(message_dict) - if i > 0: - pass #print('the number processed {}'.format(i)) if self.data.settings['user_input']['MIDI_INPUT']['value'] == self.midi_setting and self.data.midi_port_index == self.port_index: self.root.after(self.midi_delay, self.poll_midi_input) @@ -125,7 +117,12 @@ class MidiInput(object): else: norm_message_value = None - self.actions.call_method_name(method_name, norm_message_value) + try: + self.actions.call_method_name(method_name, norm_message_value) + except TypeError: + ## to support using cc-0 as button presses + if norm_message_value == 0: + self.actions.call_method_name(method_name, None) ## only update screen if not continuous - seeing if cc can respond faster if not refreshing screen on every action if 'continuous' not in message_name: self.display.refresh_display() diff --git a/user_input/osc_input.py b/user_input/osc_input.py index 80819af..7846973 100644 --- a/user_input/osc_input.py +++ b/user_input/osc_input.py @@ -36,7 +36,9 @@ class OscInput(object): def setup_osc_server(self): ip_address = self.data.get_ip_for_osc_client() - + if ip_address == 'none': + self.message_handler.set_message('INFO', 'osc failed - could not find ip') + return print('%%%%%%%%%%%%%%%%%%%%% setting up external_osc on ', ip_address) server_parser = argparse.ArgumentParser() server_parser.add_argument("--ip", default=ip_address, help="the ip") @@ -46,25 +48,40 @@ class OscInput(object): this_dispatcher = dispatcher.Dispatcher() - this_dispatcher.map("/keyboard/*", self.on_osc_input) - this_dispatcher.map("/shaderparam0", self.on_param_osc_input) - this_dispatcher.map("/shaderparam1", self.on_param_osc_input) - this_dispatcher.map("/shaderparam2", self.on_param_osc_input) - this_dispatcher.map("/shaderparam3", self.on_param_osc_input) - this_dispatcher.map("/shutdown", self.exit_osc_server) - this_dispatcher.map("/*", self.on_param_osc_input) +# this_dispatcher.map("/keyboard/*", self.on_osc_input) +# this_dispatcher.map("/shaderparam0", self.on_param_osc_input) +# this_dispatcher.map("/shaderparam1", self.on_param_osc_input) +# this_dispatcher.map("/shaderparam2", self.on_param_osc_input) +# this_dispatcher.map("/shaderparam3", self.on_param_osc_input) +# this_dispatcher.map("/shutdown", self.exit_osc_server) + this_dispatcher.map("/*", self.on_osc_input) osc_server.ThreadingOSCUDPServer.allow_reuse_address = True server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher) server_thread = threading.Thread(target=server.serve_forever) server_thread.start() self.osc_server = server + self.message_handler.set_message('INFO', 'osc active on ' + ip_address) def exit_osc_server(self, unused_addr, args): print('%%%%%%%%%%%%%%%%%%%%% exiting external_osc') - self.osc_server.shutdown() + try: + self.osc_server.shutdown() + self.message_handler.set_message('INFO', 'osc deactive') + except: + self.message_handler.set_message('INFO', 'osc shutdown failed') + def on_osc_input(self, addr, args): + if 'keyboard' in addr: + self.on_key_osc_input(addr, args) + elif 'shutdown' in addr: + self.exit_osc_server(addr, args) + else: + self.on_param_osc_input(addr,args) + + + def on_key_osc_input(self, addr, args): args = str(args) print("!!!!!!!!!!!!!!!!" + args) print("the address", addr)