tja-generator / synthesize.py
github-actions[bot]
Sync to HuggingFace Spaces
9df2e22
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