2012-08-13 100 views
1

我想通过SoundManager2中的一堆声音文件循环播放,并在各个时间点播放它们。下面的代码需要songArray看起来像这样,用“注意”,包括声音文件以及多长时间播放声音文件的持续时间:SoundManager2 - 停止声音时的失真

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

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

通常可以使用线性插值来实现这种“平滑”的任务:http://blog.bjornroche.com/2010/10/linear-interpolation-for-audio-in-c-c.html

对不起,我不知道SoundManager2好足够的了解,如果你已经这样做了。