我正在尝试使用Supercollider中的变量(1-13)将多个OSC消息发送到neuroPy。仅使用一个变量即可正常工作。如何利用更多变量。

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有关。

最佳答案

您不需要发送多条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类的文档,以查看有关如何构造消息的更多示例。

关于python - 使用Neurosky的mindwave和NeuroPy模块将OSC发送到SuperCollider的python脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38850287/

10-12 22:42