首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过OSC实现与Python和Supercollider的通信

通过OSC实现与Python和Supercollider的通信
EN

Stack Overflow用户
提问于 2019-05-13 03:16:56
回答 2查看 450关注 0票数 0

我试图通过OSC连接Python和超级对撞机,但它不工作。

我使用的是Python3和库osc4py3。

最初的想法是逐字发送文本,但在尝试后,我意识到连接不起作用。

下面是SC代码:

代码语言:javascript
复制
(
OSCdef.new(\texto,{
    |msg, time, addr, port|
    [msg, time, addr,port].postIn;
},
'/texto/supercollider',
n
)
)

OSCFunc.trace(true);

o = OSCFunc(\texto);

下面是Python代码:

代码语言:javascript
复制
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循环是否有问题(启动时,当然还有终止时):

代码语言:javascript
复制
msg = oscbuildparse.OSCMessage("/texto/supercollider", ",s", "holis")
osc_send(msg, "supercollider")

我在SC上运行trace方法,当我在终端上运行Python脚本时,post窗口上什么也没有出现,但它们中的任何一个都没有出现错误,所以我有点迷茫,不知道我可以测试什么来确保取得进展。

它不会打印在SC post窗口上,它只会显示OSCdef(texto, /texto/supercollider, nil, nil, nil)

EN

回答 2

Stack Overflow用户

发布于 2019-05-14 14:13:42

当我运行您示例中的SuperCollider片段,然后运行:

代码语言:javascript
复制
n = NetAddr("127.0.0.1", 57120);
n.sendMsg('/texto/supercollider', 1, 2, 3);

..。我立即看到了打印的消息(请注意,您使用的是postIn而不是postln,如果不解决这个问题,您将得到一个错误而不是打印的消息)。

像您一样,当我通过Python库发送时,我看不到任何东西-我怀疑Python端有什么问题?在this response中有一个提示,您必须在发送之后调用osc_process(),但这仍然不适用于我

您可以尝试以下三种方法:

  1. 在SuperCollider中运行OSCFunc.trace并查看消息(这将打印所有传入的OSC消息),以查看您的OSCdef是否以某种方式没有接收到消息。
  2. 尝试使用Packet Peeper (http://packetpeeper.org/)之类的网络分析器来查看本地环回网络lo0上的网络流量。当我这样做时,我可以清楚地看到SuperCollider发送的消息,但我看不到我从Python发送的任何消息,即使当我在循环中发送并调用osc_process().
  3. If时,您也找不到任何Python发送OSC包的迹象,请尝试不同的Python库-还有许多其他库可用。
票数 0
EN

Stack Overflow用户

发布于 2021-07-16 03:26:19

(我是osc4py3作者) osc4py3存储要在内部列表中发送的消息,并立即返回。这些列表在osc_process()调用期间处理,或者直接由后台线程处理(在选定的标题模型上)。

因此,如果您选择了as_eventloop线程模型,则需要多次调用osc_process(),例如:

代码语言:javascript
复制
…
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56102649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档