我正在尝试使用pyosc创建一个OSC msg处理程序,它可以侦听来自TouchOSC的传入多重切换消息。
multitoggle是一个切换开关的网格。传入消息的格式为“/ 1 / multitoggle1 / 5/8”或“/ 1 / multitoggle1 / x / y”,其中x和y是与网格位置对应的整数。
server.addMsgHandler(“/ 1 / multitoggle1 / 5/8”,toggle_callback)工作正常,但我需要在处理程序中读取5和8作为参数,这样我就可以得到它们,而无需添加单独的处理程序为每个人切换。
s.addMsgHandler(“/ 1 / multitoggle1 /”,toggle_callback)似乎不起作用。
这与this one类似,但我无法实现隐含的解决方案。
答案 0 :(得分:1)
我遇到了同样的问题,这是我的解决方案:
for x in range(1,9):
for y in range(1,6):
s.addMsgHandler("/Channels/toggleChannels/"+`y`+"/"+`x`, toggleChannels)
def toggleChannels(addr,tags,data,source):
split = addr.split("/")
x = split.pop()
y = split.pop()
我注册了所有处理程序,但只使用了一个回调,效果很好
答案 1 :(得分:0)
或者更好的是,提取东西并防止硬编码:
# this is put into a config file for easy mod'ing
OSCPATH = {
# Incoming OSC from the tracking subsys
'ping': "/ping",
'start': "/pf/started",
'entry': "/pf/entry",
'exit': "/pf/exit",
'update': "/pf/update",
'frame': "/pf/frame",
'stop': "/pf/stopped",
'set': "/pf/set/",
'minx': "/pf/set/minx",
'maxx': "/pf/set/maxx",
'miny': "/pf/set/miny",
'maxy': "/pf/set/maxy",
'npeople': "/pf/set/npeople",
# Outgoing OSC updates from the conductor
'attribute': "/conducter/attribute",
'rollcall': "/conducter/rollcall",
'event': "/conducter/event",
'conx': "/conducter/conx",
}
class OSCHandler(object):
"""Set up OSC server and other handlers."""
def __init__(self, field):
self.m_server = OSCServer( (OSCHOST, OSCPORT) )
self.EVENTFUNC = {
'ping': self.event_tracking_ping,
'start': self.event_tracking_start,
'stop': self.event_tracking_stop,
'entry': self.event_tracking_entry,
'exit': self.event_tracking_exit,
'update': self.event_tracking_update,
'frame': self.event_tracking_frame,
'minx': self.event_tracking_set,
'miny': self.event_tracking_set,
'maxx': self.event_tracking_set,
'maxy': self.event_tracking_set,
'npeople': self.event_tracking_set,
}
for i in self.EVENTFUNC:
self.m_server.addMsgHandler(OSCPATH[i], self.EVENTFUNC[i])
你会看到几个路径,包括minx,miny等,映射到同一个函数。它们使用路径参数来采取特定操作来处理这些数据。
答案 2 :(得分:0)
OSC确实在方法的地址模式中支持通配符(OSC代表您所谓的处理程序)。
它们的工作方式类似于windows或unix命令行文件名通配符,不是,就像正则表达式一样。有关详细信息,请查看OSC 1.0 specifications中的 OSC消息调度和模式匹配。
在您的示例中,您可以定义地址模式" / 1 / multitoggle1 / * / *" , 这将允许您接收" / 1 / multitoggle1 / 5/8" 和类似的消息。