我正在尝试将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
内放置一个完整的函数体?
答案 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;