from pathlib import Path
import struct,wave,json
def readfloat(path):
 b=path.read_bytes();o=12
 while o+8<=len(b):
  k=b[o:o+4];n=struct.unpack_from('<I',b,o+4)[0];d=b[o+8:o+8+n]
  if k==b'data':return list(struct.unpack('<'+'f'*(len(d)//4),d))
  o+=8+n+(n%2)
 raise ValueError('no data')
def readpcm(path):
 with wave.open(str(path),'rb') as w:
  rate=w.getframerate();n=w.getnframes();width=w.getsampwidth();b=w.readframes(n)
 return rate,[int.from_bytes(b[i:i+width],'little',signed=True)/(2**(width*8-1)-1) for i in range(0,len(b),width)]
p=Path(__file__).parent;a=readfloat(p/'float-over.wav');b=readfloat(p/'float-reduced.wav');_,d=readpcm(p/'clipped-reduced.wav');assert max(a)>1 and max(b)<1;err=max(abs(u-v) for u,v in zip(b,d));assert err>.09;print(json.dumps({'float_peak':max(a),'reduced_float_peak':max(b),'max_difference_to_clipped_reduced':err},indent=2))
