web-dev-qa-db-ja.com

音楽プレーヤーでシャッフル

音楽プレーヤーにシャッフルアルゴリズムを実装するのがいかに難しいかはいつも耳にしますが、実際にはその説明はありません。何が難しいのですか?

たとえば、私がそれをどのように実装するかを見てみましょう:

  1. 最初に、ユーザーはプレイリストに5曲を追加します
    曲を歌う= [0、1、2、3、4];
  2. 次に、ユーザーはシャッフルを有効にします
  3. 次に、プログラムはsongs配列を新しい配列にコピーします。たとえば、shuffle
  4. 次に、shuffle配列が任意のアルゴリズムでランダムにソートされます
  5. shuffle配列は、たとえばに格納されます。セッション開始時にロードされる永続化用のテキストファイル
  6. shuffle配列が[2, 4, 0, 1, 3]になったとしましょう
  7. 次に、プレーヤーはこの配列を逆の順序で再生します
  8. 曲が再生されると、shuffle配列から削除されます。例えば。

     //シャッフルは[2、4、0、1、3] 
     while(shuffle.length> 0){
     player.play(shuffle [shuffle.length- 1]); 
     shuffle.pop(); 
    } 
     
     //最初の反復で曲3が再生され、配列は[2、4、 0、1] 
     // 2番目は曲1を再生し、配列は[2、4、0] 
     // 3番目は曲0を再生し、配列は[2 、4] 
    など
    
  9. 次に、すべての曲が再生されると、songsから新しい配列が再びランダムに生成され、新しい曲が追加された可能性があります。たぶん、最後の曲の前に2、3曲歌って、前の曲が終わるまでに新しいアレイが準備できるようにするかもしれません。

  10. 再生を停止して後で再開することもできます。shuffleからまだ削除されていないため、まだ再生されていない曲のみが聞こえます。

誰かが20000曲を持っている場合でも、配列は(整数インデックスで参照する場合)125 KBのファイルのみになります。

3
Juha Untinen

人々がランダムとして理解することとランダムが実際に意味することは2つの異なるものであるため、音楽プレーヤーにとってシャッフルは難しいです。ユーザーの期待に応えるのは困難です。ユーザーは、曲がランダムに選択されることを期待していると言いますが、ランダムに選択したくないものはたくさんあります。プレイリストをランダムにシャッフルするためのアウトラインには、ユーザーのシャッフルに対する期待を実際に満たしていないこと以外、何も問題はありません。

  • ユーザーは同じ曲を続けて何度も聞きたくありません。
  • ユーザーは、同じアーティスト/アルバムを連続して再生したり、近すぎて再生したりしたくない。
  • ユーザーは、繰り返しが発生する前に、コレクション内のすべてのアーティスト/ジャンルから1〜2曲を聴きたいと考えています。
  • 確立されたパターンに一致するランダムなシーケンスは、ランダムではなく、嫌いであると見なされます。これは、アルバムA、B、Cのトラック2を再生してから、それらのアルバムのトラック3を再生する、またはAのトラック1、Bのトラック2、Cのトラック3を再生するようなものです。カントリー、ラップ、ポップサイクル、またはアルファベット順に再生される曲。
  • あまり好きではないアーティストを演奏したり、好きなアーティストを演奏しすぎたりすると、不満が生じます。
  • 曲のサブセットは、以前のイテレーションと同じ順序で再生するべきではありません。同様に、最後のX曲が次の反復の最初のX曲に含まれていてはなりません。

ユーザーは、コレクションを循環して曲を均等に配分してセミランダムに再生する、キュレートされたプレイリストのようなものを本当に望んでいます。これは、単にランダムな曲を選んだり、コレクションをランダムに注文したりするよりもはるかに難しい作業です。これらの多くは、使用および考慮に入れることができる曲に関する十分なメタデータを確立しているため処理できますが、それらのバランスを取ることは困難な作業です。

13
Ryathal

5曲の例では、シャッフルの約59.3%で2つの隣接する曲が順番に再生されます。

リスナーにとってこれはランダムではないように見えます。

それに加えて、いつ再編成するかをどのように決定しますか?ユーザーがデバイスをオフにしてから再びオンにした場合、デバイスは「すでに聞いた」リストをリセットしますか?

しかし、主な理由はスキップです。ユーザーは、好きではない曲をスキップし、シャッフルされたリストを、各曲を聞くように強制された場合よりもはるかに速く進みます。

これは、彼らが「なぜそれが常にRoxetteを選ぶのか?!??!」 「愛であったにちがいない」というコピーよりも一時的に頻繁に、シャッフルされたリストで通常発生します*

* 4/5元のスウェーデン語版、プラグなし版、ライブ版および拡張版が必要です

3
Ewan