def get_train_basename(train_info, artifastring_init, params): finger_midi = midi_pos.pos2midi(params.finger_position) filename_count = 1 while True: basename = "%s_%i_%.3f_%.3f_%.3f_%.3f_%i" % ( os.path.join(train_info.train_dirname, inst_name(artifastring_init)), params.violin_string, finger_midi, params.bow_position, params.force, params.velocity, filename_count) if not os.path.exists(basename + ".wav"): break filename_count += 1 return basename
def get_train_basename(train_info, artifastring_init, params): finger_midi = midi_pos.pos2midi(params.finger_position) filename_count = 1 while True: basename = "%s_%i_%.3f_%.3f_%.3f_%.3f_%i" % ( os.path.join(train_info.train_dirname, inst_name(artifastring_init)), params.violin_string, finger_midi, params.bow_position, params.force, params.velocity, filename_count) if not os.path.exists(basename+".wav"): break filename_count += 1 return basename
def _make_files(self): self._setup_controller() #print self.test_range #print self.keep_bow_velocity for damp in self.test_range: self.controller.set_dampen(self.st, self.dyn, damp) for count in range(1, self.REPS+1): begin = vivi_controller.NoteBeginning() begin.physical.string_number = self.st begin.physical.dynamic = self.dyn begin.physical.finger_position = 0.0 begin.physical.bow_force = self.initial_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) filename = self.files.make_dampen_filename( self.taskname, vivi_types.AudioParams(self.st, midi_pos.pos2midi(begin.physical.finger_position), dynamics.get_distance( self.inst_type, self.dyn), begin.physical.bow_force, dynamics.get_velocity( self.inst_type, self.dyn)), damp, count) end = vivi_controller.NoteEnding() end.lighten_bow_force = True end.keep_bow_velocity = self.keep_bow_velocity self.controller.filesNew(filename) self.controller.note(begin, DAMPEN_NOTE_SECONDS, end) self.controller.rest(DAMPEN_WAIT_SECONDS) self.controller.filesClose() self.process_step.emit() return
def _make_files(self): self._setup_controller() #print self.test_range #print self.keep_bow_velocity for damp in self.test_range: self.controller.set_dampen(self.st, self.dyn, damp) for count in range(1, self.REPS + 1): begin = vivi_controller.NoteBeginning() begin.physical.string_number = self.st begin.physical.dynamic = self.dyn begin.physical.finger_position = 0.0 begin.physical.bow_force = self.initial_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) filename = self.files.make_dampen_filename( self.taskname, vivi_types.AudioParams( self.st, midi_pos.pos2midi(begin.physical.finger_position), dynamics.get_distance(self.inst_type, self.dyn), begin.physical.bow_force, dynamics.get_velocity(self.inst_type, self.dyn)), damp, count) end = vivi_controller.NoteEnding() end.lighten_bow_force = True end.keep_bow_velocity = self.keep_bow_velocity self.controller.filesNew(filename) self.controller.note(begin, DAMPEN_NOTE_SECONDS, end) self.controller.rest(DAMPEN_WAIT_SECONDS) self.controller.filesClose() self.process_step.emit() return
def keypress(self, c): if c == 'q': return False if c == 's': self.turn_off_current_string() # new self.params.violin_string += 1 if self.params.violin_string > 3: self.params.violin_string = 0 if c == 'a': self.turn_off_current_string() # new self.params.violin_string -= 1 if self.params.violin_string < 0: self.params.violin_string = 3 if c == 'f': if self.params.finger_position == 0.0: self.params.finger_position = 0.02 else: self.params.finger_position *= 1.1 if c == 'd': if self.params.finger_position < 0.02: self.params.finger_position = 0.00 else: self.params.finger_position /= 1.1 if c == 't': self.params.bow_position *= 1.01 if c == 'g': self.params.bow_position /= 1.01 if c == 'y': self.params.force *= 1.1 if c == 'h': self.params.force /= 1.1 if c == 'u': self.params.velocity *= 1.1 if c == 'j': self.params.velocity /= 1.1 skip_violin_print = False if c == 'z' or c == 'x' or c == 'c' or c == 'v': if c == 'z': alter = 1.0/1.1 if c == 'x': alter = 1.0/1.01 if c == 'c': alter = 1.01 if c == 'v': alter = 1.1 self.change_tension(alter) skip_violin_print = True if c >= '1' and c <= str(vivi_defines.CATEGORIES_NUMBER): skip_violin_print = True self.snapshot(int(c) - vivi_defines.CATEGORIES_CENTER_OFFSET) self.stdscr.addstr(self.row, 0, str("file written")) if c == 'l': if self.params.force > 0: self.store_force = self.params.force self.params.force = 0 else: self.params.force = self.store_force if c == 'm': midi = midi_pos.pos2midi(self.params.finger_position) midi = round(midi) self.params.finger_position = midi_pos.midi2pos(midi) self.stdscr.addstr(23, 20, str("midi: %i" % midi)) if c == 'b': self.dyn += 1 if self.dyn >= 4: self.dyn = 0 self.params.bow_position = dynamics.get_distance(self.dyn) self.params.velocity = dynamics.get_velocity(self.dyn) self.stdscr.addstr(23, 20, str("dyn: %i " % self.dyn)) if c == 'n': midi = midi_pos.pos2midi(self.params.finger_position) midi = round(midi) + 1 if midi > 7: midi = 0 self.params.finger_position = midi_pos.midi2pos(midi) self.stdscr.addstr(23, 20, str("midi: %i " % midi)) self.params_queue.put(self.params) if not skip_violin_print: self.stdscr.addstr(self.row, 0, str( "%i\t%.3f\t%.3f\t%.3f\t%.3f" % ( self.params.violin_string, self.params.finger_position, self.params.bow_position, self.params.force, self.params.velocity))) # next line self.row += 1 if self.row > 20: self.row = 5 self.stdscr.addstr(self.row, 0, str(" "*40)) self.stdscr.move(self.row, 0) return True
#slips = slips.reshape( (-1, hopsize) ) #print slips.shape #slips = slips[18] #pylab.plot(slips) #freqs, fft_normalized = get_freqs_fft(slips, 44100) #pylab.figure() #pylab.semilogy(freqs, fft_normalized) pylab.show() return mean_slip_freq #fp = 0.251 fp = 0.0 string_midi = 76 expected_midi = midi_pos.pos2midi(fp) + string_midi expected_freq = midi_pos.midi2freq(expected_midi) #print "Expected frequency: %.1f" % expected_freq #print "Searching positions:\n", positions #print "Searching forces:\n", forces #print "Searching vels:\n", velocities def test_slips(st, vel): STEPS_FORCE = 30 #STEPS_VELOCITIES = 30 forces = numpy.linspace(0.01, 10.0, STEPS_FORCE) #velocities = numpy.linspace(0.01, 2.0, STEPS_VELOCITIES) for i, force in enumerate(forces): for j, bp in enumerate(positions): #for j, vel in enumerate(velocities):
#print slips.shape #slips = slips[18] #pylab.plot(slips) #freqs, fft_normalized = get_freqs_fft(slips, 44100) #pylab.figure() #pylab.semilogy(freqs, fft_normalized) pylab.show() return mean_slip_freq #fp = 0.251 fp = 0.0 string_midi = 76 expected_midi = midi_pos.pos2midi(fp) + string_midi expected_freq = midi_pos.midi2freq(expected_midi) #print "Expected frequency: %.1f" % expected_freq #print "Searching positions:\n", positions #print "Searching forces:\n", forces #print "Searching vels:\n", velocities def test_slips(st, vel): STEPS_FORCE = 30 #STEPS_VELOCITIES = 30 forces = numpy.linspace(0.01, 10.0, STEPS_FORCE) #velocities = numpy.linspace(0.01, 2.0, STEPS_VELOCITIES) for i, force in enumerate(forces): for j, bp in enumerate(positions):
def violin_process(artifastring_init, commands_pipe, audio_pipe): try: pyaudio_obj, audio_stream = make_audio_stream() except: pyaudio_obj = None audio_stream = None vivi = vivi_controller.ViviController( artifastring_init.instrument_type, artifastring_init.instrument_number) if artifastring_init.instrument_type == 0: base_midi = 55 inst = "violin" elif artifastring_init.instrument_type == 1: base_midi = 48 inst = "viola" elif artifastring_init.instrument_type == 2: base_midi = 36 inst = "cello" vivi.filesNew("test-interactive") for st in range(4): vivi.load_ears_training(st, "../final/%s/%i.mpl" % (inst, st)) for dyn in range(4): for fmi in range(3): vivi.set_stable_K(st, dyn, fmi, 1.2) audio_buf = monowav.shortArray(HOPSIZE) samples = 0 logfile = actions_file.ActionsFile("log-interactive.actions") physical = vivi_controller.PhysicalActions() params = None while commands_pipe.poll(): params = handle_command(vivi, commands_pipe, logfile, samples) if params is None: continue physical.string_number = params.violin_string physical.finger_position = params.finger_position physical.bow_force = params.force physical.dynamic = 0 physical.bow_bridge_distance = params.bow_position physical.bow_velocity = params.velocity midi_target = base_midi + (7*params.violin_string + midi_pos.pos2midi(physical.finger_position)) #pc = violin.get_physical_constants(params.violin_string) #commands_pipe.send( (TENSION, pc.T) ) while True: while commands_pipe.poll(): params = handle_command(vivi, commands_pipe, logfile, samples) #vivi.comment("st, force: %i %.3f" % # (params.violin_string, params.force)) if params is None: continue physical.string_number = params.violin_string physical.finger_position = params.finger_position physical.bow_force = params.force physical.dynamic = 0 physical.bow_bridge_distance = params.bow_position physical.bow_velocity = params.velocity midi_target = base_midi + (7*params.violin_string + round(midi_pos.pos2midi(physical.finger_position))) vivi.continuous(audio_buf.cast(), physical, midi_target, False) arr, forces = audio_pipe.recv() if arr is None: # poison pill break if physical.string_number >= 0: vivi.comment("new force: %.3f" % physical.bow_force) vivi.continuous(audio_buf.cast(), physical, midi_target, True) physical.string_number = -1 for i in xrange(HOPSIZE): arr[i] = audio_buf[i] # vivi_controller.buffer_get(audio_buf, i) #vivi.wait_samples_forces_python(arr, forces) #unsafe = violin.wait_samples_forces_python(arr, forces) #params_log.write("unsafe: %i" % unsafe) #commands_pipe.send( (COMMANDS.UNSAFE, unsafe) ) if audio_stream is not None: audio_stream.write( arr.tostring(), HOPSIZE ) audio_pipe.send( (arr, forces) ) samples += HOPSIZE logfile.wait(float(samples)/ARTIFASTRING_SAMPLE_RATE) logfile.close() if pyaudio_obj is not None: audio_stream.close() pyaudio_obj.terminate()
def snapshot(self, cat_key): basename = quality_judgements.get_train_basename( self.train_info, self.artifastring_init, self.params) actions_out = actions_file.ActionsFile(basename+".actions") finger_midi = midi_pos.pos2midi(self.params.finger_position) actions_out.comment( "basic\tst %i\tdyn %i\tfinger_midi %.3f\tinst %i %i" % ( self.params.violin_string, 0, finger_midi, self.artifastring_init.instrument_type, self.artifastring_init.instrument_number, )) actions_out.finger(0, self.params.violin_string, self.params.finger_position) complete = numpy.empty(0, dtype=numpy.int32) complete_forces = numpy.empty(0, dtype=numpy.int32) seconds = 0.4 bow_pos_along = 0.1 num_hops = int(math.ceil(seconds * ARTIFASTRING_SAMPLE_RATE / HOPSIZE)) for j in xrange(num_hops): arr, forces, bowed_arr, bowed_forces = self.audio_pipe_master.recv() complete = numpy.append(complete, bowed_arr) complete_forces = numpy.append(complete_forces, bowed_forces) self.audio_pipe_master.send( (arr, forces, bowed_arr, bowed_forces) ) seconds = float(j)*HOPSIZE/ARTIFASTRING_SAMPLE_RATE myparm = self.copy_params() myparm.force = random.gauss(self.params.force, GAUSSIAN_FORCE*self.params.force) myparm.velocity = random.gauss(self.params.velocity, GAUSSIAN_VELOCITY*self.params.velocity) self.commands_pipe_master.send( (COMMANDS.BOW, myparm) ) actions_out.bow(seconds, self.params.violin_string, self.params.bow_position, #self.params.force, #self.params.velocity, myparm.force, myparm.velocity, bow_pos_along, ) bow_pos_along += myparm.velocity/float( ARTIFASTRING_SAMPLE_RATE) # do one more action for "good luck" seconds = (j+1)*HOPSIZE/float( ARTIFASTRING_SAMPLE_RATE) actions_out.bow(seconds, self.params.violin_string, self.params.bow_position, self.params.force, self.params.velocity, bow_pos_along ) actions_out.close() wavfile = monowav.MonoWav(basename+".wav", ARTIFASTRING_SAMPLE_RATE, ARTIFASTRING_SAMPLE_RATE, True) ### very awkward abuse of SWIG. There has to be a better way! buf = wavfile.request_fill_int(len(complete)) for i in xrange(len(complete)): monowav.buffer_set_int(buf, i, int(complete[i])) wavfile2 = monowav.MonoWav(basename+".forces.wav", HAPTIC_SAMPLE_RATE, HAPTIC_SAMPLE_RATE, True) buf2 = wavfile2.request_fill_int(len(complete_forces)) for i in xrange(len(complete_forces)): monowav.buffer_set_int(buf2, i, int(complete_forces[i])) quality_judgements.append_to_mf(self.train_info, self.params, basename+".wav", cat_key) #self.stdscr.addstr(22, 10, str("wrote to %s" % mf_filename)) self.snapshot_post(basename)
def keypress(self, c): if c == 'q': return False if c == 's': self.turn_off_current_string() # new self.params.violin_string += 1 if self.params.violin_string > 3: self.params.violin_string = 0 if c == 'a': self.turn_off_current_string() # new self.params.violin_string -= 1 if self.params.violin_string < 0: self.params.violin_string = 3 if c == 'f': if self.params.finger_position == 0.0: self.params.finger_position = 0.02 else: self.params.finger_position *= 1.1 if c == 'd': if self.params.finger_position < 0.02: self.params.finger_position = 0.00 else: self.params.finger_position /= 1.1 if c == 't': self.params.bow_position *= 1.01 if c == 'g': self.params.bow_position /= 1.01 if c == 'y': amount = self.params.force * 0.05 amount = random.gauss(amount, 0.01*amount) self.params.force += amount if c == 'h': amount = self.params.force * 0.05 amount = random.gauss(amount, 0.01*amount) self.params.force -= amount if c == 'u': self.params.velocity *= 1.1 if c == 'j': self.params.velocity /= 1.1 if c == 'm': self.tuning = TUNING_SETTLE_BUFFERS if c == 'p': self.commands_pipe_master.send( (COMMANDS.RESET, None) ) skip_violin_print = False if c == 'z' or c == 'x' or c == 'c' or c == 'v': if c == 'z': alter = 1.0/1.1 if c == 'x': alter = 1.0/1.01 if c == 'c': alter = 1.01 if c == 'v': alter = 1.1 self.change_tension(alter) skip_violin_print = True ### TODO: icky hard-coding categories if c >= '1' and c <= '5': skip_violin_print = True self.snapshot(c) self.stdscr.addstr(self.row, 0, str("file written")) if c == ord('b'): self.params.force /= 1.1 if c == 'l': if self.params.force > 0: self.store_force = self.params.force self.params.force = 0 else: self.params.force = self.store_force if c == 'm': midi = midi_pos.pos2midi(self.params.finger_position) midi = round(midi) self.params.finger_position = midi_pos.midi2pos(midi) self.stdscr.addstr(23, 20, str("midi: %i" % midi)) if c == 'n': midi = midi_pos.pos2midi(self.params.finger_position) midi = round(midi) + 1 if midi > 12: midi = 0 self.params.finger_position = midi_pos.midi2pos(midi) self.stdscr.addstr(23, 20, str("midi: %i " % midi)) self.keypress_extra(c) self.commands_pipe_master.send( (COMMANDS.FINGER, self.params) ) self.commands_pipe_master.send( (COMMANDS.BOW, self.params) ) if not skip_violin_print: self.stdscr.addstr(self.row, 0, str( "%i\t%.3f\t%.3f\t%.3f\t%.3f" % ( self.params.violin_string, self.params.finger_position, self.params.bow_position, self.params.force, self.params.velocity))) # next line self.row += 1 if self.row > 20: self.row = 5 self.stdscr.addstr(self.row, 0, str(" "*40)) self.stdscr.move(self.row, 0) return True