首页 > 解决方案 > OSC msg 的开关结构控制

问题描述

我是 SC 和整个音乐编程的新手。我已经完成了一个 python 应用程序,它读取文本并通过 OSC 逐字发送到 SC。文字只是为了好玩和尝试而重复的单词“miau”和“guau”。

发生的另一件奇怪的事情是,在 SC 控制台上,我得到的相同单词是文本和终端上的三倍(python 打印每个单词)。因此,对于 txt/终端上的每个“miau”,我在 SC 控制台上得到“miau miau miau”。

OSC 通信正常,但我听不到声音。我已经单独播放了我的缓冲区,它们正在工作。当我播放缓冲区或 SynthDef 时,我可以听到正在播放的样本,所以我认为问题出在开关上。

s.boot;

~b0 = Buffer.read(s, "/path/to/bd/BT0A0A7.wav")
~b1 =Buffer.read(s, "/path/to/hh/000_hh3closedhh.wav")

~b0.play; 

(
SynthDef.new(\playbuf, {|amp=1, out=0, buf, da=2, rate =1|
var sig;
sig = PlayBuf.ar(2, buf, BufRateScale.kr(buf) * rate, doneAction:da);
sig = sig*amp;
Out.ar(out, sig);
}).add;
)

Synth.new(\playbuf, [\buf, ~b1.bufnum]);

(
OSCdef.new("texto",{
    |msg, time, addr, port|
    msg[1].postln;
    switch(msg[1],
        "miau", {Synth.new(\playbuf, [\buf, ~b1.bufnum])},
        "guau", {Synth.new(\playbuf, [\buf, ~b0.bufnum])}
        );

},
'/supercollider',
)
)

虽然它复制了文本,所以我知道 OSC 正在工作,但样本不会播放。任何提示表示赞赏!

标签: supercollider

解决方案


只需在开关中使用单引号而不是双引号。像这样:

(
OSCdef(\texto,{ |msg|
    switch ( msg[1],
        'miau', { Synth.new(\playbuf, [\buf, ~b1.bufnum] ) },
        'guau', { Synth.new(\playbuf, [\buf, ~b0.bufnum] ) }
    )
}, '/supercollider' )
)

saudações,

吉尔

编辑添加:

双引号括起来的文本是字符串。用单引号括起来的文本是符号。这些是不同的类别。OSC 消息使用符号而不是字符串,这就是使用双引号不起作用的原因。

符号如下所示:

'symbol'
\symbol
"symbol".asSymbol
'symbol'.asSymbol

如果由于某种原因您有文本,最后两个可以提供帮助,但您不确定它是什么。


推荐阅读