adding more stuff

This commit is contained in:
alexandre 2024-05-03 22:23:50 +02:00
parent dc7fde60de
commit d899f72602
2 changed files with 377 additions and 155 deletions

View File

@ -11,6 +11,278 @@ import heapq
print("Starting...\n") print("Starting...\n")
def find_bpm_2(sample_rate, data, threshold, maxbpm, show):
mx = np.max(data)
min_spacing = (60*sample_rate)/maxbpm
k = 0
while(k < len(data) and data[k]/mx < threshold):
k += 1
k += 1
spacing = []
current = 1
progress = 0
while(k < len(data)):
if(k%(len(data)/100) == 0):
print(progress, "%")
progress += 1
if(data[k]/mx >= threshold and current > min_spacing):
spacing.append(current)
current = 0
else:
current += 1
k += 1
for x in range(len(spacing)):
spacing[x] = 60/(spacing[x]/sample_rate)
digits = [i for i in range(len(spacing))]
if(show):
plt.plot(digits, spacing)
plt.xlabel("N")
plt.ylabel("BPM")
plt.grid()
plt.show()
beat = np.mean(spacing)
error = np.std(spacing)
return (np.round(beat, 3), np.round(error, 3))
def to_ms(song_data, sample_rate, offset):
new_data = []
spacing = int(sample_rate * 0.001)
mx = max(song_data)
i = 0
while(i < len(song_data)):
avg = 0
for k in range(spacing):
if(i+spacing < len(song_data)):
avg += song_data[i+spacing]
avg = avg / spacing
new_data.append(avg)
i += spacing
if(False): # pls dont kill me thx
t = [offset + j/1000 for j in range(len(new_data))]
plt.plot(t, new_data)
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
return (new_data, len(new_data))
def filter_n_percent(song_name, offset, length, threshold, reduce, show):
# threshold is in ]0, 100]
subprocess.run(["ffmpeg", "-ss", str(offset), "-t", str(length), "-i", song_name, "crop.wav"])
sample_rate, song_data = wavfile.read('crop.wav')
subprocess.run(["clear"])
subprocess.run(["rm", "crop.wav"])
if(reduce):
(song_data,e) = to_ms(song_data, 44100, 1)
sample_rate = 1000
mx = max(song_data)
is_locked = [False for i in range(len(song_data))]
x = int((len(song_data)*threshold)//100)
#print("X = ", x)
print("Retreiving the", int(x), "/", len(song_data), "highest values")
elements = heapq.nlargest(int(x), enumerate(song_data), key=lambda x: x[1])
print("Done")
for idx in range(len(elements)):
is_locked[elements[idx][0]] = True
for r in range(len(song_data)):
if(is_locked[r] == False):
song_data[r] = 0
if(show):
#print("EEEEE")
t = [offset + j/sample_rate for j in range(len(song_data))]
plt.plot(t, song_data)
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
return song_data
def write_to_file_thr(sample_rate, song_data, offset, threshold, filename):
file = open(filename, 'w')
file.writelines('time,amplitude\n')
mx = max(song_data)
print("writing to output...")
for i in range(len(song_data)):
if(i%(len(song_data)//50) == 0):
print(i, "/", len(song_data))
if(song_data[i]/mx > threshold):
file.writelines(str(np.round(offset + i/sample_rate, 3)))
file.writelines(',')
file.writelines(str(np.round(song_data[i], 0)))
file.writelines('\n')
def smooth(data, thr, mergeThr, show):
mx = max(data)
for i in range(len(data)-mergeThr):
if(data[i]/mx > thr):
for k in range(1, mergeThr):
data[i+k] = 0
if(show):
t = [j/1000 for j in range(len(data))]
plt.plot(t, data)
plt.xlabel("Time (not scaled to origin)")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
return data
def round_t(id, sample_rate, bpm, div, offset, k0):
k = k0
t = offset + k/(bpm*div)
while(t < id/sample_rate):
t = offset + k/(bpm*div)
k += 1
if(np.abs(t - id/sample_rate) < np.abs((t - 1/(bpm*div)) - id/sample_rate)):
return t
return (t - 1/(bpm*div), 0)
def snap(data, sample_rate, bpm, offset, divisor, show):
new = [0 for x in range(int(1000*len(data)/sample_rate))] # 1pt per millisecond
print("old =", len(data))
print("len =", 1000*len(data)/sample_rate)
k = 0
t = 0
percent = 0
for i in range(len(data)):
while(t < i/sample_rate):
t = k/(bpm*divisor)
k += 60
if(i%(len(data)//100) == 0):
print(percent, "%")
percent += 1
if(int(t*1000) < len(new)):
new[int(t*1000)] = max(data[i], new[int(t*1000)])
else:
new[len(new)-1] = max(data[i], new[len(new)-1])
if(show):
t = [j/1000 for j in range(len(new))]
plt.plot(t, new)
plt.xlabel("Time (e)")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
return new
if(True):
#data = filter_n_percent("worlds_end_3.wav", 74.582, 30, 0.3, reduce=False, show=False)
#data = filter_n_percent("no.wav", 1, 15, 0.3)
#da = find_bpm(44100, data, 100, 200, 1, 0)
# def find_bpm_2(sample_rate, data, threshold, maxbpm):
#da = find_bpm_2(44100, data, 0.92, 240, show=False)
#print("BPM is", da[0], "with std of", da[1])
data2 = filter_n_percent("worlds_end_3.wav", 74.582, 15, 0.2, reduce=False, show=True)
data2 = snap(data2, 44100, 178, 74.582, 4, show=True)
write_to_file_thr(1000, data2, 74.582, 0.02, "timing_points.csv")
'''
data2 = filter_n_percent("no.wav", 1, 30, 0.8, reduce=True, show=True)
write_to_file_thr(1000, smooth(data2, 0.5, 50, show=True), 1, 0.02, "timing_points.csv")
'''
#data = to_ms(data, 44100, 1)
print("Program finished with return 0")
''' -------------------------------------------------------------------- '''
''' -----------------------| Feuilles mortes |-------------------------- '''
''' -------------------------------------------------------------------- '''
'''
if(False):
#t, f, Zxx = fct("no.wav", 0, 0.032, 10, 5000, False)
#t, f, Zxx = fct("worlds_end_3.wav", 150.889, 0.032, 170.889, 3000, False)
#t, f, Zxx = fct("deltamax.wav", 9.992, 0.032, 114.318, 3000, False)
#t, f, Zxx = fct("deltamax.wav", 9.992, 0.032, 20, 3000, False)
#t, f, Zxx = fct("da^9.wav", 8.463, 0.032, 20, 5000, False)
t, f, Zxx = fct("13. Cosmic Mind.wav", 0, 0.032, 20, 5000, False)
#t, f, Zxx = fct("Furioso Melodia 44100.wav", 4, 0.032, 8, 3000, False)
#t, f, Zxx = fct("changing.wav", 0, 0.05, 3.9, 5000, False)
#fct("worlds_end_3.wav", 75, (60/178)/4, 75+2, 2500)
plot_max(t, f, Zxx, True)
if(False):
#(t, data) = peaks("worlds_end_3.wav", 0, 300, False, 0.92)
(t, data) = peaks("worlds_end_3.wav", 74.582, 6, False, 0.9)
#(t, data) = peaks("da^9.wav", 8.463, 301.924 - 8.463, False, 0.95)
#(t, data) = peaks("deltamax.wav", 8.463, 30101.924 - 8.463, False, 0.92)
da = find_bpm(t, 44100, data, 100, 200, 1, 10)
print("BPM data is", da)'''
#data = [-1 for i in range(int(x))]
#ids = [-1 for i in range(int(x))]
'''
data = []
ids = []
for k in range(int(x)):
data.append(int(7*mx/10))
ids.append(-1)
# structure there is [[index, value]...]
i = 0
calc = 0
while(i < len(song_data)):
if(i%10 == 0):
print(i, "/", len(song_data))
if(data[int(x)-1] < song_data[i]):
calc += 1
#print("\n \n \n \n \n")
data[int(x)-1] = song_data[i]
ids[int(x)-1] = i
k = int(x)-1
#while(k < int(x) & data[0] > data[k]):
while(k > 0 and data[k-1] <= data[k]):
data[k], data[k-1] = data[k-1], data[k]
ids[k], ids[k-1] = ids[k-1], ids[k]
k -= 1
#print(data[int(x)-1], calc, "/", x)
i += skip
i += 1
for s in range(int(x)-1):
if(data[s] < data[s+1]):
print("Nope", s)
assert(0)
'''
'''
def fct(song_name, offset, increment, songlen, maxfreq, display): def fct(song_name, offset, increment, songlen, maxfreq, display):
to_cut = 20000//maxfreq to_cut = 20000//maxfreq
global_Zxx = np.array([]) global_Zxx = np.array([])
@ -37,11 +309,11 @@ def fct(song_name, offset, increment, songlen, maxfreq, display):
#print(len(Zxx)) #print(len(Zxx))
#print(len(Zxx[0])) #print(len(Zxx[0]))
#convert to mel
'''
for i in range(len(Zxx)): for i in range(len(Zxx)):
for j in range(len(Zxx[i])): for j in range(len(Zxx[i])):
Zxx[i][j] *= 1127*np.log(1+f[i]/700)''' Zxx[i][j] *= 1127*np.log(1+f[i]/700)
t = np.array([current_time + x for x in t]) t = np.array([current_time + x for x in t])
@ -98,7 +370,7 @@ def plot_max(time, freq, Zxx, save):
if(save): if(save):
write_to_file(time, fres, maxres, 'output.csv') write_to_file(time, fres, maxres, 'output.csv')
''' ''''''
plt.plot(time, fres, 'r') plt.plot(time, fres, 'r')
plt.grid() plt.grid()
plt.xlabel("Time") plt.xlabel("Time")
@ -109,7 +381,7 @@ def plot_max(time, freq, Zxx, save):
plt.xlabel("Time") plt.xlabel("Time")
plt.ylabel("Maximun values") plt.ylabel("Maximun values")
plt.show()''' plt.show()''''''
fig, (ax1, ax2) = plt.subplots(2) fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Top : time and frequencies\nBottom : time and max values') fig.suptitle('Top : time and frequencies\nBottom : time and max values')
@ -208,7 +480,7 @@ def find_bpm(sample_rate, data, minbpm, maxbpm, step, width):
bpmlst.append(beat) bpmlst.append(beat)
scores.append(accuracy) scores.append(accuracy)
if(True): if(False):
plt.plot(bpmlst, scores) plt.plot(bpmlst, scores)
plt.xlabel("BPM") plt.xlabel("BPM")
plt.ylabel("Score") plt.ylabel("Score")
@ -216,153 +488,4 @@ def find_bpm(sample_rate, data, minbpm, maxbpm, step, width):
plt.show() plt.show()
return (optimal, optimal_acc) return (optimal, optimal_acc)
def find_bpm_2(sample_rate, data, threshold, maxbpm):
mx = np.max(data)
min_spacing = (60*sample_rate)/maxbpm
k = 0
while(k < len(data) and data[k]/mx < threshold):
k += 1
k += 1
spacing = []
current = 1
progress = 0
while(k < len(data)):
if(k%(len(data)/100) == 0):
print(progress, "%")
progress += 1
if(data[k]/mx >= threshold and current > min_spacing):
spacing.append(current)
current = 0
else:
current += 1
k += 1
for x in range(len(spacing)):
spacing[x] = 60/(spacing[x]/sample_rate)
digits = [i for i in range(len(spacing))]
if(True):
plt.plot(digits, spacing)
plt.xlabel("N")
plt.ylabel("BPM")
plt.grid()
plt.show()
beat = np.mean(spacing)
error = np.std(spacing)
return (np.round(beat, 3), np.round(error, 3))
def filter_n_percent(song_name, offset, length, threshold):
# threshold is in ]0, 100]
subprocess.run(["ffmpeg", "-ss", str(offset), "-t", str(length), "-i", song_name, "crop.wav"])
sample_rate, song_data = wavfile.read('crop.wav')
subprocess.run(["clear"])
subprocess.run(["rm", "crop.wav"])
is_locked = [False for i in range(len(song_data))]
x = int((len(song_data)*threshold)//100)
print("X = ", x)
mx = max(song_data)
print("Retreiving the", int(x), "/", len(song_data), "highest values")
elements = heapq.nlargest(int(x), enumerate(song_data), key=lambda x: x[1])
print("Done")
for idx in range(len(elements)):
is_locked[elements[idx][0]] = True
for r in range(len(song_data)):
if(is_locked[r] == False):
song_data[r] = 0
if(True):
t = [offset + j/sample_rate for j in range(len(song_data))]
plt.plot(t, song_data)
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.grid()
plt.show()
return song_data
if(False):
#t, f, Zxx = fct("no.wav", 0, 0.032, 10, 5000, False)
#t, f, Zxx = fct("worlds_end_3.wav", 150.889, 0.032, 170.889, 3000, False)
#t, f, Zxx = fct("deltamax.wav", 9.992, 0.032, 114.318, 3000, False)
#t, f, Zxx = fct("deltamax.wav", 9.992, 0.032, 20, 3000, False)
#t, f, Zxx = fct("da^9.wav", 8.463, 0.032, 20, 5000, False)
t, f, Zxx = fct("13. Cosmic Mind.wav", 0, 0.032, 20, 5000, False)
#t, f, Zxx = fct("Furioso Melodia 44100.wav", 4, 0.032, 8, 3000, False)
#t, f, Zxx = fct("changing.wav", 0, 0.05, 3.9, 5000, False)
#fct("worlds_end_3.wav", 75, (60/178)/4, 75+2, 2500)
plot_max(t, f, Zxx, True)
if(False):
#(t, data) = peaks("worlds_end_3.wav", 0, 300, False, 0.92)
(t, data) = peaks("worlds_end_3.wav", 74.582, 6, False, 0.9)
#(t, data) = peaks("da^9.wav", 8.463, 301.924 - 8.463, False, 0.95)
#(t, data) = peaks("deltamax.wav", 8.463, 30101.924 - 8.463, False, 0.92)
da = find_bpm(t, 44100, data, 100, 200, 1, 10)
print("BPM data is", da)
if(True):
#data = filter_n_percent("worlds_end_3.wav", 74.582, 20, 0.1)
data = filter_n_percent("no.wav", 1, 10, 0.1)
#da = find_bpm(44100, data, 100, 200, 1, 0)
da = find_bpm_2(44100, data, 0.97, 240)
print("BPM is", da[0], "with std of", da[1])
print("Program finished with return 0")
#data = [-1 for i in range(int(x))]
#ids = [-1 for i in range(int(x))]
'''
data = []
ids = []
for k in range(int(x)):
data.append(int(7*mx/10))
ids.append(-1)
# structure there is [[index, value]...]
i = 0
calc = 0
while(i < len(song_data)):
if(i%10 == 0):
print(i, "/", len(song_data))
if(data[int(x)-1] < song_data[i]):
calc += 1
#print("\n \n \n \n \n")
data[int(x)-1] = song_data[i]
ids[int(x)-1] = i
k = int(x)-1
#while(k < int(x) & data[0] > data[k]):
while(k > 0 and data[k-1] <= data[k]):
data[k], data[k-1] = data[k-1], data[k]
ids[k], ids[k-1] = ids[k-1], ids[k]
k -= 1
#print(data[int(x)-1], calc, "/", x)
i += skip
i += 1
for s in range(int(x)-1):
if(data[s] < data[s+1]):
print("Nope", s)
assert(0)
''' '''

99
timing_points.csv Normal file
View File

@ -0,0 +1,99 @@
time,amplitude
74.834,27830
75.003,32767
75.087,32767
75.508,32767
75.593,25442
75.677,29518
75.846,32767
76.014,26270
76.183,32767
76.267,27283
76.52,32767
76.857,32767
77.194,32767
77.278,26713
77.531,32767
77.615,27054
77.699,29431
77.868,32767
77.952,27120
78.037,31654
78.205,32767
78.542,32767
78.626,24911
78.711,25315
78.879,32767
78.964,29835
79.216,32767
79.301,27455
79.469,27799
79.553,32767
79.722,25509
79.89,32767
79.975,25061
80.059,25816
80.228,32767
80.312,28958
80.48,29818
80.565,32767
80.902,32767
81.239,32767
81.323,26323
81.407,26077
81.576,32767
81.829,30393
81.913,32767
82.166,27691
82.25,32767
82.587,32767
82.671,27114
82.924,32767
83.008,28674
83.093,27410
83.261,32767
83.346,25455
83.43,27424
83.598,32767
83.851,25760
83.935,32767
84.02,27722
84.104,32379
84.273,32767
84.525,24740
84.61,32767
84.694,27458
84.778,27806
84.947,32767
85.115,31308
85.284,32767
85.368,26439
85.621,32492
85.705,29965
85.958,32767
86.126,32767
86.211,29632
86.295,32767
86.632,32767
86.716,26059
86.801,25544
86.969,32767
87.306,32767
87.39,25362
87.475,30738
87.643,32767
87.812,28238
87.896,25271
87.98,32767
88.233,26175
88.317,32767
88.486,25579
88.655,32767
88.739,27065
88.823,29194
88.992,32767
89.076,26450
89.16,25234
89.329,32767
89.413,29012
89.497,28347
1 time amplitude
2 74.834 27830
3 75.003 32767
4 75.087 32767
5 75.508 32767
6 75.593 25442
7 75.677 29518
8 75.846 32767
9 76.014 26270
10 76.183 32767
11 76.267 27283
12 76.52 32767
13 76.857 32767
14 77.194 32767
15 77.278 26713
16 77.531 32767
17 77.615 27054
18 77.699 29431
19 77.868 32767
20 77.952 27120
21 78.037 31654
22 78.205 32767
23 78.542 32767
24 78.626 24911
25 78.711 25315
26 78.879 32767
27 78.964 29835
28 79.216 32767
29 79.301 27455
30 79.469 27799
31 79.553 32767
32 79.722 25509
33 79.89 32767
34 79.975 25061
35 80.059 25816
36 80.228 32767
37 80.312 28958
38 80.48 29818
39 80.565 32767
40 80.902 32767
41 81.239 32767
42 81.323 26323
43 81.407 26077
44 81.576 32767
45 81.829 30393
46 81.913 32767
47 82.166 27691
48 82.25 32767
49 82.587 32767
50 82.671 27114
51 82.924 32767
52 83.008 28674
53 83.093 27410
54 83.261 32767
55 83.346 25455
56 83.43 27424
57 83.598 32767
58 83.851 25760
59 83.935 32767
60 84.02 27722
61 84.104 32379
62 84.273 32767
63 84.525 24740
64 84.61 32767
65 84.694 27458
66 84.778 27806
67 84.947 32767
68 85.115 31308
69 85.284 32767
70 85.368 26439
71 85.621 32492
72 85.705 29965
73 85.958 32767
74 86.126 32767
75 86.211 29632
76 86.295 32767
77 86.632 32767
78 86.716 26059
79 86.801 25544
80 86.969 32767
81 87.306 32767
82 87.39 25362
83 87.475 30738
84 87.643 32767
85 87.812 28238
86 87.896 25271
87 87.98 32767
88 88.233 26175
89 88.317 32767
90 88.486 25579
91 88.655 32767
92 88.739 27065
93 88.823 29194
94 88.992 32767
95 89.076 26450
96 89.16 25234
97 89.329 32767
98 89.413 29012
99 89.497 28347