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@21: def sync_perbar_permodel (model, bar, parameters): csong@21: return model.get_syncopation(bar, parameters) csong@9: csong@21: # def syncopation_barlist_permodel(model, barlist, parameters): csong@9: csong@21: # 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: # syncopation = None csong@9: csong@21: # if seq == None or model == None: csong@21: # print 'Error: please indicate rhythm sequence and syncopation model.' csong@21: csong@21: # elif timesig == None and subdivision_seq == None: csong@21: # print 'Error: please indicate either time signature or subdivision sequence.' csong@9: csong@21: # else: csong@21: # while subdivision_seq == None: csong@21: # from basic_functions import get_subdivision_seq csong@21: # subdivision_seq = get_subdivision_seq(timesig, L_max) csong@9: csong@21: # # The get_rhythm_category function is used to detect rhythm category: monorhythm or polyrhythm. csong@21: # # For monorhythms, all prime factors of the length of minimum time-span representation of this sequence are csong@21: # # elements of its subdivision_seq, otherwise it is polyrhythm; csong@21: # # e.g. prime_factors of polyrhythm 100100101010 in 4/4 is [2,3] but subdivision_seq = [1,2,2] for 4/4 csong@21: # def get_rhythm_category(): csong@21: # rhythm_category = 'mono' csong@21: # from basic_functions import get_min_timeSpan, find_prime_factors csong@21: # for f in find_prime_factors(len(get_min_timeSpan(seq))): csong@21: # if not (f in subdivision_seq): csong@21: # rhythm_category = 'poly' csong@21: # break csong@21: # return rhythm_category csong@9: csong@21: # rhythm_category = get_rhythm_category() csong@9: csong@21: # if model == 'LHL': csong@21: # import LHL csong@21: # if weight_seq == None: csong@21: # weight_seq = range(0,-L_max,-1) csong@21: # syncopation = LHL.get_syncopation(seq, subdivision_seq, weight_seq, prebar_seq, rhythm_category) csong@21: # elif model == 'PRS': csong@21: # import PRS csong@21: # syncopation = PRS.get_syncopation(seq, subdivision_seq, postbar_seq, rhythm_category) csong@21: # elif model == 'TMC': csong@21: # import TMC csong@21: # if weight_seq == None: csong@21: # weight_seq = range(L_max+1,0,-1) csong@21: # syncopation = TMC.get_syncopation(seq, subdivision_seq, weight_seq, L_max, rhythm_category) csong@21: # elif model == 'SG': csong@21: # import SG csong@21: # if weight_seq == None: csong@21: # weight_seq = range(L_max+1) csong@21: # syncopation = SG.get_syncopation(seq, subdivision_seq, weight_seq, L_max, rhythm_category) csong@21: # elif model == 'KTH': csong@21: # import KTH csong@21: # syncopation = KTH.get_syncopation(seq, timesig, postbar_seq) csong@21: # elif model == 'TOB': csong@21: # import TOB csong@21: # syncopation = TOB.get_syncopation(seq) csong@21: # elif model == 'WNBD': csong@21: # import WNBD csong@21: # if strong_beat_level == None: csong@21: # if timesig == '4/4': csong@21: # strong_beat_level = 2 csong@21: # else: csong@21: # strong_beat_level = 1 csong@21: # syncopation = WNBD.get_syncopation(seq, subdivision_seq, strong_beat_level, postbar_seq) csong@9: csong@21: # else: csong@21: # print 'Error: undefined syncopation model.' csong@9: csong@21: # 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')