
    3jO                     *   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKr	S SK
r
S SKJr  S SKJrJr  S SKrS SKrS SKrS SKrS$S jrS$S jrS%S jrS&S jrS'S jrS'S	 jr  S(S
 jrS)S jrS*S jrS+S jr   S,S jrS-S jr S.S jr!S/S jr"S0S jr#  S1S jr$S2S jr%S3S jr&S4S jr'S5S jr( " S S\RR                  5      r* " S S\RR                  5      r+ " S S\RR                  5      r, " S S\RR                  5      r- " S  S!\5      r.S"\.4S# jr/g)6    N)override)ComfyExtensionioc                 p   [         R                  " U 5      n U(       a  SSU S-  -  S-
  -  $ SnSnX#U -  -   nSnXR-
  U-  n[         R                  " S5      S	-  nU R                  (       a)  X:  nU[         R                  " XpU   U-
  -  5      -  XH'   U$ X:  a  U[         R                  " XpU-
  -  5      -  nU$ )
zConvert mel to Hz (slaney)     @      $@     F@      ?        竪P@     @@皙@      ;@)np
asanyarraylogndimexp)	melshtkf_minf_spfreqs
min_log_hzmin_log_mellogsteplog_ts	            </home/wildlama/comfy/ComfyUI/comfy_extras/nodes_wandancer.py	mel_to_hzr      s    ==D
/#566ED4KEJ%-KffSkD Gyy#!BFF75kK6O+P$QQ L 
	RVVGk/A$BCCL    c                    [         R                  " U 5      n U(       a  S[         R                  " SU S-  -   5      -  $ SnSnX-
  U-  nSnXR-
  U-  n[         R                  " S5      S-  nU R                  (       a)  X:  nU[         R                  " X   U-  5      U-  -   XH'   U$ X:  a  U[         R                  " X-  5      U-  -   nU$ )	zConvert Hz to mel (slaney)r	   r
   r   r   r   r   r   r   )r   r   log10r   r   )	frequenciesr   r   r   r   r   r   r   r   s	            r   	hz_to_melr$   '   s    --,K
{U':!:;;;ED4'DJ%-KffSkD G)!BFF;+=
+J$Kg$UU K 
	"RVVK$<=GGKr    c                   ^% S nS m%U%4S jnS n	SS jn
Uc  SnUS	Xe-  -  -  nUS	[         R                  " U5      U-  -  -  nU" U5      nT%" U[        U5      S
U5      n[        [         R                  " [        U5      U-  5      5      n[        XT5      n/ nU R                  [         R                  5      n[        U5      n[        U5      n[        U5       GH  nUS:X  a  [        U* S5      nO[        U* US
-   -  U* U-  5      nUU   nUU   nU" UUS
U5      u  nnUR                  S
   nUR                  [         R                  5      nUUSS2[         R                  4   [        U5      -  -  n[        R                  R                  UUS
S9SS2SUS-  S
-   24   nU
" USS9nU[         R                  " UU-  5      -  n[         R                   " U[        US-  5      SS9nS
[#        U5      U-
  U-  -   n[         R$                  R&                  R)                  UUU4UR*                  S   UR*                  S   U-  4S9n[        R                  R-                  USS9nUR/                  UR1                  U5      5        US-  S:X  d  GM  US-  nUS	-  nU	" U5      nGM     [        S U 5       5      n [         R2                  " UU 4[         R                  S9n!Un"U HJ  n#U#R                  S   n$U"U$:  a  U#U"* S2SU 24   U!SU"2SS24'   OU#SS2SU 24   U!U"U$-
  U"2SS24'   U"U$-  n"ML     U![         R                  " U5      SS2[         R                  4   -  n![         R4                  " U!5      R                  [         R                  5      $ )z/Compute Constant-Q Transform (CQT) spectrogram.c                     [         R                  " U 5      n[         R                  " U 5      nSUS   US   -
  -  US'   SUS   US   -
  -  US'   SUSS  US S -
  -  USS& SSU-  -  S-
  SSU-  -  S-   -  $ )Nr
      r          @   )r   
empty_likelog2)r   bpologfs      r   _relative_bandwidth(compute_cqt.<locals>._relative_bandwidth<   s    mmE"wwu~Q$q')*AbDH,-B48d3Bi/0Ab	c	"S(SS3Y-?#-EFFr    c                 ,    [        U5      U-  nXA-  U -  $ N)float)r   srfilter_scalealphaQs        r   _wavelet_lengths%compute_cqt.<locals>._wavelet_lengthsD   s    ,%'v~r    c           	      \  > T" XX#5      n/ n[        X@5       GH\  u  pg[        R                  " [        U* S-  5      [        US-  5      [        S9n[        R
                  " US-  [        R                  -  U-  U-  5      S[        R                  " US-  [        R                  -  U-  U-  5      -  -   R                  [        R                  5      n	U	[        R                  R                  S[        U	5      SS9-  n	[        R                  " [        R                  " U	5      5      n
[        R                   " [        R"                  5      R$                  nU	['        X5      -  n	UR)                  U	5        GM_     ['        U5      n[        S[        R*                  " [        R,                  " U5      5      -  5      n[        R.                  " [        U5      U4[        R                  S9n[1        U5       H4  u  nn[        U[        U5      -
  S-  5      nUXUU[        U5      -   24'   M6     X4$ )Nr+   dtypey              ?hannTfftbinsr*   )zipr   arangeintr4   cospisinastype	complex64scipysignal
get_windowlensumabsfinfofloat32tinymaxappendceilr-   zeros	enumerate)	freqs_octr5   r6   	alpha_octlengthsfiltersilenfreqtsigl1rQ   max_lenn_fftoutkflpadr9   s                     r   _build_wavelet#compute_cqt.<locals>._build_waveletH   s   "9,Jg1JD		#teqj/3tqy>GA66!a%"%%-$.34"&&Q!5!:;;<=CVBLL=Q 5<<**63s8T*JJCs$B88BJJ',,D3r= CNN3 2 g,C2772777#3445hhGe,BLLAg&DAqA1,-D*+C4A&&' ' |r    c                 ,   Sn[        [        R                  " [        U 5      U-  5      5      nSn[        R
                  R                  SU-  S-   SU-  SS9n[        R
                  R                  U R                  [        R                  5      SSUS9n[        U5      U:  a  US U nO4[        U5      U:  a%  [        R                  " USU[        U5      -
  45      nU[        R                  " U5      -  nUR                  [        R                  5      $ )	N      ?r+      r'   gQ?)kaiserg      @)windowr   )rC   r   rT   rL   rI   rJ   firwinresample_polyrG   rP   padsqrt)yratio	n_samplesLhy_hats         r   _resample_half#compute_cqt.<locals>._resample_half\   s    A/0	LLa!TAXoN**188BJJ+?Aa*Pu:	!*9%EZ)#FF51i#e*&<"=>E||BJJ''r    {Gz?c                    [         R                  " U 5      n[         R                  " USSS9n[         R                  " US:H  SU5      n[         R                  " USS9n[         R
                  " XC-  SS9n[         R                  " XQ:  SS9n[        R                  R                  U R                  U R                  S9n[        U5       H.  u  p[         R                  " X(   XHU	4   :  5      n
XU
4   XxU
4'   M0     UR                  5       $ )Nr'   Taxiskeepdimsr   r
   r|   r<   )r   rN   rM   wheresortcumsumargminrI   sparse
lil_matrixshaper=   rV   tocsr)xquantilemagsnormsmag_sortcumulative_magthreshold_idxx_sparseijidxs              r   _sparsify_rows#compute_cqt.<locals>._sparsify_rowsj   s    vvayt!d3!S%0774a(8#3!<		.";!D<<**177!''*Bm,DA((47h!tn45C CyHV - ~~r    NVPZ@@r*   r'   r   )nr|   r+   )r   constantmoder   stridesr~   c              3   >   #    U  H  oR                   S    v   M     g7f)r(   N)r   ).0cs     r   	<genexpr>compute_cqt.<locals>.<genexpr>   s     0x!''"+xs   r<   )ry   )r   rB   r4   rC   rT   minrG   rP   rangeslicer   rH   newaxisrI   fftrp   ro   rL   libstride_tricks
as_stridedr   rfftrS   dotemptyrN   )&rq   r5   
hop_lengthfminn_binsbins_per_octavetuningr0   rf   rw   r   r   r7   rY   	n_octaves	n_filterscqt_respmy_ymy_srmy_hopr   slrW   rX   basisbasis_lengths	n_fft_oct	fft_basisy_padn_framesframesstft_resultmax_colcqt_outendc_in_octr9   s&                                        @r   compute_cqtr   9   st   G((  | 36345DCBIIf-?@AE&EueBiE:GBGGE&MO;<=IO,IH88BJJD"IE_F96	z4(B	zQU+iZ!^<B"I	"I	-i9M}KKN	 R\\*q"**}-i0@@@IIMM%91M=aAV9PQ>UVBVAV>VW	"9t<	U
 33	tSa0zBE
Y.699%%00h']]1%u}}Q'7&'@A 1 

 iinnV!n4	k23A:?qLFSLE!$'DA D 0x00Ghh(=G
C		!;"C45(7(?3GDSD!G*-a'k*:GC%KOQ&'u  rwww2::..G66'?!!"**--r    c                 X   Uc  SnX-  n[         R                  " [         R                  " U5      [        U5      SS9n[         R                  " U[        US-  5      * SS9n[        [         R
                  " X-  5      5      n[         R                  " XV5      SS2SU 24   n[         R                  " S[         R                  " US-  5      -  S-   S5      n[        [         R                  " XrS	-  -  5      5      n[         R                  " XXS
S9nUR                  [         R                  5      $ )zMap CQT bins to chroma bins.Nr   r'   r~   r+           {@E   g      (@r   )r   repeateyerC   rollrT   tilemodr-   roundrG   rP   )	n_inputr   n_chromar   n_mergecq_to_chr   midi_0r   s	            r   cq_to_chroma_mappingr      s     | (Gyy)3w<a@Hwwx#gl"3!3!<HBGGG567Iwwx+AxxK8HVVB..3R8FrxxT/234DwwxA.H??2::&&r    c                    [         R                  " U SUS9n[         R                  " U SUS9nX#-   SU -  -
  nX#-
  S-  n[         R                  " U 5      n[         R                  " U5      [         R                  " U5      :  nXW   * XG   -  Xg'   US:X  d  XR                  S-
  :X  a  SUSSS24'   SUSSS24'   U$ US:X  a
  SUS	'   SUS
'   U$ )z:Compute parabolic interpolation shift for peak refinement.r(   r~   r'   r+   r*   r)   r   Nr   .r(   .)r   r   
zeros_likerN   r   )Sr|   S_nextS_prevabshiftsvalids           r   _parabolic_interpolationr      s    WWQ&FWWQ%F!a%A	CA]]1FFF1Iq	!EXI(FMrzTVVaZ'q!tr1u
 M	 
vwMr    c                    [         R                  " U SUS9n[         R                  " U SUS9nX:  X:  -  nUS:X  d  XR                  S-
  :X  a%  U SSS24   U SSS24   :  USSS24'   SUSSS24'   U$ US:X  a  U S	   U S
   :  US	'   SUS'   U$ )z Find local maxima along an axis.r'   r~   r(   r)   r+   NFr   r   )r)   .r   )r   r   r   )r   r|   r   r   	local_maxs        r   	_localmaxr      s     WWQ%FWWQ&F,IrzTVVaZ'RU8aAh.	"a%	!Q$
 	 
wZ!G*4	'!	&r    c           
         UGcR  U c  [        S5      e[        R                  R                  SUSS9n[	        U5      U:  aI  [        U[	        U5      -
  S-  5      n	[        R                  " X[        U[	        U5      -
  U	-
  5      4SS9nUR                  S	5      n[        R                  " U [        US-  5      SS9n
S
[	        U
5      U-
  U-  -   n[        R                  R                  R                  U
X;4U
R                  S   U
R                  S   U-  4S9n[        R                  R                  X-  R                  [        R                   5      SS9n[        R"                  " U5      n[%        US5      n['        U[)        U5      S-  5      n[        R                  R+                  UR,                  S   S-  S-
  SU-  5      n[	        U5      UR,                  S   :  a  USUR,                  S    n[/        USS9n[        R0                  " USS9nSU-  U-  n[        R2                  " U5      n[        R2                  " U5      nX]:*  X:  -  nUR                  SS
5      nU[        R$                  " USSS9-  n[5        X"U:  -  SS9n[        R6                  " UU-  5      nUS   UU   -   [)        U5      -  UR,                  S   S-  S-
  -  UU'   UU   UU   -   UU'   UU4$ )z>Pitch tracking on thresholded parabolically-interpolated STFT.NzEither y or S must be providedr>   Tr?   r+   r   r   r(   r'   r'   r   r   r~   r
   ri   r(   r{   )
ValueErrorrI   rJ   rK   rL   rC   r   ro   reshaper   r   r   r   r   r   rG   rP   rN   rR   r   r4   rfftfreqr   r   gradientr   r   nonzero)rq   r5   r   ra   r   r   fmax	threshold
fft_windowre   r   r   r   	fft_freqsshiftavgdskewpitchesr   	freq_mask	ref_valuer   r   s                          r   piptrackr      s   
 	y9=>>\\,,VUD,I
z?U"J/A56D
3us:7NQU7U3V,W^hiJ''0
q#eqj/
;E
U*z99%%00#]]1%u}}Q'7*'DE 1 
 IINNJ/77

C!NL
q	AtQ<DtU2Y]#D
Q 2C"H=I
9~
"kqwwqz*	$QQ/E
++aa
 C#IEmmAG==D"y'78I!!"a(IBFF11t<<I!9}-A6I
**Y*
+CFU3Z'594
Q8JKGCL#s#DID=r    c                     SSX-  -  -  n[         R                  " [         R                  " U 5      [        U5      S-  -  5      nU$ )z+Convert frequencies (Hz) to octave numbers.r   r*      )r   r-   r   r4   )r#   r   r   A440octss        r   
hz_to_octsr   +  s@     36344D772==-tr1ABCDKr    c           
         [         R                  " U 5      n X S:     n [         R                  " U 5      (       d  g[         R                  " U[	        U SUS9-  S5      nX3S:  ==   S-  ss'   [         R
                  " SS[        [         R                  " SU-  5      5      S-   5      n[         R                  " X45      u  pVU[         R                  " U5         nU$ )z4Estimate tuning offset from a collection of pitches.r   r   )r   r   r
   ri         r'   )
r   
atleast_1danyr   r   linspacerC   rT   	histogramargmax)r#   
resolutionr   residualbinscountsr   
tuning_ests           r   pitch_tuningr  3  s     --,KAo.K66+vvo
;sET)V VWZ\H_$;;tS#bggcJ.>&?"@1"DED\\(1NF		&)*Jr    c           
         SnSn[        U 5      U:  a  g[        XX4SSSS9u  pVUS:  nUR                  5       (       d  g[        R                  " Xg   5      nXVU:  U-     n	[        U	5      S:X  a  g[        U	S	US
9n
[        U
5      $ )z-Estimate global tuning deviation from 12-TET.      r        b@     @@皙?)rq   r5   ra   r   r   r   r   r   ry   )r  r   )rL   r   r   r   medianr  r4   )rq   r5   r   ra   r   pitchmag
pitch_maskr   valid_pitchesr   s              r   estimate_tuningr  F  s    EJ
1v~AE$6SBJE J>>		#/*I)+z9:M
=Q-D/ZF=r    c           
         [        XUS9nSn	XE-  n
[        XUXUUS9n[        XX9S9n[        R                  " X5      n[        R
                  " UR                  5      R                  n[        R                  " [        R                  " U5      SSS9n[        R                  " X5      nX-  n/ SQn/ S	Qn[        R                  " U5      n[        UU5       H  u  nnUUU:  U-  -  nM     Ubs  US:  am  [        R                  R                  S
US-   SS9nU[        R                  " U5      -  nUR!                  SS5      n[        R"                  R%                  UUSS9nOUnUS:X  au  [        R
                  " UR                  5      R                  n[        R&                  " [        R                  " US-  SSS95      n[        R                  " UU5      nUU-  nU$ U[        R(                  :X  ap  [        R
                  " UR                  5      R                  n[        R*                  " [        R                  " U5      SSS9n[        R                  " UU5      nUU-  nU$ )z<Compute Chroma Energy Normalized Statistics (CENS) features.)r   r   )r5   r   r   r   r   r   )r   r   r   r   Tr{   )g?皙?r  g?)      ?r  r  r  r>   r+   Fr?   r'   r(   r   r   )r  r   r   r   r   rO   r=   rQ   rM   rN   maximumr   rA   rI   rJ   rK   r   ndimageconvolverp   infrR   )rq   r5   r   r   r   r   win_len_smoothnormr   r   r   cqt_mag
chroma_mapchromar   
chroma_sumquant_stepsquant_weightschroma_quantstepweightwinchroma_smoothchroma_norms                           r   compute_chroma_censr)  a  s   
 QODFD(F!z")8 &(G
 &f.6CJVVJ(F&++IvQ>JJ2J F'K,M==(LK7f$&00 8 !nq&8ll%%fnq.@%%Prvvc{kk!R ..|Sz.R$qyHH]00166	ggbff]a%7a$OPjji8%3  
HH]00166	ffRVVM2TJjji8%3r    c                    Uc  U S-  n[         R                  " U[        SUS-  -   5      4[         R                  S9n[         R                  R                  USU -  S9n[        U5      n[        U5      n[         R                  " XxUS-   5      n	[        U	5      n
[         R                  " U
5      n[         R                  R                  X5      n[        U5       HI  nX   * X   -  nXS-      XS-      -  n[         R                  " S[         R                  " X5      5      X]'   MK     SU
SUS-    U
SU -
  -  nUUSS2[         R                  4   -  nU$ )	z#Create mel-scale filterbank matrix.Nr*   r'   r+   r<   r
   )r   dr   )r   rU   rC   rP   r   r   r$   r   r   diffsubtractouterr   r  minimumr   )r5   ra   n_melsr   r   	mel_basisfftfreqsmin_melmax_melr   mel_ffdifframpsr   lowerupperenorms                    r   _create_mel_filterbankr;    s.   |Cx&#a%1*n"56bjjIIvv#(3HoGoG;;w!4DdOEGGENEKKe.E6]	EH$!euU|+zz!RZZ%=>	 
 56A:&w78Eq"**}%%Ir    c           
      J   [         R                  R                  SUSS9n[        U5      U:  aI  [	        U[        U5      -
  S-  5      n[
        R                  " XV[	        U[        U5      -
  U-
  5      4SS9nUR                  S5      n[
        R                  " U [	        US-  5      SS9nS[        U5      U-
  U-  -   nX(4n	UR                  S	   UR                  S	   U-  4n
[
        R                  R                  R                  XyU
S
9n[         R                  R                  X[-  S	S9R                  [
        R                  5      n[
        R                   " U5      S-  n[#        XUSUS-  S9n[
        R$                  " X5      nUR                  [
        R&                  5      $ )z*Compute mel spectrogram from audio signal.r>   Tr?   r+   r   r   r   r'   r   r   r~   r   r*   )r0  r   r   )rI   rJ   rK   rL   rC   r   ro   r   r   r   r   r   r   r   rG   rH   rN   r;  r   rP   )datar5   ra   r   r0  r   re   data_paddedr   r   r   r   r   
power_specr1  mel_specs                   r   _compute_mel_spectrogramrA    sl   (((EJ
:EC
O+12VVJs53z?3JT3Q/R(SZde
##G,J&&s5A:Z@KC$u,;;HE""1%{':':1'=
'JKGVV!!,,[w,WF))..!41.=DDR\\RK$)J&rcPRUXPXYIvvi,H??2::&&r    c           	         [        U 5      US-  :  a  [        R                  " S5        gSn[        XXTSS9nS[        R
                  " [        R                  " SU5      5      -  nS	nUS
S
2US
24   US
S
2S
U* 24   -
  n	[        R                  " SU	5      n
[        R                  " U
SS9nXSU-  -  -   n[        R                  " XS4SS9nUS
UR                  S	    n[        XXBUSS9$ )z/Estimate tempo using autocorrelation tempogram.
   zDAudio too short for tempo estimation, returning default BPM of 120.0      ^@r	     )ra   r   r0  r   绽|=r'   Nr   r   r~   r+   r   r         t@)	max_tempo)rL   loggingwarningrA  r   r"   r  meanro   r   estimate_tempo_from_onset)audio_npr5   	start_bpmstd_bpmr   ra   mel_S	log_mel_SlagS_diffS_onsetonset_env_pre	pad_width	onset_envs                 r   quick_tempo_estimaterX    s     8}zB&^_E$X^abErxx

5% 899I
Cq#$w)AuuH"55Fjjf%GGGG!,MJ//I}!n:FI/5;;q>*I$YJ7^cddr    c                 t   [        U 5      S:  a  gSn[        [        R                  " Xa-  U-  5      5      n[	        U[        U 5      5      nUS-  n[        R
                  " XU4SSS9n	[        U 5      n
Xz4nU	R                  S   U	R                  S   4n[        R                  R                  R                  XUS	9n[        R                  R                  S
USS9nXSS2[        R                  4   -  n[        R                  " Xz45      n[        U
5       H  nUSS2U4   n[        R                   R#                  S[        U5      -  S-
  5      n[        R                   R%                  UUS9n[        R&                  " U5      S-  n[        R                   R)                  UUS9nUSU USS2U4'   M     [        R*                  " [        R&                  " U5      SS9nUS:  nUSS2U4==   UU   -  ss'   [        R,                  " USS9n[        R.                  " US5      n[        R                  " U[        R0                  S9n[        R2                  US'   SU-  U[        R4                  " SU5      -  -  USS& S[        R6                  " U5      [        R6                  " U5      -
  U-  S-  -  nUb<  [        [        R8                  " UU:  5      5      nUS:  a  [        R2                  * USU& [        R:                  " SU-  5      U-   n[        [        R8                  " USS 5      5      S-   nUU   nU$ )zLEstimate tempo from onset strength envelope using autocorrelation tempogram.   rD  g       @r+   linear_ramp)r   r   )r   
end_valuesr   r   r>   Tr?   Nr'   )r   r~   r<         N@r
   r   g    .A)rL   rC   r   r   r   ro   r   r   r   r   rI   rJ   rK   r   rU   r   r   next_fast_lenr   rN   irfftrR   rK  r  float64r  rB   r-   r  log1p) rW  r5   r   rN  rO  rH  ac_size
win_lengthrV  onset_paddedr   r   r   r   hann_windowwindowed_frames	tempogramr   framen_pad
fft_resultpowspecacac_maxmasktempogram_meanbpmslogpriormax_idxweightedbest_idxtempos                                    r   rL  rL    s   
9~GRXXglZ789JZY0JaI66)%;-\bcL9~H"E##A&(<(<Q(?@GVV!!,,\PW,XF,,))&*d)KK1bjj=99O*/0I8_1%		''CJ(:;YY^^EU^3
&&$)YY__W_.[j/	!Q$  VVBFF9%A.FA:Dag&,&WWYQ/NZZ2N88Jbjj1DffDGbyJ3
)CCDDH	(::gE!KKHbiiy 012Q;"$&&HXgxxn,-8H299Xab\*+a/HNELr    c	                    U [         R                  " U 5      -
  n	[         R                  " U	5      n
U
S:  a  X-  n	[        X1-  U-  5      n[        XA-  U-  5      S-   n[        XQ-  U-  5      n[        Xa-  U-  5      S-   n[        Xq-  U-  5      n[         R                  " [        U	5      [        S9nU	S   [         R                  " U	S[        U[        U	5      5       5      :  US'   US==   U	S   [         R                  " U	S[        U[        U	5      5       5      U-   :  -  ss'   US   (       a  US-   nOSnU[        U	5      :  a  [         R                  " U	[        SUU-
  5      [        UU-   [        U	5      5       5      nU	U   U:H  UU'   UU   (       d  US-  nMg  [         R                  " U	[        SUU-
  5      [        UU-   [        U	5      5       5      nUU==   U	U   UU-   :  -  ss'   UU   (       d  US-  nM  UUS-   -  nU[        U	5      :  a  M  [         R                  " U5      R                  [         R                  5      $ )z0Detect onset peaks using peak picking algorithm.r   r'   r<   N)r   r   rR   rC   rU   rL   boolrK  flatnonzerorG   int32)rW  r5   r   pre_maxpost_maxpre_avgpost_avgwaitdeltaonset_normalized	onset_maxpre_max_framespost_max_framespre_avg_framespost_avg_frameswait_framespeaksr   maxnavgns                       r   detect_onset_peaksr    s?    !266)#44'(I1}+7
23N(-*459O
23N(-*459Odi*,-KHHS)*$7E #rvv.>?kOUXYiUj@k.l'mmE!H	!H!!$0@Am#oWZ[kWlBm0n(orw(wwxHQx!O
c"#
#vv&s1a..@'A#a/FY[^_o[pBqrs$Q'4/aQxFAww'Aq>/A(B3q?GZ\_`p\qCrsta%a(D5L89QxFA	[1_ c"#
#" >>% ''11r    c                 r
   X#-  n[         R                  " US-  U-  5      nUS::  d  [        U 5      S:  a#  [         R                  " / [         R                  S9$ [         R
                  " U SS9nUS:  a  X-  n	OU n	[         R                  " U* US-   5      n
[         R                  " SU
S-  U-  S-  -  5      n[        R                  R                  XS	S
9n[         R                  " [        U5      S[         R                  S9n[         R                  " [        U5      [         R                  S9nSUR                  5       -  nSnSUS'   US   US'   [        U5      n[!        S[        U5      5       H  nUU   n[         R"                  * nSn[        U[         R                  " US-  5      -
  5      n[        USU-  -
  S-
  5      n[!        UUS5       HS  nUS:  a    OLUU   U[         R$                  " UU-
  5      [         R$                  " U5      -
  S-  -  -
  nUU:  d  MO  UnUnMU     US:  a	  UU-   UU'   OUUU'   U(       a  UU:  a  SUU'   M  UUU'   SnM     [         R                  " [        U5      [&        S9nSUS'   [!        S[        U5      S-
  5       H)  nUU   UUS-
     :  =(       a    UU   UUS-      :  UU'   M+     [        U5      S:  a  US   US   :  US'   [         R(                  " U5      (       aZ  [         R*                  " UU   5      nSU-  nSn[!        [        U5      S-
  SS5       H  nUU   (       d  M  UU   U:  d  M  Un  O   O[        U5      S-
  n[         R                  " [        U5      [&        S9nUn[-        5       n US:  a/  UU ;  a)  SUU'   U R/                  U5        UU   nUS:  a  UU ;  a  M)  U(       Ga3  [         R(                  " U5      (       Ga  [         R0                  " U5      n!UU!   n"[         R2                  " S5      n#[         R                  " U"U#5      n$U$[        U#5      S-  [        U5      [        U#5      S-  -    n%S[         R4                  " [         R6                  " U%S-  5      5      -  nSn&U&[        U5      :  a-  UU&   U::  a$  SUU&'   U&S-  n&U&[        U5      :  a  UU&   U::  a  M$  [        U5      S-
  n'U'S:  a$  UU'   U::  a  SUU''   U'S-  n'U'S:  a  UU'   U::  a  M  [         R0                  " U5      R9                  [         R                  5      $ )z&Track beats using dynamic programming.r]  r   r+   r<   r'   )ddofr   g      @@samer   r(   ry   Tr*   Fr)   ri      )r   r   rL   arrayry  stdrB   r   rI   rJ   r  fullrU   r`  rR   rC   r   r  r   rw  r   r  setaddrx  hanningrp   rK  rG   )(rW  ru  r5   r   	tightnesstrim
frame_rateframes_per_beat	onset_stdr  window_rangerl   
localscorebacklinkcumscorescore_thresh
first_beatfpbr   score_i
best_scorebeat_locationsearch_start
search_endlocscorelocal_max_mask
median_maxr   tailbeatsr   visitedbeat_positionsbeat_localscoreswsmooth_boe_full
smooth_boestart_frame	end_frames(                                           r   track_beatsr  9  s    JhhzD0589O!s9~1xx"((++yq)I1}$0$99o-/BCLVVDL4//AaGGHF&&'7f&MJwws:"((;HxxJrzz:H*..**LJHQKQ-HQK
o
C1c*o&Q-ffW
1rxxc	223QWq)
z26CQwSMIC266#;1NST0T$TTEz!"
 # 7 A!J.HQK!HQK'L0HQK'HQKJ7 ': XXc(m48NN11c(ma'(%a[8AaC=8\x{hWXYZWZm?[q ) 8}q%b\HRL8r	vvnYYx78
*$	s8}q("b1Aa  Xa[I%= 2
 8}q HHS_D1EAeG
q&Qg%aAQK q&Qg%
 u.%n5JJqM++&6:$SVQYZ3q6191LM
"''"''*/":;;	C
O+
;0G90T!&E+1K C
O+
;0G90T 
Oa'	1nI!6)!C$E)NI 1nI!6)!C >>% ''11r    c                     SnU SS2US24   U SS2SU* 24   -
  n[         R                  " SU5      n[         R                  " USS9nX1SU-  -  -   n[         R                  " XVS4SS9nUSU R                  S    nU$ )	z@Compute onset strength envelope from a log-mel spectrogram (dB).r'   Nr   r   r~   r+   r   r   )r   r  rK  ro   r   )mel_spec_dbra   r   rR  
onset_diffenvelope_pre_padrV  envelopes           r   compute_onset_enveloper    s    
CQW%AuuH(==JC,Jwwz2J//Ivv&AZHH-**1-.HOr    c                     [         R                  R                  U SSSS9SU R                  nUR	                  [
        R                  5      $ )z6Compute MFCC features from a log-mel spectrogram (dB).r   r+   ortho)r|   typer  N)rI   r   dctTrG   r   rP   )r  n_mfccmfccs      r   compute_mfccr    s<    99==117=CGVLNND;;rzz""r    c                 @   [         R                  " U 5      n S[         R                  " [         R                  " X5      5      -  nUS[         R                  " [         R                  " X5      5      -  -  nUb'  [         R                  " XDR	                  5       U-
  5      nU$ )zEConvert a power spectrogram (amplitude squared) to decibel (dB) unitsr   )r   asarrayr"   r  rR   )r   amintop_dbreflog_specs        r   power_to_dbr    sp    


1Abhhrzz$233Hrxx

4 5666H::h(?@Or    c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)WanDancerEncodeAudioi  c                 |   [         R                  " SS[         R                  R                  S5      [         R                  R                  SSS[
        R                  SS9[         R                  R                  S	S
SSSSS9/[         R                  R                  SS9[         R                  R                  SSS9/S9$ )Nr  model/conditioning/wan/danceraudiovideo_frames   r'      defaultr   rR   r$  audio_inject_scaler
   r   r   ry   zDThe scale for the audio features when injected into the video model.r  r   rR   r$  tooltipaudio_encoder_outputdisplay_name
fps_stringz`The calculated fps based on the audio length and the number of video frames. Used in the prompt.r  r  node_idcategoryinputsoutputs)r   SchemaAudioInputIntnodesMAX_RESOLUTIONFloatAudioEncoderOutputOutputStringclss    r   define_schema"WanDancerEncodeAudio.define_schema  s    yy*4w'^SaUEYEY`ab3SctZ^  io  p %%,,:P,Q		  l  Eg   h
 	
r    returnc           	         US   S   nUS   nSnSnSnSn	UR                   S   S:  a  UR                  SS	S
9n[        UR                  5       R	                  5       R                  5       XWS9n
Xg-  n[        R                  R                  XEU5      nUR	                  5       R                  5       R                  5       n[        XXSS9n[        USSSS9n[        XU5      n[        USS9n[        XUS9R                  n[        XUS9n[         R"                  " U[         R$                  S9nSUU'   ['        XXzS9n[)        UUXSSS9n[         R"                  " U[         R$                  S9nSUU'   [         R*                  " US S 2S 4   UUUS S 2S 4   US S 2S 4   /SS9n[,        R.                  " U5      R1                  S5      R3                  [4        R6                  R9                  5       5      n[;        U[=        UR                   S   U-  S-   5      -  5      nUUUS.n[=        US-   5      S:w  a  SR?                  U5      nOS n[@        RB                  " UU5      $ )!Nwaveformr   sample_rate   r
  "V  r	  r'   F)dimkeepdim)r   rE  )r0  rF        T@r
   )r  r  r  rZ  )r  )rq   r5   r   )r5   r   r<   )r5   r   rN  d   T)r  r  r(   r~   ri   )audio_featurefpsr  u    帧率是{:.4f}u   , 帧率是30fps。)"r   rK  rX  squeezecpunumpy
torchaudio
functionalresamplerA  r  r  r  r)  r  r  r   r   rP   rL  r  concatenatetorch
from_numpy	unsqueezetocomfymodel_managementintermediate_devicer4   rC   formatr   
NodeOutput)r  r  r  r  r  r  base_fpsr   model_srra   rN  resample_srwaveform_npr@  r  r  r  r  	peak_idxspeak_onehotbeat_tracking_tempo	beat_idxsbeat_onehotr  r  r  r  s                              r   executeWanDancerEncodeAudio.execute  sW   $Q'M*
 >>!q }}E}:H()9)9);)?)?)A)G)G)I;n	 +((11(Ulln**,446+K5]`a!(tM)+jIK3${JWYY&xT	mmHBJJ?!$I7Zdz*=x_bimn	mmHBJJ?!$Iagfk!T'.BKPQSWPWDXY
 ((7AA!DGGH^H^HrHrHtuHs=#6#6q#9L#H3#NOOP +"4 
 sSy>R+2237J.J}}1:>>r     N
__name__
__module____qualname____firstlineno__classmethodr  r   r
  r  __static_attributes__r  r    r   r  r    s3    
 
 5? 5? 5?r    r  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanDancerVideoi  c                    [         R                  " SS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  S5      [         R
                  R                  SSS[        R                  SS	9[         R
                  R                  S
SS[        R                  SS	9[         R
                  R                  SSS[        R                  SSS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSS9/[         R                  R                  SS9[         R                  R                  SS9[         R                  R                  SS S!9/S"9$ )#Nr  r  positivenegativevaewidthi  r   r  heighti@  lengthr  r'   r  zKThe number of frames in the generated video. Should stay 149 for WanDancer.r  clip_vision_outputTz+The CLIP vision embeds for the first frame.)optionalr  clip_vision_output_refz/The CLIP vision embeds for the reference image.start_imagez@The initial image(s) to be encoded, can be any number of frames.rn  zrImage conditioning mask for the start image(s). White is kept, black is generated. Used for the local generations.r  )r(  r  latentzEmpty latent.r  r  )r   r  Conditioningr  Vaer  r  r  ClipVisionOutputImageMaskr  r  Latentr  s    r   r  WanDancerVideo.define_schema  s   yy$4%%j1%%j1U#Wcru?S?SZ\]Xs@T@T[]^Xsu?S?SZ[  fs  t##))*>  XE)  F##))*BT  \M)  N}t  FH  Ift  >r  s%%++,BT+R &&J&?&&J&?		  h P!
 	
r    Nr  c           	      |   [         R                  " SSUS-
  S-  S-   US-  US-  /[        R                  R	                  5       S9nUGb>  [        R
                  R                  US U R                  SS5      XESS5      R                  SS5      n[         R                  " XeXGR                  S   4UR                  UR                  S	9nX}S UR                  S
   & UR                  US S 2S S 2S S 2S S24   5      nUc{  [         R                  " SSUR                  S   UR                  S   UR                  S   4UR                  UR                  S	9nSUS S 2S S 2S UR                  S
   S-
  S-  S-   24'   OSUS U R                  S
5      -
  n[        R
                  R                  XR                  S   UR                  S   SS5      n[         R                  " [         R                  " US S 2S
S24   SSS9US S 2SS 24   /SS9nUR!                  SUR                  S   S-  SUR                  S   UR                  S   5      R#                  SS5      n[$        R&                  " XUS.5      n[$        R&                  " X.US.5      nU	b2  [$        R&                  " XU
S.5      n[$        R&                  " X)U
S.5      nUb`  [$        R&                  " XS   US   UR)                  SS5      S.5      n[$        R&                  " X+S   US   UR)                  SS5      S.5      n0 nUUS'   [*        R,                  " XU5      $ )Nr'   r   r     )devicer(   bilinearcenterr5  r=   r      r+   r)   r   znearest-exactdisabled)repeatsr  )r  )concat_latent_imageconcat_mask)r'  r)  r  r  r  r
   )audio_embedr  r  samples)r  rU   r  r  r  utilscommon_upscalemovedimr   r5  r=   encodeonesr  catrepeat_interleaveview	transposenode_helpersconditioning_set_valuesgetr   r
  )r  r!  r"  r#  r$  r%  r&  r*  rn  r'  r)  r  r+  imager<  r=  
out_latents                    r   r  WanDancerVideo.execute+  sS   avza&71%<fk5TU:V_d_u_u  `J  `J  `L  M"++44[&5I5Q5QRTVW5XZ_isu}~  G  G  HI  KM  NKKK8I8I"8M NWbWiWiq|  rC  rC  DE+6';$$Q'("%**U1aBQB;-?"@|#jj!QQATAZAZ[]A^`s`y`yz|`})~  HS  HZ  HZ  bm  bs  bs  tLOAq"H[%6%6q%9A%=!$Cq#H"HHI$w-"9"9!"<<#kk88F_F_`bFcexe~e~  @B  fC  ET  V`  a#ii)@)@QPQRSPSVAT^_ef)gituvxyxzuzi{(|  CD  E)..q+2C2CA2F!2KQPcPiPijlPm  pC  pI  pI  JL  pM  N  X  X  YZ  \]  ^#;;H  CN  GO  PH#;;H  CN  GO  PH)#;;H  Lb  Gc  dH#;;H  Lb  Gc  dH+#;;HkzV{  EY  Z_  E`  xL  xP  xP  Qe  gj  xk  Gl  mH#;;HkzV{  EY  Z_  E`  xL  xP  xP  Qe  gj  xk  Gl  mH
 &
9}}X<<r    r  )NNNNNr  r  r    r   r  r    sB    
 
0 =  wy  wD  wD = =r    r  c                   d    \ rS rSr\S 5       r\S 5       r\SS\R                  4S jj5       r	Sr
g)	WanDancerPadKeyframesiM  c                    [         R                  " SS[         R                  R                  S5      [         R                  R                  SSSSSS	9[         R                  R                  S
SSSSS	9[         R
                  R                  SSS9/[         R                  R                  SSS9[         R                  R                  SSS9[         R
                  R                  SSS9/S9$ )NrP  image/videoimagessegment_lengthr  r'   '  z+Length of this segment (usually 149 frames)r  r   rR   r  segment_indexr   r  z7Which segment this is (0 for first, 1 for second, etc.)r  zFAudio to calculate total output frames from and extract segment audio.r  keyframes_sequencezPadded keyframe sequencer  keyframes_maskzMask indicating valid framesaudio_segmentz$Audio segment for this video segmentr  r   r  r/  r  r  r  r  r0  r  s    r   r  #WanDancerPadKeyframes.define_schemaN  s    yy+"x)-su  WD  E_aQC  RK  Lw0xy	 -AKef,<Fde_Flm
 	
r    c                    UR                   u  pVpxSn	US   R                   S   US   -  n
X)-  nSnX:  a  [        X-
  U-  5      S-   OSnX-  n[        R                  " X&U4UR                  UR
                  S9n[        R                  " X&Xx4UR
                  UR                  S	9nUS:  Ga  US:  Ga  [        U5      U-  n[        [        R                  " X-  5      5      nUUS-
  :H  n/ nSn[        U5       HA  nUUS-
  :X  a
  XU-  -
  S-
  OUS-
  nSnUU-  UU-
  :  a  US-  nUU-  UU-
  :  a  M  UU-  nMC     U(       a
  XU-  -
  S-
  OUS-
  nSnUU-  UU-
  :  aK  [        [        R                  " UU-  5      5      nUR                  UUU-   45        US-  nUU-  UU-
  :  a  MK  UR                  UUU-   45        U VVs/ s H  u  nnUU:  d  M  UU:  d  M  UU4PM     nnnU(       at  [        U6 u  nn[        R                  " U[        R                  UR                  S	9n[        R                  " U[        R                  UR                  S	9nSUU'   UU   UU'   X)-  nX;-  n[        UU-   U
5      n US   n![        UU!-  5      n"[        U U!-  5      n#US   S S 2S S 2U"U#24   n$U$U!S
.n%UUU%4$ s  snnf )Nr  r  r(   r  r  r'   r   r8  )r=   r5  )r  r  )r   rC   r  rU   r5  r=   r4   mathrT   r   rS   rA   tensorlongr   )&r  rS  rT  rW  r  BHWCr  audio_durationsegment_durationbuffernum_segmentstotal_framesrn  	keyframesframe_intervalseg_numis_last_segment	positionsimages_before_this_segmentseg_idxend_idxcnt	end_indexposr   valid_positionsseg_positionsimg_indices
start_timeend_timer  start_sample
end_sampleaudio_segment_waveformr[  s&                                         r   
do_execute WanDancerPadKeyframes.do_execute`  s3   \\
a z*004u]7KK)/P^PgsN37GGH1Lmn#4{{Nq1&--v||\KKA 9V\VcVcd	 !A"<014N$))L$ABCG,!;OI)*& !/KRV]`aVaKa<7*BBQFhvyzhzN*W~-EE1HC N*W~-EE*c1* 0 P_(FFJesvwewIC&^)CC$))NS$89:  #'AC'G!HIq &^)CC i)Cc)IJK:Ch)hc3sQwzSVYgSgzSz)Oh-0/-B*{ %]%**U[UbUb c#ll;ejjQWQ^Q^_&']#+1++>	-( */"5
z$44nEM*:34K/0
!&z!21aj9P3P!Q.&

 $--1 is   	J;J;"J;Nr  c                 H    [         R                  " U R                  XX45      6 $ r3   )r   r
  r~  )r  rS  rT  rW  r  s        r   r  WanDancerPadKeyframes.execute  s    }}cnnV]Z[[r    r  r3   )r  r  r  r  r  r  r~  r   r
  r  r  r  r    r   rP  rP  M  sM    
 
" @. @.D \2== \ \r    rP  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)WanDancerPadKeyframesListi  c                    [         R                  " SS[         R                  R                  S5      [         R                  R                  SSSSSS	9[         R                  R                  S
SSSSS	9[         R
                  R                  SSS9/[         R                  R                  SSSS9[         R                  R                  SSSS9[         R
                  R                  SSSS9/S9$ )Nr  rR  rS  rT  r  r'   rU  z+Length of each segment (usually 149 frames)rV  ri  r  z*How many padded segments to emit as lists.r  z(Audio to slice for each emitted segment.rX  rY  zPadded keyframe sequencesT)r  r  is_output_listrZ  zMasks indicating valid framesr[  z$Audio segment for each video segmentr  r\  r  s    r   r  'WanDancerPadKeyframesList.define_schema  s    yy/"x(-su  WD  E^QA3P|}w0Z[	 -AKfw{|,<Fevz{_Fl  ~B  C
 	
r    Nr  c           	          [        U5       Vs/ s H  n[        R                  XXT5      PM     nn[        U6 u  pxn	[        R
                  " [        U5      [        U5      [        U	5      5      $ s  snf r3   )r   rP  r~  rA   r   r
  list)
r  rS  rT  ri  r  r   r  rk  masksaudio_segmentss
             r   r  !WanDancerPadKeyframesList.execute  sa    _deq_rs_rZ[(33FAU_rs+.=(	.}}T)_d5k4;OPP ts    A.r  r3   r  r  r    r   r  r    s6    
 
" Q"-- Q Qr    r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)WanDancerExtensioni  r  c                 6   #    [         [        [        [        /$ 7fr3   )r  r  rP  r  )selfs    r   get_node_list WanDancerExtension.get_node_list  s       !%	
 	
s   r  N)r  r  r  r  r   r  r  r   	ComfyNoder  r  r  r    r   r  r    s)    
T$r||*<%= 
 
r    r  r  c                     #    [        5       $ 7fr3   )r  r  r    r   comfy_entrypointr    s     s   )F)r  r
  NT   r   r   )r   r   N)r)   )Nr  Nr	  r
  r  r  r  )r   r   )ry   r   )r  r   )r  r
  r      $   )   r+   )rE  r   N)r	  r
  rE  )rD  r
   r
  )rD  r
   rG  )r  r
  Q?r   r  r  r  gQ?)r  T)r	  r
  )rZ  )rF  r  r
   )0r_  r  rI  r  r  comfy.model_managementr  comfy.utilsr  r   rI  typing_extensionsr   comfy_api.latestr   r   scipy.signalrI   scipy.ndimage	scipy.fftscipy.sparser   r$   r   r   r   r   r   r   r  r  r)  r;  rA  rX  rL  r  r  r  r  r  r  r  r  rP  r  r  r  r  r    r   <module>r     s"            & /    
$$}.@'&,& ?B033l&6 ?A46/00f.',e,3l TWDH)2Xo2b#G?2<< G?T9=R\\ 9=xX\BLL X\tQ Q2
 
  2  r    