Tone.js Tone.BufferSource: буфер не установлен или не загружен - PullRequest
0 голосов
/ 07 ноября 2018

Tone.BufferSource: буфер либо не установлен, либо не загружен. Эта ошибка возникает в блоке try / catch. Это происходит только тогда, когда я запускаю функцию обновления постоянно или иногда случайно. Когда возникает эта ошибка, мой звук на короткое время просто отключается.

Логика моего кода. Когда программа запускается, функция вызывается в конструкторе, создающем последовательность Tone.sequence позже, когда я изменяю / обновляю параметры трека, я вызываю функцию обновления, который вызывает loopprocessor с новыми / обновленными треками. Но когда я запускаю обновление, которое запускает функцию loopprocessor, он запускается в tone.sourcebuffer либо не устанавливается, либо загружается. Как я могу обойти эту проблему? Мой код:

import Tone from "tone";

export  function create(tracks, beatNotifier){
    const loop = new Tone.Sequence(
        loopProcessor(tracks, beatNotifier),
        [...new Array(16)].map((_, i) => i),
        "16n"
    );
    Tone.Transport.bpm.value = 120;
    Tone.Transport.start();
    return loop;
}

export function update(loop, tracks, beatNotifier){
    loop.callback = loopProcessor(tracks, beatNotifier);
    return loop;
}

function loopProcessor  (tracks, beatNotifier) {
    const urls = tracks.reduce((acc, {name}) => {
        return {...acc, [name]: `http://localhost:3000/src/sounds/${name}.[wav|wav]`};
    }, {});
    const keys = new Tone.Players(urls, {
        fadeOut: "64n"
    }).toMaster();
    return (time, index) => {
        beatNotifier(index);
        tracks.forEach(({name, vol, muted, note, beats}) => {
            if (beats[index]) {
                try {
                    var vel = Math.random() * 0.5 + 0.5;
                    keys
                        .get(name)
                        .start(time, 0, note, 0, vel);
                    keys
                        .get(name).volume.value = muted
                            ? -Infinity
                            : vol;
                } catch(e) {
                    console.log("error", e);
                }
            }
        });
    };
}
...