Skip to content

MilkDrop 2 Visualisation

jecassis edited this page Oct 6, 2025 · 11 revisions

foo_vis_milk2 is a foobar2000 component that ports Winamp's MilkDrop 2 music visualizer. It additionally migrates rendering from DirectX 9 to DirectX 11.

What is MilkDrop?

MilkDrop is a music visualization "plug-in" for the Winamp music player. As you listen to music through Winamp, MilkDrop renders the soundwaves in a visual feedback loop, driven by 3D graphics, to create a rich visual journey through sound.

MilkDrop 2 is a major upgrade to the original MilkDrop visualizer, opening up the power of modern graphics chips and programmable pixel shaders to the realm of music visualization. Pixel shaders allow dozens, even hundreds of complex instructions to be executed for every pixel on the screen, every frame. Other new features include JPG textures, gaussian blurring, a preset "mash-up" feature, and a preset "history". MilkDrop 2 is backwards-compatible with presets from MilkDrop 1.

Why foo_vis_milk2?

The Milkdrop 2 dynamically-linked library (DLL) [called vis_milk2.dll] requires both installing Winamp and the legacy DirectX runtime. Porting the library to DirectX 11 allows the visualization to be used with the DirectX runtimes included with Windows since version 7 SP1 and take advantage of better hardware rendering on modern GPUs. DirectX 11.1 in foo_vis_milk refers to a collection of multimedia application programming interfaces (APIs) included with Windows consisting of Direct3D 11.1, DXGI 1.6, Direct2D 1.1, and DirectWrite 1.1. Further, foo_vis_milk2 runs on both 32- and 64-bit operating systems (OSes) and on Intel and ARM instruction set architectures (ISAs) and, importantly, leverages foobar2000's rich feature set and extensibility.

Useful foo_vis_milk2 Links

Section Listing

  1. Requirements
  2. Installation
  3. Tweaking
  4. Usage
    1. Keyboard Commands
    2. Preferences Page
    3. Preset Authoring
    4. Rating System
    5. Custom Messages
    6. Sprites
  5. Troubleshooting
  6. Known Issues / Tips
  7. Settings List
  8. Using Line-In
  9. Acknowledgements
  10. Version History

1. Requirements

  1. foobar2000 2.0 or later.
  2. Windows 7 SP1 or later for DirectX 11.1. The component renders using Direct3D 11.1, DXGI 1.6, Direct2D 1.1 and DirectWrite 1.1.
  3. Hardware-based 3D graphics acceleration (i.e., a video card with 3D support) supporting DirectX 9 with at least 8 MB of video memory.
  4. MilkDrop presets.

2. Installation

foo_vis_milk2 can be downloaded from the foobar2000 component browser. To install it:

  • Download foobar2000 and install it.
  • Import foo_vis_milk2.fbk2-component into foobar2000 using the File > Preferences > Components > Install... menu item and restart foobar2000 when prompted.
  • Download and extract presets into this component's directory of foobar2000. This should be <foobar2000 profile folder>\milkdrop2\presets.
  • Textures can also be added to <foobar2000 profile folder>\milkdrop2\textures and referenced in their accompanying configuration file <foobar2000 profile folder>\milkdrop2\milk2_img.ini.
  • Custom messages can be entered into <foobar2000 profile folder>\milkdrop2\milk2_msg.ini.

See here for more information on installing components.

Once foo_vis_milk2 is installed, launch it. Use View > Visualizations > MilkDrop to launch the visualizer. Alternatively, embed it in the layout by using View > Layout > Enable layout editing mode. Load some music files into the playlist and start playing some music.

Quick Tips:

  • To go fullscreen, double-click on the visualizer window.
  • To configure MilkDrop's options find the MilkDrop preferences page under File > Preferences > Visualisations > MilkDrop or right click the visualizer and select Launch Preferences Page.
  • Right click the visualizer for more options in the context menu.

If you have trouble getting MilkDrop to run properly after installation, try installing recent WHQL drivers for your video card. See the troubleshooting section of the documentation for more information.

Presets

The preset files define the visualizations via pixel shaders, equations and parameters.

foo_vis_milk2 is not packaged with any presets. Some presets enjoyed by Ryan Geiss (the MilkDrop 2 author) can be downloaded from his website. In addition, the projectM repository archives several preset and texture collections:

3. Tweaking for Best Image Quality

a) Fullscreen Display Mode

When you run MilkDrop fullscreen, it runs in "immersive" fullscreen mode. Generally speaking though, the speed (frame rate) and smoothness of MilkDrop will drop as the resolution (number of pixels on the screen) increases. So, if it's running to slow in fullscreen mode, try using it in a smaller window.

b) Canvas Stretch

This option lets you trade resolution (crispness) for speed. If MilkDrop runs too slow, in any mode (windowed/fullscreen), try cranking up the canvas stretch to, say, 1.5X or 2X. The image will not look as crisp, but MilkDrop will probably run much faster (assuming that the graphics processor (GPU) was the bottleneck).

c) Mesh Size

This is the main option that affects how much processor (CPU) MilkDrop uses. If you crank it up far beyond the default, expect to be CPU-bound (where your framerate drops because the CPU is the bottleneck). To get MilkDrop to speed up, drop the mesh size back down. The mesh size decides how many points on the screen the per-vertex equations will be executed for; the higher the mesh size, the more fidelity you will see in the motion.

d) Maximum Frame Rate

Most screens usually run at a fixed frequency only—usually 60 Hz—meaning that they update the screen 60 times per second. For this component, you will also want to choose maximum framerates that divide evenly into 60 - such as 60, 30, 20, 15, 12, 10, 6, 5, and so on - so that the number of times the LCD shows each frame of animation remains constant, resulting in the smoothest possible animation. If you have a variable refresh rate screen (VRR), set the Allow Page Tearing option.

e) Color (Bit) Depth

Windows 10 and onwards runs exclusively with 32-bit color with gamma set to 2.2. Consequently, the 16-bit color Brightness slider has been removed. Its use was to find the setting that would make the image as bright as possible, without oversaturating it (washing it out, often to bright pink or white). This setting varied for different GPUs, depending on their color values rounding. The recommendation was seeing how bright you can set the slider (closer to '0') without oversaturating the image. Usually, a setting of '0' or '2' worked the best.

4. Usage

4.a. Keyboard Commands

The following keys can be used to control MilkDrop while it is running.

Note 1: pressing F1 while MilkDrop is running will show an abbreviated version of this list.

Note 2: Keyboard messages from foobar2000 only propagate to the component during fullscreen or when the visualization window is not embedded in the player's layout.

GENERAL
  ESC: toggle interactive mode or exit fullscreen
  ALT + K: launch preferences page

PRESET LOADING
  BACKSPACE: return to previous preset
  SPACE: transition to next preset
  H: instant hard cut (to next preset)
  R: toggle random (vs. sequential) preset traversal
  L: load a specific preset (invokes the 'Load' menu)
  + / -: rate current preset (better / worse)
  scroll lock: lock/unlock current preset
      (keyboard light on means preset is locked which
       prevents random switch to new preset)
  A: aggregate preset - loads a random preset,
     steals the warp shader from a different random preset,
     and steals the composite shader from a third random preset.
  D: cycle between various lock-states for the warp and
     composite shaders. When one of these shaders is locked,
     loading a new preset will load everything *except* the
     locked shaders, creating a mix between the two presets.

PRESET EDITING AND SAVING
  M: show/hide the preset-editing menu
  S: save new preset (asks for the new filename)
  N: show per-frame variable monitor (see milkdrop_preset_authoring.html)

MUSIC PLAYBACK
  Z / X / C / V / B: navigate playlist (prev / play / pause / stop / next)
  u / U: toggle shuffle mode forward / back
  P: show playlist
  up / down arrow: volume up / down
  left / right arrow: rewind / forward 5 seconds
  SHIFT + left / right arrow: rewind / forward 30 seconds

STATUS INFORMATION
  F1: show help screen
  F2: show song title
  F3: show song length
  F4: show preset name
  F5: show frames per second (FPS)
  F6: show rating of current preset
  Y, F7: re-read custom message file (milk_msg.ini) from disk
  F8: jump to new presets directory
  F9: show shader help (in shader edit mode)

MENU / PLAYLIST / PRESETS
  ESC: exit menu
  BACKSPACE / left arrow: return to previous menu or exit menu if top
  ENTER / SPACE / right arrow: select or go to sub-menu
  up / down arrow: change selection up / down

SPRITES AND CUSTOM MESSAGES
  T: launch song title animation
  Y: enter custom message mode
      ##: load message ## (where ## is a 2-digit numeric code [00-99]
                           of a message defined in milk_msg.ini)
      *: clear any digits entered
      DELETE: clear message (if visible)
      F7: re-read milk_msg.ini from disk
  K: enter sprite mode
      ##: load sprite ## (where ## is a 2-digit numeric code [00-99]
                          of a sprite defined in milk_img.ini)
      *: clear any digits entered
      DELETE: clear newest sprite
      SHIFT + DELETE: clear oldest sprite
      CTRL + SHIFT + DELETE: clear all sprites
      F7: no effect (milk_img.ini is never cached)
  SHIFT + K: enter sprite kill mode
      ##: clear all sprites with code ##
      *: clear any digits entered
  CTRL + T: kill song title
  CTRL + Y: kill custom messages
  CTRL + K: kill all sprites

The following keys are for changing certain common parameters on the current preset.

MOTION
  i / I: zoom in / out
  [ / ]: push motion (`dx`) left / right
  { / }: push motion (`dy`) up / down
  < / >: rotate (`rot`) left / right
  o / O: shrink / grow the amplitude of the warp effect

WAVEFORM
  w / W: cycle through waveforms forward / back
  j / J: scale waveform down / up
  e / E: make the waveform more transparent / solid

BRIGHTNESS
  g / G: decrease / increase gamma (brightness) **

VIDEO ECHO EFFECT
  q / Q: scale second graphics layer down / up **
  F: flip second graphics layer (cycles through 4 fixed orientations) **

SHADERS
  !: randomize warp shader
  @: randomize composite shader

** These keys only have an effect on MilkDrop 1-era presets.
   In MilkDrop 2-era presets, these values are embedded in
   the shader, so you need to go into the composite shader
   and modify the code.

Note that there are more keys available, but because many are only relevant to people designing their own presets, they are listed in the preset authoring guide instead.

4.b. Preferences Page

The preferences page lets you customize the way MilkDrop runs. To learn how to get to the preferences page, see the installation section above.

Once in the preferences page, tooltips guide you on the purpose of each setting. Just hover the mouse over the setting to see it.

4.c. Preset Authoring

See the preset authoring guide for instructions on how to create and save your own presets.

4.d. Rating System

The built-in rating system allows you to rate each preset on a scale from 0 to 5. A rating of 5 is very good, while a rating of 0 is the worst. The ratings decide how often the presets will be randomly loaded. If a preset has a rating of 0, it will never be randomly loaded (unless they're all zero; then they all have an equal chance).

To show the rating for a preset, press F6. You can adjust the rating for a preset with the +/- keys. When you make adjustments, they save automatically; there's no need to save the preset to make the rating change permanent.

Here's a recommended interpretation of the numeric values:

0 = never again
1 = very ugly
2 = mediocre
3 = fair
4 = good
5 = downright stimulating

If a preset seems "lost" because its rating is 0 and it won't ever come back, you can always load it up by hitting L to bring up the "Load Preset" menu. Then find the preset you want, load it (with ENTER) and hitting + to update its rating.

4.e. Custom Messages

About Custom Messages

The "Custom Message" feature of MilkDrop allows you to display short text messages on the screen while MilkDrop is running. They are highly configurable; you can set all of the following parameters: the font, the size, the positioning, color, bold state, italic state, and so on; and you can even have it randomize some of these properties.

Creating the Messages

You can save up to 100 messages in the file milk2_msg.ini under the <profile>\milkdrop2\ directory. To open this file, go to the Milkdrop Preferences Page screen (CTRL + P) and click the Edit Custom Messages button. Or, you can just edit it manually; it's plain text.

The first thing you see when you open the file is a bunch of lines that start with two forward slashes (//). These are comment lines, and they explain the syntax for adding a font or a message to the file. This is your main reference for finding out what all the parameters do for the fonts and messages; it is recommended that you leave this information in the file, although it can be removed (or modified) and the messages will still work.

After the comments the fonts are defined first, then the messages. The fonts are simply a way to specify a typeface, bold state, italics state, and red/green/blue color for the font. You can configure up to 16 fonts (numbered 00-15) this way. These fonts will serve as template fonts for the custom messages.

The next section is the actual messages. Each one has a text message (the text parameter) that will be shown to the user, and each one references one of the 16 fonts that were defined in the previous section. You can also specify the size (size), position (x, y), a growth factor (growth) that will grow/shrink the message over its lifetime, the number of seconds to show the message (time), and the fraction of that time that is spent fading in (fade).

You can also randomize some of these values: randx and randy will randomly perturb the (x,y) coordinates every time the message is shown to the user, and randr, randg and randb will randomly perturb the (r,g,b) colors in the same way.

Finally, you can override any of the default properties for the font that this message uses: face, bold, ital, r, g, b.

Invocation and Usage

There are two ways to invoke custom messages: one automatic, the other manual.

The automatic way is to go to the Milkdrop Preferences Page screen (CTRL + P) and set the value in the Time between random custom messages box to something greater than zero. This will cause MilkDrop to randomly display custom messages while it is running, and the average time (in seconds) between messages will be the value entered here. If you wish to disable random custom messages, set this value to -1.0 (or any negative number). Note that all messages in the file have an equal change of being picked.

The manual way is to type in the two-digit code (00-99) of the message while MilkDrop is running. If you make a mistake while entering the first digit, just press the * key to start over.

Note: you can't use the numeric keypad for message selection. Use the number row near the top of the keyboard.

Note that if you change the milk2_msg.ini file while MilkDrop is running, you will not be able to see the changes until you hit Y then F7, which tells MilkDrop to re-read the file from disk.

4.f. Sprites

About Sprites

The "Sprite" feature of MilkDrop allows you to display any image of your choice in the foreground (on top of MilkDrop) while it runs. The sprites can fade in and out, move around, respond to the music, and so on. You define them in the file milk2_img.ini under the <profile>\milkdrop2\ directory—much like you define custom messages—each having an identifying code number from 00 through 99 (used to invoke them). However, the way the individual sprites are defined is different; you write code for them, instead of just setting parameter values. This is a little bit tougher to do (it's very much like preset authoring), but adds a great deal of flexibility to what you can do with the sprites.

For album art, specifically, define a img100 entry. Here is an example for a spinning animation:

[img100]
init_1=blendmode = 3;
code_1=rot = -time * 0.2;
code_2=new_scale = 0.7 + 0.2 * sin(time * 0.6);
code_3=sx = new_scale;
code_4=sy = new_scale;
code_5=new_alpha = .4 * min(0.9, max(0.2, 2 * max(treb - .05, treb_att) -1.1));
code_6=a = a * 0.03 + 0.10 * new_alpha;

Creating the Sprites

You can define up to 100 sprites in milk2_img.ini. To open this file, go to the Milkdrop Preferences Page screen (CTRL+P) and click the Edit Sprites button. Or, you can just edit it manually; it's plain text.

The first thing you see when you open the file is a bunch of lines that start with two forward slashes (//). These are comment lines, and they explain the syntax for creating a sprite. This is your main reference for finding out what all the parameters do for the fonts and messages; it is recommended that you leave this information in the file, although it can be removed (or modified) and the sprites will still work.

After the comments come the sprite definitions. Each sprite is made up of one parameter that indicates the image file to use (this is the 'img=...' line), and two types of code: initialization code, and regular code.

The first—initialization code—is executed only once, when you launch the sprite. Use it to do one-time initialization of variables such as the opacity (a), rotation angle (rot), position (x, y), and so on. Or to invent new variables that you will access later. This code is marked by the init_1=..., init_2=..., etc... lines.

The second type of code—marked by code_1=..., code_2=..., etc...—is executed every frame, just prior to plastering the sprite on the screen. Use it to animate the sprite, moving it around (changing x, y), scaling it up and down (sx, sy), fading it in and out (a), changing its color, and so on.

See the comments included in the milk2_img.ini for full details and examples on how to author sprites.

Invocation and Usage

There is currently only one way to invoke sprites (other than album art): manually. To do this, first press K to enter "sprite mode" (while running MilkDrop). Now, whenever you type in a two-digit code (00-99), MilkDrop will try to find and launch the sprite you've requested, from the milk2_img.ini file. If there is an error, it will display an error message in the upper-right corner.

Note: you can't use the numeric keypad for message selection. Use the number row near the top of the keyboard.

If you make an error entering the first digit of the code, just press * to start over. If you want to clear the most recently-invoked sprite, press DELETE. If you want to clear the oldest sprite, press SHIFT + DELETE. If you want to clear all sprites, press SHIFT + CTRL + DELETE.

If you want to clear sprites by their 2-digit code, press SHIFT + K to enter "sprite kill mode." Now, when you enter a two-digit code, instead of invoking the sprite, MilkDrop clears all running sprites with that two-digit code.

5. Troubleshooting

If MilkDrop has a critical problem (e.g., fails to load, freezes, etc...) or if the image is distorted, torn, corrupted, or all one solid color, try the following two suggestions to resolve the problem. In 90% of these cases it can be fixed. If you have a different problem, scroll down past this part and try to find the appropriate symptom and its solution.

  1. Change the Preset
    Some presets might contain errors or use features that are no longer supported. So, using a different one might make the errors disappear.

  2. [Re]Install the Component
    If you're having a non-critical problem, browse the following list of common problems and their causes and solutions. Note that for each symptom-cause-solution block, there can be multiple symptoms with the same cause and solution, and the same symptom might be listed in multiple blocks.
    If the solutions below don't work for you, please visit the forums at Hydrogen Audio, where you can read the most recent troubleshooting issues and solutions.

  3. Update Your Video Driver
    Almost all display problems are caused by buggy video drivers!
    A "driver" is a piece of software that translates graphics-related commands from programs, like MilkDrop, into the native language of your specific graphics hardware. Use only Microsoft-certified WHQL drivers for your video card.

Entry 1

Symptom

  • Any error message saying "Failed to create ..." or "Not enough memory...", or only a portion of the screen displays correctly; the rest is either filled with garbage or badly flickering.

Cause

  1. Your video card might not have enough memory to run MilkDrop at the resolution (screen width and height) you've picked.
  2. Your drivers might be out of date.
  3. You might need to reinstall DirectX (very, very rare).
  4. Your graphics card might be too crappy to actually run pixel shaders well.

Solution

  1. To battle video memory problems:
    You can try locking the texture size (or "canvas size") to 256x256 pixels, just to see if that fixes the problem. If it does, try to close other graphics-hungry applications.

Entry 2

Symptom

  • When I go to the Load Preset menu (L) in MilkDrop, some of the presets on disk are missing.
  • I put new presets in <foobar2000 profile folder>\milkdrop2\presets directory, but I can't access them from within MilkDrop.

Cause

You probably have an older video card that can't handle the pixel shaders needed to run some of the presets. MilkDrop automatically hides any presets from you that you can't run.

Solution

  • This should be incredibly rare in foo_vis_milk2 because all presets specifying Shader Model 2.0 can be compiled into Shader Model 4.0 which is a requirement to support DirectX 11.
  • You could buy a new graphics card—one that meets the minimum recommendation for MilkDrop 2—actually you will have worse problems than MilkDrop if you get here.

Entry 3

Symptom

MilkDrop always looks the same—it's always showing the same preset, and it never changes to a new preset unless I tell it to.

Cause

Scroll Lock is on.

Solution

The Scroll Lock key is how you tell MilkDrop to lock the current preset—i.e., don't randomly transition to a new preset unless you do it. The state of the Scroll Lock key is remembered when you start or stop MilkDrop, too, so be careful of that. If you are experiencing this problem, you can fix it in any of the following three ways:

  1. Hit Scroll Lock while MilkDrop is running (and the visualization window is active).
  2. Load up the MilkDrop Preferences Page (CTRL + P) and uncheck the "Start MilkDrop with preset lock [Scroll Lock key] on" box.
  3. Right click on the visualization window and click on the Lock Preset option IF it has a tick mark next to it.

Entry 4

Symptom

I was browsing for presets from within MilkDrop (L) key and got lost. How do I get back to my presets?

Solution:

Two ways to fix this:

  1. To fix it manually (and preserve all your settings), run MilkDrop, hit F8, and paste in [the equivalent of] this path: <foobar2000 profile folder>\milkdrop2\presets.
  2. Another way is to just reset MilkDrop to its defaults—load up the MilkDrop Preferences Page (CTRL + P), then click the "Reset page" button. The next time you launch MilkDrop, it will start you in the default preset directory.
  3. Load the Advanced Preferences Page (CTRL + P) in foobar2000, update the path under Display > Visualisations > MilkDrop > Preset directory. The next time you launch MilkDrop, it will start you in the default preset directory.
  4. Another way to fix it is to hit L, and browse to the root folder (repeatedly select ".."), then navigate every level into <foobar2000 profile folder>\milkdrop2\presets.

Entry 5

Symptom

  • Things flicker through (such as taskbar clock, web page animations, etc...) when I'm running MilkDrop in fullscreen mode.

Cause

You're probably running MilkDrop fullscreen and Windows isn't properly handling MilkDrop's request for topmost access to the screen, and is still letting other applications paint (draw) themselves.

Solution

Not much to do since foobar2000 does not use "fullscreen exclusive" (FSE) mode when fullscreen.

6. Known Issues / Tips

  1. Tip for video capture:
    If you'd like to save sequences of video from this component, there are several programs that will let you do this. One such program is OBS.

Warning: you will need a ton of free hard drive space, and a fast CPU helps.

  1. Close other apps:
    For the best graphics performance, try to close as many other applications as you can, before running the plugin, especially those that tend to work in the background, such as anti-virus or file-swapping software. Also, if you must leave other applications open, try to minimize them (i.e. shrink the window down to the taskbar) so that they stay out of the painting loop.

  2. Windows / foobar2000 with per-user settings:
    Be aware that if you're running Windows as a non-admin user, you can't write to (or delete from) files in the Program Files directory. Which is why foobar2000's "Standard installation" uses per-user settings. These settings are located in C:\Users\<user name>\AppData\Roaming\foobar2000-v2\ (i.e., the profile directory). Add a milkdrop2\presets\ directory to this folder to contain the presets and a milkdrop2\textures\ directory for sprites. Also, the optional milk2_img.ini and milk2_msg.ini files are placed here.

Note: "Application Data" or "AppData" is a hidden folder.

If you installed foobar2000 with the "Portable installation" option, then the settings will be located inside the profile\ folder inside the foobar2000 installation directory.

7. Settings List

Here are the settings list, where they can be found and their default values (mostly from the milk2.ini defaults). You can return to the default values by pressing the "Reset page" button when in the "MilkDrop Preferences Page".

Settings controlled in the MilkDrop Preferences page:

  • bPresetLockOnAtStartup (false, unchecked): Check this box to make MilkDrop automatically start in 'preset lock' mode, meaning that the preset will not change until it is manually changed.
    Manual changes are either by pressing SPACE, hitting H for a hard cut, or by selecting a new preset from the Load menu.
    Use the SCROLL LOCK key while MilkDrop is running to toggle the preset lock on or off. When the SCROLL LOCK light is on, that means that the preset lock is also on, and vice versa.
  • bPreventScollLockHandling (true, checked): Check this box to prevent MilkDrop from controlling the Scroll Lock key state.
  • bWarningsDisabled2 (false, unchecked): Check this box to disable all errors and warning messages that appear in the upper-right corner of the screen.
  • bEnableRating (true, checked): Check this box to turn off the preset rating system. Normally, when MilkDrop randomly selects presets, it weighs them based on their ratings. This setting will bypass the weighing so all presets to have an equal chance of being chosen.
  • bShowPressF1ForHelp (true, checked): Uncheck this box to prevent the "Press F1 for Help" message from appearing when MilkDrop starts.
  • max_fps_fs (30 fps): This selection controls the maximum number of times the image will be updated, per second. Frame rate is also commonly called "FPS", or "frames per second".
    If MilkDrop is running too quickly for your taste, you can lower the maximum framerate to slow it down. You might also want to do this if it is 'hogging the CPU' and slowing down other applications.
    Typically, a framerate of 30 looks good; 60 looks great. The human eye has a hard time processing more than 60 frames per second, though. Note that if the animation is rendering below the maximum framerate here, your CPU will likely be in 100% use, leaving your computer somewhat unresponsive. If this is the case, try lowering the maximum. frame rate until it takes effect, and then your computer should become more responsive. Also keep in mind that it's a good idea to try and set the maximum framerate to the current refresh rate of your monitor (e.g., 60 Hz, 72 Hz, etc.) or an integer factor of that number; for example, at a 72 Hz monitor refresh rate, good maximum framerates would be 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, or 72.
  • allow_page_tearing_fs (false, unchecked)
  • fTimeBetweenPresets (16.0): The minimum amount of time that elapses between preset changes (excluding hard cuts, which take priority). The old preset will begin to blend or fade into a new preset after this amount of time, plus some random amount of time (as specified below in the 'additional random time' box). Add these two values together to get the maximum amount of time that will elapse between preset changes.
  • fTimeBetweenPresetsRand (10.0): The additional random maximum number of seconds between preset fades (a.k.a., preset changes or soft cuts).
  • fBlendTimeAuto (2.7): The duration, in seconds, of a soft cut (a normal fade from one preset to another) that is initiated because some amount of time has passed. A value less than 1 will make for a very quick transition, while a value around 3 or 4 will allow you to see some interesting behavior during the blend.
  • fBlendTimeUser (1.7f): The duration, in seconds, of a soft cut (a normal fade from one preset to another) that is initiated when the 'H' key (for a hard cut) is pressed. A value less than 1 will make for a very quick transition, while a value around 3 or 4 will allow you to see some interesting behavior during the blend.
  • fHardCutHalflife (60.0): The amount of time, in seconds, between hard cuts. Hard cuts are set off by loud beats in the music, with (ideally) about this much time in between them.
  • fHardCutLoudnessThresh (2.5): Use this loudness slider to adjust the sensitivity of the beat detection algorithm used to detect the beats that cause hard cuts. A value close to 'min' will cause the algorithm to be very sensitive (so even small beats will trigger it); a value close to 'max' will cause only the largest beats to trigger it.
  • bHardCutsDisabled (true): Check this box to disable hard cuts; a loud beat will never cause the preset to change.
  • n16BitGamma (2): Use this brightness slider to control the overall brightness of the image for 16-bit color modes. If the image is continually washed out to bright purple or white, crank this down to (probably) zero. If the image is chronically dark, crank this up.
    Note that the slider is not visible when the nearby 'guess' checkbox is checked. Uncheck it to manually set the brightness.
    Also note that this brightness adjustment is only a concern in 16-bit color modes; 32-bit doesn't have this problem. So, if you're running Windows in 16-bit color, this slider will affect windowed, desktop, and 'fake' fullscreen modes. And if you've selected a 16-bit fullscreen display mode, it will affect that too.
  • bAutoGamma (true): Check this box to ask MilkDrop to make an educated guess for the 'brightness control for 16-bit color' setting, based on the video card vendor. This usually gets it, but not always.
    The slider is only visible when this option is unchecked.
  • nMaxImages (32): See nMaxBytes.
  • nMaxBytes (16000000): Use these selections to limit how much video RAM MilkDrop will try to use to cache textures. They only become relevant when there are a large number of textures in the 'milkdrop2\textures' directory.
    Say you set up some kind of art kiosk with thousands of large images, this option lets you tweak how much video RAM MilkDrop will try to use to cache textures. The only point of cacheing textures is so that when loading a new preset, if the preset needs to load textures, if they were already loaded once and are still cached in memory, the load will be much smoother.
    Go ahead and crank this up; MilkDrop's core internal textures will always take precedence over disk textures anyway, so it's pretty safe.
  • nMaxPSVersion (-1): This setting is not relevant for DirectX 11 MilkDrop, pixel shaders are compiled with Shader Model 4.0 ('ps_4_0_level_9_1') at minimum.
    MilkDrop 1 did not use programmable pixel shaders - instead, it used the fixed-function graphics pipeline. If your graphics chip is older and doesn't support pixel shaders, or doesn't support the ideal pixel shader version (2.0) for MilkDrop 2, then this should be auto-detected without a problem, and MilkDrop will simply skip over any presets that can't run on your graphics chip. (These presets will also be hidden from view, in the preset list.)
    If you'd like to force MilkDrop to try and allow higher (or lower) versions of pixel shaders, use this option.
    Finally, if you want to prevent MilkDrop from running any pixel shader 3.0 presets (because it's too slow for them), you can just set this option to version 2.0, and MilkDrop will avoid those presets. // -1 = auto, 0 = disable shaders, 2 = ps_2_0, 3 = ps_3_0
  • bSongTitleAnims (true): Check this box to automatically launch song title animations whenever the track changes.
  • fSongTitleAnimDuration (1.7): The duration, in seconds, of song title animations.
  • fTimeBetweenRandomSongTitles (-1.0): The mean (average) time, in seconds, between randomly-launched song title animations. Set to a negative value to disable random launching.
  • fTimeBetweenRandomCustomMsgs (-1.0): The mean (average) time, in seconds, between randomly-launched custom messages (from 'milk_msg.ini'). Set to a negative value to disable random launching.
  • nCanvasStretch (0): MilkDrop works with an internal texture, or canvas, to do all of its graphics rendering. The speed (framerate) that MilkDrop runs at is inversely proportional to the number of pixels that are in this canvas.
    So, to render things internally at a smaller resolution, but stretch them up for display, you can use this option. It will make the image look a bit softer and less crisp or detailed, but - especially for older graphics hardware - things will run much faster.
    Keep in mind, a stretch factor of 2X, for example, means that there will be half as manypixels to simulate on both the X and Y axes, so MilkDrop will actually run FOUR TIMES as fast. With a stretch factor of 3X, it will run 9X as fast (hypothetically). And so on.
  • nGridX (48): //32
  • nTexSizeX (-1): // -1 means "auto"
  • nTexBitsPerCh (8): This setting determines the precision of the colors displayed. It is not relevant for DirectX 11 MilkDrop, all textures use 32-bit color depth.
    Higher bit depths are better. A bit depth of 8, for example, means that in the graphics hardware, the image can have 2^8, or 256, possible shades (each) of red, green, and blue. A bit depth of 8 looks decent, but 16 is much better. HOWEVER, only high-end video cards (as of 2007) usually support it properly.
    Older cards can't do 'bilinear interpolation' with 16-bit render targets, meaning that the image will get very grainy and 'digital' looking, so PLEASE WATCH OUT FOR THIS.
    32 bits is excessive and slow, don't ever use it.
    Note that your monitor can only show 256 shades of each color; however, if the internal image (that is repeatedly warped and modified from frame to frame) has better color precision (~16 bits), then the colors in the image will maintain their fidelity as they slowly erode and warp, over time.
  • szTitleFormat ("%title%"): Set a song title format string using foobar2000 script."
  • szArtworkFormat (""): If nothing is set, then foobar2000 will use the album metadata. To override, set either a fully-qualified path or a foobar2000 script that returns the file path of the artwork to display.
  • bSkipCompShader (false): Check this box to skip composite shader blending to minimize the strobing effect on the bottom and right edges of the screen.
  • stFontInfo (_stFonts.fontinfo):

Settings controlled in the foobar2000 Advanced Preferences page:

  • bDebugOutput (false, unchecked)
  • szPresetDir

State settings saved on close and restored on launch. Several of these are controlled in either the context menu or via the keyboard shortcuts:

  • bShowFPS (false from F5):
  • bShowRating (false from F6):
  • bShowPresetInfo (false from F4):
  • //bShowDebugInfo (false):
  • bShowSongTitle (false from F2):
  • bShowSongTime (false from F3):
  • bShowSongLen (false from F3 twice):
  • bShowShaderHelp (false F9 (in shader edit mode)):
  • bPresetLockedByCode (from ScrlLck):
  • bEnableDownmix (false from right-click menu):
  • bShowAlbum (false from right-click menu / empty art title above):

Preferences derived from other settings or hidden altogether:

  • //bTexSizeWasAutoPow2 (false)
  • //bTexSizeWasAutoExact (false)
  • //nTexSizeY (-1) // -1 means "auto"
  • //nGridY (36) //24
  • nBackBufferFormat (DXGI_FORMAT_B8G8R8A8_UNORM)
  • nDepthBufferFormat (DXGI_FORMAT_D24_UNORM_S8_UINT)
  • nBackBufferCount (2)
  • nMinFeatureLevel (D3D_FEATURE_LEVEL_9_1)
  • bEnableHDR (false)
  • szPluginsDirPath
  • szConfigIniFile profile\milkdrop2/milk2.ini
  • szMilkdrop2Path <profile>\milkdrop2
  • szMsgIniFile <profile>\milkdrop2/milk2_msg.ini
  • szImgIniFile <profile>\milkdrop2/milk2_img.ini
  • //nFpsLimit (-1)
  • //bShowSongInfo
  • //bShowMenuToolTips
  • //bFixPinkBug (-1)
  • //bAlways3D (false)
  • fStereoSep (1.0f)
  • //bFixSlowText (true)
  • //bAlwaysOnTop (false)
  • //bWarningsDisabled (false)
  • //bAnisotropicFiltering (true)
  • bPresetLockedByCode (false)

8. Using Line-In

If you want to use your sound card's Line-In or CD Audio inputs for sound data (instead of pre-recorded files), you need to leverage a different foobar2000's functionality to do so. One component with such capability is foo_record. Do the following:

  1. Connect Wires
    Connect the audio source (a stereo, a live feed, whatever) into the line-in (or microphone) 1/8" jack on your sound card. You might want to test and verify that your cable is good before doing this.
  2. Select Sound Input Channel and Adjust Volume
    In Windows, right click the speaker icon in the System Tray (where the clock is). Select "Volume mixer". Use the "Input device" dropdown to select the input device, possibly Line-In or Microphone) input channel. Ensure that the volume slider is close to, or at, the maximum.
  3. Tell foobar2000 to Use Line-In
    Open foobar2000, and hit CTRL + U (the File > Add location... hotkey). Now type in "record://" as the location you want to open and press "OK". Press Play and the little built-in oscilloscope (or spectrum analyzer) in foobar2000 should be showing your signal.
  4. Run MilkDrop
    Run MilkDrop as usual. If the waves are too small or large, either adjust the volume in foobar2000, the Windows Volume Control, or adjust the sound level at the source.

9. Acknowledgements

Thank you to everyone who has contributed.

foo_vis_milk2 is released under the Mozilla Public License (MPL) version 2.0. Component source code can be obtained from:

10. Version History

foo_vis_milk2
0.6.0 - 2025-10-03
0.5.2 - 2025-09-13
0.5.1 - 2025-09-12
0.5.0 - 2025-09-05
0.4.0 - 2025-08-03
0.3.3 - 2025-04-05
0.3.2 - 2025-03-08
0.3.1 - 2025-02-11
0.3.0 - 2025-02-06
0.2.0 - 2024-11-16
0.1.9-beta - 2024-09-24
0.1.8-beta - 2024-09-22
0.1.0-beta - 2024-09-14
0.0.299-alpha - 2024-09-08
0.0.260-alpha - 2024-08-18
0.0.250-alpha - 2024-08-16
0.0.230-alpha - 2024-02-20
0.0.229-alpha - 2024-02-14
0.0.227-alpha - 2024-02-05
0.0.226-alpha - 2024-02-04
0.0.225-alpha - 2024-02-02

MilkDrop
    a Winamp visualization plug-in by Ryan Geiss
    copyright (c) 2001-2013 Nullsoft, Inc.
2.25c - 15 May 2013
2.2 - November 2009
2.1 - January 2009
2.0e - August 2008
2.0d - January 2008
2.0c - December 2007 (bundled with Winamp 5.51)
2.0 - 10 October 2007 (bundled with Winamp 5.5)
1.04L - 04 May 2007
1.04d - 13 February 2007
1.04c - 21 June 2006
1.04b - 10 October 2003
1.04 - 31 July 2003
1.03 final - 19 June 2002
1.03 beta 3 - 15 May 2002
1.03 beta 2 - 1 May 2002
1.02 - 2/7/02
1.01 - 12/7/01
1.0 - 10/30/01
0.99g - 9/11/01
0.99f - 8/22/01
0.99e - 7/5/01
0.99d - 6/5/01
0.99c - 5/21/01
0.99b - 5/16/01
0.99 - 5/11/01


return to top