MDropDX12 is a ground-up DirectX 12 rebuild of the MilkDrop2 visualizer engine, with GPU-accelerated text rendering, an in-app settings UI, and broad preset compatibility improvements. Works with Milkwave Remote via Named Pipe IPC for extended control (messaging, wave manipulation, screenshots, and more).
Current version: 2.7.0 — version numbers from upstream projects (BeatDrop, MilkDrop3, etc.) do not apply to MDropDX12.
Click here to get the latest version.
- Milkwave — Windows companion app with Remote control, wave manipulation, messaging, and more
- MilkRemote — Android remote control app for MDropDX12 (download latest APK)
- DirectX 12 rendering backend with GPU-accelerated Direct2D text overlay
- In-app Settings window (F8) with tri-mode theme (Dark / Light / Follow System), 5-tab UI (General, Tools, System, Files, About)
- Double-click .milk/.milk2/.milk3 files in Explorer to load them (forwards to running instance via Named Pipe IPC)
- One-click file association registration for .milk and .milk2 (Settings > About, no admin required)
- Named Pipe IPC — PID-based discovery, duplex message-mode communication, no hidden windows required
- Configurable hotkeys with per-binding local/global scope, mouse button bindings, dynamic Script/Launch entries (Hotkeys window, Ctrl+F7)
- Native MIDI input with 50 mapping slots, learn mode, button/knob actions (MIDI window from Settings)
- Standalone Song Info window (Shift+Ctrl+F8) with track info source selector and display options
- Standalone Displays window (Ctrl+F8) with Display Outputs and Video Input tabs
- Save Screenshot from Settings UI with file dialog, or via IPC
CAPTUREcommand - TDR recovery and GPU protection with automatic device restart
- Async shader compilation — non-blocking preset transitions, no render stalls
- Display current track information and artwork from Spotify, YouTube or other media sources playing on your PC
- Window title regex parsing with named profiles — extract artist/title/album from any media player's window title using configurable regex patterns with named capture groups
- Change preset on track change
- Set window transparency, borderless, and clickthrough ("watermark mode")
- Self-bootstrapping exe with embedded shaders (no external .fx files required)
- HLSL variable shadowing fix for improved preset compatibility
- 3D volume texture support (noisevol_lq/noisevol_hq)
- Fallback texture search paths, Random Textures Directory, and resource viewer
- Self-bootstrapping exe — no bundled presets required (see Resources Guide for preset collections)
- Native webcam and video file input mixing (background/overlay compositing with luma key)
- Shadertoy import: GLSL->HLSL converter with
.milk3JSON format, multi-pass rendering (Buffer A/B, Image, Common), SM5.0 shaders - Shader Import window with two-panel editor, per-pass channel combos, Convert & Apply, and Save .milk3 export
- Preset browser with type filtering (.milk/.milk2/.milk3), tagging, and subdirectory navigation
- Video Effects window with transform, color, and audio-reactive controls; VFX JSON profiles
- Workspace Layout window for tiling tool windows across the screen with render preview in a corner or on a separate display
- Text Animations window with DX12 warped text, color/font pickers, animation profile export/import, and custom preview
- ToolWindow system — Visual, Colors, Controller, Displays, Song Info, Hotkeys, MIDI, Presets, Sprites, Messages, Remote, Script, Shader Import, Video Effects, VFX Profiles, Text Animations, Button Board, Workspace Layout, Error Display, and Annotations windows run on their own threads with sticky positions, always-on-top pin, and tab memory
- FFT EQ smoothing with attack/decay and peak hold —
get_fft()/get_fft_peak()shader functions for EQ visualization presets - Error Display Settings window for configuring shader error notification appearance
- Preset annotation system — persistent per-preset ratings, flags (favorite/error/skip/broken), notes, and auto-captured shader errors
- Annotations ToolWindow with import, scan, and filter; right-click context menu on Presets window
- Cover art sprite system with IPC signal
- Two-pass shader blending for DX12 preset transitions
- Improved window handling, input methods and stability
- Use independently or with Milkwave Remote for extended control (messaging, shader conversion, wave manipulation, and more)
| Key | Action | Status |
|---|---|---|
| Alt+Enter | Toggle fullscreen (or double-click) | ✅ |
| Alt+S | Toggle multi-monitor stretch (or mirror mode with failsafe prompt) | ✅ |
| Shift+Up/Down | Increase/decrease window opacity | ✅ |
| F1 | Show/hide help (2 pages) | ✅ |
| F2 | Toggle borderless window | ✅ |
| Ctrl+F2 | Reset window | ✅ |
| Ctrl+Shift+F2 | Set window to fixed dimensions from config | ✅ |
| F4 | Show/hide preset info | ✅ |
| F5 | Show/hide FPS | ✅ |
| F6 | Show/hide rating | ✅ |
| F7 | Always on top | ✅ |
| F9 | Toggle clickthrough mode | ✅ |
| Ctrl+F9 | Toggle windowed fullscreen | ✅ |
| Ctrl+Shift+F9 | Toggle watermark mode (windowed clickthrough fullscreen) | ✅ |
| F12 | Transparency mode (remove black background) | ✅ |
| Ctrl+F12 | Toggle black mode (no preset rendering) | ✅ |
| N | Show per-frame debug monitor | ✅ |
| Escape | Close menu / exit app (with confirmation) | ✅ |
| Key | Action | Status |
|---|---|---|
| Space | Soft cut to next random preset | ✅ |
| H | Hard cut to next preset | ✅ |
| Backspace | Go back to previous preset | ✅ |
| ` / ~ | Lock/unlock current preset | ✅ |
| Scroll Lock | Lock preset + toggle playlist | ✅ |
| R | Toggle random/sequential order | ✅ |
| L | Open preset browser | ✅ |
| M | Show/hide preset-editing menu | ✅ |
| S | Save preset as... | ✅ |
| Ctrl+S | Quicksave to /presets/Quicksave | ✅ |
| Ctrl+Shift+S | Quicksave to /presets/Quicksave2 | ✅ |
| Mouse wheel | Next/previous preset | ✅ |
| Key | Action | Status |
|---|---|---|
| A | Random mini-mashup (Ctrl/Shift variants) | ✅ |
| ! | Randomize warp shader | ✅ |
| @ | Randomize comp shader | ✅ |
| D/d | Cycle shader locks (comp/warp/both/none) | ✅ |
| F11 | Cycle inject effect (off/brighten/darken/solarize/invert) | ✅ |
| Shift+F11 | Cycle hard cut mode (13 audio-reactive modes) | ✅ |
| Key | Action | Status |
|---|---|---|
| W/w | Wave mode +/- | ✅ |
| E/e | Wave alpha +/- | ✅ |
| J/j | Wave scale +/- | ✅ |
| I/i | Zoom +/- | ✅ |
| U/u | Warp scale +/- | ✅ |
| O/o | Warp amount +/- | ✅ |
| G/g | Gamma +/- | ✅ |
| +/- | Brightness +/- | ✅ |
| [/] | X push +/- | ✅ |
| {/} | Y push +/- | ✅ |
| </> | Rotation +/- | ✅ |
| P/p | Video echo alpha +/- | ✅ (non-shader presets via auto-gen comp) |
| Q/q | Video echo zoom +/- | ✅ (non-shader presets via auto-gen comp) |
| F/f | Video echo orientation | ✅ (non-shader presets via auto-gen comp) |
| Key | Action | Status |
|---|---|---|
| F3 | Cycle FPS limit (30/60/90/120/144/240/360/unlimited) | ✅ |
| Ctrl+F3 | Display current FPS setting | ✅ |
| F8 / Ctrl+L | Open Settings window | ✅ |
| Ctrl+F7 | Open Hotkeys window | ✅ |
| Ctrl+F8 | Open Displays window | ✅ |
| Shift+Ctrl+F8 | Open Song Info window | ✅ |
| Ctrl+D | Set audio device to default | ✅ |
| Ctrl+Shift+D | Display current audio device | ✅ |
| Ctrl+M | Toggle mouse interaction mode | ✅ |
| Ctrl+Q | Double render quality | ✅ |
| Ctrl+Shift+Q | Halve render quality (pixelize) | ✅ |
| Ctrl+H | Shift hue (Shift+ reverses) | ✅ |
| F10 / Ctrl+Z | Toggle Spout output (Shift+ sets fixed resolution) | ✅ |
| Key | Action | Status |
|---|---|---|
| Ctrl+X | Save screenshot to /capture folder (also via Settings > Remote or IPC) | ✅ |
| T/t | Song title animation | ✅ |
| Ctrl+T | Kill custom messages/song titles | ✅ |
| Key | Action | Status |
|---|---|---|
| K | Toggle sprite/message input mode | ✅ Handler works |
| 00-99 | Launch sprite or custom message | ✅ |
| * | Reload custom_messages.ini | ✅ |
| Delete | Kill newest sprite/message | ✅ |
| Shift+Delete | Kill oldest sprite/message | ✅ |
| Ctrl+Shift+Delete | Kill all sprites/messages | ✅ |
| Ctrl+K | Kill all sprites | ✅ |
| Shift+K | Enter sprite kill mode | ✅ |
The original MilkDrop2 WinAmp plugin created by Ryan Geiss was turned into a Windows standalone application by Maxim Volskiy as BeatDrop and has since been improved upon eg. in the BeatDrop-Music-Visualizer project. IkeC forked BeatDrop-Music-Visualizer into Milkwave, adding IPC remote control and other features. MDropDX12 originally started as a fork of IkeC's Milkwave.
MDropDX12 is maintained by shanevbg. This version is a ground-up rebuild of the rendering engine on DirectX 12, replacing the original DX9Ex backend entirely. The text rendering pipeline, settings UI, texture management, shader compilation, and resource handling have all been rewritten. While preset compatibility with the MilkDrop2 ecosystem is maintained, the codebase has diverged significantly from the upstream projects.
For a more detailed explanation of all features, please read the Manual.
For a chronological list of MDropDX12 releases and features, read the Changes.
- Windows 10 64-bit or higher (Windows 11 recommended)
- DirectX 12 compatible GPU
- No additional runtime libraries required (VC++ runtime is statically linked)
- Milkwave (optional — Remote auto-discovers visualizers via Named Pipe)
Download the latest portable zip from the latest release, extract to any folder with write access (e.g. C:\Tools\MDropDX12), and run MDropDX12.exe. No installer or admin privileges required.
See the Installation Guide for detailed instructions, directory layout, configuration files, and troubleshooting.
MDropDX12 builds with MSVC v143 (Visual Studio 2022 Build Tools) and MSBuild. The build script auto-fetches the Spout2 SDK.
git clone https://github.com/shanevbg/MDropDX12.git
cd MDropDX12
powershell -ExecutionPolicy Bypass -File build.ps1 Release x64See the Development Guide for full setup instructions using VSCodium, debugging, project structure, and troubleshooting.
This project incorporates the work of many different authors over the years, as listed below. The entirety of this project is Open Source and there will never be a paid version of it.
If you find bugs or have feature requests, open an issue on GitHub.
Many thanks to:
- IkeC - Milkwave
- Ryan Geiss - MilkDrop2
- Maxim Volskiy - BeatDrop
- oO-MrC-Oo - XBMC plugin
- Casey Langen - milkdrop2-musikcube
- Matthew van Eerde - loopback-capture
- projectM - projectm-eval
- Incubo_ - BeatDrop-Music-Visualizer
- milkdrop2077 - MilkDrop3
- and all the preset authors!
If you believe you or someone else should be mentioned here, please open an issue.
MDropDX12 is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC-BY-NC 4.0). See LICENSE for the full license text and THIRD-PARTY-LICENSES.txt for third-party component licenses (Nullsoft/MilkDrop2, Cockos/ns-eel2, Spout2, loopback-capture).
The presets themselves are not covered by either of these licenses, they either have their own license or none (in most cases). None of the presets in MDropDX12 should have a restrictive license preventing you from using them in public. All preset filenames from converted shaders have the original author's name in them, with the full original source mentioned in the preset file itself.
Always keep in mind that you are using the artistic work of someone else. Respect the original authors' work by showing the preset filename (at least briefly), and you should be fine. If in doubt, always ask the creator of the piece you use.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, shall be licensed as above.