Add VST2 hosting to native bridge; fix CC7 data2 routing verified via SHM test

VST2 (Steinberg 2.4 ABI) host via Vst2Instrument: aeffect.h, dispatcher,
process events/replacing, kEffectStartProcess, headless GUI skip.
- create_instrument returns Vst2Instrument for InstrumentType::VST2
- 64B-aligned scratch buffers for SIMD plugins; SEH crash capture module+stack
- plugins.py: VST2 resolves .dll/.so; vst_engine.py reports VST2 type
- app.jsx: derive instrumentType from scan (VST3 vs VST2), not hardcoded
- Install exes refreshed from Release build

SF2 FluidSynth audio verified end-to-end through SHM ring (energy 1.33):
silence was a test-harness bug (CC7 value written to velocity field, bridge
reads data2) — app sends data2 correctly. All temporary diagnostics removed.
This commit is contained in:
2026-08-17 07:55:46 +07:00
parent 9d9b4b3686
commit 4111995a5c
12 changed files with 768 additions and 24 deletions
+3 -3
View File
@@ -1248,7 +1248,7 @@ def _resolve_bridge_asset(name: str, instrument_type: str, path: Optional[str])
(fname.lower() == base.lower() or os.path.splitext(fname)[0].lower() == base_noext):
return os.path.join(root, fname)
ext = (".vst3" if instrument_type.upper() == "VST3" else
".vst2" if instrument_type.upper() == "VST2" else
(".dll", ".so") if instrument_type.upper() == "VST2" else
".sfz" if instrument_type.upper() == "SFZ" else None)
if ext:
try:
@@ -1267,7 +1267,7 @@ def _resolve_bridge_asset(name: str, instrument_type: str, path: Optional[str])
continue
for root, _, files in os.walk(base_dir):
for fn in files:
if fn.lower().endswith(ext) and \
if (fn.lower().endswith(ext) if isinstance(ext, tuple) else fn.lower().endswith(ext)) and \
(fn.lower() == base.lower() or os.path.splitext(fn)[0].lower() == base_noext):
return os.path.join(root, fn)
# V9 bug 8: Windows VST3 = FOLDER "X.vst3" (chua X.vst3.dll) —
@@ -1277,7 +1277,7 @@ def _resolve_bridge_asset(name: str, instrument_type: str, path: Optional[str])
# base_noext.
for sub in os.listdir(root):
sp = os.path.join(root, sub)
if os.path.isdir(sp) and sub.lower().endswith(ext) and \
if os.path.isdir(sp) and (sub.lower().endswith(ext) if isinstance(ext, tuple) else sub.lower().endswith(ext)) and \
(sub.lower() == base.lower() or os.path.splitext(sub)[0].lower() == base_noext):
return sp
return None