voicemeeter-api-python/examples/dsl/__main__.py
2022-06-27 18:44:21 +01:00

99 lines
2.7 KiB
Python

import time
import voicemeeterlib
from pyparsing import (
Combine,
Group,
OneOrMore,
Optional,
Suppress,
Word,
alphanums,
alphas,
nums,
)
class Parser:
def __init__(self, vm):
self.vm = vm
self.kls = Group(OneOrMore(Word(alphanums)))
self.token = Suppress("->")
self.param = Word(alphanums)
self.value = Combine(
Optional("-") + Word(nums) + Optional(".") + Optional(Word(nums))
) | Group(OneOrMore(Word(alphanums)))
self.event = (
self.kls
+ self.token
+ self.param
+ Optional(self.token)
+ Optional(self.value)
)
def parse(self, cmds):
res = list()
for cmd in cmds:
if len(self.event.parseString(cmd)) == 2:
kls, param = self.event.parseString(cmd)
target = getattr(self.vm, kls[0])[int(kls[-1])]
res.append(getattr(target, param))
elif len(self.event.parseString(cmd)) == 3:
kls, param, val = self.event.parseString(cmd)
target = getattr(self.vm, kls[0])[int(kls[-1])]
if "".join(val) in ["off", "on"]:
setattr(target, param, bool(["off", "on"].index("".join(val))))
elif param in ["gain", "comp", "gate", "limit", "audibility"]:
setattr(target, param, float("".join(val)))
elif param in ["label"]:
setattr(target, param, " ".join(val))
time.sleep(0.05)
return res
def main(cmds=None):
kind_id = "banana"
with voicemeeterlib.api(kind_id) as vm:
parser = Parser(vm)
if cmds:
res = parser.parse(cmds)
if res:
print(res)
else:
while cmd := input("Please enter command (Press <Enter> to exit)\n"):
if not cmd:
break
res = parser.parse((cmd,))
if res:
print(res)
if __name__ == "__main__":
cmds = (
"strip 0 -> mute -> on",
"strip 0 -> mute",
"bus 0 -> mute -> on",
"strip 0 -> mute -> off",
"bus 0 -> mute -> on",
"strip 3 -> solo -> on",
"strip 3 -> solo -> off",
"strip 1 -> A1 -> on",
"strip 1 -> A1",
"strip 1 -> A1 -> off",
"strip 1 -> A1",
"bus 3 -> eq -> on",
"bus 3 -> eq -> off",
"strip 4 -> gain -> 1.2",
"strip 0 -> gain -> -8.2",
"strip 0 -> gain",
"strip 1 -> label -> rode podmic",
"strip 2 -> limit -> -28",
"strip 2 -> limit",
)
# pass cmds to parse cmds, otherwise simply run main() to test stdin parsing
main(cmds)