Связь с Python и Суперколлайдером через OSC

Я пытаюсь подключить Python к Supercollider через OSC, но это не работает.

Я использую Python3 и библиотеку osc4py3.

Первоначальная идея заключалась в том, чтобы отправить текст слово за словом, но при попытке я понял, что соединение не работает.

Вот код СК:

(
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 на терминале, но ни на одном из них не появляется ошибка, поэтому я немного потерялся в том, что я могу проверить, чтобы убедиться, что получает где-то.

Он не печатается в окне сообщения SC, он просто говорит OSCdef(texto, /texto/supercollider, nil, nil, nil).


person sophiet    schedule 12.05.2019    source источник


Ответы (2)


Когда я запускаю часть вашего примера SuperCollider, а затем запускаю:

n = NetAddr("127.0.0.1", 57120);
n.sendMsg('/texto/supercollider', 1, 2, 3);

... Я вижу, что сообщение печатается немедленно (обратите внимание, что вы использовали postIn вместо postln, если вы не исправите это, вы получите сообщение об ошибке вместо печатного сообщения).

Как и вы, я ничего не вижу, когда отправляю через библиотеку Python — я подозреваю, что что-то не так на стороне Python? В этом ответе есть подсказка, которую вы должен вызывать osc_process() после отправки, но это все еще не работает для меня

Вы можете попробовать три вещи:

  1. Запустите OSCFunc.trace в SuperCollider и следите за сообщениями (при этом будут напечатаны ВСЕ входящие сообщения OSC), чтобы увидеть, не получает ли ваш OSCdef каким-то образом сообщения.

  2. Попробуйте сетевой анализатор, такой как Packet Peeper (http://packetpeeper.org/), чтобы отслеживать сетевой трафик в локальной петле. сеть lo0. Когда я делаю это, я могу ясно видеть сообщения, отправленные SuperCollider, но я не вижу никаких сообщений, которые я отправляю из Python, даже когда я отправляю в цикле и вызываю osc_process().

  3. Если вы не можете найти никаких признаков того, что Python отправляет пакеты OSC, попробуйте другую библиотеку Python — доступно много других.

person scztt    schedule 14.05.2019
comment
Эй, спасибо! Я изменил библиотеку для python-osc, и теперь она работает отлично! (: - person sophiet; 14.05.2019

(Я автор 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

person L.Pointal    schedule 15.07.2021