Ë
    ëÿæiµ6 ã            <       óü#  — U d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZ g d¢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 ddlZe
d
   Z e
d   Z!e
d   Z"e
d   Z#e
d   Z$e
d   dz  Z%e
d   Z&e
d   Z'e
d   Z(e
d   Z) G d„ d«      Z*ejV                  jY                  dd«      j[                  «       dvZ.e.xr, ejV                  jY                  dd«      j[                  «       dv Z/	  e0ejV                  jY                  dd«      «      Z1 e3de1«      Z4 ejj                  «       Z6 e«       Z7ee8   e9d<   i Z:ee8e8f   e9d <    ee4¬!«      Z;ee9d"<   d#ed$e8fd%„Z<e.rddd&œd'e8d#ed(ee8   d$dfd)„Z=nddd&œd'e8d#ed(ee8   d$dfd*„Z=�dpd+„Z>d,d-œd.e?d$e@fd/„ZAd$efd0„ZBd1e8d2e8d3e0d4e0d$e8f
d5„ZCd6e8d$eee8e8e0e0f      fd7„ZDd8ed9e@d$dfd:„ZEejV                  jY                  d;d<«      j[                  «       dvZFd=e8d$ee0   fd>„ZGd2e8d$ee0   fd?„ZH ed@¬A«      d$e8fdB„«       ZIdCZJdDeJz   dEz   ZKdDeJz   dFz   ZLdGeJz   dHz   ZMdIZNdJZOdKZPdLZQdMZRdNZS G dO„ dP«      ZT G dQ„ dR«      ZU G dS„ dT«      ZVi ZWee8eXf   e9dU<   dVe8dWeYd$dfdX„ZZ G dY„ dZ«      Z[d,d[œd\ej¸                  d]ej¸                  d4e0d^e0d_e?d$ej¸                  fd`„Z]d,d[œd\ej¸                  d]ej¸                  daej¸                  d4e0d^e0d_e?d$ej¸                  fdb„Z^ee8ej¸                  df   Z_dce_ddej¸                  dee8dfe0d3e0dge?d$eXfdh„Z`diZa e«       Zbdje9dk<    ejj                  «       ZcejV                  jY                  dldm«      jÉ                  «       j[                  «       ZeeednvrdmZe	  e3d@ e0ejV                  jY                  dodp«      «      «      Zfd#eXd$eeXe?ege0f      fdr„Zhd#eXdseXe?ege0f   d$dfdt„Ziduee0   dve8d$eXe8e0ee0   ee0   f   fdw„Zjd,d[œdxdydze0duee0   d{e?dve8d_e?d$dfd|„ZkejØ                  d}ej¸                  d~e0d$ej¸                  fd„«       Zmd}ej¸                  d~e0d$ej¸                  fd€„Znd]e_dee8dfe0d3e0dge?d$ej¸                  fd�„Zod3e0d‚ee0   dfee0   d~e0d$eXe0e0e0f   f
dƒ„Zpd„d…œd†ejâ                  egz  d‡e8d$ejâ                  fdˆ„Zrd„d…œd‰ejâ                  d‡e8d$ejâ                  fdŠ„Zsdd„d‹œdŒe0d�egdŽegd�e0d�e0d‘e%d‡e$d$ej¸                  fd’„Ztd“d”d•d–d—d˜œd}ej¸                  d™e
dš   d›eeg   dœegd�egdže
dŸ   d$ej¸                  fd „Zud¡d¢œd£e0d�e0d‘e
d¡   dz  d$ej¸                  fd¤„Zv ed¬A«      dŒe0d�egdŽegd�e0d�e0d‘e%d‡e$d$ej¸                  fd¥„«       Zw ed¬A«      d£e0d�e0d‘e
d¡   dz  d$ej¸                  fd¦„«       Zx ed¬A«      d£e0d§e0d$ej¸                  fd¨„«       Zyd©dªœd“ej¸                  d«ej¸                  d¬e
d­   d$ej¸                  fd®„Zzdd¯œd°ej¸                  d±ej¸                  d²ej¸                  dz  d$ej¸                  fd³„Z{d–d´œd}ej¸                  dµegd¶e(d·egd$ej¸                  f
d¸„Z|d
Z}dZ~d¹dºœd»ee8   d¼e8d$e8fd½„Zd¾d¿œdÀee8   dÁe8d$e8fdÂ„Z€d¹Z� edÃ¬Ä«       G dÅ„ dÆ«      «       Z‚ejV                  jY                  dÇd<«      j[                  «       dvZƒdÈej¸                  dÉe?d3e0d^e0dÊee0   dËe0d$ej¸                  fdÌ„Z„dÍe0d3e0d‚e0dÎe#d$eXe0e0f   f
dÏ„Z…d}ej¸                  d3e0d‚e0dÐe"dÎe#d$ej¸                  fdÑ„Z†dÒej¸                  dÉe?d3e0d^e0dÊee0   dËe0d$ej¸                  fdÓ„Z‡ G dÔ„ dy«      Zˆ G dÕ„ dÖ«      Z‰ G d×„ dØe‰«      ZŠ G dÙ„ dÚ«      Z‹dÛdqdÜdd–dÝddÞdßdàdÃdÃdádâd,dãœd}ej¸                  däej¸                  ejâ                  z  d�e0d3e0d‚e0dfee0   d“egdåe)d›egdz  dµegd¶e(dee8dge?dÉe?dÐe"dÎe#dæe?d$ej¸                  f$dç„ZŒdèdéœdêe0dëe0dìegd$e0fdí„Z�ddddèdîdïœd}ej¸                  dðe0dz  dêe0dz  dëe0dz  dìegdñe0d$ej¸                  fdò„ZŽ G dó„ dô«      Z� edõ¬A«      döe0d‚e0d÷egdøe0dùe0dúegd‘egdûegd$e�fdü„«       Z�dÛdÜdýdþdÿd–d–�d �dœd}ej¸                  döe0d‚e0d÷egdøe0dùe0dúegd‘egdûegd$ej¸                  f�d„Z‘ G �d„ �d«      Z’dÛ�ddqdÜdd�ddddd”dàdÃdádâdd¡�dœd}ej¸                  d�e0d£e0d3e0d‚e0dfee0   d�e0d�egdŽeeg   d‘e%d‡e$d›eeg   dee8dÉe?dÐe"dÎe#d§e0�de
d¡   dz  d$ej¸                  f&�d	„Z“�d
Z” ed¬A«      d�e0d3e0�de0�degd$ej¸                  f
�d„«       Z•d}ej¸                  �de8d$eXej¸                  e?f   f�d„Z–d}ej¸                  �de?d$ej¸                  f�d„Z—d�e0d3e0d$ej¸                  f�d„Z˜d�e0dŒe0�de?d$ejâ                  f�d„Z™�ddÃdÃd,�dœdŒe0d�e0�de0d�egdŽeg�degdz  �de?�de?�de?d$ej¸                  f�d„Zš ed¬A«      d�e0d3e0d$ej¸                  f�d„«       Z› ed¬A«      d�e0d3e0�de0d÷egd$eXeXe0e0f   �df   f
�d„«       Zœ ed¬A«      d£e0d�e0d‘e
d¡   dz  d$ej¸                  f�d „«       Z�døe0d÷egdùe0d$ejâ                  f�d!„Zž�d"ejâ                  d$ejâ                  f�d#„ZŸ�d�d$œ�d"ejâ                  döegdúeg�d%ejâ                  �d&egd$ejâ                  f�d'„Z �dd�d(œdöeg�d"ejâ                  dúegd‘egdûeg�d%ejâ                  �d&egd‚e0dz  d$eXejâ                  e0ejâ                  f   f�d)„Z¡ edõ¬A«      d$ej¸                  f�d*„«       Z¢d}ej¸                  d$ej¸                  f�d+„Z£ e�d,¬A«      döe0d‚e0d÷egdøe0dùe0dúegd‘egdûegd$e@e8ef   f�d-„«       Z¤d}ej¸                  d~e0dže8d$ej¸                  f�d.„Z¥d}ej¸                  �d/e0d‚e0dÉe?�d0e8d$eXej¸                  e?f   f�d1„Z¦d}ej¸                  d�e0d3e0d‚e0dfee0   dee8dge?dÉe?dÐe"dÎe#d$eXej¸                  e?f   f�d2„Z§d}ej¸                  d‘egdz  �d3e0d$ej¸                  f�d4„Z¨dÿ�d�d5œd�e0d3e0�de0�degd$ej¸                  f
�d6„Z©�d7eXe8�df   eYe8   z  dz  d$eXe8�df   f�d8„Zª�d9ej¸                  �d"ej¸                  d$ej¸                  f�d:„Z«d�d;œ�d9ej¸                  �d"ej¸                  �d<eg�d=ej¸                  dz  d$ej¸                  f
�d>„Z¬�d9ej¸                  �d"ej¸                  �d?egd$ej¸                  f�d@„Z­d�dAœ�d9ej¸                  d�e0d3e0�de0d÷eg�dBeg�dCeXeXe0e0f   �df   dz  d$ej¸                  f�dD„Z®d“ej¸                  �dEej¸                  d‘egdz  d$ej¸                  f�dF„Z¯d”d�dGœd“ej¸                  d«ej¸                  d±ej¸                  d›egdz  d²ej¸                  dz  d$ej¸                  f�dH„Z°dÿ�dI�d�dJ�dK�dL�dM�dN�dd�ddddd”dd¡�dOœ�d9ej¸                  �d7eXe8�df   d�e0d3e0�de0�dPegdz  �deg�dQeg�d?eg�de0�dReg�dSegd£e0d�e0d�egdŽegdz  �dTe%d‡e$d›egdz  d§e0�de
d¡   dz  d$eXej¸                  �df   f,�dU„Z±dÛdqdÜddàdÃdádâdÿ�dI�d�dJ�dK�dL�dM�dN�dd�ddddd”dd¡�dVœd}ej¸                  �d7eXe8�df   d�e0d3e0d‚e0dfe0dz  dee8dÉe?dÐe8dÎe8�de0�dPegdz  �deg�dQeg�d?eg�de0�dReg�dSegd£e0d�e0d�egdŽegdz  �dTe%d‡e$d›egdz  d§e0�de
d¡   dz  d$eXeXej¸                  �df   e?f   f8�dW„Z²dÛdqdÜddÿ�dIdàdÃdádâ�d�dXœd}ej¸                  d�e0d3e0d‚e0dfe0dz  �de0d‘egdz  dee8dÉe?dÐe8dÎe8�degd$ej¸                  f�dY„Z³ddÛdqdÜddàdÃdádâdÿ�dI�d�dJ�dK�dL�dM�dN�dd�ddddd”dd¡�dZœd}ej¸                  �d7eXe8�df   eYe8   z  dz  d�e0d3e0d‚e0dfe0dz  dee8dÉe?dÐe8dÎe8�de0�dPegdz  �deg�dQeg�d?eg�de0�dReg�dSegd£e0d�e0d�egdŽegdz  �dTe%d‡e$d›egdz  d§e0�de
d¡   dz  d$e@e8ej¸                  f   f8�d[„Z´ G �d\„ �d]«      ZµdÛdqdÜddàdÃdádâ�d^œd}ej¸                  d�e0d3e0d‚e0dfe0dz  dee8dÉe?dÐe8dÎe8d$ej¸                  f�d_„Z¶dÛdqdÜd�dJdàdÃdádâ�d`œ	d}ej¸                  d�e0d3e0d‚e0dfe0dz  �d<egdee8dÉe?dÐe8dÎe8d$ej¸                  f�da„Z·dÛdqdÜd�dKdàdÃdádâ�dbœ	d}ej¸                  d�e0d3e0d‚e0dfe0dz  �d?egdee8dÉe?dÐe8dÎe8d$ej¸                  f�dc„Z¸dÛdqdÜd�dL�dM�dNdàdÃdádâ�ddœd}ej¸                  d�e0d3e0d‚e0dfe0dz  �de0d÷eg�dBegdee8dÉe?dÐe8dÎe8d$ej¸                  f�de„Z¹dqdÜdÃdá�dfœd}ej¸                  �d/e0d‚e0dÉe?�d0e8d$ej¸                  f�dg„ZºdqdÜdÃdá�dfœd}ej¸                  �d/e0d‚e0dÉe?�d0e8d$ej¸                  f�dh„Z»dÛdqdÜd�dddÃd@ddd”dádâ�diœd}ej¸                  d�e0d3e0d‚e0d�e0d�egdŽeeg   dÉe?dðe0d‘e%d‡e$d›eeg   dÐe"dÎe#d$ej¸                  f�dj„Z¼dÛdqdÜd�dddÃd@ddd”dádâ�diœd}ej¸                  d�e0d3e0d‚e0d�e0d�egdŽeeg   dÉe?dðe0d‘e%d‡e$d›eeg   dÐe"dÎe#d$ej¸                  f�dk„Z½ edõ¬A«      d#e‚d$eˆf�dl„«       Z¾dádâd�dmœd3e0d‚e0dfe0dee8dge?dÉe?dæe?d]e_dÐe"dÎe#�dnee8   d$eˆf�do„Z¿y# e2$ r dZ1Y �ŒÌw xY w# e2$ r dqZfY �ŒKw xY w(q  zHReusable MLX spectral ops for STFT, mel, MFCC, and hybrid-CQT frontends.é    )ÚCounterÚOrderedDictÚdeque)Ú	dataclass)Ú	lru_cache)ÚLiteralÚOptionalÚUnionN))ÚRepeatedShapeCompileCacheÚSpectralTransformÚMelSpectrogramTransformÚLogMelSpectrogramTransformÚFilteredSpectrogramTransformÚHybridCQTTransformÚMFCCTransformÚSpectralFeatureTransformÚISTFTBackendPolicyÚSTFTOutputLayoutÚCenterPadModeÚCenterTailPadÚMelScaleÚMelNormÚMelModeÚMelOutputScaleÚ
LogMelModeÚFilteredOutputScaleÚ
WindowLikeÚmake_windowÚmelscale_fbanksÚamplitude_to_dbÚ
dct_matrixÚlog_triangular_fbanksÚfiltered_spectrogramÚ
hybrid_cqtÚpositive_spectral_diffÚmfccÚchroma_stftÚspectral_featuresÚspectral_centroidÚspectral_bandwidthÚspectral_rolloffÚspectral_contrastÚrmsÚzero_crossing_rateÚresolve_fft_paramsÚget_transform_mlxÚspec_mlx_device_keyÚget_cache_debug_statsÚreset_cache_debug_stats)ÚPath)ÚAnyÚDictÚTuple)ÚautoÚmlx_fftÚmetalÚtorch_fallback)ÚbfnÚbnf)ÚreflectÚconstant)Ú	symmetricÚminimal©ÚhtkÚslaneyrD   )Ú
mlx_nativeÚtorchaudio_compatÚdefault©ÚlinearÚlogÚdb©ÚclampÚaddÚlog1p©rI   rJ   rK   Úlog10_plus_onec            	       óŠ   — e Zd ZdZdZddddœdeded	ee   d
dfd„Zede	d
e
edf   fd„«       Zde	fd„Zdd„Zd
eee	f   fd„Zy)r   au  Promote repeated input shapes to bounded shape-specialized compiled callables.

    This is intended for wrapper code that mostly sees variable-length audio but
    still encounters a small repeated set of shapes in steady-state workloads.
    The helper only manages shape hit counting and compiled-callable caching; the
    caller still owns the eager fallback path.
    )Ú_compile_factoryÚ	_min_hitsÚ_max_compiled_shapesÚ_max_pending_shapesÚ_pending_hitsÚ	_compiledé   é   N)Úmin_hitsÚmax_compiled_shapesÚmax_pending_shapesr[   r\   r]   Úreturnc                ó0  — |dk  rt        d«      ‚|dk  rt        d«      ‚|€t        d|dz  «      }|dk  rt        d«      ‚|| _        t        |«      | _        t        |«      | _        t        |«      | _        t        «       | _        t        «       | _	        y )Né   zmin_hits must be >= 1z max_compiled_shapes must be >= 1é   é   zmax_pending_shapes must be >= 1)
Ú
ValueErrorÚmaxrS   ÚintrT   rU   rV   r   rW   rX   )ÚselfÚcompile_factoryr[   r\   r]   s        úm/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_spectro/spectral_ops.pyÚ__init__z"RepeatedShapeCompileCache.__init__a   sš   € ð �aŠ<ÜÐ4Ó5Ð5Ø Ò"ÜÐ?Ó@Ð@ØÐ%Ü!$ RÐ)<¸qÑ)@Ó!AÐØ Ò!ÜÐ>Ó?Ð?à /ˆÔÜ˜X›ˆŒÜ$'Ð(;Ó$<ˆÔ!Ü#&Ð'9Ó#:ˆÔ Ü@KÃˆÔÜ<G»Mˆ�ó    Úshape.c                 ó|   — t        | t        «      rt        d„ | D «       «      S t        d„ t        | «      D «       «      S )Nc              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N©re   ©Ú.0Údims     rh   Ú	<genexpr>z=RepeatedShapeCompileCache._normalize_shape.<locals>.<genexpr>|   s   è ø€ Ð3©U cœ˜SŸ©Uùó   ‚c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrn   ro   rp   s     rh   rs   z=RepeatedShapeCompileCache._normalize_shape.<locals>.<genexpr>}   s   è ø€ Ð6© #”S˜—X©ùrt   )Ú
isinstanceÚtuple)rk   s    rh   Ú_normalize_shapez*RepeatedShapeCompileCache._normalize_shapey   s2   € ä�eœUÔ#ÜÑ3©UÓ3Ó3Ð3ÜÑ6¬¨u¬Ó6Ó6Ð6rj   c                 óT  — | j                  |«      }| j                  j                  |«      }|�*| j                  j                  |«       t	        d|¬«       |S | j
                  j                  |d«      dz   }|| j
                  |<   | j
                  j                  |«       t        | j
                  «      | j                  kD  r,| j
                  j                  d¬«      \  }}t	        d|¬«       || j                  k  rt	        d|d	|› �¬
«       y | j                  |«      }t        | j                  «      | j                  k\  r,| j                  j                  d¬«      \  }}t	        d|¬«       || j                  |<   | j
                  j                  |d «       t	        d|¬«       |S )Nzshape_compile_cache.hit©Úkeyr   r`   F©Úlastz!shape_compile_cache.pending_evictzshape_compile_cache.misszhits=©r{   Údetailz"shape_compile_cache.compiled_evictzshape_compile_cache.promote)rx   rX   ÚgetÚmove_to_endÚ_record_cache_eventrW   ÚlenrV   ÚpopitemrT   rS   rU   Úpop)rf   rk   Ú	shape_keyÚcachedÚhitsÚevicted_shapeÚ_Úcompileds           rh   r€   zRepeatedShapeCompileCache.get   sy  € Ø×)Ñ)¨%Ó0ˆ	à—‘×#Ñ# IÓ.ˆØÐØ�N‰N×&Ñ& yÔ1ÜÐ 9¸yÕIØˆMà×!Ñ!×%Ñ% i°Ó3°aÑ7ˆØ(,ˆ×Ñ˜9Ñ%Ø×Ñ×&Ñ& yÔ1Üˆt×!Ñ!Ó" T×%=Ñ%=Ò=Ø#×1Ñ1×9Ñ9¸uÐ9ÓEÑˆM˜1ÜÐ CÈÕWà�$—.‘.Ò ÜÐ :À	ÐTYÐZ^ÐY_ÐR`ÕaØà×(Ñ(¨Ó3ˆÜˆt�~‰~Ó $×";Ñ";Ò;Ø#Ÿ~™~×5Ñ5¸5Ð5ÓAÑˆM˜1ÜÐ DÈ-ÕXØ$,ˆ�‰�yÑ!Ø×Ñ×Ñ˜y¨$Ô/ÜÐ9¸yÕIØˆrj   c                 ól   — | j                   j                  «        | j                  j                  «        y rn   )rW   ÚclearrX   ©rf   s    rh   r�   zRepeatedShapeCompileCache.clearœ   s$   € Ø×Ñ× Ñ Ô"Ø�‰×ÑÕrj   c           	      óÞ   — | j                   | j                  | j                  t        | j                  «      t        | j
                  «      t        | j
                  j                  «       «      dœS )N)r[   r\   r]   Úpending_shapesÚcompiled_shapesÚcompiled_shape_keys)rT   rU   rV   rƒ   rW   rX   ÚlistÚkeysrŽ   s    rh   Ú
cache_infoz$RepeatedShapeCompileCache.cache_info    sT   € àŸ™Ø#'×#<Ñ#<Ø"&×":Ñ":Ü! $×"4Ñ"4Ó5Ü" 4§>¡>Ó2Ü#'¨¯©×(;Ñ(;Ó(=Ó#>ñ
ð 	
rj   ©r^   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__re   r	   ri   Ústaticmethodr5   rw   rx   r€   r�   ÚdictÚstrr•   © rj   rh   r   r   O   sž   „ ñð€Ið Ø#$Ø,0òJð ð	Jð
 !ðJð % S™MðJð 
óJð0 ð7 ð 7¨¨c°3¨h©ò 7ó ð7ð
˜ó ó:ð
˜D  c ™Nô 
rj   r   ÚSPEC_MLX_CACHE_STATSÚ0©r¡   ÚfalseÚnoÚoffÚSPEC_MLX_CACHE_STATS_TRACE)Ú1ÚtrueÚyesÚonÚSPEC_MLX_CACHE_STATS_TRACE_MAXÚ128é€   ra   Ú_CACHE_STATS_COUNTSÚ_CACHE_STATS_LAST_KEY)ÚmaxlenÚ_CACHE_STATS_RECENTr{   r^   c                 ó’  — t        | t        «      r-dj                  d„ | d d D «       «      }dt        | «      › d|› d�S t        | t        «      r"t        | j                  «       «      d d }d|› d	�S t        | d
«      r8t        | d
d «      }t        | «      j                  › dt        d„ |D «       «      › d	�S t        | «      j                  S )Nú, c              3   óF   K  — | ]  }t        |«      j                  –— Œ y ­wrn   )Útyper—   ©rq   Úvs     rh   rs   z'_summarize_cache_key.<locals>.<genexpr>¾   s   è ø€ Ð;±7¨aœ˜a›×)Õ)±7ùs   ‚!rb   z
tuple(len=z	, types=[z])é   z
dict(keys=Ú)rk   z(shape=c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrn   ro   )rq   Úds     rh   rs   z'_summarize_cache_key.<locals>.<genexpr>Å   s   è ø€ Ð2IÁ5¸a´3°q·6Á5ùrt   )rv   rw   Újoinrƒ   r�   r“   r”   ÚhasattrÚgetattrrµ   r—   )r{   Úheadr”   rk   s       rh   Ú_summarize_cache_keyrÀ   ¼   sÁ   € Ü�#”uÔØ�y‰yÑ;°3°r¸±7Ó;Ó;ˆØœC ›H˜: Y¨t¨f°BÐ7Ð7Ü�#”tÔÜ�C—H‘H“JÓ  Ð#ˆØ˜D˜6 Ð#Ð#Üˆs�GÔÜ˜˜W dÓ+ˆÜ�s“)×$Ñ$Ð% W¬UÑ2IÁ5Ó2IÓ-IÐ,JÈ!ÐLÐLÜ�‹9×ÑÐrj   r~   Únamer   c                ó  — t         5  t        | xx   dz  cc<   |�t        |«      t        | <   t        rBdt        | «      i}|�t        |«      |d<   |�t        |«      |d<   t        j                  |«       d d d «       y # 1 sw Y   y xY w)Nr`   Úeventr{   r   )Ú_CACHE_STATS_LOCKr®   rÀ   r¯   Ú_CACHE_STATS_TRACErž   r±   Úappend)rÁ   r{   r   Úitems       rh   r‚   r‚   Ê   s{   € ÞÜ Ó%¨Ñ*Ó%ØˆÜ.BÀ3Ó.GÔ% dÑ+Ý!Ø¤ T£Ð+�Ø�?Ü"6°sÓ";�D˜‘KØÐ%Ü%(¨£[�D˜‘NÜ#×*Ñ*¨4Ô0÷ ×Ñús   ‡A.A>Á>Bc                 ó   — y rn   rŸ   )rÁ   r{   r   s      rh   r‚   r‚   ×   s   € Ørj   c                  ó²   — t         5  t        j                  «        t        j                  «        t        j                  «        d d d «       y # 1 sw Y   y xY wrn   )rÄ   r®   r�   r¯   r±   rŸ   rj   rh   r3   r3   Û   s5   € Þ	Ü×!Ñ!Ô#Ü×#Ñ#Ô%Ü×!Ñ!Ô#÷ 
×	Ñ	ús   ‡=AÁAF)ÚresetrÊ   c                 óT  — t         5  t        t        «      t        t        «      t        t
        «      t        t        «      dœ}ddd«       t        j                  «       d<   t        t        j                  «       j                  «       «      |d<   | r
t        «        |S # 1 sw Y   Œ\xY w)z”Return lightweight cache/debug counters for runtime tuning.

    Includes cache hit/miss/eviction counters plus representative key-shape hints.
    )ÚenabledÚcountsÚlast_key_shapesÚrecent_eventsNÚkernel_cacheÚtransform_cache)rÄ   ÚboolÚ_CACHE_STATS_ENABLEDr�   r®   r¯   r“   r±   Ú_KernelCacheÚdebug_snapshotÚ_get_transform_cachedr•   Ú_asdictr3   )rÊ   Úpayloads     rh   r2   r2   â   s†   € ö
 
äÔ0Ó1ÜÔ.Ó/Ü#Ô$9Ó:Ü!Ô"5Ó6ñ	
ˆ÷ 
ô +×9Ñ9Ó;€GˆNÑÜ!%Ô&;×&FÑ&FÓ&H×&PÑ&PÓ&RÓ!S€GÐÑÙÜÔ!Ø€N÷ 
Ð	ús   ‡<BÂB'c            	      óè  — t         j                  j                  d«      } | rt        | «      j	                  «       S t        j
                  «       }t        j                  dk(  r	|dz  dz  }n�t         j                  dk(  r9t        t         j                  j                  dt        |dz  dz  «      «      «      }n5t        t         j                  j                  d	t        |d
z  «      «      «      }|dz  dz  S )NÚSPEC_MLX_AUTOTUNE_CACHE_PATHÚdarwinÚLibraryÚCachesÚntÚLOCALAPPDATAÚAppDataÚLocalÚXDG_CACHE_HOMEz.cachezmlx-spectrozspec_mlx_autotune.json)
ÚosÚenvironr€   r4   Ú
expanduserÚhomeÚsysÚplatformrÁ   rž   )Úoverrideræ   Úbases      rh   Ú_default_cache_pathrë   ô   s¼   € ä�z‰z�~‰~Ð<Ó=€HÙÜ�H‹~×(Ñ(Ó*Ð*ä�9‰9‹;€Dô ‡|�|�xÒØ�iÑ (Ñ*‰ä	�‰�DŠÜ”B—J‘J—N‘N >´3°t¸iÑ7GÈ'Ñ7QÓ3RÓSÓT‰ô ”B—J‘J—N‘NÐ#3´S¸À¹Ó5IÓJÓKˆà�-ÑÐ":Ñ:Ð:rj   Ú
device_keyÚkernel_nameÚn_fftÚhopc           	      ó@   — | › d|› dt        |«      › dt        |«      › �S )Nú||ro   )rì   rí   rî   rï   s       rh   Ú_encode_keyrò   	  s'   € àˆ\˜˜K˜=¨¬3¨u«:¨,°b¼¸S»¸
ÐCÐCrj   Úkc                 ó€   — 	 | j                  dd«      \  }}}}||t        |«      t        |«      fS # t        $ r Y y w xY w)Nrñ   é   )Úsplitre   Ú	Exception)ró   rì   rí   Ún_fft_sÚhop_ss        rh   Ú_decode_keyrú     sI   € ðØ23·'±'¸$ÀÓ2BÑ/ˆ
�K ¨%Ø˜;¬¨G«´c¸%³jÐ@Ð@øÜò Ùðús   ‚.1 ±	=¼=ÚpathÚobjc                 óò   — | j                   j                  dd¬«       | j                  | j                  dz   «      }t	        j
                  |dd¬«      }|j                  |d¬«       |j                  | «       y )NT)ÚparentsÚexist_okz.tmprY   )ÚindentÚ	sort_keysúutf-8©Úencoding)ÚparentÚmkdirÚwith_suffixÚsuffixÚjsonÚdumpsÚ
write_textÚreplace)rû   rü   ÚtmpÚdatas       rh   Ú_atomic_write_jsonr    s`   € Ø‡K�K×Ñ˜d¨TÐÔ2Ø
×
Ñ
˜4Ÿ;™;¨Ñ/Ó
0€CÜ�:‰:�c !¨tÔ4€Dà‡N�N�4 '€NÔ*à‡K�K�Õrj   ÚSPEC_MLX_AUTOTUNEr§   Úrawc                 óx   — 	 t        t        | «      j                  «       «      }|dkD  r|S d S # t        $ r Y y w xY w©Nr   )re   rž   Ústripr÷   )r  r·   s     rh   Ú_parse_tgx_intr  *  sC   € ðÜ”�C“—‘Ó Ó!ˆð �A’ˆ1Ð˜4Ðøô ò Ùðús   ‚"- ­	9¸9c                 ó”  — t         j                  j                  dd«      j                  «       }|syd|vrd|vrt	        |«      S d}|j                  d«      D ]m  }|j                  «       }|sŒd|vrt	        |«      }|�|}Œ*|j                  dd«      \  }}|j                  «       }t	        |«      }|€Œ]|| k(  r|c S |dk(  sŒl|}Œo |S )zÏReturn explicit threadgroup override from SPEC_MLX_TGX, if present.

    Supported forms:
    - "256" (global override)
    - "kernel_name:256,other_kernel:512,*:128" (per-kernel with optional wildcard)
    ÚSPEC_MLX_TGXÚ NÚ:Ú,r`   Ú*)rã   rä   r€   r  r  rö   )rí   r  ÚwildcardÚtokenÚtgxró   r·   s          rh   Ú_resolve_manual_tgx_overrider  2  sÙ   € ô �*‰*�.‰.˜¨Ó
,×
2Ñ
2Ó
4€CÙØð �#�~˜# S™.Ü˜cÓ"Ð"à"€HØ—‘˜3–ˆØ—‘“ˆÙØØ�eÑÜ  Ó'ˆCØˆØ�ØØ�{‰{˜3 Ó"‰ˆˆ1Ø�G‰G‹IˆÜ˜QÓˆØˆ;ØØ�ÒØŠJØ�‹8Ø‰Hð#  ð$ €Orj   r`   )Úmaxsizec                  ór  — 	 t        t        dd«      } | �,t        | dd«      }t        |«      r |«       }|rt        |«      S dD ]5  }	 t        t        |d«      }t        |«      r |«       }|�t        |«      c S Œ7 t
        j                  j                  dd«      S # t        $ r Y Œew xY w# t        $ r Y Œrw xY w)zŽBest-effort device identifier for caching autotune results.

    We keep this extremely defensive because MLX APIs can differ by version.
    r:   NÚdevice_name)Údefault_deviceÚcurrent_deviceÚdeviceÚMLX_BACKEND)r¾   ÚmxÚcallablerž   r÷   rã   rä   r€   )r:   Úname_fnrÁ   ÚattrÚfnÚdevs         rh   r1   r1   V  s¿   € ð	Üœ˜G TÓ*ˆØÐÜ˜e ]°DÓ9ˆGÜ˜Ô Ù“y�ÙÜ˜t›9Ð$ó
 ?ˆð	Üœ˜T 4Ó(ˆBÜ˜Œ|Ù“d�Ø�?Ü˜s›8’Oøð ?ô �:‰:�>‰>˜-¨Ó1Ð1øô ò Ùðûô ò 	Ùð	ús#   ‚>B Á/B*Â	B'Â&B'Â*	B6Â5B6z�
int k_max = st / HOP;
if (k_max >= n_frames) k_max = n_frames - 1;
int k_min = 0;
{ int target = st - FRAME; if (target >= 0) k_min = (target / HOP) + 1; }
z¡
int n_frames = params[0];
int out_len = params[1];
int st = (int)thread_position_in_grid.x;
int sb = (int)thread_position_in_grid.y;
if (st >= out_len) return;
a  
float acc = 0.0f;
int base_offset = sb * n_frames * FRAME;

#pragma unroll 4
for (int k = k_max; k >= k_min; --k) {
    int off = st - k * HOP;
    acc += (float)frames[base_offset + k * FRAME + off] * (float)window[off];
}

out[sb * out_len + st] = (T)acc;
aÓ  
float acc = 0.0f;
float den = 0.0f;
int base_offset = sb * n_frames * FRAME;

#pragma unroll 4
for (int k = k_max; k >= k_min; --k) {
    int off = st - k * HOP;
    acc += (float)frames[base_offset + k * FRAME + off] * (float)window[off];
    den += (float)window_sq[off];
}

// Torch-style masked normalization (no epsilon clamp):
// keep zero where overlap-add envelope is effectively zero.
out[sb * out_len + st] = (den > 1.0e-11f) ? (T)(acc / den) : (T)(0.0f);
zx
int n_frames = params[0];
int out_len = params[1];
int st = (int)thread_position_in_grid.x;
if (st >= out_len) return;
zŸ
float den = 0.0f;

#pragma unroll 4
for (int k = k_min; k <= k_max; ++k) {
    int off = st - k * HOP;
    den += (float)window_sq[off];
}

out[st] = (T)den;
aÀ  
int sig_len = params[0];
int n_frames = params[1];
int f_idx = (int)thread_position_in_grid.x;
int n_idx = (int)thread_position_in_grid.y;
int b_idx = (int)thread_position_in_grid.z;
if (f_idx >= NFFT || n_idx >= n_frames) return;

// Position in the (virtual) padded signal
int src_pos = n_idx * HOP + f_idx;

// Reflect-pad boundary: map to original signal index
int orig_idx;
if (src_pos < PAD) {
    orig_idx = PAD - src_pos;
} else if (src_pos < PAD + sig_len) {
    orig_idx = src_pos - PAD;
} else {
    orig_idx = sig_len - 2 - (src_pos - PAD - sig_len);
}

float val = (float)signal[b_idx * sig_len + orig_idx] * (float)win[f_idx];
out[b_idx * n_frames * NFFT + n_idx * NFFT + f_idx] = (T)val;
aü  
// Threadgroup shared memory for the signal chunk covering this tile of frames.
// CHUNK_LEN = (TILE_FRAMES - 1) * HOP + NFFT, sized at compile time.
threadgroup float shared_buf[CHUNK_LEN];

int sig_len = params[0];
int n_frames = params[1];

int local_x = (int)thread_position_in_threadgroup.x;
int local_y = (int)thread_position_in_threadgroup.y;
int tg_x_idx = (int)threadgroup_position_in_grid.x;
int b_idx = (int)threadgroup_position_in_grid.z;

// Frame range for this tile
int frame_start = tg_x_idx * TILE_FRAMES;
int frame_end = frame_start + TILE_FRAMES;
if (frame_end > n_frames) frame_end = n_frames;
int n_tile_frames = frame_end - frame_start;

// Virtual-padded range this tile needs
int sig_start = frame_start * HOP;
int sig_end_val = (frame_end - 1) * HOP + NFFT;
int chunk_len = sig_end_val - sig_start;

// Cooperative load: all threads load signal into shared memory
int n_threads = TG_X * TG_Y;
int my_id = local_y * TG_X + local_x;
for (int i = my_id; i < chunk_len; i += n_threads) {
    int src_pos = sig_start + i;
    int orig_idx;
    if (src_pos < PAD) {
        orig_idx = PAD - src_pos;
    } else if (src_pos < PAD + sig_len) {
        orig_idx = src_pos - PAD;
    } else {
        orig_idx = sig_len - 2 - (src_pos - PAD - sig_len);
    }
    shared_buf[i] = (float)signal[b_idx * sig_len + orig_idx];
}
threadgroup_barrier(mem_flags::mem_threadgroup);

// Each thread handles one frame in the tile, looping over fft bins
int tile_frame = local_y;
if (tile_frame < n_tile_frames) {
    int n_idx = frame_start + tile_frame;
    for (int f = local_x; f < NFFT; f += TG_X) {
        int local_pos = tile_frame * HOP + f;
        float val = shared_buf[local_pos] * (float)win[f];
        out[b_idx * n_frames * NFFT + n_idx * NFFT + f] = (T)val;
    }
}
aš  
int sig_len = params[0];
int n_frames = params[1];
int t_idx = (int)thread_position_in_grid.x;
int b_idx = (int)thread_position_in_grid.y;
if (t_idx >= sig_len) return;

int base_offset = b_idx * n_frames * NFFT;
float acc = 0.0f;

// Interior contribution: padded position = t_idx + PAD
{
    int padded_pos = t_idx + PAD;
    int k_max = padded_pos / HOP;
    if (k_max >= n_frames) k_max = n_frames - 1;
    int k_min = 0;
    { int target = padded_pos - NFFT; if (target >= 0) k_min = (target / HOP) + 1; }

    #pragma unroll 4
    for (int k = k_min; k <= k_max; ++k) {
        int f = padded_pos - k * HOP;
        acc += (float)grad_frames[base_offset + k * NFFT + f] * (float)win[f];
    }
}

// Reflect-pad left: original position t_idx maps to padded position PAD - t_idx
// (for the reflected copy of x[t_idx] that appears in the left padding)
if (t_idx > 0 && t_idx <= PAD) {
    int padded_pos = PAD - t_idx;
    int k_max = padded_pos / HOP;
    if (k_max >= n_frames) k_max = n_frames - 1;
    int k_min = 0;
    { int target = padded_pos - NFFT; if (target >= 0) k_min = (target / HOP) + 1; }

    #pragma unroll 4
    for (int k = k_min; k <= k_max; ++k) {
        int f = padded_pos - k * HOP;
        acc += (float)grad_frames[base_offset + k * NFFT + f] * (float)win[f];
    }
}

// Reflect-pad right: original position t_idx maps to padded position
// PAD + 2*sig_len - 2 - t_idx  (for the reflected copy in the right padding)
// Valid when t_idx is in the range used by the right reflect: [sig_len-PAD-1, sig_len-2]
if (t_idx >= sig_len - PAD - 1 && t_idx < sig_len - 1) {
    int padded_pos = PAD + 2 * sig_len - 2 - t_idx;
    int padded_len = sig_len + 2 * PAD;
    if (padded_pos >= 0 && padded_pos < padded_len) {
        int k_max = padded_pos / HOP;
        if (k_max >= n_frames) k_max = n_frames - 1;
        int k_min = 0;
        { int target = padded_pos - NFFT; if (target >= 0) k_min = (target / HOP) + 1; }

        #pragma unroll 4
        for (int k = k_min; k <= k_max; ++k) {
            int f = padded_pos - k * HOP;
            acc += (float)grad_frames[base_offset + k * NFFT + f] * (float)win[f];
        }
    }
}

out[b_idx * sig_len + t_idx] = (T)acc;
aÜ  
int n_frames = params[0];
int out_len = params[1];
int f_idx = (int)thread_position_in_grid.x;
int n_idx = (int)thread_position_in_grid.y;
int b_idx = (int)thread_position_in_grid.z;
if (f_idx >= NFFT || n_idx >= n_frames) return;

int t = n_idx * HOP + f_idx;
float grad_val = 0.0f;

if (t < out_len) {
    grad_val = (float)grad_output[b_idx * out_len + t] * (float)win[f_idx] * (float)inv_envelope[t];
}

out[b_idx * n_frames * NFFT + n_idx * NFFT + f_idx] = (T)grad_val;
i áõz¯
uint i = thread_position_in_grid.x;
uint total = (uint)params[0];
if (i >= total) return;
float re = z_flat[2 * i];
float im = z_flat[2 * i + 1];
out[i] = re * re + im * im;
c                   óR   — e Zd ZU dZ ej
                  «       ZdZee	d<   e
d„ «       Zy)Ú_PowerSpectrumCachez4Singleton for the fused power-spectrum Metal kernel.NÚ_kernelc                 ó\  — | j                   �| j                   S | j                  5  | j                   �| j                   cd d d «       S 	 t        j                  j	                  dddgdgt
        ¬«      | _         | j                   cd d d «       S # t        $ r
 d| _         Y Œ'w xY w# 1 sw Y   y xY w)NÚfused_power_spectrumÚz_flatÚparamsÚout©rÁ   Úinput_namesÚoutput_namesÚsourceF)r/  Ú_lockr'  ÚfastÚmetal_kernelÚ_METAL_POWER_SPECTRUM_TEMPLATEr÷   ©Úclss    rh   r€   z_PowerSpectrumCache.get£  s˜   € à�;‰;Ð"Ø—;‘;ÐØ�Y‹YØ�{‰{Ð&Ø—{‘{÷ ‰Yð$Ü Ÿg™g×2Ñ2Ø/Ø!)¨8Ð 4Ø"' Ü9ð	 3ó �”ð —;‘;÷ ‰Yøô ò $Ø#�–ð$ú÷ ˆYúó/   ¥B"Á/BÁ7B"ÂBÂB"ÂBÂB"Â"B+)r—   r˜   r™   rš   Ú	threadingÚLockr9  r/  ÚobjectÚ__annotations__Úclassmethodr€   rŸ   rj   rh   r.  r.  ž  s/   … Ù>ØˆI�N‰NÓ€EØ€GˆVÓàñó ñrj   r.  c                   ó¤   — e Zd ZU dZ ej
                  «       ZdZee	d<   dZ
ee	d<   ed„ «       Zed„ «       Zed„ «       Zeded	ed
ee   fd„«       Zy)Ú_FrameExtractCachezHSingleton for the fused frame-extraction Metal kernels (simple + tiled).NÚ_simpleÚ_tiledc                 ó\  — | j                   �| j                   S | j                  5  | j                   �| j                   cd d d «       S 	 t        j                  j	                  dg d¢dgt
        ¬«      | _         | j                   cd d d «       S # t        $ r
 d| _         Y Œ'w xY w# 1 sw Y   y xY w)NÚfused_frame_extract©ÚsignalÚwinr3  r4  r5  F)rG  r9  r'  r:  r;  Ú#_METAL_FUSED_FRAME_EXTRACT_TEMPLATEr÷   r=  s    rh   Ú
get_simplez_FrameExtractCache.get_simple¼  s“   € à�;‰;Ð"Ø—;‘;ÐØ�Y‹YØ�{‰{Ð&Ø—{‘{÷ ‰Yð$Ü Ÿg™g×2Ñ2Ø.Ú ;Ø"' Ü>ð	 3ó �”ð —;‘;÷ ‰Yøô ò $Ø#�–ð$ú÷ ˆYúr?  c                 ó\  — | j                   �| j                   S | j                  5  | j                   �| j                   cd d d «       S 	 t        j                  j	                  dg d¢dgt
        ¬«      | _         | j                   cd d d «       S # t        $ r
 d| _         Y Œ'w xY w# 1 sw Y   y xY w)NÚtiled_frame_extractrK  r4  r5  F)rH  r9  r'  r:  r;  Ú#_METAL_TILED_FRAME_EXTRACT_TEMPLATEr÷   r=  s    rh   Ú	get_tiledz_FrameExtractCache.get_tiledÎ  s“   € à�:‰:Ð!Ø—:‘:ÐØ�Y‹YØ�z‰zÐ%Ø—z‘z÷ ‰Yð#ÜŸW™W×1Ñ1Ø.Ú ;Ø"' Ü>ð	 2ó �”
ð —:‘:÷ ‰Yøô ò #Ø"�–
ð#ú÷ ˆYúr?  c                 ó"   — | j                  «       S )z*Backward-compat: return the simple kernel.)rO  r=  s    rh   r€   z_FrameExtractCache.getà  s   € ð �~‰~ÓÐrj   rî   Ú
hop_lengthr^   c                 ó�   — d}||z
  |z  dz   }|dk  ryt        d|«      }|}||z  dkD  rd|z  }|}|dk  ry|dz
  |z  |z   }||||fS )z¹Compute tiling parameters that fit in 32 KB threadgroup memory.

        Returns (tile_frames, tg_x, tg_y, chunk_len) or None if tiling
        is not possible for this config.
        i    r`   rY   Né   é   )Úmin)r>  rî   rU  Úmax_shared_floatsÚtile_framesÚtg_xÚtg_yÚ	chunk_lens           rh   Útile_paramsz_FrameExtractCache.tile_paramså  s~   € ð 'ÐØ(¨5Ñ0°ZÑ?À!ÑCˆØ˜Š?ØÜ�3˜‹ˆØˆà�$‰;˜ÒØ˜4‘<ˆDØˆKØ˜Š?ØØ  1‘_¨
Ñ2°UÑ:ˆ	Ø˜T 4¨Ð3Ð3rj   )r—   r˜   r™   rš   r@  rA  r9  rG  rB  rC  rH  rD  rO  rS  r€   re   r	   rw   r_  rŸ   rj   rh   rF  rF  ¶  sŽ   … ÙRØˆI�N‰NÓ€EØ€GˆVÓØ€FˆFÓàñó ðð" ñó ðð" ñ ó ð ð ð4 ð 4°ð 4¸À%¹ò 4ó ñ4rj   rF  c                   óp   — e Zd ZU dZ ej
                  «       ZdZee	d<   dZ
ee	d<   ed„ «       Zed„ «       Zy)Ú_BackwardKernelCachez0Singleton cache for backward-pass Metal kernels.NÚ	_stft_bwdÚ
_istft_bwdc                 ó\  — | j                   �| j                   S | j                  5  | j                   �| j                   cd d d «       S 	 t        j                  j	                  dg d¢dgt
        ¬«      | _         | j                   cd d d «       S # t        $ r
 d| _         Y Œ'w xY w# 1 sw Y   y xY w)NÚstft_backward)Úgrad_framesrM  r3  r4  r5  F)rb  r9  r'  r:  r;  Ú_METAL_STFT_BACKWARD_TEMPLATEr÷   r=  s    rh   Úget_stft_backwardz&_BackwardKernelCache.get_stft_backward  s“   € à�=‰=Ð$Ø—=‘=Ð Ø�Y‹YØ�}‰}Ð(Ø—}‘}÷ ‰Yð&Ü "§¡× 4Ñ 4Ø(Ú @Ø"' Ü8ð	 !5ó !�”ð —=‘=÷ ‰Yøô ò &Ø %�–ð&ú÷ ˆYúr?  c                 ó\  — | j                   �| j                   S | j                  5  | j                   �| j                   cd d d «       S 	 t        j                  j	                  dg d¢dgt
        ¬«      | _         | j                   cd d d «       S # t        $ r
 d| _         Y Œ'w xY w# 1 sw Y   y xY w)NÚistft_backward)Úgrad_outputrM  Úinv_enveloper3  r4  r5  F)rc  r9  r'  r:  r;  Ú_METAL_ISTFT_BACKWARD_TEMPLATEr÷   r=  s    rh   Úget_istft_backwardz'_BackwardKernelCache.get_istft_backward  s“   € à�>‰>Ð%Ø—>‘>Ð!Ø�Y‹YØ�~‰~Ð)Ø—~‘~÷ ‰Yð'Ü!#§¡×!5Ñ!5Ø)Ú PØ"' Ü9ð	 "6ó "�”ð —>‘>÷ ‰Yøô ò 'Ø!&�–ð'ú÷ ˆYúr?  )r—   r˜   r™   rš   r@  rA  r9  rb  rB  rC  rc  rD  rh  rn  rŸ   rj   rh   ra  ra  ü  sM   … Ù:ØˆI�N‰NÓ€EØ€IˆvÓØ€J�Óàñ!ó ð!ð" ñ"ó ñ"rj   ra  Ú
_last_tmplÚ
kernel_tagÚtmplc                 óš   — t        |«      }t        j                  | «      }||k(  rt        d|| ¬«       yt        d|| ¬«       |t        | <   y)zHEmit params_cache.hit / params_cache.miss based on template-tuple reuse.zparams_cache.hitr~   zparams_cache.missN)rw   ro  r€   r‚   )rp  rq  r{   Úprevs       rh   Ú_record_tmpl_eventrt  +  sD   € ä
�‹+€CÜ�>‰>˜*Ó%€DØˆs‚{ÜÐ.°CÀ
ÖKäÐ/°SÀÕLØ!$Œ
�:Òrj   c                   óÖ  — e Zd ZU dZ ej
                  «       ZdZdZdZ	i Z
eeeeeef   ef   ed<   dZeed<   dZeed<   edefd„«       Zed&d	„«       Zedefd
„«       Zed&d„«       Zed&d„«       Zedededededee   f
d„«       Zededededededdfd„«       Zeddddddœdedededededededededed edefd!„«       Zed'd"„«       Zed'd#„«       Z ed'd$„«       Z!ede"fd%„«       Z#y)(rÔ   z9Singleton to manage Metal kernel compilation and caching.NÚ
_tgx_cacheFÚ_tgx_cache_loadedÚ_tgx_cache_dirtyr^   c                 ó¸   — t         j                  j                  dd«      j                  «       }	 |rt	        |«      nd}t        d|«      S # t
        $ r d}Y Œw xY w)NÚSPEC_MLX_AUTOTUNE_MAX_ENTRIESr  iô  é    )rã   rä   r€   r  re   r÷   rd   )r>  r  r·   s      rh   Ú_max_entriesz_KernelCache._max_entriesI  sV   € ä�j‰j�n‰nÐ<¸bÓA×GÑGÓIˆð	Ù”�C” SˆAô �2�q‹zÐøô ò 	ØŠAð	ús   °A ÁAÁAc                 ó   — | j                  «       }t        | j                  «      |z
  }|dk  ry t        ddt	        |«      › �¬«       t        | j                  j                  «       «      d | D ]  }| j                  j                  |d «       Œ  y )Nr   zkernel_cache.tgx.evictzcount=©r   )r|  rƒ   rv  r‚   re   r“   r”   r…   )r>  Úmax_entriesÚextraró   s       rh   Ú_trim_cache_lockedz_KernelCache._trim_cache_lockedR  s|   € ð ×&Ñ&Ó(ˆÜ�C—N‘NÓ# kÑ1ˆØ�AŠ:ØÜÐ4¸vÄcÈ%ÃjÀ\Ð=RÕSÜ�c—n‘n×)Ñ)Ó+Ó,¨V¨eÓ4ˆAØ�N‰N×Ñ˜q $Õ'ñ 5rj   c                 ób   — t         j                  j                  dd«      j                  «       dvS )NÚSPEC_MLX_AUTOTUNE_PERSISTr§   r¢   )rã   rä   r€   Úlowerr=  s    rh   Ú_persist_enabledz_KernelCache._persist_enabled]  s-   € ô �J‰J�N‰NÐ6¸Ó<×BÑBÓDØ.ð/ð	
rj   c                 óæ  — | j                   ry d| _         | j                  «       st        d«       y t        «       }|j	                  «       st        dt        |«      ¬«       y 	 t        j                  |j                  d¬«      «      }|j                  d«      dk7  rt        d	«       y |j                  d
i «      }t        |t        «      st        d«       y |j                  «       D ]<  \  }}t        |«      }|€Œt        |t        «      sŒ%t        |«      | j                  |<   Œ> | j!                  «        t        ddt#        | j                  «      › �¬«       y # t$        $ r t        d«       Y y w xY w)NTz)kernel_cache.tgx.load.skipped_persist_offzkernel_cache.tgx.load.miss_filer~  r  r  Úversionr`   z&kernel_cache.tgx.load.version_mismatchÚ	tgx_cachez!kernel_cache.tgx.load.bad_payloadzkernel_cache.tgx.load.okúentries=zkernel_cache.tgx.load.error)rw  r…  r‚   rë   Úexistsrž   r	  ÚloadsÚ	read_textr€   rv   r�   Úitemsrú   re   rv  r�  rƒ   r÷   )r>  rû   rØ   r  Úk_strr·   Údecodeds          rh   Ú_load_tgx_cache_from_diskz&_KernelCache._load_tgx_cache_from_diskd  sA  € ð × Ò ØØ $ˆÔà×#Ñ#Ô%ÜÐ KÔLØä"Ó$ˆØ�{‰{Œ}ÜÐ AÌ#ÈdË)ÕTØð	Ü—j‘j §¡¸ Ó!AÓBˆGØ�{‰{˜9Ó%¨Ò*Ü#Ð$LÔMØØ—+‘+˜k¨2Ó.ˆCÜ˜c¤4Ô(Ü#Ð$GÔHØàŸI™IžK‘��qÜ% eÓ,�Ø�?ØÜ! !¤SÔ)ØÜ*-¨a«&�—‘˜wÒ'ð (ð ×"Ñ"Ô$ÜÐ :ÀXÌcÐRU×R`ÑR`ÓNaÐMbÐCcÖdøÜò 	äÐ =Ô>Ùð	ús    Á#AE Â(-E ÃBE ÅE0Å/E0c                 óÀ  — | j                  «       st        d«       y | j                  sy t        «       }	 d| j                  j                  «       D �����ci c]"  \  \  }}}}}t        ||||«      t        |«      “Œ$ c}}}}}dœ}t        ||«       d| _        t        ddt        | j                  «      › �¬«       y c c}}}}}w # t        $ r t        d«       Y y w xY w)	Nz)kernel_cache.tgx.save.skipped_persist_offr`   )r‡  rˆ  Fzkernel_cache.tgx.save.okr‰  r~  zkernel_cache.tgx.save.error)r…  r‚   rx  rë   rv  r�  rò   re   r  rƒ   r÷   )r>  rû   r»   ró   ÚnÚhr·   rü   s           rh   Ú_save_tgx_cache_to_diskz$_KernelCache._save_tgx_cache_to_diskŒ  sÞ   € ð ×#Ñ#Ô%ÜÐ KÔLØØ×#Ò#Øä"Ó$ˆð	àð ,/¯>©>×+?Ñ+?Ô+A÷á+A™™˜˜A˜q ! aô    1 a¨Ó+¬S°«VÑ3Ø+AõñˆCô ˜t SÔ)Ø#(ˆCÔ ÜÐ :ÀXÌcÐRU×R`ÑR`ÓNaÐMbÐCcÖdùöøô ò 	äÐ =Ô>Ùð	ús#   µ!C Á'B=Á=?C Â=	C ÃCÃCrì   rí   rî   rï   c                 óf  — ||t        |«      t        |«      f}| j                  r.| j                  j                  |«      }t	        |�dnd|¬«       |S | j
                  5  | j                  «        | j                  j                  |«      }t	        |�dnd|¬«       |cd d d «       S # 1 sw Y   y xY w)Nzkernel_cache.tgx.hitzkernel_cache.tgx.missrz   )re   rw  rv  r€   r‚   r9  r�  )r>  rì   rí   rî   rï   r{   Úvals          rh   Úget_threadgroup_xz_KernelCache.get_threadgroup_x¦  s¢   € ð ˜;¬¨E«
´C¸³HÐ=ˆð × Ò Ø—.‘.×$Ñ$ SÓ)ˆCÜØ*-¨/Ñ&Ð?VØõð ˆJØ�Y‹YØ×)Ñ)Ô+Ø—.‘.×$Ñ$ SÓ)ˆCÜØ*-¨/Ñ&Ð?VØõð ÷ �YŠYús   Á>B'Â'B0r  c                 ó  — ||t        |«      t        |«      f}| j                  5  | j                  «        t        |«      | j                  |<   | j	                  «        d| _        d d d «       t        d|¬«       y # 1 sw Y   ŒxY w)NTzkernel_cache.tgx.storerz   )re   r9  r�  rv  r�  rx  r‚   )r>  rì   rí   rî   rï   r  r{   s          rh   Úset_threadgroup_xz_KernelCache.set_threadgroup_x½  sm   € ð
 ˜;¬¨E«
´C¸³HÐ=ˆØ�Y‹YØ×)Ñ)Ô+Ü"% c£(ˆC�N‰N˜3ÑØ×"Ñ"Ô$Ø#'ˆCÔ ÷	 ô
 	Ð4¸#Ö>÷ ˆYús   ¥A A;Á;BrW  )r{  é@   é`   r­   é    éÀ   éà   rW  i@  i€  iÀ  é   i   rX  rY   rZ   )ÚtemplateÚdefault_tgxÚ
candidatesÚwarmupÚitersÚgridÚinputsÚoutput_shaper   r¡  r¢  r£  r¤  c          
      óÖ  ‡‡‡‡‡‡	‡‡‡— t        |«      }|�t        |«      S t        ‰«      dkD  rt        ‰d   «      ndŠdt        dt        fˆfd„} |t        |
«      «      }‰dkD  r)‰t        |
«      k  rt        dd‰› �¬«       t        |«      S t        st        |«      S t        «       }| j                  ||||«      }|�t         |t        |«      «      «      S dt        dt        fˆˆˆˆˆˆˆ	ˆfd	„}t        |D �ch c]!  }t        |«      dkD  r |t        |«      «      ’Œ# c}«      }|D �cg c]
  }|d
k\  sŒ	|‘Œ }}|st        |«      g}t        |«      }d}|D ]  }	  ||«      }|�||k  sŒ|}|}Œ | j                  |||||«       | j                  5  | j                  «        ddd«       t        |«      S c c}w c c}w # t        $ r Y Œtw xY w# 1 sw Y   t        |«      S xY w)aø  Autotune threadgroup.x for a specific kernel + (n_fft, hop) on the current device.

        Runs only on first use; results are cached in-memory and can be persisted to disk.
        Controlled by SPEC_MLX_AUTOTUNE (set to 0/false to disable; falls back to default_tgx).
        Persistence controlled by SPEC_MLX_AUTOTUNE_PERSIST (default enabled).
        SPEC_MLX_TGX can force explicit tgx (global or per-kernel mapping).
        SPEC_MLX_AUTOTUNE_MAX_ENTRIES bounds persistent cache growth.
        Nr   r  r^   c           	      óô   •— t        | «      } | dk  rd} t        t        | d«      d«      } | dz  dz  } | dk  rd} d}‰dkD  r.t        dt        dt        ‰«      «      «      }|dz  dz  }|dk  rd}t        | |«      S )Nr   r{  rX  )re   rY  rd   )r  Úmax_tgxÚgrid_xs     €rh   Ú_clamp_tgx_for_gridz@_KernelCache.autotune_threadgroup_x.<locals>._clamp_tgx_for_gridï  sŽ   ø€ Ü�c“(ˆCØ�aŠxØ�ä”c˜#˜r“l DÓ)ˆCØ˜"‘9 Ñ"ˆCØ�RŠxØ�ØˆGØ˜ŠzÜ˜b¤# d¬C°«KÓ"8Ó9�Ø" b™=¨BÑ.�Ø˜R’<Ø �GÜ�s˜GÓ$Ð$rj   z#kernel_cache.tgx.short_grid_defaultzgrid_x=r~  c           	      óÒ  •— t        ‰‰g‰
g‰t        | «      ddf¬«      }‰�‰|d<   t        ‰«      D ]"  } ‰	di |¤Žd   }t        j                  |«       Œ$ t        j
                  «        t        j                  «       }t        ‰«      D ]"  } ‰	di |¤Žd   }t        j                  |«       Œ$ t        j
                  «        t        j                  «       }||z
  t        ‰d«      z  S )Nr`   )r¦  Úoutput_shapesÚoutput_dtypesr¥  Úthreadgroupr   r   rŸ   )	r�   re   Úranger'  ÚevalÚsynchronizeÚtimeÚperf_counterrd   )r  Úcall_kwargsrŠ   ÚyÚt0Út1r¥  r¦  r¤  ÚkernelÚoutput_dtyper§  r   r£  s         €€€€€€€€rh   Ú	_time_onez6_KernelCache.autotune_threadgroup_x.<locals>._time_one  sÜ   ø€ ÜØØ+˜nØ+˜nØÜ  ›X q¨!Ð,ôˆKð Ð#Ø*2�˜JÑ'ä˜6–]�ÙÑ)˜[Ñ)¨!Ñ,�Ü—‘˜•
ð #ô �N‰NÔÜ×"Ñ"Ó$ˆBÜ˜5–\�ÙÑ)˜[Ñ)¨!Ñ,�Ü—‘˜•
ð "ô �N‰NÔÜ×"Ñ"Ó$ˆBØ˜‘Gœs 5¨!›}Ñ,Ð,rj   r{  )r  re   rƒ   r‚   Ú_SPEC_MLX_AUTOTUNEr1   r—  ÚfloatÚsortedr÷   r™  r9  r”  )r>  rº  rí   rî   rï   r¥  r¦  r§  r»  r   r¡  r¢  r£  r¤  Ú
manual_tgxr¬  Úclamped_default_tgxrì   r‡   r¼  r  Úbenchmark_candidatesÚbest_tgxÚ	best_timeÚdtr«  s    `   `````  ``           @rh   Úautotune_threadgroup_xz#_KernelCache.autotune_threadgroup_xÊ  s  ÿø€ ô> 2°+Ó>ˆ
ØÐ!Ü�z“?Ð"ä!$ T£¨Q¢”�T˜!‘W”°Aˆð	%¤Sð 	%¬Sõ 	%ñ" 2´#°kÓ2BÓCÐð �AŠ:˜&¤3 {Ó#3Ò3ÜÐ EÐPWÐX^ÐW_ÐN`ÕaÜÐ*Ó+Ð+å!ÜÐ*Ó+Ð+ä(Ó*ˆ
Ø×&Ñ& z°;ÀÀsÓKˆØÐÜÑ*¬3¨v«;Ó7Ó8Ð8ð	-œ3ð 	-¤5÷ 	-ô 	-ô0  &ñ &óá%�CÜ�s“8˜a’<ñ $¤C¨£HÕ-Ø%ñó 
Ðñ 0DÓQÑ/C¨ÀsÈbÃy¢Ð/CÐÐQÙ#Ü$'Ð(;Ó$<Ð#=Ð äÐ*Ó+ˆØˆ	ó (ˆCðÙ˜s“^�ð Ð  B¨£NØ�	Ø‘ð (ð 	×Ñ˜j¨+°u¸cÀ8ÔLØ�Y‹YØ×'Ñ'Ô)÷ ä�8‹}Ðùò9ùò  Røô ò Ùðú÷ ä�8‹}Ðús0   Ã>&F<Ä/
GÄ:GÅ!GÆGÇ	GÇGÇG(c                 ó´  — | j                   �t        d«       | j                   S t        d«       | j                  5  | j                   �| j                   cddd«       S 	 t        j                  j                  dg d¢dgt        ¬«      | _         t        d«       | j                   cddd«       S # t        $ r d	| _         t        d
«       Y Œ2w xY w# 1 sw Y   yxY w)z;Return the OLA Metal kernel (compile once, dtype-agnostic).Nzkernel_cache.ola.hitzkernel_cache.ola.missÚola_windowed_optimized)ÚframesÚwindowr3  r4  r5  zkernel_cache.ola.compile_okFzkernel_cache.ola.compile_fail)Ú_ola_kernelr‚   r9  r'  r:  r;  Ú_METAL_OLA_TEMPLATEr÷   ©r>  Údtypes     rh   Úget_olaz_KernelCache.get_olaH  s¾   € ð �?‰?Ð&ÜÐ 6Ô7Ø—?‘?Ð"ÜÐ3Ô4Ø�Y‹YØ�‰Ð*Ø—‘÷ ‰Yð
EÜ"$§'¡'×"6Ñ"6Ø1Ú >Ø"' Ü.ð	 #7ó #�”ô $Ð$AÔBð —?‘?÷ ‰Yøô ò EØ"'�”Ü#Ð$CÖDðEú÷ ˆYúó/   »CÁ:B-ÂCÂ-CÃCÃ
CÃCÃCc                 ó´  — | j                   �t        d«       | j                   S t        d«       | j                  5  | j                   �| j                   cddd«       S 	 t        j                  j                  dg d¢dgt        ¬«      | _         t        d«       | j                   cddd«       S # t        $ r d	| _         t        d
«       Y Œ2w xY w# 1 sw Y   yxY w)z@Return the OLA+norm Metal kernel (compile once, dtype-agnostic).Nzkernel_cache.ola_norm.hitzkernel_cache.ola_norm.missÚola_norm_windowed_div_envelope)rÉ  rÊ  Ú	window_sqr3  r4  r5  z kernel_cache.ola_norm.compile_okFz"kernel_cache.ola_norm.compile_fail)Ú_ola_norm_kernelr‚   r9  r'  r:  r;  Ú_METAL_OLA_NORM_TEMPLATEr÷   rÍ  s     rh   Úget_ola_normz_KernelCache.get_ola_norm_  sÊ   € ð ×ÑÐ+ÜÐ ;Ô<Ø×'Ñ'Ð'ÜÐ8Ô9Ø�Y‹YØ×#Ñ#Ð/Ø×+Ñ+÷ ‰Yð
JÜ')§w¡w×';Ñ';Ø9Ú KØ"' Ü3ð	 (<ó (�Ô$ô $Ð$FÔGð ×'Ñ'÷ ‰Yøô ò JØ',�Ô$Ü#Ð$HÖIðJú÷ ˆYúrÐ  c                 ó´  — | j                   �t        d«       | j                   S t        d«       | j                  5  | j                   �| j                   cddd«       S 	 t        j                  j                  dddgdgt        ¬«      | _         t        d	«       | j                   cddd«       S # t        $ r d
| _         t        d«       Y Œ2w xY w# 1 sw Y   yxY w)z@Return the envelope Metal kernel (compile once, dtype-agnostic).Nzkernel_cache.envelope.hitzkernel_cache.envelope.missÚola_enveloperÓ  r3  r4  r5  z kernel_cache.envelope.compile_okFz"kernel_cache.envelope.compile_fail)Ú_envelope_kernelr‚   r9  r'  r:  r;  Ú_METAL_OLA_ENVELOPE_TEMPLATEr÷   rÍ  s     rh   Úget_envelopez_KernelCache.get_envelopev  sÏ   € ð ×ÑÐ+ÜÐ ;Ô<Ø×'Ñ'Ð'ÜÐ8Ô9Ø�Y‹YØ×#Ñ#Ð/Ø×+Ñ+÷ ‰Yð
JÜ')§w¡w×';Ñ';Ø'Ø!,¨hÐ 7Ø"' Ü7ð	 (<ó (�Ô$ô $Ð$FÔGð ×'Ñ'÷ ‰Yøô ò JØ',�Ô$Ü#Ð$HÖIðJú÷ ˆYúrÐ  c           	      óB  — d„ }| j                   5   || j                  «       || j                  «       || j                  «      t	        t        | j                  «      «      t        | j                  «      t        | j                  «      dœcd d d «       S # 1 sw Y   y xY w)Nc                 ó   — | d uxr | duS ©NFrŸ   )r·   s    rh   Ú_is_compiledz1_KernelCache.debug_snapshot.<locals>._is_compiled�  s   € Ø˜D�=Ò3 Q¨e ^Ð3rj   )Úola_kernel_compiledÚola_norm_kernel_compiledÚenvelope_kernel_compiledÚtgx_entriesÚ
tgx_loadedÚ	tgx_dirty)
r9  rË  rÔ  rÙ  re   rƒ   rv  rÒ   rw  rx  )r>  rß  s     rh   rÕ   z_KernelCache.debug_snapshot�  st   € ò	4ð �Y‹Yá'3°C·O±OÓ'DÙ,8¸×9MÑ9MÓ,NÙ,8¸×9MÑ9MÓ,NÜ"¤3 s§~¡~Ó#6Ó7Ü" 3×#8Ñ#8Ó9Ü! #×"6Ñ"6Ó7ñ÷ �YŠYús   �A;BÂBr–   rn   )$r—   r˜   r™   rš   r@  rA  r9  rË  rÔ  rÙ  rv  r6   r7   rž   re   rC  rw  rÒ   rx  rD  r|  r�  r…  r�  r”  r	   r—  r™  rw   r“   rÆ  rÏ  rÖ  rÛ  r�   rÕ   rŸ   rj   rh   rÔ   rÔ   :  s\  … ÙCàˆI�N‰NÓ€Eà€KØÐØÐð 8:€J��U˜3  S¨#Ð-Ñ.°Ð3Ñ4Ó9Ø#Ð�tÓ#Ø"Ð�dÓ"àð˜Sò ó ðð ò(ó ð(ð ð
 ò 
ó ð
ð ò%ó ð%ðN òó ðð2 ðØðØ+.ðØ7:ðØADðà	�#‰òó ðð, ð
?Øð
?Ø+.ð
?àð
?àð
?à#&ð
?ð 
ò
?ó ð
?ð ð Øð
ð Øò){ð ð	{ð
 ð{ð ð{ð ð{ð ð{ð ð{ð ð{ð ð{ð ð{ð& ð'{ð( ð){ð* 
ò+{ó ð{ðz ò#ó ð#ð, ò(ó ð(ð, ò(ó ð(ð, ð˜tò ó ñrj   rÔ   ©Úrequire_metalrÉ  rÊ  Úout_lenrç  c                óþ  ‡‡— dt         dt         dt         dt        t        j                  t        j                  f   fˆfd„Šdt        j                  dt        j                  dt         dt        j                  fˆfd„}| j                  |j                  k7  r|j                  | j                  «      }| j                  \  }}}t        j                  «       }	|	d	u r-t        d
d¬«       |rt        d«      ‚ || |t        |«      «      S t        j                  | «      } t        j                  |«      }t        j                  t        |«      t        |«      gt        j                  ¬«      }
d| j                  fd‰fd|fg}t        d|«       t        j                  |	d| j                  › �|‰||df| ||
g|||f| j                  d¬«
      } |	| ||
g|||fg| j                  g||df|ddfd¬«      }t        d«       |d   S )z4Overlap-add using optimized branchless Metal kernel.ÚnframeÚframeÚ	out_len_ir^   c                 ó°  •— t        |«      }t        j                  t        | «      t        j                  ¬«      t        ‰	«      z  }t        j                  t        |«      t        j                  ¬«      }|d d …d f   |d d d …f   z   }|j	                  d«      }||k  }|dk  rt        j
                  |«      |fS t        j                  |d|dz
  «      }||fS )N©rÎ  éÿÿÿÿr   r`   )re   r'  ÚarangeÚint32ÚreshapeÚ
zeros_likeÚclip)
rê  rë  rì  Úframe_startsÚ
sample_idxÚindicesÚflat_indicesÚ
valid_maskÚclippedrï   s
            €rh   Ú_scatter_planz%_run_metal_ola.<locals>._scatter_plan¥  sµ   ø€ Ü˜	“Nˆ	Ü—y‘y¤ V£´B·H±HÔ=ÄÀCÃÑHˆÜ—Y‘Yœs 5›z´·±Ô:ˆ
Øšq $˜wÑ'¨*°Tº1°WÑ*=Ñ=ˆØ—‘ rÓ*ˆØ! IÑ-ˆ
Ø˜Š>ä—=‘= Ó.°
Ð:Ð:Ü—'‘'˜,¨¨9°q©=Ó9ˆØ˜
Ð"Ð"rj   Úframes_localÚwindow_localc                 óF  •— | j                   \  }}} ‰t        |«      t        |«      t        |«      «      \  }}| |d d d d …f   z  j                  t        |«      d«      }||j                  |j                  «      d d d …f   z  }t        |«      dk  r,t        j                  t        |«      df| j                  ¬«      S t        j                  t        |«      t
        j                  ¬«      t        |«      z  d d …d f   }	|	|d d d …f   z   j                  d«      }
t        j                  t        |«      t        |«      z  f| j                  ¬«      }|j                  |
   j                  |j                  d«      «      }|j                  t        |«      t        |«      «      S )Nrï  r   rî  )rk   re   rò  ÚastyperÎ  r'  Úzerosrð  rñ  ÚatrN   )rü  rý  rì  ÚBrê  rë  rú  rù  ÚvaluesÚbatch_offsetsÚscatter_indicesr4  rû  s               €rh   Ú_run_fallbackz%_run_metal_ola.<locals>._run_fallback²  sQ  ø€ Ø'×-Ñ-Ñˆˆ6�5Ù+¬C°«K¼¸U»ÄSÈÃ^ÓTÑˆ�à ¨d°Dº!¨mÑ!<Ñ<×EÑEÄcÈ!ÃfÈbÓQˆØ˜*×+Ñ+¨F¯L©LÓ9¸$Â¸'ÑBÑBˆäˆy‹>˜QÒÜ—8‘8œS ›V Q˜K¨|×/AÑ/AÔBÐBäŸ™¤3 q£6´·±Ô:¼SÀ»^ÑKÊQÐPTÈWÑUˆØ(¨7°4º°7Ñ+;Ñ;×DÑDÀRÓHˆä�h‰hœ˜A›¤ Y£Ñ/Ð1¸×9KÑ9KÔLˆØ�f‰f�_Ñ%×)Ñ)¨&¯.©.¸Ó*<Ó=ˆØ�{‰{œ3˜q›6¤3 y£>Ó2Ð2rj   Fzbackend.ola.fallbackÚmetal_unavailabler~  zHbackend_policy='metal' requires Metal OLA kernel, but it is unavailable.rî  ÚTÚHOPÚFRAMEÚolaÚola_windowed_optimized_r`   rW  ©
rº  rí   rî   rï   r¥  r¦  r   r§  r»  r¡  r   ©r¦  r   r®  r¯  r¥  r°  Ú
init_valuezbackend.ola.metal)re   rw   r'  ÚarrayrÎ  rÿ  rk   rÔ   rÏ  r‚   ÚRuntimeErrorÚ
contiguousrñ  rt  rÆ  )rÉ  rÊ  rï   rè  rç  r  r  rê  rë  rº  r3  rq  r  Úoutputsrû  s     `           @rh   Ú_run_metal_olar  œ  sô  ù€ ð#œcð #¬#ð #¼#ð #Ä%ÌÏÉÔRT×RZÑRZÐHZÑB[õ #ð3¤B§H¡Hð 3¼B¿H¹Hð 3ÔQTð 3ÔY[×YaÑYaõ 3ð" ‡|�|�v—|‘|Ò#Ø—‘˜vŸ|™|Ó,ˆà—|‘|Ñ€A€vˆuÜ×!Ñ!Ó#€FØ��ÜÐ2Ð;NÕOÙÜØZóð ñ ˜V V¬S°«\Ó:Ð:Ü�]‰]˜6Ó"€FÜ�]‰]˜6Ó"€Fä�X‰X”s˜6“{¤C¨£LÐ1¼¿¹ÔB€FØ�&—,‘,Ð %¨ °¸Ð/?Ð@€DÜ�u˜dÔ#ä
×
-Ñ
-ØØ-¨f¯l©l¨^Ð<ØØØ�q˜!ˆ_Ø˜ Ð'ØØ˜�\Ø—\‘\Øð .ó €Cñ Ø˜ Ð'ØØ˜7�|�nØ—|‘|�nØ�q˜!ˆ_Ø˜!˜Q�KØô€Gô Ð+Ô,Ø�1‰:Ðrj   rÓ  c                ó¾  ‡‡— dt         j                  dt        dt        dt         j                  fˆfd„Šdt         j                  dt         j                  dt         j                  dt        dt        dt         j                  fˆˆfd„}| j                  |j                  k7  r|j	                  | j                  «      }| j                  |j                  k7  r|j	                  | j                  «      }| j
                  \  }}}	t        j                  «       }
|
d	u r8t        d
d¬«       |rt        d«      ‚ || ||t        |«      t        |«      «      S t        j                  | «      } t        j                  |«      }t        j                  |«      }t        j                  t        |«      t        |«      gt         j                  ¬«      }d| j                  fd‰fd|	fg}t        d|«       t        j                  |
d| j                  › �|	‰||df| |||g|||f| j                  d¬«
      } |
| |||g|||fg| j                  g||df|ddfd¬«      }t        d«       |d   S )z•Overlap-add with fused normalization (Torch-like masked divide).

    Note: any NOLA / envelope-min checks are handled outside the fused kernel.
    Úwindow_sq_localrê  rì  r^   c                 ó  •— t        | j                  d   «      }t        j                  t        |«      t        j                  ¬«      t        ‰«      z  }t        j                  |t        j                  ¬«      }|d d …d f   |d d d …f   z   }|j                  d«      }|t        |«      k  }t        |«      dk  r!t        j                  d| j                  ¬«      S t        j                  |dt        |«      dz
  «      }	t        j                  | t        |«      f«      }
|
|j                  |
j                  «      z  }
t        j                  t        |«      f|
j                  ¬«      }|j                  |	   j                  |
«      }|S )Nr   rî  rï  )r   r`   )re   rk   r'  rð  rñ  rò  r   rÎ  rô  Útilerÿ  r  rN   )r  rê  rì  rë  rõ  rö  r÷  rø  rù  rú  r  Údenomrï   s               €rh   Ú_compute_envelopez._run_metal_ola_norm.<locals>._compute_envelopeü  s+  ø€ Ü�O×)Ñ)¨!Ñ,Ó-ˆÜ—y‘y¤ V£´B·H±HÔ=ÄÀCÃÑHˆÜ—Y‘Y˜u¬B¯H©HÔ5ˆ
Øšq $˜wÑ'¨*°Tº1°WÑ*=Ñ=ˆØ—‘ rÓ*ˆØ!¤C¨	£NÑ2ˆ
Üˆy‹>˜QÒÜ—8‘8˜D¨×(=Ñ(=Ô>Ð>Ü—'‘'˜,¨¬3¨y«>¸AÑ+=Ó>ˆä—‘˜¬3¨v«;¨.Ó9ˆØ˜*×+Ñ+¨F¯L©LÓ9Ñ9ˆä—‘œ#˜i›.Ð*°&·,±,Ô?ˆØ—‘˜Ñ!×%Ñ% fÓ-ˆØˆrj   rü  rý  c                 ó¬  •— t        | |t        ‰«      t        |«      «      } ‰
|t        |«      t        |«      «      }|j                  t        j                  k7  rª|j                  t        j                  «      }|j                  t        j                  «      }t        j                  t        j                  |«      d d d …f   dkD  ||d d d …f   z  t        j                  |«      «      }	|	j                  |j                  «      S t        j                  t        j                  |«      d d d …f   dkD  ||d d d …f   z  t        j                  |«      «      S )Nç•dyáý¥=)	r  re   rÎ  r'  Úfloat32rÿ  ÚwhereÚabsró  )rü  rý  r  rê  rì  Úout_sumr  Úout_sum_f32Ú	denom_f32Úout_f32r  rï   s             €€rh   r  z*_run_metal_ola_norm.<locals>._run_fallback  s  ø€ ô ! ¨|¼SÀ»XÄsÈ9Ã~ÓVˆÙ! /´3°v³;ÄÀIÃÓOˆà�=‰=œBŸJ™JÒ&Ø!Ÿ.™.¬¯©Ó4ˆKØŸ™¤R§Z¡ZÓ0ˆIÜ—h‘hÜ—‘�yÓ! $ª 'Ñ*¨WÑ4Ø˜i¨ªa¨Ñ0Ñ0Ü—‘˜kÓ*óˆGð
 —>‘> '§-¡-Ó0Ð0ä�x‰xÜ�F‰F�5‹M˜$¢˜'Ñ" WÑ,Ø�e˜D¢!˜G‘nÑ$Ü�M‰M˜'Ó"ó
ð 	
rj   Fzbackend.ola_norm.fallbackr  r~  zSbackend_policy='metal' requires fused Metal OLA norm kernel, but it is unavailable.rî  r  r	  r
  Úola_normÚola_norm_windowed_div_envelope_r`   rW  r  r   r  zbackend.ola_norm.metal)r'  r  re   rÎ  rÿ  rk   rÔ   rÖ  r‚   r  r  rñ  rt  rÆ  )rÉ  rÊ  rÓ  rï   rè  rç  r  r  rê  rë  rº  r3  rq  r  r  r  s      `           @rh   Ú_run_metal_ola_normr&  ï  sF  ù€ ð¬2¯8©8ð ¼Sð ÌSð ÔUW×U]ÑU]õ ð$
Ü—h‘hð
ä—h‘hð
ô Ÿ™ð
ô ð	
ô
 ð
ô 
�‰ö
ð4 ‡|�|�v—|‘|Ò#Ø—‘˜vŸ|™|Ó,ˆØ‡|�|�y—‘Ò&Ø×$Ñ$ V§\¡\Ó2ˆ	à—|‘|Ñ€A€vˆuÜ×&Ñ&Ó(€FØ��ÜÐ7Ð@SÕTÙÜð)óð ñ ˜V V¨Y¼¸F»ÄSÈÃ\ÓRÐRä�]‰]˜6Ó"€FÜ�]‰]˜6Ó"€FÜ—‘˜iÓ(€Iä�X‰X”s˜6“{¤C¨£LÐ1¼¿¹ÔB€FØ�&—,‘,Ð %¨ °¸Ð/?Ð@€DÜ�z 4Ô(ä
×
-Ñ
-ØØ5°f·l±l°^ÐDØØØ�q˜!ˆ_Ø˜ 	¨6Ð2ØØ˜�\Ø—\‘\Øð .ó €Cñ Ø˜ 	¨6Ð2ØØ˜7�|�nØ—|‘|�nØ�q˜!ˆ_Ø˜!˜Q�KØô€Gô Ð0Ô1Ø�1‰:Ðrj   Úprovided_windowÚresolved_windowÚ	window_fnÚ
win_lengthÚperiodicc                 ó˜  — t        | t        j                  «      r†t        j                  t        j
                  |t        j                  ¬«      «      }t        j                  |j                  «       d¬«      j                  «       }dt        |j                  d   «      |fS dt        |«      t        |«      t        |«      t        |«      fS )z?Return a stable key component identifying window shape/content.rî  ra   )Údigest_sizer  r   Ú	generated)rv   r'  r  ÚnpÚascontiguousarrayÚasarrayr  ÚhashlibÚblake2bÚtobytesÚ	hexdigestre   rk   rž   rÒ   )r'  r(  r)  r*  rî   r+  ÚarrÚdigests           rh   Ú_window_cache_signaturer8  ^  s‹   € ô �/¤2§8¡8Ô,Ü×"Ñ"¤2§:¡:¨oÄRÇZÁZÔ#PÓQˆÜ—‘ §¡£¸BÔ?×IÑIÓKˆØœ˜SŸY™Y q™\Ó*¨FÐ3Ð3Øœ˜Y›¬¨Z«¼#¸e»*ÄdÈ8ÃnÐUÐUrj   rW  z+OrderedDict[tuple, tuple[bool, float, int]]Ú_OLA_SAFETY_CACHEÚ#SPEC_MLX_OLA_SAFETY_LENGTH_STRATEGYÚbucket)r;  ÚexactÚ!SPEC_MLX_OLA_SAFETY_LENGTH_BUCKETÚ2048é   c                 óÞ   — t         5  t        j                  | «      }|€t        d| ¬«       	 d d d «       y t        j	                  | «       t        d| ¬«       |cd d d «       S # 1 sw Y   y xY w)Nzola_safety_cache.missrz   zola_safety_cache.hit)Ú_OLA_SAFETY_LOCKr9  r€   r‚   r�   )r{   r–  s     rh   Ú_ola_safety_cache_getrB  ‰  sZ   € Þ	Ü×#Ñ# CÓ(ˆØˆ;ÜÐ 7¸SÕAØ÷	 
Ð	ô 	×%Ñ% cÔ*ÜÐ2¸Õ<Ø÷ 
×	Ò	ús   ‡&A#¶#A#Á#A,Úvaluec                 óþ   — t         5  |t        | <   t        j                  | «       t        d| ¬«       t	        t        «      t
        kD  r!t        j                  d¬«       t        d«       d d d «       y # 1 sw Y   y xY w)Nzola_safety_cache.storerz   Fr|   zola_safety_cache.evict)rA  r9  r�   r‚   rƒ   Ú_OLA_SAFETY_CACHE_MAXr„   )r{   rC  s     rh   Ú_ola_safety_cache_setrF  ”  s^   € Þ	Ø!&Ô˜#ÑÜ×%Ñ% cÔ*ÜÐ4¸#Õ>ÜÔ Ó!Ô$9Ò9Ü×%Ñ%¨5Ð%Ô1ÜÐ 8Ô9÷ 
×	Ñ	ús   ‡A#A3Á3A<ÚlengthÚsafetyc                ó®   — | €yt        dt        | «      «      }|dk7  s	t        dk(  rd|||fS t        t        «      }|dkD  r||z   dz
  |z  |z  nd}d|||fS )a  Resolve cache key + effective check length for NOLA safety checks.

    Returns ``(length_mode, length_key, check_length, requested_length)``.
    ``length_key`` controls cache-key bucketing; ``check_length`` controls the
    actual envelope span that will be validated.
    )Únonerï  NNr   r8   r<  r`   r;  )rd   re   Ú_OLA_SAFETY_LENGTH_STRATEGYÚ_OLA_SAFETY_LENGTH_BUCKET)rG  rH  Ú	requestedr;  Úbucketeds        rh   Ú/_resolve_ola_safety_length_key_and_check_lengthrO  ž  sy   € ð €~Ø%ä�A”s˜6“{Ó#€IØ�ÒÔ6¸'ÒAØ˜	 9¨iÐ7Ð7äÔ*Ó+€FØ@IÈAÂ�˜VÑ# aÑ'¨FÑ2°fÒ<ÐST€Hð �X˜y¨)Ð3Ð3rj   Ú	transformr   Ún_framesÚ
torch_likec          	      óŠ  — t        |«      }|dvrt        d«      ‚|dk(  ryt        ||¬«      \  }}}}	t        «       | j                  | j
                  | j                  | j                  | j                  t        |«      ||f	}
|dk(  rdt        |
«      }|�W|\  }}}d}|	�6|dk\  r1|rt        |	«      t        |«      k  }nt        |	«      t        |«      k\  }|r|s|rt        d	|d
›d�«      ‚y| j                  t        |«      |¬«      \  }}| j                  rL| j                  dz  }|€|||  }nft        t        |j                  d   «      |t        |«      z   «      }||| }n2|�0t        t        |«      t        |j                  d   «      «      }|d| }t        |j                  d   «      dk(  rd}nVt        j                  t        j                   |«      «      }t        j"                  |«       t%        |j'                  «       «      }|dk\  }|dk(  r|�t        |«      nd}t)        |
|||f«       |s|rt        d|d
›d�«      ‚yy)z=Torch-style envelope-min check (NOLA) with optimized caching.)r¥   r8   Úalwaysz-safety must be one of {'off','auto','always'}r¥   N)rH  r8   Tr   z=istft: window overlap-add envelope is too small (cached: min=ú.3ez+); this matches Torch's NOLA safety intent.ræ  rY   ç        r  rï  z5istft: window overlap-add envelope is too small (min=z°); this matches Torch's NOLA safety intent. Try increasing win_length, using a COLA-compliant window/hop, or disable safety checks (safety='off') if you know what you're doing.)rž   rc   rO  r1   rî   rU  r*  ÚcenterÚ_window_cache_sigre   rB  r  Ú_get_ola_enveloperY  rk   r'  r  r²  r¾  rÇ   rF  )rP  rQ  rG  rR  rH  rç  Úlength_modeÚ
length_keyÚcheck_lengthÚrequested_lengthÚ	cache_keyr‡   ÚokÚmin_abs_valÚcached_checked_lengthÚreusabler  rŠ   ÚpadÚendÚtakeÚmin_absÚchecked_len_values                          rh   Ú_ola_envelope_min_check_cachedrh  ¶  s�  € ô �‹[€FØÐ.Ñ.ÜÐHÓIÐIØ�‚Øô 	8ØØô	
ñ >€[�*˜lÐ,<ô 	ÓØ�‰Ø×ÑØ×ÑØ×ÑØ×#Ñ#ÜˆH‹ØØð
€Ið �ÒÜ& yÓ1ˆØÐØ5;Ñ2ˆB�Ð2ð
 ˆHØÐ+Ð0EÈÒ0JÙÜ"Ð#3Ó4¼Ð<QÓ8RÑR‘Hä"Ð#3Ó4¼Ð<QÓ8RÑR�HáÙ¡
Ü&ð(Ø(3°CÐ'8ð 9CðCóð ð
 ð ×*Ñ*¬3¨x«=ÈÐ*ÓV�H€Eˆ1à×ÒØ�o‰o Ñ"ˆØÐØ˜#˜s˜d�O‰Eä”c˜%Ÿ+™+ a™.Ó)¨3´°\Ó1BÑ+BÓCˆCØ˜#˜c�N‰EØ	Ð	!Ü”3�|Ó$¤c¨%¯+©+°a©.Ó&9Ó:ˆØ�e�t�ˆô ˆ5�;‰;�q‰>Ó˜aÒØ‰ä—&‘&œŸ™ ›Ó'ˆÜ
�‰�ÔÜ˜GŸL™L›NÓ+ˆØ
˜Ñ
€Bð �ÒØ1=Ð1IœC Ô-ÈrÐÜ˜i¨"¨kÐ;LÐ)MÔNá‘JÜðØ Ð$ð %UðUó
ð 	
ð ˆBrj   Úxrc  c                 óø   — |dk  r| S | j                   d   |k  rt        d| j                   d   › d|› d�«      ‚| dd|dz   …f   dddd…f   }| d| dz
  d…f   dddd…f   }t        j                  || |gd¬	«      S )
z(Compiled reflect-pad using pure MLX ops.r   rï  zCtorch-like reflect padding requires input_length > pad (got length=z, pad=r¹   .r`   N©Úaxis)rk   rc   r'  Úconcatenate)ri  rc  ÚleftÚrights       rh   Ú#_torch_like_reflect_pad_1d_compiledrp    s°   € ð ˆa‚xØˆØ‡w�wˆr�{�cÒÜðØŸ7™7 2™;˜- v¨c¨U°!ð5ó
ð 	
ð ˆS�!�c˜A‘g�+ÐÑ˜s¡D b D˜yÑ)€DØˆc�C�4˜!‘8˜b�=Ð Ñ! #¡t¨ t )Ñ,€EÜ�>‰>˜4  EÐ*°Ô4Ð4rj   c                 ó   — t        | |«      S rn   )rp  )ri  rc  s     rh   Ú_torch_like_reflect_pad_1drr  &  s   € Ü.¨q°#Ó6Ð6rj   c           	      ób  — t        | t        j                  «      rÚ| j                  t        j                  k(  r| n| j                  t        j                  «      }|j                  dk7  rt        d|j                  › �«      ‚|j                  d   |k(  r|S |j                  d   |k7  r!t        d|› d|› d|j                  d   › �«      ‚||z
  dz  }||z
  dz   dz  }t        j                  |||fgd¬	«      S |dk  rt        d
«      ‚|r|n|dkD  r|dz
  nd}t        j                  |t        j                  ¬«      }	|dk(  r3ddt        j                  dt        j                  z  |	z  |z  «      z  z
  }nq|dk(  r3ddt        j                  dt        j                  z  |	z  |z  «      z  z
  }n9|dv r't        j                  |ft        j                  ¬«      }nt        d|› �«      ‚||k  r0||z
  dz  }||z
  dz   dz  }t        j                  |||fgd¬	«      }|S ||kD  rt        d|› d|› d�«      ‚|S )zACreate or validate a 1D window with strict shape and type checks.r`   zwindow must be 1D, got shape r   z"window length must be win_length (z) or n_fft (z), got rY   r?   ©Úmodeúwin_length must be positiverî  Úhannç      à?ç       @ÚhamminggHáz®Gá?gq=
×£pÝ?)ÚrectÚboxcarÚoneszUnknown window_fn: úwin_length (ú) must be <= n_fft (r¹   )rv   r'  r  rÎ  r  rÿ  Úndimrc   rk   rc  rð  ÚcosÚmathÚpir}  )
rÊ  r)  r*  rî   r+  Úwrn  ro  r  Úidxs
             rh   r   r   *  s2  € ô �&œ"Ÿ(™(Ô#à—l‘l¤b§j¡jÒ0‰F°f·m±mÄBÇJÁJÓ6OˆØ�6‰6�QŠ;ÜÐ<¸Q¿W¹W¸IÐFÓGÐGØ�7‰7�1‰:˜ÒØˆHØ�7‰7�1‰:˜Ò#ÜØ4°Z°Lð AØ"˜G 7¨1¯7©7°1©:¨,ð8óð ð
 ˜
Ñ" qÑ(ˆØ˜Ñ# aÑ'¨AÑ-ˆÜ�v‰v�a˜4 ˜-˜¨zÔ:Ð:à�Q‚ÜÐ6Ó7Ð7á"‰J¸:Èº>¨°aªÈq€EÜ
�)‰)�J¤b§j¡jÔ
1€Cà�FÒØ�#œŸ™˜s¤T§W¡W™}¨sÑ2°UÑ:Ó;Ñ;Ñ;‰Ø	�iÒ	Ø�4œ"Ÿ&™& ¤t§w¡w¡°Ñ!4°uÑ!<Ó=Ñ=Ñ=‰Ø	Ð0Ñ	0Ü�G‰G�Z�M¬¯©Ô4‰äÐ.¨y¨kÐ:Ó;Ð;à�EÒØ˜
Ñ" qÑ(ˆØ˜Ñ# aÑ'¨AÑ-ˆÜ�F‰F�1˜˜e�}�o¨JÔ7ˆð €Hð 
�eÒ	Ü˜<¨
 |Ð3GÈÀwÈaÐPÓQÐQà€Hrj   rU  c                 ó8  — t        | «      } | dk  rt        d«      ‚t        |«      }|dk  rt        d«      ‚|€| dz  }t        |«      }|dk  rt        d«      ‚| d|z  z   }|€| }t        |«      }|dk  rt        d«      ‚||kD  rt        d|› d	|› d
�«      ‚|||fS )z^Resolve effective FFT parameters.

    Returns (effective_n_fft, hop_length, win_length).
    r   zn_fft must be positivezpad must be >= 0rb   zhop_length must be positiverY   rv  r~  z) must be <= effective_n_fft (r¹   )re   rc   )rî   rU  r*  rc  Úeffective_n_ffts        rh   r/   r/   [  sÜ   € ô �‹J€EØ�‚zÜÐ1Ó2Ð2ä
ˆc‹(€CØ
ˆQ‚wÜÐ+Ó,Ð,àÐØ˜a‘Zˆ
Ü�Z“€JØ�Q‚ÜÐ6Ó7Ð7ð ˜a #™g‘o€Oð ÐØˆ
Ü�Z“€Jà�Q‚ÜÐ6Ó7Ð7Ø�OÒ#ÜØ˜:˜,ð ' Ø /Ð0°ð3ó
ð 	
ð
 ˜J¨
Ð2Ð2rj   rC   ©Ú	mel_scaleÚfreqr‰  c                ó¬  — |dvrt        d«      ‚t        j                  | t        j                  ¬«      }|dk(  rdt        j                  d|dz  z   «      z  S d}d	}||z
  |z  }d
}||z
  |z  }t        j                  d«      dz  }||k\  }	|t        j                  t        j                  |d«      |z  «      |z  z   }
t        j                  |	|
|«      }|S )NrB   ú*mel_scale must be one of {"htk", "slaney"}rî  rC   ç     F¤@ç      ð?ç     à…@rV  ç«ªªªªªP@ç     @�@çš™™™™™@ç      ;@çê-�™—q=)	rc   r/  r1  Úfloat64Úlog10r‚  rJ   Úmaximumr  )rŠ  r‰  ÚfÚf_minÚf_spÚmelsÚ
min_log_hzÚmin_log_melÚlogstepÚlog_tÚlog_melss              rh   Ú
_hz_to_melr¡  ‡  sØ   € ØÐ)Ñ)ÜÐEÓFÐFä
�
‰
�4œrŸz™zÔ*€AØ�EÒØœŸ™ ¨¨E©	Ñ!2Ó3Ñ3Ð3ð €EØ€DØ�‰I˜Ñ€DØ€JØ Ñ%¨Ñ-€KÜ�h‰h�s‹m˜dÑ"€GØ�‰O€EØœRŸV™V¤B§J¡J¨q°%Ó$8¸:Ñ$EÓFÈÑPÑP€HÜ�8‰8�E˜8 TÓ*€DØ€Krj   r›  c          	      ó`  — |dvrt        d«      ‚t        j                  | t        j                  ¬«      }|dk(  rdd|dz  z  dz
  z  S d	}d
}|||z  z   }d}||z
  |z  }t	        j
                  d«      dz  }||k\  }	t        j                  |	|t        j                  |||z
  z  «      z  |«      }|S )NrB   rŒ  rî  rC   r�  ç      $@r�  rŽ  rV  r�  r‘  r’  r“  )rc   r/  r1  r•  r‚  rJ   r  Úexp)
r›  r‰  Úmr™  rš  Úfreqsrœ  r�  rž  rŸ  s
             rh   Ú
_mel_to_hzr§  œ  sÄ   € ØÐ)Ñ)ÜÐEÓFÐFä
�
‰
�4œrŸz™zÔ*€AØ�EÒØ˜  V¡Ñ,¨sÑ2Ñ3Ð3ð €EØ€DØ�D˜1‘HÑ€EØ€JØ Ñ%¨Ñ-€KÜ�h‰h�s‹m˜dÑ"€GØ�Ñ€EÜ�H‰H�U˜J¬¯©°¸1¸{¹?Ñ0KÓ)LÑLÈeÓT€EØ€Lrj   )Únormr‰  Ún_freqsr™  Úf_maxÚn_melsÚsample_rater¨  c                óŠ  — t        | «      } t        |«      }t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚|dk  rt        d«      ‚|dvrt        d«      ‚|dvrt        d«      ‚t        j                  d	|d
z  | t        j                  ¬«      }t        t        t        |«      |¬«      «      }t        t        t        |«      |¬«      «      }	t        j                  ||	|d
z   t        j                  ¬«      }
t        |
|¬«      }|dd |dd z
  }|ddd…f   |dd…df   z
  }|dd…dd…f    t        j                  |dd ddd…f   d«      z  }|dd…d
d…f   t        j                  |dd ddd…f   d«      z  }t        j                  d	t        j                  ||«      «      j                  t        j                  «      }|dk(  rNdt        j                  |d
|d
z    |d| z
  d«      z  }||ddd…f   j                  t        j                  «      z  }t        j                  |t        j                  ¬«      S )z½Create triangular mel filter banks with torchaudio-compatible formulas.

    Returns shape ``[n_freqs, n_mels]`` so mel application is ``X @ fb`` where
    ``X`` is ``[..., n_freqs]``.
    r   zn_freqs must be > 0ún_mels must be > 0úsample_rate must be > 0)NrD   z$norm must be one of {None, "slaney"}rB   rŒ  rV  rY   rî  rˆ  r`   Nrï  éþÿÿÿr”  rD   ry  )re   rc   r/  Úlinspacer•  r¾  r¡  r§  r—  Úminimumrÿ  r  r'  r  )r©  r™  rª  r«  r¬  r¨  r‰  Ú	all_freqsÚm_minÚm_maxÚm_ptsÚf_ptsÚf_diffÚslopesÚdownÚupÚfbÚenorms                     rh   r   r   °  s  € ô �'‹l€GÜ�‹[€FÜ�kÓ"€KØ�!‚|ÜÐ.Ó/Ð/Ø�‚{ÜÐ-Ó.Ð.Ø�aÒÜÐ2Ó3Ð3ØÐ#Ñ#ÜÐ?Ó@Ð@ØÐ)Ñ)ÜÐEÓFÐFä—‘˜C °Ñ!1°7Ä"Ç*Á*ÔM€IÜ”*œU 5›\°YÔ?Ó@€EÜ”*œU 5›\°YÔ?Ó@€EÜ�K‰K˜˜u f¨q¡j¼¿
¹
ÔC€EÜ�u¨	Ô2€Eà�1�2ˆY˜˜s ˜Ñ#€FØ�4š�7‰^˜iª¨4¨Ñ0Ñ0€FØ’A�s˜�s�F‰^ˆOœrŸz™z¨&°°"¨+°dºA°gÑ*>ÀÓFÑF€DØ	’�1‘2�‰œŸ™ F¨1¨2 J¨t²Q¨wÑ$7¸Ó?Ñ	?€BÜ	�‰�CœŸ™ D¨"Ó-Ó	.×	5Ñ	5´b·j±jÓ	A€BàˆxÒØ”b—j‘j  q¨6°A©:Ð!6¸¸wÀ¸Ñ!GÈÓOÑOˆØ�%˜ša˜‘.×'Ñ'¬¯
©
Ó3Ñ3ˆä�8‰8�BœbŸj™jÔ)Ð)rj   Úpowerç      T@ç»½×Ùß|Û=rŽ  rF   )ÚstypeÚtop_dbÚaminÚ	ref_valueru  rÁ  ©r¾  Ú	magnituderÂ  rÃ  rÄ  ru  ©rF   Úper_examplec                óŒ  — |dvrt        d«      ‚|dvrt        d«      ‚|�t        |«      dk  rt        d«      ‚|dk(  rd	nd
}t        |«      }t        j                  t	        |t        |«      «      «      }|t        j                  t        j                  | |«      «      z  }	|	||z  z
  }	|€|	S t        d„ |	j                  D «       «      }
|dk(  rÆt        |
«      dk  r7t        j                  |	«      t        |«      z
  }t        j                  |	|«      S t        |
«      dk(  r9t        j                  |	d¬«      }t        j                  |	|t        |«      z
  «      S t        j                  |	dd¬«      }t        j                  |	|t        |«      z
  «      S t        |
«      dk  r7t        j                  |	«      t        |«      z
  }t        j                  |	|«      S t        |
«      dk(  rT|	dddd…dd…f   }t        j                  |dd¬«      }t        j                  ||t        |«      z
  «      }|dddd…dd…f   S t        |
«      dk(  rX|	ddd…dd…dd…f   }t        j                  |dd¬«      }t        j                  ||t        |«      z
  «      }|ddd…dd…dd…f   S t        |
d   «      }t        t        j                  |
dd t        j                  ¬«      «      }|	j                  |||
d   |
d   «      }t        j                  |dd¬«      }t        j                  ||t        |«      z
  «      }|j                  |
«      S )zùConvert power/magnitude spectrogram to dB.

    ``mode="torchaudio_compat"`` replicates torchaudio's clipping behavior for
    packed batch tensors. ``mode="per_example"`` clips each leading example
    independently across time-frequency axes.
    rÅ  z+stype must be one of {"power", "magnitude"}rÇ  z8mode must be one of {"torchaudio_compat", "per_example"}Nr   z$top_db must be non-negative when setr¾  r£  g      4@c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrn   ro   r¶   s     rh   rs   z"amplitude_to_db.<locals>.<genexpr>ÿ  s   è ø€ Ð-¡*˜Q”#�a—&¡*ùrt   rÈ  r`   rY   T)Úkeepdims)r°  rï  ©rl  rË  )éýÿÿÿr°  rï  rõ   rÍ  rî  r°  rï  )rc   r¾  r‚  r–  rd   r'  r—  rw   rk   rƒ   re   r/  ÚprodÚint64rò  )ri  rÁ  rÂ  rÃ  rÄ  ru  Ú
multiplierÚamin_fÚdb_multiplierÚx_dbrk   ÚcutoffÚmax_refÚx_viewÚpacked_channelsÚleadings                   rh   r    r    à  sÍ  € ð Ð*Ñ*ÜÐFÓGÐGØÐ7Ñ7ÜÐSÓTÐTØÐœe F›m¨aÒ/ÜÐ?Ó@Ð@Ø 'Ò)‘¨t€JÜ�4‹[€FÜ—J‘Jœs 6¬5°Ó+;Ó<Ó=€MàœŸ™¤§¡¨A¨vÓ!6Ó7Ñ7€DØ�: Ñ-Ñ.€Dà€~ØˆäÑ- $§*¢*Ó-Ó-€EØˆ}ÒÜˆu‹:˜Š?Ü—V‘V˜D“\¤E¨&£MÑ1ˆFÜ—:‘:˜d FÓ+Ð+Üˆu‹:˜Š?Ü—f‘f˜T¨DÔ1ˆGÜ—:‘:˜d G¬e°F«mÑ$;Ó<Ð<Ü—&‘&˜ H°tÔ<ˆÜ�z‰z˜$ ¬%°«-Ñ 7Ó8Ð8ä
ˆ5ƒz�Q‚Ü—‘˜“¤ f£Ñ-ˆÜ�z‰z˜$ Ó'Ð'Ü
ˆ5ƒz�Q‚Ø�d˜D¢!¢QÐ&Ñ'ˆÜ—&‘&˜ l¸TÔBˆÜ—‘˜F G¬e°F«mÑ$;Ó<ˆØ�a˜šAšq�jÑ!Ð!Ü
ˆ5ƒz�Q‚Ø�dšAšq¢!�mÑ$ˆÜ—&‘&˜ l¸TÔBˆÜ—‘˜F G¬e°F«mÑ$;Ó<ˆØ�aššAšq�jÑ!Ð!ä˜% ™)“n€OÜ”"—'‘'˜%  ˜*¬B¯H©HÔ5Ó6€GØ�\‰\˜' ?°E¸"±I¸uÀR¹yÓI€FÜ�f‰f�V ,¸Ô>€GÜ�Z‰Z˜ ¬%°«-Ñ 7Ó8€FØ�>‰>˜%Ó Ð rj   Úortho©r¨  Ún_mfccc                ó  — t        | «      } t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚| |kD  rt        d«      ‚|dvrt        d«      ‚t        j                  t	        |«      t        j
                  ¬«      }t        j                  t	        | «      t        j
                  ¬«      dd…df   }t        j                  t        j                  t	        |«      z  |d	z   z  |z  «      j                  t        j                  «      }|€|d
z  }nG|dxx   dt        j                  d
«      z  z  cc<   |t        j                  d
t	        |«      z  «      z  }t        j                  |t        j                  ¬«      S )z1Create a DCT type-II matrix ``[n_mfcc, n_mels]``.r   ún_mfcc must be > 0r®  ún_mfcc must be <= n_mels©NrÙ  z#norm must be one of {None, "ortho"}rî  Nrx  ry  rŽ  )re   rc   r/  rð  r¾  r•  r�  r‚  rƒ  rÿ  r  Úsqrtr'  r  )rÛ  r«  r¨  r’  ró   Údcts         rh   r!   r!      s.  € ô �‹[€FÜ�‹[€FØ�‚{ÜÐ-Ó.Ð.Ø�‚{ÜÐ-Ó.Ð.Ø�‚ÜÐ3Ó4Ð4Ø�?Ñ"ÜÐ>Ó?Ð?ä
�	‰	”%˜“-¤r§z¡zÔ2€AÜ
�	‰	”%˜“-¤r§z¡zÔ2²1°d°7Ñ;€AÜ
�&‰&”$—'‘'œE &›MÑ)¨a°#©gÑ6¸Ñ:Ó
;×
BÑ
BÄ2Ç:Á:Ó
N€Cà€|Øˆs‰
‰àˆA‹�#œŸ	™	 #›Ñ&Ñ&‹ØŒt�y‰y˜œu V›}Ñ,Ó-Ñ-ˆä�8‰8�CœrŸz™zÔ*Ð*rj   c           	      ó€   — t        t        | «      t        |«      t        |«      t        |«      t        |«      ||¬«      S )N©r©  r™  rª  r«  r¬  r¨  r‰  )r   re   r¾  rã  s          rh   Ú_cached_mel_filterbankrä  ?  s;   € ô Ü�G“Ü�E‹lÜ�E‹lÜ�6‹{Ü˜Ó$ØØôð rj   c                 óB   — t        t        | «      t        |«      |¬«      S )NrÚ  )r!   re   ©rÛ  r«  r¨  s      rh   Ú_cached_dct_matrixrç  T  s   € ô ”c˜&“k¤3 v£;°TÔ:Ð:rj   Úlifterc                 ó(  — t        j                  dt        | «      dz   t         j                  ¬«      }dt	        |«      dz  t        j
                  t        j                  t	        |«      z  |z  «      z  z   j                  t         j                  «      S )Nr`   rî  rŽ  ry  )	r'  rð  re   r  r¾  Úsinr‚  rƒ  rÿ  )rÛ  rè  r…  s      rh   Ú_cached_lifter_weightsrë  ]  sf   € ô
 �)‰)�A”s˜6“{ Q‘¬b¯j©jÔ
9€CàŒu�V‹}˜sÑ"¤b§f¡f¬d¯g©g¼¸f»Ñ.EÈÑ-LÓ&MÑMÑMß�fŒR�Z‰ZÓðrj   r=   )Úinput_layoutÚmel_fbrì  )r=   r<   c                óò   — |dk(  r| }n'|dk(  rt        j                  | d«      }nt        d«      ‚t        j                  ||«      }t        j                  |d«      j	                  t         j
                  «      S )Nr=   r<   ©r   rY   r`   z*input_layout must be one of {"bnf", "bfn"})r'  Ú	transposerc   Úmatmulrÿ  r  )r¾  rí  rì  Ú	power_bnfÚmel_bnms        rh   Ú_apply_mel_filterbankrô  h  se   € ð �uÒØ‰	Ø	˜Ò	Ü—L‘L ¨	Ó2‰	äÐEÓFÐFÜ�i‰i˜	 6Ó*€GÜ�<‰<˜ Ó+×2Ñ2´2·:±:Ó>Ð>rj   )Úlifter_weightsÚmel_bmnÚ	dct_mat_trõ  c                óÞ   — t        j                  t        j                  | d«      |«      }t        j                  |d«      j                  t         j                  «      }|�||d d d …d f   z  }|S )Nrï  )r'  rñ  rð  rÿ  r  )rö  r÷  rõ  Úmfcc_bnmÚmfcc_bmns        rh   Ú_apply_mfcc_projectionrû  x  s^   € ô �y‰yœŸ™ g¨yÓ9¸9ÓE€HÜ�|‰|˜H iÓ0×7Ñ7¼¿
¹
ÓC€HØÐ!Ø˜n¨T²1°d¨]Ñ;Ñ;ˆØ€Orj   )Ú	log_scaleÚlog_aminÚlog_moderü  c                óä  — t        j                  t        |«      t         j                  ¬«      }|dk(  r5t        j                  | |z   «      j                  t         j                  «      S |dk(  r>t        j                  t        |«      | z  «      j                  t         j                  «      S t        j                  t        j                  | |«      «      j                  t         j                  «      S )Nrî  rN   rO   )r'  r  r¾  r  rJ   rÿ  rO   r—  )ri  rý  rþ  rü  rÃ  s        rh   Ú_apply_log_scaler   …  sŸ   € ô �8‰8”E˜(“O¬2¯:©:Ô6€DØ�5ÒÜ�v‰v�a˜$‘hÓ×&Ñ&¤r§z¡zÓ2Ð2Ø�7ÒÜ�x‰xœ˜iÓ(¨1Ñ,Ó-×4Ñ4´R·Z±ZÓ@Ð@Ü�6‰6”"—*‘*˜Q Ó%Ó&×-Ñ-¬b¯j©jÓ9Ð9rj   r8   ©Údefault_policyÚbackend_policyr  c                óX   — | €|n
t        | «      }|t        vrt        dt        › �«      ‚|S )Nzbackend_policy must be one of )rž   Ú_ISTFT_BACKEND_POLICIESrc   )r  r  Úpolicys      rh   Ú_resolve_backend_policyr  ˜  s@   € ð
  .Ð5‰^¼3¸~Ó;N€FØÔ,Ñ,ÜØ,Ü&Ð'ð)ó
ð 	
ð €Mrj   r<   )Údefault_layoutÚoutput_layoutr  c                óX   — | €|n
t        | «      }|t        vrt        dt        › �«      ‚|S )Nzoutput_layout must be one of )rž   Ú_STFT_OUTPUT_LAYOUTSrc   )r	  r  Úlayouts      rh   Ú_resolve_stft_output_layoutr  ¦  s@   € ð
  -Ð4‰^¼#¸mÓ:L€FØÔ)Ñ)ÜØ+Ü#Ð$ð&ó
ð 	
ð €Mrj   T)Úfrozenc                   ór   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   y)Ú_TransformKeyrî   rU  r*  r)  r+  rW  Úcenter_pad_modeÚcenter_tail_padÚ
normalizedÚistft_backend_policyN)r—   r˜   r™   re   rC  rž   rÒ   rŸ   rj   rh   r  r  º  s8   … àƒJØƒOØƒOØƒNØƒNØƒLØÓØÓØÓØÔrj   r  ÚMLX_OLA_FUSE_NORMr4  rW  Ú
length_intr  c                 ót  — |r‚|dz  }|�Z|}|}t        |||z   «      }	| dd…||	…f   } |t        | j                  d   «      z
  }
|
dkD  r;t        j                  | dd|
fg«      } | S |d|z  kD  r| dd…|| …f   n
| dd…dd…f   } | S |�1|}||k\  r| dd…d|…f   } | S t        j                  | dd||z
  fg«      } | S )zMTrim/pad OLA output to requested length (shared by Metal and fallback paths).rY   Nr`   r   ©r   r   )rY  re   rk   r'  rc  )r4  rW  rî   rè  r  r  rc  ÚtargetÚstartrd  Ú	shortfalls              rh   Ú_trim_ola_outputr  Í  s	  € ñ Ø�q‰jˆØÐ!ØˆFØˆEÜ�g˜u v™~Ó.ˆCØ’a˜˜s˜�lÑ#ˆCØ¤ S§Y¡Y¨q¡\Ó!2Ñ2ˆIØ˜1Š}Ü—f‘f˜S 6¨A¨y¨>Ð":Ó;�ð €Jð '.°°C±Ò&7�#’a˜˜c˜T˜�kÒ"¸SÂÀBÀQÀBÀ¹ZˆCð €Jð 
Ð	ØˆØ�fÒØ’a˜˜&˜�j‘/ˆCð €Jô —&‘&˜˜v¨¨6°GÑ+;Ð'<Ð=Ó>ˆCØ€Jrj   Úsig_lenr  c                 óè   — |dz  }|dk(  r||fS |dk7  rt        d«      ‚t        dt        t        j                  | t        |«      z  «      «      «      }|dz
  |z  |z
  }t        d||z   | z
  «      }||fS )NrY   r@   rA   ú7center_tail_pad must be one of {'symmetric', 'minimal'}r`   r   )rc   rd   re   r‚  Úceilr¾  )r  rî   rU  r  Úpad_leftÚ
num_framesÚ
last_startÚ	pad_rights           rh   Ú_center_pad_widthsr%  ë  s’   € ð ˜‰z€HØ˜+Ò%Ø˜Ð!Ð!Ø˜)Ò#ÜØEó
ð 	
ô �QœœDŸI™I g´°jÓ0AÑ&AÓBÓCÓD€JØ˜q‘. JÑ.°Ñ9€JÜ�A�z EÑ)¨GÑ3Ó4€IØ�YÐÐrj   r  c                óê   — t        t        | j                  d   «      |||«      \  }}|dk(  r||k7  rt        d«      ‚t	        | |«      S |dk7  rt        d«      ‚t        j                  | d||fgd¬«      S )Nr`   r>   ú>center_pad_mode='reflect' requires center_tail_pad='symmetric'r?   ú6center_pad_mode must be one of {'reflect', 'constant'}r  rt  )r%  re   rk   rc   rp  r'  rc  )ri  rî   rU  r  r  r!  r$  s          rh   Ú_apply_center_paddingr)  þ  s�   € ô -ÜˆA�G‰G�A‰J‹˜ 
¨OóÑ€Hˆið ˜)Ò#Ø�yÒ ÜØPóð ô 3°1°hÓ?Ð?Ø˜*Ò$ÜØDó
ð 	
ô �6‰6�!�f˜x¨Ð3Ð4¸:ÔFÐFrj   Ú	cotangentc                 óœ  — |rñ|dz  }|�t|}t        j                  ||f| j                  ¬«      }t        |||z
  | j                  d   «      }	|j
                  dd…|||	z   …f   j                  | dd…d|	…f   «      }|S |d|z  z
  }
t        j                  ||f| j                  ¬«      }t        |
| j                  d   «      }|j
                  dd…|||z   …f   j                  | dd…d|…f   «      }|S |�n|}t        j                  ||f| j                  ¬«      }t        ||| j                  d   «      }|j
                  dd…d|…f   j                  | dd…d|…f   «      }|S | }| j                  d   |k  rTt        j                  ||f| j                  ¬«      }|j
                  dd…d| j                  d   …f   j                  | «      }|S )zFAdjoint of _trim_ola_output: un-trim cotangent back to full OLA space.rY   Nrî  r`   )r'  r   rÎ  rY  rk   r  rN   )r*  rW  rî   rè  r  r  rc  r  Úgrad_olaÚcopy_lenÚtrimmedÚactualÚcopys                rh   Ú_unpad_cotangentr1    sÔ  € ñ Ø�q‰jˆØÐ!ØˆFÜ—x‘x  G °I·O±OÔDˆHÜ˜6 7¨S¡=°)·/±/À!Ñ2DÓEˆHØ—{‘{¢1 c¨#°©.Ð&8Ð#8Ñ9×=Ñ=¸iÊÈ9ÈHÈ9ÈÑ>UÓVˆHð  €Oð   C¡Ñ'ˆGÜ—x‘x  G °I·O±OÔDˆHÜ˜ )§/¡/°!Ñ"4Ó5ˆFØ—{‘{¢1 c¨#°©,Ð&6Ð#6Ñ7×;Ñ;¸IÂaÈÈ&ÈÀjÑ<QÓRˆHð €Oð 
Ð	ØˆÜ—8‘8˜Q ˜L°	·±Ô@ˆÜ�6˜7 I§O¡O°AÑ$6Ó7ˆØ—;‘;šq % 4 %˜xÑ(×,Ñ,¨Y²q¸%¸4¸%°xÑ-@ÓAˆð €Oð	 ˆØ�?‰?˜1Ñ Ò'Ü—x‘x  G °I·O±OÔDˆHØ—{‘{¢1Ð&9 y§¡°qÑ'9Ð&9Ð#9Ñ:×>Ñ>¸yÓIˆHØ€Orj   c                   óX  — e Zd ZdZdZ	 	 dHddddddddœd	ed
edee   dedede	de	de
dede	dee   fd„Zdedeej                   ej                   f   fd„ZdIdededdfd„ZdJdedee   ddfd„Zddddddddœdedee   de	d e	d!e	d"ed#ee   ddfd$„Zd%d&œd'efd(„Zddddd)d*dd%d+œdee   de	d e	d!e	d"ed,ed#ee   d-efd.„Zd%d&œd/ej                   d'edej                   fd0„Zddddd)d*dd%d+œd1ej                   dee   de	d e	d!e	d"ed,ed#ee   d-edej                   fd2„Zd3dd4œded5ed6ee   defd7„Zd3d8œded9eed:f   d5edefd;„Zd/ej                   dej                   fd<„Zdd=œd1ej                   dee   dej                   fd>„Zdd?œd@edAe	deej                   ej                   f   fdB„Zd%d&œd/ej                   d'edej                   fdC„Z	 	 dKddd)d*dd%dDœd1ej                   dee   de	d e	d!e	d"ed,ed#ee   d-edej                   fdE„Z dFej                   dee   deej                      fdG„Z!y)Lr   z~
    High-performance STFT/iSTFT engine for MLX.
    Uses fused kernels and cached configurations for maximum throughput.
    )rî   rU  r*  rÊ  r)  Ú
_window_sqrW  r  r  r  r+  r  rX  Ú_norm_factorÚ_inv_norm_factorÚ
_cache_keyÚ	ola_denomÚola_denom_invÚ_compiled_stft_fnsÚ_compiled_istft_fnsÚ_compiled_pair_nd_fnsÚ_torch_window_cacheÚ_window_runtime_cacheNTr>   r@   F)rÊ  r+  rW  r  r  r  r  rî   rU  r*  r)  rÊ  r+  rW  r  r  r  r  c                ó"  — t        |«      | _        t        |«      | _        |�t        |«      n| j                  | _        | j                  | j                  kD  r&t	        d| j                  › d| j                  › d�«      ‚t        |«      | _        t        |«      | _        t        |	«      | _	        t        |
«      | _
        t        |«      | _        t        |«      | _        | j                  dvrt	        d«      ‚| j                  dvrt	        d«      ‚| j                  dk(  r| j                  d	k7  rt	        d
«      ‚t        |t        ¬«      | _        t!        || j                  | j                  | j                  | j                  ¬«      | _        t%        j&                  | j"                  «      | _        t)        || j"                  | j                  | j                  | j                  | j                  ¬«      | _        | j                  r"dt-        j.                  | j                  «      z  nd| _        | j                  rt-        j.                  | j                  «      nd| _        t%        j&                  | j"                  dz  j5                  t$        j6                  «      «      | _        t        | j"                  j:                  «      | j"                  | j8                  fi| _        d | _        d | _         d | _!        i | _"        i | _#        i | _$        i | _%        y )Nr~  r  r¹   >   r>   r?   r(  >   rA   r@   r  r>   r@   r'  r  )rÊ  r)  r*  rî   r+  )r'  r(  r)  r*  rî   r+  rŽ  rY   )&re   rî   rU  r*  rc   rÒ   rW  rž   r  r  r  r+  r)  r  Ú_DEFAULT_ISTFT_BACKEND_POLICYr  r   rÊ  r'  r  r8  rX  r‚  rà  r5  r4  rÿ  r  r3  rÎ  r=  r7  r8  r6  r9  r:  r;  r<  )rf   rî   rU  r*  r)  rÊ  r+  rW  r  r  r  r  s               rh   ri   zSpectralTransform.__init__I  sz  € ô ˜“ZˆŒ
Ü˜j›/ˆŒØ-7Ð-Cœ#˜jœ/ÈÏÉˆŒà�?‰?˜TŸZ™ZÒ'Ü˜|¨D¯O©OÐ+<Ð<PÐQU×Q[ÑQ[ÐP\Ð\]Ð^Ó_Ð_ä˜6“lˆŒÜ" ?Ó3ˆÔÜ" ?Ó3ˆÔÜ˜zÓ*ˆŒÜ˜X›ˆŒÜ˜Y›ˆŒØ×ÑÐ'>Ñ>ÜØHóð ð ×ÑÐ'?Ñ?ÜØIóð ð ×Ñ 9Ò,°×1EÑ1EÈÒ1TÜØPóð ô %<Ø Ü8ô%
ˆÔ!ô
 "ØØ—n‘nØ—‘Ø—*‘*Ø—]‘]ô
ˆŒô —m‘m D§K¡KÓ0ˆŒÜ!8Ø"Ø ŸK™KØ—n‘nØ—‘Ø—*‘*Ø—]‘]ô"
ˆÔð @D¿º ¤d§i¡i°·
±
Ó&;Ò ;ÐTWˆÔØ59·_²_œDŸI™I d§j¡jÔ1È#ˆÔô Ÿ-™-¨¯©¸Ñ)9×(AÑ(AÄ"Ç*Á*Ó(MÓNˆŒä�—‘×!Ñ!Ó" T§[¡[°$·/±/Ð$BðL
ˆÔ"ð
 ˆŒØ!ˆÔØˆŒØ"$ˆÔØ#%ˆÔ Ø%'ˆÔ"Ø35ˆÕ rj   rÎ  r^   c                 óÔ  — t        |«      }| j                  j                  |«      }|�|S | j                  j                  |k(  r| j                  n| j                  j                  |«      }| j                  j                  |k(  r| j                  n| j                  j                  |«      }t        j                  |«      }t        j                  |«      }||f}|| j                  |<   |S rn   )	rž   r=  r€   rÊ  rÎ  rÿ  r3  r'  r  )rf   rÎ  r{   r‡   rÊ  rÓ  Úpairs          rh   Ú_window_pair_for_dtypez(SpectralTransform._window_pair_for_dtypeš  sÄ   € Ü�%‹jˆØ×+Ñ+×/Ñ/°Ó4ˆØÐØˆMà $§¡× 1Ñ 1°UÒ :�—’ÀÇÁ×@RÑ@RÐSXÓ@Yˆà#Ÿ™×4Ñ4¸Ò=ˆD�OŠOØ—‘×'Ñ'¨Ó.ð 	ô —‘˜vÓ&ˆÜ—M‘M )Ó,ˆ	Ø˜	Ð"ˆØ*.ˆ×"Ñ" 3Ñ'Øˆrj   r`   ÚbatchrG  c                 óÌ   — t        j                  ||ft         j                  ¬«      }| j                  |d¬«      }| j	                  ||d¬«      }t        j
                  ||«       y)z1Force compilation of kernels and execution paths.rî  r=   ©r	  )rG  rì  N)r'  r   r  ÚstftÚistftr²  )rf   rC  rG  ri  ÚZr·  s         rh   r£  zSpectralTransform.warmup«  sM   € ä�H‰H�e˜V�_¬B¯J©JÔ7ˆØ�I‰I�a uˆIÓ-ˆØ�J‰J�q °eˆJÓ<ˆÜ
�‰��1�rj   c                 ó’  — |€"t        t        | j                  «      dz  d«      }t        j                  t        |«      t        |«      ft        j
                  ¬«      }| j                  |d¬«      }| j                  |t        |«      ddd	d¬
«      }| j                  |t        |«      ddd	d¬
«      }t        j                  |||«       y)zDPrecompile stft + fused and legacy istft kernels for this transform.NrY   é   rî  r=   rE  FTr¥   )rG  rR  Úallow_fusedrH  rì  )	rd   re   rî   r'  r   r  rF  rG  r²  )rf   rC  rG  ri  rH  Úy_fusedÚy_legacys          rh   Úprewarm_kernelsz!SpectralTransform.prewarm_kernels²  s¹   € àˆ>Üœ˜TŸZ™Z›¨1Ñ,¨dÓ3ˆFÜ�H‰H”c˜%“j¤# f£+Ð.´b·j±jÔAˆØ�I‰I�a uˆIÓ-ˆØ—*‘*ØÜ�v“;ØØØØð ó 
ˆð —:‘:ØÜ�v“;ØØØØð ó 
ˆô 	�‰��7˜HÕ%rj   r¥   )rC  rG  ÚvalidaterR  rK  rH  r  rO  rR  rK  rH  r  c                óV  — |€"t        t        | j                  «      dz  d«      }t        j                  t        |«      t        |«      ft        j
                  ¬«      }| j                  |d¬«      }	| j                  |	t        |«      ||||d|d¬«	      }
t        j                  |	|
«       y)	zGPrecompile cached compiled STFT/iSTFT callables for steady-shape loops.NrY   rJ  rî  r=   rE  Únative©rG  rO  rR  rK  rH  Úlong_mode_strategyr  rì  )	rd   re   rî   r'  r   r  Ústft_compiledÚistft_compiledr²  )rf   rC  rG  rO  rR  rK  rH  r  ri  Úzr·  s              rh   Úprewarm_compiledz"SpectralTransform.prewarm_compiledÊ  s›   € ð ˆ>Üœ˜TŸZ™Z›¨1Ñ,¨dÓ3ˆFÜ�H‰H”c˜%“j¤# f£+Ð.´b·j±jÔAˆØ×Ñ˜q°ÐÓ6ˆØ×ÑØÜ�v“;ØØ!Ø#ØØ'Ø)Øð  ó 

ˆô 	�‰��1�rj   r<   rE  r	  c                ó$  ‡ ‡— t        |«      Š‰ j                  j                  ‰«      }|�t        d‰¬«       |S t        d‰¬«       t        j
                  dt        j                  dt        j                  fˆˆ fd„«       }|‰ j                  ‰<   |S )zBReturn a cached compiled STFT callable for steady-shape workloads.zcompiled_stft_cache.hitrz   zcompiled_stft_cache.missri  r^   c                 ó*   •— ‰j                  | ‰¬«      S ©NrE  )rF  )ri  Úresolved_layoutrf   s    €€rh   rX   z6SpectralTransform.get_compiled_stft.<locals>._compiledð  s   ø€ à—9‘9˜Q¨o�9Ó>Ð>rj   )r  r9  r€   r‚   r'  Úcompiler  )rf   r	  r‡   rX   r[  s   `   @rh   Úget_compiled_stftz#SpectralTransform.get_compiled_stftç  sˆ   ù€ ä5°mÓDˆØ×(Ñ(×,Ñ,¨_Ó=ˆØÐÜÐ 9¸ÕOØˆMÜÐ6¸OÕLä	�‰ð	?œŸ™ð 	?¤b§h¡hõ 	?ó 
ð	?ð 4=ˆ×Ñ Ñ0ØÐrj   r8   rQ  rR  rS  rì  c                óZ  ‡ ‡‡‡‡‡‡‡‡— ‰dk7  rt        d«      ‚t        |‰ j                  ¬«      Š‰dk(  rt        d«      ‚t        |«      Š‰�t	        ‰«      ndt        ‰«      t        ‰«      t        ‰«      t        ‰«      t        ‰«      t        ‰«      t        ‰«      f}	‰ j                  j                  |	«      }
|
�t        d|	¬«       |
S t        d	|	¬«       t        j                  d
t        j                  dt        j                  fˆˆˆˆˆˆˆ ˆˆf	d„«       }|‰ j                  |	<   |S )zŸReturn a cached compiled iSTFT callable for fixed runtime options.

        For best throughput, reuse the returned callable with stable input shapes.
        rQ  zuCompiled iSTFT supports long_mode_strategy='native' only. Use eager istft for numpy_fallback/torch_fallback behavior.r  r;   zmCompiled iSTFT does not support backend_policy='torch_fallback'. Use eager istft for torch fallback behavior.rï  zcompiled_istft_cache.hitrz   zcompiled_istft_cache.missrV  r^   c                 ó8   •	— ‰j                  | ‰‰	‰‰‰‰‰‰¬«	      S )NrR  )rG  )
rV  rK  rG  rS  Úresolved_backendÚresolved_input_layoutrH  rf   rR  rO  s
    €€€€€€€€€rh   rX   z7SpectralTransform.get_compiled_istft.<locals>._compiled'	  s4   ø€ à—:‘:ØØØ!Ø%Ø'ØØ#5Ø/Ø2ð ó 
ð 
rj   )rc   r  r  r  re   rÒ   rž   r:  r€   r‚   r'  r\  r  )rf   rG  rO  rR  rK  rH  rS  r  rì  r{   r‡   rX   r`  ra  s   ```````     @@rh   Úget_compiled_istftz$SpectralTransform.get_compiled_istft÷  s6  ÿø€ ð   Ò)ÜðNóð ô 3ØØ×4Ñ4ô
Ðð Ð/Ò/Üð?óð ô !<¸LÓ IÐð "Ð-ŒC�ŒK°2Ü�‹NÜ�ÓÜ�ÓÜ�‹KÜÐ"Ó#ÜÐ Ó!ÜÐ%Ó&ð	
ˆð ×)Ñ)×-Ñ-¨cÓ2ˆØÐÜÐ :ÀÕDØˆMÜÐ7¸SÕAä	�‰ð	œŸ™ð 	¤b§h¡h÷ 	ô 	ó 
ð	ð )2ˆ× Ñ  Ñ%ØÐrj   ri  c                ó2   —  | j                  |¬«      |«      S )z2Execute compiled STFT using cached compiled graph.rE  )r]  )rf   ri  r	  s      rh   rT  zSpectralTransform.stft_compiled8	  s   € àBˆt×%Ñ%°MÐ%ÓBÀ1ÓEÐErj   rV  c          
      óD   — | j                  ||||||||	¬«      }
 |
|«      S )zEExecute compiled iSTFT using cached compiled graph for fixed options.rR  )rb  )rf   rV  rG  rO  rR  rK  rH  rS  r  rì  r+  s              rh   rU  z SpectralTransform.istft_compiled<	  s<   € ð ×$Ñ$ØØØ!Ø#ØØ1Ø)Ø%ð %ó 	
ˆñ �!‹uˆrj   r=   )r  Úwarmup_batchr  re  c                óº  — t        |«      }t        |«      }|�t        |«      nd}t        j                  ||ft        j                  ¬«      }| j                  ||¬«      }| j                  |||d¬«      }	t        j                  ||	«       | j                  |¬«      }
| j                  ||d¬«      }|�& |
|«      } ||«      }t        j                  ||«       |
|fS )uð  Return ``(stft_fn, istft_fn)`` compiled for a fixed configuration.

        10â€“20% faster than the eager ``stft()``/``istft()`` methods in
        steady-state loops by eliminating per-call Python dispatch overhead.

        Args:
            length: Signal length in samples.  Fixed for this pair.
            layout: ``"bnf"`` (default, fastest) or ``"bfn"``.
            warmup_batch: If provided, run one warmup pass with this batch
                size so that kernel compilation and safety checks are paid
                upfront rather than on the first real call.

        Returns:
            ``(stft_fn, istft_fn)`` â€” call as ``z = stft_fn(x)``,
            ``y = istft_fn(z)``.

        Example::

            t = SpectralTransform(n_fft=1024, hop_length=256)
            stft, istft = t.compiled_pair(length=44100, warmup_batch=2)

            for chunk in stream:
                z = stft(chunk)
                z = process(z)
                y = istft(z)
                mx.eval(y)
        r`   rî  rE  r8   ©rG  rì  rH  )
r  re   r'  r   r  rF  rG  r²  r]  rb  )rf   rG  r  re  r[  Ú
warmup_lenÚwarmup_bÚx_warmÚz_warmÚy_warmÚstft_fnÚistft_fnÚz_cÚy_cs                 rh   Úcompiled_pairzSpectralTransform.compiled_pairV	  sç   € ôD 6°fÓ=ˆô ˜“[ˆ
Ø(4Ð(@”3�|Ô$ÀaˆÜ—‘˜8 ZÐ0¼¿
¹
ÔCˆØ—‘˜6°�ÓAˆØ—‘Ø˜:Ø(°ð ó 
ˆô 	�‰�˜Ôà×(Ñ(°Ð(ÓGˆØ×*Ñ*ØØ(Øð +ó 
ˆð Ð#Ù˜&“/ˆCÙ˜3“-ˆCÜ�G‰G�C˜Ôà˜Ð Ð rj   )r  Úleading_shape.c                ó\  ‡ ‡‡‡‡‡‡— t        |«      Št        d„ |D «       «      }|st        d«      ‚t        d„ |D «       «      rt        d«      ‚t	        |«      |t        ‰«      f}‰ j                  j                  |«      }|�t        d|¬«       |S t        d|¬«       t	        |«      Št	        t        j                  |«      «      Š‰ j                  ‰‰‰¬	«       t        j                  |‰fz   t        j                  ¬
«      }‰ j                  t        j                   |‰‰f«      ‰¬«      }t        j"                  |«       t        d„ |j$                  dd D «       «      Š|‰fz   Š|‰z   Št        j&                  dt        j(                  dt        j(                  fˆˆˆˆ ˆfd„«       }	t        j&                  dt        j(                  dt        j(                  fˆˆˆˆˆ ˆfd„«       }
 |	|«      } |
|«      }t        j"                  ||«       |	|
f‰ j                  |<   ‰ j                  |   S )a#  Return compiled STFT/iSTFT callables for fixed leading dimensions.

        This wraps the packed-batch STFT/iSTFT inside a compiled reshape so
        callers with stable multi-axis layouts (for example ``[B, C, T]``)
        can avoid paying Python reshape overhead on every call.
        c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrn   ro   rp   s     rh   rs   z5SpectralTransform.compiled_pair_nd.<locals>.<genexpr>£	  s   è ø€ Ð:©M Sœ˜CŸ©Mùrt   z1leading_shape must contain at least one dimensionc              3   ó&   K  — | ]	  }|d k  –— Œ y­w)r   NrŸ   rp   s     rh   rs   z5SpectralTransform.compiled_pair_nd.<locals>.<genexpr>¦	  s   è ø€ Ð+¡7˜Cˆs�a�x¡7ùs   ‚z$leading_shape dimensions must be > 0Nzcompiled_pair_nd_cache.hitrz   zcompiled_pair_nd_cache.miss)rG  r  re  rî  rE  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrn   ro   rp   s     rh   rs   z5SpectralTransform.compiled_pair_nd.<locals>.<genexpr>¸	  s   è ø€ Ð FÑ5E¨c¤ S§Ñ5Eùrt   r`   ri  r^   c                 ó†   •— t        j                  | ‰‰f«      }‰j                  |‰¬«      }t        j                  |‰«      S rZ  )r'  rò  rF  )ri  Úx2rV  Úoutput_spec_shapeÚpackedr[  rf   rh  s      €€€€€rh   Ú_stft_ndz4SpectralTransform.compiled_pair_nd.<locals>._stft_nd¼	  s<   ø€ ä—‘˜A ¨
Ð3Ó4ˆBØ—	‘	˜"¨O�	Ó<ˆAÜ—:‘:˜aÐ!2Ó3Ð3rj   rV  c                 óŽ   •— t        j                  | ‰f‰z   «      }‰j                  |‰‰d¬«      }t        j                  |‰«      S )Nr8   rg  )r'  rò  rG  )	rV  Úz2r·  Úinner_spec_shapeÚoutput_audio_shaperz  r[  rf   rh  s	      €€€€€€rh   Ú	_istft_ndz5SpectralTransform.compiled_pair_nd.<locals>._istft_ndÂ	  sD   ø€ ä—‘˜A ˜yÐ+;Ñ;Ó<ˆBØ—
‘
˜2 j¸ÐW]�
Ó^ˆAÜ—:‘:˜aÐ!3Ó4Ð4rj   )r  rw   rc   Úanyre   rž   r;  r€   r‚   r‚  rÎ  rq  r'  r   r  rF  rò  r²  rk   r\  r  )rf   rG  rr  r  rØ  r{   r‡   rj  rk  r{  r€  Ú
z_compiledÚ
y_compiledr~  r  ry  rz  r[  rh  s   `            @@@@@@rh   Úcompiled_pair_ndz"SpectralTransform.compiled_pair_nd•	  sò  þ€ ô 6°fÓ=ˆÜÑ:©MÓ:Ó:ˆÙÜÐPÓQÐQÜÑ+¡7Ó+Ô+ÜÐCÓDÐDä�6‹{˜G¤S¨Ó%9Ð:ˆØ×+Ñ+×/Ñ/°Ó4ˆØÐÜÐ <À#ÕFØˆMÜÐ9¸sÕCä˜“[ˆ
Ü”T—Y‘Y˜wÓ'Ó(ˆà×Ñ *°_ÐSYÐÔZä—‘˜' Z MÑ1¼¿¹ÔDˆØ—‘œ2Ÿ:™: f¨v°zÐ.BÓCÐSb�ÓcˆÜ
�‰�ŒÜ Ñ F°V·\±\À!À"Ñ5EÓ FÓFÐØ$¨
 }Ñ4ÐØ#Ð&6Ñ6Ðä	�‰ð	4œŸ™ð 	4¤R§X¡X÷ 	4ð 	4ó 
ð	4ô
 
�‰ð	5œŸ™ð 	5¤b§h¡h÷ 	5ñ 	5ó 
ð	5ñ
 ˜fÓ%ˆ
Ù˜zÓ*ˆ
Ü
�‰�
˜JÔ'à+3°YÐ*?ˆ×"Ñ" 3Ñ'Ø×)Ñ)¨#Ñ.Ð.rj   c                 ó,  ‡‡‡‡‡— |j                   dk(  r
|ddd…f   }n'|j                   dk7  rt        d|j                  › �«      ‚| j                  Š| j                  Š| j
                  }| j                  }| j                  }| j                  Š|j                  \  }}|xr |dk(  xr |dk(  }|rt        j                  «       ndŠ|r€‰r~‰durz|‰k\  ru‰dz  Š|d‰z  z   }|‰z
  ‰z  dz   }	t        j                  dt        j                  d	t        j                  fˆˆˆˆfd
„«       }
|
j                  ˆˆˆˆˆfd„«       } |
|«      }n‘|rt        |‰‰||¬«      }|j                  \  }}|‰k  r5t        j                   |dd‰|z
  fg«      }t#        |j                  d   «      }|‰z
  ‰z  dz   }	t        j$                  |||	‰f|‰df¬«      }|‰dddd…f   z  }t        j&                  j)                  |d¬«      }| j*                  r|| j,                  z  }|S )un  STFT with gradient support.

        Returns spectrogram in **bnf** layout ``[B, N, F]``.

        Use this entry point instead of :meth:`stft` when you need
        ``mx.grad`` / ``mx.value_and_grad`` to flow through the transform.

        When Metal is available, uses a fused frame-extraction kernel for the
        forward pass and a dedicated Metal scatter-add kernel for the backward
        pass.  Falls back to pure MLX ops (``as_strided`` / ``rfft``) on both
        paths when Metal is unavailable.

        .. note:: **Performance** â€” The backward pass is ~4-5x slower than
           the forward pass.  This is inherent: the ``rfft`` backward
           (which requires a full ``irfft``) dominates (~85% of backward
           time) and is handled by MLX's built-in autodiff.  The custom
           Metal scatter-add kernel adds only ~0.5 ms of overhead.
        r`   NrY   z0differentiable_stft expects 1D or 2D input, got r>   r@   FÚx_innerr^   c                 ó®  •— | j                   d   }t        | j                   d   «      }|d‰z  z   ‰
z
  ‰	z  dz   }t        j                  ||gt        j                  ¬«      }t        j
                  | «      }d|j                  fd‰
fd‰	fd‰fg}t        j                  «       } ||‰|g|||‰
fg|j                  g‰
||ft        d	‰
«      ddf¬
«      }|d   S )z=Forward: Metal fused frame extraction (reflect-pad + window).r   r`   rY   rî  r  ÚNFFTr	  ÚPADrW  ©r¦  r   r®  r¯  r¥  r°  )
rk   re   r'  r  rñ  r  rÎ  rF  rO  rY  )r†  ÚB_iÚsl_iÚnfÚ	fe_paramsÚx_crq  rº  r  rU  rî   rc  rÊ  s            €€€€rh   Ú_extract_frames_metalzDSpectralTransform.differentiable_stft.<locals>._extract_frames_metal 
  sò   ø€ ð —m‘m AÑ&�Ü˜7Ÿ=™=¨Ñ+Ó,�Ø˜Q ™W‘n uÑ,°Ñ;¸aÑ?�ÜŸH™H d¨B Z´r·x±xÔ@�	Ü—m‘m GÓ,�à˜#Ÿ)™)Ð$ v¨u oØ˜JÐ'¨%°¨ð�ô ,×6Ñ6Ó8�Ù Ø ¨Ð3Ø!Ø$'¨¨UÐ#3Ð"4Ø#&§9¡9 +Ø  SÐ)Ü!$ S¨%£°!°QÐ 7ô�ð ˜q‘zÐ!rj   c                 óü  •— | }|j                   d   }t        |j                   d   «      }t        |j                   d   «      }t        j                  ||gt        j                  ¬«      }t        j
                  |«      }d|j                  fd‰fd‰fd‰fg}	||df}
t        j                  ‰d|j                  › �‰‰|
|‰|g|	||f|j                  d	¬
«
      } ‰|‰|g|	||fg|j                  g|
|ddf¬«      }|d   S )Nr   r`   rî  r  rˆ  r	  r‰  Ústft_backward_rW  r  rŠ  )	rk   re   r'  r  rñ  r  rÎ  rÔ   rÆ  )Úprimalsr*  ÚoutputÚx_pr‹  rŒ  r�  Ú
bwd_paramsÚcotangent_crq  Úgrid_bwdr  Úgrad_outÚ
bwd_kernelrU  rî   rc  rÊ  s                €€€€€rh   Ú_extract_frames_metal_vjpzHSpectralTransform.differentiable_stft.<locals>._extract_frames_metal_vjp
  s,  ø€ à�Ø—i‘i ‘l�Ü˜3Ÿ9™9 Q™<Ó(�Ü˜Ÿ™ a™Ó)�ÜŸX™X t¨R j¼¿¹ÔA�
Ü Ÿm™m¨IÓ6�à˜+×+Ñ+Ð,¨v°u¨oØ˜JÐ'¨%°¨ð�ð ! # q˜>�Ü"×9Ñ9Ø%Ø"0°×1BÑ1BÐ0CÐ DØ ZØ!Ø'¨°Ð<Ø!Ø"% t Ø!,×!2Ñ!2Ø #ð :ó 
�ñ &Ø'¨°Ð<Ø!Ø$'¨ ; -Ø#.×#4Ñ#4Ð"5Ø!Ø!$ a¨ ô�ð   ‘{Ð"rj   ©rî   rU  r  r  r  r   ©rk   Ústridesrï  rk  )r€  rc   rk   rî   rU  rW  r  r  rÊ  ra  rh  r'  Úcustom_functionr  Úvjpr)  rc  re   Ú
as_stridedÚfftÚrfftr  r5  )rf   ri  rW  r  r  r  r  Úuse_reflect_fast_pathÚ
padded_lenrQ  r�  r›  rÉ  ÚT_padÚspecrš  rU  rî   rc  rÊ  s                  @@@@@rh   Údifferentiable_stftz%SpectralTransform.differentiable_stftÓ	  s<  ü€ ð& �6‰6�QŠ;Ø�$š�'‘
‰AØ�V‰V�qŠ[ÜÐOÐPQ×PWÑPWÈyÐYÓZÐZà—
‘
ˆØ—_‘_ˆ
Ø—‘ˆØ×.Ñ.ˆØ×.Ñ.ˆØ—‘ˆà—W‘W‰
ˆˆ7ð ÒV�¨)Ñ3ÒV¸È;Ñ8Vð 	ñ BWÔ)×;Ñ;Ô=Ð\aˆ
á ¡Z°JÀeÑ4KÐPWÐ[`ÒP`à˜1‘*ˆCØ  1 s¡7Ñ*ˆJØ" UÑ*¨zÑ9¸AÑ=ˆHä×Ñð"¬r¯x©xð "¼B¿H¹H÷ "ó  ð"ð, #×&Ñ&÷#ó 'ð#ñB +¨1Ó-‰Fñ Ü)ØØØ)Ø$3Ø$3ô�ð —w‘w‰HˆAˆuØ�uŠ}Ü—F‘F˜1˜v¨¨5°5©=Ð'9Ð:Ó;�Ü˜AŸG™G A™J›�à ™¨*Ñ4°qÑ8ˆHÜ—]‘]ØØ˜( EÐ*Ø 
¨AÐ.ôˆFð
 ˜f T¨4² ]Ñ3Ñ3ˆFô �v‰v�{‰{˜6¨ˆ{Ó+ˆð �?Š?Ø˜$×/Ñ/Ñ/ˆDàˆrj   ©rG  c                óÂ  ‡ ‡"‡#‡$‡%‡&‡'‡(‡)‡*‡+— |j                   dk(  r|d   }n'|j                   dk7  rt        d|j                  › �«      ‚‰ j                  Š(‰ j                  Š%‰ j
                  Š+‰ j                  }‰ j                  Š$‰ j                  }|�t        |«      ndŠ'‰$r|dk(  r‰'€t        d«      ‚|j                  \  Š"}}t        |«      Š)‰%‰)dz
  z  ‰(z   Š*t        j                  j                  |‰(d	¬
«      }‰ j                  r|‰ j                  z  }t        j!                  «       Š#t"        j%                  «       }‰#xr ‰#duxr |xr |du}	|	�rÄt"        j'                  «       }
|
rð|
durìt        j(                  ‰)‰*gt        j*                  ¬«      }dt        j,                  fd‰%fd‰(fg}‰*ddf}t"        j/                  |
dt        j,                  › �‰(‰%||j1                  t        j,                  «      |g|‰*ft        j,                  d¬«
      } |
|j1                  t        j,                  «      |g|||ddf‰*fgt        j,                  gd¬«      }|d   }�n(t        j2                  ‰)t        j*                  ¬«      ‰%z  }t        j2                  ‰(t        j*                  ¬«      }|dd…df   |ddd…f   z   }|j5                  d	«      }t        j6                  |d‰*dz
  «      }|‰*k  j1                  t        j,                  «      }t        j8                  |j1                  t        j,                  «      ‰)f«      |z  }t        j:                  ‰*ft        j,                  ¬«      }|j<                  |   j?                  |«      }t        j@                  |dkD  d|z  t        jB                  |«      «      Š&t        jD                  dt        j(                  dt        j(                  fˆ"ˆ$ˆ%ˆ'ˆ(ˆ*ˆ fd„«       }|jF                  ˆ"ˆ#ˆ$ˆ%ˆ&ˆ'ˆ(ˆ)ˆ*ˆ+f
d„«       } ||«      }|S |‰+j1                  |jH                  «      dddd…f   z  }t        j2                  ‰)t        j*                  ¬«      ‰%z  }t        j2                  ‰(t        j*                  ¬«      }|dd…df   |ddd…f   z   }|j5                  d	«      }t        j6                  |d‰*dz
  «      }|‰*k  j1                  |jH                  «      }|j5                  ‰"d	«      |ddd…f   z  }t        j2                  ‰"t        j*                  ¬«      ‰*z  dd…df   }||ddd…f   z   j5                  d	«      }t        j:                  ‰"‰*z  f|jH                  ¬«      }|j<                  |   j?                  |j5                  d	«      «      }|j5                  ‰"‰*«      }t        j8                  |j1                  t        j,                  «      ‰)f«      |j1                  t        j,                  «      z  }t        j:                  ‰*ft        j,                  ¬«      }|j<                  |   j?                  |«      }t        j@                  t        jJ                  |«      dkD  |t        jL                  |«      «      } t        jJ                  |«      dkD  j1                  |jH                  «      }!|| ddd…f   z  |!ddd…f   z  }tO        |‰$‰(‰*‰'‰"«      }|S )u  iSTFT with gradient support.

        Expects spectrogram in **bnf** layout ``[B, N, F]``.
        Returns time-domain signal ``[B, T]``.

        Use this entry point instead of :meth:`istft` when you need
        ``mx.grad`` / ``mx.value_and_grad`` to flow through the transform.

        When Metal is available, uses the fused OLA+norm kernel for the
        forward pass and a dedicated Metal gather kernel for the backward
        pass.  Falls back to pure MLX ops on both paths when Metal is
        unavailable.

        .. note:: **Performance** â€” The backward pass cost is dominated by
           the ``irfft`` backward (a full ``rfft``), which is handled by
           MLX's built-in autodiff.  The custom Metal gather kernel adds
           only ~0.5 ms of overhead.
        rY   ©N.rõ   z1differentiable_istft expects 2D or 3D input, got NrA   zJlength is required when center_tail_pad='minimal' for differentiable_istftr`   rï  ©r’  rl  Frî  r  r	  r
  Úola_envelope_rW  r  r   ©r¦  r   r¥  r°  r®  r¯  r  r  rŽ  Úframes_innerr^   c                 ó~   •— ‰
j                  | j                  «      \  }}t        | ||‰‰	«      }t        |‰‰‰	‰‰«      S )zForward: Metal OLA+norm + trim.)rB  rÎ  r&  r  )r¯  Ú	window_rtÚwindow_sq_rtÚresultr  rW  rU  r  rî   rè  rf   s       €€€€€€€rh   Ú_ola_and_trimz=SpectralTransform.differentiable_istft.<locals>._ola_and_trimÆ
  sN   ø€ ð +/×*EÑ*EÀl×FXÑFXÓ*YÑ'�	˜<Ü,Ø  )¨\Ø ó�ô (¨°¸¸wÈ
ÐTUÓVÐVrj   c                 ó2  •
— t        |‰
‰‰‰‰«      }t        j                  ‰‰gt        j                  ¬«      }t        j                  |«      }d|j
                  fd‰fd‰fg} ‰	|‰‰|g|‰‰‰fg|j
                  g‰‰‰ft        d‰«      ddf¬«      }|d   S )	Nrî  r  rˆ  r	  rW  r`   rŠ  r   )r1  r'  r  rñ  r  rÎ  rY  )r“  r*  r”  r,  r–  Ú
grad_ola_crq  rf  r  rš  rW  rU  rl  r  rî   Ún_frames_intrè  rÊ  s           €€€€€€€€€€rh   Ú_ola_and_trim_vjpzASpectralTransform.differentiable_istft.<locals>._ola_and_trim_vjpÐ
  s½   ø€ ô ,Ø˜v u¨g°zÀ1ó�ô  ŸX™X |°WÐ&=ÄRÇXÁXÔN�
ÜŸ]™]¨8Ó4�
Ø˜j×.Ñ.Ð/°&¸%°À5È*ÐBUÐV�Ù(Ø&¨°¸jÐIØ!Ø$% |°UÐ#;Ð"<Ø#-×#3Ñ#3Ð"4Ø ¨qÐ1Ü!$ S¨%£°!°QÐ 7ô�ð # 1‘~Ð%rj   )(r€  rc   rk   rî   rU  rÊ  r3  rW  r  re   r'  r¢  Úirfftr  r4  ra  rn  rÔ   rÖ  rÛ  r  rñ  r  rÆ  rÿ  rð  rò  rô  r  r   r  rN   r  ró  rŸ  r   rÎ  r  Ú	ones_liker  ),rf   rV  rG  rÓ  r  rQ  Ú	freq_binsÚtime_framesÚola_norm_kernelÚ	use_metalÚenvelope_kernelÚ
env_paramsÚenv_tmplÚenv_gridÚenv_tgxÚenv_outputsÚenveloperõ  Úoffsetsr÷  rø  Úflat_indices_saferù  Ú	wsq_tiledr´  r¸  r4  ÚwindowedÚ	flat_valsr  Úbatch_indicesÚout_flatÚenvelope_safeÚenv_maskr  rš  rW  rU  rl  r  rî   r·  rè  rÊ  s,   `                                 @@@@@@@@@@rh   Údifferentiable_istftz&SpectralTransform.differentiable_istft[
  s  ÿú€ ð0 �6‰6�QŠ;Ø�)‘‰AØ�V‰V�qŠ[ÜØCÀAÇGÁGÀ9ÐMóð ð —
‘
ˆØ—_‘_ˆ
Ø—‘ˆØ—O‘Oˆ	Ø—‘ˆØ×.Ñ.ˆØ$*Ð$6”S˜”[¸Dˆ
Ù�o¨Ò2°zÐ7IÜØ\óð ð "#§¡Ñˆˆ8�YÜ˜8“}ˆØ ¨qÑ 0Ñ1°EÑ9ˆô —f‘f—l‘l 1¨°B�lÓ7ˆð �?Š?Ø%¨×(9Ñ(9Ñ9ˆKô *×<Ñ<Ó>ˆ
Ü&×3Ñ3Ó5ˆàò A˜:¨UÐ2ò AØòAØ$3¸5Ð$@ð 	ò
 ô +×7Ñ7Ó9ˆOÙ ?¸%Ñ#?ÜŸX™X |°WÐ&=ÄRÇXÁXÔN�
Ø ¤"§*¡*Ð-°°zÐ/BÀWÈeÐDTÐU�Ø# Q¨˜?�Ü&×=Ñ=Ø*Ø"/´·
±
¨|Ð <Ø ZØ!Ø%×,Ñ,¬R¯Z©ZÓ8¸*ÐEØ%Ø") Ü!#§¡Ø #ð >ó 
�ñ .Ø%×,Ñ,¬R¯Z©ZÓ8¸*ÐEØ%Ø!Ø!(¨!¨Q Ø$+ : ,Ü#%§:¡: ,Ø ô�ð ' q™>’ô  "Ÿy™y¨¼R¿X¹XÔFÈÑS�ÜŸ)™) E´·±Ô:�Ø&¢q¨$ wÑ/°'¸$Â¸'Ñ2BÑB�Ø&Ÿ™¨rÓ2�Ü$&§G¡G¨L¸!¸WÀq¹[Ó$IÐ!Ø*¨WÑ4×<Ñ<¼R¿Z¹ZÓH�
ÜŸG™G I×$4Ñ$4´R·Z±ZÓ$@À<À/ÓRÐU_Ñ_�	ÜŸ8™8 W J´b·j±jÔA�Ø#Ÿ;™;Ð'8Ñ9×=Ñ=¸iÓH�ô Ÿ8™8 H¨uÑ$4°c¸H±nÄbÇmÁmÐT\ÓF]Ó^ˆLä×ÑðW¬B¯H©Hð W¼¿¹÷ Wò Wó  ðWð ×Ñ÷&ô &ó ð&ñ&   Ó,ˆCð< ˆ
ð7 # V§]¡]°;×3DÑ3DÓ%EÀdÈDÒRSÀmÑ%TÑTˆHäŸ9™9 \¼¿¹ÔBÀZÑOˆLÜ—i‘i ¬R¯X©XÔ6ˆGØ"¢1 d 7Ñ+¨g°dºA°gÑ.>Ñ>ˆGØ"Ÿ?™?¨2Ó.ˆLÜ "§¡¨°a¸À1¹Ó EÐØ&¨Ñ0×8Ñ8¸¿¹ÓHˆJà ×(Ñ(¨¨BÓ/°*¸TÂ1¸WÑ2EÑEˆIÜŸY™Y q´·±Ô9¸GÑCÂQÈÀWÑMˆMØ*Ð->¸tÂQ¸wÑ-GÑG×PÑPÐQSÓTˆMä—x‘x  W¡ °h·n±nÔEˆHØ—{‘{ =Ñ1×5Ñ5°i×6GÑ6GÈÓ6KÓLˆHØ×"Ñ" 1 gÓ.ˆCäŸ™ 	× 0Ñ 0´·±Ó <¸|¸oÓNÐQ[×QbÑQbÔce×cmÑcmÓQnÑnˆIÜ—x‘x  
´"·*±*Ô=ˆHØ—{‘{Ð#4Ñ5×9Ñ9¸)ÓDˆHäŸH™H¤R§V¡V¨HÓ%5¸Ñ%=¸xÌÏÉÐV^ÓI_Ó`ˆMÜŸ™˜xÓ(¨5Ñ0×8Ñ8¸¿¹ÓCˆHØ˜ tªQ wÑ/Ñ/°8¸DÂ!¸GÑ3DÑDˆCä" 3¨°°wÀ
ÈAÓNˆCàˆ
rj   ræ  rQ  rç  c                ó	  — | j                   |dz
  z  | j                  z   }| j                  | j                   ||f}t        | dd«      |k(  r`| j                  �T| j                  �H|r!t
        j                  «       du rt        d«      ‚t        d|¬«       | j                  | j                  fS t        d|¬«       | j                  t        j                  «      \  }}t
        j                  «       }|du �rt        d	d
¬«       |rt        d«      ‚t        |j                  d   «      }t        j                  t        |«      t        j                  ¬«      t        | j                   «      z  }	t        j                  |t        j                  ¬«      }
|	dd…df   |
ddd…f   z   }|j!                  d«      }|t        |«      k  }t        j"                  |dt        |«      dz
  «      }t        j$                  |t        |«      f«      }||j'                  |j(                  «      z  }t        j*                  t        |«      f|j(                  ¬«      }|j,                  |   j/                  |«      }|j(                  t        j                  k7  r|j'                  t        j                  «      }t        j0                  t        j2                  |«      dkD  d|z  t        j4                  |«      «      }|| _        || _        || _        ||fS t        j8                  t        |«      t        |«      gt        j                  ¬«      }d|j(                  fd| j                   fd| j                  fg}t;        d|«       t
        j=                  |d|j(                  › �| j                  | j                   |ddf||g||f|j(                  d¬«
      } |||g||ddf|ddf|fg|j(                  gd¬«      }t        d«       |d   }|j(                  t        j                  k7  r|j'                  t        j                  «      }t        j0                  t        j2                  |«      dkD  d|z  t        j4                  |«      «      }|| _        || _        || _        ||fS )zGLegacy path envelope calculation (used only if fused norm is disabled).r`   r6  NFzMbackend_policy='metal' requires Metal envelope kernel, but it is unavailable.zola_envelope_cache.hitrz   zola_envelope_cache.misszbackend.envelope.fallbackr  r~  r   rî  rï  r  rŽ  r  r	  r
  rÅ  Úola_envelope_optimized_rW  r  r®  zbackend.envelope.metal)rU  rî   r¾   r7  r8  rÔ   rÛ  r  r‚   rB  r'  r  re   rk   rð  rñ  rò  rô  r  rÿ  rÎ  r   r  rN   r  r  ró  r6  r  rt  rÆ  )rf   rQ  rç  rè  r{   rŠ   rÓ  rº  rë  rõ  rö  r÷  rø  rù  rú  r  r  Ú	denom_invr3  rq  r  r  s                         rh   rY  z#SpectralTransform._get_ola_envelope  sß  € ð —/‘/ X°¡\Ñ2°T·Z±ZÑ?ˆØ�z‰z˜4Ÿ?™?¨G°XÐ>ˆô �D˜,¨Ó-°Ò4Ø—‘Ð*Ø×"Ñ"Ð.á¤,×";Ñ";Ó"=ÀÑ"FÜ"Øcóð ô  Ð 8¸cÕBØ—>‘> 4×#5Ñ#5Ð5Ð5ÜÐ5¸3Õ?à×2Ñ2´2·:±:Ó>‰ˆˆ9ä×*Ñ*Ó,ˆØ�UŠ?ÜÐ ;ÐDWÕXÙÜ"Øcóð ô ˜	Ÿ™¨Ñ*Ó+ˆEÜŸ9™9¤S¨£]¼"¿(¹(ÔCÄcÈ$Ï/É/ÓFZÑZˆLÜŸ™ 5´·±Ô9ˆJØ"¢1 d 7Ñ+¨j¸ºq¸Ñ.AÑAˆGØ"Ÿ?™?¨2Ó.ˆLØ%¬¨G«Ñ4ˆJÜ—g‘g˜l¨A¬s°7«|¸aÑ/?Ó@ˆGä—W‘W˜Y¬¨X«Ð(8Ó9ˆFØ˜j×/Ñ/°·±Ó=Ñ=ˆFÜ—H‘Hœc '›l˜_°I·O±OÔDˆEØ—H‘H˜WÑ%×)Ñ)¨&Ó1ˆEà�{‰{œbŸj™jÒ(ØŸ™¤R§Z¡ZÓ0�ÜŸ™¤§¡¨£°Ñ!8¸#À¹+ÄrÇ}Á}ÐUZÓG[Ó\ˆIØ"ˆDŒNØ!*ˆDÔØ!ˆDŒOØ˜)Ð#Ð#ä—‘œ3˜x›=¬#¨g«,Ð7¼r¿x¹xÔHˆà�)—/‘/Ð" U¨D¯O©OÐ$<Ø�d—j‘jÐ!ð
ˆô 	˜: tÔ,ä×1Ñ1ØØ1°)·/±/Ð1BÐCØ—*‘*Ø—‘Ø˜1˜a�Ø˜vÐ&ØØ!˜Ø"Ÿ™Øð 2ó 
ˆñ Ø˜vÐ&ØØ˜1˜a�Ø˜a ˜Ø#˜:˜,Ø$Ÿ?™?Ð+Øô
ˆô 	Ð4Ô5à˜‘
ˆØ�;‰;œ"Ÿ*™*Ò$Ø—L‘L¤§¡Ó,ˆEä—H‘HœRŸV™V E›]¨WÑ4°c¸E±kÄ2Ç=Á=ÐQVÓCWÓXˆ	ØˆŒØ&ˆÔØˆŒØ�iÐÐrj   c                ó$	  — t        |«      }|j                  dk(  r
|ddd…f   }n'|j                  dk7  rt        d|j                  › �«      ‚|j                  \  }}| j                  xr  | j
                  dk(  xr | j                  dk(  }|�rŸ|| j                  k\  �r�| j                  dz  }|d|z  z   }|| j                  z
  | j                  z  dz   }	||	z  | j                  z  dz  }
t        j                  t        |«      t        |	«      gt        j                  ¬«      }d	}|
t        k\  rít        j                  «       }t        j!                  | j                  | j                  «      }|r­|�«|\  }}}}t        j"                  |«      }t%        j&                  |	|z  «      }d
|j(                  fd| j                  fd| j                  fd|fd|fd|fd|fd|fg} ||| j*                  |g|||	| j                  fg|j(                  g||z  ||f||df¬«      }d}|s¶t        j-                  «       }|rž|d	uršt        j"                  |«      }d
|j(                  fd| j                  fd| j                  fd|fg} ||| j*                  |g|||	| j                  fg|j(                  g| j                  |	|ft/        d| j                  «      ddf¬«      }nd}�Yt        j0                  j3                  |d   d¬«      }| j4                  r|| j6                  z  }|dk(  r|S |j9                  ddd«      S t        j"                  |«      }| j                  r8t;        || j                  | j                  | j
                  | j                  ¬«      }|j                  \  }}|| j                  k  r:| j                  |z
  }t        j<                  |dd|fgd¬«      }|j                  \  }}|| j                  z
  | j                  z  dz   }	t        j>                  |||	| j                  f|| j                  df¬«      }|| j*                  z  }t        j0                  j3                  |d¬«      }| j4                  r|| j6                  z  }|dk(  r|S |j9                  ddd«      S )z¶
        Forward STFT.
        Input: [T] or [B, T]
        Output: [B, F, N] (Complex, `output_layout="bfn"`), or
                [B, N, F] (Complex, `output_layout="bnf"`)
        r`   NrY   z!stft expects 1D or 2D input, got r>   r@   rb   rî  Fr  rˆ  r	  r‰  ÚTILE_FRAMESÚTG_XÚTG_YÚ	CHUNK_LENrŠ  TrW  r   rï  rk  r=   rœ  r  r?   rt  r�  ) r  r€  rc   rk   rW  r  r  rî   rU  r'  r  re   rñ  Ú#_TILED_FRAME_EXTRACT_BYTE_THRESHOLDrF  rS  r_  r  r‚  r   rÎ  rÊ  rO  rY  r¢  r£  r  r5  rð  r)  rc  r¡  )rf   ri  r	  r[  r  r  r¤  rc  r¥  rQ  Ú	out_bytesrŽ  Útiled_okÚtiled_kernelÚtpr[  r\  r]  r^  Ún_tile_groupsrq  r  rº  r§  r¦  ÚneedrÉ  s                              rh   rF  zSpectralTransform.stft`  sl  € ô 6°mÓDˆØ�6‰6�QŠ;Ø�$š�'‘
‰AØ�V‰V�qŠ[ÜÐ@ÀÇÁÀ	ÐJÓKÐKà—W‘W‰
ˆˆ7ð �K‰Kò 4Ø×$Ñ$¨	Ñ1ò4à×$Ñ$¨Ñ3ð 	ò
 ! W°·
±
Ó%:Ø—*‘* ‘/ˆCØ  1 s¡7Ñ*ˆJØ" T§Z¡ZÑ/°D·O±OÑCÀaÑGˆHØ˜H™ t§z¡zÑ1°AÑ5ˆIô Ÿ™¤# g£,´°H³Ð!>ÄbÇhÁhÔOˆIð ˆHØÔ?Ò?Ü1×;Ñ;Ó=�Ü'×3Ñ3°D·J±JÀÇÁÓP�Ù B NØ9;Ñ6�K  t¨YÜŸ™ aÓ(�AÜ$(§I¡I¨h¸Ñ.DÓ$E�Mà˜aŸg™g˜¨°·±Ð(<Ø §¡Ð0°5¸#°,Ø&¨Ð4°v¸t°nØ ˜¨°iÐ(@ð	�Dñ +Ø ! 4§;¡;°	Ð:Ø!%Ø()¨8°T·Z±ZÐ'@Ð&AØ'(§w¡w iØ+¨dÑ2°D¸!Ð<Ø%)¨4° Oô�Gð  $�Hñ Ü+×6Ñ6Ó8�Ù˜f¨EÑ1ÜŸ™ aÓ(�Aà˜aŸg™g˜¨°·±Ð(<Ø §¡Ð0°5¸#°,ð�Dñ %Ø ! 4§;¡;°	Ð:Ø!%Ø()¨8°T·Z±ZÐ'@Ð&AØ'(§w¡w iØ"Ÿj™j¨(°AÐ6Ü%(¨¨d¯j©jÓ%9¸1¸aÐ$@ô‘Gð #�GàÐ"Ü—v‘v—{‘{ 7¨1¡:°B�{Ó7�Ø—?’?Ø $×"7Ñ"7Ñ7�DØ" eÒ+Ø�KØ—~‘~ a¨¨AÓ.Ð.ô �M‰M˜!Óˆà�;Š;Ü%ØØ—j‘jØŸ?™?Ø $× 4Ñ 4Ø $× 4Ñ 4ôˆAð —7‘7‰ˆˆ5Ø�4—:‘:ÒØ—:‘: Ñ%ˆDÜ—‘�q˜6 A t 9Ð-°JÔ?ˆAØ—w‘w‰HˆAˆuà˜DŸJ™JÑ&¨4¯?©?Ñ:¸QÑ>ˆô —‘ØØ�h §
¡
Ð+Ø˜DŸO™O¨QÐ/ô
ˆð ˜$Ÿ+™+Ñ%ˆô �v‰v�{‰{˜6¨ˆ{Ó+ˆà�?Š?Ø˜$×/Ñ/Ñ/ˆDð ˜eÒ#ØˆKØ�~‰~˜a  AÓ&Ð&rj   )rR  rK  rH  rS  r  rì  c          
      ó  — |dvrt        d«      ‚t        || j                  ¬«      }
t        |	«      }|
dk7  r|dk7  rt        d«      ‚t	        d|
› �«       |j
                  dk(  }|r|d	   }n'|j
                  d
k7  rt        d|j                  › �«      ‚d}d}t        | j                  dz  dz   «      }t        | j                  «      }|dk(  r@|j                  \  }}}t        |«      ||fvrt        d|› d|› dt        |«      › d�«      ‚|}n?|j                  \  }}}t        |«      ||fvrt        d|› d|› dt        |«      › d�«      ‚|}| j                  rD| j                  dk(  r| j                  t        |«      z  }nD| j                  t        |«      dz
  z  }n(| j                  t        |«      dz
  z  | j                  z   }|duxr t        |«      t        |«      kD  }|
dk(  rI|€|j                  ddd«      }| j                  ||¬«      }|€t        d«      ‚t	        d«       |r|d   }|S |
dk(  xrj t        | j                  «      xrS | j                  dk(  xrB t        |«      xr5 |dk(  xr. t        | j                  «      dz  t        | j                  «      k(  }|r>|€|j                  ddd«      }| j                  ||¬«      }|�t	        d«       |r|d   }|S |€|j                  ddd«      }|
dk(  xr) t        | j                  «      xr t        |«      xr |dk(  }|r’t	        d«       	 t!        j"                  |«      }t         j$                  j'                  || j                  d ¬!«      j)                  t         j*                  d"¬#«      }t-        j.                  |t,        j*                  ¬$«      }n7t	        d(«       t,        j$                  j'                  || j                  d ¬!«      }| j8                  r|| j:                  z  }| j=                  |j>                  «      \  }}| j                  |dz
  z  | j                  z   }t@        xr |} |
d)k(  }!| r#tC        | t        |«      |t        |«      ||!¬*«       | r|stE        |||| j                  ||!¬+«      }"�n'tG        ||| j                  ||!¬+«      }#| jI                  ||!¬+«      \  }$}%|#j>                  t,        j*                  k7  r|#j)                  t,        j*                  «      }#|#|%z  }&|r²tE        |||| j                  ||!¬+«      }'t-        jJ                  |'|&«       t-        jL                  |'|&d,¬-«      sft-        jN                  t-        jP                  |'|&z
  «      «      }(t-        jJ                  |(«       t        d.tS        |(jU                  «       «      d/›�«      ‚|'}"n|&}"| j                  r| j                  dk(  r|€t        d0«      ‚| j                  r¿| j                  dz  })|€6t        |"j                  d   «      d|)z  kD  r|"dd…|)|) …f   n
|"dd…dd…f   }"nß|)}*t        |«      }+tW        t        |"j                  d   «      |*|+z   «      },|"dd…|*|,…f   }"|+t        |"j                  d   «      z
  }-|-dkD  r‚t-        jX                  |"d1d|-fg«      }"ng|�et        |«      }+t        |"j                  d   «      |+k\  r|"dd…d|+…f   }"n3t-        jX                  |"d1d|+t        |"j                  d   «      z
  fg«      }"|r|"d   }"|"S # t0        $ rW}t3        j4                  d%|› d&�t6        d¬'«       t,        j$                  j'                  || j                  d ¬!«      }Y d}~�Œ’d}~ww xY w)2aÚ  
        Inverse STFT.
        Input: [B, F, N] (Complex, ``input_layout="bfn"``) or
               [B, N, F] (Complex, ``input_layout="bnf"``)
        Output: [B, T] (Real)

        long_mode_strategy:
          - "native": always use MLX FFT for iFFT (fastest path).
          - "numpy_fallback": for center=True and extended-length requests
            (length > trimmed_length), use NumPy iFFT to reduce cross-framework
            numerical drift in long-mode tails.
          - "torch_fallback": for targeted center=True extended-length requests,
            run torch.istft for strict parity while keeping native MLX path for
            all other cases.
        backend_policy:
          - "auto": use legacy routing rules from long_mode_strategy.
          - "mlx_fft": force MLX iFFT path (no NumPy/Torch fallback route).
          - "metal": same as mlx_fft, but require Metal OLA/envelope kernels.
          - "torch_fallback": force torch.istft path for this call.
        >   rQ  Únumpy_fallbackr;   zPlong_mode_strategy must be one of {'native', 'numpy_fallback', 'torch_fallback'}r  r8   rQ  zGWhen backend_policy is not 'auto', long_mode_strategy must be 'native'.zbackend_policy.call.rY   r«  rõ   z�istft expects a 2D/3D complex spectrogram in [F, N]/[B, F, N] (input_layout='bfn') or [N, F]/[B, N, F] (input_layout='bnf'); got Nr`   r<   zDistft input_layout='bfn' expects frequency bins in axis=1 with size z (onesided) or z (dualsided); got axis=1 size z6. If your input is [B, N, F], pass input_layout='bnf'.zDistft input_layout='bnf' expects frequency bins in axis=2 with size z (dualsided); got axis=2 size z6. If your input is [B, F, N], pass input_layout='bfn'.rA   r;   r   r©  zMbackend_policy='torch_fallback' requested, but torch fallback is unavailable.z*backend_policy.route.torch_fallback_forcedr@   z(backend_policy.route.torch_fallback_autorà  z#backend_policy.route.numpy_fallbackrï  r¬  F)r0  rî  zTnumpy irfft fallback failed; continuing with native MLX irfft path (fallback error: r¹   ©Ú
stacklevelzbackend_policy.route.mlx_irfftr:   )rQ  rG  rR  rH  rç  ræ  çñhãˆµøä>)Úatolzistft mismatch: max diff rU  z;length is required when center_tail_pad='minimal' for istftr  )-rc   r  r  r  r‚   r€  rk   re   rî   rW  r  rU  rð  Ú_istft_torch_fallbackr  rÒ   r/  r1  r¢  r¹  rÿ  r  r'  r  r÷   ÚwarningsÚwarnÚRuntimeWarningr  r4  rB  rÎ  Ú_MLX_OLA_FUSE_NORMrh  r&  r  rY  r²  Úallcloserd   r  r¾  rÇ   rY  rc  ).rf   rV  rG  rO  rR  rK  rH  rS  r  rì  r`  ra  Úorig_2d_inputÚz_bfnÚz_bnfÚonesided_binsÚtwosided_binsr  r»  rQ  Útrimmed_lengthÚis_long_requestÚ	out_torchÚuse_torch_fallbackÚuse_numpy_fallbackÚz_npÚtime_frames_npr¼  ÚerrÚwindow_runtimeÚwindow_sq_runtimerè  Ú	fuse_normrç  r4  r   r  rÒ  Ú
out_legacyÚ	out_fusedÚdiffrc  r  r  rd  r  s.                                                 rh   rG  zSpectralTransform.istftç  sÈ  € ðB Ð%SÑSÜðAóð ô 3ØØ×4Ñ4ô
Ðô !<¸LÓ IÐØ˜vÒ%Ð*<ÀÒ*HÜØYóð ô 	Ð2Ð3CÐ2DÐEÔFàŸ™ 1™ˆÙØ�)‘‰AØ�V‰V�qŠ[ÜðVØVW×V]ÑV]ÐU^ð`óð ð
 ˆØˆÜ˜DŸJ™J¨!™O¨aÑ/Ó0ˆÜ˜DŸJ™J›ˆØ  EÒ)Ø%&§W¡WÑ"ˆAˆy˜(Ü�9‹~ m°]Ð%CÑCÜ ðØ)˜?¨/¸-¸ð I'Ü'*¨9£~Ð&6ð 7KðKóð ð ‰Eà%&§W¡WÑ"ˆAˆx˜Ü�9‹~ m°]Ð%CÑCÜ ðØ)˜?¨/¸-¸ð I'Ü'*¨9£~Ð&6ð 7KðKóð ð ˆEà�;Š;Ø×#Ñ# yÒ0Ø!%§¡´3°x³=Ñ!@‘à!%§¡´C¸³MÀAÑ4EÑ!F‘à!Ÿ_™_´°H³ÀÑ0AÑBÀTÇZÁZÑOˆNØ!¨Ð-ÒV´C¸³KÄ#ÀnÓBUÑ4UˆàÐ/Ò/Øˆ}ØŸ™ A q¨!Ó,�Ø×2Ñ2°5ÀÐ2ÓHˆIØÐ Ü"Øcóð ô  Ð LÔMÙØ% a™L�	ØÐð  Ñ'ò >ä�—‘Óò>ð ×%Ñ%¨Ñ4ò>ô �_Ó%ò	>ð
 $Ð'7Ñ7ò>ô �T—_‘_Ó%¨Ñ)¬S°·±«_Ñ<ð 	ñ Øˆ}ØŸ™ A q¨!Ó,�Ø×2Ñ2°5ÀÐ2ÓHˆIØÐ$Ü#Ð$NÔOÙ Ø )¨!¡�IØ Ð ð ˆ=Ø—K‘K  1 aÓ(ˆEð  Ñ'ò 9Ü�T—[‘[Ó!ò9ä�_Ó%ò9ð $Ð'7Ñ7ð	 	ñ ÜÐ EÔFðIÜ—z‘z %Ó(�ô "$§¡§¡Ø˜DŸJ™J¨Rð ".ó "ç‘&œŸ™¨%�&Ó0ð ô !Ÿh™h ~¼R¿Z¹ZÔH‘ô  Ð @ÔAÜŸ&™&Ÿ,™, u°·
±
À˜,ÓDˆKà�?Š?Ø%¨×(9Ñ(9Ñ9ˆKØ,0×,GÑ,GÈ×HYÑHYÓ,ZÑ)ˆÐ)à—/‘/ X°¡\Ñ2°T·Z±ZÑ?ˆä&Ò6¨;ˆ	Ø)¨WÑ4ˆñ Ü*ØÜ˜X›ØÜ 
Ó+ØØ+õñ ™XÜ%ØØØ!Ø—‘ØØ+ôŠCô %ØØØ—‘ØØ+ôˆGð  $×5Ñ5°hÈmÐ5Ó\ÑˆE�9ð �}‰}¤§
¡
Ò*Ø!Ÿ.™.¬¯©Ó4�Ø  9Ñ,ˆJáÜ/ØØ"Ø%Ø—O‘OØØ"/ô�	ô —‘˜	 :Ô.Ü—{‘{ 9¨j¸tÕDÜŸ6™6¤"§&¡&¨°ZÑ)?Ó"@ÓA�DÜ—G‘G˜D”MÜ&Ð)BÄ5ÈÏÉËÓCUÐVYÐBZÐ'[Ó\Ð\Ø‘à �à�;Š;˜4×/Ñ/°9Ò<ÀÀÜØMóð ð �;Š;Ø—*‘* ‘/ˆCØˆ~Ü*-¨c¯i©i¸©lÓ*;¸qÀ3¹wÒ*G�cš!˜S # ˜X˜+Ò&ÈSÒQRÐTVÐUVÐTVÐQVÉZ‘à�Ü˜V›�Üœ#˜cŸi™i¨™lÓ+¨U°V©^Ó<�Øš!˜U 3˜Y˜,Ñ'�Ø"¤S¨¯©°1©Ó%6Ñ6�	Ø˜q’=ÜŸ&™&  v°°9¨~Ð&>Ó?‘CØÐÜ˜“[ˆFÜ�3—9‘9˜Q‘<Ó  FÒ*Øš!˜W˜f˜W˜*‘o‘ä—f‘f˜S 6¨A¨v¼¸C¿I¹IÀa¹LÓ8IÑ/IÐ+JÐ"KÓL�áØ�a‘&ˆCàˆ
øôK ò IÜ—‘ð(Ø(+ u¨Að/ä"Ø õ	ô !Ÿf™fŸl™l¨5°D·J±JÀR˜lÓH–ûðIús   Ì2B\& Ü&	^Ü/A^Þ^rì  c                óì  — | j                   r| j                  dk7  rt        d«       y	 ddl}	 t        j                  |«      }|j                  d
k7  rt        d|j                  › �«      ‚|j                  |j                  j                  j!                  «       rdnd«      }|j#                  |«      }|j$                  |j&                  k7  r|j)                  |j&                  ¬«      }|j)                  |¬«      }| j*                  j-                  |j.                  «      }|€tt        j                  | j0                  t        j2                  ¬«      }	|j#                  |	«      j)                  ||j2                  ¬«      }|| j*                  |j.                  <   t5        |j                  d   «      }
|
t5        | j6                  «      k7  }t        j8                  «       5  t        j:                  ddt<        ¬«       |j?                  |t5        | j6                  «      t5        | j@                  «      t5        | jB                  «      |tE        | j                   «      tE        | jF                  «      tE        |«      d|�t5        |«      nd¬«
      }ddd«       t        d«       tI        jJ                  jM                  «       j)                  d«      jO                  «       tH        j2                  ¬«      S # t        $ r5}t        d«       t        j                  d|› d�t        d¬	«       Y d}~yd}~ww xY w# 1 sw Y   Œ¥xY w# t        $ r5}t        d«       t        j                  d|› d�t        d¬	«       Y d}~yd}~ww xY w)z>Run torch.istft for strict parity in selected long-mode cases.r@   z2backend.torch_fallback.unsupported_center_tail_padNr   z#backend.torch_fallback.import_errorzPtorch fallback unavailable; continuing with native MLX iFFT path (import error: r¹   rY   rá  rõ   z0expected [B, F, N] spec for torch fallback, got ÚmpsÚcpurî  )r%  )r%  rÎ  r`   ÚignorezIAn output with one or more elements was resized since it had shape \[\].*)ÚmessageÚcategoryF)	rî   rU  r*  rÊ  rW  r  ÚonesidedÚreturn_complexrG  zbackend.torch_fallback.successzbackend.torch_fallback.errorzMtorch fallback failed; continuing with native MLX iFFT path (fallback error: )(rW  r  r‚   Útorchr÷   ræ  rç  rè  r/  r1  r€  rc   rk   r%  Úbackendsrÿ  Úis_availableÚ
from_numpyrÎ  Ú	complex64Útor<  r€   rµ   rÊ  r  re   rî   Úcatch_warningsÚfilterwarningsÚUserWarningrG  rU  r*  rÒ   r  r'  r  ÚdetachÚnumpy)rf   rì  rG  r  r÷  Úspec_npr%  Úspec_tÚwindow_tÚ	window_npr»  r  Úout_ts                rh   rå  z'SpectralTransform._istft_torch_fallbackÞ  sÉ  € ð �;Š;˜4×/Ñ/°;Ò>ÜÐ TÔUØð
	Ûð4	Ü—j‘j Ó'ˆGØ�|‰|˜qÒ Ü Ð#SÐT[×TaÑTaÐSbÐ!cÓdÐdà—\‘\¨5¯>©>×+=Ñ+=×+JÑ+JÔ+L¡%ÐRWÓXˆFØ×%Ñ% gÓ.ˆFØ�|‰|˜uŸ™Ò.ØŸ™¨¯©˜Ó9�Ø—Y‘Y f�YÓ-ˆFà×/Ñ/×3Ñ3°F·K±KÓ@ˆHØÐÜŸJ™J t§{¡{¼"¿*¹*ÔE�	Ø ×+Ñ+¨IÓ6×9Ñ9ÀÈuÏ}É}Ð9Ó]�Ø8@�×(Ñ(¨¯©Ñ5ä˜FŸL™L¨™OÓ,ˆIØ ¤C¨¯
©
£OÑ3ˆHÜ×(Ñ(Õ*ô ×'Ñ'Øð6ô )õð Ÿ™ØÜ˜dŸj™j›/Ü" 4§?¡?Ó3Ü" 4§?¡?Ó3Ø#Ü §¡Ó,Ü# D§O¡OÓ4Ü! (›^Ø#(Ø+1Ð+=œC œKÀ4ð $ó �÷ +ô.  Ð @ÔAÜ—8‘8˜EŸL™L›N×-Ñ-¨eÓ4×:Ñ:Ó<ÄBÇJÁJÔOÐOøôk ò 	ÜÐ EÔFÜ�M‰Mð"Ø"%  að)äØõ	ô ûð	ú÷: +Ð*ûô2 ò 	ÜÐ >Ô?Ü�M‰Mð$Ø$' 5¨ð+äØõ	ô ûð	úsI   ©K( ®F*L5 ÇB-L)ÊA"L5 Ë(	L&Ë1+L!Ì!L&Ì)L2Ì.L5 Ì5	M3Ì>+M.Í.M3)Nrw  )r`   rJ  )r`   NrÞ  )"r—   r˜   r™   rš   r›   re   r	   rž   r   rÒ   r   r   ri   r5   r7   r'  r  rB  r£  rN  rW  r]  rb  rT  rU  rw   rq  r„  r¨  rÏ  rY  rF  rG  rå  rŸ   rj   rh   r   r   8  sØ  „ ñð
€Ið  %)ØðO6ð "ØØØ)2Ø)4Ø Ø.2òO6àðO6ð ðO6ð ˜S‘Mð	O6ð
 ðO6ð ðO6ð ðO6ð ðO6ð 'ðO6ð 'ðO6ð ðO6ð ' s™móO6ðb¨Cð °E¸"¿(¹(ÀBÇHÁHÐ:LÑ4Mó ñ"˜Cð ¨Sð ¸Dó ñ& Sð &°h¸s±mð &Ètó &ð6 Ø $ØØ Ø ØØ(,òð ðð ˜‘ð	ð
 ðð ðð ðð ðð ! ™ðð 
óð: 9>ò °#ó ð& !%ØØ Ø ØØ"*Ø(,Ø!ò?ð ˜‘ð?ð ð	?ð
 ð?ð ð?ð ð?ð  ð?ð ! ™ð?ð ó?ðB BGò F˜rŸx™xð F¸3ð FÈ2Ï8É8ó Fð !%ØØ Ø ØØ"*Ø(,Ø!òà�8‰8ðð ˜‘ð	ð
 ðð ðð ðð ðð  ðð ! ™ðð ðð 
�‰óð< Ø&*ò=!ð ð=!ð ð	=!ð
 ˜s‘mð=!ð 
ó=!ðH ò8/ð ð8/ð ˜S #˜X‘ð	8/ð
 ð8/ð 
ó8/ð|F R§X¡Xð F°"·(±(ó FðX !%ò	gà�8‰8ðgð ˜‘ð	gð
 
�‰ógðT 7<òZ ØðZ Ø/3ðZ à	ˆr�x‰x˜Ÿ™Ð!Ñ	"óZ ðx 9>ò E'�b—h‘hð E'°#ð E'À"Ç(Á(ó E'ðT !%Øð	uð !Ø ØØ"*Ø(,Ø!òuà�8‰8ðuð ˜‘ðuð ð	uð ðuð ðuð ðuð  ðuð ! ™ðuð ðuð 
�‰óuðnGØ—X‘XðGØ*2°3©-ðGà	�"—(‘(Ñ	ôGrj   c            /       óR  — e Zd ZdZdZdddddddd	dd
dddddddddddddœdedededee   dededee   deded e	d!ee   d"e
d#ed$ed%ed&ed'ed(ed)ed*ed+ed,ed-df.d.„Zd/ej&                  d-ej&                  fd0„Zd/ej&                  d-ej&                  fd1„Zd"e
dz  d2edz  d-e
fd3„Zd4ej&                  d"e
d-ej&                  fd5„Zddd6œd/ej&                  d"e
dz  d2edz  d-ej&                  fd7„Zddd6œd/ej&                  d"e
dz  d2edz  d-ej&                  fd8„Zddd6œd"e
dz  d2edz  fd9„Zy):r   a$  Mel spectrogram frontend built on top of :class:`SpectralTransform`.

    Modes:
    - ``mlx_native``: per-example ``top_db`` clipping (batch-independent).
    - ``torchaudio_compat``: torchaudio-compatible packed-batch clipping.
    - ``default``: compatibility alias of ``mlx_native``.
    )r¬  rî   rU  r*  r«  r™  rª  r¾  r¨  r‰  ru  rÂ  Úoutput_scalerý  rþ  rü  Úspectralrí  Ú_compiled_fnsiÀ]  r?  éð   Nr­   rV  ry  rC   r¿  rK   rã  rM   rŽ  rE   rw  Tr>   r@   F)r¬  rî   rU  r*  r«  r™  rª  r¾  r¨  r‰  rÂ  r  rý  rþ  rü  ru  r)  r+  rW  r  r  r  r¬  rî   rU  r*  r«  r™  rª  r¾  r¨  r‰  rÂ  r  rý  rþ  rü  ru  r)  r+  rW  r  r  r  r^   c                ó”  — t        |«      | _        t        |«      | _        t        |«      | _        |�t        |«      n
t        |«      | _        t        |«      | _        t        |«      | _        t        |€| j                  dz  n|«      | _        t        |«      | _	        |	| _
        |
| _        t        |«      }|dk(  rd}|| _        || _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        | j                  dvrt'        d«      ‚| j                  dk  rt'        d«      ‚| j                  dvrt'        d	«      ‚| j"                  d
vrt'        d«      ‚| j                   dk  rt'        d«      ‚| j$                  dk  rt'        d«      ‚t)        | j                  | j                  | j                  ||||d ||d ¬«      | _        t-        | j                  dz  dz   | j                  | j                  | j
                  | j                  | j                  | j                  ¬«      | _        i | _        y )NrY   rG   rE   )rE   rF   zBmode must be one of {"mlx_native", "torchaudio_compat", "default"}r   úpower must be > 0rH   z3output_scale must be one of {"linear", "log", "db"}rL   ú1log_mode must be one of {"clamp", "add", "log1p"}rV  úlog_amin must be > 0zlog_scale must be > 0©rî   rU  r*  r)  r+  rW  r  rÊ  r  r  r  r`   rã  )re   r¬  rî   rU  r*  r«  r¾  r™  rª  r¾  r¨  r‰  rž   ru  rÂ  r  rý  rþ  rü  rc   r0   r  rä  rí  r  )rf   r¬  rî   rU  r*  r«  r™  rª  r¾  r¨  r‰  rÂ  r  rý  rþ  rü  ru  r)  r+  rW  r  r  r  Ú	mode_names                           rh   ri   z MelSpectrogramTransform.__init__G  sý  € ô4 ˜{Ó+ˆÔÜ˜“ZˆŒ
Ü˜j›/ˆŒØ-7Ð-Cœ#˜jœ/ÌÈUËˆŒÜ˜&“kˆŒÜ˜5“\ˆŒ
Ü°E°M˜4×+Ñ+¨qÒ0ÀuÓMˆŒ
Ü˜5“\ˆŒ
ØˆŒ	Ø"ˆŒÜ˜“Iˆ	Ø˜	Ò!Ø$ˆIØˆŒ	ØˆŒÜ Ó-ˆÔÜ˜h›ˆŒÜ˜H›ˆŒÜ˜yÓ)ˆŒØ�9‰9Ð?Ñ?ÜÐaÓbÐbØ�:‰:˜Š?ÜÐ0Ó1Ð1Ø×ÑÐ$;Ñ;ÜÐRÓSÐSØ�=‰=Ð 9Ñ9ÜÐPÓQÐQØ�=‰=˜CÒÜÐ3Ó4Ð4Ø�>‰>˜SÒ ÜÐ4Ó5Ð5ä)Ø—*‘*Ø—‘Ø—‘ØØØØ!ØØ+Ø+Ø!%ô
ˆŒô -Ø—Z‘Z 1‘_ qÑ(Ø—*‘*Ø—*‘*Ø—;‘;Ø×(Ñ(Ø—‘Ø—n‘nô
ˆŒð  ˆÕrj   ri  c           	      ó  — | j                   j                  |d¬«      }| j                  dk(  rôt        j	                  «       }|rÞ|durÚ|j
                  \  }}}t        |«      t        |«      z  t        |«      z  }|j                  t        j                  «      }t        j                  |gt        j                  ¬«      }	 |||	gg |ddft        d|«      ddf|fgt        j                  g¬«      d	   }
|
j                  t        |«      t        |«      t        |«      «      S t        j                  |«      }| j                  d
k(  r|}n$| j                  dk(  r||z  }n|| j                  z  }|j                  t        j                  «      S )z<Return power spectrogram in ``[B, N, F]`` layout (internal).r=   rE  ry  Frî  r`   rW  )r¦  r   r¥  r°  r®  r¯  r   rŽ  )r  rF  r¾  r.  r€   rk   re   Úviewr'  r  r  rñ  rY  rò  r  rÿ  )rf   ri  Úspec_bnfrº  r  ÚNÚFÚtotalr2  r3  r³  Úmagr¾  s                rh   Ú_power_spectrogram_bnfz.MelSpectrogramTransform._power_spectrogram_bnf™  sP  € à—=‘=×%Ñ% a°uÐ%Ó=ˆð
 �:‰:˜ÒÜ(×,Ñ,Ó.ˆFÙ˜&¨Ñ-Ø"Ÿ.™.‘��1�aÜ˜A›¤ Q£™¬#¨a«&Ñ0�Ø!Ÿ™¤r§z¡zÓ2�ÜŸ™ 5 '´·±Ô:�ÙØ" FÐ+ØØ  A˜Ü!$ S¨%£°!°QÐ 7Ø$) 8 *Ü#%§:¡: ,ôð ñ�ð —~‘~¤c¨!£f¬c°!«f´c¸!³fÓ=Ð=ä�f‰f�XÓˆØ�:‰:˜ÒØ‰EØ�Z‰Z˜3ÒØ˜#‘I‰Eà˜4Ÿ:™:Ñ%ˆEØ�|‰|œBŸJ™JÓ'Ð'rj   c                 óL   — t        j                  | j                  |«      d«      S )z1Return power spectrogram in ``[B, F, N]`` layout.rï  )r'  rð  r(  ©rf   ri  s     rh   Úspectrogramz#MelSpectrogramTransform.spectrogramº  s   € ä�|‰|˜D×7Ñ7¸Ó:¸IÓFÐFrj   Úto_dbc                óˆ   — |�|�t        d«      ‚|�t        |«      }n|�|rdnd}n| j                  }|dvrt        d«      ‚|S )Nz)output_scale and to_db cannot both be setrK   rI   rH   z<resolved output_scale must be one of {"linear", "log", "db"})rc   rž   r  )rf   r  r,  Úresolveds       rh   Ú_resolve_output_scalez-MelSpectrogramTransform._resolve_output_scale¾  s_   € ð Ð#¨Ð(9ÜÐHÓIÐIØÐ#Ü˜<Ó(‰HØÐÙ$‘t¨(‰Hà×(Ñ(ˆHØÐ2Ñ2ÜÐ[Ó\Ð\Øˆrj   rö  c                óÌ   — |dk(  r|S |dk(  r-t        || j                  | j                  | j                  ¬«      S | j                  dk(  rdnd}t        |d| j                  |¬«      S )NrI   rJ   ©rý  rþ  rü  rF   rÈ  r¾  ©rÁ  rÂ  ru  )r   rý  rþ  rü  ru  r    rÂ  )rf   rö  r  Údb_modes       rh   Ú_apply_output_scalez+MelSpectrogramTransform._apply_output_scaleÐ  sm   € Ø˜8Ò#ØˆNØ˜5Ò Ü#ØØŸ™ØŸ™ØŸ.™.ô	ð ð $(§9¡9Ð0CÒ#CÑÈð 	ô ˜w¨g¸d¿k¹kÐPWÔXÐXrj   ©r  r,  c                ó    — | j                  |«      }t        || j                  d¬«      }| j                  ||¬«      }| j	                  ||¬«      S )z;Compute mel spectrogram, returning ``[B, n_mels, frames]``.r=   ©rí  rì  r5  ©r  )r(  rô  rí  r/  r4  )rf   ri  r  r,  Úp_bnfrö  r.  s          rh   Úmel_spectrogramz'MelSpectrogramTransform.mel_spectrogramß  sR   € ð ×+Ñ+¨AÓ.ˆÜ'¨°d·k±kÐPUÔVˆØ×-Ñ-¸<ÈuÐ-ÓUˆØ×'Ñ'¨¸hÐ'ÓGÐGrj   c                ó*   — | j                  |||¬«      S )Nr5  ©r:  )rf   ri  r  r,  s       rh   Ú__call__z MelSpectrogramTransform.__call__ì  s   € ð ×#Ñ# A°LÈÐ#ÓNÐNrj   c                ó   ‡ ‡— ‰ j                  ||¬«      Š‰ j                  j                  ‰«      }|�|S t        j                  dt        j
                  dt        j
                  fˆˆ fd„«       }|‰ j                  ‰<   |S )zBReturn a cached compiled mel callable for a fixed output contract.r5  ri  r^   c                 ó*   •— ‰j                  | ‰¬«      S )Nr8  r<  )ri  r.  rf   s    €€rh   rX   z7MelSpectrogramTransform.get_compiled.<locals>._compiled  s   ø€ à×'Ñ'¨¸Ð'ÓAÐArj   )r/  r  r€   r'  r\  r  )rf   r  r,  r‡   rX   r.  s   `    @rh   Úget_compiledz$MelSpectrogramTransform.get_compiledõ  sƒ   ù€ ð ×-Ñ-¸<ÈuÐ-ÓUˆØ×#Ñ#×'Ñ'¨Ó1ˆØÐØˆMä	�‰ð	BœŸ™ð 	B¤b§h¡hõ 	Bó 
ð	Bð (1ˆ×Ñ˜8Ñ$ØÐrj   )r—   r˜   r™   rš   r›   re   r	   r¾  r   r   r   r   r   rž   rÒ   r   r   ri   r'  r  r(  r+  r/  r4  r:  r=  r@  rŸ   rj   rh   r   r   (  s­  „ ñð€Ið2 "ØØØ$(ØØØ!%ØØØ#Ø"&Ø'+ØØ&ØØ$ØØØØ)2Ø)4Ø ò1P ð ðP ð ð	P ð
 ðP ð ˜S‘MðP ð ðP ð ðP ð ˜‰ðP ð ðP ð ðP ð ðP ð ˜‘ðP ð %ðP ð ðP ð  ð!P ð" ð#P ð$ ð%P ð& ð'P ð( ð)P ð* ð+P ð, 'ð-P ð. 'ð/P ð0 ð1P ð2 
ó3P ðd(¨¯©ð (°R·X±Xó (ðBG˜RŸX™Xð G¨"¯(©(ó Gðð % tÑ+ðð �d‰{ð	ð
 
óð$Y¨2¯8©8ð YÀnð YÐY[×YaÑYaó Yð& /3Ø!òHà�8‰8ðHð % tÑ+ð	Hð
 �d‰{ðHð 
�‰óHð" /3Ø!òOà�8‰8ðOð % tÑ+ð	Oð
 �d‰{ðOð 
�‰óOð /3Ø!ò	ð % tÑ+ðð �d‰{ô	rj   r   c            	       óH   ‡ — e Zd ZdZddddœdededed	d
fˆ fd„Zˆ fd„Zˆ xZS )r   z2Convenience wrapper for natural-log mel frontends.rã  rM   rŽ  r1  rý  rþ  rü  r^   Nc                ó.   •— t        ‰| �  dd|||dœ|¤Ž y )NrJ   )r  rý  rþ  rü  rŸ   )Úsuperri   )rf   rý  rþ  rü  ÚkwargsÚ	__class__s        €rh   ri   z#LogMelSpectrogramTransform.__init__  s-   ø€ ô 	‰Ñð 	
ØØØØñ		
ð
 ó	
rj   c                 ó$   •— t         ‰| �  d¬«      S )zAReturn a cached compiled callable for the fixed log-mel contract.rJ   r8  )rC  r@  )rf   rE  s    €rh   r@  z'LogMelSpectrogramTransform.get_compiled  s   ø€ ä‰wÑ#°Ð#Ó7Ð7rj   )	r—   r˜   r™   rš   r¾  r   ri   r@  Ú__classcell__)rE  s   @rh   r   r   	  sH   ø„ Ù<ð
 Ø&Øò
ð ð
ð ð	
ð
 ð
ð 
õ
÷ 8ð 8rj   r   c            #       ó¬  — e Zd ZdZdZdddddddd	d
dddddddœdej                  ej                  z  de	de	de	de
e	   dedededz  dededededededed ed!df"d"„Zd#ej                  d!eej                  ef   fd$„Zd%ej                  d!ej                  fd&„Zd#ej                  d!ej                  fd'„Zd#ej                  d!ej                  fd(„Zd)„ Zy)*r   zGCached shared-STFT frontend for arbitrary frequency-domain filterbanks.)r¬  rî   rU  r*  r¾  r  rÂ  rý  rþ  r)  r+  rW  r  r  r  Ú
filterbankÚfilterbank_n_freqsr  Ú_compiled_fné"V  r?  rŸ  NrŽ  rI   rã  rM   rw  Tr>   r@   F©r¬  rî   rU  r*  r¾  r  rÂ  rý  rþ  r)  r+  rW  r  r  r  rI  r¬  rî   rU  r*  r¾  r  rÂ  rý  rþ  r)  r+  rW  r  r  r  r^   c                óŽ  — t        |«      | _        t        |«      | _        t        |«      | _        |�t        |«      n
t        |«      | _        t        |«      | _        t        |«      | _        || _	        t        |	«      | _
        t        |
«      | _        t        |«      | _        t        |«      | _        t        |«      | _        || _        || _        t        |«      | _        t'        j(                  |t&        j*                  ¬«      | _        | j                  dk  rt/        d«      ‚| j                  dvrt/        d«      ‚| j                  dvrt/        d«      ‚| j                  dk  rt/        d«      ‚| j,                  j0                  d	k7  r"t/        d
| j,                  j2                  › �«      ‚t        | j,                  j2                  d   «      | _        | j4                  | j                  d	z  | j                  d	z  dz   fvrHt/        d| j                  d	z  › d| j                  d	z  dz   › d| j                  › d| j4                  › �«      ‚t7        | j                  | j                  | j                  | j                  | j                  | j                  | j$                  d | j                   | j"                  d ¬«      | _        d | _        y )Nrî  rV  r  rP   zEoutput_scale must be one of {"linear", "log", "db", "log10_plus_one"}rL   r  r  rY   z2filterbank must be rank-2 [n_freqs, n_bands], got r   r`   z!filterbank axis 0 must have size z or z for n_fft=z, got r  )re   r¬  rî   rU  r*  r¾  r¾  rž   r  rÂ  rý  rþ  r)  rÒ   r+  rW  r  r  r  r'  r  r  rI  rc   r€  rk   rJ  r0   r  rK  )rf   rI  r¬  rî   rU  r*  r¾  r  rÂ  rý  rþ  r)  r+  rW  r  r  r  s                    rh   ri   z%FilteredSpectrogramTransform.__init__:  s\  € ô( ˜{Ó+ˆÔÜ˜“ZˆŒ
Ü˜j›/ˆŒØ-7Ð-Cœ#˜jœ/ÌÈUËˆŒÜ˜5“\ˆŒ
Ü Ó-ˆÔØˆŒÜ˜h›ˆŒÜ˜H›ˆŒÜ˜Y›ˆŒÜ˜X›ˆŒÜ˜6“lˆŒØ.ˆÔØ.ˆÔÜ˜zÓ*ˆŒÜŸ(™( :´R·Z±ZÔ@ˆŒØ�:‰:˜ÒÜÐ0Ó1Ð1Ø×ÑÐ$MÑMÜØWóð ð �=‰=Ð 9Ñ9ÜÐPÓQÐQØ�=‰=˜CÒÜÐ3Ó4Ð4Ø�?‰?×Ñ 1Ò$ÜÐQÐRV×RaÑRa×RgÑRgÐQhÐiÓjÐjÜ"% d§o¡o×&;Ñ&;¸AÑ&>Ó"?ˆÔØ×"Ñ"¨4¯:©:¸©?¸D¿J¹JÈ!¹OÈaÑ<OÐ*PÑPÜØ3°D·J±JÀ!±OÐ3DÀDÈÏÉÐWXÉÐ[\ÑI\ÐH]ð ^Ø!ŸZ™Z˜L¨¨t×/FÑ/FÐ.GðIóð ô *Ø—*‘*Ø—‘Ø—‘Ø—n‘nØ—]‘]Ø—;‘;Ø—‘ØØ ×0Ñ0Ø ×0Ñ0Ø!%ô
ˆŒð !ˆÕrj   ri  c                 óè  — t        |d¬«      \  }}| j                  rª| j                  dk(  r›t        |j                  d   «      | j
                  dz  k  rst        || j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  ¬«
      \  }}nO| j                  j                  |d¬«      }t        j                   |«      j#                  t        j$                  «      }t        |j                  d   «      | j&                  k7  r|d d …d | j&                  …d d …f   }| j(                  d	k(  r|}n$| j(                  d
k(  r||z  }n|| j(                  z  }t        j*                  t        j,                  |d«      | j.                  «      }t        j,                  |d«      j#                  t        j$                  «      }	|	|fS )Nr#   ©Úfn_namer>   r`   rY   ©	r¬  rî   rU  r*  r)  r+  rW  r  r  r<   rE  rŽ  ry  rï  )Ú_ensure_audio_batchrW  r  re   rk   rî   Ú_stft_magnituder¬  rU  r*  r)  r+  r  r  rF  r'  r  rÿ  r  rJ  r¾  rñ  rð  rI  )
rf   ri  Úx_bÚsqueezedÚmag_bfnrŠ   r§  Úspec_bfnÚfiltered_bntÚfiltered_btns
             rh   Ú_filtered_linearz-FilteredSpectrogramTransform._filtered_linear  s‰  € Ü+¨AÐ7MÔN‰ˆˆXà�KŠKØ×$Ñ$¨	Ò1Ü�C—I‘I˜a‘LÓ! d§j¡j°A¡oÒ6ä(ØØ ×,Ñ,Ø—j‘jØŸ?™?ØŸ?™?ØŸ.™.ØŸ™Ø—{‘{Ø $× 4Ñ 4Ø $× 4Ñ 4ô‰JˆG‘Qð —=‘=×%Ñ% c¸Ð%Ó?ˆDÜ—f‘f˜T“l×)Ñ)¬"¯*©*Ó5ˆGÜˆw�}‰}˜QÑÓ  D×$;Ñ$;Ò;ØšaÐ!: 4×#:Ñ#:Ð!:ºAÐ=Ñ>ˆGØ�:‰:˜ÒØ‰HØ�Z‰Z˜3ÒØ Ñ(‰Hà $§*¡*Ñ,ˆHÜ—y‘y¤§¡¨h¸	Ó!BÀDÇOÁOÓTˆÜ—|‘| L°)Ó<×CÑCÄBÇJÁJÓOˆØ˜XÐ%Ð%rj   rZ  c                 ó   — | j                   dk(  r|S | j                   dk(  r"t        || j                  | j                  ¬«      S | j                   dk(  r5t	        j
                  |dz   «      j                  t        j                  «      S | j                  dk(  rdnd}t        ||| j                  d¬	«      j                  t        j                  «      S )
NrI   rJ   )rý  rþ  rQ   rŽ  rÆ  r¾  rÈ  r2  )r  r   rý  rþ  r'  r–  rÿ  r  r¾  r    rÂ  )rf   rZ  rÁ  s      rh   r4  z0FilteredSpectrogramTransform._apply_output_scale¡  s¶   € Ø×Ñ Ò(ØÐØ×Ñ Ò%Ü#ØØŸ™ØŸ™ôð ð
 ×ÑÐ 0Ò0Ü—8‘8˜L¨3Ñ.Ó/×6Ñ6´r·z±zÓBÐBØ>B¿j¹jÈCÒ>O©{ÐU\ˆÜØØØ—;‘;Øô	
÷
 ‰&”—‘Ó
ð	rj   c                 óf   — | j                  |«      \  }}| j                  |«      }t        ||¬«      S )N©rV  )r[  r4  Ú_restore_feature_batch)rf   ri  rZ  rV  r4  s        rh   r#   z1FilteredSpectrogramTransform.filtered_spectrogram´  s4   € Ø!%×!6Ñ!6°qÓ!9Ñˆ�hØ×&Ñ& |Ó4ˆÜ% c°HÔ=Ð=rj   c                 ó$   — | j                  |«      S rn   ©r#   r*  s     rh   r=  z%FilteredSpectrogramTransform.__call__¹  s   € Ø×(Ñ(¨Ó+Ð+rj   c                 ó¨   ‡ — ‰ j                   }|�|S t        j                  dt        j                  dt        j                  fˆ fd„«       }|‰ _         |S )z7Return a cached compiled filtered-spectrogram callable.ri  r^   c                 ó&   •— ‰j                  | «      S rn   ra  ©ri  rf   s    €rh   rX   z<FilteredSpectrogramTransform.get_compiled.<locals>._compiledÂ  s   ø€ à×,Ñ,¨QÓ/Ð/rj   ©rK  r'  r\  r  ©rf   r‡   rX   s   `  rh   r@  z)FilteredSpectrogramTransform.get_compiled¼  sU   ø€ à×"Ñ"ˆØÐØˆMä	�‰ð	0œŸ™ð 	0¤b§h¡hô 	0ó 
ð	0ð &ˆÔØÐrj   )r—   r˜   r™   rš   r›   r'  r  r/  Úndarrayre   r	   r¾  r   r   rž   rÒ   r   r   ri   rw   r[  r4  r#   r=  r@  rŸ   rj   rh   r   r   !  s�  „ ÙQð€Ið4 "ØØØ$(ØØ,4Ø#ØØ&ØØØØ)2Ø)4Ø ò%C!ð —H‘H˜rŸz™zÑ)ðC!ð ð	C!ð
 ðC!ð ðC!ð ˜S‘MðC!ð ðC!ð *ðC!ð ˜‘ðC!ð ðC!ð ðC!ð ðC!ð ðC!ð ðC!ð  'ð!C!ð" 'ð#C!ð$ ð%C!ð& 
ó'C!ðJ & "§(¡(ð  &¨u°R·X±X¸t°^Ñ/Dó  &ðD°·±ð ¸R¿X¹Xó ð&> b§h¡hð >°2·8±8ó >ð
,˜"Ÿ(™(ð , r§x¡xó ,órj   r   rL  rŸ  rI   rã  rM   rw  r>   r@   rM  rI  r  r  c                ó„   — t        di d|“d|“d|“d|“d|“d|“d|“d|“d	|	“d
|
“d|“d|“d|“d|“d|“d|“Ž} || «      S )NrI  r¬  rî   rU  r*  r¾  r  rÂ  rý  rþ  r)  r+  rW  r  r  r  rŸ   )r   )ri  rI  r¬  rî   rU  r*  r¾  r  rÂ  rý  rþ  r)  r+  rW  r  r  r  rP  s                     rh   r#   r#   Ê  s¶   € ô( -ò Ùðáðñ ðñ ð	ñ
 ðñ ðñ "ðñ ðñ ðñ ðñ ðñ ðñ ðñ (ðñ (ðñ  ð!€Iñ$ �Q‹<Ðrj   rx  )Ú
diff_ratioÚ
frame_sizeÚhop_sizeri  c           
      óÌ  — t        | «      } t        |«      }t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚d|cxk  rdk  st        d«      ‚ t        d«      ‚t        j                  | «      }t        t        j
                  ||t        |j                  «       «      z  kD  «      «      }t        |«      dz  |z
  }t        t        dt        ||z  «      «      «      S )	Nr   zframe_size must be > 0zhop_size must be > 0rV  rŽ  zdiff_ratio must be in (0, 1]rY   r`   )	re   r¾  rc   r/  ÚhanningÚargmaxrd   rƒ   Úround)rj  rk  ri  rÊ  ÚsampleÚdiff_sampless         rh   Ú_diff_frames_from_hannrr  ó  sÔ   € ô �Z“€JÜ�8‹}€HÜ�zÓ"€JØ�Q‚ÜÐ1Ó2Ð2Ø�1‚}ÜÐ/Ó0Ð0Ø�*Ô# Ò#ÜÐ7Ó8Ð8ð $ÜÐ7Ó8Ð8Ü�Z‰Z˜
Ó#€FÜ”—‘˜6 J´°v·z±z³|Ó1DÑ$DÑDÓEÓF€FÜ�v“; ‘? VÑ+€LÜŒs�1”e˜L¨8Ñ3Ó4Ó5Ó6Ð6rj   rï  )Úlagrj  rk  ri  Ú	time_axisrs  rt  c                ó¼  — | j                   dk  rt        d| j                  › �«      ‚|�|€|�t        d«      ‚|€'|�|€d}n t        t	        |«      t	        |«      |¬«      }t	        |«      }|dk  rt        d«      ‚t	        |«      }|dk\  r|n| j                   |z   }|dk  s|| j                   k\  rt        d	|› d
| j                  › �«      ‚t        j                  | |d«      }t        j                  |«      }|d|d…f   |dd| …f   z
  |d|d…f<   t        j                  |d«      j                  t
        j                  «      }t        j                  |d|«      S )z<Half-wave rectified spectral difference over the frame axis.rY   z4positive_spectral_diff expects at least 2 dims, got Nz0pass either lag or frame_size/hop_size, not bothr`   )rj  rk  ri  r   zlag must be > 0z
time_axis z is out of bounds for shape rï  .rV  )r€  rc   rk   rr  re   r'  Úmoveaxisró  r—  rÿ  r  )	ri  rs  rj  rk  ri  rt  rl  Úmovedrý  s	            rh   r%   r%     s^  € ð 	‡v�v�‚zÜÐOÐPQ×PWÑPWÈyÐYÓZÐZØ
€˜JÐ2°hÐ6JÜÐKÓLÐLØ
€{ØÐ Ð!1Ø‰Cä(Ü˜z›?Ü˜X›Ø%ôˆCô
 ˆc‹(€CØ
ˆa‚xÜÐ*Ó+Ð+Üˆy‹>€DØ˜1’9‰4 !§&¡&¨4¡-€DØˆa‚x�4˜1Ÿ6™6’>Ü˜: i [Ð0LÈQÏWÉWÈIÐVÓWÐWÜ�K‰K˜˜4 Ó$€EÜ�=‰=˜Ó€DØ˜C ¡˜IÑ&¨¨s°E°c°T°E¨zÑ):Ñ:€Dˆˆc‰dˆ�OÜ�:‰:�d˜CÓ ×'Ñ'¬¯
©
Ó3€DÜ�;‰;�t˜R Ó&Ð&rj   c                   óÊ   — e Zd ZdZdZdddddddd	d
œdededededededededdfd„Zdej                  dej                  fd„Z
dej                  dej                  fd„Zd„ Zy)r   zCHybrid CQT built from cached CQT bases plus shared STFT transforms.)ÚsrrU  ÚfminÚn_binsÚbins_per_octaveÚfilter_scaler¨  ÚsparsityÚn_pseudoÚn_fullÚ	n_octavesÚ_pseudo_basisÚ_pseudo_scaleÚ_pseudo_stftÚ_pseudo_short_stftÚ_octave_basesÚ_octave_stftsÚ_octave_short_stftsÚ_scale_factorsrK  rL  rŸ  çV¹ÂPZ@@éT   é   rŽ  ç{®Gáz„?©ry  rU  rz  r{  r|  r}  r¨  r~  ry  rU  rz  r{  r|  r}  r¨  r~  r^   Nc                óü  — t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _	        | j                  dk  rt        d«      ‚| j                  dk  rt        d«      ‚| j                  dk  rt        d«      ‚| j
                  dk  rt        d«      ‚| j                  dk  rt        d«      ‚| j                  dk  rt        d«      ‚| j                  dk  rt        d	«      ‚d| j                  cxk  rd
k  st        d«      ‚ t        d«      ‚t        | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  «      }	t        |	d   «      | _        t        |	d   «      | _        t        |	d   «      | _        |	d   | _        |	d   }
|
€d | _        d | _        d | _        d | _        nut        |
d   «      }|
d   | _        t        |
d   «      | _        t)        || j                  |ddddd ddd ¬«      | _        t)        || j                  |ddddd ddd ¬«      | _        g }g }g }|	d   D ]—  \  }}}|j+                  |«       |j+                  t)        t        |«      t        |«      t        |«      ddddd ddd ¬«      «       |j+                  t)        t        |«      t        |«      t        |«      ddddd ddd ¬«      «       Œ™ t-        |«      | _        t-        |«      | _        t-        |«      | _        d | _        y )Nr   zsr must be > 0úhop_length must be > 0rV  úfmin must be > 0ún_bins must be > 0úbins_per_octave must be > 0zfilter_scale must be > 0znorm must be > 0rŽ  zsparsity must lie in [0, 1)r  r€  r�  Úscale_factorsÚpseudorî   ÚbasisÚscalerw  TFr>   r@   r  r?   Úoctaves)re   ry  rU  r¾  rz  r{  r|  r}  r¨  r~  rc   Ú_cached_hybrid_cqt_planr  r€  r�  r‰  r‚  rƒ  r„  r…  r0   rÆ   rw   r†  r‡  rˆ  rK  )rf   ry  rU  rz  r{  r|  r}  r¨  r~  ÚplanÚpseudo_planÚpseudo_nfftÚoctave_basesÚoctave_stftsÚoctave_short_stftsr–  Úoctave_nfftÚ
octave_hops                     rh   ri   zHybridCQTTransform.__init__G  sw  € ô �b“'ˆŒÜ˜j›/ˆŒÜ˜$“KˆŒ	Ü˜&“kˆŒÜ" ?Ó3ˆÔÜ! ,Ó/ˆÔÜ˜$“KˆŒ	Ü˜h›ˆŒØ�7‰7�aŠ<ÜÐ-Ó.Ð.Ø�?‰?˜aÒÜÐ5Ó6Ð6Ø�9‰9˜ÒÜÐ/Ó0Ð0Ø�;‰;˜!ÒÜÐ1Ó2Ð2Ø×Ñ 1Ò$ÜÐ:Ó;Ð;Ø×Ñ Ò#ÜÐ7Ó8Ð8Ø�9‰9˜ÒÜÐ/Ó0Ð0Ø�d—m‘mÔ) cÒ)ÜÐ:Ó;Ð;ð *ÜÐ:Ó;Ð;ä&Ø�G‰GØ�O‰OØ�I‰IØ�K‰KØ× Ñ Ø×ÑØ�I‰IØ�M‰Mó	
ˆô ˜D Ñ,Ó-ˆŒÜ˜$˜x™.Ó)ˆŒÜ˜T +Ñ.Ó/ˆŒØ" ?Ñ3ˆÔà˜8‘nˆØÐØ!%ˆDÔØ!%ˆDÔØ $ˆDÔØ&*ˆDÕ#ä˜k¨'Ñ2Ó3ˆKØ!,¨WÑ!5ˆDÔÜ!& {°7Ñ';Ó!<ˆDÔÜ 1Ø!ØŸ?™?Ø&Ø ØØØ ØØ )Ø +Ø%)ô!ˆDÔô '8Ø!ØŸ?™?Ø&Ø ØØØ ØØ *Ø +Ø%)ô'ˆDÔ#ð (*ˆØ02ˆØ68ÐØ.2°9¬oÑ*ˆE�; 
Ø×Ñ Ô&Ø×ÑÜ!Ü˜kÓ*Ü" :›Ü" ;Ó/Ø$Ø!ØØ$ØØ$-Ø$/Ø)-ôôð ×%Ñ%Ü!Ü˜kÓ*Ü" :›Ü" ;Ó/Ø$Ø!ØØ$ØØ$.Ø$/Ø)-ôõð# />ô@ # <Ó0ˆÔÜ" <Ó0ˆÔÜ#(Ð);Ó#<ˆÔ Ø ˆÕrj   ri  c           
      óz  — t        |d¬«      \  }}g }| j                  dkD  �rng }|}t        | j                  «      D ]ï  \  }}| j                  |   }	t        |j                  d   «      t        |j                  «      dz  kD  r|}	|	j                  |d¬«      }
t        j                  t        j                  | j                  |   d d d …d d …f   |
«      «      j                  t        j                  «      }|j                  |«       |t!        | j                  «      dz
  k  sŒåt#        |«      }Œñ t%        d„ |D «       «      }|D �cg c]  }|d d …d d …d |…f   ‘Œ }}|j'                  «        |j                  t        j(                  |d¬	«      «       | j*                  dkD  �r2| j,                  €J ‚| j.                  €J ‚| j0                  €J ‚| j2                  }t        |j                  d   «      t        | j0                  j                  «      dz  kD  r| j0                  }|€J ‚t        j                  |j                  |d¬«      «      j                  t        j                  «      }t        j                  | j,                  d d d …d d …f   |«      t5        | j.                  «      z  j                  t        j                  «      }|j                  |«       |st7        d
«      ‚t        j(                  |d¬	«      }|| j8                  d d d …d f   z  j                  t        j                  «      }t;        ||¬«      S c c}w )Nr$   rP  r   r`   rY   r<   rE  c              3   óL   K  — | ]  }t        |j                  d    «      –— Œ y­w)rY   N)re   rk   )rq   Úos     rh   rs   z0HybridCQTTransform.hybrid_cqt.<locals>.<genexpr>Ø  s   è ø€ ÐE±n°œS §¡¨¡Ÿ_±nùs   ‚"$rk  z-HybridCQTTransform produced no octave resultsr^  )rS  r€  Ú	enumerater‡  rˆ  re   rk   rî   rF  r'  r  rñ  r†  rÿ  r  rÆ   rƒ   Ú_downsample_2x_batchedrY  Úreverserm  r  r‚  rƒ  r„  r…  r¾  r  r‰  r_  )rf   ri  rU  rV  ÚresultsÚoctave_resultsÚoctave_audior…  rF  Úcurrent_stftr§  Úcqt_octÚ
min_framesr¤  r.  Úpseudo_stftÚspec_magÚ
pseudo_cqtÚcqts                      rh   r$   zHybridCQTTransform.hybrid_cqtÈ  sÈ  € Ü+¨A°|ÔD‰ˆˆXØ"$ˆà�;‰;˜‹?Ø-/ˆNØˆLÜ& t×'9Ñ'9Ö:‘	��TØ#×7Ñ7¸Ñ<�Ü�|×)Ñ)¨!Ñ,Ó-´°T·Z±Z³ÀAÑ1EÒFØ#'�LØ#×(Ñ(¨ÀUÐ(ÓK�ÜŸ&™&¤§¡¨4×+=Ñ+=¸cÑ+BÀ4ÊÊAÀ:Ñ+NÐPTÓ!UÓV×]Ñ]Ô^`×^hÑ^hÓi�Ø×%Ñ% gÔ.Øœ˜T×/Ñ/Ó0°1Ñ4Ó4Ü#9¸,Ó#G‘Lð ;ô ÑE±nÓEÓEˆJÙ5CÓD±^°�qššA˜{ 
˜{Ð*Ó+°^ˆGÐDØ�O‰OÔØ�N‰Nœ2Ÿ>™>¨'¸Ô:Ô;à�=‰=˜1ÓØ×%Ñ%Ð1Ð1Ð1Ø×%Ñ%Ð1Ð1Ð1Ø×$Ñ$Ð0Ð0Ð0Ø×1Ñ1ˆKÜ�3—9‘9˜Q‘<Ó ¤C¨×(9Ñ(9×(?Ñ(?Ó$@ÀAÑ$EÒFØ"×/Ñ/�ØÐ*Ð*Ð*Ü—v‘v˜k×.Ñ.¨sÀ%Ð.ÓHÓI×PÑPÔQS×Q[ÑQ[Ó\ˆHä—	‘	˜$×,Ñ,¨T²1²a¨ZÑ8¸(ÓCÄeÈD×L^ÑL^ÓF_Ñ_ß‰f”R—Z‘ZÓ ð ð �N‰N˜:Ô&áÜÐNÓOÐOÜ�n‰n˜W¨1Ô-ˆØ�T×(Ñ(¨ªq°$¨Ñ7Ñ7×?Ñ?ÄÇ
Á
ÓKˆÜ% c°HÔ=Ð=ùò- Es   ÅL8c                 ó$   — | j                  |«      S rn   ©r$   r*  s     rh   r=  zHybridCQTTransform.__call__ñ  s   € Ø�‰˜qÓ!Ð!rj   c                 ó¨   ‡ — ‰ j                   }|�|S t        j                  dt        j                  dt        j                  fˆ fd„«       }|‰ _         |S )zDReturn a cached compiled hybrid-CQT callable for steady-shape loops.ri  r^   c                 ó&   •— ‰j                  | «      S rn   r³  rd  s    €rh   rX   z2HybridCQTTransform.get_compiled.<locals>._compiledú  s   ø€ à—?‘? 1Ó%Ð%rj   re  rf  s   `  rh   r@  zHybridCQTTransform.get_compiledô  sU   ø€ à×"Ñ"ˆØÐØˆMä	�‰ð	&œŸ™ð 	&¤b§h¡hô 	&ó 
ð	&ð &ˆÔØÐrj   )r—   r˜   r™   rš   r›   re   r¾  ri   r'  r  r$   r=  r@  rŸ   rj   rh   r   r   -  sÌ   „ ÙMð€Ið4 ØØ'ØØ!Ø!ØØò!ð ð!ð ð	!ð
 ð!ð ð!ð ð!ð ð!ð ð!ð ð!ð 
ó!ðB'>˜BŸH™Hð '>¨¯©ó '>ðR"˜"Ÿ(™(ð " r§x¡xó "órj   r   rš  ry  rz  r{  r|  r}  r~  c                 ó¸   — t        t        | «      t        |«      t        |«      t        |«      t        |«      t        |«      t        |«      t        |«      ¬«      S )NrŽ  )r   re   r¾  rŽ  s           rh   Ú_cached_hybrid_cqt_transformr·    sK   € ô Üˆr‹7Ü�z“?Ü�4‹[Ü�6‹{Ü˜OÓ,Ü˜<Ó(Ü�4‹[Ü�x“ô	ð 	rj   rŠ  r‹  rŒ  r�  rŽ  c                óÆ   — t        t        |«      t        |«      t        |«      t        |«      t        |«      t        |«      t        |«      t        |«      «      }	 |	| «      S )z6Compute a hybrid CQT magnitude spectrogram from audio.)r·  re   r¾  )
ri  ry  rU  rz  r{  r|  r}  r¨  r~  rP  s
             rh   r$   r$     sT   € ô -ÜˆB‹ÜˆJ‹Üˆd‹ÜˆF‹ÜˆOÓÜˆlÓÜˆd‹Üˆh‹ó	€Iñ �Q‹<Ðrj   c            %       ó  — e Zd ZdZdZddddddd	dd
d
ddddddddœdededededee   dededee   dede	dee   de
ded ed!ed"ed#ed   dz  d$df$d%„Zd&ej"                  d$ej"                  fd'„Zd&ej"                  d$ej"                  fd(„Zd)„ Zy)*r   z?MFCC frontend built on top of :class:`MelSpectrogramTransform`.)r¬  rÛ  rî   rU  r*  r«  r™  rª  r¨  r‰  rÂ  r)  rW  r  r  rè  Údct_normÚmel_transformÚdct_matÚ
_dct_mat_tÚ_lifter_weightsrK  rL  é   r?  rŸ  Nr­   rV  rD   r¿  rw  Tr>   r@   r   rÙ  ©r¬  rÛ  rî   rU  r*  r«  r™  rª  r¨  r‰  rÂ  r)  rW  r  r  rè  rº  r¬  rÛ  rî   rU  r*  r«  r™  rª  r¨  r‰  rÂ  r)  rW  r  r  rè  rº  r^   c                óþ  — t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        |�t        |«      n
t        |«      | _        t        |«      | _        t        |«      | _        t        |€| j                  dz  n|«      | _	        |	| _
        |
| _        || _        t        |«      | _        t        |«      | _        || _        || _        t        |«      | _        || _        | j                  dk  rt+        d«      ‚| j                  dk  rt+        d«      ‚| j                  | j                  kD  rt+        d«      ‚| j&                  dk  rt+        d«      ‚| j(                  dvrt+        d«      ‚t-        di d	| j                  “d
| j                  “d| j                  “d| j
                  “d| j                  “d| j                  “d| j                  “dd“d| j                  “d| j                  “d| j                  “dd“d| j                  “dd“d| j                   “d| j"                  “d| j$                  “dd“Ž| _        t1        | j                  | j                  | j(                  «      | _        t5        | j                  | j                  | j(                  «      | _        | j&                  dkD  r-t9        | j                  | j&                  «      | _        d | _        y d | _        d | _        y ) NrY   r   rÝ  r®  rÞ  úlifter must be >= 0rß  ú'dct_norm must be one of {None, "ortho"}r¬  rî   rU  r*  r«  r™  rª  r¾  ry  r¨  r‰  rÂ  ru  rE   r)  r+  TrW  r  r  r  FrŸ   )re   r¬  rÛ  rî   rU  r*  r«  r¾  r™  rª  r¨  r‰  rÂ  rž   r)  rÒ   rW  r  r  rè  rº  rc   r   r»  rç  r¼  Ú_cached_dct_matrix_tr½  rë  r¾  rK  )rf   r¬  rÛ  rî   rU  r*  r«  r™  rª  r¨  r‰  rÂ  r)  rW  r  r  rè  rº  s                     rh   ri   zMFCCTransform.__init__O  s¶  € ô* ˜{Ó+ˆÔÜ˜&“kˆŒÜ˜“ZˆŒ
Ü˜j›/ˆŒØ-7Ð-Cœ#˜jœ/ÌÈUËˆŒÜ˜&“kˆŒÜ˜5“\ˆŒ
Ü°E°M˜4×+Ñ+¨qÒ0ÀuÓMˆŒ
ØˆŒ	Ø"ˆŒØˆŒÜ˜Y›ˆŒÜ˜6“lˆŒØ.ˆÔØ.ˆÔÜ˜&“kˆŒØ ˆŒà�;‰;˜!ÒÜÐ1Ó2Ð2Ø�;‰;˜!ÒÜÐ1Ó2Ð2Ø�;‰;˜Ÿ™Ò$ÜÐ7Ó8Ð8Ø�;‰;˜Š?ÜÐ2Ó3Ð3Ø�=‰= Ñ/ÜÐFÓGÐGä4ò 
Ø×(Ò(ð
à—*’*ð
ð —’ð
ð —’ð	
ð
 —;’;ð
ð —*’*ð
ð —*’*ð
ñ ð
ð —’ð
ð —n’nð
ð —;’;ð
ñ ð
ð —n’nð
ñ ð
ð —;’;ð
ð  !×0Ò0ð!
ð" !×0Ò0ð#
ñ$ ð%
ˆÔô( *¨$¯+©+°t·{±{ÀDÇMÁMÓRˆŒÜ.¨t¯{©{¸D¿K¹KÈÏÉÓWˆŒØ�;‰;˜Š?Ü#9¸$¿+¹+ÀtÇ{Á{Ó#SˆDÔ ð !ˆÕð $(ˆDÔ Ø ˆÕrj   ri  c                 ó.  — |j                   dk(  }|r
|ddd…f   }n'|j                   dk7  rt        d|j                  › �«      ‚| j                  j	                  |d¬«      }t        || j                  | j                  ¬«      }|r|j                  d«      }|S )	zICompute MFCCs, returning ``[B, n_mfcc, frames]`` or ``[n_mfcc, frames]``.r`   NrY   z!mfcc expects 1D or 2D input, got T©r,  ©r÷  rõ  r   )	r€  rc   rk   r»  r:  rû  r½  r¾  Úsqueeze)rf   ri  rV  rö  rú  s        rh   r&   zMFCCTransform.mfcc�  s“   € à—6‘6˜Q‘;ˆÙØ�$š�'‘
‰AØ�V‰V�qŠ[ÜÐ@ÀÇÁÀ	ÐJÓKÐKà×$Ñ$×4Ñ4°Q¸dÐ4ÓCˆÜ)ØØ—o‘oØ×/Ñ/ô
ˆñ
 Ø×'Ñ'¨Ó*ˆHØˆrj   c                 ó$   — | j                  |«      S rn   ©r&   r*  s     rh   r=  zMFCCTransform.__call__¯  s   € Ø�y‰y˜‹|Ðrj   c                 ó¨   ‡ — ‰ j                   }|�|S t        j                  dt        j                  dt        j                  fˆ fd„«       }|‰ _         |S )zAReturn a cached compiled MFCC callable for fixed-shape hot loops.ri  r^   c                 ó&   •— ‰j                  | «      S rn   rÊ  rd  s    €rh   rX   z-MFCCTransform.get_compiled.<locals>._compiled¸  s   ø€ à—9‘9˜Q“<Ðrj   re  rf  s   `  rh   r@  zMFCCTransform.get_compiled²  sU   ø€ à×"Ñ"ˆØÐØˆMä	�‰ð	 œŸ™ð 	 ¤b§h¡hô 	 ó 
ð	 ð &ˆÔØÐrj   )r—   r˜   r™   rš   r›   re   r	   r¾  r   r   rž   rÒ   r   r   r   ri   r'  r  r&   r=  r@  rŸ   rj   rh   r   r   3  s_  „ ÙIð€Ið8 "ØØØØ$(ØØØ!%Ø Ø&Ø"&ØØØ)2Ø)4ØØ,3ò'L!ð ðL!ð ð	L!ð
 ðL!ð ðL!ð ˜S‘MðL!ð ðL!ð ðL!ð ˜‰ðL!ð ðL!ð ðL!ð ˜‘ðL!ð ðL!ð ðL!ð  'ð!L!ð" 'ð#L!ð$ ð%L!ð& ˜'Ñ" TÑ)ð'L!ð( 
ó)L!ð\�b—h‘hð  2§8¡8ó ð$˜"Ÿ(™(ð  r§x¡xó órj   r   r¿  rV  rÀ  rº  c                óŠ   — t        di d|“d|“d|“d|“d|“d|“d|“d|“d	|	“d
|
“d|“d|“d|“d|“d|“d|“d|“Ž} || «      S )z„Compute MFCCs from raw audio.

    Returns ``[n_mfcc, frames]`` for 1-D input or ``[B, n_mfcc, frames]`` for
    batched input.
    r¬  rÛ  rî   rU  r*  r«  r™  rª  r¨  r‰  rÂ  r)  rW  r  r  rè  rº  rŸ   )r   )ri  r¬  rÛ  rî   rU  r*  r«  r™  rª  r¨  r‰  rÂ  r)  rW  r  r  rè  rº  rP  s                      rh   r&   r&   À  sÀ   € ô4 ò Ùðáðñ ðñ ð	ñ
 ðñ ðñ ðñ ðñ ðñ ðñ ðñ ðñ ðñ (ðñ (ðñ  ð!ñ" ð#€Iñ& �Q‹<Ðrj   )r'   r)   r*   r+   r,   r&   Ún_chromaÚtuningc                 óh   — t        t        | «      t        |«      t        |«      t        |«      ¬«      S )N©r¬  rî   rÎ  rÏ  )Ú_chroma_filterbankre   r¾  rÑ  s       rh   Ú_cached_chroma_filterbankrÓ  þ  s.   € ô Ü˜Ó$Ü�%‹jÜ�X“Ü�V‹}ô	ð rj   rQ  c                ó�   — | j                   dk(  r| d d d …f   dfS | j                   dk7  rt        |› d| j                  › �«      ‚| dfS )Nr`   TrY   z expects 1D or 2D input, got F)r€  rc   rk   )ri  rQ  s     rh   rS  rS    sO   € Ø‡v�v�‚{Ø�’q�‰z˜4ÐÐØ‡v�v�‚{Ü˜G˜9Ð$AÀ!Ç'Á'ÀÐKÓLÐLØˆeˆ8€Orj   rV  c                ó   — |r| d   S | S r  rŸ   )ri  rV  s     rh   r_  r_    s   € Ùˆ1ˆQ‰4Ð" Ð"rj   c                 óL  — t        | «      } t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚t        j                  j	                  |dt        | «      z  ¬«      j                  t        j                  «      }t        j                  |t        j                  ¬«      S )Nr   r¯  ún_fft must be > 0rŽ  ©r’  r»   rî  )
re   rc   r/  r¢  Úrfftfreqr¾  rÿ  r  r'  r  )r¬  rî   r¦  s      rh   Ú_fft_frequenciesrÚ    s€   € Ü�kÓ"€KÜ�‹J€EØ�aÒÜÐ2Ó3Ð3Ø�‚zÜÐ,Ó-Ð-Ü�F‰F�O‰O˜e s¬U°;Ó-?Ñ'?ˆOÓ@×GÑGÌÏ
É
ÓS€EÜ�8‰8�E¤§¡Ô,Ð,rj   Úinclude_nyquistc                óº  — t        | «      } t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚|rR|dz
  dz  }t        j                  j	                  |dt        | «      z  ¬«      j                  t        j                  «      S |dz  }t        j                  j                  |dt        | «      z  ¬«      d | j                  t        j                  «      S )	Nr   r¯  r`   ún_freqs must be > 1rY   rŽ  rØ  )r»   )	re   rc   r/  r¢  rÙ  r¾  rÿ  r  Úfftfreq)r¬  r©  rÛ  rî   s       rh   Ú_fft_bin_frequenciesrß  $  s¿   € ô �kÓ"€KÜ�'‹l€GØ�aÒÜÐ2Ó3Ð3Ø�!‚|ÜÐ.Ó/Ð/ÙØ˜1‘ Ñ!ˆÜ�v‰v�‰ ¨#´°kÓ0BÑ*BˆÓC×JÑJÌ2Ï:É:ÓVÐVØ�a‰K€EÜ�6‰6�>‰>˜% 3¬¨{Ó);Ñ#;ˆ>Ó<¸X¸gÐF×MÑMÌbÏjÉjÓYÐYrj   ç     €{@)Úf_refÚnorm_filtersÚunique_binsrÛ  Úbands_per_octaverá  râ  rã  c                óÄ  — t        | «      } t        |«      }t        |«      }t        |«      }t        |«      }|dk  rt        d«      ‚| dk  rt        d«      ‚|dk  rt        d«      ‚|dk  rt        d«      ‚||k  rt        d«      ‚|�t        |«      }|dk  rt        d	«      ‚t        || t	        |«      ¬
«      }	|€dt        j                  ||z  «      }
t        t        j                  ||
z  «      «      }|dt        j                  |dz   «      t        |«      z  z  z  }n¸t        j                  t        j                  ||z  «      |z  «      }t        j                  t        j                  ||z  «      |z  «      }|dt        j                  ||«      t        |«      z  z  z  }|t        j                  ||«      d  }|d t        j                  ||d¬«       }|j                  dk  rt        d«      ‚|	j                  |«      }t        j                  |dt        |	«      dz
  «      }|	|dz
     }|	|   }|||z
  ||z
  k  z  }|rt        j                  |«      }|j                  dk  rt        d«      ‚g }t!        |d d |dd |dd  «      D �]  \  }}}t        |«      }t        |«      }t        |«      }||z
  dk  r|}|dz   }||z
  }||z
  }t        j"                  |t
        j$                  ¬«      }|dkD  rt        j&                  dd|d¬«      |d | t        j&                  dd||z
  d¬«      ||d  |r(t        t        j(                  |«      «      }|dkD  r||z  }t        j"                  | t
        j$                  ¬«      }|||| |j+                  |«       �Œ |st        d«      ‚t-        j.                  t        j0                  |d¬«      t,        j$                  ¬«      S )Nr   r¯  r`   rÝ  zbands_per_octave must be > 0rV  zf_min must be > 0zf_max must be > f_minzf_ref must be > 0)rÛ  ry  rY   ro  ©Úsiderõ   z@log_triangular_fbanks requires at least three center frequenciesz?not enough distinct FFT bins to build log triangular filterbankr°  rï  rî  rŽ  F©Úendpointz)log_triangular_fbanks produced no filtersrk  )re   r¾  rc   rß  rÒ   r/  Úlog2ro  rð  Úfloorr   ÚsearchsortedÚsizerô  rƒ   ÚuniqueÚzipr   r  r±  ÚsumrÆ   r'  r  Ústack)r©  r¬  rä  r™  rª  rá  râ  rã  rÛ  Úbin_frequenciesÚnum_octavesÚ	num_bandsÚcentersrn  ro  r÷  Ú	left_binsÚ
right_binsÚfiltersr  rW  ÚstopÚstart_iÚcenter_iÚstop_iÚ
center_relÚstop_relÚfiltr&  Úbands                                 rh   r"   r"   7  sµ  € ô �'‹l€GÜ�kÓ"€KÜÐ+Ó,ÐÜ�%‹L€EÜ�%‹L€EØ�aÒÜÐ2Ó3Ð3Ø�!‚|ÜÐ.Ó/Ð/Ø˜1ÒÜÐ7Ó8Ð8Ø�‚|ÜÐ,Ó-Ð-Ø�‚~ÜÐ0Ó1Ð1ØÐÜ�e“ˆØ�CŠ<ÜÐ0Ó1Ð1ä*ØØÜ˜_Ó-ô€Oð
 €}Ü—g‘g˜e e™mÓ,ˆÜœŸ™Ð!1°KÑ!?Ó@ÓAˆ	Ø˜#¤"§)¡)¨I¸©MÓ":¼UÐCSÓ=TÑ"TÑUÑU‰ä�x‰xœŸ™ ¨¡Ó.Ð1AÑAÓBˆÜ—‘œŸ™ ¨¡Ó.Ð1AÑAÓBˆØ˜#¤"§)¡)¨D°%Ó"8¼5ÐAQÓ;RÑ"RÑSÑSˆØœ"Ÿ/™/¨'°5Ó9Ð:Ð;ˆØÐIœBŸO™O¨G°UÀÔIÐJˆØ‡|�|�aÒÜÐ[Ó\Ð\à×*Ñ*¨7Ó3€GÜ�g‰g�g˜q¤# oÓ"6¸Ñ":Ó;€GØ ¨!¡Ñ,€IØ  Ñ)€JØˆw˜Ñ" Z°'Ñ%9Ñ9Ñ9€GÙÜ—)‘)˜GÓ$ˆØ‡|�|�aÒÜÐZÓ[Ð[à "€GÜ" 7¨3¨B <°¸¸2°ÀÈÈÀ×LÑˆˆv�tÜ�e“*ˆÜ�v“;ˆÜ�T“ˆØ�GÑ˜aÒØˆHØ˜q‘[ˆFØ Ñ'ˆ
Ø˜GÑ#ˆÜ�x‰x˜¬¯
©
Ô3ˆØ˜Š>Ü "§¡¨C°°jÈ5Ô QˆD��*ÐÜŸK™K¨¨S°(¸ZÑ2GÐRWÔXˆˆZˆ[ÐÙÜœ"Ÿ&™& ›,Ó'ˆEØ�sŠ{Ø˜‘�Ü�x‰x˜¤r§z¡zÔ2ˆØ#ˆˆW�VÐØ�‰�tÖð'  Mñ( ÜÐDÓEÐEÜ�8‰8”B—H‘H˜W¨1Ô-´R·Z±ZÔ@Ð@rj   c                 ó>   — t        t        | «      t        |«      «      S rn   )rÚ  re   )r¬  rî   s     rh   Ú_cached_fft_frequenciesr  �  s   € äœC Ó,¬c°%«jÓ9Ð9rj   Ún_bands.c                 ó¨  — t        j                  dt        | «      dz  t        |dz  dz   «      t         j                  ¬«      }t        j
                  t        |«      dz   t         j                  ¬«      }t        |«      dt        j                  dt        |«      dz   «      z  z  |dd  t        j                  |d d dt        | «      z  k\  «      rt        d	«      ‚g }t        t        |d d |dd  «      «      D ]Ï  \  }\  }}	t        t        j                  ||d
¬«      «      }
t        t        j                  ||	d¬«      «      }||
k  r%t        |
dz   t        |j                  d   «      «      }|dkD  rt        |
dz
  d«      }
|t        |«      k(  rt        |j                  d   «      }n||
z
  dkD  r|dz  }|j                  |
|f«       ŒÑ t!        |«      S )NrV  ry  rY   r`   rî  r   rï  rx  z>Frequency band exceeds Nyquist. Reduce either fmin or n_bands.rn  ræ  ro  )r/  r±  r¾  re   r  r   rð  r�  rc   r¥  rï  rì  rY  rk   rd   rÆ   rw   )r¬  rî   r  rz  Úfreq_npÚoctaÚbandsró   Úf_lowÚf_highr  rd  s               rh   Ú_cached_spectral_contrast_bandsr
  ’  s—  € ô �k‰k˜#œu [Ó1°CÑ7¼¸UÀa¹ZÈ!¹^Ó9LÔTV×T^ÑT^Ô_€GÜ�8‰8”C˜“L 1Ñ$¬B¯J©JÔ7€DÜ�T‹{˜c¤R§Y¡Y¨q´#°g³,ÀÑ2BÓ%CÑCÑD€Dˆˆ€HÜ	‡v�vˆd�3�Bˆi˜3¤ {Ó!3Ñ3Ñ3Ô4ÜÐYÓZÐZà#%€EÜ'¬¨D°°"¨I°t¸A¸B°xÓ(@ÖAÑˆ‰?ˆE�6Ü”B—O‘O G¨U¸Ô@ÓAˆÜ”"—/‘/ '¨6¸Ô@ÓAˆØ�%Š<Ü�e˜a‘i¤ W§]¡]°1Ñ%5Ó!6Ó7ˆCØˆqŠ5Ü˜ ™	 1Ó%ˆEØ”�G“ÒÜ�g—m‘m AÑ&Ó'‰CØ�5‰[˜1Š_Ø�1‰HˆCØ�‰�e˜S�\Õ"ð Bô �‹<Ðrj   c                 óh   — t        j                  t        t        | «      t        |«      |«      d«      S )N©r`   r   )r'  rð  rç  re   ræ  s      rh   rÄ  rÄ  ¯  s'   € ô �<‰<Ô*¬3¨v«;¼¸F»ÀTÓJÈFÓSÐSrj   c                ó  — t        | «      } t        |«      }t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚|dk  rt        d«      ‚|dt        j                  | t        j
                  ¬«      t        |«      z  z  z  S )Nr   r’  rV  r‘  r“  ry  rî  )re   r¾  rc   r/  rð  r•  )r{  rz  r|  s      rh   Ú_cqt_frequenciesr  ¸  sƒ   € ô �‹[€FÜ�‹;€DÜ˜/Ó*€OØ�‚{ÜÐ-Ó.Ð.Øˆs‚{ÜÐ+Ó,Ð,Ø˜!ÒÜÐ6Ó7Ð7Ø�3œ2Ÿ9™9 V´2·:±:Ô>ÄÀÓAWÑWÑXÑYÐYrj   r¦  c                 ó°  — t        j                  | t         j                  ¬«      } | j                  dk7  s| j                  dk(  rt        d«      ‚| j                  dk(  r%t        j                  dt         j                  ¬«      S t        | d   | d   z  «      }||z  dz
  ||z  dz   z  }t        j                  | j                  |t         j                  ¬«      S )Nrî  r`   r   z#freqs must be a non-empty 1-D array)r`   rŽ  )
r/  r1  r•  r€  rí  rc   r}  r¾  Úfullrk   )r¦  ÚratioÚalphas      rh   Ú_relative_bandwidthr  Ê  s¥   € Ü�J‰J�u¤B§J¡JÔ/€EØ‡z�z�Q‚˜%Ÿ*™*¨š/ÜÐ>Ó?Ð?Ø‡z�z�Q‚Ü�w‰w�t¤2§:¡:Ô.Ð.Ü�%˜‘(˜U 1™XÑ%Ó&€EØ�U‰]˜SÑ  U¨U¡]°SÑ%8Ñ9€EÜ�7‰7�5—;‘; ¬R¯Z©ZÔ8Ð8rj   )Úgammar  r  c                 óÊ  — t        j                  | t         j                  ¬«      } t        j                  |t         j                  ¬«      }| j                  |j                  k7  rt	        d«      ‚t        j
                  | dk  «      rt	        d«      ‚t        j
                  |dk  «      rt	        d«      ‚t        |«      |z  }t        |«      |z  }|t        |«      z  | |z   z  S )Nrî  z(freqs and alpha must have matching shaperV  zfreqs must be strictly positivezalpha must be strictly positive)r/  r1  r•  rk   rc   r�  r¾  )r¦  ry  r}  r  r  Ú
gamma_termÚqs          rh   Ú_wavelet_lengthsr  Õ  sµ   € ô �J‰J�u¤B§J¡JÔ/€EÜ�J‰J�u¤B§J¡JÔ/€EØ‡{�{�e—k‘kÒ!ÜÐCÓDÐDÜ	‡v�vˆe�s‰lÔÜÐ:Ó;Ð;Ü	‡v�vˆe�s‰lÔÜÐ:Ó;Ð;Ü�u“ Ñ%€JÜˆlÓ˜eÑ#€AØŒu�R‹y‰=˜E JÑ.Ñ/Ð/rj   )r  rU  c                 ó  — t        t        j                  |t        j                  ¬«      t	        | «      t	        |«      t        j                  |t        j                  ¬«      t	        |«      ¬«      }g }	t        ||«      D �]	  \  }
}t        t        j                  t	        |
«      «      «      }t        j                  | dz  |dz  t        j                  ¬«      }t        j                  dt        j                  z  t	        |«      z  t	        | «      z  |z  «      }|t        j                  t        |«      «      z  }t	        |«      dk(  r.|t        j                  t        j                  |«      «      dz   z  }|	j                  |«       �Œ t	        t        j                   |«      «      }t        dt        j"                  t        j$                  |«      «      z  «      }|�Jt!        |t        ddt        j"                  t        j$                  t        |«      «      «      z   z  «      «      }t        j&                  t        |«      |ft        j(                  ¬«      }t+        |	«      D ]-  \  }}|t        |«      z
  }|dz  }|||||t        |«      z   …f<   Œ/ ||d d …d f   t	        |«      z  z  }t        j,                  j-                  ||d¬	«      d d …d |dz  dz   …f   }t	        |«      d
kD  rjt        j                  |«      }t/        |j0                  d   «      D ]:  }t	        t        j2                  ||   t	        |«      «      «      }d
||||   |k  f<   Œ< |j5                  t        j6                  «      t        |«      |fS )Nrî  )r¦  ry  r}  r  r  rY   y               @rŽ  g#B’¡œÇ;ry  r`   r¬  rV  r   )r  r/  r1  r•  r¾  rï  re   ro  rð  r¤  rƒ  rm  rƒ   rð  r  rÆ   rd   r   rê  r   Ú
complex128r¥  r¢  r±  rk   Úquantilerÿ  r
  )ry  r¦  r}  r¨  r~  r  r  rU  ÚlengthsÚ	filt_listÚilenrŠ  Úlength_iÚtÚsigÚmax_lenrî   r–  r…  rÿ  Ú	pad_totalr!  Ú	fft_basisÚmagsÚrowÚthreshs                             rh   Ú_build_cqt_fft_basisr(  ê  sÀ  € ô Ü�j‰j˜¤b§j¡jÔ1Ü�‹9Ü˜<Ó(Ü�j‰j˜¤b§j¡jÔ1Ü�E‹lô€Gð #%€IÜ˜' 5×)‰
ˆˆdÜ”r—x‘x¤ d£Ó,Ó-ˆÜ�I‰I�x�i 1‘n h°!¡m¼2¿:¹:ÔFˆÜ�f‰f�X¤§¡Ñ%¬¨d«Ñ3´e¸B³iÑ?À!ÑCÓDˆØ”B—J‘Jœs 3›xÓ(Ñ(ˆÜ�‹;˜#ÒØœŸ™¤§¡ s£Ó,¨uÑ4Ñ5ˆCØ×Ñ˜Öð *ô ”B—F‘F˜7“OÓ$€GÜ�”r—w‘wœrŸw™w wÓ/Ó0Ñ0Ó1€EØÐÜ�Eœ3˜s q¬2¯7©7´2·7±7¼3¸z»?Ó3KÓ+LÑ'LÑMÓNÓOˆä�H‰H”c˜%“j %Ð(´·±Ô>€EÜ˜yÖ)‰	ˆˆTØœC ›IÑ%ˆ	Ø ‘>ˆØ48ˆˆc�8˜H¤s¨4£yÑ0Ð0Ð0Ò1ð *ð 
ˆW’Q˜�WÑ¤ e£Ñ,Ñ,€Eä—‘—
‘
˜5 E°�
Ó2²1Ð6F¸À¹
ÀQ¹Ð6FÐ3FÑG€IÜˆXƒ˜ÒÜ�v‰v�iÓ ˆÜ˜Ÿ™ A™Ö'ˆCÜœ2Ÿ;™; t¨C¡y´%¸³/ÓBÓCˆFØ25ˆI�c˜4 ™9¨Ñ.Ð.Ò/ð (ð ×ÑœBŸL™LÓ)¬3¨u«:°wÐ>Ð>rj   c                  ó|  — d} d}d}t        j                  | t         j                  ¬«      | dz
  dz  z
  }|t        j                  ||z  «      z  }| dz
  dz  }t        j                  t        j
                  dd||z  d	z  z
  «      «      }t        j                  ||z  «      t        j                  |«      z  }||z  j                  t         j                  «      }|t        j                  |«      z  }|j                  t         j                  «      }t        j                  |t        j                  ¬«      d d d …d f   S )
Né?   rx  g       @rî  r`   ry  rV  rŽ  rY   )r/  rð  r•  Úsincrà  r—  Úi0rÿ  rð  r  r'  r  )	Únum_tapsrÔ  Úbetar’  ÚidealÚradiusÚ
window_argrÊ  rº  s	            rh   Ú_cached_halfband_kernelr2    sû   € à€HØ€FØ€DÜ
�	‰	�(¤"§*¡*Ô-°¸A±ÀÑ0DÑD€AØ”R—W‘W˜V a™ZÓ(Ñ(€EØ˜‰l˜cÑ!€FÜ—‘œŸ™ C¨°°F±
¸qÑ/@Ñ)@ÓAÓB€JÜ�U‰U�4˜*Ñ$Ó%¬¯©¨d«Ñ3€FØ�f‰n×$Ñ$¤R§Z¡ZÓ0€FØ
Œb�f‰f�V‹nÑ€FØ�]‰]œ2Ÿ:™:Ó&€FÜ�8‰8�F¤"§*¡*Ô-¨d²A°t¨mÑ<Ð<rj   c                 ób  — | j                   dk(  }|r
| d d d …f   } n'| j                   dk7  rt        d| j                  › �«      ‚t        «       }t	        | dd¬«      }t        j                  |d d …d d …d f   |d¬«      }|d d …d d …df   t        t        j                  d	«      «      z  }|r|d   S |S )
Nr`   rY   z3_downsample_2x_batched expects 1D or 2D input, got é   r>   ©rc  ru  )Ústrider   ry  )
r€  rc   rk   r2  Ú_pad_waveformr'  Úconv1dr¾  r/  rà  )ri  rV  rº  Úx_padr4  s        rh   r¦  r¦  -  s¦   € Ø�v‰v˜‰{€HÙØˆd’Aˆg‰J‰Ø	
�‰�1ŠÜÐNÈqÏwÉwÈiÐXÓYÐYä$Ó&€FÜ˜! ¨)Ô4€EÜ
�)‰)�Eš!šQ ˜*Ñ% v°aÔ
8€CØ
Ša’�Aˆg‰,œœrŸw™w s›|Ó,Ñ
,€CÙˆ3ˆq‰6Ð& 3Ð&rj   r{  c                 ó¬  — t        j                  t        t        |«      t	        |«      t        |«      ¬«      t         j
                  ¬«      }t        |«      }	t        |t	        | «      t	        |«      |	¬«      }
dt        j                  t        j                  |
«      «      z  dt	        |«      z  k  }t        t        j                  |«      «      }t        |«      |z
  }|dkD  r*t        t        j                  |t	        |«      z  «      «      nd}d }|dkD  rç||   }|	|   }t        t	        | «      |t	        |«      t	        |«      t	        |«      |t        |«      ¬«      \  }}}t        |«      t        j                  t        j                  t        j                  |«      «      j                  t         j                   «      t        j                   ¬«      t	        t        j"                  t	        |«      «      «      dœ}g }|d | }|	d | }t	        | «      }t        |«      }t%        |«      D �]$  }t        |«      }|dk(  rt'        | d «      }nt'        | |dz   z  | |z  «      }||   }||   }t        ||t	        |«      t	        |«      t	        |«      |d	¬
«      \  }} }t        j                  |«      t        j"                  t	        | «      |z  «      z  }|j)                  t        j                  |j                  t         j*                  «      t        j*                  ¬«      t        | «      t        |«      f«       |dz  }t-        d|dz  «      }�Œ' t        |«      t        |«      t        |«      |t/        |«      t        j                  dt        j"                  |
«      z  j                  t         j                   «      t        j                   ¬«      dœS )N)rz  r|  rî  )r¦  ry  r}  r  ry  r   )ry  r¦  r}  r¨  r~  r  rU  )rî   r–  r—  r`   rV  )ry  r¦  r}  r¨  r~  r  r  rY   rŽ  )r  r€  r�  r•  r˜  r”  )r/  r1  r  re   r¾  r•  r  r  r   rê  rð  r(  r'  r  r  rÿ  r  rà  r±  ÚslicerÆ   r
  rd   rw   )!ry  rU  rz  r{  r|  r}  r¨  r~  r¦  r  r  Úpseudo_maskr  r€  r�  r›  Úpseudo_freqsÚpseudo_alphaÚpseudo_fft_basisrœ  rŠ   Úoctave_plansÚ
full_freqsÚ
full_alphaÚ	octave_srr¡  Ú
octave_idxÚn_filtÚslÚoctave_freqsÚoctave_alphaÚoctave_fft_basisr   s!                                    rh   r™  r™  ;  s3  € ô �J‰JÜœ˜V›¬5°«;ÌÈOÓH\Ô]Ü�j‰jô€Eô   Ó&€EÜØÜ�‹9Ü˜<Ó(Øô	€Gð œŸ™¤§¡¨Ó!1Ó2Ñ2°S¼5ÀÓ;LÑ5LÑL€KÜ”2—6‘6˜+Ó&Ó'€HÜ�‹[˜8Ñ#€FØAGÈ!Â””B—G‘G˜F¤U¨?Ó%;Ñ;Ó<Ô=ÐQR€Ià€KØ�!‚|Ø˜[Ñ)ˆØ˜[Ñ)ˆÜ+?Ü�R‹yØÜ˜|Ó,Ü�t“Ü˜8“_ØÜ˜:“ô,
Ñ(Ð˜+ qô ˜Ó%Ü—X‘XœbŸf™f¤R§Z¡ZÐ0@Ó%AÓB×IÑIÌ"Ï*É*ÓUÔ]_×]gÑ]gÔhÜœ2Ÿ7™7¤5¨Ó#5Ó6Ó7ñ
ˆð 57€LØ�w˜�€JØ�w˜�€JÜ�b“	€IÜ�Z“€JÜ˜I×&ˆ
Ü�_Ó%ˆØ˜Š?Ü˜�w Ó%‰Bä˜�w *¨q¡.Ñ1°F°7¸ZÑ3GÓHˆBØ! "‘~ˆØ! "‘~ˆÜ+?ØØÜ˜|Ó,Ü�t“Ü˜8“_ØØô,
Ñ(Ð˜+ qô Ÿ:™:Ð&6Ó7¼"¿'¹'Ä%ÈÃ)ÈiÑBWÓ:XÑXÐØ×Ñä—‘Ð)×0Ñ0´·±Ó>ÄbÇlÁlÔSÜ�KÓ Ü�J“ðô	
ð 	�SÑˆ	Ü˜˜J¨!™OÓ,Š
ð5 'ô: ˜“MÜ�f“+Ü˜“^ØÜ˜Ó&ÜŸ™ 3¬¯©°Ó)9Ñ#9×"AÑ"AÄ"Ç*Á*Ó"MÔUW×U_ÑU_Ô`ñð rj   c                óØ   — |dk  r| S |dk(  rCt        | j                  d   «      |k  rt        j                  | d||fgd¬«      S t	        | |«      S t        j                  | d||fg|¬«      S )Nr   r>   r`   r  Úedgert  )re   rk   r'  rc  rr  )ri  rc  ru  s      rh   r7  r7  •  sq   € ð ˆa‚xØˆØˆyÒÜˆq�w‰w�q‰z‹?˜cÒ!Ü—6‘6˜!˜f s¨C jÐ1¸Ô?Ð?Ü)¨!¨SÓ1Ð1Ü�6‰6�!�f˜s C˜jÐ)°Ô5Ð5rj   Úframe_lengthÚpad_modec          	      ó`  — t        | d¬«      \  } }t        |«      }t        |«      }|dk  rt        d«      ‚|dk  rt        d«      ‚t        j                  | «      } |rt        | |dz  t        |«      ¬«      } | j                  \  }}||k  r@t        j                  | dd|t        |«      z
  fgd	¬
«      } t        | j                  d   «      }dt        |«      |z
  |z  z   }t        j                  | t        |«      t        |«      |ft        |«      |df¬«      }	t        j                  |	«      |fS )NÚframe_signalrP  r   zframe_length must be > 0r�  rY   r5  r  r?   rt  r`   r�  )
rS  re   rc   r'  r  r7  rž   rk   rc  r¡  )
ri  rL  rU  rW  rM  rV  rC  rG  rQ  rÉ  s
             rh   Ú_frame_signalrP  ¤  s'  € ô & a°Ô@�K€A€xÜ�|Ó$€LÜ�Z“€JØ�qÒÜÐ3Ó4Ð4Ø�Q‚ÜÐ1Ó2Ð2ä
�‰�aÓ€AÙÜØØ Ñ!Ü�X“ô
ˆð —G‘G�M€Eˆ6Ø�ÒÜ�F‰F�1�v  <´#°f³+Ñ#=Ð>Ð?ÀjÔQˆÜ�Q—W‘W˜Q‘Z“ˆà”C˜“K ,Ñ.°:Ñ=Ñ=€HÜ�]‰]Ø	Ü�5‹zœ3˜x›=¨,Ð7Ü�V“˜j¨!Ð,ô€Fô
 �=‰=˜Ó  (Ð*Ð*rj   c       	         óÄ  — t        | d¬«      \  } }
|}t        |«      }t        |«      }|�t        |«      n
t        |«      }|r%|dk(  r t        | j                  d   «      |dz  k  rd}t        |||t	        |«      t        |«      t        |«      dd ||	d ¬«      }|j                  | d	¬
«      }t        j                  |«      j                  t        j                  «      }||
fS )NÚstft_magnituderP  r>   r`   rY   r?   Fr  r<   rE  )rS  re   rk   r0   rž   rÒ   rF  r'  r  rÿ  r  )ri  r¬  rî   rU  r*  r)  r+  rW  r  r  rV  Úeffective_center_pad_modeÚtrr§  r'  s                  rh   rT  rT  Ê  sÛ   € ô & aÐ1AÔB�K€A€xØ /ÐÜ�‹J€EÜ�Z“€JØ$.Ð$:”�Z”ÄÀEÃ
€JáØ˜yÒ(Ü�—‘˜‘
‹O ¨¡
Ò+à$.Ð!Ü	ØØØÜ�i“.Ü�h“Ü�F‹|ØØØ1Ø'Ø!ô
€Bð �7‰7�1 Eˆ7Ó*€DÜ
�&‰&�‹,×
Ñ
œbŸj™jÓ
)€CØ�ˆ=Ðrj   rl  c                óv  — |€| S t        |«      }t        j                  | «      }t        j                  |«      r7|dkD  rt        j
                  ||d¬«      }nJt        j                  ||d¬«      }n1|dk  rt        d«      ‚t        j                  ||z  |d¬«      d|z  z  }| t        j                  |d«      z  S )Nr   TrÌ  z&norm must be positive, +/-inf, or NonerŽ  rÀ  )
r¾  r'  r  r‚  Úisinfrd   rY  rc   rð  r—  )ri  r¨  rl  rC  Úabs_xr  s         rh   Ú
_normalizerX  ô  s£   € ð €|ØˆÜ�$‹K€EÜ�F‰F�1‹I€EÜ‡z�z�%ÔØ�1Š9Ü—F‘F˜5 t°dÔ;‰Eä—F‘F˜5 t°dÔ;‰Eà�AŠ:ÜÐEÓFÐFÜ—‘�u ‘~¨D¸4Ô@ÀSÈ5Á[ÑQˆØŒr�z‰z˜% Ó'Ñ'Ð'rj   )rÎ  rÏ  c          
      ó  — t        | «      } t        |«      }t        |«      }| dk  rt        d«      ‚|dk  rt        d«      ‚|dk  rt        d«      ‚t        j                  dt	        | «      t        |«      d¬«      dd  }d	d
t	        |«      t	        |«      z  z  z  }t	        |«      t        j
                  ||dz  z  «      z  }t        j                  |d   dt	        |«      z  z
  g|f«      }t        j                  t        j                  |dd  |d d z
  d«      dgf«      }t        j                  j                  |t        j                  d|t        j                  ¬«      «      j                  }t        j                  t	        |«      d
z  «      }	t        j                  ||	z   dt	        |«      z  z   t	        |«      «      |	z
  }t        j                  dd
|z  t        j                   ||df«      z  dz  z  «      }
t        j"                  t        j$                  |
|
z  dd¬«      «      }|
t        j                  |d«      z  }
|
t        j                   t        j                  d|t	        |«      z  dz
  d
z  dz  z  «      |df«      z  }
t        j&                  |
d|dz  z  d¬«      }
t        j(                  |
d d …d t        d|dz  z   «      …f   t        j*                  ¬«      }
t-        j.                  |
t,        j*                  ¬«      S )Nr   r¯  r×  zn_chroma must be > 0rV  Frè  r`   rà  ry  g      0@g      ø?rï  rŽ  rî  r£  g      à¿rY   TrÌ  g¼‰Ø—²Òœ<g      @rÍ  rŒ  rk  )re   rc   r/  r±  r¾  rê  rm  r—  ÚsubtractÚouterrð  r•  r  ro  Ú	remainderr¤  r  rà  rð  Úrollr0  r  r'  r  )r¬  rî   rÎ  rÏ  ÚfrequenciesÚA440ÚfrqbinsÚbinwidthbinsÚDÚ	n_chroma2ÚwtsÚnormss               rh   rÒ  rÒ  
  s•  € ô �kÓ"€KÜ�‹J€EÜ�8‹}€HØ�aÒÜÐ2Ó3Ð3Ø�‚zÜÐ,Ó-Ð-Ø�1‚}ÜÐ/Ó0Ð0ä—+‘+˜c¤5¨Ó#5´s¸5³zÈEÔRÐSTÐSUÐV€KØ�CœE &›M¬E°(«OÑ;Ñ<Ñ=€DÜ�H‹o¤§¡¨°t¸d±{Ñ(CÓ DÑD€GÜ�n‰n˜w q™z¨C´%¸³/Ñ,AÑAÐBÀGÐLÓM€GÜ—>‘>¤2§:¡:¨g°a°b¨k¸GÀCÀR¸LÑ.HÈ#Ó#NÐQTÐPUÐ"VÓW€Lä
�‰×Ñ˜'¤2§9¡9¨Q°ÄÇ
Á
Ô#KÓL×NÑN€AÜ—‘œ˜x›¨3Ñ.Ó/€IÜ
�‰�Q˜‘] T¬E°(«OÑ%;Ñ;¼UÀ8»_ÓMÐPYÑY€Aä
�&‰&�˜˜q™¤2§7¡7¨<¸(ÀA¸Ó#GÑGÈAÑMÑMÓ
N€CÜ�G‰G”B—F‘F˜3 ™9¨1°tÔ<Ó=€EØ
”—
‘
˜5 %Ó(Ñ
(€CØŒ2�7‰7Ü
�‰ˆt˜¤5¨£?Ñ2°SÑ8¸CÑ?ÀAÑEÑFÓGØ	�1ˆóñ €Cô �'‰'�#�r˜X¨™^Ñ,°1Ô
5€CÜ
×
Ñ
˜s¢1Ð&:¬¨A°¸±	©MÓ(:Ð&:Ð#:Ñ;Ä2Ç:Á:Ô
N€CÜ�8‰8�CœrŸz™zÔ*Ð*rj   Úincludec                 óò   — | €t         S g }| D ]Q  }t        |«      }|t         vr&dj                  t         «      }t        d|›d|› �«      ‚||vsŒA|j	                  |«       ŒS |st        d«      ‚t        |«      S )Nr³   zUnknown spectral feature z. Expected one of: z2include must request at least one spectral feature)Ú_SPECTRAL_FEATURE_NAMESrž   r¼   rc   rÆ   rw   )rf  ÚnamesÚraw_namerÁ   Úvalids        rh   Ú!_normalize_spectral_feature_namesrl  1  sŠ   € ð €Ü&Ð&Ø€EÛˆÜ�8‹}ˆØÔ.Ñ.Ø—I‘IÔ5Ó6ˆEÜÐ8¸¸Ð@SÐTYÐSZÐ[Ó\Ð\Ø�uÒØ�L‰L˜Õð ñ ÜÐMÓNÐNÜ�‹<Ðrj   r'  c                óà   — t        j                  t        j                  | dd¬«      d«      }t        j                  | |d d d …d f   z  dd¬«      |z  j                  t         j                  «      S )Nr`   TrÌ  rÀ  )r'  r—  rð  rÿ  r  )r'  r¦  r  s      rh   Ú_spectral_centroid_from_magrn  C  s[   € ô
 �J‰J”r—v‘v˜c¨°DÔ9¸5ÓA€EÜ�F‰F�3˜˜t¢Q¨˜}Ñ-Ñ-°AÀÔEÈÑM×UÑUÔVX×V`ÑV`ÓaÐarj   )ÚcentroidÚpro  c                óv  — t        |«      }|dk  rt        d«      ‚|€t        | |¬«      }t        j                  t        j
                  | dd¬«      d«      }t        j                  |d d d …d f   |z
  «      |z  }t        j
                  | |z  dd¬«      |z  d|z  z  j                  t        j                  «      S )	Nr   zp must be > 0©r¦  r`   TrÌ  rÀ  rŽ  )	r¾  rc   rn  r'  r—  rð  r  rÿ  r  )r'  r¦  rp  ro  r  Ú	deviations         rh   Ú_spectral_bandwidth_from_magrt  L  s¨   € ô 	ˆa‹€AØˆA‚vÜ˜Ó)Ð)ØÐÜ.¨s¸%Ô@ˆÜ�J‰J”r—v‘v˜c¨°DÔ9¸5ÓA€EÜ—‘�u˜T¢1 d˜]Ñ+¨hÑ6Ó7¸1Ñ<€IÜ�V‰V�C˜)‘O¨!°dÔ;¸eÑCÈÈqÉÑQ×YÑYÔZ\×ZdÑZdÓeÐerj   Úroll_percentc                óè  — t        |«      }d|cxk  rdk  st        d«      ‚ t        d«      ‚t        j                  | d¬«      }||d d …dd …d d …f   z  }t        j                  ||k\  j                  t        j                  «      d¬«      }t        j                  ||j                  d«      «      j                  |j                  «      }|d d …d d d …f   j                  t        j                  «      S )NrV  rŽ  ú)roll_percent must lie in the range (0, 1)r`   rk  rï  )r¾  rc   r'  Úcumsumrn  rÿ  rñ  re  rò  rk   r  )r'  r¦  ru  Útotal_energyÚ	thresholdr…  r]  s          rh   Ú_spectral_rolloff_from_magr{  ]  sÊ   € ô ˜Ó&€LØ�Ô# Ò#ÜÐDÓEÐEð $ÜÐDÓEÐEÜ—9‘9˜S qÔ)€LØ˜|ªA¨r©s²A¨IÑ6Ñ6€IÜ
�)‰)�\ YÑ.×6Ñ6´r·x±xÓ@ÀqÔ
I€CÜ�7‰7�5˜#Ÿ+™+ b›/Ó*×2Ñ2°3·9±9Ó=€DØ’�4š�
Ñ×"Ñ"¤2§:¡:Ó.Ð.rj   )Úband_rangesr  r|  c          
      óú  — t        |«      dk  rt        d«      ‚dt        |«      cxk  rdk  st        d«      ‚ t        d«      ‚t        |«      dk  rt        d«      ‚|€2t        t        |«      t        |«      t        |«      t        |«      «      }g }g }|D ]Û  \  }	}
| d d …|	|
…d d …f   }t        |j                  d   «      }t        t        t        j                  t        |«      |z  «      «      d«      }t        j                  |d¬«      }|j                  t        j                  |d d …d |…d d …f   d¬«      «       |j                  t        j                  |d d …| d …d d …f   d¬«      «       ŒÝ t        j                  |d¬«      j                  t        j                  «      }t        j                  |d¬«      j                  t        j                  «      }t        j                  dt        j                  ¬	«      }d
t        j                   t        j"                  ||«      «      z  }d
t        j                   t        j"                  ||«      «      z  }||z
  j                  t        j                  «      S )Nr`   ú"n_bands must be a positive integerrV  rŽ  z%quantile must lie in the range (0, 1)zfmin must be a positive numberrk  rÀ  rî  r£  )re   rc   r¾  r
  rk   rd   r/  Úrintr'  ÚsortrÆ   Úmeanrñ  rÿ  r  r  r–  r—  )r'  r¬  rî   r  rz  r  r|  ÚvalleysÚpeaksr  rd  Úsub_bandÚ	band_binsr…  Úsorted_bandÚvalleyÚpeakrÃ  Úpeak_dbÚ	valley_dbs                       rh   Ú_spectral_contrast_from_magr‹  m  sù  € ô ˆ7ƒ|�aÒÜÐ=Ó>Ð>Ø”�x“Ô& 3Ò&ÜÐ@ÓAÐAð 'ÜÐ@ÓAÐAÜˆTƒ{�cÒÜÐ9Ó:Ð:àÐÜ5Ü�ÓÜ�‹JÜ�‹LÜ�$‹Kó	
ˆð €GØ€EÛ!‰
ˆˆsØ’q˜% ˜)¢Q�Ñ'ˆÜ˜Ÿ™ qÑ)Ó*ˆ	Ü”#”b—g‘gœe H›o°	Ñ9Ó:Ó;¸QÓ?ˆÜ—g‘g˜h¨QÔ/ˆØ�‰”r—w‘w˜{ª1¨d¨s¨d²A¨:Ñ6¸QÔ?Ô@Ø�‰”R—W‘W˜[ª¨S¨D©E²1¨Ñ5¸AÔ>Õ?ð "ô �X‰X�g AÔ&×-Ñ-¬b¯j©jÓ9€FÜ�8‰8�E Ô"×)Ñ)¬"¯*©*Ó5€DÜ�8‰8�E¤§¡Ô,€DØ”R—X‘XœbŸj™j¨¨tÓ4Ó5Ñ5€GØ”r—x‘x¤§
¡
¨6°4Ó 8Ó9Ñ9€IØ�iÑ×'Ñ'¬¯
©
Ó3Ð3rj   Ú	chroma_fbc                ó   — t        j                  t        j                  | d«      t        j                  |d«      «      }t        j                  |d«      j                  t         j                  «      }t        ||d¬«      S )Nrï  r  r°  )r¨  rl  )r'  rñ  rð  rÿ  r  rX  )r¾  rŒ  r¨  Ú
chroma_bncÚ
chroma_bcns        rh   Ú_chroma_stft_from_powerr�  ˜  sY   € ô —‘œ2Ÿ<™<¨¨yÓ9¼2¿<¹<È	ÐSYÓ;ZÓ[€JÜ—‘˜j¨)Ó4×;Ñ;¼B¿J¹JÓG€JÜ�j t°"Ô5Ð5rj   )rÂ  rõ  c                óX   — t        | |d¬«      }t        |d|d¬«      }t        |||¬«      S )Nr<   r7  r¾  rÈ  r2  rÇ  )rô  r    rû  )r¾  rí  r÷  rÂ  rõ  rö  s         rh   Ú_mfcc_from_powerr’  £  s8   € ô $ E°&ÀuÔM€GÜ˜g¨W¸VÈ-ÔX€GÜ!ØØØ%ôð rj   rY   ry  ç333333ë?r¸   ç      i@ç{®Gáz”?)rÎ  Úchroma_normrÏ  Úbandwidth_pru  r  Úcontrast_fminÚcontrast_quantilerÛ  r«  r™  rª  Úmel_normr‰  rÂ  rè  rº  r–  r—  r˜  r™  rš  c                ó  — t        |«      }|dk  rt        d«      ‚d }d }d }d }d }d }d }g }|D �]Æ  }|dk(  r5|€| | z  }|€t        ||||«      }|j                  t	        |||¬«      «       Œ>|dk(  rÄ|€| | z  }|€Tt        |€|dz  n|«      }t        t        | j                  d   «      t        |«      |t        |«      t        |«      ||«      }|€t        t        |«      t        |«      |«      }|dkD  r |€t        t        |«      t        |«      «      }|j                  t        |||||¬«      «       �Œ|€t        ||«      }|d	k(  r"|€t        | |¬
«      }|j                  |«       �Œ<|dk(  r/|€t        | |¬
«      }|j                  t        | |||¬«      «       �Œp|dk(  r|j                  t        | ||¬«      «       �Œ”|dk(  r"|j                  t!        | |||	|
|¬«      «       �Œ»t        d|›�«      ‚ t#        |«      S )Nr   rÂ  r'   ©rŒ  r¨  r&   rY   r`   ©rí  r÷  rÂ  rõ  r)   rr  r*   ©r¦  rp  ro  r+   ©r¦  ru  r,   )r¬  rî   r  rz  r  úUnhandled spectral feature )rl  rc   rÓ  rÆ   r�  r¾  rä  re   rk   rÄ  rë  r’  r  rn  rt  r{  r‹  rw   ) r'  rf  r¬  rî   rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  rM  r¦  ro  r¾  rŒ  rí  r÷  rõ  r¨  rÁ   Úf_max_resolveds                                    rh   Ú!_spectral_feature_values_from_magr¢  ´  s_  € ô0 2°'Ó:€IØ�‚zÜÐ.Ó/Ð/Ø!€EØ $€HØ!€EØ!%€IØ"€FØ!%€IØ&*€NØ €GÜˆØ�=Ò Øˆ}Ø˜c™	�ØÐ Ü5°kÀ5È(ÐTZÓ[�	Ø�N‰NÜ'ØØ'Ø$ôôð Ø�6Š>Øˆ}Ø˜c™	�Øˆ~Ü!&¸5¸= {°aÒ'7ÈeÓ!T�Ü/Ü˜Ÿ	™	 !™Ó%Ü˜%“LØ"Ü˜“KÜ˜Ó$ØØó�ð Ð Ü0´°V³¼cÀ&»kÈ8ÓT�	Ø˜Šz˜nÐ4Ü!7¼¸F»ÄSÈÃ[Ó!Q�Ø�N‰NÜ ØØ!Ø'Ø!Ø#1ôôñ àˆ=Ü+¨K¸Ó?ˆEØÐ&Ò&ØÐÜ6°sÀ%ÔH�Ø�N‰N˜8Ö$ØÐ)Ò)ØÐÜ6°sÀ%ÔH�Ø�N‰NÜ,ØØØ!Ø%ô	öð Ð'Ò'Ø�N‰NÜ*ØØØ!-ôöð Ð(Ò(Ø�N‰NÜ+ØØ +ØØ#Ø&Ø.ôö	ô Ð:¸4¸(ÐCÓDÐDða ôb �‹>Ðrj   )r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  c                óÜ   — t        |«      }t        | |||||d|||	¬«
      \  }}t        |fi d|“d|“d|“d|
“d|“d|“d	|“d
|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“Ž}||fS )NTrR  rf  r¬  rî   rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  )rl  rT  r¢  )ri  rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  rM  r'  rV  r  s                                  rh   Ú_spectral_feature_valuesr¤  +  s  € ô< 2°'Ó:€IÜ#Ø	ØØØØØØØØ'Ø'ô�M€Cˆô /Øòáðñ  ðñ ð	ñ
 ðñ  ðñ ðñ  ðñ "ðñ ðñ $ðñ ,ðñ ðñ ðñ ðñ  ð!ñ" ð#ñ$ ð%ñ& ð'ñ( ð)ñ* ð+€Fð. �8ÐÐrj   )r¬  rî   rU  r*  rÎ  r¨  r)  rW  r  r  rÏ  c                óV   — t        | d|||||||	|
|||¬«      \  \  }}t        ||¬«      S )z'Compute chromagram from audio via STFT.)r'   )rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r^  ©r¤  r_  )ri  r¬  rî   rU  r*  rÎ  r¨  r)  rW  r  r  rÏ  r�  rV  s                 rh   r'   r'   p  sK   € ô  7Ø	Ø ØØØØØØØ'Ø'ØØØôÑ�M€Z�8ô " *°xÔ@Ð@rj   ©rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  c                ó  ‡— t        |«      }t        | fi d|“d|“d|“d|“d|“d|“d|“d|“d	|	“d
|
“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“Ž\  }Št        ˆfd„t        ||«      D «       «      S )zHCompute several STFT-derived descriptors from one shared magnitude pass.rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  c              3   óB   •K  — | ]  \  }}|t        |‰¬ «      f–— Œ y­w)r^  N)r_  )rq   rÁ   rC  rV  s      €rh   rs   z$spectral_features.<locals>.<genexpr>Ï  s*   øè ø€ ð á1‰KˆD�%ð 
Ô% e°hÔ?Ô@Ù1ùs   ƒ)rl  r¤  r   rï  )ri  rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  rM  r  rV  s                                @rh   r(   r(   ’  sF  ø€ ô> 2°'Ó:€IÜ/Ø	òáðñ  ðñ ð	ñ
 ðñ ðñ ðñ ðñ (ðñ (ðñ ðñ  ðñ ðñ  ðñ "ðñ  ð!ñ" $ð#ñ$ ,ð%ñ& ð'ñ( ð)ñ* ð+ñ, ð-ñ. ð/ñ0 ð1ñ2 ð3ñ4 ð5ñ6 ð7Ñ€FˆHô: ó ä˜y¨&Ô1óó ð rj   c            7       ó�  — e Zd ZdZdZdddddddd	d
ddddddddddddddddddœdeedf   ee   z  dz  dededededz  d ed!e	d"ed#ed$ed%e
dz  d&e
d'e
d(e
d)ed*e
d+e
d,ed-ed.e
d/e
dz  d0ed1ed2e
dz  d3ed4ed   dz  d5df6d6„Zd7ej                   d5eeej                   f   fd8„Zd7ej                   d5eeej                   f   fd9„Zd:„ Zd;„ Zy)<r   zHCached shared-STFT extractor for repeated spectral descriptor workloads.)%rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  r  r¦  rŒ  rí  r¼  r½  r¾  Ú_short_spectralÚ_contrast_bandsrK  Ú_compiled_values_fnNrL  r?  rŸ  rw  Tr>   r@   rŒ  rY   rV  ry  r“  r¸   r”  r•  r¿  r­   rD   r¿  r   rÙ  r§  rf  .r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  r^   c                ó$  — t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        |�t        |«      n
t        |«      | _        t        |«      | _        t        |«      | _
        t        |«      | _        t        |	«      | _        t        |
«      | _        || _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        t        |€| j                  dz  n|«      | _        || _        || _        || _        t        |«      | _        || _        | j"                  dk  rt?        d«      ‚d| j$                  cxk  rdk  st?        d«      ‚ t?        d«      ‚| j&                  dk  rt?        d«      ‚d| j*                  cxk  rdk  st?        d	«      ‚ t?        d	«      ‚| j(                  dk  rt?        d
«      ‚| j,                  dk  rt?        d«      ‚| j.                  dk  rt?        d«      ‚| j,                  | j.                  kD  rt?        d«      ‚| j:                  dk  rt?        d«      ‚| j<                  dvrt?        d«      ‚tA        | j                  | j
                  | j                  | j                  d| j                  dd | j                  | j                  d ¬«      | _!        d | _"        | j                  rf| j                  dk(  rWtA        | j                  | j
                  | j                  | j                  d| j                  dd d| j                  d ¬«      | _"        tG        | j                  | j                  «      | _$        d | _%        d | _&        d | _'        d | _(        d | _)        d | _*        d | _+        d | _,        d| j                  v r;t[        | j                  | j                  | j                  | j                   «      | _&        d| j                  v röt]        | j                  dz  dz   | j0                  | j2                  | j.                  | j                  | j4                  | j6                  «      | _'        t_        | j,                  | j.                  | j<                  «      | _(        ta        | j,                  | j.                  | j<                  «      | _)        | j:                  dkD  r%tc        | j,                  | j:                  «      | _*        d| j                  v r<te        | j                  | j                  | j&                  | j(                  «      | _%        y y )NrY   r   zbandwidth_p must be > 0rV  rŽ  rw  r`   r~  z.contrast_quantile must lie in the range (0, 1)z'contrast_fmin must be a positive numberrÝ  r®  rÞ  rÂ  rß  rÃ  TFr  r>   r?   r'   r&   r,   )3rl  rf  re   r¬  rî   rU  r*  rž   r)  rÒ   rW  r  r  rÎ  r–  r¾  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  rc   r0   r  r«  r  r¦  r¬  rŒ  rí  r¼  r½  r¾  rK  r­  rÓ  rä  rç  rÄ  rë  r
  )rf   rf  r¬  rî   rU  r*  r)  rW  r  r  rÎ  r–  rÏ  r—  ru  r  r˜  r™  rÛ  r«  r™  rª  rš  r‰  rÂ  rè  rº  s                              rh   ri   z!SpectralFeatureTransform.__init__   s’  € ô< 9¸ÓAˆŒÜ˜{Ó+ˆÔÜ˜“ZˆŒ
Ü˜j›/ˆŒØ-7Ð-Cœ#˜jœ/ÌÈUËˆŒÜ˜Y›ˆŒÜ˜6“lˆŒÜ" ?Ó3ˆÔÜ" ?Ó3ˆÔÜ˜H›ˆŒØ&ˆÔÜ˜F“mˆŒÜ  Ó-ˆÔÜ! ,Ó/ˆÔÜ˜7“|ˆŒÜ" =Ó1ˆÔÜ!&Ð'8Ó!9ˆÔÜ˜&“kˆŒÜ˜&“kˆŒÜ˜5“\ˆŒ
Ü°E°M˜4×+Ñ+¨qÒ0ÀuÓMˆŒ
Ø ˆŒØ"ˆŒØˆŒÜ˜&“kˆŒØ ˆŒØ×Ñ˜qÒ ÜÐ6Ó7Ð7Ø�T×&Ñ&Ô,¨Ò,ÜÐHÓIÐIð -ÜÐHÓIÐIØ�<‰<˜!ÒÜÐAÓBÐBØ�T×+Ñ+Ô1¨cÒ1ÜÐMÓNÐNð 2ÜÐMÓNÐNØ×Ñ Ò$ÜÐFÓGÐGØ�;‰;˜!ÒÜÐ1Ó2Ð2Ø�;‰;˜!ÒÜÐ1Ó2Ð2Ø�;‰;˜Ÿ™Ò$ÜÐ7Ó8Ð8Ø�;‰;˜Š?ÜÐ2Ó3Ð3Ø�=‰= Ñ/ÜÐFÓGÐGä)Ø—*‘*Ø—‘Ø—‘Ø—n‘nØØ—;‘;ØØØ ×0Ñ0Ø ×0Ñ0Ø!%ô
ˆŒð  $ˆÔØ�;Š;˜4×/Ñ/°9Ò<Ü#4Ø—j‘jØŸ?™?ØŸ?™?ØŸ.™.ØØ—{‘{Ø ØØ *Ø $× 4Ñ 4Ø%)ô$ˆDÔ ô -¨T×-=Ñ-=¸t¿z¹zÓJˆŒ
Ø#ˆÔØˆŒØˆŒØˆŒØˆŒØ#ˆÔØ ˆÔØ#'ˆÔ à˜DŸL™LÑ(Ü6Ø× Ñ Ø—
‘
Ø—‘Ø—‘ó	ˆDŒNð �T—\‘\Ñ!Ü0Ø—
‘
˜a‘ !Ñ#Ø—
‘
Ø—
‘
Ø—‘Ø× Ñ Ø—‘Ø—‘óˆDŒKô .¨d¯k©k¸4¿;¹;ÈÏÉÓVˆDŒLÜ2°4·;±;ÀÇÁÈTÏ]É]Ó[ˆDŒOØ�{‰{˜QŠÜ'=¸d¿k¹kÈ4Ï;É;Ó'W�Ô$Ø $§,¡,Ñ.Ü#BØ× Ñ Ø—
‘
Ø—‘Ø×"Ñ"ó	$ˆDÕ ð /rj   ri  c           
      óÞ  — t        |d¬«      \  }}| j                  }| j                  r9| j                  dk(  r*t        |j                  d   «      | j
                  dz  k  rd}| j                  }|| j                  k7  r| j                  �| j                  }|j                  |d¬	«      }t        j                  |«      j                  t        j                  «      }d}d}	t        «       }
| j                  D �]u  }|d
k(  r|	€t        || j                   ¬«      }	|	}�n@|dk(  r=|	€t        || j                   ¬«      }	t#        || j                   | j$                  |	¬«      }nþ|dk(  r#t'        || j                   | j(                  ¬«      }nÖ|dk(  rOt+        || j,                  | j
                  | j.                  | j0                  | j2                  | j4                  ¬«      }n‚|dk(  r*|€||z  }t7        || j8                  | j:                  ¬«      }nS|dk(  r@|€||z  }t=        || j>                  | j@                  | jB                  | jD                  ¬«      }ntG        d|›�«      ‚tI        ||¬«      |
|<   �Œx |
S )zBCompute the configured feature set from a single shared STFT pass.r(   rP  r>   r`   rY   r?   Nr<   rE  r)   rr  r*   rž  r+   rŸ  r,   )r¬  rî   r  rz  r  r|  r'   rœ  r&   r�  r   r^  )%rS  r  rW  re   rk   rî   r  r«  rF  r'  r  rÿ  r  r   rf  rn  r¦  rt  r—  r{  ru  r‹  r¬  r  r˜  r™  r¬  r�  rŒ  r–  r’  rí  r½  rÂ  r¾  rc   r_  )rf   ri  rU  rV  rS  Ústft_transformr§  r'  r¾  ro  r4  rÁ   rC  s                rh   Úextractz SpectralFeatureTransform.extract�  sN  € ä+¨AÐ7JÔK‰ˆˆXØ$(×$8Ñ$8Ð!à�KŠKØ×$Ñ$¨	Ò1Ü�C—I‘I˜a‘LÓ! d§j¡j°A¡oÒ6à(2Ð%ØŸ™ˆØ$¨×(<Ñ(<Ò<À×AUÑAUÐAaØ!×1Ñ1ˆNØ×"Ñ" 3°eÐ"Ó<ˆÜ�f‰f�T‹l×!Ñ!¤"§*¡*Ó-ˆØˆØˆÜ*5«-ˆØ—L•LˆDØÐ*Ò*ØÐ#Ü:¸3ÀdÇjÁjÔQ�HØ ’ØÐ-Ò-ØÐ#Ü:¸3ÀdÇjÁjÔQ�HÜ4ØØŸ*™*Ø×&Ñ&Ø%ô	‘ð Ð+Ò+Ü2ØØŸ*™*Ø!%×!2Ñ!2ô‘ð
 Ð,Ò,Ü3ØØ $× 0Ñ 0ØŸ*™*Ø ŸL™LØ×+Ñ+Ø!×3Ñ3Ø $× 4Ñ 4ô‘ð ˜Ò&Ø�=Ø #™I�EÜ/ØØ"Ÿn™nØ×)Ñ)ô‘ð
 ˜’Ø�=Ø #™I�EÜ(ØØŸ;™;Ø"Ÿo™oØŸ;™;Ø#'×#7Ñ#7ô‘ô !Ð#>¸t¸hÐ!GÓHÐHÜ.¨u¸xÔHˆC�‹Iðe !ðf ˆ
rj   c                 ó$   — | j                  |«      S rn   )r±  r*  s     rh   r=  z!SpectralFeatureTransform.__call__×  s   € Ø�|‰|˜A‹Ðrj   c                 óˆ   ‡ — ‰ j                   }|�|S t        j                  dt        j                  fˆ fd„«       }|‰ _         |S )z7Return cached compiled raw values in ``include`` order.ri  c                 ód   •‡— ‰j                  | «      Št        ˆfd„‰j                  D «       «      S )Nc              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wrn   rŸ   )rq   rÁ   r4  s     €rh   rs   zSSpectralFeatureTransform._get_compiled_values.<locals>._compiled.<locals>.<genexpr>ã  s   øè ø€ Ð<©| t˜˜T�©|ùs   ƒ)r±  rw   rf  )ri  r4  rf   s    @€rh   rX   z@SpectralFeatureTransform._get_compiled_values.<locals>._compiledà  s%   ù€ à—,‘,˜q“/ˆCÜÓ<¨t¯|ª|Ó<Ó<Ð<rj   )r­  r'  r\  r  rf  s   `  rh   Ú_get_compiled_valuesz-SpectralFeatureTransform._get_compiled_valuesÚ  sJ   ø€ à×)Ñ)ˆØÐØˆMä	�‰ð	=œŸ™ô 	=ó 
ð	=ð $-ˆÔ ØÐrj   c                 óÀ   ‡ ‡— ‰ j                   }|�|S ‰ j                  «       Šdt        j                  dt        t
        t        j                  f   fˆ ˆfd„}|‰ _         |S )zBReturn a cached compiled callable matching :meth:`extract` output.ri  r^   c                 ó`   •—  ‰| «      }t        d„ t        ‰j                  |«      D «       «      S )Nc              3   ó*   K  — | ]  \  }}||f–— Œ y ­wrn   rŸ   )rq   rÁ   rC  s      rh   rs   zKSpectralFeatureTransform.get_compiled.<locals>._compiled.<locals>.<genexpr>ò  s   è ø€ ÐZÑ@Y±°°u  eœ}Ñ@Yùs   ‚)r   rï  rf  )ri  r  rf   Ú	values_fns     €€rh   rX   z8SpectralFeatureTransform.get_compiled.<locals>._compiledð  s)   ø€ Ù˜q“\ˆFÜÑZÄÀDÇLÁLÐRXÔ@YÓZÓZÐZrj   )rK  r¶  r'  r  r   rž   )rf   r‡   rX   rº  s   `  @rh   r@  z%SpectralFeatureTransform.get_compiledè  s^   ù€ à×"Ñ"ˆØÐØˆMà×-Ñ-Ó/ˆ	ð	[œŸ™ð 	[¤k´#´r·x±x°-Ñ&@ö 	[ð &ˆÔØÐrj   )r—   r˜   r™   rš   r›   rw   rž   r“   re   rÒ   r¾  r   r   r   ri   r'  r  r   r±  r=  r¶  r@  rŸ   rj   rh   r   r   Õ  s  „ ÙRð&€IðV 7;Ø!ØØØ!%ØØØ(Ø*ØØ$%ØØ Ø"ØØ$Ø#'ØØØØ"Ø$Ø&Ø#ØØ,3ò9Nð �s˜C�x‘ 4¨¡9Ñ,¨tÑ3ðNð ð	Nð
 ðNð ðNð ˜$‘JðNð ðNð ðNð ðNð ðNð ðNð ˜T‘\ðNð ðNð ðNð  ð!Nð" ð#Nð$ ð%Nð& !ð'Nð( ð)Nð* ð+Nð, ð-Nð. �t‰|ð/Nð0 ð1Nð2 ð3Nð4 ˜‘ð5Nð6 ð7Nð8 ˜'Ñ" TÑ)ð9Nð: 
ó;Nð`E˜Ÿ™ð E k°#°r·x±x°-Ñ&@ó EðN˜"Ÿ(™(ð  {°3¸¿¹°=Ñ'Aó òórj   r   )r¬  rî   rU  r*  r)  rW  r  r  c                óŠ   — t        | d||||||||¬«
      \  \  }	}
t        |	j                  t        j                  «      |
¬«      S )z'Weighted mean of frequencies per frame.)r)   )	rf  r¬  rî   rU  r*  r)  rW  r  r  r^  ©r¤  r_  rÿ  r'  r  )ri  r¬  rî   rU  r*  r)  rW  r  r  ro  rV  s              rh   r)   r)   ø  sO   € ô 5Ø	Ø&ØØØØØØØ'Ø'ôÑ�K€X�ô " (§/¡/´"·*±*Ó"=ÈÔQÐQrj   )	r¬  rî   rU  r*  rp  r)  rW  r  r  c       	         óŒ   — t        | d||||||||	|¬«      \  \  }
}t        |
j                  t        j                  «      |¬«      S )z9Weighted spectral bandwidth around the spectral centroid.)r*   )
rf  r¬  rî   rU  r*  r)  rW  r  r  r—  r^  r¼  )ri  r¬  rî   rU  r*  rp  r)  rW  r  r  Ú	bandwidthrV  s               rh   r*   r*     sT   € ô 6Ø	Ø'ØØØØØØØ'Ø'ØôÑ�L€Y�(ô " )×"2Ñ"2´2·:±:Ó">ÈÔRÐRrj   )	r¬  rî   rU  r*  ru  r)  rW  r  r  c       	         óR   — t        | d||||||||	|¬«      \  \  }
}t        |
|¬«      S )zGFrequency below which ``roll_percent`` of spectral energy is contained.)r+   )
rf  r¬  rî   rU  r*  r)  rW  r  r  ru  r^  r¦  )ri  r¬  rî   rU  r*  ru  r)  rW  r  r  r]  rV  s               rh   r+   r+   2  sE   € ô 1Ø	Ø%ØØØØØØØ'Ø'Ø!ôÑ�G€TˆXô " $°Ô:Ð:rj   )r¬  rî   rU  r*  r  rz  r  r)  rW  r  r  c                óV   — t        | d||||||	|
||||¬«      \  \  }}t        ||¬«      S )z4Peak-to-valley spectral contrast per octave subband.)r,   )rf  r¬  rî   rU  r*  r)  rW  r  r  r  r˜  r™  r^  r¦  )ri  r¬  rî   rU  r*  r  rz  r  r)  rW  r  r  ÚcontrastrV  s                 rh   r,   r,   P  sK   € ô  5Ø	Ø&ØØØØØØØ'Ø'ØØØ"ôÑ�K€X�ô " (°XÔ>Ð>rj   ©rL  rU  rW  rM  c                ó(  — t        | ||||¬«      \  }}t        j                  |j                  t        j                  «      dz  d¬«      }t        j
                  |«      dd…ddd…f   j                  t        j                  «      }t        ||¬«      S )z"Root-mean-square energy per frame.rÂ  rY   rï  rk  Nr^  )rP  r'  r�  rÿ  r  rà  r_  )	ri  rL  rU  rW  rM  rÉ  rV  r¾  r4  s	            rh   r-   r-   r  sz   € ô %Ø	Ø!ØØØôÑ€FˆHô �G‰G�V—]‘]¤2§:¡:Ó.°!Ñ3¸2Ô>€EÜ
�'‰'�%‹.š˜D¢!˜Ñ
$×
+Ñ
+¬B¯J©JÓ
7€CÜ! #°Ô9Ð9rj   c                ó@  — t        | ||||¬«      \  }}|dk\  }|ddd…f   |ddd…f   k7  j                  t        j                  «      }t        j                  |d¬«      t        |«      z  dd…ddd…f   j                  t        j                  «      }	t        |	|¬«      S )	z#Fraction of sign changes per frame.rÂ  r   .r`   Nrï  rk  r^  )rP  rÿ  r'  r  rð  r¾  r_  )
ri  rL  rU  rW  rM  rÉ  rV  ÚsignsÚ	crossingsÚrates
             rh   r.   r.   ‡  s    € ô %Ø	Ø!ØØØôÑ€FˆHð �a‰K€EØ�s˜A™B�w‘ 5¨¨c¨r¨c¨¡?Ñ2×:Ñ:¼2¿:¹:ÓF€IÜ�F‰F�9 2Ô&¬¨|Ó)<Ñ<ºaÀÂq¸jÑI×PÑPÔQS×Q[ÑQ[Ó\€DÜ! $°Ô:Ð:rj   ©r¬  rî   rU  r«  r™  rª  rW  rs  r¨  r‰  rÂ  r  r  c                óZ  — t        |«      }t        |«      }t        |«      }t        |«      }t        |«      }|dk  rt        d«      ‚| j                  dk(  }|r	| ddd…f   } t        di d|“d|“d|“d|“d|“d	|“d
d“d|	“d|
“d|“dd“dd“dd“d|“d|“d|“Ž}|j	                  | d¬«      }|j
                  d   }t        j                  |d|d…f   |dd| …f   z
  d«      }|}|r||d|z  z  z  }t        j                  |dd|dfg«      }|dd|…f   }|r|j                  d«      }|S ) a  Per-band half-wave rectified spectral flux of a dB-scaled mel spectrogram.

    Like ``onset_strength`` but returns per-mel-band curves *before*
    averaging across frequency.  Returns shape ``[n_mels, frames]`` for
    1-D input or ``[B, n_mels, frames]`` for batched input.
    r`   zlag must be >= 1Nr¬  rî   rU  r«  r™  rª  r¾  ry  r¨  r‰  rÂ  ru  rE   r)  rw  r+  TrW  r  r  rÆ  rï  .rV  rY   r  r   rŸ   )
re   rc   r€  r   r:  rk   r'  r—  rc  rÈ  )ri  r¬  rî   rU  r«  r™  rª  rW  rs  r¨  r‰  rÂ  r  r  rV  Úmel_trÚSrQ  ÚfluxÚ	pad_widths                       rh   Úonset_strength_multirÎ  ¢  s¼  € ô. �kÓ"€KÜ�‹J€EÜ�Z“€JÜ�‹[€FÜ
ˆc‹(€CØ
ˆQ‚wÜÐ+Ó,Ð,à�v‰v˜‰{€HÙØˆd’Aˆg‰Jˆä$ò Ùðáðñ ðñ ð	ñ
 ðñ ðñ ðñ ðñ ðñ ðñ ðñ ðñ ðñ ðñ (ðñ  (ð!€Fð( 	×Ñ˜q¨ÐÓ-€AØ�w‰w�r‰{€Hô �:‰:�a˜˜S™T˜	‘l Q s¨E¨c¨T¨E z¡]Ñ2°CÓ8€Dð €IÙØ�U˜q :™~Ñ.Ñ.ˆ	Ü�6‰6�$˜ ¨)°Q¨Ð8Ó9€Dð ��Y�h�Y�Ñ€DáØ�|‰|˜A‹ˆØ€Krj   c                ób   — t        | |||||||||	|
|||¬«      }t        j                  |d¬«      S )aZ  Half-wave rectified spectral flux of a dB-scaled mel spectrogram.

    Equivalent to ``onset_strength_multi`` averaged across mel bands.
    Defaults use Slaney mel scale with Slaney normalization to match
    librosa's ``onset.onset_strength`` conventions.  Returns shape
    ``[frames]`` for 1-D input or ``[B, frames]`` for batched input.
    rÈ  r°  rk  )rÎ  r'  r�  )ri  r¬  rî   rU  r«  r™  rª  rW  rs  r¨  r‰  rÂ  r  r  Úmultis                  rh   Úonset_strengthrÑ  í  sK   € ô0 !Ø	ØØØØØØØØØØØØ'Ø'ô€Eô  �7‰7�5˜rÔ"Ð"rj   c                 óô   — t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  ¬«
      S )N©
rî   rU  r*  r)  r+  rW  r  r  r  r  )r   rî   rU  r*  r)  r+  rW  r  r  r  r  rz   s    rh   rÖ   rÖ     s[   € äØ�i‰iØ—>‘>Ø—>‘>Ø—-‘-Ø—‘Ø�z‰zØ×+Ñ+Ø×+Ñ+Ø—>‘>Ø ×5Ñ5ôð rj   )r  r  r  r  c                 óx  — t        |
t        ¬«      }t        |t        j                  «      rt        | ||||||||	||¬«      S t        t        | «      t        |«      t        |«      t        |«      t        |«      t        |«      t        |«      t        |	«      t        |«      t        |«      ¬«
      }t        |«      S )zBReturn a cached or bespoke SpectralTransform for the given config.r  )rî   rU  r*  r)  rÊ  r+  rW  r  r  r  r  rÓ  )r  r?  rv   r'  r  r   r  re   rž   rÒ   rÖ   )rî   rU  r*  r)  r+  rW  r  rÊ  r  r  r  r`  r{   s                rh   r0   r0   +  s·   € ô /ØÜ4ôÐô �&œ"Ÿ(™(Ô#Ü ØØ!Ø!ØØØØØ+Ø+Ø!Ø!1ô
ð 	
ô Ü�%‹jÜ�z“?Ü�z“?Ü�i“.Ü�h“Ü�F‹|Ü˜OÓ,Ü˜OÓ,Ü˜
Ó#Ü Ð!1Ó2ô€Cô ! Ó%Ð%rj   r–   )Àrš   Úcollectionsr   r   r   Údataclassesr   Ú	functoolsr   Útypingr   r	   r
   Úmlx.coreÚcorer'  Ú__all__r2  r	  r‚  rã   rç   r@  r´  ræ  Úpathlibr4   r5   r6   r7   r  r/  r   r   r   r   r   r   r   r   r   r   r   rä   r€   r„  rÓ   rÅ   re   Ú_CACHE_STATS_TRACE_MAX_RAWr÷   rd   Ú_CACHE_STATS_TRACE_MAXrA  rÄ   r®   rž   rC  r¯   r±   rÀ   r‚   r3   rÒ   r�   r2   rë   rò   rú   r  r½  r  r  r1   Ú_METAL_K_BOUNDSrÌ  rÕ  rÚ  rN  rR  rg  rm  rØ  r<  r.  rF  ra  ro  rw   r“   rt  rÔ   r  r  r&  r   r8  rE  r9  rA  r  rK  rL  r¾  rB  rF  rO  rh  r\  rp  rr  r   r/   rg  r¡  r§  r   r    r!   rä  rç  rë  rô  rû  r   r  r  r  r  r?  r  ré  r  r%  r)  r1  r   r   r   r   r#   rr  r%   r   r·  r$   r   r&   rh  rÓ  rS  r_  rÚ  rß  r"   r  r
  rÄ  r  r  r  r(  r2  r¦  r™  r7  rP  rT  rX  rÒ  rl  rn  rt  r{  r‹  r�  r’  r¢  r¤  r'   r(   r   r)   r*   r+   r,   r-   r.   rÎ  rÑ  rÖ   r0   rŸ   rj   rh   Ú<module>rà     sÅ#  ðÚ Nç 3Ñ 3Ý !Ý ß +Ñ +å ò*€óX Û Û Û 	Û 
Û Û Û Ý ß #Ñ #ã àÐIÑJÐ Ø˜<Ñ(Ð ØÐ-Ñ.€ØÐ.Ñ/€Ø�?Ñ#€Ø
�(Ñ
˜dÑ
"€Ø
Ð>Ñ
?€ØÐ.Ñ/€ØÐ,Ñ-€
ØÐEÑFÐ ÷Y
ñ Y
ðx ‡J�J‡N�NÐ)¨3Ó/×5Ñ5Ó7Ø&ð'ð ð *ò Ø‡J�J‡N�NÐ/°Ó5×;Ñ;Ó=ÐA[Ð[ð ð%Ù!$ R§Z¡Z§^¡^Ð4TÐV[Ó%\Ó!]Ðñ ˜RÐ!;Ó<Ð Ø"�I—N‘NÓ$Ð Ù$+£IÐ �W˜S‘\Ó -Ø(*Ð �t˜C ˜H‘~Ó *Ù"Ð*@ÔAÐ �UÓ Að
˜cð 
 có 
ñ Ø59ÐSWò 1 #ð 1¨sð 1À8ÈCÁ=ð 1Ð\`ô 1ð 6:ÐSWò  #ð ¨sð À8ÈCÁ=ð Ð\`ó ô$ð ,1ò  Dð °Tó ð$;˜Tó ;ð*D˜Cð D¨cð D¸#ð DÀCð DÈCó Dð
�3ð ˜8 E¨#¨s°C¸Ð*<Ñ$=Ñ>ó ð˜Tð ¨ð °ó ð ‡J�J‡N�NÐ&¨Ó,×2Ñ2Ó4Ø&ð'ð ð ˜ð   ¨¡ó  ð"¨cð "°h¸s±mó "ñH �1Ôð2˜Sò 2ó ð2ðP€ðð ñðñÐ ð*ð ñðñÐ ð4 ð
 ñ ð

ñ Ð ð>'Ð #ð23'Ð #ð~>!Ð ðN"Ð ð. '2Ð #ð"Ð ÷ñ ÷0C4ñ C4÷L("ñ ("ðZ  "€
ˆD��e�ÑÓ !ð% 3ð %¨dð %°tó %÷`ñ `ðP  òQØ�H‰HðQà�H‰HðQð 
ðQð ð	Qð ðQð ‡X�XóQðt  òhØ�H‰Hðhà�H‰Hðhð �x‰xðhð 
ð	hð
 ðhð ðhð ‡X�XóhðZ �3˜Ÿ™ $Ð&Ñ'€
ðVàðVð —X‘XðVð ð	Vð
 ðVð ðVð ðVð óVð4 Ð ÙCNÃ=Ð Ð@Ó Pà!�9—>‘>Ó#Ð à‡J�J‡N�NÐ8¸(ÓCß
�UƒW�U‰U‹Wð ð Ð&9Ñ9Ø"*Ðð%Ù #Ø	‰3ˆr�z‰z�~‰~ÐAÀ6ÓJÓKó!Ðð	˜uð 	¨°%¸¸eÀSÐ8HÑ2IÑ)Jó 	ð:˜uð :¨U°4¸ÀÐ3CÑ-Dð :Èó :ð4Ø�S‰Mð4ð ð4ð ˆ3��X˜c‘] H¨S¡MÐ1Ñ2ó	4ð>  ò_
Ø"ð_
ð ð_
ð �S‰Mð	_
ð
 ð_
ð ð_
ð ð_
ð 
ó_
ðB ‡�ð5¨2¯8©8ð 5¸#ð 5À"Ç(Á(ò 5ó ð5ð7 "§(¡(ð 7°ð 7¸¿¹ó 7ð/Øð/àð/ð ð/ð ð	/ð
 ð/ð ‡X�Xó/ðb)3Øð)3à˜‘ð)3ð ˜‘ð)3ð 
ð	)3ð
 ˆ3��Sˆ=Ñó)3ðX >Cò �R—Z‘Z %Ñ'ð °sð ÀrÇzÁzó ð* 6;ò �R—Z‘Zð ¨sð ¸r¿z¹zó ð6 Øò-*Øð-*àð-*ð ð-*ð ð	-*ð
 ð-*ð ð-*ð ð-*ð ‡X�Xó-*ðf ,3Ø"ØØØ8Kò=!Ø	‡x�xð=!ð Ð'Ñ(ð=!ð �U‰Oð	=!ð
 ð=!ð ð=!ð Ð4Ñ
5ð=!ð ‡X�Xó=!ðH %,ò	+Øð+àð+ð �'Ñ
˜TÑ
!ð	+ð
 ‡X�Xó+ñ> �3ÔðØðàðð ðð ð	ð
 ðð ðð ðð ‡X�Xòó ðñ( �3Ôð;Øð;àð;ð �'Ñ
˜TÑ
!ð;ð ‡X�Xò	;ó ð;ñ �3ÔðØðàðð ‡X�Xòó ðð +0ò	?Ø�8‰8ð?ð �H‰Hð?ð ˜,Ñ'ð	?ð
 ‡X�Xó?ð( '+ò	
Ø�X‰Xð
ð �x‰xð
ð —H‘H˜t‘Oð	
ð
 ‡X�Xó
ð$ ò:Ø	‡x�xð:ð ð:ð ð	:ð
 ð:ð ‡X�Xó:ð IÐ Ø%Ð ð !òØ˜S‘Mðð ðð 	ó	ð"  òØ˜C‘=ðð ðð 	ó	ð !'Ð ñ �$Ô÷
ð 
ó ð
ð ‡J�J‡N�NÐ&¨Ó,×2Ñ2Ó4Ø&ð'ð ðØ	�‰ðàðð ðð ð	ð
 ˜‘ðð ðð ‡X�Xóð<Øðàðð ðð #ð	ð
 ˆ3�ˆ8�_óð&GØ	‡x�xðGð ðGð ð	Gð
 #ðGð #ðGð ‡X�XóGð0Ø�x‰xðàðð ðð ð	ð
 ˜‘ðð ðð ‡X�Xó÷Dmñ m÷`'^ñ ^ôB8Ð!8ô 8÷0fñ fðZ ØØØ $ØØ(0ØØØ"ØØØØ%.Ø%0Øò%&Ø	‡x�xð&ð —‘˜2Ÿ:™:Ñ%ð&ð ð	&ð
 ð&ð ð&ð ˜‘ð&ð ð&ð &ð&ð �D‰Lð&ð ð&ð ð&ð ð&ð ð&ð ð&ð  #ð!&ð" #ð#&ð$ ð%&ð& ‡X�Xó'&ðZ ò	7àð7ð ð7ð ð	7ð
 	ó7ð0 Ø!ØØØò"'Ø	‡x�xð"'ð 
ˆt‰ð"'ð �d‘
ð	"'ð
 �D‰jð"'ð ð"'ð ð"'ð ‡X�Xó"'÷JRñ Rñj �2ÔðØðàðð ðð ð	ð
 ðð ðð ðð ðð òó ðð2 ØØ#ØØØØÙóØ	‡x�xðð 	ðð ð	ð
 ðð ðð ðð ðð ðð ðð ‡X�Xô÷4Jó Jð` ÙØØØ $ØÙØ!ØØ"Ø"ØØØ%.Ø%0ØØ(/ó'-Ø	‡x�xð-ð ð-ð ð	-ð
 ð-ð ð-ð ˜‘ð-ð ð-ð ð-ð �E‰?ð-ð ð-ð ð-ð �U‰Oð-ð ð-ð ð-ð  #ð!-ð" #ð#-ð$ ñ%-ð& �gÑ Ñ%ð'-ð( ‡X�Xô)-ñhÐ ñ �3ÔðØðàñð ñð ð	ð
 ‡X�Xóó ðð˜2Ÿ8™8ñ °ð ¸¸r¿x¹xÈ¸~Ñ9Nô ð#˜bŸh™hñ #°Tð #¸b¿h¹hô #ð- #ð -¨cð -°b·h±hô -ðZØðZàñZð ð	Zð
 ‡Z�ZôZñ4  ØØØ!óSAØðSAàñSAð ðSAð
 ðSAð ñSAð �4‰<ñSAð ñSAð ñSAð ðSAð ‡X�XôSAñl �3Ôð:¨ð :°Sð :¸R¿X¹Xó :ó ð:ñ �3ÔðØðàñð ðð ð	ð
 ˆ5��c�‰?™CÐÑ óó ðñ8 �3ÔðTØðTàðTð �'Ñ
˜TÑ
!ðTð ‡X�Xó	Tó ðTðZØðZð ðZð ð	Zð
 ‡Z�ZôZñ$9˜rŸz™zð 9¨b¯j©jô 9ñ" ô0à�:‰:ð0ð 	ð0ð ñ	0ð
 �:‰:ñ0ð ð0ð ‡Z�Zô0ñ: Ø!ó0?àñ0?ð �:‰:ð0?ð ð	0?ð
 ð0?ð ñ0?ð �:‰:ñ0?ð ð0?ð �d‘
ð0?ð ˆ2�:‰:�s˜BŸJ™JÐ&Ñ'ô0?ñf �2Ôð= §¡ó =ó ð=ð'˜bŸh™hð '¨2¯8©8ô 'ñ ‘2ÔðVØðVàðVð ðVð ð	Vð
 ðVð ðVð ðVð ðVð 
ˆ#ˆsˆ(�^óVó ðVðr6Ø	‡x�xð6ð 
ð6ð ð	6ð
 ‡X�Xô6ð#+Ø	‡x�xñ#+ð ð#+ð ð	#+ð
 ñ#+ð ð#+ð ˆ2�8‰8�Tˆ>Ñô#+ðL'Ø	‡x�xð'ð ð'ð ð	'ð
 ð'ð ˜‘ð'ð ð'ð ð'ð ð'ð #ð'ð #ð'ð ˆ2�8‰8�Tˆ>Ñô'ðT(Ø	‡x�xð(ð �$‰,ñ(ð ð	(ð
 ‡X�Xô(ð4 Ùó$+Øð$+àñ$+ð ñ	$+ð
 ð$+ð ‡X�Xô$+ñNØ�3™�8‰_˜t C™yÑ(¨4Ñ/ðà
ˆ3‘ˆ8�_ôñ$bØ	�‰ñbð �8‰8ðbð ‡X�Xô	bð !%ôfØ	�‰ñfð �8‰8ñfð ñ	fð
 �h‰h˜‰oðfð ‡X�Xôfñ"/Ø	�‰ñ/ð �8‰8ñ/ð ð	/ð
 ‡X�Xô/ð0 7;ô(4Ø	�‰ð(4ð ð(4ð ñ	(4ð
 ð(4ð ñ(4ð ñ(4ð �u˜S #˜X‘©Ð+Ñ,¨tÑ3ð(4ð ‡X�Xô(4ðV6Ø�8‰8ñ6ð �x‰xð6ð �$‰,ð	6ð
 ‡X�Xô6ð   Ø&*óØ�8‰8ðð �H‰Hðð �x‰xð	ð
 �D‰Lðð —H‘H˜t‘Oðð ‡X�Xôð. Ù !ÙÙÙÙÙ Ù#ÙØÙØØ Ø"ØØØ(/ô-tØ	�‰ñtð �3™�8‰_ðtð ð	tð
 ñtð ñtð ˜‘ñtð ñtð ñtð ñtð ñtð ñtð ðtð ðtð ðtð  ð!tð" �4‰<ñ#tð$ ð%tð& ð'tð( �D‰Lð)tð* ñ+tð, �gÑ Ñ%ð-tð. ˆ2�8‰8‘Sˆ=Ñô/tðv ØØØ!ØØØ$Ø&ØÙ !ÙÙÙÙÙ Ù#ÙØÙØØ Ø"ØØØ(/ó9BØ	‡x�xñBð �3™�8‰_ðBð ð	Bð
 ðBð ðBð �d‘
ðBð ðBð ðBð ðBð ñBð ñBð ˜‘ñBð ñBð ñBð  ñ!Bð" ñ#Bð$ ñ%Bð& ð'Bð( ð)Bð* ð+Bð, ð-Bð. �4‰<ñ/Bð0 ð1Bð2 ð3Bð4 �D‰Lð5Bð6 ñ7Bð8 �gÑ Ñ%ð9Bð: ˆ5�—‘™3�Ñ Ð%Ñ&ô;BðP ØØØ!ØÙØØØ$Ø&ÙóAØ	‡x�xðAð ðAð ð	Að
 ðAð �d‘
ñAð ðAð �$‰,ðAð ðAð ðAð ðAð ñAð ðAð ‡X�XôAðJ 37ØØØØ!ØØØ$Ø&ØÙ !ÙÙÙÙÙ Ù#ÙØÙØØ Ø"ØØØ(/ó9@Ø	‡x�xñ@ð �3™�8‰_˜t C™yÑ(¨4Ñ/ð@ð ð	@ð
 ð@ð ð@ð �d‘
ð@ð ð@ð ð@ð ð@ð ñ@ð ñ@ð ˜‘ñ@ð ñ@ð ñ@ð  ñ!@ð" ñ#@ð$ ñ%@ð& ð'@ð( ð)@ð* ð+@ð, ð-@ð. �4‰<ñ/@ð0 ð1@ð2 ð3@ð4 �D‰Lð5@ð6 ñ7@ð8 �gÑ Ñ%ð9@ð: 
ˆ#ˆr�x‰xˆ-Ñô;@÷F`ó `ðL	 ØØØ!ØØØ$Ø&óRØ	‡x�xðRð ðRð ð	Rð
 ðRð �d‘
ðRð ðRð ðRð ðRð ðRð ‡X�XôRð> ØØØ!ÙØØØ$Ø&óSØ	‡x�xðSð ðSð ð	Sð
 ðSð �d‘
ñSð ðSð ðSð ðSð ðSð ðSð ‡X�XôSðB ØØØ!ÙØØØ$Ø&ó;Ø	‡x�xð;ð ð;ð ð	;ð
 ð;ð �d‘
ñ;ð ð;ð ð;ð ð;ð ð;ð ð;ð ‡X�Xô;ðB ØØØ!ÙÙÙØØØ$Ø&ó?Ø	‡x�xð?ð ð?ð ð	?ð
 ð?ð �d‘
ñ?ð ð?ð ñ?ð ð?ð ð?ð ð?ð ð?ð ð?ð ‡X�Xô?ðJ ØØØó:Ø	‡x�xñ:ð ð:ð ð	:ð
 ñ:ð ð:ð ‡X�Xô:ð0 ØØØó;Ø	‡x�xñ;ð ð;ð ð	;ð
 ñ;ð ð;ð ‡X�Xô;ð< ØØØÙØ!ØØØØ"Ø"Ø%.Ø%0óHØ	‡x�xðHð ðHð ð	Hð
 ðHð ðHð ðHð �E‰?ðHð ðHð 
ðHð ðHð ðHð �U‰OðHð #ðHð #ðHð  ‡X�Xô!Hð\ ØØØÙØ!ØØØØ"Ø"Ø%.Ø%0ó(#Ø	‡x�xð(#ð ð(#ð ð	(#ð
 ð(#ð ð(#ð ð(#ð �E‰?ð(#ð ð(#ð 
ð(#ð ð(#ð ð(#ð �U‰Oð(#ð #ð(#ð #ð(#ð  ‡X�Xô!(#ñ^ �2Ôð˜}ð Ð1Bó ó ðð0 &/Ø%0Ø*.ó.&àð.&ð ð.&ð ð	.&ð
 ð.&ð ð.&ð ð.&ð ð.&ð ð.&ð #ð.&ð #ñ.&ð # 3™-ð.&ð õ.&øðqs ò %Ø!$Óð%ûðf& ò %Ø $Óð%ús.   Ã>"AG" Î)AG0 ÁG"AG-ÁG,AG-ÁG0AG;ÁG:AG;