
    +jS                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z
d dlmZ d dlmZmZ d dlZd dlZd dlZd dlZd?dZd?dZd@dZdAdZdBdZdBdZ	 	 dCdZdDdZdEdZdFdZ	 	 	 dGdZdHd Z dId!Z!dJd$Z"dKd&Z#	 	 dLd)Z$dMd,Z%dNd-Z&dOd/Z'dPd2Z( G d3 d4ej)                  Z* G d5 d6ej)                  Z+ G d7 d8ej)                  Z, G d9 d:ej)                  Z- G d; d<e          Z.d=e.fd>Z/dS )Q    N)override)ComfyExtensionioFc                 V   t          j        |           } |rdd| dz  z  dz
  z  S d}d}||| z  z   }d}||z
  |z  }t          j        d          d	z  }| j        r-| |k    }|t          j        || |         |z
  z            z  ||<   n#| |k    r|t          j        || |z
  z            z  }|S )
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
 7/#566EDD4KEJ%-KfSkkD Gy D#!BF7d5kK6O+P$Q$QQe			RVGtk/A$BCCCL    c                 t   t          j        |           } |rdt          j        d| dz  z             z  S d}d}| |z
  |z  }d}||z
  |z  }t          j        d          dz  }| j        r-| |k    }|t          j        | |         |z            |z  z   ||<   n#| |k    r|t          j        | |z            |z  z   }|S )	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fSkkD G Hz)!BF;u+=
+J$K$Kg$UUU	
	"	"RVK*$<==GGKr    "V     T      r   c                   % d }d %%fd}d }	dd}
|d}|d	||z  z  z  }|d	t          j        |          |z  z  z  } ||          } %|t          |          d
|          }t          t          j        t          |          |z                      }t          ||          }g }|                     t           j                  }t          |          }t          |          }t          |          D ]}|dk    rt          | d          }nt          | |d
z   z  | |z            }||         }||         } |||d
|          \  }}|j
        d
         }|                    t           j                  }||ddt           j        f         t          |          z  z  }t          j                            ||d
          ddd|dz  d
z   f         } |
|d          }|t          j        ||z            z  }t          j        |t          |dz            d          }d
t#          |          |z
  |z  z   }t           j        j                            |||f|j        d         |j        d         |z  f          }t          j                            |d          }|                    |                    |                     |dz  dk    r|dz  }|d	z  } |	|          }t          d |D                       } t          j        || ft           j                  }!|}"|D ]M}#|#j
        d         }$|"|$k     r|#|" dd| f         |!d|"ddf<   n|#ddd| f         |!|"|$z
  |"ddf<   |"|$z  }"N|!t          j        |          ddt           j        f         z  }!t          j        |!                              t           j                  S )z/Compute Constant-Q Transform (CQT) spectrogram.c                    t          j        |           }t          j        |           }d|d         |d         z
  z  |d<   d|d         |d         z
  z  |d<   d|dd          |d d         z
  z  |dd<   dd|z  z  dz
  dd|z  z  dz   z  S )Nr
      r          @   )r   
empty_likelog2)r   bpologfs      r   _relative_bandwidthz(compute_cqt.<locals>._relative_bandwidth<   s    mE""wu~~Q$q')*AbDH,-B48d3B3i/0AbD	c	"S(SS3Y-?#-EFFr    c                 6    t          |          |z  }||z  | z  S N)float)r   srfilter_scalealphaQs        r   _wavelet_lengthsz%compute_cqt.<locals>._wavelet_lengthsD   s"    ,%'2v~r    c           	          | |||          }g }t          ||           D ][\  }}t          j        t          | dz            t          |dz            t                    }t          j        |dz  t          j        z  |z  |z            dt          j        |dz  t          j        z  |z  |z            z  z                       t          j	                  }	|	t          j                            dt          |	          d          z  }	t          j        t          j        |	                    }
t          j        t          j                  j        }|	t'          |
|          z  }	|                    |	           ]t'          |          }t          dt          j        t          j        |                    z            }t          j        t          |          |ft          j	                  }t1          |          D ]@\  }}t          |t          |          z
  dz            }|||||t          |          z   f<   A||fS )Nr/   dtypey              ?hannTfftbinsr.   )zipr   arangeintr7   cospisinastype	complex64scipysignal
get_windowlensumabsfinfofloat32tinymaxappendceilr1   zeros	enumerate)	freqs_octr8   r9   	alpha_octlengthsfiltersilenfreqtsigl1rS   max_lenn_fftoutkflpadr<   s                     r   _build_waveletz#compute_cqt.<locals>._build_waveletH   s   ""9b,	JJgy11 	  	 JD$	#teqj//3tqy>>GGGA6!a%"%-$.344"&Q!5!:;;;<=CVBL=Q=Q 5<**63s88T*JJJCs$$B8BJ'',D3r4== CNN3g,,C27277#3#344455hGe,BLAAAg&& 	, 	,DAqA1,--D*+C4A&&''G|r    c                 ^   d}t          t          j        t          |           |z                      }d}t          j                            d|z  dz   d|z  d          }t          j                            |                     t          j	                  dd|          }t          |          |k    r|d |         }n:t          |          |k     r't          j
        |d|t          |          z
  f          }|t          j        |          z  }|                    t          j	                  S )	N      ?r/      r+   gQ?)kaiserg      @)windowr   )rE   r   rV   rN   rK   rL   firwinresample_polyrI   rR   padsqrt)yratio	n_samplesLhy_hats         r   _resample_halfz#compute_cqt.<locals>._resample_half\   s    A//00	La!TAXoNN**188BJ+?+?Aa*PPu::	!!*9*%EEZZ)##F51i#e**&<"=>>E||BJ'''r    {Gz?c                 0   t          j        |           }t          j        |dd          }t          j        |dk    d|          }t          j        |d          }t          j        ||z  d          }t          j        ||k     d          }t          j        	                    | j
        | j                  }t          |          D ]:\  }}	t          j        ||         |||	f         k              }
| ||
f         |||
f<   ;|                                S )Nr+   Taxiskeepdimsr   r
   r|   r>   )r   rP   rO   wheresortcumsumargminrK   sparse
lil_matrixshaper?   rX   tocsr)xquantilemagsnormsmag_sortcumulative_magthreshold_idxx_sparseijidxs              r   _sparsify_rowsz#compute_cqt.<locals>._sparsify_rowsj   s   vayyt!d333!S%0074a(((8e#3!<<<	.8";!DDD<**17!'*BBm,, 	) 	)DAq(47hq!tn455C CyHQV~~r    NVPZ@@r.   r+   r   )nr|   r/   )r   constantmoder   stridesr~   c              3   0   K   | ]}|j         d          V  dS )r,   N)r   ).0cs     r   	<genexpr>zcompute_cqt.<locals>.<genexpr>   s(      00!!'"+000000r    r>   )ry   )r   rD   r7   rE   rV   minrI   rR   rangeslicer   rJ   newaxisrK   fftrq   rp   rN   libstride_tricks
as_stridedr   rfftrU   dotemptyrP   )&rr   r8   
hop_lengthfminn_binsbins_per_octavetuningr4   rh   rx   r   r   r:   r[   	n_octaves	n_filterscqt_respmy_ymy_srmy_hopr   slrY   rZ   basisbasis_lengths	n_fft_oct	fft_basisy_padn_framesframesstft_resultmax_colcqt_outendc_in_octr<   s&                                        @r   compute_cqtr   9   s<   G G G      (( ( (        | 36O345DCBIf--?@AE&&EueBiiE::GBGE&MMO;<<==IOV,,IH88BJD"IIE__F9  (  (66	z4((BB	zQU+iZ!^<<B"I	"I	-~i9MM}KN	 R\**qqq"*}-i0@0@@@IMM%91M==aaaAV9PQ>UVBVAV>VW	"N9t<<<	U
 3 33	tSa00zBBBE

Y.699%00h']1%u}Q'7&'@A 1 
 

 innV!n44	k22333A:??qLFSLE!>$''D00x00000Gh(===G
C  	!;;"C455(7(?3GDSD!!!G*-aaa'k*:GC%KOQQQ&'urww2:..G6'??!!"*---r    c                 t   |d}||z  }t          j        t          j        |          t          |          d          }t          j        |t          |dz             d          }t          t          j        | |z                      }t          j        ||          ddd| f         }t          j        dt          j        |dz            z  dz   d          }t          t          j	        ||d	z  z                      }t          j        ||d
          }|
                    t           j                  S )zMap CQT bins to chroma bins.Nr   r+   r~   r/   r(        {@E   g      (@r   )r   repeateyerE   rollrV   tilemodr1   roundrI   rR   )	n_inputr   n_chromar   n_mergecq_to_chr   midi_0r   s	            r   cq_to_chroma_mappingr      s    | (Gy))3w<<a@@@Hwx#gl"3"3!3!<<<HBGGo56677Iwx++AAAxxK8HVB...3R88Frx(T/23344DwxA...H??2:&&&r    r-   c                    t          j        | d|          }t          j        | d|          }||z   d| z  z
  }||z
  dz  }t          j        |           }t          j        |          t          j        |          k     }||          ||         z  ||<   |dk    s|| j        dz
  k    rd|dddf<   d|dddf<   n|dk    r
d|d	<   d|d
<   |S )z:Compute parabolic interpolation shift for peak refinement.r,   r~   r+   r/   r.   r-   r   Nr   .r,   .)r   r   
zeros_likerP   r   )Sr|   S_nextS_prevabshiftsvalids           r   _parabolic_interpolationr      s    WQ&&&FWQ%%%F!a%A	&CA]1FF1IIq		!EuXI%(F5MrzzTQVaZ''q!!!tr111u	vwMr    c                 :   t          j        | d|          }t          j        | d|          }| |k    | |k    z  }|dk    s|| j        dz
  k    r+| dddf         | dddf         k    |dddf<   d|dddf<   n |dk    r| d	         | d
         k    |d	<   d|d<   |S )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     WQ%%%FWQ&&&FVV,IrzzTQVaZ''RU8aAAAh.	"aaa%	!QQQ$	wZ!G*4	'!	&r            b@     @@皙?c           
      x   |z| t          d          t          j                            d|d          }t	          |          |k     r[t          |t	          |          z
  dz            }	t          j        ||	t          |t	          |          z
  |	z
            fd          }|                    d	          }t          j        | t          |dz            d          }
d
t	          |
          |z
  |z  z   }t          j	        j
                            |
||f|
j        d         |
j        d         |z  f          }t          j                            ||z                      t          j                  d          }t          j        |          }t%          |d          }t'          |t)          |          dz            }t          j                            |j        d         dz  dz
  d|z            }t	          |          |j        d         k    r|d|j        d                  }t/          |d          }t          j        |d          }d|z  |z  }t          j        |          }t          j        |          }||k    ||k     z  }|                    dd
          }|t          j        |dd          z  }t5          |||k    z  d          }t          j        ||z            }|d         ||         z   t)          |          z  |j        d         dz  dz
  z  ||<   ||         ||         z   ||<   ||fS )z>Pitch tracking on thresholded parabolically-interpolated STFT.NzEither y or S must be providedr@   TrA   r/   r   r   r,   r+   r+   r   r   r~   r
   rj   r,   r{   )
ValueErrorrK   rL   rM   rN   rE   r   rp   reshaper   r   r   r   r   r   rI   rR   rP   rT   r   r7   rfftfreqr   r   gradientr   r   nonzero)rr   r8   r   rc   r   r   fmax	threshold
fft_windowrg   r   r   r   	fft_freqsshiftavgdskewpitchesr   	freq_mask	ref_valuer   r   s                          r   piptrackr      s   
 	y9=>>>\,,VUD,II
z??U""J/A566D
T3us:7NQU7U3V3V,W^hiiiJ''00
q#eqj//
;;;E

U*z99%00(#]1%u}Q'7*'DE 1 
 
 INNJ/77
CC!NLL
q		AtQ<<DtU2YY]##D
Q 2C"H==I
9~~
""kqwqzk*	$QQ///E
+aa
 
 
 C#IEmAG=D"y4'78I!!"a((IBF11t<<<<I!q9}-A666I
*Y*
+
+CFU3Z'5994
Q8JKGCL#s#DID=r    c                     dd||z  z  z  }t          j        t          j        |           t          |          dz  z            }|S )z+Convert frequencies (Hz) to octave numbers.r   r.      )r   r1   r   r7   )r#   r   r   A440octss        r   
hz_to_octsr   +  sF     36O344D72=--tr1ABCCDKr    ry   c           
         t          j        |           } | | dk             } t          j        |           sdS t          j        |t	          | d|          z  d          }||dk    xx         dz  cc<   t          j        ddt          t          j        d|z                      dz             }t          j        ||          \  }}|t          j	        |                   }|S )z4Estimate tuning offset from a collection of pitches.r   r   )r   r   r
   rj         r+   )
r   
atleast_1danyr   r   linspacerE   rV   	histogramargmax)r#   
resolutionr   residualbinscountsr   
tuning_ests           r   pitch_tuningr  3  s     -,,KkAo.K6+ svo
;sET)V )V )V VWZ\ \HX_$;tS#bgcJ.>&?&?"@"@1"DEED\(D11NFF	&))*Jr    c           	      \   d}d}t          |           |k     rdS t          | |||ddd          \  }}|dk    }|                                sdS t          j        ||                   }|||k    |z           }	t          |	          dk    rdS t          |	d	|
          }
t          |
          S )z-Estimate global tuning deviation from 12-TET.r   r&   r   r   r   r   )rr   r8   rc   r   r   r   r   r   ry   )r  r   )rN   r   r   r   medianr  r7   )rr   r8   r   rc   r   pitchmag
pitch_maskr   valid_pitchesr   s              r   estimate_tuningr  F  s    EJ
1vv~~sA"Ej$6SB B BJE3 J>> s	#j/**I3)+z9:M
=Qs-D/ZZZF==r       $   )   r/   c           	         t          | ||          }d}	||z  }
t          | |||	|
||          }t          |
|||	          }t          j        ||          }t          j        |j                  j        }t          j        t          j	        |          dd          }t          j
        ||          }||z  }g d}g d	}t          j        |          }t          ||          D ]\  }}|||k    |z  z  }|{|dk    rut          j                            d|dz   d          }|t          j        |          z  }|                    dd          }t          j                            ||d          }n|}|dk    ret          j        |j                  j        }t          j        t          j        |dz  dd                    }t          j
        ||          }||z  }nq|t          j        k    rat          j        |j                  j        }t          j        t          j	        |          dd          }t          j
        ||          }||z  }|S )z<Compute Chroma Energy Normalized Statistics (CENS) features.)r   r   )r8   r   r   r   r   r   )r   r   r   r   Tr{   )g?皙?r   g?)      ?r  r  r  Nr@   r/   FrA   r+   r,   r   r   )r  r   r   r   r   rQ   r?   rS   rO   rP   maximumr   rC   rK   rL   rM   r   ndimageconvolverq   infrT   )rr   r8   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]   
 QODDDFD(F!z"6)8 &( ( (G
 &fo.6TC C CJVJ((F&&+IvQ>>>JJ	22Jj F'''K,,,M=((LK77 1 1f$&00!nq&8&8l%%fnq.@%%PPrvc{{kk!R  ..|Sz.RR$qyyH]0116	gbf]a%7a$OOOPPji88%3	H]0116	fRVM22TJJJji88%3r       c                    || dz  }t          j        |t          d|dz  z             ft           j                  }t           j                            |d| z            }t          |          }t          |          }t          j        |||dz             }	t          |	          }
t          j	        |
          }t           j
                            |
|          }t          |          D ]V}||          ||         z  }||dz            ||dz            z  }t          j        dt          j        ||                    ||<   Wd|
d|dz            |
d|         z
  z  }||ddt           j        f         z  }|S )	z#Create mel-scale filterbank matrix.Nr.   r+   r/   r>   r
   )r   dr   )r   rW   rE   rR   r   r   r$   r   r   diffsubtractouterr   r  minimumr   )r8   rc   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"56bjIIIIv#(33HooGooG;w!44DdOOEGENNEKeX..E6]] ? ?q	E!H$a!euQU|+z!RZu%=%=>>	!56A:&ww78Eqqq"*}%%Ir    c           
         t           j                            d|d          }t          |          |k     r[t	          |t          |          z
  dz            }t          j        ||t	          |t          |          z
  |z
            fd          }|                    d          }t          j        | t	          |dz            d          }dt          |          |z
  |z  z   }||f}	|j        d	         |j        d	         |z  f}
t
          j	        j
                            ||	|

          }t           j                            ||z  d	                              t
          j                  }t          j        |          dz  }t#          |||d|dz            }t          j        ||          }|                    t
          j                  S )z*Compute mel spectrogram from audio signal.r@   TrA   r/   r   r   r   r+   r   r   r~   r   r.   )r0  r   r   )rK   rL   rM   rN   rE   r   rp   r   r   r   r   r   r   r   rI   rJ   rP   r;  r   rR   )datar8   rc   r   r0  r   rg   data_paddedr   r   r   r   r   
power_specr1  mel_specs                   r   _compute_mel_spectrogramrA    s   (((EEJ
:EC
OO+122VJs53z??3JT3Q/R/R(SZdeee
##G,,J&s5A:Z@@@KC$$u,;;HHE"1%{':1'=
'JKGV!,,[w,WWF)..f!41.==DDR\RRK$$)J&r5cPRUXPXYYYIvi,,H??2:&&&r          ^@r
   c                    t          |           |dz  k     rt          j        d           dS d}t          | |||d          }dt	          j        t	          j        d|                    z  }d	}|d
d
|d
f         |d
d
d
| f         z
  }	t	          j        d|	          }
t	          j        |
d          }||d|z  z  z   }t	          j        ||dfd          }|d
|j	        d	                  }t          |||||d          S )z/Estimate tempo using autocorrelation tempogram.
   zDAudio too short for tempo estimation, returning default BPM of 120.0rB  r   r)  )rc   r   r0  r   绽|=r+   Nr   r   r~   r/   r   r         t@)	max_tempo)rN   loggingwarningrA  r   r"   r  meanrp   r   estimate_tempo_from_onset)audio_npr8   	start_bpmstd_bpmr   rc   mel_S	log_mel_SlagS_diffS_onsetonset_env_pre	pad_width	onset_envs                 r   quick_tempo_estimaterW    s"    8}}zB&&^___uE$Xr:^abbbErx
5% 8 8999I
Cqqq#$$w)AAAuuH"55Fjf%%GGG!,,,MeJ//I}y!n:FFFI/5;q>/*I$YJ	7^cddddr    rF  c                    t          |           dk     rdS d}t          t          j        ||z  |z                      }t	          |t          |                     }|dz  }t          j        | ||fdd          }	t          |           }
||
f}|	j        d         |	j        d         f}t          j        j        	                    |	||	          }t          j                            d
|d          }||ddt          j        f         z  }t          j        ||
f          }t          |
          D ]}|dd|f         }t          j                            dt          |          z  dz
            }t          j                            ||          }t          j        |          dz  }t          j                            ||          }|d|         |dd|f<   t          j        t          j        |          d          }|dk    }|dd|fxx         ||         z  cc<   t          j        |d          }t          j        |d          }t          j        |t          j                  }t          j        |d<   d|z  |t          j        d|          z  z  |dd<   dt          j        |          t          j        |          z
  |z  dz  z  }|=t          t          j        ||k                         }|dk    rt          j         |d|<   t          j        d|z            |z   }t          t          j        |dd                             dz   }||         }|S )zLEstimate tempo from onset strength envelope using autocorrelation tempogram.   rB  g       @r/   linear_ramp)r   r   )r   
end_valuesr   r   r@   TrA   Nr+   )r   r~   r>         N@r
   r   g    .A)rN   rE   r   r   r   rp   r   r   r   r   rK   rL   rM   r   rW   r   r   next_fast_lenr   rP   irfftrT   rJ  r  float64r  rD   r1   r  log1p) rV  r8   r   rM  rN  rG  ac_size
win_lengthrU  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   rK  rK    s(   
9~~uGRXglZ78899JZY00JaI6)i%;-\bcccL9~~H"E#A&(<Q(?@GV!,,\PW,XXF,))&*d)KKK{111bj=99O*h/00I8__ * *1%	''CJJ(:;;Y^^EU^33
&$$)Y__W_..[j[/	!!!Q$VBF9%%A...FA:Daaag&,&WYQ///NZ22N8Jbj111DfDGbyJ3
)C)CCDDH	(:(::gE!KKHbiy 01122Q;;"$&HXgXxn,--8H29Xabb\**++a/HNELr    Q?Q?c	                 b   | t          j        |           z
  }	t          j        |	          }
|
dk    r|	|
z  }	t          ||z  |z            }t          ||z  |z            dz   }t          ||z  |z            }t          ||z  |z            dz   }t          ||z  |z            }t          j        t          |	          t                    }|	d         t          j        |	dt          |t          |	                                       k    |d<   |dxx         |	d         t          j        |	dt          |t          |	                                       |z   k    z  cc<   |d         r|dz   }nd}|t          |	          k     rt          j        |	t          d||z
            t          ||z   t          |	                                       }|	|         |k    ||<   ||         s|dz  }{t          j        |	t          d||z
            t          ||z   t          |	                                       }||xx         |	|         ||z   k    z  cc<   ||         s|dz  }||dz   z  }|t          |	          k     t          j        |          	                    t           j
                  S )z0Detect onset peaks using peak picking algorithm.r   r+   r>   N)r   r   rT   rE   rW   rN   boolrJ  flatnonzerorI   int32)rV  r8   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    !26)#4#44'((I1}}+i72
233N(R-*4559O2
233N(R-*4559OdRi*,--KHS)**$777E #rv.>?kOUXYiUjUj@k@k?k.l'm'mmE!H	!HHH!!$0@Am#oWZ[kWlWlBmBmAm0n(o(orw(wwxHHHQx !O
c"##
#
#v&s1a..@'A'A#a/FY[^_o[p[pBqBq'qrss$Q'4/aQx 	FAw'Aq>/A(B(B3q?GZ\_`p\q\qCrCr(rstta%a(D5L89Qx 	FA	[1_ c"##
#
#" >%  ''111r    d   Tc                     ||z  }t          j        |dz  |z            }|dk    st          |           dk     r t          j        g t           j                  S t          j        | d          }|dk    r| |z  }	n| }	t          j        | |dz             }
t          j        d|
dz  |z  dz  z            }t          j	        
                    |	|d	
          }t          j        t          |          dt           j                  }t          j        t          |          t           j                  }d|                                z  }d}d|d<   |d         |d<   t          |          }t!          dt          |                    D ]}||         }t           j         }d}t          |t          j        |dz            z
            }t          |d|z  z
  dz
            }t!          ||d          D ]O}|dk     r nF||         |t          j        ||z
            t          j        |          z
  dz  z  z
  }||k    r|}|}P|dk    r	||z   ||<   n|||<   |r||k     rd||<   |||<   d}t          j        t          |          t&                    }d|d<   t!          dt          |          dz
            D ]/}||         ||dz
           k    o||         ||dz            k    ||<   0t          |          dk    r|d         |d         k    |d<   t          j        |          r^t          j        ||                   }d|z  }d}t!          t          |          dz
  dd          D ]}||         r||         |k    r|} nnt          |          dz
  }t          j        t          |          t&                    }|}t-                      } |dk    r0|| vr,d||<   |                     |           ||         }|dk    r|| v,|rJt          j        |          r5t          j        |          }!||!         }"t          j        d          }#t          j
        |"|#          }$|$t          |#          dz  t          |          t          |#          dz  z            }%dt          j        t          j        |%dz                      z  }d}&|&t          |          k     r5||&         |k    r)d||&<   |&dz  }&|&t          |          k     r||&         |k    )t          |          dz
  }'|'dk    r(||'         |k    rd||'<   |'dz  }'|'dk    r||'         |k    t          j        |                              t           j                  S )z&Track beats using dynamic programming.r\  r   r/   r>   r+   )ddofr   g      @@samer   r,   ry   Tr.   Fr-   rj      )r   r   rN   arrayrz  stdrD   r   rK   rL   r  fullrW   r_  rT   rE   r   r  r   rx  r   r
  setaddry  hanningrq   rJ  rI   )(rV  rt  r8   r   	tightnesstrim
frame_rateframes_per_beat	onset_stdr  window_rangerm   
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JhzD05899O!s9~~11x"(++++yq)))I1}}$y0$9o-/BCCLVDL4//AaGGHHF&&'7f&MMJws:"(;;;HxJrz:::H*..***LJHQKQ-HQK
o

C1c*oo&&  Q-fW
1rxc	22233QWq))
z266 	$ 	$CQwwSMIC26#;;1NST0T$TTEz!!"
 #A!J.HQKK!HQK 	'L00HQKK'HQKJJXc(mm4888NN11c(mma'(( ] ]%a[8AaC=8\x{hWXYZWZm?[q
8}}q%b\HRL8r	vn 
!Yx788
*$	s8}}q("b11 	 	Aa  Xa[I%=%=8}}q HS__D111EAeeG
q&&Qg%%aAQK q&&Qg%%
  u ..%n5JqMM+&6::$SVVQYZ3q66191L%LM
"'"'*/":":;;;	C
OO++
;0G90T0T!&E+1K C
OO++
;0G90T0T 
OOa'	1nnI!6)!C!C$E)NI 1nnI!6)!C!C >%  ''111r    c                    d}| dd|df         | ddd| f         z
  }t          j        d|          }t          j        |d          }||d|z  z  z   }t          j        ||dfd          }|d| j        d                  }|S )	z@Compute onset strength envelope from a log-mel spectrogram (dB).r+   Nr   r   r~   r/   r   r   )r   r  rJ  rp   r   )mel_spec_dbrc   r   rQ  
onset_diffenvelope_pre_padrU  envelopes           r   compute_onset_enveloper    s    
CQQQW%AAAuuH(==JC,,Jwz222eJ//Iv&AZHHHH-*1--.HOr    rY  c                     t           j                            | ddd          d|         j        }|                    t
          j                  S )z6Compute MFCC features from a log-mel spectrogram (dB).r   r/   ortho)r|   typer  N)rK   r   dctTrI   r   rR   )r  n_mfccmfccs      r   compute_mfccr    s=    9==117=CCGVGLND;;rz"""r    rE        T@c                 4   t          j        |           } dt          j        t          j        ||                     z  }|dt          j        t          j        ||                    z  z  }|*t          j        ||                                |z
            }|S )zEConvert a power spectrogram (amplitude squared) to decibel (dB) unitsr   )r   asarrayr"   r  rT   )r   amintop_dbreflog_specs        r   power_to_dbr    s}    

1Abhrz$22333Hrx
4 5 56666H:h(?@@Or    c                   J    e Zd Zed             Zedej        fd            ZdS )WanDancerEncodeAudioc                    t          j        ddt           j                            d          t           j                            dddt
          j        d          t           j                            d	d
dddd          gt           j        	                    d          t           j
        	                    dd          g          S )Nr  model/conditioning/video_modelsaudiovideo_frames   r+      defaultr   rT   r#  audio_inject_scaler
   r   r   ry   zDThe scale for the audio features when injected into the video model.r  r   rT   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_schemaz"WanDancerEncodeAudio.define_schema  s    y*6w''^SaUEY`abb3SctZ^  io  p  p %,,:P,QQ	  l  Eg   h  h
 
 
 	
r    returnc           	         |d         d         }|d         }d}d}d}d}	|j         d         dk    r|                    dd	
          }t          |                                                                                                ||          }
||z  }t          j                            |||          }|                                                                                                }t          |||	|d          }t          |ddd          }t          ||	|          }t          |d          }t          |||          j        }t          |||          }t!          j        |t           j                  }d||<   t'          ||||
          }t)          ||||dd          }t!          j        |t           j                  }d||<   t!          j        |d d d f         |||d d d f         |d d d f         gd          }t-          j        |                              d                              t4          j                                                  }t;          |t=          |j         d         |z  dz             z            }|||d}t=          |dz             dk    rd                    |          }nd }tA          j!        ||          S )!Nwaveformr   sample_rate   r&   r%   r   r+   F)dimkeepdim)r   r)  )r0  rE  r  r
   )r  r  r  rY  )r  )rr   r8   r   )r8   r   r>   )r8   r   rM  r  T)r  r  r,   r~   rj   )audio_featurefpsr  u    帧率是{:.4f}u   , 帧率是30fps。)"r   rJ  rW  squeezecpunumpy
torchaudio
functionalresamplerA  r  r  r  r(  r  r  r   r   rR   rK  r  concatenatetorch
from_numpy	unsqueezetocomfymodel_managementintermediate_devicer7   rE   formatr   
NodeOutput)r  r  r  r  r  r  base_fpsr   model_srrc   rM  resample_srwaveform_npr@  r  r  r  r  	peak_idxspeak_onehotbeat_tracking_tempo	beat_idxsbeat_onehotr  r  r  r  s                              r   executezWanDancerEncodeAudio.execute  s   $Q'M*
 >!q  }}E}::H()9)9););)?)?)A)A)G)G)I)I;cmnnn	 +(11(KUUllnn**,,4466+K5*]`aaa!(tMMM)+ujIIK333${xJWWWY&xHTTT	mHBJ???!$I7XZdpyzzz*=x_bimnnn	mHBJ???!$Iaaagfk!!!T'.BKPQPQPQSWPWDXY
 
 
 (77AA!DDGGH^HrHrHtHtuuHs=#6q#9L#H3#NOOOPP +"4 
  
 sSy>>R+22377JJ.J}1:>>>r    N__name__
__module____qualname__classmethodr  r   r	  r   r    r   r  r    sV        
 
 [
 5? 5? 5? 5? [5? 5? 5?r    r  c                   L    e Zd Zed             Zeddej        fd            ZdS )WanDancerVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        dd          t           j                            ddd          t           j                            ddd          t           j	                            ddd          t           j
                            ddd          t           j                            dd          gt           j                            d          t           j                            d          t           j                            dd !          g"          S )#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.rm  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  zWanDancerVideo.define_schema  s   y$6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xsu?SZ[  fs  t  t#))*>  XE)  F  F#))*BT  \M)  N  N}t  FH  I  Ift  >r  s  s%++,BT+RR &&J&??&&J&??	  h PP!
 
 
 	
r    Nr  c           	         t          j        dd|dz
  dz  dz   |dz  |dz  gt          j                                                  }|Gt          j                            |d |                             dd          ||dd                              dd          }t          j        ||||j        d         f|j	        |j
        	          }||d |j        d
         <   |                    |d d d d d d d df                   }|jt          j        dd|j        d         |j        d         |j        d         f|j	        |j
        	          }d|d d d d d |j        d
         dz
  dz  dz   f<   nd|d |                             d
          z
  }t          j                            ||j        d         |j        d         dd          }t          j        t          j        |d d d
df         dd          |d d dd f         gd          }|                    d|j        d         dz  d|j        d         |j        d                                       dd          }t%          j        |||d          }t%          j        |||d          }|	0t%          j        ||	|
d          }t%          j        ||	|
d          }|rt%          j        ||d         |d         |                    dd          d          }t%          j        ||d         |d         |                    dd          d          }i }||d<   t+          j        |||          S )Nr+   r   r     )devicer,   bilinearcenterr0  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  rW   r  r  r  utilscommon_upscalemovedimr   r0  r?   encodeonesr  catrepeat_interleaveview	transposenode_helpersconditioning_set_valuesgetr   r	  )r  r  r  r  r   r!  r"  r&  rm  r#  r%  r  r'  imager7  r8  
out_latents                    r   r  zWanDancerVideo.execute+  s   avza&71%<fk5TU:V_d_u  `J  `J  `L  `L  M  M  M"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NKK8I"8M NWbWiq|  rC  D  D  DE+6E';$Q''("%**U111aaaBQB;-?"@"@|#j!QQATAZ[]A^`s`yz|`})~  HS  HZ  bm  bs  t  t  tLOAAAqqq"H[%6q%9A%=!$Cq#H"HHII$ww-"9"9!"<"<<#k88FYF_`bFcexe~  @B  fC  ET  V`  a  a#i)@QQQPQRSPSVAT^_ef)g)g)gituvuvuvxyxzxzuzi{(|  CD  E  E  E)..q+2CA2F!2KQPcPijlPm  pC  pI  JL  pM  N  N  X  X  YZ  \]  ^  ^#;H^q  CN  GO  GO  P  PH#;H^q  CN  GO  GO  P  PH)#;H]o  Lb  Gc  Gc  d  dH#;H]o  Lb  Gc  Gc  d  dH+#;HVjkzV{  EY  Z_  E`  xL  xP  xP  Qe  gj  xk  xk  Gl  Gl  m  mH#;HVjkzV{  EY  Z_  E`  xL  xP  xP  Qe  gj  xk  xk  Gl  Gl  m  mH
 &
9}Xx<<<r    )NNNNNr  r  r    r   r  r    se        
 
 [
0 = =  wy  wD = = = [= = =r    r  c                   b    e Zd Zed             Zed             Zeddej        fd            ZdS )WanDancerPadKeyframesc                    t          j        ddt           j                            d          t           j                            ddddd	          t           j                            d
dddd	          t           j                            dd          gt           j                            dd          t           j                            dd          t           j                            dd          g          S )NrJ  image/videoimagessegment_lengthr  r+   '  z+Length of this segment (usually 149 frames)r  r   rT   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  r,  r  s    r   r  z#WanDancerPadKeyframes.define_schemaN  s    y+"x))-su  WD  E  E_aQC  RK  L  Lw0xyy	 -AKeff,<Fdee_Flmm
 
 
 	
r    c                 \  $ |j         \  $}}}d}|d         j         d         |d         z  }	|z  }
d}|	|k    rt          |	|z
  |
z            dz   nd}|z  }t          j        ||f|j        |j                  }t          j        |||f|j        |j        	          }|dk    r$dk    rt          |          $z  }t          t          j        |z                      }||dz
  k    }g }d}t          |          D ]?}||dz
  k    r||z  z
  dz
  ndz
  }d}||z  ||z
  k     r|dz  }||z  ||z
  k     ||z  }@|r||z  z
  dz
  ndz
  }d}||z  ||z
  k     rOt          t          j        ||z                      }|
                    |||z   f           |dz  }||z  ||z
  k     O|
                    |||z   f           $fd
|D             }|rht          | \  }}t          j        |t          j        |j        	          }t          j        |t          j        |j        	          }d||<   ||         ||<   |z  }
||
z  }t          ||
z   |	          }|d         }t          ||z            } t          ||z            }!|d         d d d d | |!f         }"|"|d}#|||#fS )Nr  r  r,   r  r  r+   r   r3  )r?   r0  c                 6    g | ]\  }}|k     |k     ||fS r  r  )r   posr   BrN  s      r   
<listcomp>z4WanDancerPadKeyframes.do_execute.<locals>.<listcomp>  s5    hhhhc3sQwwSVYgSgSgSzSgSgSgr    )r  r  )r   rE   r  rW   r0  r?   r7   mathrV   r   rU   rC   tensorlongr   )%r  rM  rN  rQ  r  HWCr  audio_durationsegment_durationbuffernum_segmentstotal_framesrm  	keyframesframe_intervalseg_numis_last_segment	positionsimages_before_this_segmentseg_idxend_idxcnt	end_indexrY  valid_positionsseg_positionsimg_indices
start_timeend_timer  start_sample
end_sampleaudio_segment_waveformrU  rZ  s%     `                                 @r   
do_executez WanDancerPadKeyframes.do_execute`  s   \
1a z*04u]7KK)C/P^agPgPgsNV37GGHH1LLmn#n4{NAq1&-v|\\\KAq 9V\Vcddd	 !A"<0014N$)L>$ABBCCG,!;OI)*& !// 2 2KRV]`aVaKaKa<.7*BBQFFhvyzhzN*W~-EEE1HC N*W~-EEE*c1** P_x(FFJJesvwewIC&^)CCC$)NS$899::  #'AC'G!HIIIq &^)CCC i)Cc)IJKKKhhhhh)hhhO ?-0/-B*{ %]%*U[Ub c c c#l;ejQWQ^___&']#+1++>	-( *C/"%55
z$44nEEM*:344K/00
!&z!2111aaaj9P3P!Q.&
 

 $--r    Nr  c                 J    t          j        |                     ||||           S r6   )r   r	  ry  )r  rM  rN  rQ  r  s        r   r  zWanDancerPadKeyframes.execute  s"    }cnnV^]TYZZ[[r    r6   )	r  r  r  r  r  ry  r   r	  r  r  r    r   rJ  rJ  M  s        
 
 [
" @. @. [@.D \ \2= \ \ \ [\ \ \r    rJ  c                   L    e Zd Zed             Zeddej        fd            ZdS )WanDancerPadKeyframesListc                     t          j        ddt           j                            d          t           j                            ddddd	          t           j                            d
dddd	          t           j                            dd          gt           j                            ddd          t           j                            ddd          t           j                            ddd          g          S )Nr|  rL  rM  rN  r  r+   rO  z+Length of each segment (usually 149 frames)rP  re  r  z*How many padded segments to emit as lists.r  z(Audio to slice for each emitted segment.rR  rS  zPadded keyframe sequencesT)r  r  is_output_listrT  zMasks indicating valid framesrU  z$Audio segment for each video segmentr  rV  r  s    r   r  z'WanDancerPadKeyframesList.define_schema  s    y/"x((-su  WD  E  E^QA3P|}}w0Z[[	 -AKfw{||,<Fevz{{_Fl  ~B  C  C
 
 
 	
r    Nr  c                     fdt          |          D             }t          | \  }}}t          j        t	          |          t	          |          t	          |                    S )Nc                 J    g | ]}t                               |           S r  )rJ  ry  )r   r   r  rM  rN  s     r   r[  z5WanDancerPadKeyframesList.execute.<locals>.<listcomp>  s/    sssZ[(33FNAuUUsssr    )r   rC   r   r	  list)	r  rM  rN  re  r  r  rg  masksaudio_segmentss	    `` `    r   r  z!WanDancerPadKeyframesList.execute  sf    ssssss_deq_r_rsss+.=(	5.}T)__d5kk4;O;OPPPr    r6   r  r  r    r   r|  r|    sc        
 
 [
" Q Q"- Q Q Q [Q Q Qr    r|  c                   L    e Zd Zedeeej                          fd            ZdS )WanDancerExtensionr  c                 :   K   t           t          t          t          gS r6   )r  r  rJ  r|  )selfs    r   get_node_listz WanDancerExtension.get_node_list  s        !%	
 	
r    N)	r  r  r  r   r  r  r   	ComfyNoder  r  r    r   r  r    sE        
T$r|*<%= 
 
 
 X
 
 
r    r  r  c                  "   K   t                      S r6   )r  r  r    r   comfy_entrypointr    s      r    )F)r%   r&   Nr'   r(   r   )r(   r(   N)r-   )Nr%   Nr   r&   r   r   r   )r   r(   )ry   r(   )r%   r(   )r%   r&   r(   r  r  r  r/   )r)  r   N)r   r&   r)  )rB  r
   r&   )rB  r
   rF  )r%   r&   ru  r   r   r   ru  rv  )r  T)r   r&   )rY  )rE  r  r
   )0r\  r  rD  r  r  comfy.model_managementr  comfy.utilsr  r   rH  typing_extensionsr   comfy_api.latestr   r   scipy.signalrK   scipy.ndimage	scipy.fftscipy.sparser   r$   r   r   r   r   r   r   r  r  r(  r;  rA  rW  rK  r  r  r  r  r  r  r  r  rJ  r|  r  r  r  r    r   <module>r     s                           & & & & & & / / / / / / / /                
   $   $}. }. }. }.@' ' ' '&   ,   & ?B033 3 3 3l      &   6 ?A46/00 0 0 0f   .' ' ' ',e e e e,3 3 3 3l TWDH)2 )2 )2 )2Xo2 o2 o2 o2b   # # # #   G? G? G? G? G?2< G? G? G?T9= 9= 9= 9= 9=R\ 9= 9= 9=xX\ X\ X\ X\ X\BL X\ X\ X\tQ Q Q Q Q Q Q Q2
 
 
 
 
 
 
 
  2            r    