【发布时间】:2018-09-07 16:21:59
【问题描述】:
我正在尝试使用 Line.kr 更改音量,但出现此错误:错误:无法将控件设置为 UGen
代码如下:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play
a.set(\vol,Line.kr(0,1.0,3))
有什么想法吗?
【问题讨论】:
标签: supercollider
我正在尝试使用 Line.kr 更改音量,但出现此错误:错误:无法将控件设置为 UGen
代码如下:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play
a.set(\vol,Line.kr(0,1.0,3))
有什么想法吗?
【问题讨论】:
标签: supercollider
你不能使用 UGen 来设置 SynthDef 的一些 arg,但是你可以设置 Line.kr 的参数:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*Line.kr(atk,sus,rel)}.play
a.set(\atk,0,\sus,1,\rel,0)
请注意,使用 Line.kr 您无法重新启动信封。 有关更具体的控制,请参阅 EnvGen UGen: http://doc.sccode.org/Classes/EnvGen.html
【讨论】:
Line.kr(\atk.kr, \sus.kr, \rel.kr),否则您不会进行任何控制(并且在该示例中您还会收到未声明变量的错误)。您可以(稍后)set 不存在的控件唉,只是在这种情况下什么都不会发生。
Line 的参数实际上是(start, end, dur)。
这实际上是一个基本问题/主题,可能需要更详细的答案。基本上,如果您需要/想要\vol 信封的“完全灵活性”,您必须从(服务器端)总线读取它或使用隐藏该(总线)的众多客户端包装技巧之一在一些语法糖下进行管道。后者的一个典型例子是 JITLib。使用后者的示例:
a = Ndef(\a, {arg freq=440, vol=0; SinOsc.ar(freq)*vol}).play;
a.set(\vol, Ndef(\v, { Line.kr(0,1.0,3) }))
如果您现在执行a.edit,您会看到类似
如果不使用该 JITLib 糖,您将自己分配和映射总线,例如:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play;
b = Bus.control(s, 1); // "s" is the default-bound server variable
a.map(\vol, b);
c = { Out.kr(b, Line.kr(0,1.0,3);) }.play;
使用 JITlib,您可以只使用 set,因为它具有“智能”来检测参数类型,但是使用基本 SC,您需要区分映射和设置...尽管您也可以将某些内容设置为 c -led bus-number 字符串以达到相同的效果(map 基本上是为你做的),即上面的倒数第二行可以是 a.set(\vol, b.asMap); 只是 b.asMap 评估为例如“c1”,表示控制总线 1。(如您所料,音频总线使用“a”前缀。)
这一点可能有点混乱,但请记住 a 和 ~a 是不同类型的变量(或多或少的函数堆栈与环境堆栈),Ndef 键(第一个 Ndef 参数) 可以在“快捷方式”中“直接”使用~由ProxySpace 提供的变量,如
p = ProxySpace.push(s);
~a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol};
~a.play; // play the NodeProxy, not the Function (Synth) directly
~a.set(\vol, ~v); // ~v is a NodeProxy.nil(localhost, nil) due to ProxySpace
~v = { Line.kr(0,1.0,3) };
最后一个示例实际上自动发出Ndefs,即第二行与Ndef(\a ... 相同,因此您不必再显式输入Ndefs。其工作方式是ProxySpace 将currentEnvironment(〜变量所在的位置)替换为put(由〜变量的赋值触发)现在正在创建或修改Ndefs 和at正在访问它们,例如如果您评估 currentEnvironment 现在它会显示类似
ProxySpace ( ~a - ar(1) ~v - kr(1) )
(要回到您之前的环境,请立即发送p.pop。)
【讨论】: