声音管理器2 - 停止声音时失真

SoundManager2 - Distortion When Stopping Sound

本文关键字:声音 失真 管理器      更新时间:2023-09-26

我正在尝试在SoundManager2中循环播放一堆声音文件,并在不同的时间点播放它们。下面的代码采用如下所示的 songArray,其中"音符"由声音文件和播放该声音文件的持续时间组成:

var songArray = [[null],[["clarinet_e4.mp3",1],["clarinet_a4.mp3",1]],[null],[null],[null],[null],[["clarinet_c4.mp3",1]],[["clarinet_c5.mp3",1]],[null],[["clarinet_ab4.mp3",1]],[["clarinet_f3.mp3",1]],[null],[["clarinet_g4.mp3",1]],[["clarinet_d5.mp3",1]],[null],[null]]

它遍历数组中的每个 X,并播放为给定 X 找到的声音。然后,它会在持续时间给定的时间后停止声音。代码运行完美,只是当声音停止时,它会在歌曲结束时发出爆裂声。

function playSong(X) {
    playSongNotesAtXValue(X);
    window.setTimeout(function() {
        X++;
        if (X >= theSong.songArray.length) {
            X = 0;
        }
        playSong(X);
    }, (30/theSong.tempo)*1000)
}

function playSongNotesAtXValue(X) {
    var columnToPlay = theSong.songArray[X];
    if (columnToPlay[0] != null) {
        for (i = 0; i < columnToPlay.length; i++) {
            var note = columnToPlay[i]; 
            soundManager.play(note[0],{volume:30});
            window.setTimeout(function() {
                soundManager.stop(note[0]);
            }, (note[1]*30/theSong.tempo)*1000);   
        }
    }
}

有什么想法可能出错吗?

附言我们已经在最新版本的Safari,Chrome和Firefox上进行了尝试。

如果我

正确跟随您,您正在播放音频文件,然后在文件中间的任意点停止。这通常会导致输出不连续,从而导致爆裂或咔嗒声,因为信号在一个样本中从高电平跳到零。要消除这种情况,您必须平稳地将输入音量从初始音量减小到零,而不是突然将其从初始音量更改为零。

通常可以使用线性插值来完成此"平滑"任务:http://blog.bjornroche.com/2010/10/linear-interpolation-for-audio-in-c-c.html

抱歉,我对 SoundManager2 不够了解,无法理解您是否已经在这样做了。