import numpy as np, sys, soundfile as sf, time
import os; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))); import run as R, unmix as U, voiceline as VL
def setup(d='data_tune', start=2.5, secs=12):
    g_all=R.load_mp3(f'{d}/mix.mp3'); st={k: sf.read(f'{d}/stems/{k}.wav',dtype='float32')[0].T for k in ['voice','chords','bass','drums']}
    s0=int(start*16000); T=(int(secs*16000)//256)*256; cut=lambda x:x[...,s0:s0+T]
    g=cut(g_all); voice=cut(st['voice']); acc=cut(st['chords']+st['bass']+st['drums']); F=U.Frame(T)
    f0=VL.track(g,F); f0t=R.oracle_f0(cut(np.load(f'{d}/f0_true.npy')),F)
    Gm=np.abs(F.fwd(g.mean(0))); scale=float(np.median(Gm[Gm>0]))
    return g,voice,acc,F,f0,f0t,scale
def show(tag,out,g,voice,acc):
    v2=np.stack([out['v'],out['v']]); a=out['h']+out['p']
    e=lambda x: 10*np.log10(np.sum(x**2)+1e-12)
    print(f"{tag:34s} vSDR {R.sdr(voice,v2):6.2f} vSI {R.si_sdr(voice,v2):6.2f} aSDR {R.sdr(acc,a):6.2f} | energy dB v {e(v2)-e(voice):+.1f} h {e(out['h'])-e(g):+.1f} p {e(out['p'])-e(g):+.1f} (rel. truth voice / mix)", flush=True)
