annotate Syncopation models/syncopation.py @ 28:5de1cb45c145

Parameters setting implemented.
author csong <csong@eecs.qmul.ac.uk>
date Sun, 12 Apr 2015 22:34:35 +0100
parents df1e7c378ee0
children 3a878de00d19
rev   line source
csong@9 1 '''
csong@9 2 Author: Chunyang Song
csong@9 3 Institution: Centre for Digital Music, Queen Mary University of London
csong@9 4
csong@9 5 '''
csong@9 6
csong@21 7 def sync_perbar_permodel (model, bar, parameters):
csong@21 8 return model.get_syncopation(bar, parameters)
csong@9 9
csong@28 10 def syncopation_barlist_permodel(model, source, parameters):
csong@23 11 total = 0
csong@23 12 numberOfNotes = 0
csong@28 13
csong@28 14
csong@28 15
csong@23 16 for bar in barlist:
csong@23 17 if sync_perbar_permodel(model, bar, parameters) != None:
csong@23 18 total += sync_perbar_permodel(model, bar, parameters)
csong@23 19 numberOfNotes += sum(bar.get_binary_sequence())
csong@23 20 else:
csong@23 21 print 'Bar %d cannot be measured, returning None.' % barlist.index(bar)
csong@23 22
csong@23 23 if model is WNBD:
csong@23 24 total = (float) total/ numberOfNotes
csong@9 25
csong@21 26 # def sync_perbar_permodel(seq, model, timesig = None, subdivision_seq = None, weight_seq = None, L_max = 5, prebar_seq = None, postbar_seq = None, strong_beat_level = None):
csong@21 27 # syncopation = None
csong@9 28
csong@21 29 # if seq == None or model == None:
csong@21 30 # print 'Error: please indicate rhythm sequence and syncopation model.'
csong@21 31
csong@21 32 # elif timesig == None and subdivision_seq == None:
csong@21 33 # print 'Error: please indicate either time signature or subdivision sequence.'
csong@9 34
csong@21 35 # else:
csong@21 36 # while subdivision_seq == None:
csong@21 37 # from basic_functions import get_subdivision_seq
csong@21 38 # subdivision_seq = get_subdivision_seq(timesig, L_max)
csong@9 39
csong@21 40 # # The get_rhythm_category function is used to detect rhythm category: monorhythm or polyrhythm.
csong@21 41 # # For monorhythms, all prime factors of the length of minimum time-span representation of this sequence are
csong@21 42 # # elements of its subdivision_seq, otherwise it is polyrhythm;
csong@21 43 # # e.g. prime_factors of polyrhythm 100100101010 in 4/4 is [2,3] but subdivision_seq = [1,2,2] for 4/4
csong@21 44 # def get_rhythm_category():
csong@21 45 # rhythm_category = 'mono'
csong@21 46 # from basic_functions import get_min_timeSpan, find_prime_factors
csong@21 47 # for f in find_prime_factors(len(get_min_timeSpan(seq))):
csong@21 48 # if not (f in subdivision_seq):
csong@21 49 # rhythm_category = 'poly'
csong@21 50 # break
csong@21 51 # return rhythm_category
csong@9 52
csong@21 53 # rhythm_category = get_rhythm_category()
csong@9 54
csong@21 55 # if model == 'LHL':
csong@21 56 # import LHL
csong@21 57 # if weight_seq == None:
csong@21 58 # weight_seq = range(0,-L_max,-1)
csong@21 59 # syncopation = LHL.get_syncopation(seq, subdivision_seq, weight_seq, prebar_seq, rhythm_category)
csong@21 60 # elif model == 'PRS':
csong@21 61 # import PRS
csong@21 62 # syncopation = PRS.get_syncopation(seq, subdivision_seq, postbar_seq, rhythm_category)
csong@21 63 # elif model == 'TMC':
csong@21 64 # import TMC
csong@21 65 # if weight_seq == None:
csong@21 66 # weight_seq = range(L_max+1,0,-1)
csong@21 67 # syncopation = TMC.get_syncopation(seq, subdivision_seq, weight_seq, L_max, rhythm_category)
csong@21 68 # elif model == 'SG':
csong@21 69 # import SG
csong@21 70 # if weight_seq == None:
csong@21 71 # weight_seq = range(L_max+1)
csong@21 72 # syncopation = SG.get_syncopation(seq, subdivision_seq, weight_seq, L_max, rhythm_category)
csong@21 73 # elif model == 'KTH':
csong@21 74 # import KTH
csong@21 75 # syncopation = KTH.get_syncopation(seq, timesig, postbar_seq)
csong@21 76 # elif model == 'TOB':
csong@21 77 # import TOB
csong@21 78 # syncopation = TOB.get_syncopation(seq)
csong@21 79 # elif model == 'WNBD':
csong@21 80 # import WNBD
csong@21 81 # if strong_beat_level == None:
csong@21 82 # if timesig == '4/4':
csong@21 83 # strong_beat_level = 2
csong@21 84 # else:
csong@21 85 # strong_beat_level = 1
csong@21 86 # syncopation = WNBD.get_syncopation(seq, subdivision_seq, strong_beat_level, postbar_seq)
csong@9 87
csong@21 88 # else:
csong@21 89 # print 'Error: undefined syncopation model.'
csong@9 90
csong@21 91 # return syncopation
csong@9 92
csong@9 93 # def syncopation_all(rhythm, model, timesig, subdivision_seq = None, weight_seq = None, L_max = 5, strong_beat_level = None):
csong@9 94 # syncopation = 0
csong@9 95 # # Chope rhythm into seq
csong@9 96 # # ...
csong@9 97
csong@9 98 # for (seq_perbar in seq):
csong@9 99 # sync_perbar = syncopation_perbar(seq_perbar,model, timesig, subdivision_seq, weight_seq, L_max, strong_beat_level)
csong@9 100 # if sync_perbar != None:
csong@9 101 # syncopation = syncopation + sync_perbar
csong@9 102
csong@9 103 # return syncopation
csong@9 104
csong@9 105
csong@9 106 ### TESTING
csong@9 107 # clave = [1,0,0,1,0,0,1,0,0,0,1,0,1,0,0,0]
csong@9 108 # bf = [0,0,0,1,0,0,0,0,0,0,1,0]
csong@9 109 # rhythm = [0,1,0,1,0,1,0,1]
csong@9 110 # classic1 = [1,0,1,1]*3 + [1,0,0,0]
csong@9 111 # classic2 = [1,0,0,1]*3 + [1,0,0,0]
csong@9 112 # shiko = [1,0,1,1,0,1,1,0]
csong@9 113 # rumba = [1,0,0,1,0,0,0,1,0,0,1,0,1,0,0,0]
csong@9 114 # soukous = [1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0]
csong@9 115 # gahu = [1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0]
csong@9 116 # bossanova = [1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0]
csong@9 117
csong@9 118 # classic12 = [1,0,0,1,1,1,1,0,0,1,1,1]
csong@9 119 # soli = [1,0,1,0,1,0,1,0,1,1,0,1]
csong@9 120
csong@9 121 # print sync_perbar(seq = clave, model = 'WNBD', timesig = '4/4')