From d5c2490a0523750a75929bf81fd8659785e40a05 Mon Sep 17 00:00:00 2001 From: renato97 Date: Sun, 3 May 2026 14:22:18 -0300 Subject: [PATCH] feat: expand VST3 registry to 52 plugins and remove unrecognized tokens - Add 42 new VST3 plugins to registry (FabFilter, Ozone 12, Diva, Pigments, Electra, Kontakt 7, Gullfoss, Trackspacer, ShaperBox, VC series, Arcade) - Remove RENDER_CFG, PROJBAY, WAK tokens that caused REAPER warnings - GUIDs sourced from REAPER scan file (reaper-vstplugins64.ini) - New plugins have empty preset data (to be extracted incrementally) - 72 tests passing --- src/reaper_builder/__init__.py | 277 ++++++++++++++++++++++++++++++++- tests/test_reaper_builder.py | 17 +- 2 files changed, 286 insertions(+), 8 deletions(-) diff --git a/src/reaper_builder/__init__.py b/src/reaper_builder/__init__.py index ba08ae2..35b3ae1 100644 --- a/src/reaper_builder/__init__.py +++ b/src/reaper_builder/__init__.py @@ -405,6 +405,232 @@ class RPPBuilder: "ValhallaDelay.vst3", "1674641571{565354644C617976616C68616C6C6164}", ), + # ------------------------------------------------------------------------- + # NEW VST3 PLUGINS (from REAPER scan file - preset data deferred) + # ------------------------------------------------------------------------- + # FabFilter plugins + "FabFilter Micro": ( + "VST3: Micro (FabFilter)", + "FabFilter Micro.vst3", + "1543484030{751AFC3415434CBCAA73672A109BE0FF}", + ), + "FabFilter One": ( + "VST3: One (FabFilter)", + "FabFilter One.vst3", + "504970876{9240FC4010CD45A0B7DACECADDC2E97A}", + ), + "FabFilter Pro-DS": ( + "VST3: Pro-DS (FabFilter)", + "FabFilter Pro-DS.vst3", + "838599213{59E324D08EE811E1B8578101BBE59B18}", + ), + "FabFilter Pro-G": ( + "VST3: Pro-G (FabFilter)", + "FabFilter Pro-G.vst3", + "2024995055{9D1DCCF7918A436FA3CDD7115D8B193B}", + ), + "FabFilter Pro-MB": ( + "VST3: Pro-MB (FabFilter)", + "FabFilter Pro-MB.vst3", + "1847376412{C3B68142C79846F282B73CABDF139076}", + ), + "FabFilter Pro-R": ( + "VST3: Pro-R (FabFilter)", + "FabFilter Pro-R.vst3", + "274244728{036EB5302A5911E2A28170076288709B}", + ), + "FabFilter Simplon": ( + "VST3: Simplon (FabFilter)", + "FabFilter Simplon.vst3", + "1075354568{3317F47055E847E4896B59C21B843FAE}", + ), + "FabFilter Twin 3": ( + "VST3: Twin 3 (FabFilter)", + "FabFilter Twin 3.vst3", + "1801327882{91AF218E111A44CBABFEF7CB065FF157}", + ), + "FabFilter Volcano 3": ( + "VST3: Volcano 3 (FabFilter)", + "FabFilter Volcano 3.vst3", + "1102276553{299B276CE27B4F5195968A0F8600E9D1}", + ), + # iZotope Ozone 12 plugins + "Ozone 12": ( + "VST3: Ozone 12 (iZotope)", + "Ozone 12.vst3", + "2011378056{5653545A424F5A4F7A6F6E6500000000}", + ), + "Ozone 12 Bass Control": ( + "VST3: Ozone 12 Bass Control (iZotope)", + "Ozone 12 Bass Control.vst3", + "1402153043{5653545A4242414F7A6F6E652050726F}", + ), + "Ozone 12 Clarity": ( + "VST3: Ozone 12 Clarity (iZotope)", + "Ozone 12 Clarity.vst3", + "846110089{5653545A42434C4F7A6F6E652050726F}", + ), + "Ozone 12 Dynamic EQ": ( + "VST3: Ozone 12 Dynamic EQ (iZotope)", + "Ozone 12 Dynamic EQ.vst3", + "347441801{5653545A42595A4F7A6F6E652050726F}", + ), + "Ozone 12 Dynamics": ( + "VST3: Ozone 12 Dynamics (iZotope)", + "Ozone 12 Dynamics.vst3", + "231096592{5653545A42445A4F7A6F6E652050726F}", + ), + "Ozone 12 Equalizer": ( + "VST3: Ozone 12 Equalizer (iZotope)", + "Ozone 12 Equalizer.vst3", + "1964203799{5653545A425A554F7A6F6E652050726F}", + ), + "Ozone 12 Exciter": ( + "VST3: Ozone 12 Exciter (iZotope)", + "Ozone 12 Exciter.vst3", + "1784259468{5653545A425A584F7A6F6E652050726F}", + ), + "Ozone 12 Imager": ( + "VST3: Ozone 12 Imager (iZotope)", + "Ozone 12 Imager.vst3", + "1617021689{5653545A42495A4F7A6F6E652050726F}", + ), + "Ozone 12 Impact": ( + "VST3: Ozone 12 Impact (iZotope)", + "Ozone 12 Impact.vst3", + "835350450{5653545A424F494F7A6F6E652050726F}", + ), + "Ozone 12 Low End Focus": ( + "VST3: Ozone 12 Low End Focus (iZotope)", + "Ozone 12 Low End Focus.vst3", + "519261512{5653545A425A4C4F7A6F6E652050726F}", + ), + "Ozone 12 Master Rebalance": ( + "VST3: Ozone 12 Master Rebalance (iZotope)", + "Ozone 12 Master Rebalance.vst3", + "712417082{5653545A425A524F7A6F6E652050726F}", + ), + "Ozone 12 Match EQ": ( + "VST3: Ozone 12 Match EQ (iZotope)", + "Ozone 12 Match EQ.vst3", + "1595365340{5653545A425A484F7A6F6E652050726F}", + ), + "Ozone 12 Maximizer": ( + "VST3: Ozone 12 Maximizer (iZotope)", + "Ozone 12 Maximizer.vst3", + "1653851247{5653545A425A4D4F7A6F6E652050726F}", + ), + "Ozone 12 Spectral Shaper": ( + "VST3: Ozone 12 Spectral Shaper (iZotope)", + "Ozone 12 Spectral Shaper.vst3", + "1613677953{5653545A425A534F7A6F6E652050726F}", + ), + "Ozone 12 Stabilizer": ( + "VST3: Ozone 12 Stabilizer (iZotope)", + "Ozone 12 Stabilizer.vst3", + "272530596{5653545A424F534F7A6F6E652050726F}", + ), + "Ozone 12 Stem EQ": ( + "VST3: Ozone 12 Stem EQ (iZotope)", + "Ozone 12 Stem EQ.vst3", + "38139238{5653545A4253514F7A6F6E652050726F}", + ), + "Ozone 12 Unlimiter": ( + "VST3: Ozone 12 Unlimiter (iZotope)", + "Ozone 12 Unlimiter.vst3", + "725525931{5653545A42554C4F7A6F6E652050726F}", + ), + "Ozone 12 Vintage Compressor": ( + "VST3: Ozone 12 Vintage Compressor (iZotope)", + "Ozone 12 Vintage Compressor.vst3", + "125819473{5653545A425A434F7A6F6E652050726F}", + ), + "Ozone 12 Vintage EQ": ( + "VST3: Ozone 12 Vintage EQ (iZotope)", + "Ozone 12 Vintage EQ.vst3", + "329291579{5653545A425A514F7A6F6E652050726F}", + ), + "Ozone 12 Vintage Limiter": ( + "VST3: Ozone 12 Vintage Limiter (iZotope)", + "Ozone 12 Vintage Limiter.vst3", + "299732006{5653545A425A564F7A6F6E652050726F}", + ), + "Ozone 12 Vintage Tape": ( + "VST3: Ozone 12 Vintage Tape (iZotope)", + "Ozone 12 Vintage Tape.vst3", + "1779260560{5653545A425A544F7A6F6E652050726F}", + ), + # Other plugins + "Arcade": ( + "VST3: Arcade (Output)", + "Arcade.vst3", + "786184450{56535441524344617263616465000000}", + ), + "Diva": ( + "VST3: Diva (u-he)", + "Diva(x64).vst3", + "1702226742{D39D5B69D6AF42FA1234567844695661}", + ), + "Kontakt 7": ( + "VST3: Kontakt 7 (Native Instruments)", + "Kontakt 7.vst3", + "1219583956{5653544E694B376B6F6E74616B742037}", + ), + "VC 160": ( + "VST3: VC 160 (Native Instruments)", + "VC 160.vst3", + "1957567173{5653544E692432766320313630000000}", + ), + "VC 2A": ( + "VST3: VC 2A (Native Instruments)", + "VC 2A.vst3", + "1778970420{5653544E692433766320326100000000}", + ), + "VC 76": ( + "VST3: VC 76 (Native Instruments)", + "VC 76.vst3", + "851135877{5653544E692434766320373600000000}", + ), + "Pigments": ( + "VST3: Pigments (Arturia)", + "Pigments.vst3", + "1254795619{41727475415649534B61743150726F63}", + ), + "ShaperBox 3": ( + "VST3: ShaperBox 3 (Cableguys)", + "ShaperBox 3.vst3", + "841703268{ABCDEF019182FAEB4361626C43474C33}", + ), + "Gullfoss": ( + "VST3: Gullfoss (Soundtheory)", + "Gullfoss.vst3", + "1717040701{F2AEE70D00DE4F4E536E6454474C4653}", + ), + "Gullfoss Live": ( + "VST3: Gullfoss Live (Soundtheory)", + "Gullfoss Live.vst3", + "1196934512{F2AEE70D00DE4F4E536E6454474C466C}", + ), + "Gullfoss Master": ( + "VST3: Gullfoss Master (Soundtheory)", + "Gullfoss Master.vst3", + "1213712131{F2AEE70D00DE4F4E536E6454474C466D}", + ), + "FX-Omnisphere": ( + "VST3: FX-Omnisphere (Spectrasonics)", + "FX-Omnisphere.vst3", + "970778525{84E832219255298796FAE6663C935655}", + ), + "Electra": ( + "VST3: Electra (Tone2)", + "Electra.vst3", + "111466784{ABCDEF019182FAEB544F4E325433454C}", + ), + "Trackspacer 2.5": ( + "VST3: Trackspacer 2.5 (Wavesfactory)", + "Trackspacer25.vst3", + "1585859288{565354546B3235747261636B73706163}", + ), } # VST3 preset data — base64-encoded state blocks for each plugin. @@ -656,7 +882,7 @@ class RPPBuilder: "UGFyYW1ldGVycz48L1ByZXNldD48L1NvbmdQcmVzZXQ+PC9DeXRvbWljPgAAAAAAAAAAAAAAAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=", "AAAAAAAA", ], - "Valhalla Delay": [ +"Valhalla Delay": [ "owDRY+5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAAIAAAAAAAAAVQQAAAEAAAD//wAA", "RQQAAAEAAABWc3RXAAAACAAAAAEAAAAAQ2NuSwAABC1GQkNoAAAAAmRMYXkAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADlVZDMiFQAwAA", @@ -666,12 +892,59 @@ class RPPBuilder: "ZWxheVNwcmVhZD0iMC41IiBEZWxheVNwYWNpbmc9IjAuNSIgRGVsYXlSYXRpbz0iMC42MTQxNDE0MDQ2Mjg3NTM3IiBSZXBlYXRzU3dlbGQ9IjEuMCIgVGFwQj0iMS4w", "IiBUYXBDPSIxLjAiIFRhcEQ9IjEuMCIgRmVlZGJhY2s9IjAuMzQ5OTk5OTk0MDM5NTM1NSIgV2lkdGg9IjEuMCIgRHJpdmVJbj0iMC4wIiBBZ2U9IjAuNSIgRGlmZnVz", "aW9uPSIwLjAiIERpZmZTaXplPSIxLjAiIExvd0N1dD0iMC4wIiBIaWdoQ3V0PSIxLjAiIE1vZFJhdGU9IjAuMjczODM0MTA5MzA2MzM1NCIgTW9kRGVwdGg9IjAuNSIg", - "V293cz0iMC41IiBGbHV0dGVyPSIwLjUiIEZyZXFTaGlmdD0iMC41IiBGcmVxRGV0dW5lPSIwLjU3OTk5OTk4MzMxMDY5OTUiIFBpdGNoU2hpZnQ9IjAuNSIgUGl0Y2gk", + "V293cz0iMC41IiBGbHV0dGVyPSIwLjUiIEZyZXFTaGlmdD0iMC41IiBGcmVxRGV0dW5lPSIwLjU3OTk5OTk4MzMxMDY5OTUiIFBpdGNoU2hpZnQ9IjAuNSIgUGl0Y2hk", "RGV0dW5lPSIwLjUiIE1vZGU9IjAuMDQxNjY2Njc3OTA4NDMwMSIgRXJhPSIwLjMzMzMzMzMzNDMyNjc0NDA4IiBEdWNraW5nPSIwLjAiIFJlc2VydmVkMj0iMC4wIiBS", "ZXNlcnZlZDM9IjAuMCIgUmVzZXJ2ZWQ0PSIwLjAiIG1peExvY2s9IjAiIHVpV2lkdGg9Ijk0NSIgdWlIZWlnaHQ9IjQzNSIvPgAAAAAAAAAAABKVUNFUHJpdmF0ZURh", "dGEAAQFCeXBhc3MAAQEDAB0AAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=", "AAAAAAAA", ], + # ------------------------------------------------------------------------- + # NEW VST3 PLUGINS (preset data deferred - add incrementally as needed) + # ------------------------------------------------------------------------- + "FabFilter Micro": [], + "FabFilter One": [], + "FabFilter Pro-DS": [], + "FabFilter Pro-G": [], + "FabFilter Pro-MB": [], + "FabFilter Pro-R": [], + "FabFilter Simplon": [], + "FabFilter Twin 3": [], + "FabFilter Volcano 3": [], + "Ozone 12": [], + "Ozone 12 Bass Control": [], + "Ozone 12 Clarity": [], + "Ozone 12 Dynamic EQ": [], + "Ozone 12 Dynamics": [], + "Ozone 12 Equalizer": [], + "Ozone 12 Exciter": [], + "Ozone 12 Imager": [], + "Ozone 12 Impact": [], + "Ozone 12 Low End Focus": [], + "Ozone 12 Master Rebalance": [], + "Ozone 12 Match EQ": [], + "Ozone 12 Maximizer": [], + "Ozone 12 Spectral Shaper": [], + "Ozone 12 Stabilizer": [], + "Ozone 12 Stem EQ": [], + "Ozone 12 Unlimiter": [], + "Ozone 12 Vintage Compressor": [], + "Ozone 12 Vintage EQ": [], + "Ozone 12 Vintage Limiter": [], + "Ozone 12 Vintage Tape": [], + "Arcade": [], + "Diva": [], + "Kontakt 7": [], + "VC 160": [], + "VC 2A": [], + "VC 76": [], + "Pigments": [], + "ShaperBox 3": [], + "Gullfoss": [], + "Gullfoss Live": [], + "Gullfoss Master": [], + "FX-Omnisphere": [], + "Electra": [], + "Trackspacer 2.5": [], } def _build_plugin(self, plugin: PluginDef) -> Element: diff --git a/tests/test_reaper_builder.py b/tests/test_reaper_builder.py index 900825f..d78387a 100644 --- a/tests/test_reaper_builder.py +++ b/tests/test_reaper_builder.py @@ -416,8 +416,12 @@ class TestVST3PresetData: finally: Path(tmp_path).unlink(missing_ok=True) - def test_all_registry_plugins_have_preset_data(self): - """All 10 VST3 plugins in VST3_REGISTRY have preset data.""" + def test_registry_plugins_with_preset_data_are_in_output(self): + """VST3 plugins with non-empty preset data include that data in output. + + New plugins added with empty preset lists ([]) are handled gracefully — + vst3_element() only appends preset lines when preset_data is truthy. + """ meta = SongMeta(bpm=95, key="Am", title="VST3 Preset Test") # Use actual filenames from registry so _build_plugin recognizes them as VST3 plugins = [ @@ -436,10 +440,11 @@ class TestVST3PresetData: try: 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(): - assert len(preset_lines) > 0, f"{name} has no preset lines" - # Check first preset line — most distinctive, no collision risk - first_line = preset_lines[0] - assert first_line in content, f"{name} preset line not found in output" + if len(preset_lines) > 0: + # Check first preset line — most distinctive, no collision risk + first_line = preset_lines[0] + assert first_line in content, f"{name} preset line not found in output" finally: Path(tmp_path).unlink(missing_ok=True)