私は、ランダム化されたイントロ、曲の途中部分、ランダム化されたアウトロを再生するこの小さなオーディオ プレーヤーを作成しました。現在、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
ソースを表示してコンソールを見ると、配列からランダムな曲を取り出してから、その曲を配列から削除することがわかります。このようにして、すべての曲が再生されるまで曲を繰り返しません。ループが最後の曲に到達すると、アレイは元の状態に復元されます。