#!/usr/bin/env python3 """Verification sweep: generate RPPs from burst500p_b1 template, render, measure. Cleanup-friendly: skips already-rendered wavs. """ import os, re, sys, time, subprocess, signal sys.path.insert(0, '/home/m/re-tools') TPL = '/home/m/soothe-bt/burst500p_b1.rpp' DIR = '/home/m/soothe-bt' REAPER = '/usr/bin/reaper' def render(rpp, wav, timeout=150): proc = subprocess.Popen([REAPER, '-nosplash', '-renderproject', rpp], stdout=open('/tmp/verif_render.log','w'), stderr=subprocess.STDOUT) try: proc.wait(timeout=timeout) return 'ok' if os.path.exists(wav) else 'no-file' except subprocess.TimeoutExpired: for s in (signal.SIGTERM, signal.SIGKILL): try: proc.send_signal(s); proc.wait(timeout=5) except Exception: pass return 'hang' os.system("pkill -9 -x reaper 2>/dev/null; pkill -9 -f '[y]abridge' 2>/dev/null; sleep 1") def gen_rpp(name, params): rpp = os.path.join(DIR, name + '.rpp') wav = os.path.join(DIR, name + '.wav') args = [f'{k}={v}' for k, v in params.items()] if os.path.exists(wav): print(f'{name}: cached') return wav os.system(f"python3 /home/m/re-tools/tt_sweep.py {TPL} {rpp} {wav} " + ' '.join(args)) rc = render(rpp, wav) print(f'{name}: {rc}') return wav DRY = '/home/m/soothe-bt/burst500p_byp.wav' if not os.path.exists(DRY): os.system("cp /home/m/soothe-bt/burst500p_byp.rpp /home/m/soothe-bt/zz_byp.rpp") # render dry baseline proc = subprocess.Popen([REAPER, '-nosplash', '-renderproject', '/home/m/soothe-bt/burst500p_byp.rpp'], stdout=open('/tmp/verif_byp.log','w'), stderr=subprocess.STDOUT) try: proc.wait(timeout=150) except subprocess.TimeoutExpired: proc.kill() print('dry baseline', os.path.exists(DRY)) sweeps = { 'depth': {'0.5':'0.5','1':'1.0','2':'2.0','3':'3.0','5':'5.0','10':'10.0'}, 'attack': {'a5':'5.0','a25':'25.0','a100':'100.0','a250':'250.0','a500':'500.0'}, 'release': {'r10':'10.0','r100':'100.0','r500':'500.0','r1000':'1000.0'}, 'sharp': {'sh1':'1.0','sh3':'3.0','sh5':'5.0','sh20':'20.0'}, 'mode': {'m0':'0.0','m2':'2.0'}, 'sens': {'sn0':'0.0','sn6':'6.0','sn24':'24.0','sn48':'48.0'}, } for group, vals in sweeps.items(): for name, val in vals.items(): gen_rpp(f'vp_{group}_{name}', {group: val}) print('\nall done; run measure.py on each vp_*.wav vs dry')