В этом коде a — это функция, поэтому a.release не говорит синтезатору прекратить воспроизведение.
Вместо этого, почему бы не написать SynthDef с 5-секундным одиночным конвертом:
SynthDef(\sines, {arg out = 0, release_dur, gate =1, amp = 0.2;
var sines, env;
env = EnvGen.kr(Env.asr(0.01, amp, release_dur), gate, doneAction:2);
sines = SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2);
Out.ar(out, sines * env);
}).add
t = Task({{
var a;
a = Synth.new(\sines, [\release_dur, 5, \out, 0, \amp, 0.2, \gate, 1]);
1.wait;
a.set(\gate, 0);
1.wait;
}.loop});
t.play;
Мы передадим продолжительность релиза в качестве аргумента, поэтому вы можете установить его в задаче ниже в строке a =Synth.
Затем, когда вы хотите завершить синтезатор, отправьте ему гейт 0. Это говорит конверту освободиться, что он делает в течение 5 секунд, затем doneAction удаляет синтезатор с сервера. Обратите внимание, что у вас одновременно будет играть более одного синтезатора, потому что время выпуска больше, чем время ожидания.
Кроме того, вы установили амплитуду для ваших синусов больше 1. Я не изменил это в synthdef выше.
person
les_h
schedule
05.02.2013