为什么这个解释器变量不被理解?

时间:2014-03-22 12:04:23

标签: osc supercollider

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

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

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

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

Message 'f' not understood.

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

我也尝试将函数放在常规变量中:

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

但这会导致同样的错误。

有解决方法吗?当然,我不必每次都在OSCFunc内放置一个完整的函数体?

2 个答案:

答案 0 :(得分:2)

不,你的问题只是一个SuperCollider语法问题 - 它在于你在这里所写的内容:

  f(msg)

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

  f.value(msg)

我找不到一个现在拼写出来的教程,所以这里是指向the Function helpfile的链接。

答案 1 :(得分:0)

我用Google搜索并发现了这个:

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

这很好用。另请注意,将OSCFunc的调用分配给变量。这使我能够注销'通过调用绑定:

o.free;