去提问»
提问背景 Question:
下面的代码,为什么我点播放的时候,没有读取新修改的代码,还是播放旧的音乐,这有错

修复ABCJS播放器无法更新曲谱的问题

发布时间:2026-08-22 16:40 👁️ 阅读:6

你遇到的问题是因为 synthControl 实例在第一次创建后被复用了,但它并没有自动感知到 visualObj 的更新。你需要确保在每次点击播放时,先禁用旧的音频实例,再加载新的。请将你的 script 部分替换为以下代码:

var synthControl;

document.getElementById('btn-play').addEventListener('click', async function() {
    var abcText = document.getElementById('abc-input').value;

    // 1. 渲染乐谱
    var visualObj = ABCJS.renderAbc("paper", abcText, { responsive: "resize" })[0];

    // 2. 销毁旧的播放实例(关键步骤)
    if (synthControl) {
        synthControl.disable();
    }

    // 3. 实例化播放控制器
    synthControl = new ABCJS.synth.SynthController();
    synthControl.load("#audio-controls", null, {
        displayLoop: true, displayRestart: true, displayPlay: true, displayProgress: true, displayWarp: true
    });

    // 4. 合成音频
    var createSynth = new ABCJS.synth.CreateSynth();
    try {
        await createSynth.init({ visualObj: visualObj });
        await synthControl.setTune(visualObj, false);
    } catch (error) {
        alert("音频合成失败,请检查ABC语法");
    }
});

你可以尝试使用这段《欢乐颂》测试,它逻辑简单且结构完整:

X:1
T:Ode to Joy
M:4/4
L:1/4
K:C
E E F G | G F E D | C C D E | E>D D2 |
E E F G | G F E D | C C D E | D>C C2 |

通过这种方式,每次点击按钮,旧的音频控制器都会被 disable() 掉,新的配置会被重新加载。