' ========================================================================= ' ' File....... uMP3-Music-Player.BS2 ' Purpose.... Random song player ' Author..... Jon Williams -- Parallax, Inc. ' E-mail..... jwilliams@parallax.com ' Started.... 17 OCT 2005 ' Updated.... 21 OCT 2005 ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' ' Randomly plays files from a Rogue Robotics uMP3 player. All songs on ' list will be played before any repeats occur. ' ' Note: Requires uMP3 firmware 110.11 or higher ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- TX PIN 15 ' to uMP3.RX pin RX PIN 14 ' to uMP3.TX pin ' -----[ Constants ]------------------------------------------------------- #SELECT $STAMP #CASE BS2, BS2E, BS2PE T9600 CON 84 #CASE BS2SX, BS2P T9600 CON 240 #CASE BS2PX T9600 CON 396 #ENDSELECT SevenBit CON $2000 Inverted CON $4000 Open CON $8000 Baud CON Open | T9600 NumSongs CON 16 ' songs on uMP3 player SongDelay CON 0000 ' 2 secs between songs #DEFINE TestMode = 0 ' 1 = song title to DEBUG ' -----[ Variables ]------------------------------------------------------- idx VAR Byte ' loop counter theSong VAR Byte ' song number to play lastSong VAR Byte ' last played zCount VAR Byte ' for fast-forward routine eePntr VAR Word ' eeprom pointer char VAR Byte pos VAR Byte ' song position loopNum VAR Byte ' song loop # markers VAR Word ' played markers lottery VAR Word ' random value ' -----[ EEPROM Data ]----------------------------------------------------- MP3s DATA "Away in a Manger", 0 DATA "Choir of Bells", 0 DATA "Dreidel", 0 DATA "Frosty the Snowman", 0 DATA "Grandma Got Ran Over by a Reindeer", 0 DATA "Hark the Harold Angels Sing", 0 DATA "Jingle Bells", 0 DATA "Joy to the World", 0 DATA "Little Drummer Boy", 0 DATA "Let It Snow", 0 DATA "The First Noel", 0 DATA "O Holy Night", 0 DATA "Rudolf the Red Nose Reindeer", 0 DATA "Santa Claus Is Coming to Town", 0 DATA "Silent Night", 0 DATA "Winter Wonderland", 0 ' -----[ Initialization ]-------------------------------------------------- Reset: PAUSE 2000 ' let uMP3 start-up #IF TestMode = 0 #THEN SEROUT TX, Baud, [CR] ' prod SERIN RX, Baud, 250, Reset, [WAIT(">")] ' verify presence #ENDIF lottery = 1225 ' seed random generator GOSUB Reset_Markers ' clear available songs ' -----[ Program Code ]---------------------------------------------------- Main: RANDOM lottery ' toss random generator theSong = lottery // NumSongs ' get song # IF (markers.LOWBIT(theSong) = 1) THEN Main ' retry if played IF (theSong = lastSong) THEN Main ' no repeat on next cycle Play_The_Song: markers.LOWBIT(theSong) = 1 ' mark current song lastSong = theSong ' mark as last played GOSUB Play_MP3 ' play it IF (markers = $FFFF) THEN ' all songs played? GOSUB Reset_Markers ' yes, reset ENDIF PAUSE SongDelay ' break between songs GOTO Main ' -----[ Subroutines ]----------------------------------------------------- Play_MP3: eePntr = MP3s ' start at beginnig IF (theSong > 0) THEN ' fast-fwd to song zCount = 0 ' reset counter DO READ eePntr, char ' read char eePntr = eePntr + 1 ' update pointer IF (char = 0) THEN ' 0? zCount = zCount + 1 ' yes, update count ENDIF LOOP UNTIL (zCount = theSong) ENDIF #IF (TestMode = 0) #THEN SEROUT TX, Baud, ["PC F /"] ' play file in root DO ' send file name READ eePntr, char eePntr = eePntr + 1 IF (char = 0) THEN EXIT SEROUT TX, Baud, [char] LOOP SEROUT TX, Baud, [".MP3", CR] ' send extension PAUSE 500 DO SEROUT TX, Baud, ["PC Z", CR] ' get status SERIN RX, Baud, [char, DEC pos, DEC loopNum] LOOP UNTIL (char = "S") #ELSE DEBUG DEC2 theSong, ": " DO READ eePntr, char eePntr = eePntr + 1 IF (char = 0) THEN EXIT DEBUG char LOOP DEBUG CR #ENDIF RETURN ' ------------------------------------------------------------------------- ' Resets the markers variable based on the number of declared songs ' -- up to 16 Reset_Markers: markers = $FFFF ' mark all played FOR idx = 1 TO NumSongs markers = markers << 1 ' clear available songs NEXT RETURN