diff Syncopation models/PRS.py @ 12:4acddc008048

Revised LHL and PRS model's argument list; refactored the variable names
author csong <csong@eecs.qmul.ac.uk>
date Fri, 03 Apr 2015 16:38:32 +0100
parents 031e2ccb1fb6
children 9030967a05f8
line wrap: on
line diff
--- a/Syncopation models/PRS.py	Fri Apr 03 11:41:01 2015 +0100
+++ b/Syncopation models/PRS.py	Fri Apr 03 16:38:32 2015 +0100
@@ -3,54 +3,67 @@
 Institution: Centre for Digital Music, Queen Mary University of London
 '''
 
-from BasicFuncs import repeat, subdivide, ceiling, get_min_timeSpan
+from basic_functions import repeat, subdivide, ceiling, get_min_timeSpan, get_rhythm_category
 
-def get_cost(seq,next_seq):
-	seq = get_min_timeSpan(seq)					# converting to the minimum time-span format
+def get_cost(sequence,nextSequence):
+	sequence = get_min_timeSpan(sequence)					# converting to the minimum time-span format
 	
-	if seq[1:] == repeat([0],len(seq)-1):		# null prototype
+	if sequence[1:] == repeat([0],len(sequence)-1):		# null prototype
 		cost = 0
-	elif seq == repeat([1],len(seq)):			# filled prototype
+	elif sequence == repeat([1],len(sequence)):			# filled prototype
 		cost = 1
-	elif seq[0] == 1 and seq[-1] == 0:			# run1 prototype
+	elif sequence[0] == 1 and sequence[-1] == 0:			# run1 prototype
 		cost = 2
-	elif seq[0] == 1 and (next_seq == None or next_seq[0] == 0):	# run2 prototype
+	elif sequence[0] == 1 and (nextSequence == None or nenextSequencext_seq[0] == 0):	# run2 prototype
 		cost = 2
-	elif seq[0] == 1 and seq[-1] == 1 and next_seq != None and next_seq[0] == 1:		# upbeat prototype
+	elif sequence[0] == 1 and sequence[-1] == 1 and nextSequence != None and nextSequence[0] == 1:		# upbeat prototype
 		cost = 3
-	elif seq[0] == 0:							# syncopated prototype
+	elif sequence[0] == 0:							# syncopated prototype
 		cost = 5
 
 	return cost
 
 # This function calculates the syncopation value (cost) for the sequence with the postbar_seq for a certain level. 
-def syncopation_perlevel(sub_seqs, num_subs):
+def syncopation_perlevel(subSequences):
 	total = 0
-	for l in range(num_subs):
-		total = total + get_cost(sub_seqs[l], sub_seqs[l+1])
-	normalised = float(total)/num_subs
+	for l in range(len(subSequences)-1):
+		total = total + get_cost(subSequences[l], subSequences[l+1])
+	normalised = float(total)/(len(subSequences)-1)
 	
 	return normalised
 
-# This function calculates the overall syncopation value for a bar of sequence..
-def get_syncopation(seq,subdivision_seq, postbar_seq, rhythm_category):
+#def get_syncopation(seq,subdivision_seq, postbar_seq, rhythm_category):
+def get_syncopation(bar, weightSequence = None, LMax = None):
+	'''
+	The get_syncopation function calculates the overall syncopation value for a bar of sequence.
+	'''
 	syncopation = None
-	if rhythm_category == 'poly':
-		print 'Error: PRS model cannot deal with polyrhythms.'
+
+	binarySequence = bar.get_binary_sequence()
+	subdivisionSequence = bar.get_subdivision_sequence()
+
+	if get_rhythm_category(binarySequence, subdivisionSequence) == 'poly':
+		print 'Warning: PRS model detects polyrhythms so returning None.'
 	else:
 		syncopation = 0
 
-		current_num_subs = 1	# the initial number of sub-sequences at a certain metrical level
-		for subdivisor in subdivision_seq:
+		if bar.get_next_bar() != None:
+			nextbarBinarySequence = bar.get_next_bar().get_binary_sequence()
+		else:
+			nextbarBinarySequence = None
+
+		# the initial number of sub-sequences at a certain metrical level
+		numberOfSubSeqs = 1	
+		for subdivisor in subdivisionSequence:
 			# the number of sub-sequence at the current level is product of all the subdivisors up to the current level
-			current_num_subs = current_num_subs * subdivisor
+			numberOfSubSeqs = numberOfSubSeqs * subdivisor
 			# recursion stops when the length of sub-sequence is less than 2
-			if len(seq)/current_num_subs >= 2:		
+			if len(binarySequence)/numberOfSubSeqs >= 2:		
 				# generate sub-sequences and append the next bar sequence
-				sub_seqs = subdivide(ceiling(seq), current_num_subs)	
-				sub_seqs.append(postbar_seq)
+				subSequences = subdivide(ceiling(binarySequence), numberOfSubSeqs)	
+				subSequences.append(nextbarBinarySequence)
 				# adding syncopation at each metrical level to the total syncopation
-				syncopation += syncopation_perlevel(sub_seqs, current_num_subs)	
+				syncopation += syncopation_perlevel(subSequences)	
 			else:
 				break