Ë
    ýÿæih  ã                   ó‚  — d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZ d dlZd dlZd dlmZ d dlmZ d d	lmZ d d
lmZ dd„Zd„ fdedee   dee   fd„Zde defd„Z!dede fd„Z"	 	 	 	 ddejF                  dee ef   dedee   dee   dee   deejF                     dejF                  fd„Z$y)é    )ÚCounter©ÚFraction)Úreduce)ÚchainÚcountÚisliceÚrepeat)Úlog2)ÚCallableÚListÚOptionalÚUnionN)Úversion)Úprimes©Úpadc           
   #   ó(  ‡K  — |r"t        t        |«      j                  «       Ž \  Š}d„ }t        |«      }t	        t         |t        «       |«      | «      «      }t        |«      | k  ry 	 t        ˆfd„|D «       «      –— t        t        t        | «      «       |t        t        |«      «      t        |«      «      «      D ]  \  }}||   |k7  sŒ n y ||   dz   }t        t        || «       |t        |«      ||d  «      «      D ]
  \  }}|||<   Œ Œ¨­w)Nc                 óJ   — t        j                  t        t        | |«      «      S ©N)r   Úfrom_iterableÚmapr
   )ÚiÚcs     úk/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torch_pitch_shift/main.pyÚ<lambda>z2_combinations_without_repetition.<locals>.<lambda>   s   € ”U×(Ñ(¬¬V°Q¸Ó):Ô;ó    c              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wr   © )Ú.0r   Úvaluess     €r   Ú	<genexpr>z3_combinations_without_repetition.<locals>.<genexpr>   s   øè ø€ Ð/¡w !�F˜1•I¡wùs   ƒé   )
Úzipr   ÚitemsÚlenÚlistr	   r   ÚtupleÚreversedÚrange)	ÚrÚiterabler!   ÚcountsÚfÚnÚindicesr   Újs	     `      r   Ú _combinations_without_repetitionr2      sÿ   øè ø€ ÙÜœg hÓ/×5Ñ5Ó7Ð8‰ˆ�á;€AÜˆF‹€AÜ”6™!œE›G VÓ,¨aÓ0Ó1€GÜ
ˆ7ƒ|�aÒØØ
ÜÓ/¡wÓ/Ó/Ò/Üœ¤ q£Ó*©A¬h´u¸Q³xÓ.@Ä(È6ÓBRÓ,SÖT‰DˆAˆqØ�q‰z˜Q‹Ùð Uð Ø�A‰J˜‰NˆÜœ˜a ›¡Q¤u¨Q£x°¸¸°Ó%<Ö=‰DˆAˆqØˆG�AŠJð >ð ùs   ƒCDÃADc                 ó(   — | dk\  xr | dk  xr | dk7  S )Ng      à?é   r#   r   )Úxs    r   r   r   (   s   € ¨a°3©hÒ.L¸1À¹6Ò.LÀaÈ1ÁfÐ.Lr   Úsample_rateÚ	conditionÚreturnc           
      óp  — t        «       }t        j                  | «      }g }t        dt	        |«      dz   «      D ]7  }|j                  t        ||¬«      D �cg c]  }t        d„ |«      ‘Œ c}«       Œ9 |D ]/  }|D ](  }t        ||«      } ||«      sŒ|j                  |«       Œ* Œ1 t        |«      S c c}w )aÑ  
    Search for pitch-shift targets that can be computed quickly for a given sample rate.

    Parameters
    ----------
    sample_rate: int
        The sample rate of an audio clip.
    condition: Callable [optional]
        A function to validate fast shift ratios.
        Default is `lambda x: x >= 0.5 and x <= 2 and x != 1` (between -1 and +1 octaves).

    Returns
    -------
    output: List[Fraction]
        A list of fast pitch-shift target ratios
    r#   )r,   c                 ó   — | |z  S r   r   )r5   Úys     r   r   z!get_fast_shifts.<locals>.<lambda>@   s   €  A¨¢Er   )Úsetr   Úfactorsr*   r&   Úextendr2   r   r   Úaddr'   )	r6   r7   Úfast_shiftsr=   Úproductsr   r5   r1   r.   s	            r   Úget_fast_shiftsrB   &   s¶   € ô( “%€KÜ�n‰n˜[Ó)€GØ€HÜ�1”c˜'“l QÑ&Ö'ˆØ�‰ô :¸!ÀgÕNóáN�Aô Ñ)¨1Õ-ØNñõ	
ð (ó ˆÛˆAÜ˜˜A“ˆAÙ˜�|Ø—‘ Õ"ñ ð ô
 �ÓÐùòs   ÁB3
Ú	semitonesc                 ó$   — t        d| dz  z  «      S )zø
    Convert semitonal shifts into ratios.

    Parameters
    ----------
    semitones: float
        The number of semitones for a desired shift.

    Returns
    -------
    output: Fraction
        A Fraction indicating a pitch shift ratio
    ç       @ç      (@r   )rC   s    r   Úsemitones_to_ratiorG   L   s   € ô �C˜I¨Ñ,Ñ-Ó.Ð.r   Úratioc                 ó0   — t        dt        | «      z  «      S )zè
    Convert rational shifts to semitones.

    Parameters
    ----------
    ratio: Fraction
        The ratio for a desired shift.

    Returns
    -------
    output: float
        The magnitude of a pitch shift in semitones
    rF   )Úfloatr   )rH   s    r   Úratio_to_semitonesrK   ]   s   € ô �œ˜U›Ñ#Ó$Ð$r   ÚinputÚshiftÚbins_per_octaveÚn_fftÚ
hop_lengthÚwindowc                 ó  — |s|dz  }|s|dz  }|€t        j                  |«      }|j                  | j                  «      }| j                  \  }}}	t        |t        «      sdt        |«      |z  z  }t        j                  |t        ||z  «      «      j                  | j                  «      }
| }|j                  ||z  |	«      }t        j                  t        j                  «      t        j                  d«      k\  }t        j                   |||||¬«      d   }t        j"                  t        d|z  «      |j                  d	   |¬
«      j                  | j                  «      } ||«      }t        j$                  |d   |||¬«      } |
|«      }~
~|j                  d   | j                  d	   k\  r|dd…d| j                  d	   …f   }n.t'        |d| j                  d	   |j                  d   z
  ddf¬«      }|j                  |||	«      }|S )a  
    Shift the pitch of a batch of waveforms by a given amount.

    Parameters
    ----------
    input: torch.Tensor [shape=(batch_size, channels, samples)]
        Input audio clips of shape (batch_size, channels, samples)
    shift: float OR Fraction
        `float`: Amount to pitch-shift in # of bins. (1 bin == 1 semitone if `bins_per_octave` == 12)
        `Fraction`: A `fractions.Fraction` object indicating the shift ratio. Usually an element in `get_fast_shifts()`.
    sample_rate: int
        The sample rate of the input audio clips.
    bins_per_octave: int [optional]
        Number of bins per octave. Default is 12.
    n_fft: int [optional]
        Size of FFT. Default is `sample_rate // 64`.
    hop_length: int [optional]
        Size of hop length. Default is `n_fft // 32`.
    window: torch.Tensor [optional]
        A window tensor for the STFT. Default is a tensor of ones.

    Returns
    -------
    output: torch.Tensor [shape=(batch_size, channels, samples)]
        The pitch-shifted batch of audio clips
    é@   é    NrE   z0.11.0)Úreturn_complexrQ   )N.r#   r4   )Ú
fixed_rateÚn_freqrP   r   )rQ   r   )ÚtorchÚonesÚtoÚdeviceÚshapeÚ
isinstancer   rJ   ÚTÚResampleÚintÚreshaper   ÚparseÚ
torchaudioÚ__version__ÚstftÚTimeStretchÚistftr   )rL   rM   r6   rN   rO   rP   rQ   Ú
batch_sizeÚchannelsÚsamplesÚ	resamplerÚoutputÚv011Ú	stretchers                 r   Úpitch_shiftro   n   sÕ  € ñH Ø˜rÑ!ˆÙØ˜b‘[ˆ
Ø€~Ü—‘˜EÓ"ˆØ�Y‰Y�u—|‘|Ó$€FØ$)§K¡KÑ!€J�˜'Ü�eœXÔ&Øœ˜e› Ñ6Ñ7ˆÜ—
‘
˜;¬¨K¸%Ñ,?Ó(@ÓA×DÑDÀUÇ\Á\ÓR€IØ€FØ�^‰^˜J¨Ñ1°7Ó;€FÜ�=‰=œ×/Ñ/Ó0´G·M±MÀ(Ó4KÑK€DÜ�Z‰Z˜  zÀ$ÈvÔVØñ€Fô —‘Ü˜˜U™Ó#¨F¯L©L¸©OÈ
ôç�bˆ�‰Óð ñ �vÓ€FÜ�[‰[˜ ™ E¨:¸fÔE€FÙ�vÓ€FØ�9Ø‡|�|�A�˜%Ÿ+™+ a™.Ò(ØšÐ-˜eŸk™k¨!™nÐ-Ð-Ñ.‰ä�V ! U§[¡[°¡^°f·l±lÀ1±oÑ%EÀqÈ!Ð!LÔMˆà�^‰^˜J¨°'Ó:€FØ€Mr   )NNN)é   r   r   N)%Úcollectionsr   Ú	fractionsr   Ú	functoolsr   Ú	itertoolsr   r   r	   r
   Úmathr   Útypingr   r   r   r   rX   rc   Útorchaudio.transformsÚ
transformsr^   Ú	packagingr   ÚprimePyr   Útorch.nn.functionalr   r2   r`   rB   rJ   rG   rK   ÚTensorro   r   r   r   Ú<module>r}      s  ðÝ Ý Ý ß 2Ó 2Ý ß 2Ó 2ã Û Ý !Ý Ý Ý #óñ. %Mñ#Øð#à˜Ñ!ð#ð 
ˆ(�^ó#ðL/ %ð /¨Hó /ð"%˜hð %¨5ó %ð* &(ØØ !Ø%)ñBØ�<‰<ðBà�˜�Ñ!ðBð ðBð ˜c‘]ð	Bð
 �C‰=ðBð ˜‘ðBð �U—\‘\Ñ"ðBð ‡\�\ôBr   