Как программно остановить воспроизведение звука в SuperCollider

У меня есть следующий фрагмент кода, который должен воспроизводить функцию синтезатора в течение одной секунды, останавливать ее, воспроизводить снова через одну секунду и так далее:

    t = Task({{
    var a;
    a =  {[0,0,SinOsc.ar(852, 0, 2.2)+SinOsc.ar(1633, 0, 2.2), 0]} ;
    a.play;
    1.wait;
    a.release(5);
    1.wait;
   }.loop});

   t.play;

Проблема в том, что игра не останавливается, а запускается на сервере. Что тут не так, как можно остановить играющий синтезатор?


person Koffiman    schedule 18.01.2013    source источник


Ответы (1)


В этом коде 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
comment
как это сделать в Score NRT - person pete; 05.09.2015