gpt4 book ai didi

javascript - 转换此 JavaScript 以处理多首歌曲?

转载 作者:行者123 更新时间:2023-11-30 13:07:22 25 4
gpt4 key购买 nike

我创建了这个小型音频播放器,它播放随机的前奏、歌曲的中间部分,然后是随机的尾声。现在它被硬编码为 1 首歌曲。每首歌有 3 个前奏、一个中段和 3 个尾奏。我希望能够有一个随机选择的歌曲列表(比如从数组中随机选择),因此脚本将选择一首歌曲并相应地更改脚本(前奏和结尾以及中间部分)。我想过不同的方法来做到这一点,但我不想为脚本中的每首歌都设置大量数组。我将如何着手设计这样的系统?在 www.saradio.tk/dev.html 进行演示(音频计时只能在 Chrome-ACTIVE-TAB AFAIK 中正常工作)

代码:

<body onload="checkdif(), loadintro(), loadoutro()">
<audio id="intro" src="" controls preload autoplay></audio>
<audio id="mid" src="radio/Barracuda-mid.ogg" controls preload></audio>
<audio id="outro" src="" controls preload></audio>
<br>
<br>
<button onclick="resetradio()">RESET</button> <span id="timeleft"> n/a </span>

<script>
var intros = [
"radio/Barracuda-intro1.ogg",
"radio/Barracuda-intro2.ogg",
"radio/Barracuda-intro3.ogg"];

var outros = [
"radio/Barracuda-outro1.ogg",
"radio/Barracuda-outro2.ogg",
"radio/Barracuda-outro3.ogg"];

function loadintro() {
document.getElementById("intro").src = intros[Math.floor(Math.random() * intros.length)];
document.getElementById("intro").load();
document.getElementById("intro").play();
}

function loadoutro() {
document.getElementById("outro").src = outros[Math.floor(Math.random() * outros.length)];
document.getElementById("outro").load();
}

x = document.getElementById('intro');
y = document.getElementById('mid');
done = false;
done2 = false;

function checkdif() {
if (done) return;
setTimeout('checkdif()', 5);
document.getElementById('timeleft').innerHTML = x.duration - x.currentTime;
if (x.duration - x.currentTime <= 0.09) {
document.getElementById('mid').play();
done = true;
checkdif2();
}
}

function checkdif2() {
if (done2) return;
setTimeout('checkdif2()', 5);
document.getElementById('timeleft').innerHTML = y.duration - y.currentTime;
if (y.duration - y.currentTime <= 0.09) {
document.getElementById('outro').play();
done2 = true;
}
}

function resetradio() {
done = false;
done2 = false;
document.getElementById('mid').pause();
document.getElementById('mid').currentTime = 0;
loadintro();
loadoutro();
checkdif();
}

document.getElementById("outro").addEventListener('ended', resetradio, false)
</script>
</body>

PS:我还考虑过设计系统,以便它从列表中删除刚刚播放的歌曲,这样它就不会播放同一首歌曲,直到它循环遍历所有其他可能的歌曲。所以它会从一组歌曲中选择,当它选择“歌曲 x”时,它会从数组中删除“歌曲 x”以进行下一次随机选择。只是一个想法...

更新:这是我对这个系统的最终实现:http://saradio.tk/new.html

如果您查看源代码并查看控制台,您会看到它从数组中随机抽取一首歌曲,然后从数组中删除该歌曲。这样,在播放完所有歌曲之前,它不会重复播放一首歌曲。一旦循环到达最后一首歌曲,数组将恢复到原始状态。

最佳答案

即使您说不想拥有大量数组,只要每首歌曲都有前奏列表和尾声列表,您就必须以某种方式“了解”它们。您基本上有 2 个选择:

  1. 制定一个命名约定系统,其中所有的片头和片头都有相似的文件名和一些后缀
  2. 明确指定所有前奏和结尾

对于 1. ,您的数据结构可能如下所示:

var intro_suffix = '-intro';
var outro_suffix = '-outro';
var extension = '.ogg';
var songs = [
{
base_name: "radio/Barracuda"
, num_intro: 3
, num_outros: 3
},
{
base_name: "radio/SomeOtherSong"
, num_intro: 3
, num_outros: 3
},
];

一旦您选择了一首歌曲,您就可以从中得出前奏、主曲和尾奏的文件名。例如:

var song = songs[0];
var intro_url = song.name
+ intro_suffix
+ (1 + Math.floor(Math.random() * song.num_intros))
+ extension;
var song_url = song.name + extension;
var outro_url = song.name
+ outro_suffix
+ (1 + Math.floor(Math.random() * song.num_outros))
+ extension;

对于 2,您的数据结构必须是显式的:

var songs = [
{
url: "radio/Barracuda.ogg"
, intros: ["radio/Barracuda-intro1.ogg", "radio/Barracuda-intro2.ogg", "radio/Barracuda-intro3.ogg"]
, outros: ["radio/Barracuda-outtro1.ogg", "radio/Barracuda-outro2.ogg", "radio/Barracuda-outro3.ogg"]
},
{
url: "radio/SomeOtherSong.ogg"
, intros: ["radio/foo.ogg", "radio/bar.ogg", "radio/baz.ogg"]
, outros: ["radio/meh.ogg", "radio/fuuuuu.ogg", "radio/yo.ogg"]
},
];

然后您将变量导出为:

var song = songs[0];
var intro_url = song.intros[Math.floor(Math.random() * song.intros.length)];
var song_url = song.url;
var outro_url = song.outros[Math.floor(Math.random() * song.outros.length)];

2. 的一个“优点”是您可以随意修改文件

关于javascript - 转换此 JavaScript 以处理多首歌曲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15194983/

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