0
嗨Iam使用mindwave來控制OSC的一些Ndefs。我需要編寫一個函數,從列表中選擇(例如[x,f]),然後停止前一個。另外,我需要能夠只播放第一個Ndef(例如x)而不是第二個(例如f),直到我得到適當的消息(例如msg [3])並同時停止x。這是我嘗試它不工作通緝:在Supercollider我需要選擇Ndefs來播放和停止列表中的前一個
(
OSCdef.new(
\select,
{
arg msg, time, addr, port;
[msg, time, addr, port].postln;
if ((msg[3] > 200), {x.clear;} && {f.play;});
},'/neurovals'
);
SynthDef.new(\Syn, { arg freq = 440, amp = 1, sustain = 0.5;
var sig, env, mod;
env = EnvGen.kr(Env.linen(0.05, sustain, 0.5, 0.08), doneAction: 2);
mod = Saw.ar(freq * 0.1) * LFNoise1.kr(2).range(10,800);
sig = SinOsc.ar(freq + mod) * env;
Out.ar(0, RLPF.ar(sig, freq, 1.7)).dup;
}).add;
x= Ndef(\blinkpat1, Pbind(
\instrument, \Syn,
\dur, 0.03,
\freq, 440
));
OSCdef.new(
\base,
{
arg msg, time, addr, port;
[msg, time, addr, port].postln;
if ((msg[1] == msg[1]),
{x.set(\freq, msg[1].linlin(0, 100, 300, 1000);)});
},'/neurovals'
);
SynthDef.new(\fmsyn, { arg freq = 440, amp = 1, sustain = 1;
var sig, env, mod;
env = EnvGen.kr(Env.linen(0.05, sustain, 0.5, 0.08), doneAction: 2);
mod = SinOsc.ar(freq * 0.5) * LFNoise1.kr(2).range(10,800);
sig = SinOsc.ar(freq + mod) * env;
Out.ar(0, RLPF.ar(sig, freq, 1.7)).dup;
}).add;
f = Ndef(\blinkpat2, Pbind(
\instrument, \fmsyn,
\freq, 440,
\sustain, 2,
\octave, 3,
\amp, 0.4,
));
OSCdef.new(
\base2,
{
arg msg, time, addr, port;
[msg, time, addr, port].postln;
if ((msg[1] == msg[1]),
{f.set(\freq, msg[1].linlin(0, 100, 300, 1000);)});
if ((msg[1] == msg[1]),
{f.set(\sustain, msg[1].linlin(0, 100, 1, 2);)});
},'/neurovals'
);
)