resume picking items from a previous list

kpp9c kp8 at mac.com
Sat Apr 29 19:09:00 EDT 2006


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()




More information about the Python-list mailing list