示例#1
0
class Player:
    def __init__(self, directory):#, master):
        self.directory = directory
        self.files = glob.glob(os.path.join(directory, '*.wav'))
        self.times = 0
        self.size = 8
        self.locked = False
        self.beat_counter = [0,0]
        self.beat_buffer = [0,0]
        self.beat_time = time.time()
        self.my_values = [0 for i in range(self.size)]
        self.current_time = 0
        self.frame = 0
        self.filedata = []
        Thread(target = self.set_track, args = (self.files[random.randint(0, len(self.files)-1)], )).start()
        #self.set_track(self.files[random.randint(0, len(self.files)-1)])

    def transition(old_track, new_track):
        pass
    
    def stop(self):
        self.current_time = self.audio.current_time
        self.event = False
    
    def set_track(self, file):
        self.current_time = 0
        self.file = file
        self.filename = file.split("/")[-1]
        self.audio = Audio(file)
        #cmd = ['python', 'data_analizer_routine.py', self.directory, file, str(self.audio.real_duration)]
        cmd = ['java', '-Xmx2g', '-d64', 'data_analizer_routine', self.directory, file, str(self.audio.real_duration)]
        self.locked = True
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
        p.wait()
        self.locked = False
        data = p.communicate()
        self.new_track = data[0].split("\n")[0]
        self.filedata = []

    def play(self):
        self.file_label.set(self.filename)
        self.time = time.time()
        self.audio_thread = Thread(target = self.update_audio)
        self.event = True
        self.audio_thread.start()
    
    def set_gui(self, _time, _filename):
        self.t = time.time()
        self.play_time = _time
        self.file_label = _filename
    
    def freq_analizer(self, pcm):
        #triangle=np.array(range(len(pcm)/2)+range(len(pcm)/2)[::-1])
        #pcm = pcm * triangle
        fft=np.fft.fft(pcm)
        freq=np.fft.fftfreq(np.arange(len(pcm)).shape[-1])[:len(pcm)/2]
        freq=freq * self.audio.file.getframerate()/1000
        current_time = datetime.timedelta(seconds=int(self.audio.duration)-int(self.audio.current_time))
        if time.time()-self.t >=0.3:
            self.play_time.set(str(current_time))
            self.t = time.time()
        #print "Playing:",self.filename, "\tTime:", current_time,
        if real:
            fftr=10*np.log10(np.sqrt(fft.imag**2+fft.real**2))[:len(pcm)/2]
            defv = len(fftr)/self.size
            deff = 0
            defl = len(fftr)/self.size
            bpm = [False for i in range(self.size)]
            for i in range(self.size):
                fftr[deff:defl] = np.average(fftr[deff:defl])
                value = (math.ceil(np.average(fftr[deff:defl])*100)/100)
                mult = 5
                if self.my_values[i]+mult < value:#\or self.my_values[i] > mult+value:
                    bpm[i]=True
                else:
                    bpm[i]=False
                self.my_values[i] = value
                if np.isinf(value):
                    value = 0
                deff+=(defv)
                defl+=(defv)
            if bpm.count(True)>=bpm.count(False):
                self.times+=1
                if self.times == 1:
                    self.beat_counter[0] = self.beat_counter[1]
                    self.beat_counter[1] = self.audio.current_time
                    self.filedata.append(str(self.audio.current_time)+", "+str(60/(self.beat_counter[1]-self.beat_counter[0]))+"\n")
            else:
                self.times=0
            #sys.stdout.write('\r')
            #sys.stdout.flush()
            return (freq, fftr)

    def update_audio(self):
        self.data = self.audio.get_data()
        while self.data != "" and self.event != False:
            pcm = np.fromstring(self.data, "Int16")
            self.freq_analizer(pcm)
            self.audio.stream.write(self.data)
            self.data = self.audio.get_data()
        if self.data == "":
            #self.filedata.close()
            if len(self.filedata)>0:
                f = open(self.file+".dat", "w")
                for line in self.filedata:
                    f.write(line)
                f.close()
            self.filedata = []
            if self.locked == False:
            	Thread(target = self.set_track, args = (self.new_track, )).start()
            	print "New process"
            else:
            	print "Another process is running"
            #self.set_track(self.new_track)
            self.time_counter = 0
            self.current_time = 0
            self.play()