Skip to content

Commit

Permalink
Merges changes by jofemodo.
Browse files Browse the repository at this point in the history
Adds step duration handling to GUI (not yet playback).
Fixes grid layout / selection alignment.
Default extra patterns now have 16 steps.
  • Loading branch information
riban-bw committed Apr 19, 2020
1 parent 463acd5 commit 2f8e1ef
Show file tree
Hide file tree
Showing 10 changed files with 367 additions and 275 deletions.
24 changes: 22 additions & 2 deletions zynautoconnect/zynthian_autoconnect.py
Expand Up @@ -103,15 +103,22 @@ def midi_autoconnect(force=False):
if len(hw_in)==0:
hw_in=[]

#Add Aubio MIDI input port ...
#Add ZynthStep out port ...
zynthstep_out=jclient.get_ports("zynthstep", is_output=True, is_physical=False, is_midi=True)
try:
hw_out.append(zynthstep_out[0])
except:
pass

#Add Aubio MIDI out port ...
if zynthian_gui_config.midi_aubionotes_enabled:
aubio_out=jclient.get_ports("aubio", is_output=True, is_physical=False, is_midi=True)
try:
hw_out.append(aubio_out[0])
except:
pass

#Add TouchOSC input ports ...
#Add TouchOSC out ports ...
if zynthian_gui_config.midi_touchosc_enabled:
rtmidi_out=jclient.get_ports("RtMidiOut Client", is_output=True, is_physical=False, is_midi=True)
for port in rtmidi_out:
Expand Down Expand Up @@ -338,6 +345,19 @@ def midi_autoconnect(force=False):
except:
pass

# Connect MIDI clock to ZynthStep
if zynthian_gui_config.midi_clock_enabled:
try:
jclient.connect("jack_midi_clock:mclk_out","zynthstep:input")
except:
logger.error("Failed to connect internal MIDI clock to ZynthStep")
else:
try:
# TODO: This should be configured from webconf ...
jclient.connect("a2j:MidiSport 2x2 [20] (capture): MidiSport 2x2 MIDI 1", "zynthstep:input")
except:
logger.error("Failed to connect external MIDI clock to ZynthStep")

#Release Mutex Lock
release_lock()

Expand Down
52 changes: 52 additions & 0 deletions zyngui/zynthian_gui_admin.py
Expand Up @@ -82,6 +82,11 @@ def fill_list(self):
else:
self.list_data.append((self.toggle_midi_sys,0,"[ ] MIDI System Messages"))

if zynconf.is_service_active("jack-midi-clock"):
self.list_data.append((self.stop_midi_clock,0,"[x] MIDI Clock Internal"))
else:
self.list_data.append((self.start_midi_clock,0,"[ ] MIDI Clock Internal"))

if zynconf.is_service_active("jackrtpmidid"):
self.list_data.append((self.stop_rtpmidi,0,"[x] RTP-MIDI"))
else:
Expand Down Expand Up @@ -324,6 +329,53 @@ def toggle_preset_preload_noteon(self):
self.fill_list()


def start_midi_clock(self, save_config=True):
logging.info("STARTING MIDI CLOCK")

try:
check_output("systemctl start jack-midi-clock", shell=True)
zynthian_gui_config.midi_clock_enabled = 1
# Update MIDI profile
if save_config:
zynconf.update_midi_profile({
"ZYNTHIAN_MIDI_CLOCK_ENABLED": str(zynthian_gui_config.midi_clock_enabled)
})
# Call autoconnect after a little time
sleep(0.5)
self.zyngui.zynautoconnect_midi()

except Exception as e:
logging.error(e)

self.fill_list()


def stop_midi_clock(self, save_config=True):
logging.info("STOPPING MIDI CLOCK")

try:
check_output("systemctl stop jack-midi-clock", shell=True)
zynthian_gui_config.midi_clock_enabled = 0
# Update MIDI profile
if save_config:
zynconf.update_midi_profile({
"ZYNTHIAN_MIDI_CLOCK_ENABLED": str(zynthian_gui_config.midi_clock_enabled)
})

except Exception as e:
logging.error(e)

self.fill_list()


#Start/Stop Jack MIDI Clock depending on configuration
def default_midi_clock(self):
if zynthian_gui_config.midi_clock_enabled:
self.start_midi_clock(False)
else:
self.stop_midi_clock(False)


def start_qmidinet(self, save_config=True):
logging.info("STARTING QMIDINET")

Expand Down
93 changes: 41 additions & 52 deletions zyngui/zynthian_gui_audio_recorder.py
Expand Up @@ -173,55 +173,48 @@ def delete_confirmed(self, fpath):


def start_recording(self):
if self.get_status() not in ("REC", "PLAY+REC"):
logging.info("STARTING NEW AUDIO RECORD ...")
try:
cmd=self.sys_dir +"/sbin/jack_capture.sh --zui"
#logging.info("COMMAND: %s" % cmd)
self.rec_proc=Popen(cmd.split(" "), stdout=PIPE, stderr=PIPE)
sleep(0.2)
self.zyngui.zyntransport.play()
except Exception as e:
logging.error("ERROR STARTING AUDIO RECORD: %s" % e)
self.zyngui.show_info("ERROR STARTING AUDIO RECORD:\n %s" % e)
self.zyngui.hide_info_timer(5000)

self.update_list()
return True
logging.info("STARTING NEW AUDIO RECORD ...")
try:
cmd=self.sys_dir +"/sbin/jack_capture.sh --zui"
#logging.info("COMMAND: %s" % cmd)
self.rec_proc=Popen(cmd.split(" "), stdout=PIPE, stderr=PIPE)
sleep(0.2)
self.zyngui.zyntransport.play()
except Exception as e:
logging.error("ERROR STARTING AUDIO RECORD: %s" % e)
self.zyngui.show_info("ERROR STARTING AUDIO RECORD:\n %s" % e)
self.zyngui.hide_info_timer(5000)

else:
return False
self.update_list()


def stop_recording(self):
if self.get_status() in ("REC", "PLAY+REC"):
logging.info("STOPPING AUDIO RECORD ...")
try:
self.zyngui.zyntransport.pause()
self.rec_proc.communicate()
while zynconf.is_process_running("jack_capture"):
sleep(0.2)
self.rec_proc = None
except Exception as e:
logging.error("ERROR STOPPING AUDIO RECORD: %s" % e)
self.zyngui.show_info("ERROR STOPPING AUDIO RECORD:\n %s" % e)
self.zyngui.hide_info_timer(5000)

self.update_list()
return True
logging.info("STOPPING AUDIO RECORD ...")
try:
self.zyngui.zyntransport.pause()
self.rec_proc.communicate()
while zynconf.is_process_running("jack_capture"):
sleep(0.2)
self.rec_proc = None
except Exception as e:
logging.error("ERROR STOPPING AUDIO RECORD: %s" % e)
self.zyngui.show_info("ERROR STOPPING AUDIO RECORD:\n %s" % e)
self.zyngui.hide_info_timer(5000)

else:
return False
self.update_list()


def toggle_recording(self):
logging.info("TOGGLING AUDIO RECORDING ...")
if not self.stop_recording():
if self.get_status() in ("REC", "PLAY+REC"):
self.stop_recording()
else:
self.start_recording()


def start_playing(self, fpath=None):
self.stop_playing()
if self.current_record:
self.stop_playing()

if fpath is None:
fpath = self.get_current_track_fpath()
Expand Down Expand Up @@ -266,7 +259,6 @@ def runInThread(onExit, cmd):
self.zyngui.hide_info_timer(5000)

self.update_list()
return True


def send_mplayer_command(self, cmd):
Expand All @@ -284,25 +276,22 @@ def end_playing(self):


def stop_playing(self):
if self.get_status() in ("PLAY", "PLAY+REC"):
logging.info("STOPPING AUDIO PLAY ...")
try:
self.send_mplayer_command("quit")
while self.play_proc:
sleep(0.1)
except Exception as e:
logging.error("ERROR STOPPING AUDIO PLAY: %s" % e)
self.zyngui.show_info("ERROR STOPPING AUDIO PLAY:\n %s" % e)
self.zyngui.hide_info_timer(5000)
return True

else:
return False
logging.info("STOPPING AUDIO PLAY ...")
try:
self.send_mplayer_command("quit")
while self.play_proc:
sleep(0.1)
except Exception as e:
logging.error("ERROR STOPPING AUDIO PLAY: %s" % e)
self.zyngui.show_info("ERROR STOPPING AUDIO PLAY:\n %s" % e)
self.zyngui.hide_info_timer(5000)


def toggle_playing(self):
logging.info("TOGGLING AUDIO PLAY ...")
if not self.stop_playing():
if self.get_status() in ("PLAY", "PLAY+REC"):
self.stop_playing()
else:
self.start_playing()


Expand Down
7 changes: 4 additions & 3 deletions zyngui/zynthian_gui_config.py
Expand Up @@ -342,9 +342,9 @@

def set_midi_config():
global preset_preload_noteon, midi_single_active_channel
global midi_sys_enabled, midi_network_enabled, midi_rtpmidi_enabled
global midi_touchosc_enabled, midi_aubionotes_enabled
global midi_prog_change_zs3, midi_fine_tuning, midi_filter_rules
global midi_sys_enabled, midi_clock_enabled, midi_aubionotes_enabled
global midi_network_enabled, midi_rtpmidi_enabled, midi_touchosc_enabled
global master_midi_channel, master_midi_change_type
global master_midi_program_change_up, master_midi_program_change_down
global master_midi_program_base, master_midi_bank_change_ccnum
Expand All @@ -353,11 +353,12 @@ def set_midi_config():
global disabled_midi_in_ports, enabled_midi_out_ports, enabled_midi_fb_ports

# MIDI options
midi_sys_enabled=int(os.environ.get('ZYNTHIAN_MIDI_SYS_ENABLED',1))
midi_fine_tuning=int(os.environ.get('ZYNTHIAN_MIDI_FINE_TUNING',440))
midi_single_active_channel=int(os.environ.get('ZYNTHIAN_MIDI_SINGLE_ACTIVE_CHANNEL',0))
midi_prog_change_zs3=int(os.environ.get('ZYNTHIAN_MIDI_PROG_CHANGE_ZS3',1))
preset_preload_noteon=int(os.environ.get('ZYNTHIAN_MIDI_PRESET_PRELOAD_NOTEON',1))
midi_sys_enabled=int(os.environ.get('ZYNTHIAN_MIDI_SYS_ENABLED',1))
midi_clock_enabled=int(os.environ.get('ZYNTHIAN_MIDI_CLOCK_ENABLED',0))
midi_network_enabled=int(os.environ.get('ZYNTHIAN_MIDI_NETWORK_ENABLED',0))
midi_rtpmidi_enabled=int(os.environ.get('ZYNTHIAN_MIDI_RTPMIDI_ENABLED',0))
midi_touchosc_enabled=int(os.environ.get('ZYNTHIAN_MIDI_TOUCHOSC_ENABLED',0))
Expand Down
64 changes: 30 additions & 34 deletions zyngui/zynthian_gui_control.py
Expand Up @@ -86,7 +86,7 @@ def fill_list(self):

self.layers = self.zyngui.screens['layer'].get_fxchain_layers()
# If no FXChain layers, then use the curlayer itself (probably amixer_layer)
if len(self.layers)==0:
if self.layers is None or len(self.layers)==0:
self.layers = [self.zyngui.curlayer]

i = 0
Expand All @@ -110,43 +110,39 @@ def set_controller_screen(self):

#Get screen info
if self.index < len(self.list_data):
screen_info = self.list_data[self.index]
screen_title = screen_info[2]
screen_layer = screen_info[3]
screen_info=self.list_data[self.index]
screen_title=screen_info[2]
screen_layer=screen_info[3]

#Get controllers for the current screen
self.zyngui.curlayer.set_active_screen_index(self.index)
self.zcontrollers = screen_layer.get_ctrl_screen(screen_title)

else:
self.zcontrollers = None


#Setup GUI Controllers
if self.zcontrollers:
logging.debug("SET CONTROLLER SCREEN {}".format(screen_title))
#Configure zgui_controllers
i=0
for ctrl in self.zcontrollers:
try:
#logging.debug("CONTROLLER ARRAY {} => {} ({})".format(i, ctrl.symbol, ctrl.short_name))
self.set_zcontroller(i,ctrl)
i=i+1
except Exception as e:
logging.exception("Controller %s (%d) => %s" % (ctrl.short_name,i,e))
self.zcontrollers=screen_layer.get_ctrl_screen(screen_title)
#Setup GUI Controllers
if self.zcontrollers:
logging.debug("SET CONTROLLER SCREEN {}".format(screen_title))
#Configure zgui_controllers
i=0
for ctrl in self.zcontrollers:
try:
#logging.debug("CONTROLLER ARRAY {} => {} ({})".format(i, ctrl.symbol, ctrl.short_name))
self.set_zcontroller(i,ctrl)
i=i+1
except Exception as e:
logging.exception("Controller %s (%d) => %s" % (ctrl.short_name,i,e))
self.zgui_controllers[i].hide()

#Hide rest of GUI controllers
for i in range(i,len(self.zgui_controllers)):
self.zgui_controllers[i].hide()

#Hide rest of GUI controllers
for i in range(i,len(self.zgui_controllers)):
self.zgui_controllers[i].hide()

#Set/Restore XY controllers highlight
self.set_xyselect_controllers()
#Hide All GUI controllers
else:
for zgui_controller in self.zgui_controllers:
zgui_controller.hide()

#Hide All GUI controllers
else:
for zgui_controller in self.zgui_controllers:
zgui_controller.hide()
#Set/Restore XY controllers highlight
self.set_xyselect_controllers()

#Release Mutex Lock
#self.zyngui.lock.release()
Expand Down Expand Up @@ -391,7 +387,7 @@ def cb_listbox_release(self, event):
return
if self.mode=='select':
super().cb_listbox_release(event)
elif self.listbox_push_ts:
else:
dts=(datetime.now()-self.listbox_push_ts).total_seconds()
#logging.debug("LISTBOX RELEASE => %s" % dts)
if dts<0.3:
Expand All @@ -405,7 +401,7 @@ def cb_listbox_motion(self, event):
return
if self.mode=='select':
super().cb_listbox_motion(event)
elif self.listbox_push_ts:
else:
dts=(datetime.now()-self.listbox_push_ts).total_seconds()
if dts>0.1:
index=self.get_cursel()
Expand Down

0 comments on commit 2f8e1ef

Please sign in to comment.