supercollider - 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 正在工作,但样本不会播放。任何提示表示赞赏!
解决方案
只需在开关中使用单引号而不是双引号。像这样:
(
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
如果由于某种原因您有文本,最后两个可以提供帮助,但您不确定它是什么。
推荐阅读
- sqlite - 限制具有别名的列的结果
- sql - 为什么向 LIKE 添加第二个选项似乎撤消了我的 date = 功能?
- android - Android Room DAO 获得一个带有 crossRef 的字段
- google-apps-script - Google Apps 脚本在大约 30 秒内显示“超过最大执行时间”
- windows - Firefox 支持的拖放目标格式
- php - 如何通过访问其他表来获取所有被阻止的客户端来获取它
- javascript - 如何在赛普拉斯中获取具有动态选择器的元素
- roblox - 如何在 Roblox 中制作这些“提示”外观的东西?
- apache-spark - 如何在 spark sql (databricks) 中重用创建的列?
- google-apps-script - 在一张谷歌表格中组合四个脚本