1
0
Fork 0
baconscript/OscCommentMacroListener.py

233 lines
7.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import antlr4
from CommentMacroParser import CommentMacroParser
from CommentMacroListener import CommentMacroListener
from pythonosc import osc_message_builder
from pythonosc import udp_client
from time import sleep
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 num(string):
try:
num = int(string)
return num
except ValueError:
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)
print("Fade Master "+master+" to "+str(level)+"%")
level *= 255 / 100 # percent in Macro, 0>255 in OSC
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)
return 1
def _master_choose(self, expr):
if (expr.number < 0):
print("Master must be greater than 0.")
return -1
master = str(expr.number)
print("Choose Master " + master)
button_press(self.server.osc, "/hog/hardware/choose/" + master)
return 1
def _list_go(self, expr):
print("Go List is a stub")
return -1
def _list_halt(self, expr):
print("Halt List is a stub")
return -1
def _list_release(self, expr):
print("Release List is a stub")
return -1
def _scene_go(self, expr):
print("Go Scene is a stub")
return -1
def _scene_halt(self, expr):
print("Halt Scene is a stub")
return -1
def _scene_release(self, expr):
print("Release Scene is a stub")
return -1
command = {"GM": _master_go,
"HM": _master_halt,
"FM": _master_fade,
"FGM": _master_fade_grand,
"CM": _master_choose,
"GL": _list_go,
"HL": _list_halt,
"RL": _list_release,
"GS": _scene_go,
"HS": _scene_halt,
"RS": _scene_release
}
# https://raw.githubusercontent.com/jszheng/py3antlr4book/master/bin/pygrun
# this is a python version of TestRig
def beautify_lisp_string(in_string):
__author__ = 'jszheng'
indent_size = 2
add_indent = ' ' * indent_size
out_string = in_string[0] # no indent for 1st (
indent = ''
for i in range(1, len(in_string) - 1):
if in_string[i] == '(' and in_string[i + 1] != ' ':
indent += add_indent
out_string += "\n" + indent + '('
elif in_string[i] == ')':
out_string += ')'
if len(indent) > 0:
indent = indent.replace(add_indent, '', 1)
else:
out_string += in_string[i]
return out_string
class OscCommentMacroListener(CommentMacroListener):
def __init__(self, parser, server):
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))
name = ctx.children[0].getText()
try:
command[name](self, ctx)
except KeyError:
print(name + " macro is not compatable with OSC.")
return -1
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)