示例#1
0
    def __init__(self):
        print("Started Gesture Recognition")
        self._setConfig()
        self.soundPlayer = Sound(self.audioConfig, self.osConfig)

        self.gestureFileIO = GestureFileIO(self.name, self.path)
        self.recorder = SwhRecorder(self.gestureFileIO, self.audioConfig, self.recordConfig)

        self.view = Console(self.recorder, self.soundPlayer, self.applicationClose, self.gestureFileIO.setFileName, self.gestureFileIO.getFileName)

        self.t1 = None
        self.t2 = None
        self.t3 = None
示例#2
0
class SenseGesture():

    def __init__(self):
        print("Started Gesture Recognition")
        self._setConfig()
        self.soundPlayer = Sound(self.audioConfig, self.osConfig)

        self.gestureFileIO = GestureFileIO(self.name, self.path)
        self.recorder = SwhRecorder(self.gestureFileIO, self.audioConfig, self.recordConfig)

        self.view = Console(self.recorder, self.soundPlayer, self.applicationClose, self.gestureFileIO.setFileName, self.gestureFileIO.getFileName)

        self.t1 = None
        self.t2 = None
        self.t3 = None


    def _setConfig(self):
        self.config = c.getInstance()
        self.checkNameSet()
        self.checkOSet()

        self.audioConfig = self.config.getAudioConfig()
        self.pathsConfig = self.config.getPathsConfig()
        self.recordConfig = self.config.getRecordConfig()

        self.frequency = float(self.audioConfig['frequency'])
        self.amplitude = float(self.audioConfig['amplitude'])
        self.framerate = int(self.audioConfig['framerate'])
        self.duration = int(self.audioConfig['duration'])
        self.bufsize = int(self.audioConfig['buffersize'])
        self.path = self.pathsConfig['gesturepath']

    def checkNameSet(self):
        userconfig = self.config.getUserConfig()
        if(userconfig['name'] == ""):
            name = raw_input('Bitte schreibe deinen Namen:\n')
            self.config.setConfig("user", "name", name)
            self.name = name
        else:
            self.name = userconfig['name']

    def checkOSet(self):
        self.osConfig = self.config.getOSConfig()
        if(self.osConfig['type'] == ""):
            self.config.setConfig("os", "type", os.name)
            self.osConfig = self.config.getOSConfig()

    def start(self):
        try:
#             self.t1 = Thread(name="Soundplayer", target=self.soundPlayer.startPlaying, args=(self.frequency, self.amplitude, self.framerate, self.duration, self.bufsize))
#             self.t2 = self.recorder.startNewThread()
            self.t3 = self.view.startNewThread()
#             self.t1.start()
        except:
            print("Error: unable to start thread " + str(sys.exc_info()))
        while True:
            try:
                self.t3.join(1)
            except KeyboardInterrupt:
                print("KeyboardInterrupt. Stopping current task (no guarantees for failures), if possible...")
                self.view.interrupt()
            if not self.t3.isAlive():
                break
#         self.applicationClose()
#         print("Player alive: \t" + str(self.t1.is_alive()))
#         print("Recorder alive:\t" + str(self.recorder.is_alive()))
#         print("View alive: \t" + str(self.view.is_alive()))
        exitApp()

    def applicationClose(self, code=0):
        self.recorder.close()
        self.soundPlayer.stopPlaying()

        if(self.recorder.thread != None):
            self.recorder.thread.join()
            self.soundPlayer.t.join()
示例#3
0
    def run(self, screen):
        screen_size = (1024,600)
        screen_color = (0, 0 ,0)
        
        #build frequency to note dictionary
        notes_dictionary = self.build_range()

        #sort the keys and turn into a numpy array for logical indexing
        frequencies = numpy.array(sorted(notes_dictionary.keys()))

        top_note = 24 #set it two octaves higher
        bottom_note = 0
        
        #other variables
        screen = pygame.display.set_mode(screen_size)
        screen.fill(screen_color)
        input_note = 1 #the y value on the plot
        old_position = (0,0) #the last position of note played
        show_notes = True #show the note
        signal_level = 0 #volume level
        trys = 1
        line = True
        sound_gate = 15 #zero is loudest possible input level
        target_note = 0 #closest note in the dictionary
        sound_recorder = SwhRecorder() #microphone
        
        while trys <> 0:
            trys += 1

            for n in range(0, screen_size[0], 40):
                sound_recorder.setup()
                raw_data_signal = sound_recorder.getAudio()
                signal_level = round(abs(self.loudness(raw_data_signal)),2) #find the volume level from raw data

                try: 
                    input_note = round(freq_from_autocorr(raw_data_signal,sound_recorder.RATE),2) #find the freq from the audio sample
                except:
                    input_note == 0
                sound_recorder.close()

                if input_note > frequencies[len(notes_dictionary)-1] or input_note < frequencies[0]: #if the frequency is too high, do nothing
                    continue
                if signal_level > sound_gate: #noise gate to prevent ambient noises
                    continue

                target_note = self.closest_value_index(frequencies, round(input_note, 2)) #find the closest note in the note dictionary
                position = ((n), (screen_size[1]-(int(screen_size[1]/(frequencies[top_note]-frequencies[bottom_note]) * (input_note - frequencies[bottom_note])))) ) 

                #user interface
                for event in pygame.event.get():
                    #quit program
                    if event.type ==  QUIT:
                        sound_recorder.close()
                        return
                    elif event.type == KEYDOWN:
                        #increase top_note range
                        if event.key == K_s:    
                            if top_note <= len(notes_dictionary)-7:
                                top_note += 6
                        #decrease top note range no lower than an octave higher than bottom note
                        if event.key == K_x:    
                            if top_note >= 6 and top_note >= bottom_note + 6:
                                top_note -= 6
                        #increase bottom note range no higher than an octave lower than top note
                        if event.key == K_a:    
                            if bottom_note < top_note:
                                bottom_note += 6
                        #decrease bottom note range
                        if event.key == K_z:    
                            if bottom_note >= 6:
                                bottom_note -= 6 

                        #quit program
                        if event.key == K_q:    
                            sound_recorder.close()
                            return

                if n == 0 or n == screen_size[0]:
                    old_position = position
                
                #draw info box on top
                meter = "###################################"
                info_font = pygame.font.Font(None, 18)
                top_info = info_font.render(
                   "Bottom : " + str(notes_dictionary[frequencies[bottom_note]]) + " :  dec(z), inc(a)     "
                   + "Top : " + str(notes_dictionary[frequencies[top_note]]) + " :  dec(x), inc(s)     "
                   #+ "         Show Notes(n):" + str(show_notes) + "         Lines(l):" + str(line)
                   + "         Loudness: " + meter[1:int(20-signal_level)]
                   , 1, (255,255,255))
                pygame.draw.rect(screen, (0,0,0), (0,0,screen_size[0],20))
                pygame.draw.line(screen, (200,200,200),(0,20),(1024,20), 1)
                screen.blit(top_info, (5,5))

                #draw lines
                if input_note < frequencies[len(notes_dictionary)-1]:
                    if old_position < position:
                        random_color = (randint(20,255),randint(20,255),randint(20,255))
                        pygame.draw.line(screen, random_color, old_position, position, 2)
                    old_position = position

                #draw notes name
                font = pygame.font.Font(None, 30)
                text = font.render(str(notes_dictionary[frequencies[target_note]]), 1, (0,255,0))
                screen.blit(text, (position))

                #update the display
                pygame.display.flip()
                pygame.display.update()

            #clear screen at the end of every loop run
            screen.blit(screen, (0, 0))
            screen.fill(screen_color)