def _make_files(self): self._setup_controller() #K = 0.01 K = 0.0 K_main = 0.05 def make_file_force(bow_force, fmi, count): self.controller.set_stable_K(self.st, self.dyn, fmi, K) self.controller.set_stable_K_main(self.st, self.dyn, fmi, K_main) finger_midi = basic_training.FINGER_MIDIS[fmi] # FIXME: oh god ick ap = vivi_types.AudioParams( self.st, finger_midi, dynamics.get_distance(self.inst_type, self.dyn), bow_force, dynamics.get_velocity(self.inst_type, self.dyn)) attack_filename = self.files.make_attack_filename( self.taskname, ap, count) #print attack_filename self.controller.reset() self.controller.filesNew(attack_filename, self.st) self.controller.comment( "verify inst %i st %i dyn %i finger_midi %.3f" % (self.inst_type, self.st, self.dyn, finger_midi)) begin = vivi_controller.NoteBeginning() begin.physical.string_number = self.st begin.physical.dynamic = self.dyn begin.physical.finger_position = utils.midi2pos(finger_midi) begin.physical.bow_force = bow_force begin.physical.bow_bridge_distance = dynamics.get_distance( self.inst_type, self.dyn) begin.physical.bow_velocity = dynamics.get_velocity( self.inst_type, self.dyn) end = vivi_controller.NoteEnding() #end.keep_bow_velocity = True for bow_direction in [1, -1, 1, -1]: self.controller.reset(True) begin.physical.bow_velocity *= bow_direction #begin.physical.bow_force = bow_force #begin.keep_ears = False #begin.keep_bow_force = False #self.controller.note(begin, ATTACK_LENGTH, end) #begin.physical.bow_force = bow_force*0.8 #begin.keep_ears = True #begin.keep_bow_force = True #self.controller.note(begin, STABLE_LENGTH-ATTACK_LENGTH, end) self.controller.note(begin, STABLE_LENGTH, end) self.controller.filesClose() #self.process_step.emit() return attack_filename def split_cats(cats): #notes = [[],[]] notes = [[], [], [], []] notes_i = -1 prev = None for i, cat in enumerate(cats): if cat is None: continue if cat == vivi_defines.CATEGORY_WAIT: continue if cat == vivi_defines.CATEGORY_NULL: prev = None continue if prev is None: notes_i += 1 prev = cat notes[notes_i].append(cat) return notes def get_cats(basename): nac = note_actions_cats.NoteActionsCats() nac.load_file(basename, self.files) #to_find = "finger_midi %i" % basic_training.FINGER_MIDIS[self.fm] to_find = "finger_midi" nac.load_note(to_find, full=True) cats = [b for a, b in nac.get_note_cats()] #att = self.portion_attack(cats_means) #att = cats_means # consider entire note #cost = self.get_cost(att) notes = split_cats(cats) return notes def process_cats(cats): #print len(cats) mean = numpy.mean(cats) return mean # #std = numpy.std(cats) # #exit(1) # #if std > 0.5: # return 0 # if mean < -0.5: # direction = -1 # elif mean > 0.5: # direction = 1 # else: # direction = 0 # return direction def handle_finger(fmi): files = [] init = self.force_init[fmi] #low = scipy.stats.gmean( [init[0], init[1]]) #high = scipy.mean( [init[1], init[2]]) low = init[0] #if low < 0.01: # low = 0.01 high = init[2] # sanity check lows = [] highs = [] mids = [] low_files = [] high_files = [] lows.append(low) highs.append(high) for count in range(1, self.REPS + 1): low_filename = make_file_force(low, fmi, count) low_cats = [] low_cats.extend(sum(get_cats(low_filename), [])) low_direction = process_cats(low_cats) low_files.append((low, low_filename, low_direction)) high_filename = make_file_force(high, fmi, count) high_cats = [] high_cats.extend(sum(get_cats(high_filename), [])) high_direction = process_cats(high_cats) high_files.append((high, high_filename, high_direction)) #print low_direction, high_direction if low_direction > LOW_MEAN_ACCEPTED or high_direction < HIGH_MEAN_ACCEPTED: #print "PANIC: fail to begin attack search" self.verify_good = False self.process_step.emit() self.process_step.emit() def process(force, fmi, lows, mids, highs, low_files, high_files): #print "%.3f\t%.3f\t%.3f" % ( # low, force, high) these_files = [] directions = [] for count in range(1, self.REPS + 1): mid_filename = make_file_force(force, fmi, count) mid_cats = get_cats(mid_filename) mid_direction1 = process_cats(mid_cats[0]) mid_direction2 = process_cats(mid_cats[1]) mid_direction = numpy.mean( (mid_direction1, mid_direction2)) #if mid_direction1 != mid_direction2: # mid_direction1 = 0 these_files.append((force, mid_filename, mid_direction)) directions.append(mid_direction1) if numpy.mean(directions) < LOW_MEAN_ACCEPTED: lows.append(force) #low_files = these_files low_files.extend(these_files) #print "low" elif numpy.mean(directions) > HIGH_MEAN_ACCEPTED: highs.append(force) #high_files = these_files high_files.extend(these_files) #print "high" else: mids.append(force) files.extend(these_files) #print "mid" for count in range(self.REPS): self.process_step.emit() return low_files, high_files while len(mids) == 0: if (len(lows) + len(highs) + len(mids)) >= STEPS: break #force = numpy.mean( (max(lows), min(highs)) ) force = scipy.stats.gmean((max(lows), min(highs))) #print "init", fmi, max(lows), force, min(highs) low_files, high_files = process(force, fmi, lows, mids, highs, low_files, high_files) while True: if (len(lows) + len(highs) + len(mids)) >= STEPS: break #print max(lows), min(mids), max(mids), min(highs) lowdistrel = min(mids) / max(lows) highdistrel = min(highs) / max(mids) #print lowdistrel, highdistrel if lowdistrel > highdistrel: force = scipy.stats.gmean((max(lows), min(mids))) force *= random.uniform(0.95, 1.05) else: force = scipy.stats.gmean((max(mids), min(highs))) force *= random.uniform(0.95, 1.05) #print "main", max(lows), min(mids), max(mids), min(highs) #print "new force:\t", force # do force low_files, high_files = process(force, fmi, lows, mids, highs, low_files, high_files) files.extend(low_files) files.extend(high_files) files.sort() if len(mids) == 1: mids.append(mids[0] * 1.05) elif len(mids) == 0: mids.append(max(lows)) mids.append(min(highs)) self.verify_good = False #self.mids[fmi] = [ min(mids), max(mids) ] self.mids[fmi] = [max(lows), min(highs)] #mids.sort() #print mids return files self.kept_files = [[], [], []] self.mids = [[], [], []] for fmi in range(3): #print '-------------- ', fmi self.kept_files[fmi] = handle_finger(fmi) #print self.mids[fmi] #handle_finger(1, self.kept_files[1]) #handle_finger(2, self.kept_files[2]) #print self.kept_files #print self.mids return #print self.forces #import scipy.special #agm = scipy.special.agm(min(self.forces), max(self.forces)) #agm /= 4.0 #mid = (min(self.forces) + max(self.forces)) / 2 #mid /= 8.0 #lower = list(numpy.linspace(min(self.forces), mid, STEPS/2+1)) ###upper = list(numpy.linspace(agm, max(self.forces), STEPS/2+2))[:-1] #upper = list(numpy.exp( # numpy.linspace( # numpy.log(mid), # numpy.log(max(self.forces)), # STEPS/2+1))) #self.test_range = list(set(lower + upper)) #self.test_range = list(numpy.linspace(min(self.forces), # max(self.forces), STEPS)) #self.test_range = list(numpy.exp( #numpy.linspace( # numpy.log(min(self.forces)), # numpy.log(max(self.forces)), # STEPS))) #print "TEST:", self.test_range #print "fmi:", self.finger_midi_index #print self.forces #self.test_range = self._make_forces(self.forces, 7) self.test_range = [] #forces = self.test_range #self.test_range = numpy.array([forces[0], forces[1], forces[2], # forces[4], # forces[6], forces[7], forces[8]]) #forces = self.test_range K = 1.0 self.controller.set_stable_K(self.st, self.dyn, K) for fmi, finger_midi in enumerate(FINGERS): test_forces = self._make_forces(self.forces[fmi], 9) test_forces = test_forces[3:6] self.test_range.extend(list(test_forces)) #print self.test_range for count in range(self.REPS): # ick #fmi = self.finger_midi_index #finger_midi = self.finger_midi #finger_midi = basic_training.FINGER_MIDIS[fmi] #test_forces = numpy.append(numpy.linspace( # self.forces[fmi][0], # self.forces[fmi][1], # num=3, endpoint=False), # numpy.linspace( # self.forces[fmi][1], # self.forces[fmi][2], # num=4, endpoint=True)) #for a in test_forces: # print "%.3f " % a, #print #test_forces = self.test_range #print test_forces #for fmi, finger_midi in enumerate(basic_training.FINGER_MIDIS): for bow_force in test_forces: audio_params = vivi_types.AudioParams( self.st, finger_midi, dynamics.get_distance(self.inst_type, self.dyn), bow_force, dynamics.get_velocity(self.inst_type, self.dyn)) verify_filename = self.files.make_verify_filename( self.taskname, audio_params, count) #print verify_filename self.controller.filesNew(verify_filename) self.controller.comment( "verify int %i st %i dyn %i finger_midi %.3f" % (self.inst_type, self.st, self.dyn, finger_midi)) begin = vivi_controller.NoteBeginning() vivi_types.audio_params_to_physical( audio_params, self.dyn, begin.physical) end = vivi_controller.NoteEnding() end.keep_bow_velocity = True #for bow_direction in [1, -1]: # begin.physical.bow_velocity *= bow_direction # self.controller.note(begin, STABLE_LENGTH, end) #print "Starting note, force:", bow_force self.controller.note(begin, STABLE_LENGTH, end) self.controller.filesClose() self.process_step.emit()
def _make_files(self): self._setup_controller() #Ks = numpy.linspace(1.0, 2.5, STEPS_X) # skip K=1.0 #Ks = numpy.exp(numpy.linspace( # numpy.log(self.LOW_INIT), # numpy.log(self.HIGH_INIT), # STEPS_X+1))[1:] Ks = numpy.exp(numpy.linspace( numpy.log(self.LOW_INIT), numpy.log(self.HIGH_INIT), STEPS_Y)) #f = self.force_init #forces = [ 0.25*f, 0.5*f, f, 2*f, 4*f ] #forces = [ 0.5*f, f, 2*f ] #forces = self._make_forces(self.force_init, num=9) #forces = [forces[3], forces[4], forces[5]] #forces = numpy.linspace(forces[4], forces[5], num=3) #self.forces_initial = forces #print forces self.forces_init_used = [] #emits = 0 for fmi, finger_midi in enumerate(basic_training.FINGER_MIDIS): #forces = self._make_forces(self.forces_initial[fmi], 9) #forces = numpy.linspace(forces[4], forces[6], num=3, # endpoint=True) #forces = [1.2, 1.35, 1.5] forces = numpy.linspace( self.forces_initial[fmi][1], self.forces_initial[fmi][1] + self.forces_initial[fmi][0], num=3, endpoint=True) #print forces self.forces_init_used.extend(forces) for K in Ks: for bow_force in forces: for count in range(self.REPS): audio_params = vivi_types.AudioParams( self.st, finger_midi, dynamics.get_distance(self.inst_type, self.dyn), bow_force, dynamics.get_velocity(self.inst_type, self.dyn)) stable_filename = self.files.make_stable_filename( audio_params, K, count+1) self.controller.set_stable_K(self.st, self.dyn, K) self.controller.filesNew(stable_filename) self.controller.comment( "stable inst %i st %i dyn %i finger_midi %.3f" % (self.inst_type, self.st, self.dyn, finger_midi)) begin = vivi_controller.NoteBeginning() vivi_types.audio_params_to_physical( audio_params, self.dyn, begin.physical) end = vivi_controller.NoteEnding() #end.keep_bow_velocity = True for bow_direction in [1, -1]: begin.physical.bow_velocity *= bow_direction self.controller.note(begin, STABLE_LENGTH, end) self.controller.filesClose() #emits += 1 #print "emit: %i / %i" % (emits, self.steps_full()) self.process_step.emit()
def _make_files(self): self._setup_controller() #K = 0.01 K = 0.0 K_main = 0.05 def make_file_force(bow_force, fmi, count): self.controller.set_stable_K(self.st, self.dyn, fmi, K) self.controller.set_stable_K_main(self.st, self.dyn, fmi, K_main) finger_midi = basic_training.FINGER_MIDIS[fmi] # FIXME: oh god ick ap = vivi_types.AudioParams( self.st, finger_midi, dynamics.get_distance(self.inst_type, self.dyn), bow_force, dynamics.get_velocity(self.inst_type, self.dyn)) attack_filename = self.files.make_attack_filename( self.taskname, ap, count) #print attack_filename self.controller.reset() self.controller.filesNew(attack_filename, self.st) self.controller.comment("verify inst %i st %i dyn %i finger_midi %.3f" % (self.inst_type, self.st, self.dyn, finger_midi)) begin = vivi_controller.NoteBeginning() begin.physical.string_number = self.st begin.physical.dynamic = self.dyn begin.physical.finger_position = utils.midi2pos(finger_midi) begin.physical.bow_force = bow_force begin.physical.bow_bridge_distance = dynamics.get_distance( self.inst_type, self.dyn) begin.physical.bow_velocity = dynamics.get_velocity( self.inst_type, self.dyn) end = vivi_controller.NoteEnding() #end.keep_bow_velocity = True for bow_direction in [1, -1, 1, -1]: self.controller.reset(True) begin.physical.bow_velocity *= bow_direction #begin.physical.bow_force = bow_force #begin.keep_ears = False #begin.keep_bow_force = False #self.controller.note(begin, ATTACK_LENGTH, end) #begin.physical.bow_force = bow_force*0.8 #begin.keep_ears = True #begin.keep_bow_force = True #self.controller.note(begin, STABLE_LENGTH-ATTACK_LENGTH, end) self.controller.note(begin, STABLE_LENGTH, end) self.controller.filesClose() #self.process_step.emit() return attack_filename def split_cats(cats): #notes = [[],[]] notes = [[],[],[],[]] notes_i = -1 prev = None for i, cat in enumerate(cats): if cat is None: continue if cat == vivi_defines.CATEGORY_WAIT: continue if cat == vivi_defines.CATEGORY_NULL: prev = None continue if prev is None: notes_i += 1 prev = cat notes[notes_i].append(cat) return notes def get_cats(basename): nac = note_actions_cats.NoteActionsCats() nac.load_file(basename, self.files) #to_find = "finger_midi %i" % basic_training.FINGER_MIDIS[self.fm] to_find = "finger_midi" nac.load_note(to_find, full=True) cats = [ b for a,b in nac.get_note_cats() ] #att = self.portion_attack(cats_means) #att = cats_means # consider entire note #cost = self.get_cost(att) notes = split_cats(cats) return notes def process_cats(cats): #print len(cats) mean = numpy.mean(cats) return mean # #std = numpy.std(cats) # #exit(1) # #if std > 0.5: # return 0 # if mean < -0.5: # direction = -1 # elif mean > 0.5: # direction = 1 # else: # direction = 0 # return direction def handle_finger(fmi): files = [] init = self.force_init[fmi] #low = scipy.stats.gmean( [init[0], init[1]]) #high = scipy.mean( [init[1], init[2]]) low = init[0] #if low < 0.01: # low = 0.01 high = init[2] # sanity check lows = [] highs = [] mids = [] low_files = [] high_files = [] lows.append(low) highs.append(high) for count in range(1,self.REPS+1): low_filename = make_file_force(low, fmi, count) low_cats = [] low_cats.extend( sum( get_cats(low_filename), []) ) low_direction = process_cats(low_cats) low_files.append((low, low_filename, low_direction)) high_filename = make_file_force(high, fmi, count) high_cats = [] high_cats.extend( sum( get_cats(high_filename), []) ) high_direction = process_cats(high_cats) high_files.append((high, high_filename, high_direction)) #print low_direction, high_direction if low_direction > LOW_MEAN_ACCEPTED or high_direction < HIGH_MEAN_ACCEPTED: #print "PANIC: fail to begin attack search" self.verify_good = False self.process_step.emit() self.process_step.emit() def process(force, fmi, lows, mids, highs, low_files, high_files): #print "%.3f\t%.3f\t%.3f" % ( # low, force, high) these_files = [] directions = [] for count in range(1,self.REPS+1): mid_filename = make_file_force(force, fmi, count) mid_cats = get_cats(mid_filename) mid_direction1 = process_cats(mid_cats[0]) mid_direction2 = process_cats(mid_cats[1]) mid_direction = numpy.mean((mid_direction1, mid_direction2)) #if mid_direction1 != mid_direction2: # mid_direction1 = 0 these_files.append( (force, mid_filename, mid_direction)) directions.append(mid_direction1) if numpy.mean(directions) < LOW_MEAN_ACCEPTED: lows.append(force) #low_files = these_files low_files.extend(these_files) #print "low" elif numpy.mean(directions) > HIGH_MEAN_ACCEPTED: highs.append(force) #high_files = these_files high_files.extend(these_files) #print "high" else: mids.append(force) files.extend(these_files) #print "mid" for count in range(self.REPS): self.process_step.emit() return low_files, high_files while len(mids) == 0: if (len(lows) + len(highs) + len(mids)) >= STEPS: break #force = numpy.mean( (max(lows), min(highs)) ) force = scipy.stats.gmean( (max(lows), min(highs)) ) #print "init", fmi, max(lows), force, min(highs) low_files, high_files = process(force, fmi, lows, mids, highs, low_files, high_files) while True: if (len(lows) + len(highs) + len(mids)) >= STEPS: break #print max(lows), min(mids), max(mids), min(highs) lowdistrel = min(mids) / max(lows) highdistrel = min(highs) / max(mids) #print lowdistrel, highdistrel if lowdistrel > highdistrel: force = scipy.stats.gmean( (max(lows), min(mids)) ) force *= random.uniform(0.95, 1.05) else: force = scipy.stats.gmean( (max(mids), min(highs)) ) force *= random.uniform(0.95, 1.05) #print "main", max(lows), min(mids), max(mids), min(highs) #print "new force:\t", force # do force low_files, high_files = process(force, fmi, lows, mids, highs, low_files, high_files) files.extend(low_files) files.extend(high_files) files.sort() if len(mids) == 1: mids.append( mids[0]*1.05 ) elif len(mids) == 0: mids.append( max(lows) ) mids.append( min(highs) ) self.verify_good = False #self.mids[fmi] = [ min(mids), max(mids) ] self.mids[fmi] = [ max(lows), min(highs) ] #mids.sort() #print mids return files self.kept_files = [[], [], []] self.mids = [[], [], []] for fmi in range(3): #print '-------------- ', fmi self.kept_files[fmi] = handle_finger(fmi) #print self.mids[fmi] #handle_finger(1, self.kept_files[1]) #handle_finger(2, self.kept_files[2]) #print self.kept_files #print self.mids return #print self.forces #import scipy.special #agm = scipy.special.agm(min(self.forces), max(self.forces)) #agm /= 4.0 #mid = (min(self.forces) + max(self.forces)) / 2 #mid /= 8.0 #lower = list(numpy.linspace(min(self.forces), mid, STEPS/2+1)) ###upper = list(numpy.linspace(agm, max(self.forces), STEPS/2+2))[:-1] #upper = list(numpy.exp( # numpy.linspace( # numpy.log(mid), # numpy.log(max(self.forces)), # STEPS/2+1))) #self.test_range = list(set(lower + upper)) #self.test_range = list(numpy.linspace(min(self.forces), # max(self.forces), STEPS)) #self.test_range = list(numpy.exp( #numpy.linspace( # numpy.log(min(self.forces)), # numpy.log(max(self.forces)), # STEPS))) #print "TEST:", self.test_range #print "fmi:", self.finger_midi_index #print self.forces #self.test_range = self._make_forces(self.forces, 7) self.test_range = [] #forces = self.test_range #self.test_range = numpy.array([forces[0], forces[1], forces[2], # forces[4], # forces[6], forces[7], forces[8]]) #forces = self.test_range K = 1.0 self.controller.set_stable_K(self.st, self.dyn, K) for fmi, finger_midi in enumerate(FINGERS): test_forces = self._make_forces(self.forces[fmi], 9) test_forces = test_forces[3:6] self.test_range.extend( list(test_forces)) #print self.test_range for count in range(self.REPS): # ick #fmi = self.finger_midi_index #finger_midi = self.finger_midi #finger_midi = basic_training.FINGER_MIDIS[fmi] #test_forces = numpy.append(numpy.linspace( # self.forces[fmi][0], # self.forces[fmi][1], # num=3, endpoint=False), # numpy.linspace( # self.forces[fmi][1], # self.forces[fmi][2], # num=4, endpoint=True)) #for a in test_forces: # print "%.3f " % a, #print #test_forces = self.test_range #print test_forces #for fmi, finger_midi in enumerate(basic_training.FINGER_MIDIS): for bow_force in test_forces: audio_params = vivi_types.AudioParams( self.st, finger_midi, dynamics.get_distance(self.inst_type,self.dyn), bow_force, dynamics.get_velocity(self.inst_type,self.dyn)) verify_filename = self.files.make_verify_filename( self.taskname, audio_params, count) #print verify_filename self.controller.filesNew(verify_filename) self.controller.comment( "verify int %i st %i dyn %i finger_midi %.3f" % (self.inst_type, self.st, self.dyn, finger_midi)) begin = vivi_controller.NoteBeginning() vivi_types.audio_params_to_physical( audio_params, self.dyn, begin.physical) end = vivi_controller.NoteEnding() end.keep_bow_velocity = True #for bow_direction in [1, -1]: # begin.physical.bow_velocity *= bow_direction # self.controller.note(begin, STABLE_LENGTH, end) #print "Starting note, force:", bow_force self.controller.note(begin, STABLE_LENGTH, end) self.controller.filesClose() self.process_step.emit()