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:
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env python3
|
||||
import wave, array, math, sys
|
||||
|
||||
SR = 44100
|
||||
|
||||
def synth_multi(path, freqs, dur=6.0, amp=0.5, am=0.3, sr=SR):
|
||||
n = int(sr*dur)
|
||||
out = [0.0]*n
|
||||
for f in freqs:
|
||||
for i in range(n):
|
||||
t = i/sr
|
||||
# each tone: carrier + gentle AM (makes it "resonant" for the detector)
|
||||
out[i] += math.sin(2*math.pi*f*t)*(1.0 + am*math.sin(2*math.pi*(f/8.0)*t))
|
||||
peak = max(abs(v) for v in out) or 1.0
|
||||
sc = amp/peak
|
||||
a = array.array('h')
|
||||
for i, v in enumerate(out):
|
||||
t = i/sr
|
||||
fade = min(1.0, t/0.05, (dur-t)/0.1)
|
||||
a.append(max(-32767, min(32767, int(v*sc*32767*fade))))
|
||||
w = wave.open(path, 'wb')
|
||||
w.setnchannels(1); w.setsampwidth(2); w.setframerate(sr)
|
||||
w.writeframes(a.tobytes())
|
||||
w.close()
|
||||
print("wrote", path, "tones", len(freqs), "amp", amp)
|
||||
|
||||
if __name__ == '__main__':
|
||||
freqs = [int(f) for f in sys.argv[2].split(',')]
|
||||
synth_multi(sys.argv[1], freqs, dur=float(sys.argv[3]) if len(sys.argv)>3 else 6.0)
|
||||
Reference in New Issue
Block a user