phase5: mặc định RENDER_ENGINE=bridge, gỡ pedalboard khỏi requirements/source/LICENSE

- config.py: SF_RENDER_ENGINE default 'bridge' (pedalboard GPL-3.0 đã gỡ)
- requirements.txt: bỏ pedalboard==0.9.19
- vst_engine.py: bỏ HAS_PEDALBOARD/check_pedalboard_safe/load_vst/import pedalboard;
  midi_events_to_messages giữ làm utility thuần (không gate pedalboard)
- render_engine.py: bỏ nhánh elif vst and HAS_PEDALBOARD + import thừa
- plugins.py: preview/midi-render chỉ qua native_bridge; guard SF_RENDER_ENGINE=bridge
- runtime.py: _vst_render_available() check bridge exe (SF_BRIDGE_PATH/install/) thay find_spec('pedalboard')
- LICENSE.md/THIRD_PARTY_LICENSES.md: bỏ cảnh báo GPL-3.0 pedalboard, đánh số lại
- tests: bỏ test golden so pedalboard + test requires_pedalboard; 114 passed 0 skip
This commit is contained in:
2026-08-17 12:58:51 +07:00
parent e79dae5d5c
commit dc331f39d8
14 changed files with 55 additions and 215 deletions
-24
View File
@@ -66,27 +66,3 @@ def test_plugins_bridge_branch_dispatch(monkeypatch):
with pytest.raises(HTTPException) as ei:
pl._render_midi_notes_pedalboard("__no_such__", [], bpm=120.0, sample_rate=44100)
assert ei.value.status_code == 404
def test_bridge_matches_pedalboard_rms():
"""Golden so sánh (plan §6): bridge vs pedalboard cùng job Nexus → RMS
trong tolerance. Skip nếu máy thiếu pedalboard hoặc Nexus VST3."""
from app.core.vst_engine import HAS_PEDALBOARD, PluginManager
if not HAS_PEDALBOARD:
pytest.skip("pedalboard not installed")
itype, path = native_render._resolve_instrument("Nexus")
if not path:
pytest.skip("Nexus VST3 not installed")
notes = [{"pitch": 60, "velocity": 0.8, "start_beat": 0.0, "duration_beats": 1.0}]
out_b, dur_b = native_render.render_offline("Nexus", notes, bpm=120.0, sample_rate=44100)
vst = PluginManager().load_vst("Nexus")
if vst is None:
pytest.skip("pedalboard cannot load Nexus")
ev = [{"note": 60, "start_beat": 0.0, "duration_beats": 1.0, "velocity": 101}]
msgs = PluginManager.midi_events_to_messages(ev, 120.0, 44100)
buf = vst(msgs, sample_rate=44100, duration=dur_b, num_channels=2)
import numpy as np
audio = sf.read(out_b)[0]
rms_b = float(np.sqrt((audio ** 2).mean()))
rms_p = float(np.sqrt((np.asarray(buf.T) ** 2).mean()))
assert abs(rms_b - rms_p) < 0.01, f"bridge={rms_b:.5f} pedalboard={rms_p:.5f}"