【问题标题】:Why is this interpreter variable not understood?为什么这个解释器变量不被理解?
【发布时间】:2014-03-22 12:04:22
【问题描述】:

我正在尝试将 OSC 消息绑定松散耦合到处理它们的函数:

f = {|msg| msg.postln};
OSCFunc({|msg, time, addr, recvPort| f(msg)}, '/2/push1')

我认为这很简单。我可以在任何时候替换 f,因此随意处理来自路径 /2/push1 的消息。

但是当我点击按钮(发送带有路径/2/push1 的消息)时,我收到一条错误消息:

Message 'f' not understood.

所以我猜f 在对OSCFunc 的调用中声明的函数范围内具有不同的含义。我猜它有不同的Environment

我还尝试将函数放入常规变量中:

(
var myFunction = {|msg| msg.postln};
OSCFunc({|msg, time, addr, recvPort| myFunction(msg)}, '/2/push2');
)

但这会导致同样的错误。

有没有办法解决这个问题?当然我不必每次都在OSCFunc 中放置整个函数体吗?

【问题讨论】:

    标签: osc supercollider


    【解决方案1】:

    不,您的问题只是 SuperCollider 语法问题 - 它在于您在此处编写的内容:

      f(msg)
    

    我认为您希望这会以 msg 作为参数“调用”函数 f。然而,SuperCollider 的语法并不完全一样——它实际上将其解释为调用msg.f() 的等效方式,这就是为什么它会抛出一个错误,指出msg 不知道f 消息。相反,您需要在函数上使用 value 消息:

      f.value(msg)
    

    我现在找不到说明这一点的教程,所以这里有一个指向 the Function helpfile 的链接。

    【讨论】:

    • 天哪! f = { |x| x }; f(2); 产生相同的错误。我确信这与范围有关。我已经学习 SuperCollider 大约 9 个月了,但这让我完全不适应。
    【解决方案2】:

    我搜索了一下,发现了这个:

    f = {|msg, time, addr, recvPort| msg.postln};
    o = OSCFunc(f, '/2/push1');
    

    这很好用。还要注意对OSCFunc 的调用分配给一个变量。这使我能够通过调用“取消注册”绑定:

    o.free;
    

    【讨论】:

    • 这不是问题的答案(见丹的),但它确实为我解决了问题。 :)
    猜你喜欢
    • 2012-10-25
    • 2023-01-10
    • 2012-12-01
    • 2017-06-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2010-12-20
    • 2022-09-23
    相关资源
    最近更新 更多