
    +jՁ                        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mZ  G d dej                  Z G d dej                  Z G d d	ej                  Zd6d
Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Zdej        dej        fdZdedeej        e f         fdZ! G d dej                  Z" G d  d!ej                  Z# G d" d#ej                  Z$ G d$ d%ej                  Z% G d& d'ej                  Z&d( Z' G d) d*ej                  Z( G d+ d,ej                  Z) G d- d.ej                  Z* G d/ d0ej                  Z+ G d1 d2ej                  Z, G d3 d4e          Z-de-fd5Z.dS )7    N)override)ComfyExtensionIOUIc                   N    e Zd Zed             Zedej        fd            ZeZdS )EmptyLatentAudioc                     t          j        ddddt           j                            ddddd	
          t           j                            ddddd          gt           j                                        g          S )Nr   zEmpty Latent Audiomodel/latent/audioAudiosecondsgG@      ?     @@皙?defaultminmaxstep
batch_size   i   z)The number of latent images in the batch.r   r   r   tooltip)node_iddisplay_namecategoryessentials_categoryinputsoutputs)r   SchemaFloatInputIntLatentOutputclss    8/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_audio.pydefine_schemazEmptyLatentAudio.define_schema   s    y&-) 'y$CVRUVV !Fq    Y%%''(
 
 
 	
    returnc                     t          |dz  dz  dz            dz  }t          j        |d|gt          j                                                  }t          j        |ddd          S )ND  i      @   )deviceaudio)samplestypedownscale_ratio_temporal)roundtorchzeroscomfymodel_managementintermediate_devicer   
NodeOutput)r&   r   r   lengthlatents        r'   executezEmptyLatentAudio.execute   sg    %$.!344q8j"f5e>T>h>h>j>jkkk}^bccdddr)   N)	__name__
__module____qualname__classmethodr(   r   r:   r=   generate r)   r'   r   r      s\        
 
 [
 eR] e e e [e
 HHHr)   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )ConditioningStableAudioc                    t          j        ddt           j                            d          t           j                            d          t           j                            ddddd	          t           j                            d
dddd	          gt           j                            d          t           j                            d          g          S )NrE   zmodel/conditioningpositivenegativeseconds_start        r   r   r   seconds_totalg     G@r   )r   r   r   r   )r   r   Conditioningr!   r    r$   r%   s    r'   r(   z%ConditioningStableAudio.define_schema(   s    y-)%%j11%%j11&WZ[[#6X[\\	 &&J&??&&J&??
 
 
 	
r)   r*   c                     t          j        |||d          }t          j        |||d          }t          j        ||          S )N)rI   rK   )node_helpersconditioning_set_valuesr   r:   )r&   rG   rH   rI   rK   s        r'   r=   zConditioningStableAudio.execute9   sp    7Ta  uB  CC  CC  D  D7Ta  uB  CC  CC  D  D}Xx000r)   N)	r>   r?   r@   rA   r(   r   r:   r=   appendrC   r)   r'   rE   rE   '   sW        
 
 [
  1"- 1 1 1 [1
 FFFr)   rE   c                   N    e Zd Zed             Zedej        fd            ZeZdS )VAEEncodeAudioc           
          t          j        ddgddt           j                            d          t           j                            d          gt           j                                        g          S )NrS   zaudio to latentzVAE Encode Audior
   r0   vaer   search_aliasesr   r   r   r   )r   r   r   r!   Vaer#   r$   r%   s    r'   r(   zVAEEncodeAudio.define_schemaC   sg    y$-.+)w''U## Y%%''(

 

 

 
	
r)   r*   c                 @   |t          d          |d         }t          |dd          }||k    r(t          j                            |d         ||          }n|d         }|                    |                    dd                    }t          j        d|i          S )	NzKVAEEncodeAudio: input audio is None (source video may have no audio track).sample_rateaudio_sample_rater,   waveformr   r1   )	
ValueErrorgetattr
torchaudio
functionalresampleencodemovedimr   r:   )r&   rU   r0   rZ   vae_sample_rater\   ts          r'   r=   zVAEEncodeAudio.executeQ   s    =jkkkM*!#':EBBk))!,55eJ6GVeffHHZ(HJJx''2..//}i^,,,r)   N)	r>   r?   r@   rA   r(   r   r:   r=   rc   rC   r)   r'   rS   rS   B   sW        
 
 [
 -BM - - - [- FFFr)   rS   c           	         |4|                      |d         |||                              dd          }n/|                     |d                                       dd          }t          j        |ddgd          dz  }d	||d	k     <   ||z  }t          | d
t          | dd                    }|d|vr|n|d         dS )Nr1   )tile_xtile_yoverlapr]   r   r-   T)dimkeepdimg      @r   audio_sample_rate_outputr[   r,   rZ   r\   rZ   )decode_tiledrd   decoder5   stdr_   )rU   r1   tilerj   r0   rq   re   s          r'   vae_decode_audiors   b   s      !3DW^ __gghjlmnn

79-..66r1==
)E1vt
4
4
4s
:CCc	N	SLEc#=wsL_af?g?ghhOV]A]A]oocjkxcyzzzr)   c                   N    e Zd Zed             Zedej        fd            ZeZdS )VAEDecodeAudioc           
          t          j        ddgddt           j                            d          t           j                            d          gt           j                                        g          S )Nru   latent to audiozVAE Decode Audior
   r1   rU   rV   )r   r   r#   r!   rX   r   r$   r%   s    r'   r(   zVAEDecodeAudio.define_schemap   se    y$-.+)		**U## X__&&'

 

 

 
	
r)   r*   c                 F    t          j        t          ||                    S Nr   r:   rs   )r&   rU   r1   s      r'   r=   zVAEDecodeAudio.execute~   s    }-c7;;<<<r)   N)	r>   r?   r@   rA   r(   r   r:   r=   rp   rC   r)   r'   ru   ru   o   sW        
 
 [
 =bm = = = [= FFFr)   ru   c                   J    e Zd Zed             Zedej        fd            ZdS )VAEDecodeAudioTiledc                 v   t          j        ddgddt           j                            d          t           j                            d          t           j                            ddd	d
d          t           j                            ddddd          gt           j                                        g          S )Nr|   rw   zVAE Decode Audio (Tiled)r
   r1   rU   	tile_sizei       i       r   rj   r.   r   i   rV   )r   r   r#   r!   rX   r"   r   r$   r%   s    r'   r(   z!VAEDecodeAudioTiled.define_schema   s    y)-.3)		**U##[#24aPPYt!LL	 X__&&'
 
 
 	
r)   r*   c                 J    t          j        t          ||||                    S ry   rz   )r&   rU   r1   r~   rj   s        r'   r=   zVAEDecodeAudioTiled.execute   s!    }-c7IwOOPPPr)   Nr>   r?   r@   rA   r(   r   r:   r=   rC   r)   r'   r|   r|      s]        
 
 [
 Q"- Q Q Q [Q Q Qr)   r|   c                   P    e Zd Zed             Zeddej        fd            ZeZdS )	SaveAudioc                     t          j        ddgdddt           j                            d          t           j                            dd          gt           j        j        t           j        j        gd	d	
	  	        S )Nr   zexport flaczSave Audio (FLAC) (Deprecated)r0   r   filename_prefixaudio/ComfyUIr   T	r   rW   r   r   r   r   hiddenis_output_nodeis_deprecated)r   r   r   r!   StringHiddenpromptextra_pnginfor%   s    r'   r(   zSaveAudio.define_schema   sr    y)?9 'w''	 1?KK I$bi&=>
 
 
 	
r)   ComfyUIflacr*   c                     |t          d          t          j        t          j                            ||| |                    S )NzFSaveAudio: input audio is None (source video may have no audio track).r   r&   formatuir^   r   r:   r   AudioSaveHelperget_save_audio_ui)r&   r0   r   r   s       r'   r=   zSaveAudio.execute   sN    =efff}!33E?`clr3ss
 
 
 	
r)   N)r   r   	r>   r?   r@   rA   r(   r   r:   r=   	save_flacrC   r)   r'   r   r      s\        
 
 [
  
 
 
 
 
 [
 IIIr)   r   c                   P    e Zd Zed             Zeddej        fd            ZeZdS )	SaveAudioMP3c                 @   t          j        ddgdddt           j                            d          t           j                            dd          t           j                            d	g d
d          gt           j        j        t           j        j        gdd	  	        S )Nr   z
export mp3zSave Audio (MP3) (Deprecated)r0   r   r   r   r   qualityV0128k320kr   optionsr   Tr   	r   r   r   r!   r   Combor   r   r   r%   s    r'   r(   zSaveAudioMP3.define_schema   s    y"(>8 'w''	 1?KKy2H2H2HRVWW
 I$bi&=>
 
 
 	
r)   r   mp3r   r*   c           	          |t          d          t          j        t          j                            ||| ||                    S )NzISaveAudioMP3: input audio is None (source video may have no audio track).r   r&   r   r   r   r   r&   r0   r   r   r   s        r'   r=   zSaveAudioMP3.execute   sV    =hiii}!33CX_ 4  
 
 
 	
r)   N)r   r   r   )	r>   r?   r@   rA   r(   r   r:   r=   save_mp3rC   r)   r'   r   r      s^        
 
 [
" 
 
XZXe 
 
 
 [
 HHHr)   r   c                   P    e Zd Zed             Zeddej        fd            ZeZdS )	SaveAudioOpusc                 >   t          j        ddgddt           j                            d          t           j                            dd          t           j                            dg d	d
          gt           j        j        t           j        j        gdd          S )Nr   zexport opuszSave Audio (Opus) (Deprecated)r0   r   r   r   r   64k96kr   192kr   r   r   T)r   rW   r   r   r   r   r   r   r   r%   s    r'   r(   zSaveAudioOpus.define_schema   s    y#)?9w''	 1?KKy2X2X2Xbhii
 I$bi&=>
 
 
 	
r)   r   opusV3r*   c           	          |t          d          t          j        t          j                            ||| ||                    S )NzJSaveAudioOpus: input audio is None (source video may have no audio track).r   r   r   r   s        r'   r=   zSaveAudioOpus.execute   sV    =ijjj}!33CX_ 4  
 
 
 	
r)   N)r   r   r   )	r>   r?   r@   rA   r(   r   r:   r=   	save_opusrC   r)   r'   r   r      s^        
 
 [
  
 
WYWd 
 
 
 [
 IIIr)   r   c                   R    e Zd Zed             Zedededej        fd            Z	dS )SaveAudioAdvancedc                    t          j        dg ddddt           j                            dd          t           j                            dd	d
          t           j                            dt           j                            dg           t           j                            dt           j                            dg dd          g          t           j                            dt           j                            dg dd          g          gd          gt           j        j	        t           j        j
        gd          S )Nr   )z
save audiozexport audiozoutput audiozwrite audior   r   r   zSave Audio (Advanced)z7Saves the input audio to your ComfyUI output directory.r0   zThe audio to save.)r   r   r   zYThe prefix for the file to save. May include formatting tokens such as %date:yyyy-MM-dd%.)r   r   r   r   r   r   r   r   r   r   r   r   z+The file format in which to save the audio.r   r   T)r   rW   r   descriptionr   r   r   r   )r   r   r   r!   r   DynamicComboOptionr   r   r   r   r%   s    r'   r(   zSaveAudioAdvanced.define_schema   s<   y'ooo0Qw0DEE	%+5	     %%..vr::..uHNN9>T>T>T^bNcc7   ..vHNN9>d>d>dntNuu8   J &  0 I$bi&=>? 
  
  
  	
r)   r   r   r*   c                    |                     dd           }|                     dd           }|r%t          j                            ||| ||          }n#t          j                            ||| |          }t	          j        |          S )Nr   r   r   r   r   )getr   r   r   r   r:   )r&   r0   r   r   file_formatr   r   s          r'   r=   zSaveAudioAdvanced.execute  s    jj400**Y-- 	y!33E?`clw  BI3  J  JBB!33E?`clw3xxB}####r)   N)
r>   r?   r@   rA   r(   strdictr   r:   r=   rC   r)   r'   r   r      se        !
 !
 [!
F $S $$ $2= $ $ $ [$ $ $r)   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )PreviewAudioc           	          t          j        ddgddt           j                            d          gt           j        j        t           j        j        gd          S )Nr   z
play audiozPreview Audior0   T)r   rW   r   r   r   r   r   )r   r   r   r!   r   r   r   r%   s    r'   r(   zPreviewAudio.define_schema(  sV    y"(>(w'' I$bi&=>

 

 

 
	
r)   r*   c                 v    |t          d          t          j        t          j        ||                     S )NzIPreviewAudio: input audio is None (source video may have no audio track).r%   r   )r^   r   r:   r   r   r&   r0   s     r'   r=   zPreviewAudio.execute6  s8    =hiii}3 ? ? ?@@@@r)   Nr   rC   r)   r'   r   r   '  s\        
 
 [
 Ar} A A A [A
 IIIr)   r   wavr*   c                     | j         j        r| S | j         t          j        k    r|                                 dz  S | j         t          j        k    r|                                 dz  S t          d| j                    )z*Convert audio to float 32 bits PCM format.i   l        zUnsupported wav dtype: )dtypeis_floating_pointr5   int16floatint32r^   )r   s    r'   f32_pcmr   ?  sq    
y" '
	ek	!	!yy{{g&&	ek	!	!yy{{g&&
:sy::
;
;;r)   filepathc                    t          j        |           5 }|j        j        st	          d          |j        j        d         }|j        j        }|j        }g }d}|                    |j	                  D ]}t          j        |                                          }|j        d         |k    r(|                    d|                                          }|                    |           ||j        d         z  }|st	          d          t          j        |d          }	t%          |	          }	|	|fcd d d            S # 1 swxY w Y   d S )Nz"No audio stream found in the file.r   )streamsr]   r   zNo audio frames decoded.rk   )avopenr   r0   r^   codec_contextrZ   channelsrp   indexr5   
from_numpy
to_ndarrayshapeviewrf   rQ   catr   )
r   afstreamsr
n_channelsframesr;   framebufr   s
             r'   loadr   I  s   			 bz 	CABBB!!$!-_
YYv|Y44 	# 	#E"5#3#3#5#566Cy|z))hhr:..0022MM#cil"FF 	97888iA&&&cllBw/                 s   D EE	Ec                   z    e Zd Zed             Zedej        fd            Zed             Zed             Z	eZ
dS )	LoadAudioc                    t          j                    }t          j        |d           t          j        t          j        |          ddg          }t          j        dg ddddt          j        	                    dt          j
        j        t          |          	          gt          j                                        g
          S )NT)exist_okr0   videor   )zimport audioz
open audioz
audio filez
Load Audior   )uploadr   )r   rW   r   r   r   r   r   )folder_pathsget_input_directoryosmakedirsfilter_files_content_typeslistdirr   r   r   r!   
UploadTyper0   sortedr   r$   )r&   	input_dirfiless      r'   r(   zLoadAudio.define_schemad  s     466	
I----7
98M8MPWY`OabbyGGG% 'wr}/BFSXMMZZ X__&&'

 

 

 
	
r)   r*   c                     t          j        |          }t          |          \  }}|                    d          |d}t	          j        |          S Nr   rn   r   get_annotated_filepathr   	unsqueezer   r:   r&   r0   
audio_pathr\   rZ   s        r'   r=   zLoadAudio.executeu  sO    !8??
 $Z 0 0+%//22;OO}U###r)   c                 :   t          j        |          }t          j                    }t	          |d          5 }|                    |                                           d d d            n# 1 swxY w Y   |                                                                S )Nrb)	r   r   hashlibsha256r   updatereaddigesthex)r&   r0   
image_pathmfs        r'   fingerprint_inputszLoadAudio.fingerprint_inputs|  s    !8??
N*d## 	qHHQVVXX	 	 	 	 	 	 	 	 	 	 	 	 	 	 	xxzz~~s   (A,,A03A0c                 X    t          j        |          sd                    |          S dS )NzInvalid audio file: {}T)r   exists_annotated_filepathr   r   s     r'   validate_inputszLoadAudio.validate_inputs  s.    5e<< 	:+225999tr)   N)r>   r?   r@   rA   r(   r   r:   r=   r
  r  r   rC   r)   r'   r   r   c  s        
 
 [
  $r} $ $ $ [$     [    [
 DDDr)   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )RecordAudioc           	          t          j        dg dddt          j        d                              d          gt           j                                        g          S )Nr  )zmicrophone inputzaudio capturezvoice inputzRecord Audior0   AUDIO_RECORDrV   )r   r   Customr!   r   r$   r%   s    r'   r(   zRecordAudio.define_schema  sa    y!OOO'	.))//88 X__&&'	
 	
 	
 		
r)   r*   c                     t          j        |          }t          |          \  }}|                    d          |d}t	          j        |          S r   r   r   s        r'   r=   zRecordAudio.execute  sO    !8??
 $Z 0 0+%//22;OO}U###r)   N)	r>   r?   r@   rA   r(   r   r:   r=   r   rC   r)   r'   r  r    sW        

 

 [

 $r} $ $ $ [$ DDDr)   r  c                   N    e Zd Zed             Zedej        fd            ZeZdS )TrimAudioDurationc                 @   t          j        dg ddddt           j                            d          t           j                            dddd	d
d          t           j                            dddd
d          gt           j                                        g          S )Nr  )z	cut audioz
audio clipzshorten audiozTrim Audio Durationz)Trim audio tensor into chosen time range.r0   start_indexrJ   l     {Gz?zTStart time in seconds, can be negative to count from the end (supports sub-seconds).r   r   r   r   r   duration      N@zDuration in seconds)r   r   r   r   r   rW   r   r   r   r   r   )r   r   r   r!   r    r$   r%   s    r'   r(   zTrimAudioDuration.define_schema  s    y'GGG.Cw''!+*r     1   $ X__&&'1
 
 
 	
r)   r*   c                 T   |t          j        d           S |d         }|d         }|j        d         }|dk    rt          j        |          S |dk     r#|t          t	          ||z                      z   }nt          t	          ||z                      }t          dt          ||                    }|t          t	          ||z                      z   }t          dt          ||                    }||k    rt          d          t          j        |d||f         |d          S )Nr\   rZ   r]   r   zXTrimAudioDuration: Start time must be less than end time and be within the audio length..rn   )r   r:   r   intr4   r   r   r^   )	r&   r0   r  r  r\   rZ   audio_lengthstart_frame	end_frames	            r'   r=   zTrimAudioDuration.execute  s)   ==&&&$M*~b)1='''??&U;3L-M-M)N)NNKKeK+$=>>??K!Sl;;<<#eH{,B&C&C"D"DD	3y,7788	)##wxxx}(3I8M3M*N_jkklllr)   N)	r>   r?   r@   rA   r(   r   r:   r=   trimrC   r)   r'   r  r    s\        
 
 [
8 mbm m m m [m0 DDDr)   r  c                   N    e Zd Zed             Zedej        fd            ZeZdS )SplitAudioChannelsc                     t          j        ddgdddt           j                            d          gt           j                            d          t           j                            d          g	          S )
Nr%  zstereo to monozSplit Audio Channelsz1Separates the audio into left and right channels.r0   leftrL   rightr  r   r   r   r!   r$   r%   s    r'   r(   z SplitAudioChannels.define_schema  sp    y(,-/Kw'' V44W55
 
 
 	
r)   r*   c                     |t          j        d d           S |d         }|d         }|j        d         dk    rt          d|j        d          d          |dddd d f         }|dddd d f         }t          j        ||d	||d	          S )
Nr\   rZ   r   r-   z9AudioSplit: Input audio must be stereo (2 channels), got z channel(s)..r   rn   )r   r:   r   r^   )r&   r0   r\   rZ   left_channelright_channels         r'   r=   zSplitAudioChannels.execute  s    ==t,,,$M*>!!!xYaYghiYjxxxyyyQqS!!!, ac111-},{SSbo  AL  VM  VM  N  N  	Nr)   N)	r>   r?   r@   rA   r(   r   r:   r=   separaterC   r)   r'   r%  r%    s\        
 
 [
  Nr} N N N [N HHHr)   r%  c                   J    e Zd Zed             Zedej        fd            ZdS )JoinAudioChannelsc           
          t          j        ddddt           j                            d          t           j                            d          gt           j                            d          g          S )	Nr/  zJoin Audio Channelsz=Joins left and right mono audio channels into a stereo audio.r0   
audio_leftaudio_rightrL   )r   r   r   r   r   r   r)  r%   s    r'   r(   zJoinAudioChannels.define_schema  sh    y'.W|,,}--
 W55
 
 
 	
r)   r*   c                    ||t          j        d           S |t          j        |          S |t          j        |          S |d         }|d         }|d         }|d         }|j        d         dk    s|j        d         dk    rt          d          t	          ||||          \  }}}|j        d         }|j        d         }	||	k    rjt          ||	          }
||
k    r't          j        d| d|
 d           |d	d |
f         }|	|
k    r't          j        d
|	 d|
 d           |d	d |
f         }|d	ddd d f         }|d	ddd d f         }t          j	        ||gd          }t          j        ||d          S )Nr\   rZ   r   z*AudioJoin: Both input audios must be mono.r]   z.JoinAudioChannels: Trimming left channel from  to z	 samples..z/JoinAudioChannels: Trimming right channel from r   r   rn   )
r   r:   r   r^   match_audio_sample_ratesr   logginginfor5   r   )r&   r1  r2  waveform_leftsample_rate_leftwaveform_rightsample_rate_rightoutput_sample_ratelength_leftlength_right
min_lengthr+  r,  stereo_waveforms                 r'   r=   zJoinAudioChannels.execute  s   +"5=&&&=---=,,,":.%m4$Z0'6q!Q&&.*>q*AQ*F*FIJJJ =U+^=N=
 =
9~'9
 $)"-%+B/,&&[,77JZ''tktt_itttuuu -c;J;.> ?j((v|vvakvvvwww!/[j[0@!A %S!A#qqq[1&sAaC{3)\=$AqIII}/J\]]^^^r)   Nr   rC   r)   r'   r/  r/    s]        
 
 [
 &_ &_ &_ &_ [&_ &_ &_r)   r/  c                 $   ||k    r||k    r?t           j                            |||          }|}t          j        d| d| d           nAt           j                            | ||          } |}t          j        d| d| d           n|}| ||fS )NzResampling audio2 from zHz to zHz for merging.zResampling audio1 from )r`   ra   rb   r6  r7  )
waveform_1sample_rate_1
waveform_2sample_rate_2r<  s        r'   r5  r5  >  s    %%=((#.77
MS`aaJ!.Lf=fffffgggg#.77
MS`aaJ!.Lf=fffffgggg*z#555r)   c                   N    e Zd Zed             Zedej        fd            ZeZdS )AudioConcatc                 6   t          j        dg ddddt           j                            d          t           j                            d          t           j                            dd	d
gd	d          gt           j                                        g          S )NrG  )z
join audiozcombine audiozappend audiozConcatenate Audioz=Concatenates the audio1 to audio2 in the specified direction.r0   audio1audio2	directionafterbeforez0Whether to append audio2 after or before audio1.)r   r   r   r  r   r   r   r!   r   r$   r%   s    r'   r(   zAudioConcat.define_schemaN  s    y!JJJ,Wx((x(($h/#N	   	 X__&&'!
 
 
 	
r)   r*   c                    ||t          j        d           S |t          j        |          S |t          j        |          S |d         }|d         }|d         }|d         }|j        d         dk    r+|                    ddd          }t	          j        d           |j        d         dk    r+|                    ddd          }t	          j        d           t          ||||          \  }}}|dk    rt          j        ||fd          }	n|d	k    rt          j        ||fd          }	t          j        |	|d
          S )Nr\   rZ   r   r-   zHAudioConcat: Converted mono audio1 to stereo by duplicating the channel.zHAudioConcat: Converted mono audio2 to stereo by duplicating the channel.rL  r   rM  rn   )	r   r:   r   repeatr6  r7  r5  r5   r   )
r&   rI  rJ  rK  rB  rD  rC  rE  r<  concatenated_audios
             r'   r=   zAudioConcat.executec  sr   >fn=&&&>=(((>=(((J'
J'
}-}-A!###**1a33JLcdddA!###**1a33JLcddd5MjZgis  vC  6D  6D2
J 2!&J
+C!K!K!K(""!&J
+C!K!K!K}*<M_``aaar)   N)	r>   r?   r@   rA   r(   r   r:   r=   concatrC   r)   r'   rG  rG  M  s\        
 
 [
( b2= b b b [b8 FFFr)   rG  c                   N    e Zd Zed             Zedej        fd            ZeZdS )
AudioMergec                 4   t          j        dg ddddt           j                            d          t           j                            d          t           j                            dg d	d
          gt           j                                        g          S )NrT  )z	mix audiozoverlay audiozlayer audiozMerge Audioz7Combine two audio tracks by overlaying their waveforms.r0   rI  rJ  merge_method)addmeansubtractmultiplyz/The method used to combine the audio waveforms.r   r  rN  r%   s    r'   r(   zAudioMerge.define_schema  s    y HHH&Qx((x(("CCCM    X__&&'
 
 
 	
r)   r*   c                    ||t          j        d           S |t          j        |          S |t          j        |          S |d         }|d         }|d         }|d         }t          ||||          \  }}}|j        d         }	|j        d         }
|	dk    s|
dk    rt          j        ||d          S |
|	k    r(t	          j        d|
 d|	 d           |d	d |	f         }nv|
|	k     rpt	          j        d
|
 d|	 d           t          |j                  }|	|
z
  |d<   t          j        ||j	        |j
                  }t          j        ||fd          }|dk    r||z   }n&|dk    r||z
  }n|dk    r||z  }n|dk    r||z   dz  }|                                                                }|dk    r||z  }t          j        ||d          S )Nr\   rZ   r]   r   rn   z!AudioMerge: Trimming audio2 from r4  z  samples to match audio1 length..z AudioMerge: Padding audio2 from )r   r/   r   rW  rY  rZ  rX  r-   r   )r   r:   r5  r   r6  r7  listr5   r6   r   r/   r   absr   )r&   rI  rJ  rV  rB  rD  rC  rE  r<  length_1length_2	pad_shape
pad_tensorr\   max_vals                  r'   r=   zAudioMerge.execute  sB   >fn=&&&>=(((>=(((J'
J'
}-}-5MjZgis  vC  6D  6D2
J 2#B'#B'q==HMM=jI[!\!\]]]hLuXuu8uuuvvv#C(N3JJ  LtHtt(tttuuuZ-..I$x/IbMYj6FzO`aaaJJ
#;DDDJ5  !J.HHZ''!J.HHZ''!J.HHV##"Z/14H,,..$$&&S==')H}(CUVVWWWr)   N)	r>   r?   r@   rA   r(   r   r:   r=   mergerC   r)   r'   rT  rT    s]        
 
 [
& +Xbm +X +X +X [+XZ EEEr)   rT  c                   N    e Zd Zed             Zedej        fd            ZeZdS )AudioAdjustVolumec                     t          j        dg ddddt           j                            d          t           j                            dddd	d
          gt           j                                        g          S )Nre  )z
audio gainloudnesszaudio levelzAdjust Audio Volumer0   zFAdjust the volume of the audio by a specified amount in decibels (dB).volumer   id   zNVolume adjustment in decibels (dB). 0 = no change, +6 = double, -6 = half, etcr   )r   rW   r   r   r   r   r   )r   r   r   r!   r"   r$   r%   s    r'   r(   zAudioAdjustVolume.define_schema  s    y'DDD.`w''l   	 X__&&'!
 
 
 	
r)   r*   c                     |t          j        d           S |dk    rt          j        |          S |d         }|d         }d|dz  z  }||z  }t          j        ||d          S )Nr   r\   rZ   
      rn   )r   r:   )r&   r0   rh  r\   rZ   gains         r'   r=   zAudioAdjustVolume.execute  ss    ==&&&Q;;='''$M*frk"d?}(;OOPPPr)   N)	r>   r?   r@   rA   r(   r   r:   r=   adjust_volumerC   r)   r'   re  re    s\        
 
 [
( Qr} Q Q Q [Q MMMr)   re  c                   N    e Zd Zed             Zedej        fd            ZeZdS )
EmptyAudioc                 J   t          j        ddgddt           j                            ddddd	d
          t           j                            dddddd          t           j                            dddddd          gt           j                                        g          S )Nrp  zblank audiozEmpty Audior0   r  r  rJ   r  r  z+Duration of the empty audio clip in secondsr  rZ   r,   z$Sample rate of the empty audio clip.r   i  T)r   r   r   r   advancedr   r-   z4Number of audio channels (1 for mono, 2 for stereo).)r   r   r   r   rr  rV   )r   r   r    r!   r"   r   r$   r%   s    r'   r(   zEmptyAudio.define_schema  s    y )?& *I    !!B!    R!   #4 X__&&'? 
  
  
  	
r)   r*   c                     t          t          ||z                      }t          j        d||ft          j                  }t          j        ||d          S )Nr   )r   rn   )r  r4   r5   r6   float32r   r:   )r&   r  rZ   r   num_samplesr\   s         r'   r=   zEmptyAudio.execute  sQ    %; 67788;8[9OOO}(;OOPPPr)   N)	r>   r?   r@   rA   r(   r   r:   r=   create_empty_audiorC   r)   r'   rp  rp    s`        !
 !
 [!
F Q Q Q Q [Q
 !r)   rp  c                   J    e Zd Zed             Zedej        fd            ZdS )AudioEqualizer3Bandc                    t          j        dg ddddt           j                            d          t           j                            dddd	d
d          t           j                            ddddd          t           j                            dddd	d
d          t           j                            ddddd          t           j                            ddd
dd
d          t           j                            dddd	d
d          t           j                            d d!dd"d#          gt           j                                        g$          S )%Nrx  )eqz
bass boostztreble boost	equalizerzAudio Equalizer (3-Band)r0   Tlow_gain_dBrJ   g      8g      8@r   zGain for Low frequencies (Bass)r  low_freqri  rl  i  zCutoff frequency for Low shelfr   mid_gain_dBzGain for Mid frequenciesmid_freqi     i  zCenter frequency for Midsmid_q9v?g      $@zQ factor (bandwidth) for Midshigh_gain_dBz"Gain for High frequencies (Treble)	high_freqi  i:  zCutoff frequency for High shelf)r   rW   r   r   is_experimentalr   r   )r   r   r   r!   r    r"   r$   r%   s    r'   r(   z!AudioEqualizer3Band.define_schema  s=   y)LLL3 w''}cu$UX  cD  E  EZ"#Oopp}cu$UXb|}}Z3DRmnnw3Ds\{||~s4VY  dH  I  I[$DeUvww	 X__&&'!
 
 
 	
r)   r*   c	                 8   |t          j        d           S |d         }	|d         }
|	j        d         dk    rt          j        |          S |	                                }|dk    r1t          j                            ||
|t          |          d          }|dk    r1t          j                            ||
t          |          ||          }|dk    r1t          j        	                    ||
|t          |          d          }t          j        ||
d          S )	Nr\   rZ   r]   r   r  )rm  central_freqQ)center_freqrm  r  rn   )
r   r:   r   cloner`   ra   bass_biquadr   equalizer_biquadtreble_biquad)r&   r0   r|  r}  r~  r  r  r  r  r\   rZ   eq_waveforms               r'   r=   zAudioEqualizer3Band.execute4  s6   ==&&&$M*>"""='''nn&& !$/;; "8__ <  K !$/@@!(OO  A  K 1$/==!"9-- >  K }+kRRSSSr)   Nr   rC   r)   r'   rx  rx    s_        
 
 [
( )Tmomz )T )T )T [)T )T )Tr)   rx  c                   L    e Zd Zedeeej                          fd            ZdS )AudioExtensionr*   c                    K   t           t          t          t          t          t
          t          t          t          t          t          t          t          t          t          t          t           t"          t$          t&          gS ry   )r   rS   ru   r|   r   r   r   r   r   r   rE   r  r  r%  r/  rG  rT  re  rp  rx  )selfs    r'   get_node_listzAudioExtension.get_node_listb  sN       #)
 	
r)   N)	r>   r?   r@   r   r\  r2   r   	ComfyNoder  rC   r)   r'   r  r  a  sE        
T$r|*<%= 
 
 
 X
 
 
r)   r  c                  "   K   t                      S ry   )r  rC   r)   r'   comfy_entrypointr  {  s      r)   )NN)/r   r`   r5   comfy.model_managementr7   r   r   r  rO   r6  typing_extensionsr   comfy_api.latestr   r   r   r  r   rE   rS   rs   ru   r|   r   r   r   r   r   Tensorr   r   tupler  r   r   r  r  r%  r/  r5  rG  rT  re  rp  rx  r  r  rC   r)   r'   <module>r     s    				              				       & & & & & & 3 3 3 3 3 3 3 3 3 3    r|   4    bl   6    R\   @
{ 
{ 
{ 
{    R\   ,Q Q Q Q Q", Q Q Q,       :    2<   @    BL   >-$ -$ -$ -$ -$ -$ -$ -$`    2<   0< <%, < < < <3 5s!23    4' ' ' ' ' ' ' 'T    ",   27 7 7 7 7 7 7 7t! ! ! ! ! ! ! !F8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_v6 6 63 3 3 3 3", 3 3 3lC C C C C C C CL$ $ $ $ $ $ $ $N+! +! +! +! +! +! +! +!\@T @T @T @T @T", @T @T @TF
 
 
 
 
^ 
 
 
4      r)   