#!/usr/bin/env python3
"""Render WalkPic's original instrumental 'Quiet path'. No sampled recordings.
A 64-second D-major ambient loop: restrained felt-piano tones, warm pads,
soft stereo echoes, no percussion and no voice. PCM synthesis is reproducible.
Requires only Python stdlib; ffmpeg encodes the distributable MP3.
"""
import array, math, pathlib, subprocess, wave
ROOT=pathlib.Path(__file__).resolve().parents[1]
RATE=22050; SECONDS=64; N=RATE*SECONDS
left=array.array('f',[0])*N; right=array.array('f',[0])*N
progression=[(50,57,61,64,66),(45,52,59,61,64),(47,54,57,62,66),(43,50,57,59,62)]*2

def tone(midi,start,duration,level,pan,pad=False):
    frequency=440*2**((midi-69)/12); count=int(duration*RATE); offset=int(start*RATE)
    l=math.sqrt((1-pan)/2);r=math.sqrt((1+pan)/2)
    for k in range(count):
        t=k/RATE
        if pad:
            env=(math.sin(math.pi*min(t/1.8,1)/2)**2)*(math.sin(math.pi*min((duration-t)/2.5,1)/2)**2)
            v=(math.sin(2*math.pi*frequency*t)+.28*math.sin(2*math.pi*frequency*1.0018*t)+.13*math.sin(4*math.pi*frequency*t))*.7
        else:
            env=(1-math.exp(-t*75))*math.exp(-t*.95)*min((duration-t)/.2,1)
            v=math.sin(2*math.pi*frequency*t)+.24*math.exp(-t)*math.sin(2*math.pi*frequency*2.0006*t)+.085*math.exp(-t*1.8)*math.sin(2*math.pi*frequency*3.002*t)
        value=level*env*v; idx=(offset+k)%N
        left[idx]+=value*l; right[idx]+=value*r

for bar,chord in enumerate(progression):
    start=bar*8
    for j,note in enumerate(chord[:4]):tone(note,start,10,.047,(j-1.5)*.28,True)
    # Sparse, hand-arranged upper notes; silence leaves room for looking.
    for j,index in enumerate([2,4,3,1]):tone(chord[index]+12,start+.6+j*1.8,5,.105 if j==0 else .075,(-.25 if j%2 else .3))
# Short multi-tap stereo room tail; copies preserve a continuous cyclic loop.
origL=left[:];origR=right[:]
for delay,gain in [(.19,.19),(.37,.14),(.61,.10),(.97,.065)]:
    shift=int(delay*RATE)
    for i in range(N):
        j=(i-shift)%N;left[i]+=origR[j]*gain;right[i]+=origL[j]*gain
peak=max(max(map(abs,left)),max(map(abs,right))); gain=.50/peak
pcm=array.array('h')
for l,r in zip(left,right):pcm.extend([round(l*gain*32767),round(r*gain*32767)])
path=pathlib.Path('/tmp/walkpic-quiet-path.wav')
with wave.open(str(path),'wb') as out:out.setnchannels(2);out.setsampwidth(2);out.setframerate(RATE);out.writeframes(pcm.tobytes())
out=ROOT/'app/assets/audio/quiet_path.mp3'
subprocess.run(['ffmpeg','-hide_banner','-loglevel','error','-y','-i',str(path),'-codec:a','libmp3lame','-b:a','128k','-metadata','title=Quiet path','-metadata','artist=WalkPic','-metadata','comment=Original procedural instrumental; no samples or voice',str(out)],check=True)
print(f'{out}: {SECONDS}s, original stereo ambient composition; peak -6dBFS; {out.stat().st_size} bytes')
