混洗阵列音频总是从0开始?

时间:2017-01-15 19:35:39

标签: javascript arrays shuffle

我正在尝试制作一种随机选择曲目的音乐,一种是直接接踵而来的音乐(并最终逐渐消失,使得一首音轨与下一首曲目重叠,制作变形的任意音乐,或许最终会有些自我构成等等。)

我是"随机化"通过将音频文件放在一个数组中然后改组数组来跟踪轨道。但是,每次加载页面时,虽然数组被洗牌,但数组中的第一个选择始终为#1。换句话说,如果我的数组是[1,3,4,7,9]并且我运行了三次脚本,则轨道将播放[1,3,7,4,9],然后[1,4,7, 9,3],然后是[1,3,9,7,4],其中第一首曲目始终为1.我希望第一首曲目也是随机曲目。有什么建议吗?

var audio = new Audio(),
i = 0;
var playlist = new Array('TRACKS/1.ogg', 'TRACKS/2.ogg', 'TRACKS/3.ogg', 'TRACKS/4.ogg', 'TRACKS/5.ogg', 'TRACKS/6.ogg', 'TRACKS/7.ogg', 'TRACKS/8.ogg', 'TRACKS/9.ogg');

audio.addEventListener('timeupdate', function(){
            var buffer = .8
            if(this.currentTime > this.duration - buffer){
                i = ++i < playlist.length ? i : 0;
console.log(i)
audio.src = playlist[i];
readFiles()
            }}, false);

audio.volume = 0.3;
audio.loop = false;
audio.src = playlist[0];

function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;

// While there remain elements to shuffle...
while (0 !== currentIndex) {

// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;

// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}

return array;
}

function readFiles(){        
playlist = shuffle(playlist);
for(var i = 0; i < playlist.length; ++i){
audio.play();
}
readFiles(); //to read undefinitly
}

readFiles();

1 个答案:

答案 0 :(得分:0)

好的,我只需要在readFiles()函数之前调用shuffle(播放列表)。容易......谢谢。