From 3ed980795b2974dd40da022aa9ad42d86d4f4564 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 28 May 2024 14:29:35 +0200 Subject: [PATCH] Prepare friendly song_process function --- new-process.py | 66 +++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/new-process.py b/new-process.py index 8439707..31c5e9a 100755 --- a/new-process.py +++ b/new-process.py @@ -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() @@ -813,4 +807,4 @@ def void_freq(song_name, offset, songlen, increment, lthr, gthr): wavfile.write('test.wav', sample_rate, np.array(audio_signal, dtype=np.int16)) print("Done") -''' \ No newline at end of file +'''