2016-11-25 162 views
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' 

); 
) 

回答

0

首先,這個if語句:

if ((msg[3] > 200), {x.clear;} && {f.play;}); 

奇怪的是 - 目前還不清楚試圖讓與,但它是不可能的,它做什麼你想。 & &是一個布爾運算符,所以一般的期望是左側和右側是真/假。在你的使用中,它實際上是對左側和右側函數執行函數組合,但是在給定函數的情況下,它仍然沒有做任何連貫的事情。我認爲你可能想要的是:

if (msg[3] > 200) { 
    x.clear; 
    f.play; 
} 

....它將清除x和播放f。

有很多方法可以做我想要做的。這裏有一個建議 - Pdef可以分配給對方,並在播放過程中進行熱插拔。這意味着,你可以這樣做:

( // set up \a, \b, and \player, and start playing \player 
Pdef(\a, Pbind(
    \dur, 1/4, 
    \degree, 0, 
)); 

Pdef(\b, Pbind(
    \dur, 1/3, 
    \degree, 2, 
)); 

\\ Start playing an empty Pdef to use later. 
Pdef(\player).play; 
) 

然後,您可以\播放器設置成\或\ B的一個在它們之間進行切換透明:

// Assign Pdef(\a) to player, to start it playing 
Pdef(\player, Pdef(\a)); 

// Assign Pdef(\b) to player, which starts \b and stops \a 
Pdef(\player, Pdef(\b)); 
相關問題