From c8bfcd22e800915d2e8a0b904e7c0aa4b94e7a1f Mon Sep 17 00:00:00 2001 From: Kevin Matz Date: Sat, 20 Oct 2018 18:01:29 -0400 Subject: [PATCH] implement MASTER related macros --- OscCommentMacroListener.py | 158 +++++++++++++++++++++++++++---------- 1 file changed, 116 insertions(+), 42 deletions(-) diff --git a/OscCommentMacroListener.py b/OscCommentMacroListener.py index 41f9a12..512aaa5 100644 --- a/OscCommentMacroListener.py +++ b/OscCommentMacroListener.py @@ -9,45 +9,94 @@ from pythonosc import udp_client from time import sleep -def button_delay(time=0.05): - sleep(time) +def button_press(server, path, delay=0.05): + server.send_message(path, 1) # button down + sleep(delay) + server.send_message(path, 0) # button up -def _master_go(self, expr): - if (expr.master().getText() == "*"): - print("Main GO") - self.server.osc.send_message("/hog/hardware/maingo", 1) # button down - button_delay() - self.server.osc.send_message("/hog/hardware/maingo", 0) # button up - return 1 - - print("GO Master is a stub") - return -1 - - -def _master_halt(self, expr): - print("Halt Master is a stub") - return -1 - - - - -def _master_fade(self, expr): - print("Fade Master is a stub") - return -1 - - -def _master_fade_grand(self, expr): +def num(string): try: - level = float(expr.number().getText()) + num = int(string) + return num except ValueError: - print("Expected a number...") - return -1 + num = float(string) + return num + +def _master_go(self, ctx): + if ctx.number is not None: + print("GO MASTER doesn't support goto. " + + "Cue number " + str(ctx.number) + " will be ignored.") + + if (len(ctx.master.targets) == 0): + print("Main GO") + button_press(self.server.osc, "/hog/hardware/maingo") + return 1 + else: + for i in ctx.master.targets: + if isinstance(i, int) is not True: + print("GO MASTER macro targets must be intigers. " + + str(i) + " is not an intigers.") + continue + if (i < 0): + print("Master " + str(i) + " should have been greater than 0.") + continue + master = str(i) + print("GO on master " + master) + button_press(self.server.osc, "/hog/hardware/go/" + master) + return 1 + + +def _master_halt(self, ctx): + if (len(ctx.master.targets) == 0): + print("Main HALT") + button_press(self.server.osc, "/hog/hardware/mainhalt") + return 1 + else: + for i in ctx.master.targets: + if isinstance(i, int) is not True: + print("GO MASTER macro targets must be intigers. " + + str(i) + " is not an intigers.") + continue + if (i < 0): + print("Master " + str(i) + " should have been greater than 0.") + continue + master = str(i) + print("HALT on master " + master) + button_press(self.server.osc, "/hog/hardware/pause/" + master) + return 1 + + +def _master_fade(self, ctx): + level = ctx.number if (level < 0 or level > 100): print("Level must be between 0 and 100.") return -1 + if (len(ctx.master.targets) == 0): + print("MASTER FADE doesn't support unspecified current master.") + return -1 + else: + for i in ctx.master.targets: + if isinstance(i, int) is not True: + print("FADE MASTER macro targets must be intigers. " + + str(i) + " is not an intigers.") + continue + if (i < 0): + print("Master " + str(i) + " should have been greater than 0.") + continue + master = str(i) + level *= 255 / 100 # percent in Macro, 0>255 in OSC + print("FADE MASTER on master " + master) + self.server.osc.send_message("/hog/hardware/fader/"+master, level) + return 1 + +def _master_fade_grand(self, ctx): + level = ctx.number + if (level < 0 or level > 100): + print("Level must be between 0 and 100.") + return -1 print("Fading Grand Master to " + str(level) + "%") level *= 255 / 100 # percent in Macro, 0>255 in OSC self.server.osc.send_message("/hog/hardware/fader/0", level) @@ -55,20 +104,12 @@ def _master_fade_grand(self, expr): def _master_choose(self, expr): - try: - master = int(expr.number().getText()) - except ValueError: - print("Expected a number...") - return -1 - - if (master < 0): + if (expr.number < 0): print("Master must be greater than 0.") return -1 - - print("Choose Master " + str(master)) - self.server.osc.send_message("/hog/hardware/choose/" + str(master), 1) # down - button_delay() - self.server.osc.send_message("/hog/hardware/choose/" + str(master), 0) # up + master = str(expr.number) + print("Choose Master " + master) + button_press(self.server.osc, "/hog/hardware/choose/" + master) return 1 @@ -143,6 +184,12 @@ class OscCommentMacroListener(CommentMacroListener): self.parser = parser self.server = server + def enterMacro(self, ctx: CommentMacroParser.MacroContext): + ctx.targets = [] + ctx.number = None + ctx.device = None + ctx.time = None + def exitMacro(self, ctx: CommentMacroParser.MacroContext): lisp_tree_str = ctx.toStringTree(recog=self.parser) print(beautify_lisp_string(lisp_tree_str)) @@ -156,3 +203,30 @@ class OscCommentMacroListener(CommentMacroListener): print("Exiting Macro") return 1 + + def enterMaster(self, ctx: CommentMacroParser.MasterContext): + ctx.targets = [] + + def exitMaster(self, ctx: CommentMacroParser.MasterContext): + if isinstance(ctx.parentCtx, CommentMacroParser.MacroContext): + ctx.parentCtx.master = ctx + + def exitNumber(self, ctx: CommentMacroParser.NumberContext): + number = num(ctx.getText()) + if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext): + ctx.parentCtx.targets.append(number) + if isinstance(ctx.parentCtx, CommentMacroParser.MacroContext): + ctx.parentCtx.number = number + + def exitSpan(self, ctx: CommentMacroParser.SpanContext): + number1 = num(ctx.children[0].getText()) + number2 = num(ctx.children[2].getText()) + if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext): + for i in (range(min(number1, number2), max(number1, number2) + 1)): + ctx.parentCtx.targets.append(i) + + def enterTarget(self, ctx: CommentMacroParser.TargetContext): + ctx.targets = [] + + def exitTarget(self, ctx: CommentMacroParser.TargetContext): + ctx.parentCtx.targets.extend(ctx.targets)