MpcVst - a VST host filter for MPC-HC
This is a DirectShow audio filter that lets you load VST2 and VST3 plugins into MPC-HC and use them while watching movies. Compressors, limiters, EQs, reverbs, vocoders, pitch correction, whatever you have. The plugins own UI opens in a normal window that you can move to a second monitor, your settings get saved automatically and come back next time you play something.
I made this because movie audio is mixed for a theater and then some streaming rip ships it with dialogue at -40db and explosions at 0db and my ears are 36 years old and tired. Slap a limiter on it and the explosions stop waking up the neighbors.
INSTALL
- Build it (see below) or grab MpcVst.ax from the releases page
- In MPC-HC open Options, go to Playback, Filters, External Filters
- Click Add Filter, then Browse, and pick MpcVst.ax. Drag and drop onto that dialog works too
- Select it in the list and set it to Prefer
No installer, no admin rights, nothing gets registered system wide. MPC loads the dll straight from the folder. To uninstall, remove it from the external filters list and delete the files.
USE
Play a movie. Right click, Play, Filters, double click MPC VST Host. Click Load VST and pick a plugin. VST2 dlls and VST3 files both work. Hit Show editor and the plugins own interface opens in a floating window you can resize and move around, it stays open when you close the properties dialog so you can keep tweaking while the movie runs.
The Bypass checkbox is an instant before/after switch which is exactly what you want when tuning a limiter.
Settings save to %APPDATA%\MpcVst automatically. Plugin path, bypass state and the full plugin state chunk all come back on the next playback. Delete that folder to reset everything.
Surround files (5.1, 7.1) get folded down to stereo before hitting the plugin using the usual downmix coefficients, LFE dropped. Output is always 32 bit float. If that bothers you, this is not the filter you are looking for.
KNOWN LIMITATIONS
VST3 modules are never actually unloaded once loaded. The plugin gets terminated properly but the dll stays in memory until MPC closes. This is on purpose, unloading vst3 modules while their background threads are still winding down crashes into freed code, and every serious host leaks them for exactly this reason.
Some plugins will refuse to run because they are not authorized on your machine. That is between you and the plugin vendor, a host cannot fix licensing.
Heavy plugins with their own DPI scaling mostly work but I have not tested on a 4k laptop at 300% so your mileage may vary.
BUILD
You need Visual Studio 2019 or newer build tools with the C++ workload, and Windows 10 SDK. Run build.bat from a normal command line, it finds vsdevcmd itself. Output lands in out\Release\MpcVst.ax.
The VST3 SDK lives in vendor\vst3sdk as a git submodule, so clone like this
git clone --recurse-submodules https://github.com/UncleMart/MpcVst.git
and then pull the SDKs own submodules too
git -C vendor\vst3sdk submodule update --init base pluginterfaces public.sdk
DirectShow base classes and vestige.h are checked in directly under vendor so no other downloads needed.
TESTING
There is a test suite in tests, see build_pagetest.bat. smoke.exe checks the com plumbing and media types, loadtest.exe loads a plugin end to end, racetest.exe hammers it from a fake streaming thread, pagetest.exe builds a real playing graph with a property page and an editor window, which is as close to actual MPC usage as you can get without MPC. MiniVst.dll is a tiny synthetic gain plugin the tests use so nothing depends on your installed plugins.
WHY
Because every existing option was some combination of abandoned, system wide, or required foobar2000. I wanted a compressor while watching movies and nothing else. If that is also you, enjoy.
LICENSE
GPL-3.0. The VST3 SDK is Steinberg licensed GPLv3 and since this statically links parts of it the whole thing has to be GPL too, which is fine because it was going to be open anyway. The DirectShow base classes are Microsoft sample code under their own permissive terms, headers kept intact in vendor\baseclasses.