16

我想做一些实时声音处理,我听说过supercollider

它看起来很棒,但我想坚持使用 python,因为“正常”编程是问题所在。

有没有办法将 python 脚本作为模块加载到 supercollider 或对立面?

意味着将库导入我的 python 代码并使用 supercollider 功能?

我在网上没有找到太多关于它的信息,所以任何帮助都会很棒。

4

7 回答 7

16

我不知道 SuperCollider 的 python 实现,但是使用OpenSoundControl在 SC 和 Python 之间进行通信非常容易。下面是一些示例代码,展示了如何将控制信息从 Python 发送到 SC(此处用作音频引擎)。首先是SC部分:

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" );
)


现在是 Python 部分:

import pyOSC3
import time, random
client = pyOSC3.OSCClient()
client.connect( ( '127.0.0.1', 57120 ) )
msg = pyOSC3.OSCMessage()
msg.setAddress("/print")
msg.append(500)
client.send(msg)


因此,您仍然需要在 SC 中编写一些代码(以生成音频类型,以及在 Python 和 SC 之间建立连接),但您可以在 Python 中完成其他所有操作。请参阅教程页面的链接以获得更深入的解释(以及使用 SC 的基本解释)。

于 2013-04-23T20:57:34.437 回答
4

FoxDot ( http://foxdot.org/ ) 可能会提供您正在寻找的内容

于 2018-09-17T15:38:20.840 回答
2

没试过,但supriya看起来很有希望......

于 2019-06-03T04:56:02.333 回答
2

你也可以使用 Python-osc。(我真的很喜欢那个!)@caseyanderson 关于没有 python 实现是正确的。你可以用 pip 抓取它: pip install python-osc并从这里导入import pythonosc 或抓取:https ://pypi.python.org/pypi/python-osc

于 2017-04-23T01:01:39.917 回答
1

我也找不到任何合适的东西,所以我创建了一个轻量级模块python-supercollider,它允许您使用 SuperCollider 服务器进行综合,并使用 Python 3 进行控制和排序逻辑。

它是 SuperCollider OSC 命令集的包装器,遵循与 SC 客户端语言相同的模式:

from supercollider import Server, Synth

server = Server()
synth = Synth(server, "sine", { "freq" : 440.0, "gain" : -12.0 })
synth.set("freq", 880.0)
于 2019-10-19T23:15:37.493 回答
1

我更新了@caseyanderson 的答案,因为 OSC python 模块似乎已经过时了。代码仍然来自本教程,它展示了如何将控制信息从 Python 发送到 SC(这里用作音频引擎)。首先是 SC 部分(未更改):

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' );
)

然后是 Python 部分(更新,基于python-osc):

from pythonosc import udp_client
client = udp_client.SimpleUDPClient("127.0.0.1", 57120) #default ip and port for SC
client.send_message("/print", 440) # set the frequency at 440

您必须首先执行 SC 部分。您应该听到 330 Hz 的正弦波。python 部分将正弦波的频率更改为 440 Hz。

于 2019-02-14T14:09:02.137 回答
-1

我的教授和一些同学开发了这个库 sc3nb,它可以用来从 Python 中寻址、编码和操作 SuperCollider。它适用于 OSC,但语法更简单。

图书馆代码

教程

示例(教程中的更多详细信息):

import sc3nb as scn
sc = scn.startup()  # startup sc3 sclang, boot server, load

#easy communication with Server Command Refs
sc.cmd(r"""
             #your SuperCollider-code here
       """)
sc.msg(...)
sc.bundle(...)
于 2019-04-15T09:57:02.327 回答