2016-08-09 19 views
1

我试图使用来自neuroPy的变量(1-13)将多个OSC消息发送到Supercollider。它只适用于一个变量。我怎样才能利用更多的变量。使用Neuroskys mindwave和NeuroPy模块将OSC发送给SuperCollider的python脚本

from NeuroPy import NeuroPy 
import time 
import OSC 

port = 57120 
sc = OSC.OSCClient() 
sc.connect(('192.168.1.4', port)) #send locally to laptop 
object1 = NeuroPy("/dev/rfcomm0") 
zero = 0 
variable1 = object1.attention 
variable2 = object1.meditation 
variable3 = object1.rawValue 
variable4 = object1.delta 
variable5 = object1.theta 
variable6 = object1.lowAlpha 
variable7 = object1.highAlpha 
variable8 = object1.lowBeta 
variable9 = object1.highBeta 
variable10 = object1.lowGamma 
variable11 = object1.midGamma 
variable12 = object1.poorSignal 
variable13 = object1.blinkStrength 


time.sleep(5) 

object1.start() 

def sendOSC(name, val): 
    msg = OSC.OSCMessage() 
    msg.setAddress(name) 
    msg.append(val) 
    try: 
     sc.send(msg) 
    except: 
     pass 
    print msg #debug 



while True: 
    val = variable1 
    if val!=zero: 
     time.sleep(2) 
     sendOSC("/att", val) 

这工作正常,我得到了预期的Supercollider中的消息。

如何添加更多变量并获得更多消息?

我想它应该是setCallBack。

回答

2

您不需要发送多个OSC消息,就可以发送一个包含所有值的OSC消息。实际上,这将是一个更好的方法,因为所有更新的值将同步到达,并且将需要更少的网络流量。

你的代码目前做的

msg = OSC.OSCMessage() 
msg.setAddress("/att") 
msg.append(object1.attention) 
sc.send(msg) 

相当于是罚款,一个值。对于多个值,你可以做的是几乎相同的情况如下:

msg = OSC.OSCMessage() 
msg.setAddress("/neurovals") 
msg.append(object1.attention) 
msg.append(object1.meditation) 
msg.append(object1.rawValue) 
msg.append(object1.delta) 
# ... 
sc.send(msg) 

应该没事,你会得到与多个数据的OSC消息,你也可以写在上面

msg = OSC.OSCMessage() 
msg.setAddress("/neurovals") 
msg.extend([object1.attention, object1.meditation, object1.rawValue, object1.delta]) # plus more vals... 
sc.send(msg) 

查看OSCMessage类的文档以查看更多关于如何构造消息的示例。

相关问题