Skip navigation
Clotexl
Currently Being Moderated

How to randomize songs in a Flash Jukebox - conntected to an XML databse

Jun 16, 2012 1:30 PM

Tags: #as3 #randomize_songs

Hey there all!,

I have been making a Jukebox in flash but I got stucked at roandomizing the songs - every song must be played randomized before it's allowed to be played a 2nd tim -

Some people told me to do this with an Array, but I am pretty new in this so I have NO CLUE how.

 

Please help me as soon as possible, it's urgent !

 

Heavinly much thanks in Advance

 

p.s: This is the flash code I got for my Jukebox :

 

var my_songs:XMLList;

var my_total:Number;

 

 

var my_sound:Sound;

var my_channel:SoundChannel;

 

 

var current_song:Number = 0;

 

 

var song_position:Number;

var song_paused:Boolean;

 

 

var myXMLLoader:URLLoader = new URLLoader(); // naakt een nieuwe XML loader

myXMLLoader.load(new URLRequest("playlist.xml")); // load playlist.xml

myXMLLoader.addEventListener(Event.COMPLETE, processXML); // event aan maken

 

 

 

 

function processXML (e:Event):void // roept funcite aan

{

          var myXML:XML = new XML(e.target.data);

 

          my_songs = myXML.SONG;

          my_total = my_songs.length();

          playSong(1);

}

 

 

function playSong(mySong:Number):void

{

var myTitle = my_songs[mySong].@TITLE;

var myArtist = my_songs[mySong].@ARTIST;

var myURL = my_songs[mySong].@URL;

 

 

          title_txt.text = myTitle;

          artist_txt.text = myArtist;

 

 

          if (my_channel)

          {

                    my_channel.stop();

          }

 

 

          my_sound = new Sound();

          my_sound.load(new URLRequest(myURL));

          my_channel = my_sound.play();

          my_channel.addEventListener(Event.SOUND_COMPLETE, onNext);

}

 

 

next_btn.addEventListener(MouseEvent.CLICK, onNext);

function onNext(e:Event):void

{

          current_song++;

          if (current_song>=my_total)

          {

                    current_song=0;

          }

          playSong(current_song);

}

 

 

prev_btn.addEventListener(MouseEvent.CLICK, onPrev);

function onPrev(e:MouseEvent):void

{

          current_song--;

          if (current_song<0)

          {

                    current_song = my_total-1;

          }

          playSong(current_song);

}

 

 

pause_btn.addEventListener(MouseEvent.CLICK, onPause);

function onPause(e:MouseEvent):void

{

          if (my_channel)

          {

                    song_position = my_channel.position;

                    my_channel.stop();

                    song_paused=true;

          }

}

play_btn.addEventListener(MouseEvent.CLICK, onPlay);

function onPlay(e:MouseEvent):void

{

          if (song_paused)

          {

                    my_channel = my_sound.play(song_position);

                    song_paused=false;

          }

}

 
Replies
  • Currently Being Moderated
    Jun 16, 2012 2:15 PM   in reply to Clotexl

    What you could do (to keep most of the approach you currently have, it to create a new array that just holds the numbers for the songs and then shuffle that array to randomize it.  The new code is shown in bold below

     

    var singNums:Array = new Array();

     

    function processXML (e:Event):void // roept funcite aan

    {

              var myXML:XML = new XML(e.target.data);

     

              my_songs = myXML.SONG;

              my_total = my_songs.length();

     

     

         for(var i:uint=0; i<my_total; i++){

                   songNums.push(i);  // this just builds an array of numbers [0,1,2,3,4,....]

         }

     

        shuffle(songNums);  // randomizes the numbers in the array

     

        playSong(songNums[current_song] );

     

    }

     

    function shuffle(a:Array) {

        var p:int;

        var t:*;

        var ivar:int;

        for (ivar = a.length-1; ivar>=0; ivar--) {

            p=Math.floor((ivar+1)*Math.random());

            t = a[ivar];

            a[ivar] = a[p];

            a[p] = t;

        }

    }

     
    |
    Mark as:
  • Currently Being Moderated
    Jun 17, 2012 4:18 AM   in reply to Clotexl

    There is a typo in my earlier reply... "singNums" should be "songNums"

     
    |
    Mark as:
  • Currently Being Moderated
    Jun 17, 2012 7:18 AM   in reply to Clotexl

    Anywhere you are calling the playSong function you need to use what I showed in the processXML function...

     

    playSong(songNums[current_song] );   // not: playSong(current_song);

     
    |
    Mark as:
  • Currently Being Moderated
    Jun 17, 2012 9:52 AM   in reply to Clotexl

    You'll have to use the trace() function to follow thru the processing to see where things are not processing as they should.  Try tracing the singNums array before and after shuffling to make sure it is getting shuffled. Then try tracing the calls to the playSong function to see what the value of mySong is.  Keep poking around until you find something that doesn't do what you expect it should..

     
    |
    Mark as:

More Like This

  • Retrieving data ...

Bookmarked By (0)

Answers + Points = Status

  • 10 points awarded for Correct Answers
  • 5 points awarded for Helpful Answers
  • 10,000+ points
  • 1,001-10,000 points
  • 501-1,000 points
  • 5-500 points