我正在尝试制作一种随机选择曲目的音乐,一种是直接接踵而来的音乐(并最终逐渐消失,使得一首音轨与下一首曲目重叠,制作变形的任意音乐,或许最终会有些自我构成等等。)
我是"随机化"通过将音频文件放在一个数组中然后改组数组来跟踪轨道。但是,每次加载页面时,虽然数组被洗牌,但数组中的第一个选择始终为#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();
答案 0 :(得分:0)
好的,我只需要在readFiles()函数之前调用shuffle(播放列表)。容易......谢谢。