-
Notifications
You must be signed in to change notification settings - Fork 0
/
player.py
127 lines (119 loc) · 4.76 KB
/
player.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from audio import Audio
from analizer import Analizer
###
from threading import Thread, Event
import numpy as np
from operator import itemgetter
from numpy import *
import sys, time, math, datetime, random, glob, os
import subprocess
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()