2013-10-07 24 views
1

我想創建一個OSC味精處理程序,使用pyosc,它可以偵聽來自TouchOSC的傳入多音軌消息。我可以創建包含通配符的OSC消息處理程序嗎?

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

最後鏈接到的問題是不同的,因爲他只是向服務器發送錯誤路徑的消息,而您想用單個方法/處理程序處理一系列類似的消息路徑。 – hoijui

回答

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

太棒了!非常感謝。 – user1714819

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等映射到相同的函數。這些使用路徑參數來採取特定的操作來處理這些數據。

0

OSC在方法的地址模式中支持通配符(OSC爲您稱之爲處理程序的代表)。

它們的工作類似於windows或unix命令行文件名通配符,不是就像正則表達式一樣。詳情請參閱OSC消息調度和模式匹配OSC 1.0 specifications

在你的榜樣,你可以定義一個地址模式「/ 1/multitoggle1/*/*」, 這將讓您收到「/ 1/multitoggle1/5/8」和類似的消息。

相關問題