csong@9: ''' csong@9: Author: Chunyang Song csong@9: Institution: Centre for Digital Music, Queen Mary University of London csong@9: csong@9: ''' csong@9: csong@9: csong@9: 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@9: syncopation = None csong@9: csong@9: if seq == None or model == None: csong@9: print 'Error: please indicate rhythm sequence and syncopation model.' csong@9: csong@9: elif timesig == None and subdivision_seq == None: csong@9: print 'Error: please indicate either time signature or subdivision sequence.' csong@9: csong@9: else: csong@9: while subdivision_seq == None: csong@9: from BasicFuncs import get_subdivision_seq csong@9: subdivision_seq = get_subdivision_seq(timesig, L_max) csong@9: csong@9: # The get_rhythm_category function is used to detect rhythm category: monorhythm or polyrhythm. csong@9: # For monorhythms, all prime factors of the length of minimum time-span representation of this sequence are csong@9: # elements of its subdivision_seq, otherwise it is polyrhythm; csong@9: # e.g. prime_factors of polyrhythm 100100101010 in 4/4 is [2,3] but subdivision_seq = [1,2,2] for 4/4 csong@9: def get_rhythm_category(): csong@9: rhythm_category = 'mono' csong@9: from BasicFuncs import get_min_timeSpan, find_prime_factors csong@9: for f in find_prime_factors(len(get_min_timeSpan(seq))): csong@9: if not (f in subdivision_seq): csong@9: rhythm_category = 'poly' csong@9: break csong@9: return rhythm_category csong@9: csong@9: rhythm_category = get_rhythm_category() csong@9: csong@9: if model == 'LHL': csong@9: import LHL csong@9: if weight_seq == None: csong@9: weight_seq = range(0,-L_max,-1) csong@9: syncopation = LHL.get_syncopation(seq, subdivision_seq, weight_seq, prebar_seq, rhythm_category) csong@9: elif model == 'PRS': csong@9: import PRS csong@9: syncopation = PRS.get_syncopation(seq, subdivision_seq, postbar_seq, rhythm_category) csong@9: elif model == 'TMC': csong@9: import TMC csong@9: if weight_seq == None: csong@9: weight_seq = range(L_max+1,0,-1) csong@9: syncopation = TMC.get_syncopation(seq, subdivision_seq, weight_seq, L_max, rhythm_category) csong@9: elif model == 'SG': csong@9: import SG csong@9: if weight_seq == None: csong@9: weight_seq = range(L_max+1) csong@9: syncopation = SG.get_syncopation(seq, subdivision_seq, weight_seq, L_max, rhythm_category) csong@9: elif model == 'KTH': csong@9: import KTH csong@9: syncopation = KTH.get_syncopation(seq, timesig, postbar_seq) csong@9: elif model == 'TOB': csong@9: import TOB csong@9: syncopation = TOB.get_syncopation(seq) csong@9: elif model == 'WNBD': csong@9: import WNBD csong@9: if strong_beat_level == None: csong@9: if timesig == '4/4': csong@9: strong_beat_level = 2 csong@9: else: csong@9: strong_beat_level = 1 csong@9: syncopation = WNBD.get_syncopation(seq, subdivision_seq, strong_beat_level, postbar_seq) csong@9: csong@9: else: csong@9: print 'Error: undefined syncopation model.' csong@9: csong@9: return syncopation csong@9: csong@9: # def syncopation_all(rhythm, model, timesig, subdivision_seq = None, weight_seq = None, L_max = 5, strong_beat_level = None): csong@9: # syncopation = 0 csong@9: # # Chope rhythm into seq csong@9: # # ... csong@9: csong@9: # for (seq_perbar in seq): csong@9: # sync_perbar = syncopation_perbar(seq_perbar,model, timesig, subdivision_seq, weight_seq, L_max, strong_beat_level) csong@9: # if sync_perbar != None: csong@9: # syncopation = syncopation + sync_perbar csong@9: csong@9: # return syncopation csong@9: csong@9: csong@9: ### TESTING csong@9: # clave = [1,0,0,1,0,0,1,0,0,0,1,0,1,0,0,0] csong@9: # bf = [0,0,0,1,0,0,0,0,0,0,1,0] csong@9: # rhythm = [0,1,0,1,0,1,0,1] csong@9: # classic1 = [1,0,1,1]*3 + [1,0,0,0] csong@9: # classic2 = [1,0,0,1]*3 + [1,0,0,0] csong@9: # shiko = [1,0,1,1,0,1,1,0] csong@9: # rumba = [1,0,0,1,0,0,0,1,0,0,1,0,1,0,0,0] csong@9: # soukous = [1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0] csong@9: # gahu = [1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0] csong@9: # bossanova = [1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0] csong@9: csong@9: # classic12 = [1,0,0,1,1,1,1,0,0,1,1,1] csong@9: # soli = [1,0,1,0,1,0,1,0,1,1,0,1] csong@9: csong@9: # print sync_perbar(seq = clave, model = 'WNBD', timesig = '4/4')