【问题标题】:Supercollider ERROR: can't set a control to a UGen超级对撞机错误:无法将控件设置为 UGen
【发布时间】: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


    【解决方案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

    【讨论】:

    • 在第一行中,它必须是Line.kr(\atk.kr, \sus.kr, \rel.kr),否则您不会进行任何控制(并且在该示例中您还会收到未声明变量的错误)。您可以(稍后)set 不存在的控件唉,只是在这种情况下什么都不会发生。
    • Line 的参数实际上是(start, end, dur)
    【解决方案2】:

    这实际上是一个基本问题/主题,可能需要更详细的答案。基本上,如果您需要/想要\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。其工作方式是ProxySpacecurrentEnvironment(〜变量所在的位置)替换为put(由〜变量的赋值触发)现在正在创建或修改Ndefs 和at正在访问它们,例如如果您评估 currentEnvironment 现在它会显示类似

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

    (要回到您之前的环境,请立即发送p.pop。)

    【讨论】:

      猜你喜欢
      • 2022-12-11
      • 2014-01-17
      • 2021-01-29
      • 2013-04-11
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多