gpt4 book ai didi

javascript - SoundManager2 - 停止声音时失真

转载 作者:行者123 更新时间:2023-11-28 09:44:46 25 4
gpt4 key购买 nike

我试图在 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 的了解还不够深入,无法理解您是否已经在这样做。

关于javascript - SoundManager2 - 停止声音时失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11927302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com