1

私は、ランダム化されたイントロ、曲の途中部分、ランダム化されたアウトロを再生するこの小さなオーディオ プレーヤーを作成しました。現在、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

ソースを表示してコンソールを見ると、配列からランダムな曲を取り出してから、その曲を配列から削除することがわかります。このようにして、すべての曲が再生されるまで曲を繰り返しません。ループが最後の曲に到達すると、アレイは元の状態に復元されます。

4

1 に答える 1

3

膨大な数の配列を持ちたくないと言っても、各曲にイントロのリストとアウトロのリストがある限り、それらについて何らかの形で「知っている」必要があります。基本的に 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.の「利点」の1つは、ファイルを好きなように変更できることです。

于 2013-03-04T05:33:08.913 に答える