我想进行实时音频处理,听说过supercollider,它看起来不错,但我想在'普通'编程方面坚持使用Python。
是否有办法将Python脚本加载为Supercollider模块或反之亦然?
也就是说,导入库到我的Python代码中并使用supercollider的功能?
我在网上没有找到太多信息,希望能得到帮助。
我想进行实时音频处理,听说过supercollider,它看起来不错,但我想在'普通'编程方面坚持使用Python。
是否有办法将Python脚本加载为Supercollider模块或反之亦然?
也就是说,导入库到我的Python代码中并使用supercollider的功能?
我在网上没有找到太多信息,希望能得到帮助。
我不知道是否有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一起使用的基本说明),请参见教程页面链接。
FAILURE IN SERVER: /print Command not found
。你有什么线索吗?我可能做错了什么? - Toivo Säwén您还可以使用Python-osc(我非常喜欢这个库!)。@caseyanderson提到没有Python的实现是正确的。
您可以使用pip命令获取它:
pip install python-osc
,然后通过import pythonosc
导入
或者从这里获得:https://pypi.python.org/pypi/python-osc
我更新了@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。
from supercollider import Server, Synth
server = Server()
synth = Synth(server, "sine", { "freq" : 440.0, "gain" : -12.0 })
synth.set("freq", 880.0)