1

我正在尝试使用 Line.kr 更改音量,但出现此错误:错误:无法将控件设置为 UGen

这是代码:

a = {arg freq=440, vol=0; SinOsc.ar(freq)*vol}.play
a.set(\vol,Line.kr(0,1.0,3))

有任何想法吗?

4

2 回答 2

1

您不能使用 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

于 2018-10-14T13:38:34.730 回答
0

这实际上是一个基本问题/主题,可能需要更详细的答案。基本上,如果您需要/想要该\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) };

在后台,最后一个示例实际上自动发出Ndefs,即第二行与 s 相同Ndef(\a ...,因此您不必Ndefs再显式键入。它的工作方式是将(〜变量所在的位置)ProxySpace替换为currentEnvironment其中put,由分配给〜变量触发,现在正在创建或修改Ndefs 并at正在访问它们,例如,如果您currentEnvironment现在评估它会显示类似

ProxySpace ( ~a - ar(1) ~v - kr(1) )

(现在回到您之前的环境问题p.pop。)

于 2021-11-26T06:24:55.470 回答