Mercurial > hg > syncopation-dataset
changeset 0:76ce27beba95
Have uploaded the syncopation dataset and audio wavefies.
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/Keith.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,110 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Keith Model ** + +Algorithm: + +Only applicable to binary meter (the number of beats is a power of 2). + +Calculate the duration (IOI) of each note, d; +Round the d down to the nearest power of 2, D; +Check if the start and the end of note are on-beat (whether divisible by D); +If both on-beat, measure = 0; +If start on-beat but end off-beat, measure = 1; +If start off-beat but end on-beat, measure = 2; +If start and end off-beat, measure = 3; +Syncopation is the sum of measures of all notes. + +''' + +from MeterStructure import MeterStructure + +def roundDownPower2(input): + lower = 0 + if input >=0: + i = 0 + lower = pow(2,i) + + while True: + upper = pow(2,i+1) + if lower <= input < upper: + break + else: + lower = upper + i = i+1 + else: + print 'Invalid input: input is negative' + return lower + +def keith(rhythm, time_sig, category, bar): + ms = MeterStructure(time_sig) + circle = ms.getCircle(bar) + l = len(circle) + # mTemplate represents all the metrical positions for bar number of bars and the downbeat position of the following bar. + #For example, the mTemplate for one bar in 4/4 rhythm with lowest level 16th note, mTemplate = [0:16] + mTemplate = range(l+1) + + if len(mTemplate)!=0: + + onsetPos = [] + measures = [] + + ''' + Note that mTemplate is encoded by 8*bar+1- or 16*bar+1-long digits, rhythm is encoded by 48*bar-long digits, + therefore we need to normalize the IOI of onsets to the mTemplate scale, by (pos/len(rhythm))*len(mTemplate) + ''' + + # Locate all the onset, store the position of each note into onsetPos + l = len(rhythm) + for i in range(l): + if rhythm[i] == 1: # onset detected + onsetPos.append(i) + + #Calculate the duration of each onset and round it down to nearest power of 2, store into D + # Then check if the start and end of each onset is on-beat, calculate measures + n = len(onsetPos) + for i in range(n): + start = (onsetPos[i]/ float(l) )* (len(mTemplate)-1) + if i == n-1: + end = mTemplate[-1] # The duration of the last note is the its distance to the first beat in next bar + else: + end = (onsetPos[i+1]/ float (l) ) * (len(mTemplate)-1) # the duration of note is its distance to the next note + + d = end - start + D = roundDownPower2(d) + if start % D ==0 and end % D ==0: + measures.append(0) + elif start % D ==0 and end % D != 0: + measures.append(1) + elif start % D != 0 and end % D == 0: + measures.append(2) + else: + measures.append(3) + + syncopation = sum(measures) + return syncopation + + else: + return -1 + + +# Retrieve the stimuli +f = file('stimuli.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, keith(rhythm, time_sig, category, bar)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/LHL.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,218 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Longuet-Higgins and Lee's Model (LHL) ** + +Algorithm: + +Only applicable to simple rhtyhms. + +Generate tree structure: +1) Time_signature decides sequence of subdivisions: 4/4 - [2,2,2,...2], 3/4 - [3,2,2,...2], 6/8 - [2,3,2,2...2]; +2) If after subdivision, a node has at least one branch that is full rest or one note, then it cannot be subdivided; +3) Weight of node, initialized as 0, decrease by 1 with increasing depth of the tree. + +Assign each node in the tree three attributes - weight, pos, event; +Search for Note-Rest pairs that Note's weight is no more than Rest's weight; +Syncopation for such a pair is the difference in weights; +Total Syncopation value for non-syncopation rhythms is -1; for syncopated rhythms is the sum of syncopation of all notes. + +In order to evaluate LHL models with the others, re-scale LHL's measures to non-negative. +Apart from the immeasuable rhythms, add 1 to each syncopation value. + +''' +from MeterStructure import MeterStructure + +class Node: + def __init__(self, pos, event): + self.pos = pos + self.event = event + + def assignWeight(self, time_sig): + ms = MeterStructure(time_sig) + # Retrieve the LHL meter hierarchy in one bar; + #(e.g. weight = [0, -4, -3, -4, -2, -4, -3, -4, -1, -4, -3, -4, -2, -4, -3, -4] in 4/4 meter) + weights = ms.getLHLWeights(1) + + # find the metrical weight of the note that locates at certain position(self.pos) + # index is the corresponding position of "self.pos" in the "weights" list + index = int(((abs(self.pos)%48)/48.0)*len(weights)) + self.weight = weights[index] + +class Tree: + def __init__(self): + self.nodes = [] + + def add(self, Node): + self.nodes.append (Node) + + def getWeight(self, time_sig): + for n in self.nodes: + n.assignWeight(time_sig) + + def display(self): + print 'Pos, Event, Weight' + for n in self.nodes: + print '%02d %s %02d' % (n.pos, n.event, n.weight) + + +def subdivide(sequence, segments_num): + subSeq = [] + if len(sequence) % segments_num != 0: + print 'Error: rhythm segment cannot be equally subdivided.' + else: + n = len(sequence) / segments_num + start , end = 0, n + for i in range(segments_num): + subSeq.append(sequence[start : end]) + start = end + end = end + n + + return subSeq + + +def eventType (sequence): + if not(1 in sequence): + event = 'R' # Full rest + elif sequence[0] == 1 and not(1 in sequence[1:]): + event = 'N' # Only one on-beat note + else: + event = 'D' # Divisable + + return event + +def splitInto2 (sequence, tree, pos, isRecursive): + + subs = subdivide(sequence, 2) + + for s in subs: + if eventType(s) == 'R' or eventType(s) == 'N': + #print 'test', s, eventType(s), pos + tree.add( Node(pos, eventType(s)) ) + else: + if isRecursive: + #print 'test', s, eventType(s), pos + splitInto2 (s, tree, pos, True) + else: + splitInto3 (s, tree, pos) + + pos = pos + len(sequence) / 2 + + return tree + +def splitInto3 (sequence, tree, pos): + + subs = subdivide(sequence, 3) + + for s in subs: + if eventType(s) == 'R' or eventType(s) == 'N': + #print 'test', s, eventType(s), pos + tree.add( Node(pos, eventType(s)) ) + + else: + splitInto2 (s, tree, pos, True) + + pos = pos + len(sequence) / 3 + + return tree + + +def createTree(rhythm, time_sig, bar): + t = Tree() + # The root is the rhtyhm in a entire bar, has weight 0, at position 0 + weight, pos, event = 0 , 0, eventType(rhythm) + root = Node (pos, event) + if '2/4' in time_sig: + t.add ( Node(-24, 'N') ) # Treat the last metronome beat in the previous bar as a sounded note + + if event == 'D': + t = splitInto2(rhythm, t, pos, True) + else: + t.add (root) + + elif '4/4' in time_sig: + t.add ( Node(-12, 'N') ) # Treat the last metronome beat in the previous bar as a sounded note + + if event == 'D': + t = splitInto2(rhythm, t, pos, True) + else: + t.add (root) + + elif '3/4' in time_sig: + t.add ( Node(-8, 'N') ) # Treat the last metronome beat in the previous bar as a sounded note + + segments = subdivide (rhythm, bar) + + for s in segments: + if eventType(s) == 'D': + t = splitInto3(s, t, pos) + pos = pos + len(rhythm)/bar + + + elif '6/8' in time_sig: + t.add ( Node(-8, 'N') ) # Treat the last metronome beat in the previous bar as a sounded note + + segments = subdivide (rhythm, bar) + + for s in segments: + if eventType(s) == 'D': + t = splitInto2(s, t, pos, False) + pos = pos + len(rhythm)/bar + + else: + print 'This time signature is not defined. Choose between 4/4, 3/4 or 6/8' + + return t + + +def lhl(rhythm, time_sig, category, bar): + measures = [] + + if 'poly' in category: + return -1 + else: + tree = createTree(rhythm, time_sig, bar) + tree.getWeight(time_sig) + #tree.display() + + # find NR-pair that N's weight <= R's weight, add difference in weight to measures[] + N_weight = tree.nodes[0].weight + size = len(tree.nodes) + + for i in range(1, size): + + if tree.nodes[i].event == 'N': + N_weight = tree.nodes[i].weight + + if tree.nodes[i].event == 'R' and tree.nodes[i].weight >= N_weight: + measures.append(tree.nodes[i].weight - N_weight ) + + # Calculate syncopation + if len(measures) == 0: # syncopation of non-syncopated rhythm is -1 + syncopation = -1 + else: + syncopation = sum(measures) # syncopation of syncopated rhythm is the sum of measures[] + + return syncopation + 1 # For evaluation purpose, scale up by 1 to make scores above 0 + + +# Retrieve the stimuli +#f = file('stimuli.txt') +f = file('stimuli_34only.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, lhl(rhythm, time_sig, category, bar) \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/MeterStructure.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,82 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Meter Structure ** + +This class defines metrical hierarchy for a few common-used time-signature, including 2/4, 4/4, 3/4, 6/8. +All methods return results to represent corresponding information for defined number of bars. +The getLJWeights() adopts Lerdahl and Jackendoff metrical hierarchy. The lowest level is the 16th-note level, whose weight is 1. The highest level is bar level. +The getLHLWeights() adopts Louguet-Higgins and Lee metrical hierarchy, which is basically the same as L&J but in negative scale. The highest level is weighted as 0. +The getStrongBeat() is to select the locations of the beats. For example, in 4/4, "strong" beats are all quarter-notes. + +**** To be added in: getPKWeights() + +''' +class MeterStructure: + + def __init__(self,time_sig): # meter hierarchy for 1 bar + self.ts = time_sig + + def getLJWeights(self,bar): + self.lj = [] + if '2/4' in self.ts: + self.lj = [4,1,2,1,3,1,2,1]*bar + elif '4/4' in self.ts: + self.lj = [5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1]*bar + elif '3/4' in self.ts: + self.lj = [4,1,2,1,3,1,2,1,3,1,2,1]*bar + elif '6/8' in self.ts: + self.lj = [4,1,2,1,2,1,3,1,2,1,2,1]*bar + else: + print 'The range of time-signature is limited within {2/4, 4/4, 3/4, 6/8}' + return self.lj + + def getLHLWeights(self,bar): + self.lhl = [] + # lhl weights are the same numbers moved from the + lj = self.getLJWeights(bar) + if len(lj) !=0: + downbeat = max(lj) + for i in lj: + self.lhl.append(i-downbeat) + else: + print 'The range of time-signature is limited within {2/4, 4/4, 3/4, 6/8}' + return self.lhl + + def getPKWeights(self,bar): + self.pk = [] + ''' + ... + ''' + return self.pk + + def getBeats(self,bar): + self.Beats = [] + if '2/4' in self.ts: # Strong beats in one bar in 2/4 are every quarter-note [0,24] + for i in range(2*bar): + self.Beats.append(i*24) + elif '4/4' in self.ts: # Strong beats in one bar 4/4 are every quarter-note [0,12,24,36] + for i in range(4*bar): + self.Beats.append(i*12) + elif '3/4'in self.ts: # Strong beats in one bar in 3/4 are every quarter-note [0,16,32] + for i in range(3*bar): + self.Beats.append(i*16) + elif '6/8' in self.ts: # Strong beats in one bar in 6/8 are every three eighth-note [0,24] + for i in range(2*bar): + self.Beats.append(i*24) + else: + print 'The range of time-signature is limited within {2/4, 4/4, 3/4, 6/8}' + return self.Beats + + def getCircle(self,bar): + self.circle = [] + if '2/4' in self.ts: + self.circle = range(8)*bar # 2/4 meter can be represented by 8-unit-circle (in one bar) + elif '4/4' in self.ts: + self.circle = range(16)*bar # 4/4 meter can be represented by 16-unit-circle (in one bar) + elif '3/4' or '6/8' in self.ts: + self.circle = range(12)*bar # 3/4 or 6/8 meter can be represented by 12-unit-circle (in one bar) + else: + print 'The range of time-signature is limited within {2/4, 4/4, 3/4, 6/8}' + return self.circle
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/PRS.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,316 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Pressing's model ** + +Algorithm: + +Only applicable to simple rhtyhms. + +Generate hierarchical metrical structure for rhythms, they way as same as LHL model; + + +''' + +def subdivide(sequence, segments_num): + subSeq = [] + if len(sequence) % segments_num != 0: + print 'Error: rhythm segment cannot be equally subdivided ' + else: + n = len(sequence) / segments_num + start , end = 0, n + for i in range(segments_num): + subSeq.append(sequence[start : end]) + start = end + end = end + n + + return subSeq + +# To check whether there is a need to continue subdividing and measuring +def checkContinue(sequence, division): + isContinue = False + if len(sequence) % division == 0: + subs = subdivide (sequence, division) + + for s in subs: + if 1 in s[1:]: # If there are still onsets in-between the divisions + isContinue = True + else: + print 'Error: the sequence cannot be equally subdivided!' + return isContinue + +def timeSpanTranscribe(sequence): + l = len(sequence) + transcribe = [] + + if not (1 in sequence): # Full rest + transcribe = [0] + else: + divisor = 1 + while True: + if l%divisor != 0: + divisor = divisor + 1 + else: + sampleStep = l/divisor # how many digits in each segment, divisor also represents the number of segments + template = (([1] + [0]*(sampleStep-1) ) * divisor ) + + sampled = [] + for i in range(l): + sampled.append(sequence[i] and template[i]) + + if sequence == sampled: + break + else: + divisor = divisor + 1 + + subs = subdivide(sequence, divisor) + for s in subs: + transcribe.append(s[0]) + + return transcribe + +# Identify the type of rhythm sequence : 0- null; 1-filled; 2-run; 3-upbeat; 5-syncopated +def syncType (sequence, followed_event): + + # Null is full rest or only one single on-beat note, therefore no 0 in sequence[1:] + if not(1 in sequence[1:]) : + syncType = 0 + + else: + ts = timeSpanTranscribe(sequence) + + # Filled is equally spaced onsets, therefore all 1s in the time span transcribe of the sequence + if not(0 in ts ): + syncType = 1 + # Run is either starting with 1 and end with 0 in time span, or starting with 1 if next bar starts with 0 + elif ts[0] == 1 and ts[-1] == 0: + syncType = 2 + elif followed_event ==0 and ts[0] == 1: + syncType = 2 + # Upbeat requires next bars starting with 1 and at least the last event in time span is 1 + elif followed_event == 1 and ts[-1] == 1: + syncType = 3 + # Syncopated start and end off-beat + elif sequence[0] == 0: + syncType = 5 + else: + print 'Error: un-recognizable syncopation type ', sequence + syncType = None + + return syncType + +def createHierarchy(rhythm, time_sig, bar): + h = [] # A list of lists to record syncopation type(s) in each hierarchy level across bars + s_bar = subdivide (rhythm, bar) + + if '4/4' in time_sig: + + for i in range(bar): + bar_level = s_bar[i] + + if i == bar -1: + followed_event = s_bar[0][0] + else: + followed_event = s_bar[i+1][0] + + h. append ( [syncType(bar_level, followed_event)] ) # Indentify syncopation type at bar level + + if checkContinue(rhythm, 2*bar): + + for i in range(bar): + s_halfBar = subdivide (s_bar[i], 2) + halfBar_h = [] + + for j in range(2): + halfBar_level = s_halfBar[j] + + if j == 1: + followed_event = s_halfBar[0][0] + else: + followed_event = s_halfBar[j+1][0] + + halfBar_h.append (syncType (halfBar_level , followed_event)) + + h.append(halfBar_h) + + if checkContinue(rhythm, 4*bar): + + for i in range(bar): + s_quarter = subdivide (s_bar[i], 4) + quarter_h = [] + + for j in range(4): + quarter_level = s_quarter [j] + + if j == 3: + followed_event = s_quarter[0][0] + else: + followed_event = s_quarter[j+1][0] + + quarter_h. append ( syncType (quarter_level , followed_event) ) # quarter note level + + h.append(quarter_h) + + if checkContinue( rhythm, 8*bar): + + for i in range(bar): + s_eighth = subdivide (s_bar[i], 8) + eighth_h = [] + + for j in range(8): + eighth_level = s_eighth [j] + + if j == 7: + followed_event = eighth_level[0][0] + else: + followed_event = eighth_level[j+1][0] + + eighth_h.append (syncType (eighth_level, followed_event) ) + + h.append(eighth_h) + + + elif '3/4' in time_sig: + size_bar = len(s_bar) + for i in range(size_bar): + bar_level = s_bar[i] + + quarter_h = [] + eighth_h = [] + + if i == size_bar -1: + followed_event = s_bar[0][0] + else: + followed_event = s_bar[i+1][0] + + h. append ( [syncType(bar_level, followed_event)] ) # Indentify syncopation type at bar level + + if checkContinue(bar_level, 3): + s_quarter = subdivide (bar_level, 3) + size_quarter = len(s_quarter) + + for j in range(size_quarter): + quarter_level = s_quarter [j] + + if j == size_quarter -1: + followed_event = s_quarter[0][0] + else: + followed_event = s_quarter[j+1][0] + + quarter_h. append ( syncType (quarter_level , followed_event) ) # quarter note level + + if checkContinue( quarter_level, 2): + s_eighth = subdivide (quarter_level, 2) # eighth note level + size_eighth = len(s_eighth) + + for k in range(size_eighth): + eighth_level = s_eighth [k] + + if k == size_eighth - 1: + followed_event = eighth_level[0][0] + else: + followed_event = eighth_level[k+1][0] + + eighth_h.append (syncType (eighth_level, followed_event) ) + h.append(eighth_h) + + h.append(quarter_h) + + + elif '6/8' in time_sig: + for i in range(bar): + bar_level = s_bar[i] + + if i == bar -1: + followed_event = s_bar[0][0] + else: + followed_event = s_bar[i+1][0] + + h. append ( [syncType(bar_level, followed_event)] ) # Indentify syncopation type at bar level + + if checkContinue(rhythm, 2*bar): + + for i in range(bar): + s_halfBar = subdivide (s_bar[i], 2) + halfBar_h = [] + + for j in range(2): + halfBar_level = s_halfBar [j] + + if j == 1: + followed_event = s_halfBar[0][0] + else: + followed_event = s_halfBar[j+1][0] + + halfBar_h. append ( syncType (halfBar_level , followed_event) ) + + h.append(halfBar_h) + + if checkContinue( rhythm, 6*bar): + + for i in range(bar): + s_eighth = subdivide (s_bar[i], 6) # eighth note level + eighth_h = [] + + for j in range(6): + eighth_level = s_eighth [j] + + if j == 5: + followed_event = eighth_level[0][0] + else: + followed_event = eighth_level[j+1][0] + + eighth_h.append (syncType (eighth_level, followed_event) ) + + h.append(eighth_h) + + else: + print 'This time signature is not defined. Choose between 4/4, 3/4 or 6/8' + + return h + + +def pressing(rhythm, time_sig, category, bar): + sync_oneLevel = [] + + if 'poly' in category: + return -1 + + else: + hierarchy = createHierarchy(rhythm, time_sig, bar) + # print 'h', hierarchy + + if len(hierarchy) != 0: + for h in hierarchy: + sync_oneLevel.append (sum(h) / float(len(h)) ) + + # Syncopation is the sum of averaged syncopation values of each level + syncopation = sum (sync_oneLevel) + + else: + syncopation = 0 + + return syncopation + + +# Retrieve the stimuli +# f = file('stimuli.txt') +f = file('stimuli_34only.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int([4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, pressing(rhythm, time_sig, category, bar) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/SG.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,126 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Sioros and Guedes's Model ** + +Algorithm: + +Only applicable to monorhythms. + +This version of implementation follows the description in authors' 2011 ISMIR paper and assumes each bar of rhythm is looped. +Therefore each bar is calculated seperatedly in a loop-mode and summed up in the end as the total syncopation. + +''' + +from MeterStructure import MeterStructure +from math import pow + +def subdivide(sequence, segments_num): + subSeq = [] + if len(sequence) % segments_num != 0: + print 'Error: rhythm segment cannot be equally subdivided ' + else: + n = len(sequence) / segments_num + start , end = 0, n + for i in range(segments_num): + subSeq.append(sequence[start : end]) + start = end + end = end + n + + return subSeq + + +def sgModel(rhythm, time_sig, category, bar): + ms = MeterStructure(time_sig) + mWeights = ms.getLHLWeights(1) + #print "hierarchy", mWeights + num_onsets = 0 + h_min = min(mWeights) + + syncAbsolute = 0 + syncNormM = 0 + syncNormE = 0 + + if 'poly' in category: + syncAbsolute = -1 + else: + # segment rhythm into bars + rhythm_byBar = subdivide (rhythm, bar) + + def measurePerBar(rhythm): + syncopation = 0 + + def aveNeighbours(index, h): + averages = [] + parameter_k = 0.8 + + def findPre(h_hat): + pre_index = index - 1 + while(mWeights[pre_index] < h_hat): + pre_index = (pre_index - 1)%len(mWeights) + #print "h_hat and pre", h_hat, pre_index + return pre_index + + def findPost(h_hat): + post_index = (index + 1)%len(mWeights) + while(mWeights[post_index] < h_hat): + post_index = (post_index + 1)%len(mWeights) + #print "h_hat and post", h_hat, post_index + return post_index + + def dif(index1,index2): + parameter_beta = 0.5 + pos1 = int(float(index1)/len(mWeights)*48) + pos2 = int(float(index2)/len(mWeights)*48) + dif_v = rhythm[pos1]-rhythm[pos2] + dif_h = abs(mWeights[index1]-mWeights[index2]) + dif = dif_v*(parameter_beta*dif_h/4+1-parameter_beta) + #print 'dif', dif + return dif + + for h_hat in range(h_min,h+1): + ave = ( parameter_k*dif(index,findPre(h_hat))+dif(index,findPost(h_hat)) )/(1+parameter_k) + #print 'ave', ave + averages.append(ave) + + return averages + + for pos in range(len(rhythm)): + if rhythm[pos] != 0: # Onset detected + #num_onsets += 1 + i = int((pos/48.0*len(mWeights))) + h = mWeights[i] + potential = 1 - pow(0.5,(-h)) + #print "intermediate", min(aveNeighbours(i,h)) + syncopation += min(aveNeighbours(i, h))*potential + + return syncopation + + for r in rhythm_byBar: + syncAbsolute = syncAbsolute + measurePerBar(r) + #syncAbsolute /= 2.0 + + return syncAbsolute + +# Retrieve the stimuli +#f = file('stimuli.txt') +#f = file('stimuli_34only.txt') +f = file('clave.txt') + + +#Calculate syncopation for each rhythm pattern +#while True: +for i in range(1): + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + print sti_name, sgModel(rhythm, time_sig, category, bar) \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/TMC.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,72 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Toussaint's Metric Complexity Model ** + +Algorithm: + +Only applicable to monorhythms. + +Define metrical hierarchy by given time signature; +Calculate how many onsets and determine Maximum Metricality Max_Metric; +Calculate the Metrical Simplicity - the weights of all onsets; +Syncopation = Max_Metric - Metric_simplicity. +Output the predicted syncopation score; -1 indicates non-applicable + +''' + +from MeterStructure import MeterStructure + +def metricalModel(rhythm, time_sig, category, bar): + ms = MeterStructure(time_sig) + meter = ms.getLJWeights(bar) + if len(meter) !=0: + + metricalSimplicity = 0 # sum of weights of onsets per bar + maxMetrical = 0 # maximum metricity per bar + onsetCount = 0 # The number of onsets per bar + + if 'poly' in category: # not applicable to polyrhythms + return -1 + + # Calculate metricalSimplicity + else: + l = len(rhythm) + for i in range(l): + if rhythm[i] == 1: # onset detected + pos = int((float(i)/l) *len(meter)) # looking for the metrical position where this note locates + metricalSimplicity = metricalSimplicity+meter[pos] + onsetCount = onsetCount+1 + + # Calculate max metricity + meter.sort(reverse=True) + for i in range(0,onsetCount): + maxMetrical = maxMetrical+meter[i] + + #print 'test', onsetCount, maxMetrical, metricalSimplicity + syncopation = (maxMetrical - metricalSimplicity) + + return syncopation + else: + return -1 + +# Retrieve the stimuli +f = file('stimuli.txt') +#f = file('stimuli_34only.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, metricalModel(rhythm, time_sig, category, bar)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/TOB_ts.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,136 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Offbeat-ness Model - adopt time-span ** + +Algorithm: + +Calculate the representation of timeSpan for each rhythm: +1) Count both onset and metronome as events, and generate new binary digits (24-bit per bar) representing combined events; +2) Among all divisors of 24 - [1,2,3,4,6,8,12,24], Find the minimum divisor N to divide a bar into (24/N) segments, + so that all onsets are on the first digit of any segement; + Take rhythm 100010001000100010000000 for example, divisor 6 gives 4-digit a segment (1000-1000-1000-1000-1000-0000), + all onsets fall on the first digit of segment 1,2,3,4,5; +3) Represent the rhythm sequence in timeSpan format (e.g. the rhythm above becomes 11112) +4) Create N-unit metrical circle. + +The rest is the same as the implemention version 1: +Calculate on-beat positions in the metrical circle: positions can divide the circle equally with divisor(s), 1< divisor < N +Define the onset not locating the on-beat positions the off-beat note; +Syncopation is the total number of off-beat onsets. + +''' + +from MeterStructure import MeterStructure + +# To transcribe rhythm into time span representation and then calcualte the length of circle +def timeSpan(rhythm, time_sig, bar): + ms = MeterStructure(time_sig) + beatPos = ms.getBeats(bar) + metronome = [0]*len(rhythm) + if len(beatPos) !=0: + for b in beatPos: + metronome[b] = 1 + + event = [] # To combine onsets and metronome events, 1 - event, 0 - no event + for i in range(len(rhythm)): + event.append(rhythm[i] or metronome[i]) # logic 'or' is to do combination: 1 or 0 = 1, 1 or 1 = 1, 0 or 0 = 0. + + # To find out how many digits are big enough to represent the note with the shorted duration. + length = 0 + divisors = [] # all the divisors of the length of the rhythm in one bar + l = len(rhythm)/bar + for i in range(1,l): + if l%i ==0: + divisors.append(i) + + for d in divisors: + sampleStep = (len(rhythm)/bar)/d + template = (([1] + [0]*(sampleStep-1) )*d )*bar + + sampled = [] + for i in range(len(event)): + sampled.append(event[i] and template[i]) + + if event == sampled: + length = d + break + + return length + +def metricalCircle(length): + circle = [] + if length != 0: + circle = range(length) + else: + print 'Invalid length of metrical circle' + return circle + +def onBeatPos(circle): + l = len(circle) + divisors = [] + for i in range(2,l): + if l%i ==0: + divisors.append(i) + + onBeat = [] + for d in divisors: + for pos in circle: + if pos%d == 0: + onBeat.append(pos) + + return onBeat + + +def offBeatNess(rhythm, time_sig, category, bar): + N = timeSpan(rhythm, time_sig, bar) + + circle = metricalCircle(N) * bar + + if len(circle)!=0: + + # Calculate on-beat positions within one bar + onBeat = onBeatPos(metricalCircle(N)) + + onBeat.sort() # sort the on-beat positions. This list will have duplicate numbers, but it doesn't affect the following algorithm + + # Calculate how many onsets are off-beat, which represent syncopation + syncopation = 0 + + l = len(rhythm) + for i in range(l): + if rhythm[i] == 1: # onset detected + pos = (float(i)/l)*len(circle) # looking for the metrical position where this note locates + if pos >= len(circle)/2: + pos = pos- len(circle)/2 + + if pos in onBeat: + continue + else: # if the onset is not on-beat, then syncopation increase by 1 + syncopation = syncopation + 1 + + return syncopation + else: + return -1 + + +# Retrieve the stimuli +#f = file('stimuli.txt') +f = file('stimuli_34only.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, offBeatNess(rhythm, time_sig, category, bar)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/TOB_v2.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,81 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Offbeat-ness Model - Version 2, not adopting time span ** + +Algorithm: + +Fix the 4/4 rhythm to 16-unit circle, 6/8 or 3/4 rhythm to 12-unit circle. + +Calculate on-beat positions in the metrical circle: positions can divide the circle equally with divisor(s), 1< divisor < N +Define the onset not locating the on-beat positions the off-beat note; +Syncopation is the total number of off-beat onsets. + +''' + +from MeterStructure import MeterStructure + +def onBeatPos(circle): + l = len(circle) + divisors = [] + for i in range(2,l): + if l%i ==0: + divisors.append(i) + + onBeat = [] + for d in divisors: + for pos in circle: + if pos%d == 0: + onBeat.append(pos) + + return onBeat + +def offBeatNess(rhythm, time_sig, category, bar): + ms = MeterStructure(time_sig) + circle = ms.getCircle(bar) + + if len(circle)!=0: + # Calculate on-beat positions within one bar + onBeat = onBeatPos(ms.getCircle()) + + onBeat.sort() # sort the on-beat positions. This list will have duplicate numbers, but it doesn't affect the following algorithm + + # Calculate how many onsets are off-beat, which represent syncopation + syncopation = 0 + + l = len(rhythm) + for i in range(l): + if rhythm[i] == 1: # onset detected + pos = (float(i)/l)*len(circle) # looking for the metrical position where this note locates + if pos >= len(circle)/2: + pos = pos- len(circle)/2 + if pos in onBeat: + continue + else: + syncopation = syncopation + 1 + + return syncopation + else: + return -1 + + +# Retrieve the stimuli +#f = file('stimuli.txt') +f = file('stimuli_34only.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, offBeatNess(rhythm, time_sig, category, bar)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/WNBD.py Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,90 @@ +''' +Author: Chunyang Song +Institution: Centre for Digital Music, Queen Mary University of London + +** Weighted Note-to-Beat Distance Model (WNBD) ** + +Algorithm: + +Calculate the distance (d) of onset to the nearest strong beat; +Calculate the WNBD measure (w) of each onset; +Syncopation is the sum of WNBD measures divided by the number of onsets. + +''' + +from MeterStructure import MeterStructure + +def WNBD(rhythm, time_sig, category, bar): + + ms = MeterStructure(time_sig) + beat = ms.getBeats(bar) + [len(rhythm)] # the "beat" array include all "strong-beat" positions across all bars, and the downbeat position of the following bar + if len(beat)!=0: + unit = beat[1]-beat[0] # how many digits to represent the length of one beat + + onsetPos = [] # The onset positions + d = [] # The distances of each onset to its nearest strong beat + beatToLeft = [] # The beat indexes of the beats that are to the left of or coincide with each onset + wnbdMeasures = [] # the un-normalized measures of wnbd + + # Calculate the distance of each onset to the nearest strong beat + l = len(rhythm) + for i in range(l): + if rhythm[i] == 1: # onset detected + onsetPos.append(i) + + # find its distance to the nearest strong beat + for j in range(len(beat)-1): + if beat[j]<= i < beat[j+1]: + d1 = abs(i-beat[j]) + d2 = abs(i-beat[j+1]) + d.append( min(d1,d2)/float(unit) ) # Normalize the distance to beat-level + beatToLeft.append(j) + else: + continue + + #Calculate the WNBD measure of each onset + n = len(onsetPos) + for i in range(n): + if d[i] ==0: # If on-beat, measure is 0 + wnbdMeasures.append(0) + else: + if i == n-1: # The last note, then + if beatToLeft[i] == beat[-3]/unit: # if the last note has more than 1- but less than 2-beat distance to the next bar + wnbdMeasures.append(2.0/d[i]) # measure is 2/d, else 1/d + else: + wnbdMeasures.append(1.0/d[i]) + + else: # if its not the last note + if beatToLeft[i+1] == beatToLeft[i] or (beatToLeft[i+1]-beatToLeft[i]==1 and d[i+1]==0): # if this note is no more than 1-beat distance away from the next note + wnbdMeasures.append(1.0/d[i]) + elif beatToLeft[i+1] - beatToLeft[i] == 1 or (beatToLeft[i+1]-beatToLeft[i]==2 and d[i+1]==0): # if this note is no more than 2-beat distance away from the next + wnbdMeasures.append(2.0/d[i]) + else: # if the note is more than 2-beat distance away from the next note + wnbdMeasures.append(1.0/d[i]) + + syncopation = sum(wnbdMeasures)/float(n) + return syncopation + + else: + return -1 + + +# Retrieve the stimuli +f = file('stimuli.txt') +#f = file('stimuli_34only.txt') + +#Calculate syncopation for each rhythm pattern +while True: + line = f.readline().split(';') + if len(line) == 1: + break + else: + sti_name = line[0] + rhythmString = line[1].split() + time_sig = line[2] + category = line[3] + bar = int(line[4]) + + rhythm = map(int,rhythmString[0].split(',')) + + print sti_name, WNBD(rhythm, time_sig, category, bar)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/clave.txt Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,1 @@ +son; 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/stimuli.txt Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,111 @@ +ab; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +ac; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +ad; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +af; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +ag; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +ah; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +aj; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +ak; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +al; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +ba; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +bb; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +bc; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +bd; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +bf; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +bg; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +bh; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +bj; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +bk; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +bl; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +ca; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +cb; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +cc; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +cd; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +cf; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +cg; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +ch; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +cj; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +ck; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +cl; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +da; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +db; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +dc; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +dd; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +df; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +dg; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +dh; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +dj; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +dk; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +dl; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 4/4; poly; 2 +fa; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +fb; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +fc; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +fd; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +ff; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +fg; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +fh; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +fj; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +fk; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +fl; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +ga; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +gb; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +gc; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +gd; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +gf; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +gg; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +gh; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +gj; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +gk; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +gl; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +ha; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +hb; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +hc; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +hd; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +hf; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +hg; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +hh; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +hj; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +hk; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +hl; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +ja; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +jb; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +jc; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +jd; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +jf; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +jg; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +jh; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +jj; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +jk; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +jl; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +ka; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +kb; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +kc; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +kd; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +kf; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +kg; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +kh; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +kj; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +kk; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +kl; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +la; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +lb; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +lc; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +ld; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; poly; 2 +lf; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +lg; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +lh; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +lj; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +lk; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 6/8; mono; 2 +ll; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 6/8; mono; 2 +abab; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +adad; 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +baba; 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +bbbb; 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +bcbc; 0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +bdbd; 0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +cbcb; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +cdcd; 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +dada; 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +dbdb; 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2 +dcdc; 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 4/4; mono; 2 +dddd; 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0; 4/4; mono; 2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Syncopation models/stimuli_34only.txt Fri Mar 21 15:49:46 2014 +0000 @@ -0,0 +1,36 @@ +ff; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +fg; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +fh; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +fj; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +fk; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +fl; 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +gf; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +gg; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +gh; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +gj; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +gk; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +gl; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +hf; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +hg; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +hh; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +hj; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +hk; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +hl; 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +jf; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +jg; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +jh; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +jj; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +jk; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +jl; 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +kf; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +kg; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +kh; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +kj; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +kk; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +kl; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +lf; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +lg; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +lh; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +lj; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2 +lk; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 3/4; mono; 2 +ll; 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0; 3/4; mono; 2