- Инфраструктура: RTTI-дампы (rtti_dsp/full.json), декомпиляции DSP-классов (decomp_*.txt), Ghidra-скрипты (Dump*.java, ImportRtti*.java, Diag.java), depthcurve/curve_fits LUT. - Поведенческая модель sim_v5.py + sim.py (RMSE ~0.3dB), утилиты (measure, tt_sweep, patchparam, sweep, harness_*, verify_sim). - summary.md + roadmap.md (контракт из manual M1-M12, топология пайплайна из OCR, фазы A-C). - pipeline_ocr.txt: OCR диаграммы Appendix A (mid/side ручка, trim/mix/bypass порядок).
56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Render remaining verification sweeps serially with hang protection.
|
|
Waits for reaper process EXIT (not just wav file appearing)."""
|
|
import os, sys, time, subprocess, signal
|
|
|
|
TPL = '/home/m/soothe-bt/burst500q_b1.rpp'
|
|
DIR = '/home/m/soothe-bt'
|
|
REAPER = '/usr/bin/reaper'
|
|
|
|
def render(rpp, timeout=180):
|
|
proc = subprocess.Popen([REAPER, '-nosplash', '-renderproject', rpp],
|
|
stdout=open('/tmp/verif2.log','w'), stderr=subprocess.STDOUT)
|
|
try:
|
|
proc.wait(timeout=timeout)
|
|
return proc.returncode
|
|
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(name, params, depth_base='0.8639736175537109'):
|
|
rpp = os.path.join(DIR, name + '.rpp')
|
|
wav = os.path.join(DIR, name + '.wav')
|
|
if os.path.exists(wav) and os.path.getsize(wav) == 1588290:
|
|
print(f'{name}: cached')
|
|
return
|
|
args = ' '.join(f'{k}={v}' for k, v in params.items())
|
|
cmd = ['python3', '/home/m/re-tools/tt_sweep.py', TPL, rpp, wav]
|
|
for k, v in params.items():
|
|
cmd.append(f'{k}={v}')
|
|
subprocess.run(cmd, capture_output=True)
|
|
rc = render(rpp)
|
|
size = os.path.getsize(wav) if os.path.exists(wav) else 0
|
|
print(f'{name}: rc={rc} size={size}')
|
|
# avoid "already exists" false positives on truncated files
|
|
if size != 1588290 and os.path.exists(wav):
|
|
os.remove(wav)
|
|
|
|
sweeps = {
|
|
'release': {'r10':'10.0','r100':'100.0','r500':'500.0','r1000':'1000.0'},
|
|
'sharpness': {'sh1':'1.0','sh3':'3.0','sh5':'5.0','sh20':'20.0'},
|
|
'sens': {'sn0':'0.0','sn6':'6.0','sn24':'24.0','sn48':'48.0'},
|
|
'mode_d5': {'m0':'0.0','m2':'2.0'},
|
|
}
|
|
for group, vals in sweeps.items():
|
|
for name, val in vals.items():
|
|
params = {group.replace('_d5',''): val}
|
|
if group == 'sens':
|
|
params = {'band1 sens': val}
|
|
if group == 'mode_d5':
|
|
params = {'mode': val, 'depth': '5.0'}
|
|
gen(f'vpq_{group}_{name}', params)
|
|
print('done') |