"""Original 12-second four-chord study. AI-assisted code, pure additive synthesis.
No samples, neural audio model, voice clone, randomness or network.
"""
import math, wave, struct, json
from pathlib import Path
RATE=24000
DURATION=12
CHORDS=[[60,64,67,71],[57,60,64,67],[53,57,60,64],[55,60,62,67]]
def frequency(note): return 440*2**((note-69)/12)
def sample(t):
    chord=min(3,int(t//3)); local=t-chord*3
    envelope=min(1,local/.24)*min(1,(3-local)/.45)
    values=[]
    for side in (-1,1):
        pad=sum(math.sin(2*math.pi*frequency(n)*t+side*.08*i)*(.8+.2*math.sin(2*math.pi*.2*t)) for i,n in enumerate(CHORDS[chord]))/4
        note=CHORDS[chord][min(3,int(local/.75))]+12
        pluck=math.sin(2*math.pi*frequency(note)*t)*math.exp(-5*(local%.75))
        values.append((pad*.20+pluck*.10)*envelope)
    return values
if __name__=='__main__':
    path=Path(__file__).parent
    frames=[sample(i/RATE) for i in range(RATE*DURATION)]
    assert all(abs(x)<1 for pair in frames for x in pair)
    with wave.open(str(path/'soft-chords.wav'),'wb') as out:
        out.setnchannels(2);out.setsampwidth(2);out.setframerate(RATE)
        out.writeframes(b''.join(struct.pack('<hh',*(round(x*32767) for x in pair)) for pair in frames))
    bins=64; size=len(frames)//bins
    levels=[math.sqrt(sum(x*x for pair in frames[i*size:(i+1)*size] for x in pair)/(size*2)) for i in range(bins)]
    peak=max(levels)
    (path/'soft-chords-metadata.json').write_text(json.dumps({'durationSeconds':DURATION,'waveform':[round(x/peak,3) for x in levels],'sampleRate':RATE,'method':'Additive synthesis, AI-assisted code; no neural audio model'},indent=2)+'\n')
    print('12 seconds; stereo; no clipping; 64 RMS waveform bins')
