我正在尝试通过OSC将Python与Supercollider连接起来,但无法正常工作。
我正在使用Python3和库osc4py3。
最初的想法是逐字发送文本,但尝试后我发现连接不起作用。
这是SC代码:
(
OSCdef.new(\texto,{
|msg, time, addr, port|
[msg, time, addr,port].postIn;
},
'/texto/supercollider',
n
)
)
OSCFunc.trace(true);
o = OSCFunc(\texto);
这是Python代码:
osc_startup()
osc_udp_client("127.0.0.1", 57120, "supercollider")
## here goes a function called leerpalabras to separate words in rows.
with open("partitura.txt", "r") as f:
for palabra in leerpalabras(f):
msg = oscbuildparse.OSCMessage("/texto/supercollider", ",s", palabra)
osc_send(msg, "supercollider")
sleep(2)
osc_terminate()
我也对此进行了尝试,以查看我的for
循环是否有问题(启动,然后终止,当然):
msg = oscbuildparse.OSCMessage("/texto/supercollider", ",s", "holis")
osc_send(msg, "supercollider")
我在SC上运行trace方法,在终端上运行Python脚本时,发布窗口上没有显示任何内容,但是在两者中都没有出现错误,因此我对可以测试的内容有些迷惑肯定会到达某个地方。
它不会显示在SC帖子窗口中,只会显示OSCdef(texto, /texto/supercollider, nil, nil, nil)
。
答案 0 :(得分:0)
当我运行您的示例的SuperCollider片段,然后运行:
n = NetAddr("127.0.0.1", 57120);
n.sendMsg('/texto/supercollider', 1, 2, 3);
...我看到消息立即打印出来(请注意,如果您不解决问题,则将得到错误而不是打印的消息,而使用postIn
而不是postln
。
像您一样,通过Python库发送消息时我什么也没看到-我怀疑Python方面有问题吗? this response中有一个提示,您必须在发送后致电osc_process()
,但这对我仍然无效
您可以尝试三件事:
在SuperCollider中运行OSCFunc.trace
并查看消息(这将打印所有传入的OSC消息),以查看您的OSCdef
是否以某种方式未接收到消息。
尝试使用诸如Packet Peeper(http://packetpeeper.org/)之类的网络分析器来监视本地环回网络lo0
上的网络流量。当我这样做时,我可以清楚地看到SuperCollider发送的消息,但是即使我循环发送并调用osc_process()
,也看不到我从Python发送的任何消息。
如果找不到Python发送OSC数据包的迹象,请尝试使用其他Python库-还有很多其他可用的库。
答案 1 :(得分:0)
(我是 osc4py3 作者)
osc4py3 存储要在内部列表中发送的消息并立即返回。这些列表在 osc_process()
调用期间或由后台线程直接处理(根据选定的标题模型)。
因此,如果您选择了 as_eventloop
线程模型,则需要多次调用 osc_process()
,例如:
…
with open("partitura.txt", "r") as f:
for palabra in leerpalabras(f):
msg = oscbuildparse.OSCMessage("/texto/supercollider", ",s", palabra)
osc_send(msg, "supercollider")
for missme in range(4):
osc_process()
sleep(0.5)
…
参见文档:https://osc4py3.readthedocs.io/en/latest/userdoc.html#threading-model