C: realtime VST3 setParam live — Vst3Fx::setParam (title/shortTitle->ParamID, setParamNormalized + inputParameterChanges queue), RealtimeFxChain dispatch vst3, test_60 delay 1s->0.25s giua stream khong restart
This commit is contained in:
@@ -528,3 +528,52 @@ def test_59_limiter_brickwall_oversample(fx_bridge):
|
||||
pk_low = float(np.max(np.abs(out_low)))
|
||||
assert 0.05 <= pk_low <= 0.15, f"low-level peak {pk_low:.4f} lech unity"
|
||||
|
||||
# ── 5.C Realtime VST3 setParam live (PLAN_MASTER_ENHANCE C) ───────────────
|
||||
def test_60_vst3_setparam_live(fx_bridge, adelay, monkeypatch):
|
||||
"""set_param runtime cho VST3: chain [vst3-delay, builtin limiter], đổi
|
||||
param 'delay' giữa stream 1.0 → 0.25 → echo dịch ~1s → ~0.25s NGAY trên
|
||||
session hiện tại (restart → plugin default 1s → echo vẫn ở 1s)."""
|
||||
monkeypatch.setenv("SF_FX_BRIDGE_PATH", fx_bridge)
|
||||
from app.core import fx_realtime
|
||||
|
||||
chain = [
|
||||
{"type": "vst3", "path": adelay},
|
||||
{"type": "builtin", "id": "limiter", "params": {"ceiling": -3.0}},
|
||||
]
|
||||
sess = fx_realtime.start_session(chain, SR)
|
||||
try:
|
||||
out = bytearray()
|
||||
nblk = 280 # 1.24s — đủ phủ vùng echo cũ (1s) để chứng minh không còn
|
||||
for i in range(nblk):
|
||||
blk = np.zeros((2, 256), dtype=np.float32)
|
||||
if i == 103: # impulse2 tại 0.6s (26368)
|
||||
blk[0, 0] = 1.0
|
||||
blk[1, 0] = 1.0
|
||||
if i == 86: # 0.5s — setParam VST3 'delay' 1.0 -> 0.25 (normalized)
|
||||
sess.set_param(0, "delay", 0.25)
|
||||
inter = np.empty(512, dtype=np.float32)
|
||||
inter[0::2] = blk[0]
|
||||
inter[1::2] = blk[1]
|
||||
sess.write_input(inter.tobytes())
|
||||
time.sleep(0.006)
|
||||
for b in sess.read_output():
|
||||
out += b
|
||||
time.sleep(0.05)
|
||||
for b in sess.read_output():
|
||||
out += b
|
||||
finally:
|
||||
sess.close()
|
||||
arr = np.frombuffer(bytes(out), dtype=np.float32)
|
||||
assert arr.size > 0, "realtime loop không ra output"
|
||||
got = arr.reshape(-1, 2).T
|
||||
|
||||
def _peak(lo, hi):
|
||||
if lo >= got.shape[1]:
|
||||
return 0.0
|
||||
return float(np.max(np.abs(got[:, lo:hi])))
|
||||
|
||||
e2 = 103 * 256 + int(0.25 * SR) # echo delay 0.25s ≈ 37393
|
||||
assert _peak(e2 - 400, e2 + 400) > 0.5, f"echo delay 0.25s không thấy tại {e2} (peak {_peak(e2-400, e2+400):.3f})"
|
||||
e_old = 103 * 256 + SR # echo delay cũ 1s ≈ 70468 (restart/no-apply)
|
||||
assert _peak(e_old - 400, e_old + 400) < 0.3, "param không áp live — echo vẫn ở delay 1s"
|
||||
assert _peak(0, e2 - 700) < 0.3, "có tín hiệu lạ trước echo 0.25s"
|
||||
|
||||
Reference in New Issue
Block a user