
    ]i&                         S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	r	SSK
r
SSKrSSKrSSKJr  SSKrSSKJr  SSKJr  SS	KJr  S
rSrS\4S jrS\4S jr " S S5      rSS jrS rS rg)z.Loading wav based datasets, including MusdbHQ.    )OrderedDictN)Path)distributed)
functional   )convert_audio_channels)distribmixturez.wavTc           
      2   S nS nSnSnU[         /-    GH  nX U 3-  n	U[         :X  a  U	R                  5       (       d  Sn
U H'  nX U 3-  n[        R                  " U5      u  pX-  n
M)     U
R	                  5       R                  5       S:  nU(       a   [        R                  " 5       S:X  d   S5       e[        R                  " XWSS9   [        R                  " [        U	5      5      nUR                  nUc  UnUR                  nOJUU:w  a  [        SU	 SU S	U S
35      eUR                  U:w  a  [        SU	 SU S	UR                   S
35      eU[         :X  d  GMM  U(       d  GMW   [        R                  " [        U	5      5      u  nnUR                  S5      nUR                  5       R!                  5       nUR#                  5       R!                  5       nGM     WXgUS.$ ! [         a    [        U	5        e f = f! [         a    [        U	5        e f = f)Nr   r   	soundfilezuse dset.backend=soundfilePCM_F)encodingzInvalid length for file z: expecting z	 but got .zInvalid sample rate for file )lengthmeanstd
samplerate)MIXTUREexiststaloadabsmaxget_audio_backendsaveinfostrRuntimeErrorprint
num_framessample_rate
ValueErrorr   itemr   )tracksources	normalizeexttrack_lengthtrack_samplerater   r   sourcefileaudio
sub_sourcesub_file	sub_audiosr
would_clipr   r   wav_s                       G/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/demucs/wav.py_track_metadatar5      s"   LD
CWI%#''WT[[]]E%
 \##77 " 1	" & *a/J++-<Z>ZZ<GGDg6	773t9%D !L#//V#*4& 1)N)F81>? ? !11/v 6-.i8H8H7ILM M WT+Q ((1+C88:??$D'').."CM &P dFVWW3  	$K	$   ds   G%+"G?%G<?Hc                    0 n[        U 5      n / nSSKJn  U" S5       n[        R                  " U SS9 H  u  pn
[        U5      nUR
                  R                  S5      (       d  U	(       d  X:X  a  M?  [        UR                  U 5      5      nUR                  XR                  [        XX#5      45        M     [        R                  " USS9 H  u  pUR                  5       XK'   M     S	S	S	5        U$ ! , (       d  f       U$ = f)
a5  
Build the metadata for `Wavset`.

Args:
    path (str or Path): path to dataset.
    sources (list[str]): list of sources to look for.
    normalize (bool): if True, loads full track and store normalization
        values based on the mixture file.
    ext (str): extension of audio files (default is .wav).
r   )ThreadPoolExecutor   T)followlinksr   x   )ncolsN)r   concurrent.futuresr7   oswalkname
startswithr   relative_toappendsubmitr5   tqdmresult)pathr%   r&   r'   metapendingsr7   poolrootfoldersfilesr?   pendings                r4   build_metadatarN   N   s     D:DH5	A	$$&GGDd$C D5:Dyy##C((Gt|t''-.DOOT;;y#^_` %D "YYxs;MD )DJ < 
 K 
	 Ks   C
C22
Dc                   <    \ rS rSrSSSSS\4S jrS rS rS	 rS
r	g)Wavsetk   NTiD     c
                    [        U5      U l        [        U5      U l        X@l        U=(       d    UU l        X`l        X0l        Xl        Xpl	        Xl
        / U l        U R                  R                  5        Hq  u  pUS   US   -  nUb  X:  a  SnO;[        [        R                  " XR                  -
  U R
                  -  5      S-   5      nU R                  R!                  U5        Ms     g)a  
Waveset (or mp3 set for that matter). Can be used to train
with arbitrary sources. Each track should be one folder inside of `path`.
The folder should contain files named `{source}.{ext}`.

Args:
    root (Path or str): root folder for the dataset.
    metadata (dict): output from `build_metadata`.
    sources (list[str]): list of source names.
    segment (None or float): segment length in seconds. If `None`, returns entire tracks.
    shift (None or float): stride in seconds bewteen samples.
    normalize (bool): normalizes input audio, **based on the metadata content**,
        i.e. the entire track is normalized, not individual extracts.
    samplerate (int): target sample rate. if the file sample rate
        is different, it will be resampled on the fly.
    channels (int): target nb of channels. if different, will be
        changed onthe fly.
    ext (str): extension for audio files (default is .wav).

samplerate and channels are converted on the fly.
r   r   Nr   )r   rJ   r   metadatasegmentshiftr&   r%   channelsr   r'   num_examplesitemsintmathceilrB   )selfrJ   rT   r%   rU   rV   r&   r   rW   r'   r?   rG   track_durationexampless                 r4   __init__Wavset.__init__l   s    4 J	#H-%g
" $----/JD!(^d<.@@N.":tyy.<<*G4::)UVYZZ[$$X. 0    c                 ,    [        U R                  5      $ N)sumrX   )r]   s    r4   __len__Wavset.__len__   s    4$$%%rb   c                 B    U R                   U-  U U R                   3-  $ rd   )rJ   r'   )r]   r?   r*   s      r4   get_fileWavset.get_file   s#    yy4VHTXXJ"777rb   c                    [        U R                  U R                  5       GH  u  p#X:  a  X-  nM  U R                  U   nSnSnU R                  bM  [	        US   U R
                  -  U-  5      n[	        [        R                  " US   U R                  -  5      5      n/ nU R                   HZ  nU R                  X(5      n	[        R                  " [        U	5      XeS9u  p[        XR                  5      n
UR                  U
5        M\     [         R"                  " U5      n[$        R&                  " XS   U R(                  5      nU R*                  (       a  XS   -
  US   -  nU R                  (       aS  [	        U R                  U R(                  -  5      nUSS U24   n[,        R.                  " USXR0                  S   -
  45      nUs  $    g )Nr   r   )frame_offsetr    r   r   .)ziprT   rX   rU   rZ   rV   r[   r\   r%   ri   r   r   r   r   rW   rB   thstackjuliusresample_fracr   r&   Fpadshape)r]   indexr?   r_   rG   r    offsetwavsr*   r+   r2   r3   exampler   s                 r4   __getitem__Wavset.__getitem__   s~   !$--1B1BCND !==&DJF||'T,/$**<uDE 4+=+L!MN
D,,}}T2TW,S--@C 	 ' hhtnG**74FXG~~"&\1T%[@||T\\DOO;<!#ww,/%%!VmmB6G-G)HIN3 Drb   )
rW   r'   rT   r&   rX   rJ   r   rU   rV   r%   )
__name__
__module____qualname____firstlineno__EXTr`   rf   ri   rz   __static_attributes__ rb   r4   rP   rP   k   s'     qc	*/X&8rb   rP   c                 D   [        X5      n[        R                  " [        U5      R	                  5       5      R                  5       SS n[        U R                  5      SU-   S-   -  n[        U5      S-  n[        U5      S-  nUR                  5       (       dz  [        R                  S:X  af  UR                  R                  SSS	9  [        XPR                  5      n[        X`R                  5      n[        R                   " Xx/[#        US
5      5        [        R$                  S:  a  [&        R(                  " 5         [        R*                  " [#        U5      5      u  pxU R,                  (       a  0 n	OU R.                  U R0                  S.n	[3        XWU R                  U R.                  U R0                  U R4                  U R6                  U R8                  S9n
[3        Xh[:        /[=        U R                  5      -   4U R4                  U R6                  U R8                  S.U	D6nX4$ )z/Extract the wav datasets from the XP arguments.Nr8   wav_.jsontrainvalidr   Texist_okparentswr   rU   rV   rU   rV   r   rW   r&   r   rW   r&   )getattrhashlibsha1r   encode	hexdigestr   rT   is_filer	   rankparentmkdirrN   r%   jsondumpopen
world_sizer   barrierr   full_cvrU   rV   rP   r   rW   r&   r   list)argsr?   rF   sigmetadata_file
train_path
valid_pathr   r   kw_cv	train_set	valid_sets               r4   get_wav_datasetsr      s   4D
,,s4y'')
*
4
4
6r
:C'6C<'+ABMdg%Jdg%J  ""w||q'8""D$"?z<<8z<<8		5.$}c":;A99T-01LE|| LL4::>z$,,#||4::"&//DMM!%1I z7)d4<<6H*H :"&//DMM!%:38:I rb   c                      SS K n [        [        R                  S   5      S-  S-  nU R	                  [        US5      5      nUS   $ )Nr   configszmus.yamlrvalidation_tracks)yamlr   musdb__path__	safe_loadr   )r   
setup_pathsetups      r4   _get_musdb_validr      sC    ennQ'(94zAJNN4
C01E$%%rb   c                 
   [         R                  " [        U R                  5      R	                  5       5      R                  5       SS n[        U R                  5      SU-   S-   -  n[        U R                  5      S-  nUR                  5       (       dd  [        R                  S:X  aP  UR                  R                  SSS9  [        X0R                  5      n[        R                   " U[#        US	5      5        [        R$                  S
:  a  [&        R(                  " 5         [        R*                  " [#        U5      5      n[-        5       nU R.                  (       a  UnO+UR1                  5        VVs0 s H  u  pxXu;  d  M  Xx_M     nnnUR1                  5        VVs0 s H  u  pxXu;   d  M  Xx_M     n	nnU R2                  (       a  0 n
OU R4                  U R6                  S.n
[9        X6U R                  U R4                  U R6                  U R:                  U R<                  U R>                  S9n[9        X9[@        /[C        U R                  5      -   4U R:                  U R<                  U R>                  S.U
D6nX4$ s  snnf s  snnf )z0Extract the musdb dataset from the XP arguments.Nr8   musdb_r   r   r   Tr   r   r   r   r   r   )"r   r   r   r   r   r   r   rT   r   r	   r   r   r   rN   r%   r   r   r   r   r   r   r   r   train_validrY   r   rU   rV   rP   r   rW   r&   r   r   )r   r   r   rJ   rT   valid_tracksmetadata_trainr?   rG   metadata_validr   r   r   s                r4   get_musdb_wav_datasetsr      s   
,,s4::--/
0
:
:
<Ra
@C'8c>G+CDM

g%D  ""w||q'8""D$"?!$5		(D45Ayym,-H#%L!7?~~7Gd7G4Kc*$*7Gd3;>>3C\3CZTtG[jdj3CN\|| LL4::>tT\\#||4::"&//DMM!%1I tgYdll9K-K :"&//DMM!%:38:I  e\s   1I9 I9I?+I?)r2   ) __doc__collectionsr   r   r[   r   r=   pathlibr   rD   r   rq   torchro   r   
torchaudior   torch.nnr   rs   r,   r    r	   r   r   r5   rN   rP   r   r   r   r   rb   r4   <module>r      sw    5 #    	        $ ) 
 /3 -X` -1c :M M` :& rb   