Как отладить протокол OSC между Supercollider и приложением Python - PullRequest
0 голосов
/ 28 октября 2018

Будучи новичком в SuperCollider, я использую учебное пособие, чтобы попытаться заставить приложение Pycharm общаться с Supercollider (версия Python: 3.7 / SuperCollider 3.9.3).На стороне клиента я пробовал с pythonosc и OSC:

код pythosc:

import argparse
import random
from pythonosc import osc_message_builder
from pythonosc import udp_client
import socket

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default='127.0.0.1',
                        help="The ip of the OSC server")
    parser.add_argument("--port", type=int, default=57110,
                        help="The port the OSC server is listening on")
    args = parser.parse_args()

    client = udp_client.SimpleUDPClient(args.ip, args.port)

    client.send_message("/print", 500)

Код OSC:

import OSC
import time, random

if __name__ == "__main__":
    client = OSC.OSCClient()
    client.connect(("127.0.0.1", 57110))
    msg = OSC.OSCMessage()
    msg.setAddress("/print")
    msg.append(500)
    client.send(msg)

Код в SuperCollider:

s.boot;

(
SynthDef( \sin, { | amp = 0.01, freq = 333, trig = 1 |
    var env, sig;
    env = EnvGen.kr( Env.asr( 0.001, 0.9, 0.001 ), trig, doneAction: 0 );
    sig = LFTri.ar( [ freq, freq * 0.999 ], 0.0, amp ) * env;
    Out.ar( [ 0 ], sig * 0.6 );
}).add;

h = Synth( \sin, [ \amp, 0.4 ] );

x = OSCFunc( { | msg, time, addr, port |
    var pyFreq;

    pyFreq = msg[1].asFloat;
    ( "freq is " + pyFreq ).postln;
    h.set( \freq, pyFreq );
}, '/print' );
)

При использовании кода pythonosc и OSC я получаю: 'СБОЙ В СЕРВЕРЕ: / команда печати не найдена' .Очевидно, что приложение python устанавливает связь с SC, но не может интерпретировать '/ print'.Я отмечаю, что сервер SC загружается через порт 57110, но NetAddr.langPort возвращается как 57120. Я не уверен, почему они отличаются.Я провел весь вечер, рассматривая возможные решения онлайн без удачи.Несколько других пользователей StackOverflow опубликовали аналогичные проблемы, одна из которых предполагает, что это может быть проблема с портом.В данном случае я не понимаю, как это может быть, так как при этом условии SC не будет ничего вообще.(Изменение порта на 57120 в коде Python не приводит к ответу от сервера SC).Любые предложения, исходящие из предыдущего опыта людей в этой пуговке, будут приветствоваться, так как, в основном, это ведет меня.очень медленно, орехи !!

1 Ответ

0 голосов
/ 24 ноября 2018

Краткий ответ: использовать порт, возвращаемый NetAddr.langPort.

Сервер SuperCollider (scsynth) и языковой процесс (sclang) - это разные вещи.Вы можете запутаться, если используете IDE SuperCollider, потому что выходные данные обоих процессов размещены там в окне сообщений, и различие также трудно понять как новичок.

Вы очень близки кответ - вы заметили, что порт сервера отличается от порта языка.Чтобы два процесса могли общаться друг с другом через OSC на основе UDP, им нужно использовать отдельные порты.Сервер использует адреса OSC для реализации протокола команд, который вы можете найти в документации для здесь .Как вы увидите, есть команды для таких вещей, как создание новых узлов синтезатора (/s_new), распределение буферов (/b_alloc) и установка значений на управляющих шинах (/s_set), но нет команды для /print.Вот почему вы видите это конкретное сообщение об ошибке: «СБОЙ В СЕРВЕРЕ: / команда печати не найдена» .(Кстати, это сообщение приходит с сервера, а не с языка.)

OSCFunc объекты, с другой стороны, отвечают на сообщения OSC, поступающие в языковой процесс.Итак, все, что вам нужно сделать, это отправить ваше сообщение OSC из Python на правильный порт - 57120.

Эта статья документации может помочь понять разницу между сервером SuperCollider (scsynth)и клиент (Python, sclang или любая другая ваша программа, которая отправляет ему сообщения OSC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...