Spaces:
Running
Running
from typing import List | |
import numpy as np | |
from librosa.util import peak_pick | |
from preprocess import * | |
def smooth(x, window_len=11, window="hanning"): | |
if x.ndim != 1: | |
raise ValueError | |
if x.size < window_len: | |
raise ValueError | |
if window_len < 3: | |
return x | |
if not window in ["flat", "hanning", "hamming", "bartlett", "blackman"]: | |
raise ValueError | |
s = np.r_[x[window_len - 1 : 0 : -1], x, x[-2 : -window_len - 1 : -1]] | |
# print(len(s)) | |
if window == "flat": # moving average | |
w = np.ones(window_len, "d") | |
else: | |
w = eval("np." + window + "(window_len)") | |
y = np.convolve(w / w.sum(), s, mode="valid") | |
return y | |
def detect(don_inference, ka_inference, delta=0.05): | |
don_inference = smooth(don_inference, 5) | |
ka_inference = smooth(ka_inference, 5) | |
don_timestamp = ( | |
peak_pick( | |
x=don_inference, | |
pre_max=1, | |
post_max=2, | |
pre_avg=4, | |
post_avg=5, | |
delta=delta, | |
wait=3, | |
) | |
+ 7 | |
) # 実際は7フレーム目のところの音 | |
ka_timestamp = ( | |
peak_pick( | |
x=ka_inference, | |
pre_max=1, | |
post_max=2, | |
pre_avg=4, | |
post_avg=5, | |
delta=delta, | |
wait=3, | |
) | |
+ 7 | |
) | |
print(don_timestamp) | |
print(ka_timestamp) | |
don_timestamp = don_timestamp[ | |
np.where(don_inference[don_timestamp] > ka_inference[don_timestamp]) | |
] | |
ka_timestamp = ka_timestamp[ | |
np.where(ka_inference[ka_timestamp] > don_inference[ka_timestamp]) | |
] | |
return don_timestamp, ka_timestamp | |
# def note_to_drumroll(timestamp, max_gap=5, min_note=3): | |
# drumroll = [] | |
# note = 0 | |
# for i in range(1, len(timestamp)): | |
# if timestamp[i] - timestamp[i - 1] <= max_gap: | |
# note += 1 | |
# else: | |
# if note >= min_note: | |
# drumroll.append((timestamp[i - note - 1], timestamp[i - 1])) | |
# note = 0 | |
# if note >= min_note: | |
# drumroll.append((timestamp[-note - 1], timestamp[-1])) | |
# return drumroll | |
def synthesize(don_timestamp, ka_timestamp, song, filepath): | |
song.don_timestamp = don_timestamp | |
song.timestamp = song.don_timestamp * 512 / song.samplerate | |
# print(len(song.timestamp)) | |
song.synthesize(diff="don") | |
# song.ka_timestamp = song.don_timestamp | |
song.ka_timestamp = ka_timestamp | |
song.timestamp = song.ka_timestamp * 512 / song.samplerate | |
# print(len(song.timestamp)) | |
song.synthesize(diff="ka") | |
song.save(filepath) | |
def create_tja( | |
song, | |
timestamps: List[tuple], | |
title="untitled", | |
subtitle="--", | |
wave="untitled.ogg", | |
safezone=2, | |
): | |
tja = f"TITLE: {title}\nSUBTITLE: {subtitle}\nBPM: 240\nWAVE:{wave}\nOFFSET:0\n\n" | |
for i, (don, ka) in enumerate(timestamps): | |
try: | |
level = [3, 5, 7, 8, 9][i] | |
scroll = [0.6, 0.7, 0.8, 0.9, 1.0][i] | |
don_timestamp = np.rint(don * 512 / song.samplerate * 100).astype(np.int32) | |
ka_timestamp = np.rint(ka * 512 / song.samplerate * 100).astype(np.int32) | |
length = np.max( | |
( | |
don_timestamp[-1] if don_timestamp.size > 0 else 0, | |
ka_timestamp[-1] if ka_timestamp.size > 0 else 0, | |
) | |
) | |
safezone_keep = 0 | |
tja += f"COURSE:{i}\nLEVEL:{level}\n\n#START\n#SCROLL {scroll}\n" | |
for time in range(length): | |
if np.isin(time, don_timestamp) == True and safezone_keep <= 0: | |
tja += "1" | |
safezone_keep = safezone | |
elif np.isin(time, ka_timestamp) == True and safezone_keep <= 0: | |
tja += "2" | |
safezone_keep = safezone | |
else: | |
tja += "0" | |
safezone_keep -= 1 | |
if time % 100 == 99: | |
tja += ",\n" | |
if length % 100 != 0: | |
tja += "0" * (100 - (length % 100)) + ",\n" | |
tja += "#END\n\n" | |
except: | |
pass | |
return tja | |