Prepare friendly song_process function

This commit is contained in:
Thibaud 2024-05-28 14:29:35 +02:00
parent d0f20b74e8
commit 3ed980795b
1 changed files with 30 additions and 36 deletions

View File

@ -11,6 +11,7 @@ import heapq
import scipy
import os
import random
from pathlib import Path
from time import sleep
print("Starting...\n")
@ -184,7 +185,7 @@ def round_t(id, sample_rate, bpm, div, offset, k0):
return t
return (t - 1/(bpm*div), 0)
def snap(data, sample_rate, bpm, divisor, show):
def snap(data, sample_rate, bpm, divisor, show=False):
# adjust time amplitudes to match the given BPM
new = [0 for x in range(int(1000*len(data)/sample_rate))] # 1pt per millisecond
print("old =", len(data))
@ -225,7 +226,7 @@ def snap(data, sample_rate, bpm, divisor, show):
def compress(Zxx):
res = []
def get_freq(song_name, offset, step, songlen, data):
def get_freq(song_name, offset, step, songlen, data, display=False):
fft_list = []
times = []
current_time = offset
@ -260,7 +261,7 @@ def get_freq(song_name, offset, step, songlen, data):
elif s != 0:
frequencies[s] = 0
if(True):
if(display):
plt.plot([t/1000 for t in range(len(data))], frequencies)
plt.grid()
plt.xlabel("Time (s)")
@ -271,7 +272,7 @@ def get_freq(song_name, offset, step, songlen, data):
return frequencies
def void_freq(song_name, offset, songlen, increment, minfreq, maxfreq, upperthr, ampthr, ampfreq, ampval, leniency, write):
def void_freq(song_name, offset, songlen, increment, minfreq, maxfreq, upperthr, ampthr, ampfreq, ampval, leniency, write, output_file="trimmed.wav"):
fft_list = []
times = []
current_time = offset
@ -341,7 +342,7 @@ def void_freq(song_name, offset, songlen, increment, minfreq, maxfreq, upperthr,
res[i] = np.int16(32767*res[i]/mx)
res = np.array(res)
wavfile.write("trimmed.wav", 44100, res)
wavfile.write(output_file, 44100, res)
#plt.plot(np.abs(pfreq[:len(fft_list[0])]), np.abs(fft_list[0]))
#plt.grid()
@ -379,38 +380,31 @@ def test_sample(timelist):
#BPM = 140
#Length = 32*60/BPM-0.01
Offset = 0
BPM = 160
Length = 30*60/BPM-0.01
DivLen = 60/BPM-0.01
N_iter = 48
print("Total length :", np.round(DivLen*N_iter, 3), "s")
subprocess.run(["sleep", "1"])
if(True):
#void_freq("tetris_4.wav", Offset, Offset+Length, 4*60/BPM, minfreq=0, maxfreq=330, upperthr=5000, ampthr=60, ampfreq = 1200, ampval = 7.27, leniency = 0.005, write=True)
void_freq("tetris_4.wav", Offset, Offset+DivLen*(N_iter+1)+0.01, 4*60/BPM, minfreq=0, maxfreq=330, upperthr=5000, ampthr=60, ampfreq = 1200, ampval = 7.27, leniency = 0.005, write=True)
if(False):
#data2 = filter_n_percent("worlds_end_3.wav", 74.582, 15, 0.2, reduce=False, show=True)
data2 = filter_n_percent("trimmed.wav", 0, Length, 0.5, reduce=False, show=False)
#data2 = filter_n_percent("tetris_3.wav", 7, Length, 0.01, reduce=False, show=False)
data2 = snap(data2, 44100, BPM, 4, show=True)
#timing_pts = get_tpts(data2, 1000, 1000)
#test_sample(timing_pts)
write_to_file_thr(1000, data2, Offset, 0.02, "timing_points.csv")
if(True):
datares = filter_n_percent_serial("trimmed.wav", Offset, N_iter, DivLen, 0.5)
datares = snap(datares, 44100, BPM, 4, show=True)
freqs = get_freq("trimmed.wav", Offset, DivLen, DivLen*N_iter, datares)
def convert_tuple(datares):
"""
Takes datares and converts it to a list of tuples (amplitude, time in ms)
"""
return [(i, datares[i]) for i in range(len(datares)) if datares[i] > 0]
print("Program finished with return 0")
def process_song(filename, offset, bpm, div_len_factor=60, n_iter=48, threshold=0.5, divisor=4):
div_len = div_len_factor/bpm-0.01
filtered_name = f"{filename}_trimmed.wav"
void_freq(filename, offset, offset+div_len*(n_iter+1)+0.01, 4*60/bpm, minfreq=0, maxfreq=330, upperthr=5000, ampthr=60, ampfreq = 1200, ampval = 7.27, leniency = 0.005, write=True, output_file=filtered_name)
datares = filter_n_percent_serial(filtered_name, offset, n_iter, div_len, threshold)
datares = snap(datares, 44100, bpm, 4)
frequencies = get_freq(filtered_name, offset, div_len, div_len*n_iter, datares)
Path(f"{filename}_trimmed.wav").unlink()
return convert_tuple(datares), frequencies
def main():
data, freq = process_song("tetris_4.wav", 0, 160)
print(data)
print("Program finished with return 0")
if __name__ == "__main__":
main()