我正在尝试使用 Line.kr 更改音量,但出现此错误:错误:无法将控件设置为 UGen
这是代码:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play
a.set(\vol,Line.kr(0,1.0,3))
有任何想法吗?
我正在尝试使用 Line.kr 更改音量,但出现此错误:错误:无法将控件设置为 UGen
这是代码:
a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play
a.set(\vol,Line.kr(0,1.0,3))
有任何想法吗?
您不能使用 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
这实际上是一个基本问题/主题,可能需要更详细的答案。基本上,如果您需要/想要该\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
基本上是为你做的),即上面的倒数第二行可以评估为例如“c1”,意思是控制总线1。(音频总线使用“a”前缀,正如你所期望的那样a.set(\vol, b.asMap);
。b.asMap
)
这一点可能有点令人困惑,但请记住,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) };
在后台,最后一个示例实际上自动发出Ndef
s,即第二行与 s 相同Ndef(\a ...
,因此您不必Ndefs
再显式键入。它的工作方式是将(〜变量所在的位置)ProxySpace
替换为currentEnvironment
其中put
,由分配给〜变量触发,现在正在创建或修改Ndef
s 并at
正在访问它们,例如,如果您currentEnvironment
现在评估它会显示类似
ProxySpace ( ~a - ar(1) ~v - kr(1) )
(现在回到您之前的环境问题p.pop
。)