我试图在SoundManager2中循环播放一堆声音文件,并在不同的时间点播放它们。下面的代码采用了一个看起来像这样的songArray,其中“note”包含一个声音文件和播放该声音文件的持续时间:
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);
}
}
}
任何可能出错的想法?
P.S。我们已经在最新版本的Safari,Chrome和Firefox上尝试过它。
答案 0 :(得分:0)
如果我正确关注您,您正在播放音频文件,然后停在文件中间的任意位置。这通常会导致输出不连续,这将导致爆裂或咔嗒噪声,因为信号在一个样本中从高电平跳到零。要消除这种情况,您必须平滑地将输入音量从初始音量减小到零,而不是将其从初始音量突然改为零。
您通常可以使用线性插值来完成此“平滑”任务:http://blog.bjornroche.com/2010/10/linear-interpolation-for-audio-in-c-c.html
抱歉,我不太了解SoundManager2是否足以理解你是否已经这样做了。