o
    a&i>]                     @   s  d 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l
mZ dd	lmZmZmZmZmZmZmZ dd
lmZ ddlmZ g dZdejdedeejejf fddZdejdedejfddZdejdedejfddZdejdededejfddZddddejdededede dedejfd d!Z!d"d#dejd$eeeef  d%e"dejfd&d'Z#d(d)d*ej$ej$fdejd+ed,ed-ed.eeef d/edejfd0d1Z%d*ej$d(d)ej$d2dejd-ed.eeef d+ed,ed/edeejejf fd3d4Z&d*ej$d(d)ej$d2dejd-ed.eeef d+ed,ed/edejfd5d6Z'ed7d7d7d8dejd9ed:ee d;ed< dejf
d=d>Z(ed7d7d?dejd9ed:ee d;ed" deejejf f
d@d>Z(ed7d7d?dejd9ed:ee d;e"deejeejejf f f
dAd>Z(dBdd<d8dejd9ed:ee d;e"deejeejejf f f
dCd>Z(ed7d7d7d8dejd9ed:ee d;ed< dejf
dDdEZ)ed7d7d?dejd9ed:ee d;ed" deejejf f
dFdEZ)dBdd<d8dejd9ed:ee d;e"deejeejejf f f
dGdEZ)dS )Ha  
Effects
=======

Harmonic-percussive source separation
-------------------------------------
.. autosummary::
    :toctree: generated/

    hpss
    harmonic
    percussive

Time and frequency
------------------
.. autosummary::
    :toctree: generated/

    time_stretch
    pitch_shift

Miscellaneous
-------------
.. autosummary::
    :toctree: generated/

    remix
    trim
    split
    preemphasis
    deemphasis
    N   )core)	decompose)feature)util)ParameterError)AnyCallableIterableOptionalTupleUnionoverload)Literal)	ArrayLike)hpssharmonic
percussivetime_stretchpitch_shiftremixtrimsplitykwargsreturnc                 K   sX   t | }tj|fi |\}}t j|| j| jd d}t j|| j| jd d}||fS )a  Decompose an audio time series into harmonic and percussive components.

    This function automates the STFT->HPSS->ISTFT pipeline, and ensures that
    the output waveforms have equal length to the input waveform ``y``.

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        audio time series. Multi-channel is supported.
    **kwargs : additional keyword arguments.
        See `librosa.decompose.hpss` for details.

    Returns
    -------
    y_harmonic : np.ndarray [shape=(..., n)]
        audio time series of the harmonic elements
    y_percussive : np.ndarray [shape=(..., n)]
        audio time series of the percussive elements

    See Also
    --------
    harmonic : Extract only the harmonic component
    percussive : Extract only the percussive component
    librosa.decompose.hpss : HPSS on spectrograms

    Examples
    --------
    >>> # Extract harmonic and percussive components
    >>> y, sr = librosa.load(librosa.ex('choice'))
    >>> y_harmonic, y_percussive = librosa.effects.hpss(y)

    >>> # Get a more isolated percussive component by widening its margin
    >>> y_harmonic, y_percussive = librosa.effects.hpss(y, margin=(1.0,5.0))

    dtypelengthr   stftr   r   istftr   shape)r   r   r!   	stft_harm	stft_percy_harmy_perc r(   :C:\wamp64\www\opt\env\Lib\site-packages\librosa/effects.pyr   <   s
   
&r   c                 K   <   t | }tj|fi |d }t j|| j| jd d}|S )ak  Extract harmonic elements from an audio time-series.

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        audio time series. Multi-channel is supported.
    **kwargs : additional keyword arguments.
        See `librosa.decompose.hpss` for details.

    Returns
    -------
    y_harmonic : np.ndarray [shape=(..., n)]
        audio time series of just the harmonic portion

    See Also
    --------
    hpss : Separate harmonic and percussive components
    percussive : Extract only the percussive component
    librosa.decompose.hpss : HPSS for spectrograms

    Examples
    --------
    >>> # Extract harmonic component
    >>> y, sr = librosa.load(librosa.ex('choice'))
    >>> y_harmonic = librosa.effects.harmonic(y)

    >>> # Use a margin > 1.0 for greater harmonic separation
    >>> y_harmonic = librosa.effects.harmonic(y, margin=3.0)

    r   r   r   r    )r   r   r!   r$   r&   r(   r(   r)   r   n      
!r   c                 K   r*   )ay  Extract percussive elements from an audio time-series.

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        audio time series. Multi-channel is supported.
    **kwargs : additional keyword arguments.
        See `librosa.decompose.hpss` for details.

    Returns
    -------
    y_percussive : np.ndarray [shape=(..., n)]
        audio time series of just the percussive portion

    See Also
    --------
    hpss : Separate harmonic and percussive components
    harmonic : Extract only the harmonic component
    librosa.decompose.hpss : HPSS for spectrograms

    Examples
    --------
    >>> # Extract percussive component
    >>> y, sr = librosa.load(librosa.ex('choice'))
    >>> y_percussive = librosa.effects.percussive(y)

    >>> # Use a margin > 1.0 for greater percussive separation
    >>> y_percussive = librosa.effects.percussive(y, margin=3.0)

    r   r   r   r    )r   r   r!   r%   r'   r(   r(   r)   r      r+   r   ratec                K   sx   |dkrt dtj| fi |}tj|||dd|ddd}tt| jd | }tj|f| j	|d|}|S )	a  Time-stretch an audio series by a fixed rate.

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        audio time series. Multi-channel is supported.
    rate : float > 0 [scalar]
        Stretch factor.  If ``rate > 1``, then the signal is sped up.
        If ``rate < 1``, then the signal is slowed down.
    **kwargs : additional keyword arguments.
        See `librosa.decompose.stft` for details.

    Returns
    -------
    y_stretch : np.ndarray [shape=(..., round(n/rate))]
        audio time series stretched by the specified rate

    See Also
    --------
    pitch_shift :
        pitch shifting
    librosa.phase_vocoder :
        spectrogram phase vocoder
    pyrubberband.pyrb.time_stretch :
        high-quality time stretching using RubberBand

    Examples
    --------
    Compress to be twice as fast

    >>> y, sr = librosa.load(librosa.ex('choice'))
    >>> y_fast = librosa.effects.time_stretch(y, rate=2.0)

    Or half the original speed

    >>> y_slow = librosa.effects.time_stretch(y, rate=0.5)

    r   zrate must be a positive number
hop_lengthNn_fft)r,   r-   r.   r   r   )
r   r   r!   Zphase_vocodergetintroundr#   r"   r   )r   r,   r   r!   Zstft_stretchZlen_stretchZ	y_stretchr(   r(   r)   r      s   (

r      Zsoxr_hq)bins_per_octaveres_typesrn_stepsr3   r4   c                K   sj   t |std| ddt| |  }tjt| fd|i|t|| ||d}t j|| jd dS )a  Shift the pitch of a waveform by ``n_steps`` steps.

    A step is equal to a semitone if ``bins_per_octave`` is set to 12.

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        audio time series. Multi-channel is supported.

    sr : number > 0 [scalar]
        audio sampling rate of ``y``

    n_steps : float [scalar]
        how many (fractional) steps to shift ``y``

    bins_per_octave : float > 0 [scalar]
        how many steps per octave

    res_type : string
        Resample type. By default, 'soxr_hq' is used.

        See `librosa.resample` for more information.

    **kwargs : additional keyword arguments.
        See `librosa.decompose.stft` for details.

    Returns
    -------
    y_shift : np.ndarray [shape=(..., n)]
        The pitch-shifted audio time-series

    See Also
    --------
    time_stretch :
        time stretching
    librosa.phase_vocoder :
        spectrogram phase vocoder
    pyrubberband.pyrb.pitch_shift :
        high-quality pitch shifting using RubberBand

    Examples
    --------
    Shift up by a major third (four steps if ``bins_per_octave`` is 12)

    >>> y, sr = librosa.load(librosa.ex('choice'))
    >>> y_third = librosa.effects.pitch_shift(y, sr=sr, n_steps=4)

    Shift down by a tritone (six steps if ``bins_per_octave`` is 12)

    >>> y_tritone = librosa.effects.pitch_shift(y, sr=sr, n_steps=-6)

    Shift up by 3 quarter-tones

    >>> y_three_qt = librosa.effects.pitch_shift(y, sr=sr, n_steps=3,
    ...                                          bins_per_octave=24)
    zbins_per_octave=z must be a positive integer.g       @r,   )Zorig_srZ	target_srr4   r   )size)	r   Zis_positive_intr   floatr   Zresampler   Z
fix_lengthr#   )r   r5   r6   r3   r4   r   r,   Zy_shiftr(   r(   r)   r     s   
B

r   T)align_zeros	intervalsr9   c                C   s   g }|rt | }tt |d }t|t|g}|D ]}|r*|t|| }|| d|d |d f  qtj	|ddS )a^  Remix an audio signal by re-ordering time intervals.

    Parameters
    ----------
    y : np.ndarray [shape=(..., t)]
        Audio time series. Multi-channel is supported.
    intervals : iterable of tuples (start, end)
        An iterable (list-like or generator) where the ``i``th item
        ``intervals[i]`` indicates the start and end (in samples)
        of a slice of ``y``.
    align_zeros : boolean
        If ``True``, interval boundaries are mapped to the closest
        zero-crossing in ``y``.  If ``y`` is stereo, zero-crossings
        are computed after converting to mono.

    Returns
    -------
    y_remix : np.ndarray [shape=(..., d)]
        ``y`` remixed in the order specified by ``intervals``

    Examples
    --------
    Load in the example track and reverse the beats

    >>> y, sr = librosa.load(librosa.ex('choice'))

    Compute beats

    >>> _, beat_frames = librosa.beat.beat_track(y=y, sr=sr,
    ...                                          hop_length=512)

    Convert from frames to sample indices

    >>> beat_samples = librosa.frames_to_samples(beat_frames)

    Generate intervals from consecutive events

    >>> intervals = librosa.util.frame(beat_samples, frame_length=2,
    ...                                hop_length=1).T

    Reverse the beat intervals

    >>> y_out = librosa.effects.remix(y, intervals[::-1])
    r   .r   r   Zaxis)
r   Zto_mononpnonzeroZzero_crossingsappendlenr   Zmatch_eventsconcatenate)r   r:   r9   y_outZy_monozerosintervalr(   r(   r)   r   Z  s   0
 r   i   i   <   frame_lengthr-   top_dbref	aggregatec                 C   sv   t j| ||d}tj|ddddf |dd}|jdkr6t||t|jd }tj|t	t|jd d}|| kS )a?  Frame-wise non-silent indicator for audio input.

    This is a helper function for `trim` and `split`.

    Parameters
    ----------
    y : np.ndarray
        Audio signal, mono or stereo

    frame_length : int > 0
        The number of samples per frame

    hop_length : int > 0
        The number of samples between frames

    top_db : number > 0
        The threshold (in decibels) below reference to consider as
        silence

    ref : callable or float
        The reference amplitude

    aggregate : callable [default: np.max]
        Function to aggregate dB measurements across channels (if y.ndim > 1)

        Note: for multiple leading axes, this is performed using ``np.apply_over_axes``.

    Returns
    -------
    non_silent : np.ndarray, shape=(m,), dtype=bool
        Indicator of non-silent frames
    )r   rE   r-   .r   N)rG   rF   r   r;   )
r   Zrmsr   Zamplitude_to_dbndimr<   Zapply_over_axesrangeZsqueezetuple)r   rE   r-   rF   rG   rH   Zmsedbr(   r(   r)   _signal_to_frame_nonsilent  s   *

rM   )rF   rG   rE   r-   rH   c                C   s   t | |||||d}t|}|jdkr3ttj|d |d}t| jd ttj|d d |d}	nd\}}	t	dg| j
 }
t	||	|
d< | t|
 t||	gfS )aC  Trim leading and trailing silence from an audio signal.

    Parameters
    ----------
    y : np.ndarray, shape=(..., n)
        Audio signal. Multi-channel is supported.
    top_db : number > 0
        The threshold (in decibels) below reference to consider as
        silence
    ref : number or callable
        The reference amplitude.  By default, it uses `np.max` and compares
        to the peak amplitude in the signal.
    frame_length : int > 0
        The number of samples per analysis frame
    hop_length : int > 0
        The number of samples between analysis frames
    aggregate : callable [default: np.max]
        Function to aggregate across channels (if y.ndim > 1)

    Returns
    -------
    y_trimmed : np.ndarray, shape=(..., m)
        The trimmed signal
    index : np.ndarray, shape=(2,)
        the interval of ``y`` corresponding to the non-silent region:
        ``y_trimmed = y[index[0]:index[1]]`` (for mono) or
        ``y_trimmed = y[:, index[0]:index[1]]`` (for stereo).

    Examples
    --------
    >>> # Load some audio
    >>> y, sr = librosa.load(librosa.ex('choice'))
    >>> # Trim the beginning and ending silence
    >>> yt, index = librosa.effects.trim(y)
    >>> # Print the durations
    >>> print(librosa.get_duration(y), librosa.get_duration(yt))
    25.025986394557822 25.007891156462584
    rE   r-   rG   rF   rH   r   r-   r   r   )r   r   N)rM   r<   flatnonzeror7   r0   r   frames_to_samplesminr#   slicerI   rK   asarray)r   rF   rG   rE   r-   rH   
non_silentr=   startendZ
full_indexr(   r(   r)   r     s&   0
	
r   c                C   s   t | |||||d}tt|t}|d g}|d r(|dtdg |d r7|tt	|g t
jt||d}t|| jd }|d}|S )ao  Split an audio signal into non-silent intervals.

    Parameters
    ----------
    y : np.ndarray, shape=(..., n)
        An audio signal. Multi-channel is supported.
    top_db : number > 0
        The threshold (in decibels) below reference to consider as
        silence
    ref : number or callable
        The reference amplitude.  By default, it uses `np.max` and compares
        to the peak amplitude in the signal.
    frame_length : int > 0
        The number of samples per analysis frame
    hop_length : int > 0
        The number of samples between analysis frames
    aggregate : callable [default: np.max]
        Function to aggregate across channels (if y.ndim > 1)

    Returns
    -------
    intervals : np.ndarray, shape=(m, 2)
        ``intervals[i] == (start_i, end_i)`` are the start and end time
        (in samples) of non-silent interval ``i``.

    rN   r   r   r   rO   )r      )rM   r<   rP   diffastyper0   insertarrayr>   r?   r   rQ   r@   minimumr#   Zreshape)r   rF   rG   rE   r-   rH   rU   edgesr(   r(   r)   r   "  s$   $

r   .)coefzi	return_zfr_   r`   ra   Fc                C      d S Nr(   r   r_   r`   ra   r(   r(   r)   preemphasisj     re   )r_   r`   c                C   rb   rc   r(   rd   r(   r(   r)   re   u  rf   c                C   rb   rc   r(   rd   r(   r(   r)   re     rf   g
ףp=
?c                C   s   t jd| g| jd}t jdg| jd}|du r*d| dddf  | dddf  }t |}tjj||| t j|| jdd\}}|rG||fS |S )	a	  Pre-emphasize an audio signal with a first-order differencing filter:

        y[n] -> y[n] - coef * y[n-1]

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        Audio signal. Multi-channel is supported.

    coef : positive number
        Pre-emphasis coefficient.  Typical values of ``coef`` are between 0 and 1.

        At the limit ``coef=0``, the signal is unchanged.

        At ``coef=1``, the result is the first-order difference of the signal.

        The default (0.97) matches the pre-emphasis filter used in the HTK
        implementation of MFCCs [#]_.

        .. [#] http://htk.eng.cam.ac.uk/

    zi : number
        Initial filter state.  When making successive calls to non-overlapping
        frames, this can be set to the ``zf`` returned from the previous call.
        (See example below.)

        By default ``zi`` is initialized as ``2*y[0] - y[1]``.

    return_zf : boolean
        If ``True``, return the final filter state.
        If ``False``, only return the pre-emphasized signal.

    Returns
    -------
    y_out : np.ndarray
        pre-emphasized signal
    zf : number
        if ``return_zf=True``, the final filter state is also returned

    Examples
    --------
    Apply a standard pre-emphasis filter

    >>> import matplotlib.pyplot as plt
    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> y_filt = librosa.effects.preemphasis(y)
    >>> # and plot the results for comparison
    >>> S_orig = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max, top_db=None)
    >>> S_preemph = librosa.amplitude_to_db(np.abs(librosa.stft(y_filt)), ref=np.max, top_db=None)
    >>> fig, ax = plt.subplots(nrows=2, sharex=True, sharey=True)
    >>> librosa.display.specshow(S_orig, y_axis='log', x_axis='time', ax=ax[0])
    >>> ax[0].set(title='Original signal')
    >>> ax[0].label_outer()
    >>> img = librosa.display.specshow(S_preemph, y_axis='log', x_axis='time', ax=ax[1])
    >>> ax[1].set(title='Pre-emphasized signal')
    >>> fig.colorbar(img, ax=ax, format="%+2.f dB")

    Apply pre-emphasis in pieces for block streaming.  Note that the second block
    initializes ``zi`` with the final state ``zf`` returned by the first call.

    >>> y_filt_1, zf = librosa.effects.preemphasis(y[:1000], return_zf=True)
    >>> y_filt_2, zf = librosa.effects.preemphasis(y[1000:], zi=zf, return_zf=True)
    >>> np.allclose(y_filt, np.concatenate([y_filt_1, y_filt_2]))
    True

    See Also
    --------
    deemphasis
          ?r   NrX   .r   r   r`   )r<   rT   r   
atleast_1dscipysignallfilter)r   r_   r`   ra   barA   Zz_fr(   r(   r)   re     s   L$
$c                C   rb   rc   r(   rd   r(   r(   r)   
deemphasis  rf   rp   c                C   rb   rc   r(   rd   r(   r(   r)   rp     rf   c                C   s   t jd| g| jd}t jdg| jd}|du r[t jt| jdd dg | jd}tjj||| |d\}}|d| | dd	df  | dddf  d
|  |t 	| jd   8 }nt 
|}tjj||| || jd\}}|rv||fS |S )a  De-emphasize an audio signal with the inverse operation of preemphasis():

    If y = preemphasis(x, coef=coef, zi=zi), the deemphasis is:

    >>> x[i] = y[i] + coef * x[i-1]
    >>> x = deemphasis(y, coef=coef, zi=zi)

    Parameters
    ----------
    y : np.ndarray [shape=(..., n)]
        Audio signal. Multi-channel is supported.

    coef : positive number
        Pre-emphasis coefficient.  Typical values of ``coef`` are between 0 and 1.

        At the limit ``coef=0``, the signal is unchanged.

        At ``coef=1``, the result is the first-order difference of the signal.

        The default (0.97) matches the pre-emphasis filter used in the HTK
        implementation of MFCCs [#]_.

        .. [#] http://htk.eng.cam.ac.uk/

    zi : number
        Initial filter state. If inverting a previous preemphasis(), the same value should be used.

        By default ``zi`` is initialized as
        ``((2 - coef) * y[0] - y[1]) / (3 - coef)``. This
        value corresponds to the transformation of the default initialization of ``zi`` in ``preemphasis()``,
        ``2*x[0] - x[1]``.

    return_zf : boolean
        If ``True``, return the final filter state.
        If ``False``, only return the pre-emphasized signal.

    Returns
    -------
    y_out : np.ndarray
        de-emphasized signal
    zf : number
        if ``return_zf=True``, the final filter state is also returned

    Examples
    --------
    Apply a standard pre-emphasis filter and invert it with de-emphasis

    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> y_filt = librosa.effects.preemphasis(y)
    >>> y_deemph = librosa.effects.deemphasis(y_filt)
    >>> np.allclose(y, y_deemph)
    True

    See Also
    --------
    preemphasis
    rg   rh   Nr   r   ri   rX   .r      )r<   r\   r   rB   listr#   rk   rl   rm   Zarangerj   rZ   )r   r_   r`   ra   rn   ro   rA   zfr(   r(   r)   rp     s"   A$&
 )*__doc__numpyr<   Zscipy.signalrk    r   r   r   r   Zutil.exceptionsr   typingr   r	   r
   r   r   r   r   Ztyping_extensionsr   Znumpy.typingr   __all__Zndarrayr   r   r   r8   r   r0   strr   boolr   maxrM   r   r   re   rp   r(   r(   r(   r)   <module>   s  !$$2,,D
V
C

<

Q

H


`
