Re: resume picking items from a previous list
- From: James Stroud <jstroud@xxxxxxxx>
- Date: Sat, 29 Apr 2006 18:28:17 -0700
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']
one = playall_reload(1.00, 20.00, kevins)
two = playall_reload(one, 180, jessicas)
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/
.
- Follow-Ups:
- how not use memmove when insert a object in the list
- From: kyo guan
- Re: resume picking items from a previous list
- From: James Stroud
- how not use memmove when insert a object in the list
- References:
- resume picking items from a previous list
- From: kpp9c
- resume picking items from a previous list
- Prev by Date: Re: Can we create an_object = object() and add attribute like fora class?
- Next by Date: Re: resume picking items from a previous list
- Previous by thread: resume picking items from a previous list
- Next by thread: Re: resume picking items from a previous list
- Index(es):
Relevant Pages
|