From 6996bef70705c466465d42ebc6e1cb5d5fd50501 Mon Sep 17 00:00:00 2001 From: Tristan Rowley Date: Tue, 14 Jan 2020 23:56:07 +0000 Subject: [PATCH] missed necessary file for midi input detection! also fix midi feedback not working if the shader plugins are not installed --- plugins/MidiFeedbackAPCKey25Plugin.py | 8 +++-- user_input/midi_input.py | 42 +++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/plugins/MidiFeedbackAPCKey25Plugin.py b/plugins/MidiFeedbackAPCKey25Plugin.py index cf22f0f..da6f29e 100644 --- a/plugins/MidiFeedbackAPCKey25Plugin.py +++ b/plugins/MidiFeedbackAPCKey25Plugin.py @@ -66,9 +66,11 @@ class MidiFeedbackAPCKey25Plugin(MidiFeedbackPlugin): self.set_status(note=i, velocity=self.COLOUR_OFF) def feedback_plugin_status(self): - from data_centre.plugin_collection import SequencePlugin + from data_centre.plugin_collection import SequencePlugin - from plugins.MidiActionsTestPlugin import MidiActionsTestPlugin + from plugins.MidiActionsTestPlugin import MidiActionsTestPlugin + + try: from plugins.ShaderLoopRecordPlugin import ShaderLoopRecordPlugin for plugin in self.pc.get_plugins(SequencePlugin): if isinstance(plugin, ShaderLoopRecordPlugin): #MidiActionsTestPlugin): @@ -130,6 +132,8 @@ class MidiFeedbackAPCKey25Plugin(MidiFeedbackPlugin): colour = self.COLOUR_RED colour += self.BLINK self.set_status(command='note_on', note=pad, velocity=colour) + except: + print ("failed running extra plugin feedback") BLINK = 1 COLOUR_OFF = 0 diff --git a/user_input/midi_input.py b/user_input/midi_input.py index 9217c76..3afa771 100644 --- a/user_input/midi_input.py +++ b/user_input/midi_input.py @@ -12,6 +12,7 @@ class MidiInput(object): self.data = data self.midi_mappings = data.midi_mappings self.midi_device = None + self.midi_feedback_device = None self.midi_setting = None self.port_index = 0 self.midi_delay = 40 @@ -41,7 +42,13 @@ class MidiInput(object): subport_index = self.port_index % len(midi_device_on_port) self.midi_device = mido.open_input(midi_device_on_port[subport_index]) self.data.midi_status = 'connected' + self.data.midi_device_name = self.midi_device.name self.message_handler.set_message('INFO', 'connected to midi device {}'.format(self.midi_device.name)) + self.midi_mappings = self.data.load_midi_mapping_for_device(self.midi_device.name.split(":")[0]) + self.midi_output = self.find_output_plugin(midi_device_on_port[subport_index]) + if self.midi_output: + #self.midi_feedback_device = mido.open_output(midi_device_on_port[subport_index]) + self.root.after(self.midi_delay, self.refresh_midi_feedback) self.poll_midi_input() elif self.data.midi_status == 'connected': self.data.midi_status = 'disconnected' @@ -98,7 +105,7 @@ class MidiInput(object): if 'control' in message_dict: mapped_message_name = '{} {}'.format(mapped_message_name,message_dict['control']) mapped_message_value = message_dict['value'] - + if mapped_message_name in self.midi_mappings.keys(): self.run_action_for_mapped_message(mapped_message_name, mapped_message_value) else: @@ -106,14 +113,19 @@ class MidiInput(object): def run_action_for_mapped_message(self, message_name, mapped_message_value): this_mapping = self.midi_mappings[message_name] + #if self.data.function_on and "FN_%s"%self.data.control_mode in this_mapping: + # mode = "FN_%s"%self.data.control_mode + #el if self.data.control_mode in this_mapping: mode = self.data.control_mode + #elif self.data.function_on and "FN_DEFAULT" in this_mapping: + # mode = "FN_DEFAULT" elif 'DEFAULT' in this_mapping: mode = 'DEFAULT' if self.data.function_on and len(this_mapping[mode]) > 1: method_name = this_mapping[mode][1] - self.data.function_on = False + #self.data.function_on = False else: method_name = this_mapping[mode][0] @@ -127,4 +139,30 @@ class MidiInput(object): ## 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() + #self.refresh_midi_feedback() + + # Plugins to support MIDI feedback + + def find_output_plugin(self, midi_device): + # loop over the plugins + # find one that self.supports_midi_feedback(self.midi_device.name): + # open the midi device self.midi_feedback_device = mido.open_output(midi_device_on_port[subport_index]) + print ("Looking for a MIDI Feedback plugin that supports %s..." % midi_device) + from data_centre.plugin_collection import MidiFeedbackPlugin + + for p in self.data.plugins.get_plugins(MidiFeedbackPlugin): + if p.supports_midi_feedback(midi_device): + print ("Found one! Opening device") + p.set_midi_device(mido.open_output(midi_device)) + return p + + print ("Didn't find one!") + + def refresh_midi_feedback(self): + + self.midi_output.refresh_midi_feedback() + + if self.midi_output and self.data.settings['user_input']['MIDI_INPUT']['value'] == self.midi_setting and self.data.midi_port_index == self.port_index: + if self.midi_output.supports_midi_feedback(self.data.midi_device_name): + self.root.after(self.midi_delay*5, self.refresh_midi_feedback)