Почему мой Tone.Loop перестает зацикливаться, казалось бы, случайно?

Кажется, мой цикл останавливается случайно. В чем может быть проблема?

Я попытался использовать зацикленный Tone.Event, и произошло то же самое. Возможно, это мое понимание того, как время интерпретируется в Tone.Loop и во внутреннем Transport.scheduleOnce. Цикл может остановиться в любой момент, поэтому обновите и перезапустите функцию, если она пройдет около 10 секунд, или дайте ей поработать, пока Tone.Loop в конце концов не остановится, но, скорее всего, остановится. Я могу гарантировать это. Вы можете позволить ему играть во время выполнения чего-то еще, вы будете знать, что Цикл остановился, когда громкость звука перестала падать. Я обошел эту проблему, связав сущность цикла непосредственно с событием "тик" Tone.Context; кажется, все работает так, как ожидалось. Тем не менее, я хочу знать, почему Loop не работает.

function testTone(freq) {
        let interval = 0.5,
            maindip = 0.7;
        let osc = new Tone.Oscillator(freq || 100,'sine').sync().start(0),
            gain = new Tone.Gain(),
            postgain = new Tone.Gain(),
            panner = new Tone.Panner3D(-3,-3,-7),
            freeverb = new Tone.Freeverb(1),
            loop = new Tone.Loop((time)=> {
                let div = Math.random(0,1),
                    dip = 1-div*maindip;
                gain.gain.value = dip;
                postgain.gain.value = dip;
                console.log(time);
                Tone.Transport.scheduleOnce((time)=> {
                    console.log('once upon', time);
                    gain.gain.value = 1;
                    postgain.gain.value = 1;
                }, '+'+(interval*div/2));
            }, interval);
        freeverb.wet.value = 0.2;
        freeverb.dampening.value = 500;
        osc.chain(gain, panner, freeverb, postgain, Tone.Master);
        loop.start(0);

        Tone.Transport.start();

        this.osc = osc;
        this.panner = panner;
        this.gain = gain;
        this.loop = loop;
        this.postgain = postgain;
        this.reverb = freeverb;
    }

Цикл должен работать вечно.

0 ответов

Другие вопросы по тегам