Tone.js Tone.BufferSource: буфер либо не установлен, либо не загружен
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);
}
}
});
};
}
0 ответов
У меня недавно была эта проблема, и я нашел решение, которое сработало для моего случая.
Tone.js не нравится, когда вы инициализируете аудио-буфер внутри функции (что вы делаете, когда вызываете новые Tone.Players внутри циклического процессора).
Чтобы обойти это в верхней части кода, объявите новую глобальную переменную buffer1 = new Tone.Buffer(url1) для каждого URL, который вам нужен. https://tonejs.github.io/docs/r13/Buffer
Затем внутри циклического процессора просто замените URL-адреса каждым буфером и тегом имени, и у вас не должно возникнуть никаких проблем. Итак, новые Tone.Players({"name1": buffer1, "name2": buffer2, ...})