from pathlib import Path
import struct,json,hashlib,csv
root=Path(__file__).resolve().parent
rows=[]
for name in ['pcm16','pcm24','float32','adpcm']:
 b=(root/(name+'.wav')).read_bytes(); assert b[:4]==b'RIFF' and b[8:12]==b'WAVE'
 i=12;fmt=None;chunks=[]
 while i+8<=len(b):
  tag=b[i:i+4].decode('ascii');n=struct.unpack_from('<I',b,i+4)[0];chunks.append({'tag':tag,'length':n});assert i+8+n<=len(b)
  if tag=='fmt ':fmt=b[i+8:i+8+n]
  i+=8+n+(n%2)
 assert fmt is not None
 ftag,channels,rate,byte_rate,align,bits=struct.unpack_from('<HHIIHH',fmt)
 row={'file':name+'.wav','bytes':len(b),'formatTag':ftag,'subFormatTag':struct.unpack_from('<H',fmt,24)[0] if ftag==65534 else None,'bits':bits,'channels':channels,'sampleRate':rate,'chunks':chunks,'browserResult':'decode failed' if name=='adpcm' else '4 events and actual download','sha256':hashlib.sha256(b).hexdigest()}
 for kind in ['local','browser']:
  p=root/(name+'-'+kind+'.mid')
  if p.exists():
   m=p.read_bytes();assert m[:4]==b'MThd' and m[14:18]==b'MTrk';i=22;ons=offs=0;status=None
   def vlq():
    global i
    v=0
    while True:
     x=m[i];i+=1;v=(v<<7)|(x&127)
     if x<128:return v
   while i<len(m):
    vlq()
    if m[i]>=128:status=m[i];i+=1
    if status==255:
     t=m[i];i+=1;n=vlq();i+=n
     if t==47:break
    else:
     data=m[i:i+2];i+=2
     if status&240==144 and data[1]>0:ons+=1
     elif status&240==128 or (status&240==144 and data[1]==0):offs+=1
   assert ons==offs==4
   row[kind+'Midi']={'bytes':len(m),'noteOns':ons,'noteOffs':offs,'sha256':hashlib.sha256(m).hexdigest()}
 if name!='adpcm':assert row['localMidi']['sha256']==row['browserMidi']['sha256']
 rows.append(row)
assert not (root/'adpcm-browser.mid').exists()
(root/'independent-results.json').write_text(json.dumps({'result':'PASS','method':'Independent RIFF chunk walk and SMF event parse; browser acceptance from actual saved UI observations, not inferred from FFmpeg','rows':rows},indent=2),encoding='utf-8')
with (root/'results.csv').open('w',newline='',encoding='utf-8') as f:
 w=csv.writer(f);w.writerow(['file','bytes','formatTag','subFormatTag','bits','browser','localNotes'])
 for r in rows:w.writerow([r['file'],r['bytes'],r['formatTag'],r['subFormatTag'],r['bits'],r['browserResult'],r['localMidi']['noteOns']])
print(json.dumps({'result':'PASS','inputFiles':4,'browserDownloads':3,'localExports':4,'allLocalNoteCounts':4,'browserFailure':'adpcm decode error','browserMatchesLocal':True}))
