+
    LV-jãw  ã                   óü   € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 . ROt
 ! R R]4      t ! R R4      t ! R R]	4      t]P                  ]P                   0tR	 tR
 tRR ltR tR tR tRR ltR tR tR# )zÂ
Module to read / write wav files using NumPy arrays

Functions
---------
`read`: Return the sample rate (in samples/sec) and data from a WAV file.

`write`: Write a NumPy array as a WAV file.

N)ÚIntEnumÚWavFileWarningc                   ó   € ] tR t^tRtRtR# )r   zÃ
Warning for WAV files with format issues that can still be read.

Raised when a WAV file has problems like missing metadata or 
non-standard formatting, but can still be processed successfully.
© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    Úa/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/scipy/io/wavfile.pyr   r      s   † ñó 	r   c                   óf   a € ] tR t^%t o RtR tR
R lt]P                  3R lt	R t
R tR tRtV tR	# )ÚSeekEmulatingReaderzö
Tracks stream position, provides tell(), and emulates only those
seeks that can be supported by reading forward. Other seeks raise
io.UnsupportedOperation. Note that this class implements only the
minimum necessary to keep wavfile.read() happy.
c                ó    € Wn         ^ V n        R# )é    N)ÚreaderÚpos)Úselfr   s   &&r   Ú__init__ÚSeekEmulatingReader.__init__,   s   € ØŒØˆŽr   c               ó€   € V P                   P                  V4      pV ;P                  \        V4      ,          un        V# ©N)r   Úreadr   Úlen)r   ÚsizeÚdatas   "" r   r   ÚSeekEmulatingReader.read0   s-   € Ø�{‰{×Ñ Ó%ˆØ�Š”C˜“IÕ�Øˆr   c               óº  € T;\         P                  8X  d?   WP                  8¼  d/    V P                  WP                  ,
          4       V P                  # ;\         P                  8X  d&   V^ 8¼  d    V P                  V4       V P                  # \         P
                  8X  d$   V^ 8X  d   V P                  4        V P                  #  \        P                  ! R4      h)r   zNSeekEmulatingReader was asked to emulate a seek operation it does not support.)ÚosÚSEEK_SETr   r   ÚSEEK_CURÚSEEK_ENDÚioÚUnsupportedOperation)r   ÚoffsetÚwhences   """r   ÚseekÚSeekEmulatingReader.seek5   s    € ØØ”—– ¯(©(Ô 2Ù—	‘	˜&§8¡8Õ+Ô,ð �x‰xˆð ”—– ¨!¤Ù—	‘	˜&Ô!ð �x‰xˆô —– ¨!¤Ø—	‘	”ð �x‰xˆð Ü×-Ò-ð /Wó Xð Xr   c                ó   € V P                   # r   )r   ©r   s   &r   ÚtellÚSeekEmulatingReader.tellB   s   € Ø�x‰xˆr   c                ó:   € V P                   P                  4        R # r   )r   Úcloser*   s   &r   r.   ÚSeekEmulatingReader.closeE   s   € Ø�‰×ÑÖr   c                ó.   € \         P                  ! R 4      h)z SeekEmulatingReader can't flush.)r#   r$   r*   s   &r   ÚflushÚSeekEmulatingReader.flushJ   s   € Ü×%Ò%Ð&HÓIÐIr   )r   r   N)éÿÿÿÿ)r   r   r   r	   r
   r   r   r   r    r'   r+   r.   r1   r   Ú__classdictcell__)Ú__classdict__s   @r   r   r   %   s8   ø‡ € ñòôð
 #%§+¡+ô òò÷
Jð Jr   r   c                   ón  € ] tR t^NtRt^ t^t^t^t^t	^t
^t^t^t^	t^
t^t^t^t^t^t^t^t^t^t^t^t^t^t^ t^!t^"t^#t ^$t!^%t"^&t#^'t$^(t%^0t&^1t'^2t(^3t)^4t*^5t+^6t,^7t-^8t.^9t/^:t0^;t1^<t2^=t3^@t4^At5^Bt6^Ct7^Dt8^Et9^Pt:^Rt;^St<^Ut=^Yt>^`t?^at@^btA^ctB^dtC^etD^ftE^gtF^itG^ptH^qtI^rtJ^stK^ttL^utM^vtN^wtO^xtP^ytQ^ztR^{tS^€tT^�tU^‚tV^ƒtW^„tX^…tY^†tZ^ˆt[^‰t\^Št]^‹t^^Œt_^�t`^‘ta^’tb^“tc^”td^—te^˜tf^™tg^ th^¡ti^¢tj^£tk^¤tl^°tm^ÿtnRtoRtpRtqRtrRtsRttRtuR	tvR
twRtxRtyRtzRt{Rt|Rt}Rt~RtRt€Rt�Rt‚RtƒRt„Rt…Rt†Rt‡RtˆRt‰RtŠRt‹RtŒR t�R!tŽR"t�R#t�R$t‘R%t’R&t“R't”R(t•R)t–R*t—R+t˜R,t™R-tšR.t›R/tœR0t�R1tžR2tŸR3t R4t¡R5t¢R6t£R7t¤R8t¥R9t¦R:t§R;t¨R<t©R=tªR>t«R?t¬R@t­RAt®RBt¯RCt°RDt±REt²RFt³RGt´RHtµRIt¶RJt·RKt¸RLt¹RMtºRNt»ROt¼RPt½RQt¾RRt¿RStÀRTtÁRUtÂRVtÃRWtÄRXtÅRYtÆRZtÇR[tÈR\tÉR]tÊR^tËR_tÌR`tÍRatÎRbtÏRctÐRdtÑRetÒRftÓRgtÔRhtÕRitÖRjt×RktØRltÙRmtÚRntÛRotÜRptÝRqtÞRrtßRstàRttáRutâRvtãRwtäRxtåRytæRztçR{tèR|téR}têR~tëRtìR€tíR�tîR‚tïRƒtðR„tñR…tòR†tóR‡tôRˆtõR‰töRŠt÷R‹tøRŒtùR�túRŽtûR�tüR�týR‘tþR’tÿR“Et R”EtR•EtR–EtR—EtR˜EtR™EtRšEtR›EtRœEt	R�Et
RžEtRŸEtR EtR¡EtR¢EtR£EtR¤EtR¥# )¦ÚWAVE_FORMATzŠ
WAVE form wFormatTag IDs

Complete list is in mmreg.h in Windows 10 SDK.  ALAC and OPUS are the
newest additions, in v10.0.14393 2016-07
é   i  i  i  i   i!  i#  i%  i0  i1  i2  i3  i4  i5  i6  i@  iA  iB  iP  iQ  iU  i`  ia  ib  ic  id  ip  iq  ir  is  it  iu  iv  iw  ix  i€  i�  i   i  i  i  i  i  i   i0  i@  iA  iI  iP  iQ  i`  ip  iq  ir  is  i€  i�  i…  i   iP  iQ  i   i  i  iP  i   i  i€  i�  i®  i   i  i  i  i  i   i  i  i  i  i   i  i   i   i  i  i  i	  i
  i  i  i  iq  iy  i  i  i  iÄ  i    i   i3  iCA  iB  iCB  iLC  iLV  iVW  iOg  iPg  iQg  iog  ipg  iqg  ial  i p  iOp  imp  ias  ibs  ics  i!z  i"z  i ¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i	¡  i
¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i¡  i ¡  i!¡  i"¡  i#¡  i$¡  i¬ñ  iþÿ  iÿÿ  r   N(  r   r   r   r	   r
   ÚUNKNOWNÚPCMÚADPCMÚ
IEEE_FLOATÚVSELPÚIBM_CVSDÚALAWÚMULAWÚDTSÚDRMÚ	WMAVOICE9Ú
WMAVOICE10Ú	OKI_ADPCMÚ	DVI_ADPCMÚ	IMA_ADPCMÚMEDIASPACE_ADPCMÚSIERRA_ADPCMÚ
G723_ADPCMÚDIGISTDÚDIGIFIXÚDIALOGIC_OKI_ADPCMÚMEDIAVISION_ADPCMÚCU_CODECÚHP_DYN_VOICEÚYAMAHA_ADPCMÚSONARCÚDSPGROUP_TRUESPEECHÚECHOSC1ÚAUDIOFILE_AF36ÚAPTXÚAUDIOFILE_AF10ÚPROSODY_1612ÚLRCÚ	DOLBY_AC2ÚGSM610ÚMSNAUDIOÚANTEX_ADPCMEÚCONTROL_RES_VQLPCÚDIGIREALÚ	DIGIADPCMÚCONTROL_RES_CR10ÚNMS_VBXADPCMÚCS_IMAADPCMÚECHOSC3ÚROCKWELL_ADPCMÚROCKWELL_DIGITALKÚXEBECÚ
G721_ADPCMÚ	G728_CELPÚMSG723ÚINTEL_G723_1Ú
INTEL_G729Ú
SHARP_G726ÚMPEGÚRT24ÚPACÚ
MPEGLAYER3ÚLUCENT_G723ÚCIRRUSÚESPCMÚVOXWAREÚCANOPUS_ATRACÚ
G726_ADPCMÚ
G722_ADPCMÚDSATÚDSAT_DISPLAYÚVOXWARE_BYTE_ALIGNEDÚVOXWARE_AC8ÚVOXWARE_AC10ÚVOXWARE_AC16ÚVOXWARE_AC20ÚVOXWARE_RT24ÚVOXWARE_RT29ÚVOXWARE_RT29HWÚVOXWARE_VR12ÚVOXWARE_VR18ÚVOXWARE_TQ40ÚVOXWARE_SC3ÚVOXWARE_SC3_1Ú	SOFTSOUNDÚVOXWARE_TQ60ÚMSRT24ÚG729AÚMVI_MVI2ÚDF_G726Ú	DF_GSM610ÚISIAUDIOÚONLIVEÚMULTITUDE_FT_SX20ÚINFOCOM_ITS_G721_ADPCMÚCONVEDIA_G729Ú
CONGRUENCYÚSBC24ÚDOLBY_AC3_SPDIFÚMEDIASONIC_G723ÚPROSODY_8KBPSÚZYXEL_ADPCMÚPHILIPS_LPCBBÚPACKEDÚMALDEN_PHONYTALKÚRACAL_RECORDER_GSMÚRACAL_RECORDER_G720_AÚRACAL_RECORDER_G723_1ÚRACAL_RECORDER_TETRA_ACELPÚNEC_AACÚRAW_AAC1ÚRHETOREX_ADPCMÚIRATÚ	VIVO_G723Ú
VIVO_SIRENÚPHILIPS_CELPÚPHILIPS_GRUNDIGÚDIGITAL_G723ÚSANYO_LD_ADPCMÚSIPROLAB_ACEPLNETÚSIPROLAB_ACELP4800ÚSIPROLAB_ACELP8V3ÚSIPROLAB_G729ÚSIPROLAB_G729AÚSIPROLAB_KELVINÚVOICEAGE_AMRÚ	G726ADPCMÚDICTAPHONE_CELP68ÚDICTAPHONE_CELP54ÚQUALCOMM_PUREVOICEÚQUALCOMM_HALFRATEÚTUBGSMÚMSAUDIO1ÚWMAUDIO2ÚWMAUDIO3ÚWMAUDIO_LOSSLESSÚWMASPDIFÚUNISYS_NAP_ADPCMÚUNISYS_NAP_ULAWÚUNISYS_NAP_ALAWÚUNISYS_NAP_16KÚSYCOM_ACM_SYC008ÚSYCOM_ACM_SYC701_G726LÚSYCOM_ACM_SYC701_CELP54ÚSYCOM_ACM_SYC701_CELP68ÚKNOWLEDGE_ADVENTURE_ADPCMÚFRAUNHOFER_IIS_MPEG2_AACÚDTS_DSÚCREATIVE_ADPCMÚCREATIVE_FASTSPEECH8ÚCREATIVE_FASTSPEECH10Ú
UHER_ADPCMÚULEAD_DV_AUDIOÚULEAD_DV_AUDIO_1ÚQUARTERDECKÚILINK_VCÚ	RAW_SPORTÚESST_AC3ÚGENERIC_PASSTHRUÚIPI_HSXÚ	IPI_RPELPÚCS2ÚSONY_SCXÚSONY_SCYÚSONY_ATRAC3ÚSONY_SPCÚTELUM_AUDIOÚTELUM_IA_AUDIOÚNORCOM_VOICE_SYSTEMS_ADPCMÚFM_TOWNS_SNDÚMICRONASÚMICRONAS_CELP833ÚBTV_DIGITALÚINTEL_MUSIC_CODERÚINDEO_AUDIOÚQDESIGN_MUSICÚON2_VP7_AUDIOÚON2_VP6_AUDIOÚ	VME_VMPCMÚTPCÚLIGHTWAVE_LOSSLESSÚOLIGSMÚOLIADPCMÚOLICELPÚOLISBCÚOLIOPRÚLH_CODECÚLH_CODEC_CELPÚLH_CODEC_SBC8ÚLH_CODEC_SBC12ÚLH_CODEC_SBC16ÚNORRISÚ
ISIAUDIO_2ÚSOUNDSPACE_MUSICOMPRESSÚMPEG_ADTS_AACÚMPEG_RAW_AACÚ	MPEG_LOASÚNOKIA_MPEG_ADTS_AACÚNOKIA_MPEG_RAW_AACÚVODAFONE_MPEG_ADTS_AACÚVODAFONE_MPEG_RAW_AACÚ
MPEG_HEAACÚVOXWARE_RT24_SPEECHÚSONICFOUNDRY_LOSSLESSÚINNINGS_TELECOM_ADPCMÚLUCENT_SX8300PÚLUCENT_SX5363SÚCUSEEMEÚNTCSOFT_ALF2CM_ACMÚDVMÚDTS2ÚMAKEAVISÚDIVIO_MPEG4_AACÚNOKIA_ADAPTIVE_MULTIRATEÚ
DIVIO_G726ÚLEAD_SPEECHÚLEAD_VORBISÚWAVPACK_AUDIOÚOGG_VORBIS_MODE_1ÚOGG_VORBIS_MODE_2ÚOGG_VORBIS_MODE_3ÚOGG_VORBIS_MODE_1_PLUSÚOGG_VORBIS_MODE_2_PLUSÚOGG_VORBIS_MODE_3_PLUSÚALACÚ	_3COM_NBXÚOPUSÚFAAD_AACÚAMR_NBÚAMR_WBÚAMR_WPÚGSM_AMR_CBRÚGSM_AMR_VBR_SIDÚCOMVERSE_INFOSYS_G723_1ÚCOMVERSE_INFOSYS_AVQSBCÚCOMVERSE_INFOSYS_SBCÚSYMBOL_G729_AÚVOICEAGE_AMR_WBÚINGENIENT_G726Ú	MPEG4_AACÚENCORE_G726Ú	ZOLL_ASAOÚSPEEX_VOICEÚVIANIX_MASCÚWM9_SPECTRUM_ANALYZERÚWMF_SPECTRUM_ANAYZERÚGSM_610ÚGSM_620ÚGSM_660ÚGSM_690ÚGSM_ADAPTIVE_MULTIRATE_WBÚPOLYCOM_G722ÚPOLYCOM_G728ÚPOLYCOM_G729_AÚPOLYCOM_SIRENÚGLOBAL_IP_ILBCÚRADIOTIME_TIME_SHIFT_RADIOÚNICE_ACAÚ
NICE_ADPCMÚVOCORD_G721ÚVOCORD_G726ÚVOCORD_G722_1ÚVOCORD_G728ÚVOCORD_G729ÚVOCORD_G729_AÚVOCORD_G723_1Ú
VOCORD_LBCÚ	NICE_G728ÚFRACE_TELECOM_G729ÚCODIANÚFLACÚ
EXTENSIBLEÚDEVELOPMENTr   r   r   r   r7   r7   N   sƒ  † ñð €GØ
€CØ€EØ€JØ€EØ€HØ€DØ€EØ
€CØ
€CØ€IØ€JØ€IØ€IØ€IØÐØ€LØ€JØ€GØ€GØÐØÐØ€HØ€LØ€LØ€FØ ÐØ€GØ€NØ€DØ€NØ€LØ
€CØ€IØ€FØ€HØ€LØÐØ€HØ€IØÐØ€LØ€KØ€GØ€NØÐØ€EØ€JØ€IØ€FØ€LØ€JØ€JØ€DØ€DØ
€CØ€JØ€KØ€FØ€EØ€GØ€MØ€JØ€JØ€DØ€LØ!ÐØ€KØ€LØ€LØ€LØ€LØ€LØ€NØ€LØ€LØ€LØ€KØ€MØ€IØ€LØ€FØ€EØ€HØ€GØ€IØ€HØ€FØÐØ#ÐØ€MØ€JØ€EØ€OØ€OØ€MØ€KØ€MØ€FØÐØÐØ"ÐØ"ÐØ!'ÐØ€GØ€HØ€NØ€DØ€IØ€JØ€LØ€OØ€LØ€NØÐØÐØÐØ€MØ€NØ€OØ€LØ€IØÐØÐØÐØÐØ€FØ€HØ€HØ€HØÐØ€HØÐØ€OØ€OØ€NØÐØ#ÐØ$ÐØ$ÐØ &ÐØ%ÐØ€FØ€NØ!ÐØ"ÐØ€JØ€NØÐØ€KØ€HØ€IØ€HØÐØ€GØ€IØ
€CØ€HØ€HØ€KØ€HØ€KØ€NØ!'ÐØ€LØ€HØÐØ€KØÐØ€KØ€MØ€MØ€MØ€IØ
€CØÐØ€FØ€HØ€GØ€FØ€FØ€HØ€MØ€MØ€NØ€NØ€FØ€JØ$ÐØ€MØ€LØ€IØ ÐØÐØ#ÐØ"ÐØ€JØ ÐØ"ÐØ"ÐØ€NØ€NØ€GØÐØ
€CØ€DØ€HØ€OØ%ÐØ€JØ€KØ€KØ€MØÐØÐØÐØ#ÐØ#ÐØ#ÐØ€DØ€IØ€DØ€HØ€FØ€FØ€FØ€KØ€OØ$ÐØ$ÐØ!ÐØ€MØ€OØ€NØ€IØ€KØ€IØ€KØ€KØ"ÐØ!ÐØ€GØ€GØ€GØ€GØ &ÐØ€LØ€LØ€NØ€MØ€NØ!'ÑØ�HØ�JØ�KØ�KØ�MØ�KØ�KØ�MØ�MØ�JØ�IØÑØ�FØ�DØ�JØ†Kr   r7   c                 ó¸   €  \        V 4      P                  p\        RV R2RP                  R \         4       4      ,           4      h  \         d    T R  p LAi ; i)z#06xzUnknown wave file format: z. Supported formats: z, c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir   )Úname)Ú.0Úxs   & r   Ú	<genexpr>Ú$_raise_bad_format.<locals>.<genexpr>m  s   é € ÐBÑ/A¨!ŸvžvÓ/Aùs   ‚)r7   rG  Ú
ValueErrorÚjoinÚKNOWN_WAVE_FORMATS)Ú
format_tagÚformat_names   & r   Ú_raise_bad_formatrQ  f  sm   € ð+Ü! *Ó-×2Ñ2ˆô Ð1°+°ð ?!ð !à—Y‘YÑBÕ/AÓBÓBõCó Dð Døô ô +Ø# DÐ)Šð+ús   ‚A ÁAÁAc                ó¼  € V'       d   RpMRp\         P                  ! VR,           V P                  ^4      4      ^ ,          pV^8  d   \        R4      h\         P                  ! VR,           V P                  ^4      4      p^pVw  rgr‰r«V\        P
                  8X  dÇ   V^8¼  dÀ   \         P                  ! VR,           V P                  ^4      4      ^ ,          pV^,          pV^8¼  dq   V P                  ^4      pV^,          pV^^ pV'       d   RpMRpVP                  V4      '       d-   \         P                  ! VR,           VR	,          4      ^ ,          pM\        R4      hV\        9  d   \        V4       W58”  d   V P                  W5,
          4       \        W4       V\        P                  8X  d"   W˜V
,          8w  d   \        R
V RV
 RV	 24      hW6WxWšV3# )aÕ  
Returns
-------
size : int
    size of format subchunk in bytes (minus 8 for "fmt " and itself)
format_tag : int
    PCM, float, or compressed format
channels : int
    number of channels
fs : int
    sampling frequency in samples per second
bytes_per_second : int
    overall byte rate for the file
block_align : int
    bytes per sample, including all channels
bit_depth : int
    bits per sample

Notes
-----
Assumes file pointer is immediately after the 'fmt ' id
Ú>Ú<ÚIz.Binary structure of wave file is not compliantÚHHIIHHÚHs      €  ª 8›qs      €  ª 8›q:Né   Nz{WAV header is invalid: nAvgBytesPerSec must equal product of nSamplesPerSec and nBlockAlign, but file has nSamplesPerSec = z, nBlockAlign = z, and nAvgBytesPerSec = )ÚstructÚunpackr   rL  r7   rC  ÚendswithrN  rQ  Ú_handle_pad_byter:   )ÚfidÚis_big_endianÚfmtr   ÚresÚ
bytes_readrO  ÚchannelsÚfsÚbytes_per_secondÚblock_alignÚ	bit_depthÚext_chunk_sizeÚextensible_chunk_dataÚraw_guidÚtails   &&              r   Ú_read_fmt_chunkrk  p  sº  € ÷. Ø‰àˆä�=Š=˜˜S� #§(¡(¨1£+Ó.¨qÕ1€Dàˆb„yÜÐIÓJÐJä
�-Š-˜˜H� c§h¡h¨r£lÓ
3€CØ€JàILÑF€J˜"°à”[×+Ñ+Ô+°¸´ÜŸš s¨3¥w°·±¸³Ó<¸QÕ?ˆØ�a�ˆ
Ø˜RÔØ$'§H¡H¨R£LÐ!Ø˜"ÕˆJØ,¨S°Ð8ˆH÷ ØJ‘àJ�Ø× Ñ  ×&Ò&Ü#Ÿ]š]¨3¨s­7°H¸RµLÓAÀ!ÕD�
øäÐMÓNÐNàÔ+Ô+Ü˜*Ô%ð ÔØ�‰�Õ"Ô#ô �SÔà”[—_‘_Ô$Ø KÕ/Ô/Üð !ð "$ Ð$4°[°Mð B3Ø3CÐ2Dð	Fó Gð Gð ˜hÐ,<Øðð r   c	                ó¶  € V'       d   Rp	MRp	V'       g6   \         P                  ! V	R,           V P                  ^4      4      ^ ,          p
MTp
V P                  ^4       Wb,          pW«,          pV\        P                  8X  d>   ^Tu;8:  d   ^8:  d   M MRpMfVR9   d   RpM\V^@8:  d	   V	 RV 2pMM\        RV R24      hV\        P                  8X  d   VR9   d	   V	 R	V 2pM\        RV R
24      h\        V4       V P                  4       pV'       gñ    XR8X  d   T
MTp\        P                  ! WVR7      pVR8X  dÅ   V^8X  d   V	 R2MV	 R2p\        P                  ! \!        V4      V,          \        P"                  ! V4      P$                  3RR7      pV'       d   VP'                  RV34      VRRV13&   MVP'                  RV34      VRV) R13&   VP)                  V4      P'                  VP*                  RR 4      pMZVR9   dE   V P                  4       p\        P,                  ! V XRVV3R7      pV P                  Wê,           4       M\        RV R24      h\/        W
4       V^8”  d   VP'                  RV4      pV#   \        P                   d>    T P                  T^ 4       \        P                  ! T P                  T
4      XR7      p EL�i ; i)aÐ  
Notes
-----
Assumes file pointer is immediately after the 'data' id

It's possible to not use all available bits in a container, or to store
samples in a container bigger than necessary, so bytes_per_sample uses
the actual reported container size (nBlockAlign / nChannels).  Real-world
examples:

Adobe Audition's "24-bit packed int (type 1, 20-bit)"

    nChannels = 2, nBlockAlign = 6, wBitsPerSample = 20

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples/AFsp/M1F1-int12-AFsp.wav
is:

    nChannels = 2, nBlockAlign = 4, wBitsPerSample = 12

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/multichaudP.pdf
gives an example of:

    nChannels = 2, nBlockAlign = 8, wBitsPerSample = 20
rS  rT  rU  Úu1ÚV1Úiz(Unsupported bit depth: the WAV file has z-bit integer data.Úfz-bit floating-point data.)ÚdtypeÚcount)rq  Úi4Úi8:NNNNÚc)rq  Úmoder%   Úshapezmmap=True not compatible with z-byte container size.>   é   é   é   é   >   é    é@   r3   >   é   é   rX  é   )rY  rZ  r   r7   r:   rL  r<   rQ  r+   ÚnpÚfromfiler#   r$   r'   Ú
frombufferÚzerosr   rq  ÚitemsizeÚreshapeÚviewrw  Úmemmapr\  )r]  rO  rb  rf  r^  Úis_rf64re  ÚmmapÚrf64_chunk_sizer_  r   Úbytes_per_sampleÚ	n_samplesrq  Ústartrr  r   ÚdtÚas   &&&&&&&&&          r   Ú_read_data_chunkr‘  ¿  sÉ  € ÷4 Ø‰àˆ÷ Ü�}Š}˜S �W c§h¡h¨q£kÓ2°1Õ5‰ð ˆà�‰�Œð #Õ.ÐØÕ(€Ià”[—_‘_Ô$Ø�	Ö˜Q×Ø‰EØ Ô-à‰EØ˜"Œ_à�e˜1Ð-Ð.Ð/‰Eäð $Ø$- ;Ð.@ðBó Cð Cà	”{×-Ñ-Ô	-Ø˜Ô Ø�e˜1Ð-Ð.Ð/‰Eäð $Ø$- ;Ð.GðIó Jð Jô 	˜*Ô%à�H‰H‹J€Eßð	>Ø! TœM‘D¨yˆEÜ—;’;˜s°uÔ=ˆDð
 �DŒ=à/°1Ô4�C�5˜‘¸S¸EÀ¸*ˆBÜ—’œ#˜d›)Ð'7Õ7¼¿ºÀ"»×9NÑ9NÐOØ"&ô(ˆAçØ*.¯,©,¸Ð<LÐ7MÓ*N��!Ð&Ð&Ð&Ð&Ò'à+/¯<©<¸Ð=MÐ8NÓ+O��!Ð&Ð&Ñ'Ð'Ñ(Ø—6‘6˜"“:×%Ñ% a§g¡g¨c¨r lÓ3ˆDøà˜|Ô+Ø—H‘H“JˆEÜ—9’9˜S¨°CÀØ'0 lô4ˆDà�H‰H�U•\Õ"äÐ=Ø 0Ð1Ð1FðHó Ið Iô �SÔà�!„|Ø�|‰|˜B Ó)ˆØ€Køô9 ×&Ñ&ô 	>Ø�H‰H�U˜AÔÜ—=’= §¡¨$£°uÔ=‹Dð	>ús   Ä#J ÊAKËKc                 óÊ   € V'       d   R pMRpV P                  ^4      pV'       d=   \        P                  ! W#4      ^ ,          pV P                  V^4       \	        W4       R# R# )ú>Iú<IN)r   rY  rZ  r'   r\  )r]  r^  r_  r   r   s   &&   r   Ú_skip_unknown_chunkr•  $  sO   € ßØ‰àˆà�8‰8�A‹;€D÷
 Ü�}Š}˜SÓ'¨Õ*ˆØ�‰��qÔÜ˜Ö#ñ r   c                 ób  € V P                  ^4      pVR8X  d   RpRpRpM4VR8X  d   RpRpRpM&VR8X  d   RpRpRpM\        R	\        V4       R
24      hV'       gH   \        P                  ! W@P                  ^4      4      ^ ,          ^,           pRpV P                  ^4      pMëV P                  ^4       V P                  ^4      pV P                  ^4      pVR8w  d   \        R4      h\        P                  ! RV P                  ^4      4      ^ ,          p	\        P                  ! W@P                  ^4      4      ^ ,          ^,           p\        P                  ! RV P                  ^4      4      ^ ,          pV P                  V	^,
          ^4       VR8w  d   \        R\        V4       R24      hWSW&3# )rX  ó   RIFFFr”  s   RIFXTr“  ó   RF64ú<QzFile format z; not understood. Only 'RIFF', 'RIFX', and 'RF64' supported.Nó   ds64z(Invalid RF64 file: ds64 chunk not found.ó   WAVEz"Not a WAV file. RIFF form type is Ú.)r   rL  ÚreprrY  rZ  r'   )
r]  Ústr1r‰  r^  r_  Ú	file_sizer‹  Ústr2Ústr3Ú	ds64_sizes
   &         r   Ú_read_riff_chunkr£  5  s‚  € Ø�8‰8�A‹;€DØˆw„ØˆØˆØ‰Ø	�ŒØˆØˆØ‰Ø	�ŒØˆØˆØ‰ô ˜<¬¨T«
 |ð 4Að Aó Bð 	B÷ Ü—M’M #§x¡x°£{Ó3°AÕ6¸Õ:ˆ	ØˆØ�x‰x˜‹{‰ð 	�‰�ŒØ�x‰x˜‹{ˆØ�x‰x˜‹{ˆØ�7Œ?ÜÐGÓHÐHÜ—M’M $¨¯©°«Ó4°QÕ7ˆ	Ü—M’M #§x¡x°£{Ó3°AÕ6¸Õ:ˆ	Ü Ÿ-š-¨¨c¯h©h°q«kÓ:¸1Õ=ˆð 	�‰�˜R• Ô#àˆw„ÜÐ=¼dÀ4»j¸\ÈÐKÓLÐLà WÐ=Ð=r   c                 óL   € V^,          '       d   V P                  ^^4       R# R# )r  N)r'   )r]  r   s   &&r   r\  r\  `  s   € ð ˆa‡x„xØ�‰��AŽñ r   c                ó  € \        V R4      '       d   T pRpM\        V R4      pVP                  4       ;p'       g   \        V4      p \	        V4      w  rErgRpRp	VP                  4       V8  Ed�   VP                  ^4      p
V
'       gJ   V	'       d7   \        P                  ! RVP                  4       R RVR R2\        ^R7       EM8\        R	4      h\        V
4      ^8  dO   R
\        V
4       2pV'       d.   V	'       d&   \        P                  ! VR,           \        ^R7       M\        V4      hV
R8X  d/   Rp\        W%4      pVR,          w  rÞpV^,          pV^,          pEK  V
R8X  d   \        W%4       EK   V
R8X  d*   Rp	V'       g   \        R4      h\        VXXXWVXW4	      pEKP  V
R8X  d   \        W%4       EKe  V
R9   d   \        W%4       EKz  \        P                  ! R\        ^R7       \        W%4       EK¥  \        V R4      '       g   VP!                  4        XX3# V'       d   VP#                  ^ 4       XX3#   \        T R4      '       g   TP!                  4        i T'       d   TP#                  ^ 4       i i ; i)aÓ  
Open a WAV file.

Return the sample rate (in samples/sec) and data from an LPCM WAV file.

Parameters
----------
filename : string or open file handle
    Input WAV file.
mmap : bool, optional
    Whether to read data as memory-mapped (default: False).  Not compatible
    with some bit depths; see Notes.  Only to be used on real files.

    .. versionadded:: 0.12.0

Returns
-------
rate : int
    Sample rate of WAV file.
data : numpy array
    Data read from WAV file. Data-type is determined from the file;
    see Notes.  Data is 1-D for 1-channel WAV, or 2-D of shape
    (Nsamples, Nchannels) otherwise. If a file-like input without a
    C-like file descriptor (e.g., :class:`python:io.BytesIO`) is
    passed, this will not be writeable.

Notes
-----
Common data types: [1]_

=====================  ===========  ===========  =============
     WAV format            Min          Max       NumPy dtype
=====================  ===========  ===========  =============
32-bit floating-point  -1.0         +1.0         float32
32-bit integer PCM     -2147483648  +2147483647  int32
24-bit integer PCM     -2147483648  +2147483392  int32
16-bit integer PCM     -32768       +32767       int16
8-bit integer PCM      0            255          uint8
=====================  ===========  ===========  =============

WAV files can specify arbitrary bit depth, and this function supports
reading any integer PCM depth from 1 to 64 bits.  Data is returned in the
smallest compatible numpy int type, in left-justified format.  8-bit and
lower is unsigned, while 9-bit and higher is signed.

For example, 24-bit data will be stored as int32, with the MSB of the
24-bit data stored at the MSB of the int32, and typically the least
significant byte is 0x00.  (However, if a file actually contains data past
its specified bit depth, those bits will be read and output, too. [2]_)

This bit justification and sign matches WAV's native internal format, which
allows memory mapping of WAV files that use 1, 2, 4, or 8 bytes per sample
(so 24-bit files cannot be memory-mapped, but 32-bit can).

IEEE float PCM in 32- or 64-bit format is supported, with or without mmap.
Values exceeding [-1, +1] are not clipped.

Non-linear PCM (mu-law, A-law) is not supported.

References
----------
.. [1] IBM Corporation and Microsoft Corporation, "Multimedia Programming
   Interface and Data Specifications 1.0", section "Data Format of the
   Samples", August 1991
   http://www.tactilemedia.com/info/MCI_Control_Info.html
.. [2] Adobe Systems Incorporated, "Adobe Audition 3 User Guide", section
   "Audio file formats: 24-bit Packed Int (type 1, 20-bit)", 2007

Examples
--------
>>> from os.path import dirname, join as pjoin
>>> from scipy.io import wavfile
>>> import scipy.io

Get the filename for an example .wav file from the tests/data directory.

>>> data_dir = pjoin(dirname(scipy.io.__file__), 'tests', 'data')
>>> wav_fname = pjoin(data_dir, 'test-44100Hz-2ch-32bit-float-be.wav')

Load the .wav file contents.

>>> samplerate, data = wavfile.read(wav_fname)
>>> print(f"number of channels = {data.shape[1]}")
number of channels = 2
>>> length = data.shape[0] / samplerate
>>> print(f"length = {length}s")
length = 0.01s

Plot the waveform.

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> time = np.linspace(0., length, data.shape[0])
>>> plt.plot(time, data[:, 0], label="Left channel")
>>> plt.plot(time, data[:, 1], label="Right channel")
>>> plt.legend()
>>> plt.xlabel("Time [s]")
>>> plt.ylabel("Amplitude")
>>> plt.show()

r   FÚrbz%Reached EOF prematurely; finished at Údz bytes, expected z bytes from header.)Ú
stacklevelzUnexpected end of file.zIncomplete chunk ID: z, ignoring it.ó   fmt T:r~  rX  Nó   factó   datazNo fmt chunk before datas   LISTz-Chunk (non-data) not understood, skipping it.>   ó   Fakeó   JUNK)ÚhasattrÚopenÚseekabler   r£  r+   r   ÚwarningsÚwarnr   rL  r   r�  rk  r•  r‘  r.   r'   )ÚfilenamerŠ  r]  Úwas_seekablerŸ  r^  r‰  r‹  Úfmt_chunk_receivedÚdata_chunk_receivedÚchunk_idÚmsgÚ	fmt_chunkrO  rb  rc  rf  re  r   s   &&                 r   r   r   g  s<  € ôL ˆx˜× Ò ØˆØ‰ä�8˜TÓ"ˆàŸL™L›NÐ*ˆLÖ*Ü! #Ó&ˆð:Ü=MÈcÓ=RÑ:ˆ	 'Ø"ÐØ#ÐØ�h‰h‹j˜9Õ$à—x‘x “{ˆHçß&ä—M’MØ?ÀÇÁÃ
È1¸~ð N$Ø$-¨a =Ð0CðEä&°1õ6ñ ä$Ð%>Ó?Ð?Ü�X“ Ô"Ø-¬d°8«nÐ-=Ð>�ç%×*=Ü—M’M #Ð(8Õ"8¼.Ø-.ö0ô % S›/Ð)à˜7Ô"Ø%)Ð"Ü+¨CÓ?�	Ø+4°S­>Ñ(�
 bØ% a�L�	Ø'¨�l“Ø˜WÔ$Ü# C×7Ø˜WÔ$Ø&*Ð#ß)Ü$Ð%?Ó@Ð@Ü'¨¨Z¸À9Ø(5ÀØ(,ó?“ð ˜WÔ$ä# C×7ØÐ/Ô/ä# C×7ä—’ÐMÜ,¸õ<ä# C×7ä�x ×(Ò(Ø�I‰IŒKð ˆtˆ8€O÷ ð �H‰H�QŒKàˆtˆ8€Oøô �x ×(Ò(Ø�I‰I�Kßð �H‰H�Q�Kð ús.   ÁA I Â	I ÂA.I Ä B
I ÆA4I É+JÉ.Jc           	     óÌ	  € \        V R4      '       d   T pM\        V R4      pTp VP                  P                  p. ROpVP                  P                  V9  d   \        RVP                   R24      hRpVR,          pVR,          pVR,          pVR	,          pVR
8X  d   \        P                  pM\        P                  pVP                  ^8X  d   ^p	MVP                  ^,          p	VP                  P                  ^,          p
WJ^,          ,          V	,          pWš^,          ,          p\        P                  ! RW‰VW¼V
4      pVR8X  g   VR8X  g
   VR,          pV\        P                  ! R\        V4      4      ,          pW},          p\        V4      ^,           ^,           VP                  ,           pV^,
          R8„  pV'       Ed   RpVR,          pVR,          pVR,          pVR,          pV\        P                  ! R^4      ,          pV\        P                  ! R^ 4      ,          pV\        P                  ! RVP                  4      ,          pV\        P                  ! RVP                  ^ ,          4      ,          pV\        P                  ! R^ 4      ,          pVR	,          pV\        P                  ! R\        V4      4      ,          pW},          pVR8X  gA   VR8X  g:   VR,          pV\        P                  ! R^VP                  ^ ,          4      ,          pVP!                  V4       VP!                  R4       VP!                  \        P                  ! R\#        VP                  R4      4      4       VP                  P$                  R8X  g1   VP                  P$                  R8X  d&   \&        P$                  R8X  d   VP)                  4       p\+        W24       VP-                  4       pV'       g@   VP/                  ^4       VP!                  \        P                  ! RV^,
          4      4       M>VP/                  ^4       VP!                  \        P                  ! RV^,
          4      4       \        V R4      '       g   VP1                  4        R# VP/                  ^ 4       R#   \        T R4      '       g   TP1                  4        i TP/                  ^ 4       i ; i)aS  
Write a NumPy array as a WAV file.

Parameters
----------
filename : string or open file handle
    Output wav file.
rate : int
    The sample rate (in samples/sec).
data : ndarray
    A 1-D or 2-D NumPy array of either integer or float data-type.

Notes
-----
* Writes a simple uncompressed WAV file.
* To write multiple-channels, use a 2-D array of shape
  (Nsamples, Nchannels).
* The bits-per-sample and PCM/float will be determined by the data-type.

Common data types: [1]_

=====================  ===========  ===========  =============
     WAV format            Min          Max       NumPy dtype
=====================  ===========  ===========  =============
32-bit floating-point  -1.0         +1.0         float32
32-bit PCM             -2147483648  +2147483647  int32
16-bit PCM             -32768       +32767       int16
8-bit PCM              0            255          uint8
=====================  ===========  ===========  =============

Note that 8-bit PCM is unsigned.

References
----------
.. [1] IBM Corporation and Microsoft Corporation, "Multimedia Programming
   Interface and Data Specifications 1.0", section "Data Format of the
   Samples", August 1991
   http://www.tactilemedia.com/info/MCI_Control_Info.html

Examples
--------
Create a 100Hz sine wave, sampled at 44100Hz.
Write to 16-bit PCM, Mono.

>>> from scipy.io.wavfile import write
>>> import numpy as np
>>> samplerate = 44100; fs = 100
>>> t = np.linspace(0., 1., samplerate)
>>> amplitude = np.iinfo(np.int16).max
>>> data = amplitude * np.sin(2. * np.pi * fs * t)
>>> write("example.wav", samplerate, data.astype(np.int16))

ÚwriteÚwbzUnsupported data type 'Ú'r   r—  s       r›  r©  rp  z<HHIIHHro  Úus     r”  l   ÿÿ r˜  s   ÿÿÿÿrš  r™  rª  z<IIr«  rS  Ú=ÚbigN)Úfloat32Úfloat64Úuint8Úint16Úint32Úint64)r®  r¯  rq  ÚkindrG  rL  r7   r<   r:   Úndimrw  r…  rY  Úpackr   Únbytesr»  ÚminÚ	byteorderÚsysÚbyteswapÚ_array_tofiler+   r'   r.   )r³  Úrater   r]  rc  ÚdkindÚallowed_dtypesÚheader_datarO  rb  rf  rd  re  Úfmt_chunk_dataÚresulting_file_sizer‰  r   s   &&&              r   r»  r»    sµ  € ôl ˆx˜×!Ò!Ø‰ä�8˜TÓ"ˆà	€BðYØ—
‘
—‘ˆò>ˆà�:‰:�?‰? .Ô0ÜÐ6°t·z±z°lÀ!ÐDÓEÐEàˆà�wÕˆØÐ*Õ*ˆØ�wÕˆð 	�wÕˆØ�CŒ<Ü$×/Ñ/‰Jä$Ÿ™ˆJØ�9‰9˜Œ>Ø‰Hà—z‘z !•}ˆHØ—J‘J×'Ñ'¨!Õ+ˆ	Ø¨A�~Õ.¨xÕ7ÐØ¨q¥.Õ1ˆäŸš Y°
ÀbØ%5ÀIóOˆà˜” ¨¤à˜kÕ)ˆNà”v—{’{ 4¬¨^Ó)<Ó=Õ=ˆØÕ%ˆô " +Ó.°Õ2°QÕ6¸¿¹ÕDÐØ&¨Õ*¨jÑ8ˆßˆ7ØˆKØ˜7Õ"ˆKØÐ.Õ.ˆKØ˜7Õ"ˆKØ˜7Õ"ˆKàœ6Ÿ;š; t¨RÓ0Õ0ˆKàœ6Ÿ;š; t¨QÓ/Õ/ˆKØœ6Ÿ;š; t¨T¯[©[Ó9Õ9ˆKØœ6Ÿ;š; t¨T¯Z©Z¸­]Ó;Õ;ˆKàœ6Ÿ;š; t¨QÓ/Õ/ˆKØ˜7Õ"ˆKØœ6Ÿ;š; t¬S°Ó-@ÓAÕAˆKØÕ)ˆKð ˜” ¨¤Ø˜7Õ"ˆKØœ6Ÿ;š; u¨a°·±¸AµÓ?Õ?ˆKà�	‰	�+Ôð 	�	‰	�'Ôà�	‰	”&—+’+˜d¤C¨¯©°ZÓ$@ÓAÔBà�:‰:×Ñ 3Ô&¨4¯:©:×+?Ñ+?À3Ô+FÜ+.¯=©=¸EÔ+AØ—=‘=“?ˆDÜ�cÔ ð �x‰x‹zˆßØ�H‰H�QŒKØ�I‰I”f—k’k $¨¨Q­Ó/Õ0à�H‰H�RŒLØ�I‰I”f—k’k $¨¨Q­Ó/Ô0ô �x ×)Ò)Ø�I‰IŽKà�H‰H�QŽKøô �x ×)Ò)Ø�I‰I�Kà�H‰H�Q�Kús   ¥QR- Ò-6S#c                 óv   € V P                  VP                  4       P                  R 4      P                  4       R# )ÚbN)r»  Úravelr‡  r   )r]  r   s   &&r   rÏ  rÏ  ®  s%   € à‡I�Iˆd�j‰j‹l×Ñ Ó$×)Ñ)Ö*r   )r   r   r»  )FN)F)r
   r#   r   rÍ  Únumpyr�  rY  r±  Úenumr   Ú__all__ÚUserWarningr   r   r7   r:   r<   rN  rQ  rk  r‘  r•  r£  r\  r   r»  rÏ  r   r   r   Ú<module>rÝ     sž   ðñ	ó 
Û 	Û 
Û Û Û Ý ò€ô	�[ô 	÷&Jñ &JôRR�'ô Rðj "—o‘o {×'=Ñ'=Ð>Ð òDòLô^bòJ$ò"(>òVôkò\Vôr+r   