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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    #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):
Example #7
0
        #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):
Example #8
0
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