使用Python与Supercollider合作

18

我想进行实时音频处理,听说过supercollider,它看起来不错,但我想在'普通'编程方面坚持使用Python。

是否有办法将Python脚本加载为Supercollider模块或反之亦然?

也就是说,导入库到我的Python代码中并使用supercollider的功能?

我在网上没有找到太多信息,希望能得到帮助。


1
你是否已经了解SC 0.3.1 - halex
1
此外,谷歌搜索“python supercollider”会得到一些其他有趣的结果。 - Aya
会查找两者。我在导入sc 0.3.1包时遇到了一些问题,我使用的是Mac OS 10.8。如果有解决方案,我会更新问题。 - Itzik984
7个回答

17

我不知道是否有Python实现的SuperCollider,但是使用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一起使用的基本说明),请参见教程页面链接。


1
非常感谢您提供的这个教程!我找到了它,但是您的链接需要更新。=) - Iain Duncan
很高兴能够帮到你,感谢指出链接已经失效! - caseyanderson
@caseyanderson 很棒的指南,谢谢 - 但是我遇到了一个问题:SuperCollider似乎收到了消息,但我却收到了一个错误:FAILURE IN SERVER: /print Command not found。你有什么线索吗?我可能做错了什么? - Toivo Säwén
1
@ToivoSäwén 抱歉回复晚了,我现在才看到,但很高兴你已经解决了问题。感谢您对教程的赞美之词! - caseyanderson

4

2
我还没有尝试过,但是supriya看起来很有前途... 最初的回答

2

您还可以使用Python-osc(我非常喜欢这个库!)。@caseyanderson提到没有Python的实现是正确的。 您可以使用pip命令获取它: pip install python-osc,然后通过import pythonosc导入 或者从这里获得:https://pypi.python.org/pypi/python-osc


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(...)

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。


嗨,你也可以使用pyOSC3进行编程,这是我最近用于此类编程的工具。我已经更新了前面的回答,这只需要与SimpleUDPClient的更改类似即可。 - caseyanderson

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接