Tone.BufferSource:缓冲区未设置或未加载。此错误发生在 try/catch 块中。它仅在我不断或有时随机触发更新功能时发生。发生此错误时,我的音频会短暂关闭。
我的代码背后的逻辑。当程序启动时,在创建 Tone.sequence 的构造函数中调用创建函数,稍后当我更改/更新轨道参数时,我调用更新函数,该函数调用带有新/更新轨道的循环处理器。但是当我触发触发循环处理器功能的更新时,它会运行到tone.sourcebuffer要么没有设置ir加载。我该如何解决这个问题?我的代码:
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);
}
}
});
};
}