Как я могу использовать EnvGen в цикле таким образом, чтобы он не перезапускался при каждой итерации цикла?
Для чего он мне нужен: кусочный синтез. Я хочу, например. 50 мс xfade между первым и вторым Klang, затем xfade 50 мс между вторым и третьим Klang, затем xfade 50 мс между третьим и четвертым Klang и так далее, и я хочу, чтобы эта конкатенация в целом модулировалась огибающей.
К сожалению, EnvGen, кажется, перезапускается с самого начала на каждой итерации цикла, который воспроизводит последовательные пары Klang. Я хочу poiiiinnnnnnnnnng, но что бы я ни пытался, все, что я получаю, это поп-поп-поп-попопо.
2019 РЕДАКТИРОВАТЬ:
Хорошо, поскольку никто не ответил на вопрос «как достичь цели», я сейчас понижаю этот вопрос до простого «почему этот конкретный подход не работает», также меняя заголовок.
Прежде чем я вставлю код, небольшое пояснение: это очень упрощенный пример. В то время как моим первоначальным желанием было модулировать сложный, кусочно-генерируемый звук с помощью огибающей, этот упрощенный пример только «вырезает» 100-мс сегменты из вывода SinOsc, просто чтобы искусственно создать ситуацию «кусочно-генерируемой».
Что происходит в этой программе, так это то, что EnvGen перезапускается при каждой итерации цикла: конверт перезапускается с t=0. Я ожидаю получить один экспоненциально затухающий звук продолжительностью 1 с, как если бы вы перебирали струну. То, что я получаю, представляет собой серию 100-мс «пингов» из-за перезапуска конверта в начале каждой итерации цикла.
Как предотвратить это?
Вот код:
//Exponential decay over 1 second
var envelope = {EnvGen.kr(Env.new([1,0.001],[1],curve: 'exp'), timeScale: 1, doneAction: 2)};
var myTask = Task({
//A simple tone
var oscillator = {SinOsc.ar(880,0,1);};
var scissor;
//Prepare a scissor that will cut 100ms of the oscillator signal
scissor = {EnvGen.kr(Env.new([1,0],[1],'hold'),timeScale: 0.1)};
10.do({
var scissored,modulated;
//Cut the signal with the scisor
scissored = oscillator*scissor;
//Try modulating with the envelope. The goal is to get a single 1s exponentially decaying ping.
modulated = {scissored*envelope};
//NASTY SURPRISE: envelope seems to restart here every iteration!!!
//How do I prevent this and allow the envelope to live its whole
//one-second life while the loop and the Task dance around it in 100ms steps?
modulated.play;
0.1.wait;
});
});
myTask.play;
(Эта проблема, с которой я сначала безуспешно боролся МЕСЯЦАМИ, на самом деле заставила меня отложить свои усилия по изучению SuperCollider на ДВА ГОДА, и теперь я продолжаю с того места, где остановился.)