mirror of
https://github.com/cyberboy666/r_e_c_u_r.git
synced 2025-12-05 16:00:06 +01:00
fixing some bugs found during tests for demo
This commit is contained in:
29
actions.py
29
actions.py
@@ -37,6 +37,7 @@ class Actions(object):
|
|||||||
|
|
||||||
def clear_all_slots(self):
|
def clear_all_slots(self):
|
||||||
self.data.clear_all_slots()
|
self.data.clear_all_slots()
|
||||||
|
self.display.browser_menu.generate_browser_list()
|
||||||
|
|
||||||
def _load_this_slot_into_next_player(self, slot):
|
def _load_this_slot_into_next_player(self, slot):
|
||||||
if self.data.update_next_slot_number(slot):
|
if self.data.update_next_slot_number(slot):
|
||||||
@@ -118,10 +119,13 @@ class Actions(object):
|
|||||||
self.data.function_on = not self.data.function_on
|
self.data.function_on = not self.data.function_on
|
||||||
|
|
||||||
def next_bank(self):
|
def next_bank(self):
|
||||||
|
|
||||||
self.data.update_bank_number_by_amount(1)
|
self.data.update_bank_number_by_amount(1)
|
||||||
|
print('current bank is {} , the number of banks is {} '.format(self.data.bank_number, len(self.data.bank_data)))
|
||||||
|
|
||||||
def previous_bank(self):
|
def previous_bank(self):
|
||||||
self.data.update_bank_number_by_amount(-1)
|
self.data.update_bank_number_by_amount(-1)
|
||||||
|
print('current bank is {} , the number of banks is {} '.format(self.data.bank_number, len(self.data.bank_data)))
|
||||||
|
|
||||||
def increase_speed(self):
|
def increase_speed(self):
|
||||||
new_rate = self.video_driver.current_player.change_rate(0.5)
|
new_rate = self.video_driver.current_player.change_rate(0.5)
|
||||||
@@ -176,12 +180,15 @@ class Actions(object):
|
|||||||
self.capture.start_recording()
|
self.capture.start_recording()
|
||||||
|
|
||||||
def toggle_screen_mirror(self):
|
def toggle_screen_mirror(self):
|
||||||
if self.data.update_screen:
|
if self.data.settings['other']['DEV_MODE_RESET']['value'] == 'off':
|
||||||
self.data.update_screen = False
|
if self.data.update_screen:
|
||||||
subprocess.call(['sudo', 'systemctl', 'start', 'raspi2fb@1'])
|
self.data.update_screen = False
|
||||||
|
subprocess.call(['sudo', 'systemctl', 'start', 'raspi2fb@1'])
|
||||||
|
else:
|
||||||
|
self.data.update_screen = True
|
||||||
|
subprocess.call(['sudo', 'systemctl', 'stop', 'raspi2fb@1'])
|
||||||
else:
|
else:
|
||||||
self.data.update_screen = True
|
self.message_handler.set_message('INFO', 'cant mirror in dev mode')
|
||||||
subprocess.call(['sudo', 'systemctl', 'stop', 'raspi2fb@1'])
|
|
||||||
|
|
||||||
def toggle_player_mode(self):
|
def toggle_player_mode(self):
|
||||||
if self.data.player_mode == 'now':
|
if self.data.player_mode == 'now':
|
||||||
@@ -206,6 +213,9 @@ class Actions(object):
|
|||||||
output_range = max_param - min_param
|
output_range = max_param - min_param
|
||||||
return int(( cc_value / 127 ) * output_range + min_param)
|
return int(( cc_value / 127 ) * output_range + min_param)
|
||||||
|
|
||||||
|
def get_midi_status(self):
|
||||||
|
self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status))
|
||||||
|
|
||||||
def update_video_settings(self, setting_value):
|
def update_video_settings(self, setting_value):
|
||||||
self.video_driver.update_video_settings()
|
self.video_driver.update_video_settings()
|
||||||
|
|
||||||
@@ -226,6 +236,11 @@ class Actions(object):
|
|||||||
self.data.update_setting_value('video', 'OUTPUT', 'composite')
|
self.data.update_setting_value('video', 'OUTPUT', 'composite')
|
||||||
else:
|
else:
|
||||||
self.data.update_setting_value('video', 'OUTPUT', 'hdmi')
|
self.data.update_setting_value('video', 'OUTPUT', 'hdmi')
|
||||||
|
#### this is to work around a bug where 1080 videos on hdmi drop out ...
|
||||||
|
subprocess.call(['tvservice --sdtvon="PAL 4:3"'],shell=True)
|
||||||
|
self._refresh_frame_buffer()
|
||||||
|
subprocess.call(['tvservice', '-p'])
|
||||||
|
self._refresh_frame_buffer()
|
||||||
|
|
||||||
def check_dev_mode(self):
|
def check_dev_mode(self):
|
||||||
#### check if in dev mode:(ie not using the lcd screen)
|
#### check if in dev mode:(ie not using the lcd screen)
|
||||||
@@ -259,11 +274,11 @@ class Actions(object):
|
|||||||
if mode == 'PAL' and progressive == 'p':
|
if mode == 'PAL' and progressive == 'p':
|
||||||
sdtv_mode = '18'
|
sdtv_mode = '18'
|
||||||
elif mode == 'PAL' and progressive == '':
|
elif mode == 'PAL' and progressive == '':
|
||||||
sdtv_mode = '2'
|
sdtv_mode = '02'
|
||||||
elif mode == 'NTSC' and progressive == 'p':
|
elif mode == 'NTSC' and progressive == 'p':
|
||||||
sdtv_mode = '16'
|
sdtv_mode = '16'
|
||||||
elif mode == 'NTSC' and progressive == '':
|
elif mode == 'NTSC' and progressive == '':
|
||||||
sdtv_mode = '0'
|
sdtv_mode = '00'
|
||||||
|
|
||||||
if aspect == '4:3':
|
if aspect == '4:3':
|
||||||
sdtv_aspect = '1'
|
sdtv_aspect = '1'
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class Data(object):
|
|||||||
def __init__(self, message_handler):
|
def __init__(self, message_handler):
|
||||||
self.message_handler = message_handler
|
self.message_handler = message_handler
|
||||||
|
|
||||||
self.EMPTY_BANK = [self.EMPTY_SLOT for i in range(10)]
|
#self.EMPTY_BANK = [self.EMPTY_SLOT for i in range(10)]
|
||||||
self.PATHS_TO_BROWSER = [self.PATH_TO_EXTERNAL_DEVICES, '/home/pi/Videos' ]
|
self.PATHS_TO_BROWSER = [self.PATH_TO_EXTERNAL_DEVICES, '/home/pi/Videos' ]
|
||||||
|
|
||||||
### state data
|
### state data
|
||||||
@@ -37,7 +37,7 @@ class Data(object):
|
|||||||
self.player_mode = 'now'
|
self.player_mode = 'now'
|
||||||
|
|
||||||
### persisted data (use default if doesnt exits):
|
### persisted data (use default if doesnt exits):
|
||||||
self.bank_data = [self.EMPTY_BANK]
|
self.bank_data = [self.create_empty_bank()]
|
||||||
if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.BANK_DATA_JSON):
|
if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.BANK_DATA_JSON):
|
||||||
self.bank_data = self._read_json(self.BANK_DATA_JSON)
|
self.bank_data = self._read_json(self.BANK_DATA_JSON)
|
||||||
|
|
||||||
@@ -52,6 +52,10 @@ class Data(object):
|
|||||||
self.key_mappings = self._read_json(self.KEYPAD_MAPPING_JSON)
|
self.key_mappings = self._read_json(self.KEYPAD_MAPPING_JSON)
|
||||||
self.midi_mappings = self._read_json(self.MIDI_MAPPING_JSON)
|
self.midi_mappings = self._read_json(self.MIDI_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)]
|
||||||
|
|
||||||
def _read_json(self, file_name):
|
def _read_json(self, file_name):
|
||||||
with open(self.PATH_TO_DATA_OBJECTS + file_name) as data_file:
|
with open(self.PATH_TO_DATA_OBJECTS + file_name) as data_file:
|
||||||
@@ -86,14 +90,15 @@ class Data(object):
|
|||||||
self._update_a_slots_data(slot_number, new_slot)
|
self._update_a_slots_data(slot_number, new_slot)
|
||||||
|
|
||||||
def clear_all_slots(self):
|
def clear_all_slots(self):
|
||||||
self.bank_data[self.bank_number] = self.EMPTY_BANK
|
self.bank_data[self.bank_number] = self.create_empty_bank()
|
||||||
self._update_json(self.BANK_DATA_JSON, self.bank_data)
|
self._update_json(self.BANK_DATA_JSON, self.bank_data)
|
||||||
|
|
||||||
def update_bank_number_by_amount(self, amount):
|
def update_bank_number_by_amount(self, amount):
|
||||||
if(self.bank_data[-1] != self.EMPTY_BANK):
|
empty_bank = self.create_empty_bank()
|
||||||
self.bank_data.append(self.EMPTY_BANK)
|
if(self.bank_data[-1] != empty_bank):
|
||||||
|
self.bank_data.append(empty_bank)
|
||||||
elif(len(self.bank_data) > 1):
|
elif(len(self.bank_data) > 1):
|
||||||
if self.bank_data[-2] == self.EMPTY_BANK:
|
if self.bank_data[-2] == empty_bank:
|
||||||
self.bank_data.pop()
|
self.bank_data.pop()
|
||||||
self._update_json(self.BANK_DATA_JSON, self.bank_data)
|
self._update_json(self.BANK_DATA_JSON, self.bank_data)
|
||||||
self.bank_number = (self.bank_number+amount)%(len(self.bank_data))
|
self.bank_number = (self.bank_number+amount)%(len(self.bank_data))
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
class FixedLengthSet(object):
|
|
||||||
|
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
sudo sed -i "s/sdtv_mode=./sdtv_mode=$1/g" /boot/config.txt
|
sudo sed -i "s/sdtv_mode=../sdtv_mode=$1/g" /boot/config.txt
|
||||||
sudo sed -i "s/sdtv_aspect=./sdtv_aspect=$2/g" /boot/config.txt
|
sudo sed -i "s/sdtv_aspect=./sdtv_aspect=$2/g" /boot/config.txt
|
||||||
|
|||||||
@@ -44,16 +44,16 @@
|
|||||||
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
|
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
|
||||||
},
|
},
|
||||||
"m": {
|
"m": {
|
||||||
"DEFAULT": ["load_slot_3_into_next_player","decrease_speed"]
|
"DEFAULT": ["load_slot_3_into_next_player"]
|
||||||
},
|
},
|
||||||
"n": {
|
"n": {
|
||||||
"DEFAULT": ["load_slot_4_into_next_player","increase_speed"]
|
"DEFAULT": ["load_slot_4_into_next_player"]
|
||||||
},
|
},
|
||||||
"o": {
|
"o": {
|
||||||
"DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"]
|
"DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"]
|
||||||
},
|
},
|
||||||
"p": {
|
"p": {
|
||||||
"DEFAULT": ["load_slot_6_into_next_player", "print_speed"]
|
"DEFAULT": ["load_slot_6_into_next_player"]
|
||||||
},
|
},
|
||||||
"q": {
|
"q": {
|
||||||
"DEFAULT": ["load_slot_7_into_next_player"]
|
"DEFAULT": ["load_slot_7_into_next_player"]
|
||||||
|
|||||||
@@ -11,20 +11,23 @@
|
|||||||
"note_on 72": {
|
"note_on 72": {
|
||||||
"NAV_BROWSER": ["move_browser_selection_up"],
|
"NAV_BROWSER": ["move_browser_selection_up"],
|
||||||
"PLAYER": ["seek_back_on_player"],
|
"PLAYER": ["seek_back_on_player"],
|
||||||
"NAV_SETTINGS": ["move_settings_selection_up"]
|
"NAV_SETTINGS": ["move_settings_selection_up"],
|
||||||
|
"LENGTH_SET": ["return_to_default_control_mode"]
|
||||||
},
|
},
|
||||||
"note_on 73": {
|
"note_on 73": {
|
||||||
"NAV_BROWSER": ["move_browser_selection_down"],
|
"NAV_BROWSER": ["move_browser_selection_down"],
|
||||||
"PLAYER": ["seek_forward_on_player"],
|
"PLAYER": ["seek_forward_on_player"],
|
||||||
"NAV_SETTINGS": ["move_settings_selection_down"]
|
"NAV_SETTINGS": ["move_settings_selection_down"],
|
||||||
|
"LENGTH_SET": ["return_to_default_control_mode"]
|
||||||
},
|
},
|
||||||
"note_on 74": {
|
"note_on 74": {
|
||||||
"NAV_BROWSER": ["enter_on_browser_selection"],
|
"NAV_BROWSER": ["enter_on_browser_selection"],
|
||||||
"PLAYER": ["toggle_action_on_player"],
|
"PLAYER": ["toggle_action_on_player","toggle_show_on_player"],
|
||||||
"NAV_SETTINGS": ["enter_on_settings_selection"]
|
"NAV_SETTINGS": ["enter_on_settings_selection"],
|
||||||
|
"LENGTH_SET": ["record_fixed_length"]
|
||||||
},
|
},
|
||||||
"note_on 75": {
|
"note_on 75": {
|
||||||
"DEFAULT": ["switch_to_next_player"]
|
"DEFAULT": ["switch_to_next_player", "toggle_player_mode"]
|
||||||
},
|
},
|
||||||
"note_on 76": {
|
"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"]
|
||||||
@@ -32,7 +35,8 @@
|
|||||||
"note_on 77": {
|
"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"]
|
||||||
},
|
},
|
||||||
"note_on 78": {},
|
"note_on 78": {
|
||||||
|
"DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]},
|
||||||
"note_on 79": {
|
"note_on 79": {
|
||||||
"DEFAULT": ["cycle_display_mode"]
|
"DEFAULT": ["cycle_display_mode"]
|
||||||
},
|
},
|
||||||
@@ -49,13 +53,13 @@
|
|||||||
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
|
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
|
||||||
},
|
},
|
||||||
"note_on 84": {
|
"note_on 84": {
|
||||||
"DEFAULT": ["load_slot_3_into_next_player","decrease_speed"]
|
"DEFAULT": ["load_slot_3_into_next_player"]
|
||||||
},
|
},
|
||||||
"note_on 85": {
|
"note_on 85": {
|
||||||
"DEFAULT": ["load_slot_4_into_next_player","increase_speed"]
|
"DEFAULT": ["load_slot_4_into_next_player"]
|
||||||
},
|
},
|
||||||
"note_on 86": {
|
"note_on 86": {
|
||||||
"DEFAULT": ["load_slot_5_into_next_player","print_speed"]
|
"DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"]
|
||||||
},
|
},
|
||||||
"note_on 87": {
|
"note_on 87": {
|
||||||
"DEFAULT": ["load_slot_6_into_next_player"]
|
"DEFAULT": ["load_slot_6_into_next_player"]
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ class MidiInput(object):
|
|||||||
|
|
||||||
def try_open_port(self):
|
def try_open_port(self):
|
||||||
midi_setting = self.data.settings['midi']['INPUT']['value']
|
midi_setting = self.data.settings['midi']['INPUT']['value']
|
||||||
|
print('try open port : midi setting is {}'.format(midi_setting))
|
||||||
if midi_setting == 'enabled':
|
if midi_setting == 'enabled':
|
||||||
midi_ports = mido.get_input_names()
|
midi_ports = mido.get_input_names()
|
||||||
midi_device_on_port_20 = [s for s in midi_ports if '20:0' in s]
|
midi_device_on_port_20 = [s for s in midi_ports if '20:0' in s]
|
||||||
@@ -57,7 +58,6 @@ class MidiInput(object):
|
|||||||
self.on_midi_message(message_dict)
|
self.on_midi_message(message_dict)
|
||||||
if i > 0:
|
if i > 0:
|
||||||
print('the number processed {}'.format(i))
|
print('the number processed {}'.format(i))
|
||||||
|
|
||||||
self.root.after(self.midi_delay, self.poll_midi_input)
|
self.root.after(self.midi_delay, self.poll_midi_input)
|
||||||
|
|
||||||
def on_midi_message(self, message_dict):
|
def on_midi_message(self, message_dict):
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
import string
|
|
||||||
import datetimimport mido
|
|
||||||
|
|
||||||
class MidiInput(object):
|
|
||||||
def __init__(self, root, message_handler, display, actions, data):
|
|
||||||
self.root = root
|
|
||||||
self.message_handler = message_handler
|
|
||||||
self.display = display
|
|
||||||
self.actions = actions
|
|
||||||
self.data = data
|
|
||||||
self.midi_mappings = data.midi_mappings
|
|
||||||
self.midi_device = None
|
|
||||||
self.midi_delay = 1
|
|
||||||
self.try_open_port()
|
|
||||||
|
|
||||||
def try_open_port(self):
|
|
||||||
midi_setting = self.data.settings['midi']['INPUT']['value']
|
|
||||||
if midi_setting == 'enabled':
|
|
||||||
midi_ports = mido.get_input_names()
|
|
||||||
midi_device_on_port_20 = [s for s in midi_ports if '20:0' in s]
|
|
||||||
if midi_device_on_port_20:
|
|
||||||
if self.data.midi_status == 'disconnected':
|
|
||||||
self.midi_device = mido.open_input(midi_device_on_port_20[0])
|
|
||||||
self.data.midi_status = 'connected'
|
|
||||||
self.message_handler.set_message('INFO', 'connected to midi device {}'.format(self.midi_device.name))
|
|
||||||
self.poll_midi_input()
|
|
||||||
elif self.data.midi_status == 'connected':
|
|
||||||
self.data.midi_status = 'disconnected'
|
|
||||||
self.root.after(1000, self.try_open_port)
|
|
||||||
|
|
||||||
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()
|
|
||||||
## only listening to midi channel 1 for now , will make it seletcable later
|
|
||||||
if not message_dict['channel'] == 0:
|
|
||||||
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']
|
|
||||||
if not control_number in cc_dict.keys():
|
|
||||||
cc_dict[control_number] = message_dict['value']
|
|
||||||
else:
|
|
||||||
step_size = 4
|
|
||||||
ignore_range = range(cc_dict[control_number] - step_size,cc_dict[control_number] + step_size)
|
|
||||||
if not message_dict['value'] in ignore_range:
|
|
||||||
cc_dict[control_number] = message_dict['value']
|
|
||||||
self.on_midi_message(message_dict)
|
|
||||||
print(cc_dict)
|
|
||||||
else:
|
|
||||||
self.on_midi_message(message_dict)
|
|
||||||
if i > 0:
|
|
||||||
print('the number processed {}'.format(i))
|
|
||||||
|
|
||||||
self.root.after(self.midi_delay, self.poll_midi_input)
|
|
||||||
|
|
||||||
|
|
||||||
def on_midi_message(self, message_dict):
|
|
||||||
if message_dict['type'] == 'note_on' and message_dict['velocity'] == 0:
|
|
||||||
message_dict['type'] = 'note_off'
|
|
||||||
mapped_message_name = message_dict['type']
|
|
||||||
mapped_message_value = None
|
|
||||||
if 'note' in message_dict:
|
|
||||||
mapped_message_name = '{} {}'.format(mapped_message_name,message_dict['note'])
|
|
||||||
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:
|
|
||||||
print('{} is not in midi map'.format(mapped_message_name))
|
|
||||||
|
|
||||||
def run_action_for_mapped_message(self, message_name, mapped_message_value):
|
|
||||||
this_mapping = self.midi_mappings[message_name]
|
|
||||||
if self.data.control_mode in this_mapping:
|
|
||||||
mode = self.data.control_mode
|
|
||||||
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
|
|
||||||
else:
|
|
||||||
method_name = this_mapping[mode][0]
|
|
||||||
|
|
||||||
print('the action being called is {}'.format(method_name))
|
|
||||||
self.call_method_name(method_name, mapped_message_value)
|
|
||||||
self.display.refresh_display()
|
|
||||||
|
|
||||||
def call_method_name(self, method_name, argument=None):
|
|
||||||
if argument is not None:
|
|
||||||
# try:
|
|
||||||
getattr(self.actions, method_name)(argument)
|
|
||||||
#except TypeError as e:
|
|
||||||
# print(e)
|
|
||||||
# self.message_handler.set_message('INFO', 'bad midi cc mapping')
|
|
||||||
else:
|
|
||||||
getattr(self.actions, method_name)()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user