我想做一些实时声音处理,我听说过supercollider
它看起来很棒,但我想坚持使用 python,因为“正常”编程是问题所在。
有没有办法将 python 脚本作为模块加载到 supercollider 或对立面?
意味着将库导入我的 python 代码并使用 supercollider 功能?
我在网上没有找到太多关于它的信息,所以任何帮助都会很棒。
我想做一些实时声音处理,我听说过supercollider
它看起来很棒,但我想坚持使用 python,因为“正常”编程是问题所在。
有没有办法将 python 脚本作为模块加载到 supercollider 或对立面?
意味着将库导入我的 python 代码并使用 supercollider 功能?
我在网上没有找到太多关于它的信息,所以任何帮助都会很棒。
我不知道 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 的基本解释)。
FoxDot ( http://foxdot.org/ ) 可能会提供您正在寻找的内容
没试过,但supriya看起来很有希望......
你也可以使用 Python-osc。(我真的很喜欢那个!)@caseyanderson 关于没有 python 实现是正确的。你可以用 pip 抓取它:
pip install python-osc
并从这里导入import pythonosc
或抓取:https ://pypi.python.org/pypi/python-osc
我也找不到任何合适的东西,所以我创建了一个轻量级模块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)
我更新了@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。
我的教授和一些同学开发了这个库 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(...)