【问题标题】:Tone.js Tone.BufferSource: buffer is either not set or not loadedTone.js Tone.BufferSource:缓冲区未设置或未加载
【发布时间】:2019-08-16 23:49:12
【问题描述】:

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);
                }
            }
        });
    };
}

【问题讨论】:

    标签: javascript html5-audio web-audio-api tone.js


    【解决方案1】:

    我最近遇到了这个问题,并找到了适合我的情况的解决方案。

    Tone.js 不喜欢在函数内初始化音频缓冲区(当你在循环处理器中调用 new Tone.Players 时所做的事情)。

    要解决此问题,请在代码顶部为您需要的每个 url 声明一个新的全局变量 buffer1 = new Tone.Buffer(url1)。 https://tonejs.github.io/docs/r13/Buffer

    然后在循环处理器中,只需用每个缓冲区和名称标签替换 url,你应该不会有任何问题。所以 new Tone.Players({"name1": buffer1, "name2": buffer2, ...})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2012-09-13
      • 2019-12-04
      • 2017-09-07
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多