Initial commit: soothe2 RE workspace + roadmap

- Инфраструктура: 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 порядок).
This commit is contained in:
2026-08-16 18:54:40 +03:00
parent 45a13dcebd
commit 25cf786c54
44 changed files with 18208 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
#!/usr/bin/env python3
import frida, sys, struct, time
TARGET = "yabridge-host"
OUT = "/home/m/re-tools/soothe_mem.bin"
js = r"""
const name = "soothe2_x64.vst3";
let mod = null;
for (const m of Process.enumerateModules()) {
if (m.name.toLowerCase().includes(name)) { mod = m; break; }
}
if (!mod) {
for (const m of Process.enumerateModules()) {
if (m.path.toLowerCase().includes("soothe")) { mod = m; break; }
}
}
if (!mod) { send({err: "soothe module not found"}); }
else {
send({base: mod.base.toString(), size: mod.size, path: mod.path, name: mod.name});
const buf = new ArrayBuffer(mod.size);
try {
const r = Memory.readByteArray(mod.base, mod.size);
buf = r;
send({ok: true, size: mod.size}, buf ? buf : new ArrayBuffer(0));
} catch (e) { send({err: "readByteArray: " + e}); }
}
"""
def main():
dev = frida.get_local_device()
procs = dev.enumerate_processes()
target = None
for p in procs:
if TARGET in p.name and ("yabridge" in p.name or "wine" in p.name):
target = p
if target is None:
print("target process not found:")
for p in procs:
if "wine" in p.name or "yabridge" in p.name or "reaper" in p.name:
print(" ", p.pid, p.name)
sys.exit(1)
print("attaching to", target.pid, target.name)
session = dev.attach(target.pid)
done = {}
def on_message(msg, data):
if msg["type"] == "send":
payload = msg["payload"]
if isinstance(payload, dict) and "err" in payload:
print("ERR:", payload["err"])
done["err"] = payload
return
if payload.get("ok"):
with open(OUT, "wb") as f:
f.write(data)
print("DUMPED", len(data), "bytes to", OUT)
done["dumped"] = len(data)
else:
print("module:", payload)
elif msg["type"] == "error":
print("JS ERR:", msg.get("description"))
script = session.create_script(js)
script.on("message", on_message)
script.load()
for _ in range(60):
if done: break
time.sleep(0.2)
session.detach()
main()