Re: resume picking items from a previous list



kpp9c wrote:
I have a several list of songs that i pick from, lets, say that there
are 10 songs in each list and there are 2 lists.

For a time i pick from my songs, but i only play a few of the songs in
that list... now my wife, Jessica Alba, comes home, and i start playing
from Jessica's list of songs. After playing a few songs, Jessica, who
needs her beauty sleep, goes to bed, and i start my play loop which
starts picking from my songs again...

The wrinkle:
only now i want it to pick first from among the 6 songs yet not played
from the first time around, and *then* when the list is exhausted,
shuffle the whole original list of songs and start again.

Here is some working but hilariously bad code that does most of this
funny biz... I've gotten this far, but can't figure out how to get the
loops to keep track of what was played and what wasn't and how to
pick-up the list where it left off.

I know this is a dumb thing to want to do, but you know, being married
to bona-fide star is not easy.

# -----------------------------------------------------------
#!/usr/bin/env python

import random
import os

def shuffleloop(iterable):
"""An iterator like itertools cycle, which returns elements from the
iterable and saves a copy of each. When the iterable is
exhausted, it return elements from the saved copy.

The added wrinkle here is that the saved copy is randomly shuffled.
Repeats indefinitely."""
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
random.shuffle(saved)
for element in saved:
yield element

def playall_reload(startime, playdur, smpl_lst):
'''a loop that shuffles and plays all sounds in a list. If the
sequence is exhausted the list is reloaded, re-shuffled, and plyed
through
again. It does this as many times as needed to fill the time
specified.

Also returns the end of the last duration so that the begining of the
next
section can be fed to the next function or loop.
'''
event = 0; incr = 0; lst_len = len(smpl_lst)
random.shuffle(smpl_lst)
smpl_loop = shuffleloop(smpl_lst)
endpoint = startime + playdur
while startime < endpoint:
sample = smpl_loop.next()
splt = os.path.split(sample)
# get the duration of the current soundfile
# (hard wire it for now)
#incr = DUR()
dur = 10
#load the sample & play it
#
# input(sample)
# PLAY(startime, dur)
#
print "event %d @ %.4f --> [%s] dur: %.4f" % (event+1, startime,
splt[1], dur)
incr = dur
startime = startime + incr
event = event + 1
if (event < lst_len):
print "\n\n*** Heads-up yo: <the input sequence was not exhausted>
***\n\n"
return startime


def test():
kevins = ['/Users/kevin/snd/songs/loveisintheair.aif',
'/Users/kevin/snd/songs/boymeetsgirl.aif',
'/Users/kevin/snd/songs/yourcheatingheart.aif',
'/Users/kevin/snd/songs/kindletheflame.aif',
'/Users/kevin/snd/songs/mywifeissohot.aif',
'/Users/kevin/snd/songs/haha.aif',
'/Users/kevin/snd/songs/blueberryorstrawberry.aif',
'/Users/kevin/snd/songs/didyoupaytheelectricbill.aif',
'/Users/kevin/snd/songs/whereistheremote.aif',
'/Users/kevin/snd/songs/youspenthowmuchforthoseshoes.aif']

jessicas = ['/Users/kevin/snd/quiet_songs/iloveu.aif',
'/Users/kevin/snd/quiet_songs/uloveme.aif',
'/Users/kevin/snd/quiet_songs/wearehappy.aif',
'/Users/kevin/snd/quiet_songs/wearesad.aif',
'/Users/kevin/snd/quiet_songs/letsbreakup.aif',
'/Users/kevin/snd/quiet_songs/letsgetbacktogether.aif',
'/Users/kevin/snd/quiet_songs/walkinthesunshine.aif',
'/Users/kevin/snd/quiet_songs/iloveutruly.aif',
'/Users/kevin/snd/quiet_songs/whosefootisthat.aif',
'/Users/kevin/snd/quiet_songs/ohbaby.aif']

print
one = playall_reload(1.00, 20.00, kevins)
print
two = playall_reload(one, 180, jessicas)
print
three = playall_reload(two, 40.00, kevins)

if __name__ == '__main__':
test()


I didn't read your code, but a class might make it simpler:

class Playah(object):
def __init__(self, playlist):
self.playlist = playlist
self.reset()
def reset(self):
self._order = randrange(len(self.playlist))
self._i = 0
def next():
song = self.playlist(self._i)
self._i += 1
if self._i > len(self.playlist):
self.reset()
return song

You could probably make it an iterable if you tried.

James


--
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095

http://www.jamesstroud.com/
.



Relevant Pages

  • Re: Springsteen Top 30
    ... List your all-time Top 30 Bruce songs, ... So let's see those lists! ... Land Of Hope And Dreams ... New York City Serenade ...
    (rec.music.artists.springsteen)
  • Re: resume picking items from a previous list
    ... are 10 songs in each list and there are 2 lists. ... For a time i pick from my songs, but i only play a few of the songs in ... #incr = DUR() ...
    (comp.lang.python)
  • Re: Springsteen Top 30
    ... List your all-time Top 30 Bruce songs, ... So let's see those lists! ... Land Of Hope And Dreams ... Working On The Highway ...
    (rec.music.artists.springsteen)
  • Re: Springsteen Top 30
    ... List your all-time Top 30 Bruce songs, ... So let's see those lists! ... It's Hard To Be A Saint In The City ... Land Of Hope And Dreams ...
    (rec.music.artists.springsteen)
  • Re: List : The Definitive Geeta Dutt
    ... of ten celebrated songs that define the range of a singer and also ... I would welcome your lists too. ... Another interesting exercise would be to list the very best of Geeta ... Here is my list of rare Geeta Dutt songs from the archives. ...
    (rec.music.indian.misc)