fix: real preset data for all VST2/VST3 plugins, template system with ground-truth registry

- Extracted preset data from all_plugins_v2.rpp for 14 previously broken plugins
- Fixed PLUGIN_REGISTRY entries: Kontakt 7, Gullfoss, ValhallaDelay, VC 160/76, The Glue
- Template parser falls back to PLUGIN_PRESETS when source RPP has fake data
- Substitute Transient Master (not installed) with FabFilter Pro-C 2
- All 25 plugins now load correctly in REAPER
- Added template generator scripts and ground truth references
- Cleaned up temp/debug files from output/
This commit is contained in:
renato97
2026-05-03 18:54:40 -03:00
parent 3444006411
commit 8562bfbed1
23 changed files with 99316 additions and 688 deletions

View File

@@ -337,7 +337,7 @@ class TestVST3GUIDPresence:
# Must contain the GUID token from VST3_REGISTRY["Serum2"]
assert "691258006{56534558667350736572756D20320000}" in content
# Must also contain correct display name and filename
assert "VST3: Serum 2 (Xfer Records)" in content
assert "VST3i: Serum 2 (Xfer Records)" in content
assert "Serum2.vst3" in content
finally:
Path(tmp_path).unlink(missing_ok=True)
@@ -361,7 +361,8 @@ class TestVST3GUIDPresence:
# Must contain the GUID token from VST3_REGISTRY["FabFilter Pro-Q 3"]
assert "756089518{72C4DB717A4D459AB97E51745D84B39D}" in content
assert "VST3: Pro-Q 3 (FabFilter)" in content
assert "FabFilter Pro-Q 3.vst3" in content
# Filename in RPP is "FabFilter" (shared binary for all FabFilter plugins)
assert "FabFilter 0" in content
finally:
Path(tmp_path).unlink(missing_ok=True)
@@ -424,9 +425,10 @@ class TestVST3PresetData:
"""
meta = SongMeta(bpm=95, key="Am", title="VST3 Preset Test")
# Use actual filenames from registry so _build_plugin recognizes them as VST3
from src.reaper_builder import VST3_REGISTRY
plugins = [
PluginDef(name=name, path=entry[1], index=i)
for i, (name, entry) in enumerate(RPPBuilder.VST3_REGISTRY.items())
for i, (name, entry) in enumerate(VST3_REGISTRY.items())
]
track = TrackDef(name="Test", clips=[], plugins=plugins)
song = SongDefinition(meta=meta, tracks=[track])
@@ -441,7 +443,12 @@ class TestVST3PresetData:
builder.write(tmp_path)
content = Path(tmp_path).read_text(encoding="utf-8")
# Check that plugins WITH preset data have that data in output
for name, preset_lines in RPPBuilder.VST3_PRESETS.items():
from src.reaper_builder import PLUGIN_PRESETS, VST3_REGISTRY
vst3_keys = set(VST3_REGISTRY.keys())
for name, preset_lines in PLUGIN_PRESETS.items():
# Only check VST3 plugins (skip VST2 plugins which are in the same dict now)
if name not in vst3_keys:
continue
if len(preset_lines) > 0:
# Check first preset line — most distinctive, no collision risk
first_line = preset_lines[0]

View File

@@ -55,22 +55,22 @@ class TestVST3Effects:
from scripts.compose import _VST3_EFFECTS
# Fruity Parametric EQ 2 normalizes to Pro-Q 3
registry_key, filename = _VST3_EFFECTS["Pro-Q 3"]
assert registry_key == "FabFilter Pro-Q 3"
assert filename == "FabFilter Pro-Q 3.vst3"
assert registry_key == "Pro-Q_3"
assert filename == "FabFilter"
def test_fruity_compressor_maps_to_proc2(self):
"""Fruity Compressor → FabFilter Pro-C 2 via normalization."""
from scripts.compose import _VST3_EFFECTS
registry_key, filename = _VST3_EFFECTS["Pro-C 2"]
assert registry_key == "FabFilter Pro-C 2"
assert filename == "FabFilter Pro-C 2.vst3"
assert registry_key == "Pro-C_2"
assert filename == "FabFilter"
def test_pro_r_maps_to_pror2(self):
"""Pro-R 2 → FabFilter Pro-R 2."""
from scripts.compose import _VST3_EFFECTS
registry_key, filename = _VST3_EFFECTS["Pro-R 2"]
assert registry_key == "FabFilter Pro-R 2"
assert filename == "FabFilter Pro-R 2.vst3"
assert registry_key == "Pro-R_2"
assert filename == "FabFilter"
def test_unknown_effect_returns_none(self):
"""Unknown effect names return no VST3 info."""
@@ -96,11 +96,11 @@ class TestBuildFxChain:
}
plugins = build_fx_chain("drums", genre_config, [])
assert len(plugins) == 2
# Fruity Parametric EQ 2 → Pro-Q 3
assert "FabFilter" in plugins[0].name
assert ".vst3" in plugins[0].path
# Pro-Q 3 via alias
assert plugins[0].name in ("Pro-Q_3", "FabFilter_Pro-Q_3")
assert plugins[0].path in ("FabFilter", "FabFilter Pro-Q 3.vst3")
# Fruity Compressor → Pro-C 2
assert "FabFilter" in plugins[1].name
assert plugins[1].name in ("Pro-C_2", "FabFilter_Pro-C_2")
def test_build_fx_chain_bass(self):
"""build_fx_chain returns PluginDef list for bass role."""
@@ -188,7 +188,7 @@ class TestCreateReturnTracks:
reverb = tracks[0]
assert len(reverb.plugins) == 1
assert "FabFilter" in reverb.plugins[0].name
assert ".vst3" in reverb.plugins[0].path
assert reverb.plugins[0].path in ("FabFilter", "FabFilter_Pro_R_2.vst3")
def test_delay_track_has_timeless3(self):
"""Delay return track has FabFilter Timeless 3 plugin."""
@@ -198,7 +198,7 @@ class TestCreateReturnTracks:
delay = tracks[1]
assert len(delay.plugins) == 1
assert "Timeless" in delay.plugins[0].name
assert ".vst3" in delay.plugins[0].path
assert delay.plugins[0].path in ("FabFilter", "FabFilter_Timeless_3.vst3")
def test_return_tracks_have_volume_0_7(self):
"""Return tracks have volume 0.7."""