fixed osc bugs, midi lag bugs, midi cc buttons

This commit is contained in:
langolierz
2020-03-12 13:11:06 +00:00
parent 981cc412e0
commit 096befc468
4 changed files with 74 additions and 57 deletions

View File

@@ -200,14 +200,14 @@ class Actions(object):
def increase_seek_time(self): def increase_seek_time(self):
options = self.data.settings['sampler']['SEEK_TIME']['options'] 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] 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') 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): def decrease_seek_time(self):
options = self.data.settings['sampler']['SEEK_TIME']['options'] 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] 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') 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: if self.data.settings['shader']['STROBE_AMOUNT']['value'] != scaled_amount:
print(scaled_amount) print(scaled_amount)
self.video_driver.osc_client.send_message("/set_strobe", 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): def get_midi_status(self):
self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status)) 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): def increase_shader_param(self):
options = self.data.settings['shader']['SHADER_PARAM']['options'] 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] 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'])) self.message_handler.set_message('INFO', 'The Param amountis now ' + str(self.data.settings['shader']['SHADER_PARAM']['value']))
def decrease_shader_param(self): def decrease_shader_param(self):
options = self.data.settings['shader']['SHADER_PARAM']['options'] 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] 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'])) 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() self.server.shutdown()
def create_client_and_shutdown_osc_server(self): def create_client_and_shutdown_osc_server(self):
from pythonosc import udp_client try:
client_parser = argparse.ArgumentParser() from pythonosc import udp_client
client_parser.add_argument("--ip", default=self.data.get_ip_for_osc_client(), help="the ip") client_parser = argparse.ArgumentParser()
client_parser.add_argument("--port", type=int, default=8080, help="the port") 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 = udp_client.SimpleUDPClient(client_args.ip, client_args.port)
client.send_message("/shutdown", True) client.send_message("/shutdown", True)
except:
pass
def toggle_access_point(self, setting_value): def toggle_access_point(self, setting_value):
osc_setting_state = self.data.settings['user_input']['OSC_INPUT']['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) 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 ): 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): def toggle_remote_server(self, setting_value):
osc_setting_state = self.data.settings['user_input']['OSC_INPUT']['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) 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): 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']) self.remote_process = subprocess.Popen(['node', '/home/pi/r_e_m_o_t_e/webserver.js'])
else: else:
self.stop_remote_process() 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): 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): def show_ip(self, *args):

View File

@@ -51,38 +51,30 @@ class MidiInput(object):
def poll_midi_input(self): def poll_midi_input(self):
i = 0 i = 0
cc_dict = dict() cc_dict = dict()
for message in self.midi_device.iter_pending(): midi_channel = self.data.settings['user_input']['MIDI_CHANNEL']['value'] - 1
i = i + 1
message_dict = message.dict()
midi_channel = midi_setting = self.data.settings['user_input']['MIDI_CHANNEL']['value'] - 1
if not message_dict.get('channel', None) == midi_channel: current_message_buffer = [i.dict() for i in self.midi_device.iter_pending()]
pass
## turning off noisey clock messages for now - may want to use them at some point refined_buffer = []
elif message_dict['type'] == 'clock': #refine buffer from lastest messages first
pass current_message_buffer.reverse()
## trying to only let through step cc messages to increase response time for message in current_message_buffer:
elif message_dict['type'] == 'control_change': # discard notes from wrong channel
control_number = message_dict['control'] if message.get('channel') != midi_channel:
print('control number is {} , cc_dict.keys is {}'.format(control_number, cc_dict.keys() )) pass
if not control_number in cc_dict.keys(): # process all note messages (in order)
cc_dict[control_number] = message_dict['value'] if 'note' in message['type']:
self.on_midi_message(message_dict) refined_buffer.append(message)
else: # only take the latest cc message per cc_channel
step_size = 3 elif message['type'] == 'control_change':
ignore_range = range(cc_dict[control_number] - step_size,cc_dict[control_number] + step_size) if not message['control'] in [i.get('control') for i in refined_buffer]:
#print('value is {} and ignore range is {}'.format(message_dict['value'], ignore_range )) refined_buffer.append(message)
if not message_dict['value'] in ignore_range: # process buffer from oldest messages first
cc_dict[control_number] = message_dict['value'] refined_buffer.reverse()
#print(message_dict)
self.on_midi_message(message_dict) for message in refined_buffer:
#print(cc_dict) 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)) #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: 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) self.root.after(self.midi_delay, self.poll_midi_input)
@@ -125,7 +117,12 @@ class MidiInput(object):
else: else:
norm_message_value = None 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 ## 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: if 'continuous' not in message_name:
self.display.refresh_display() self.display.refresh_display()

View File

@@ -36,7 +36,9 @@ class OscInput(object):
def setup_osc_server(self): def setup_osc_server(self):
ip_address = self.data.get_ip_for_osc_client() 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) print('%%%%%%%%%%%%%%%%%%%%% setting up external_osc on ', ip_address)
server_parser = argparse.ArgumentParser() server_parser = argparse.ArgumentParser()
server_parser.add_argument("--ip", default=ip_address, help="the ip") server_parser.add_argument("--ip", default=ip_address, help="the ip")
@@ -46,25 +48,40 @@ class OscInput(object):
this_dispatcher = dispatcher.Dispatcher() this_dispatcher = dispatcher.Dispatcher()
this_dispatcher.map("/keyboard/*", self.on_osc_input) # this_dispatcher.map("/keyboard/*", self.on_osc_input)
this_dispatcher.map("/shaderparam0", self.on_param_osc_input) # this_dispatcher.map("/shaderparam0", self.on_param_osc_input)
this_dispatcher.map("/shaderparam1", 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("/shaderparam2", self.on_param_osc_input)
this_dispatcher.map("/shaderparam3", 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("/shutdown", self.exit_osc_server)
this_dispatcher.map("/*", self.on_param_osc_input) this_dispatcher.map("/*", self.on_osc_input)
osc_server.ThreadingOSCUDPServer.allow_reuse_address = True osc_server.ThreadingOSCUDPServer.allow_reuse_address = True
server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher) server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher)
server_thread = threading.Thread(target=server.serve_forever) server_thread = threading.Thread(target=server.serve_forever)
server_thread.start() server_thread.start()
self.osc_server = server self.osc_server = server
self.message_handler.set_message('INFO', 'osc active on ' + ip_address)
def exit_osc_server(self, unused_addr, args): def exit_osc_server(self, unused_addr, args):
print('%%%%%%%%%%%%%%%%%%%%% exiting external_osc') 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): 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) args = str(args)
print("!!!!!!!!!!!!!!!!" + args) print("!!!!!!!!!!!!!!!!" + args)
print("the address", addr) print("the address", addr)