【问题标题】:Communication with Python and Supercollider through OSC通过 OSC 与 Python 和 Supercollider 通信
【发布时间】:2019-09-29 20:11:58
【问题描述】:

我正在尝试通过 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 上运行跟踪方法,当我在终端上运行 Python 脚本时,post 窗口上什么也没有出现,但它们都没有出现错误,所以我对我可以测试的内容有点迷茫肯定会有所进展。

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

【问题讨论】:

    标签: python-3.x osc supercollider


    【解决方案1】:

    当我运行你的示例中的 SuperCollider 部分,然后运行:

    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. 如果您找不到任何 Python 发送 OSC 数据包的迹象,请尝试使用不同的 Python 库 - 还有许多其他可用的库。

    【讨论】:

    • 嘿,谢谢!我已经更改了 python-osc 的库,现在它运行良好! (:
    【解决方案2】:

    (我是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2012-09-10
      • 1970-01-01
      相关资源
      最近更新 更多