projectM ~ Modern Milkdrop Visualizations


projectM is an open-source, cross-platform reimplementation of Winamp MilkDrop, the music visualizer created by Ryan Geiss. What began as a way to bring MilkDrop-style graphics to more platforms has grown into an ecosystem of visualization libraries, desktop frontends, audio plug-ins, media-player integrations and large community preset collections.

projectM music visualization display

The projectM engine

The central project is libprojectM, a reusable C++ library rather than a complete desktop application. It accepts audio samples (PCM), analyses the signal using FFT and beat detection, interprets MilkDrop-style preset equations and shaders, and renders the resulting animation with OpenGL. It can render into an OpenGL context or a texture so that another application can display the output.

This separation matters: the library does not provide a complete audio player or desktop audio-capture interface. A frontend or host application supplies audio, provides the user interface and graphics context, and makes presets and textures available. The core library is licensed under LGPL-2.1; individual frontends, plug-ins and integrations may use different licenses.

projectM official website Β· Core library on GitHub Β· Official GitHub organization and repositories

Standalone applications and frontends

These projects provide a desktop interface around the visualization engine:

  • projectMSDL (SDL/C++) β€” the official cross-platform standalone frontend. It captures desktop audio and displays projectM visualizations on platforms supported by SDL and libprojectM. The current 2.0 application is a development preview; the project documentation cautions that it is not yet feature-complete and may contain bugs.
  • Qt frontend β€” a Linux desktop application supporting PulseAudio, PipeWire and JACK. It adds a preset playlist editor, saved preset ratings and a graphical settings dialog.
  • SDL/Rust frontend β€” a Rust and SDL3 standalone application under development.

The official project describes the frontends as examples and development previews while the core library is undergoing modernization. Check each repository’s release notes and platform requirements before treating a frontend as a finished end-user product.

Audio plug-ins and player integrations

One of projectM’s strengths is that it can be embedded in other audio software instead of running as a separate visualizer window.

  • DISTRHO ProM β€” an audio plug-in implementation of projectM using the DISTRHO Plugin Framework. It provides CLAP, LV2, VST2 and VST3 formats, allowing a compatible DAW or plug-in host to display MilkDrop-style visualizations. ProM is a separate downstream project, not an official projectM frontend.
  • foobar2000: foo_vis_projectM β€” a Windows visualization component by djdron. Its source is at GitHub. It bundles the Cream of the Crop presets and textures. The component repository lists version 0.0.5, released in August 2022, for 32-bit and 64-bit Windows and foobar2000 1.5 or newer.
  • foo_uie_vis_projectM β€” an older foobar2000 visualization-panel component. This is a separate, historical implementation; do not confuse it with foo_vis_projectM.
  • Apple Music plug-in β€” an official projectM front-end plug-in for Apple Music on macOS. The project documentation currently describes it as a development preview.
  • libvisual plug-in β€” exposes projectM visualizations to applications that support the libvisual plug-in interface.

Media players and processing pipelines

  • Kodi visualization.projectm β€” a Kodi visualization add-on with its own source repository. Build branches need to match the Kodi version being used.
  • gst-projectm β€” a GStreamer plug-in that inserts projectM visualization into an audio/video pipeline. It can be used for offline rendering and audio-to-video conversion as well as pipeline-based playback.
  • projectM Music Visualization Service β€” an example AWS service that uses the GStreamer plug-in to turn audio files into video files.
  • pmstream β€” an unusual Linux implementation that renders projectM frames as ASCII or Sixel graphics in a terminal. It can work with the kew terminal music player.

The projectM developers also document integrations in Kodi, VLC and Silverjuke. These are third-party integrations, not applications maintained or supported by the projectM development team. Report integration problems to the relevant application developers.

Presets and textures

MilkDrop-style presets are the creative heart of projectM. A preset describes a visualization through equations, parameters and shaders. Many presets also depend on image textures. The core library does not include a complete preset collection; presets and textures are distributed separately.

  • Cream of the Crop β€” a curated collection of approximately 9,795 MilkDrop presets assembled by Jason Fletcher. It became the default preset pack for projectM releases beginning in 2022.
  • MilkDrop texture pack β€” the original MilkDrop textures plus additional images used by many presets. The texture pack is recommended alongside preset collections.
  • Classic projectM presets β€” the classic collection distributed with older projectM releases.
  • Original MilkDrop presets β€” the original preset collection distributed with the final official MilkDrop release.
  • En D presets β€” a smaller collection of presets.

Forks, ports and compatible projects

The main projectM repository has hundreds of GitHub forks, but most are ordinary copies or development branches; a fork count should not be mistaken for hundreds of separate visualizers. A few downstream projects add identifiable functionality:

  • Project-M by ford442 β€” a fork of the official C++ projectM library that adds a browser/WebAssembly host and related web functionality. It is an independent extension of the engine, not the official desktop frontend.
  • foo_vis_projectM β€” a downstream foobar2000 implementation using a modified projectM source tree, including support for reading preset resources from ZIP archives.
  • projectm-frontend-sdl-py β€” a Python/SDL2 frontend that wraps projectM and routes captured audio to the engine.

Lactea belongs in the wider MilkDrop-compatible ecosystem, but it is not a projectM fork or a frontend using libprojectM. It is an independent Rust implementation supporting MilkDrop 2/3 and projectM-compatible presets, with its own standalone application, library, Kodi add-on and web demo.

Other distributions

projectM Music Visualizer on Steam provides an end-user distribution of the visualizer. The official project documentation currently identifies the modern desktop version as a development preview. The Android projectM app is maintained by an independent app author; the projectM developers explicitly state that they do not develop or support the Android apps.

Project links

Official website
Official GitHub organization
Core library
Developer wiki
Core library releases

Project status and links checked November 2026. projectM is an evolving ecosystem: the core library, frontends and third-party integrations have separate release schedules, licenses and support arrangements.

foo_dj ~ Foobar2000 Does Disc Jockey


Two independent DJ-style decks inside foobar2000, with a mixer and waveforms.

github.com/thomasandro/foobar-dj-decks
hydrogenaudio.org/index.php/topic,130167.0

foo_gatefold ~ Foobar2000 Reimagined


A modern foobar2000 interface built around your album art that takes its colours from whatever is playing, with foobar2000’s sound and speed underneath. One installer, and it opens straight in Gatefold.

github.com/DEVIROYrus/gatefold-foobar2000
www.reddit.com/r/foobar2000/comments/1xbmm3a/i_made_gatefold_a_fullwindow_foobar2000_theme

drift ~ Terminal YouTube Player


A YouTube Music player for your terminal, with Vim keybinds. Search, queue and play music with no account, no login and no browser.

Search, queue and play music with no account, no login and no browser.

drift user interface

github.com/socatlolmeow/drift

MyGo Music ~ Extensible FOSS Player


A native desktop music player written in Go with MyGo, no WebView. It plays your local files out of the box, and everything else comes from plugins.

Features:

  • Local files (MP3, FLAC, Ogg Vorbis, WAV, and ALAC, FLAC or AAC in .m4a and .aac) with tags, covers and .lrc lyrics
  • Playlists, liked songs, search, albums and artists
  • Now Playing with lyric stage styles, cover wall, queue, shuffle and repeat
  • Notch player on macOS, tray, media keys
  • Audio cache, fades on pause and seek, loudness normalization
  • Session restore
  • Podcast captions, written down on the device as episodes play
  • English and Simplified Chinese
  • Plugins can add accounts, catalogs, podcasts, stations, comments and pages of their own

music.egoist.dev
github.com/egoist/mygo-music

AudioAuditor ~ Audit Your Audio


A powerful, open-source toolkit for audio analysis and playback. Verify lossless quality, detect AI-generated tracks, and explore your library with a built-in hi-res player and advanced EQ.

audioauditor.org
github.com/Angel2mp3/AudioAuditor

earshot ~ Ears For Coding Agents


Let AI hear, review and make sound. CPU-only, open source.

github.com/Leonxlnx/earshot

MASS ~ Music & Audio In Sample Sequences


MASS (Music and Audio in Sample Sequences) is a mathematical and computational framework relating musical elements to LPCM audio samples.

The scripts synthesizes sonic excerpts or whole musical pieces. The computational routines are derived from the mathematical relations in the documentation.

github.com/ttm/mass

rox ~ Crossplatform Efficent Modular Player


rox is a desktop music player for people with large, carefully tagged local libraries. The UI is panels you compose yourself, duplicate with independent configs, and pop out into real OS windows. Themes are token sets a person can share. Tagging is deep enough to trust with a real collection, and the whole thing stays fast at tens of thousands of tracks. Rust, built on gpui, with Linux, Mac, and Windows all first-class. If it doesn’t start in under a second, it isn’t rox.

rox user interface

rox.music
github.com/zealsprince/rox

CHIMERA ~ Physical-Modeling Vocal Synthesizer


A physical-modeling voice synthesizer in the browser. Every sound comes from a simulated airway (lungs, vocal folds or syrinx, a branched vocal tract, lips, nose), not from samples. The engine is Rust, compiled to WebAssembly for an AudioWorklet; the same code runs natively for tests and the chimera CLI.

What it does:

  • Play: drag the tongue, lips and jaw in a live cutaway of the head; vowel pad, encoders, computer keyboard and Web MIDI.
  • Speak: English text (CMUdict with a letter-to-sound fallback) or IPA, turned into gestures and prosody, with the gestural score and a consonant chart on screen.
  • Sing: piano roll with lyrics per note; consonants land before the beat.
  • Beatbox: pads and a step sequencer, every drum an articulatory gesture.
  • Bestiary: songbird (two-voice syrinx), seal, alligator and elephant.
  • Duet (?show=<id>): two 3D heads replay a pre-rendered song.

Male, female and child bodies blend continuously. Everything on screen animates from live engine state: pressure in the airway, airflow, the vocal folds, spectra and formants.

chimera-vocal-synth.vercel.app
github.com/jamesondh/chimera-vocal-synth

foo_utag ~ Tag Streams With Metadata


utag Input is a foobar2000 input component that lets you add internet radio streams and other remote URLs to the Media Library by representing each stream with a small .utag JSON file. The .utag file stores the stream URL and metadata. foobar2000 can scan and tag the stub like a normal track, while audio is decoded from the original URL.

Features:

Optional favicon download during playback: downloads the favicon image stored in the .utag JSON, saved beside the .utag file and shown as artwork.

Library-friendly scanning: scanning a .utag file does not connect to the stream.

Editable metadata: tag changes are written back to the .utag JSON file.

Stream URL in Properties: the URL is exposed in the information section as @ and can be displayed with %__@%.

Create files from a playlist: use Tagging β†’ Create utag files… in the playlist context menu to create one .utag file for each selected track. Each URL is looked up in Radio Browser first (optional, on by default), so the file gets the station’s details. The new file(s) are added to the “New utags” playlist, which becomes the active playlist.

Tag existing .utag files from Radio Browser: Tagging β†’ Search Radio Browser and tag looks up the @ URL of the selected .utag items in Radio Browser and writes the station details into their tags.

Default folder: Tagging β†’ Set default utag folder… saves an output folder, and Tagging β†’ Create utag files in default folder creates the files there without asking.

Add a station by URL: File β†’ Utag Input β†’ Add internet radio url and create utag asks for a stream URL (and an optional name) and creates the .utag file in the default folder. If no name is entered, it is looked up from the stream. An optional checkbox searches Radio Browser for the URL and uses its station details. The new file is added to the “New utags” playlist, which becomes the active playlist.

Import from Radio Browser: File β†’ Utag Input β†’ Import stations from Radio Browser… downloads stations from the Radio Browser directory and creates one .utag file per station, in a new folder named after the search.

Browse Radio Browser: File β†’ Utag Input β†’ Browse Radio Browser… lists the top stations, or the stations for a tag, country, language or codec you pick, or a name search. Choose the stations you want and import them.

Import from Icecast: File β†’ Utag Input β†’ Import stations from Icecast… lets you filter the directory by station metadata and choose a maximum number of matching stations to import.

Browse Icecast Directory: File β†’ Utag Input β†’ Browse Icecast Directory… downloads the public Icecast Yellow Pages XML export (once per session; Refresh reloads it) and creates .utag files for the stations you select. A search box at the top of the window filters the list as you type (station name, genre, codec, description or current song). The downloaded directory is not saved by the component.

Import from TuneIn: File β†’ Utag Input β†’ Import stations from TuneIn… searches TuneIn by station name, artist or song and creates one .utag file per station found.

Browse TuneIn: File β†’ Utag Input β†’ Browse TuneIn… walks TuneIn’s categories, genres, locations and languages, your presets, searches and recommendations (for a list of artists, or for the playing station). Choose the stations you want and import them.

Playlists for the browse windows: the three browse windows (Radio Browser, TuneIn, Icecast) append the stations you import to one playlist per service, RadioBrowser, Tunein and Icecast by default (names are set in the preferences). The playlist is created when missing and becomes the active one, and the first appended item gets the focus. The Import stations from… commands instead create a new playlist named like the search folder (search term and date).

Country flag: whenever a .utag is created or tagged and it has a countrycode field (for example GR), a countryflag field with the matching flag emoji (for example πŸ‡¬πŸ‡·) is added. The flag is also refreshed whenever the tags are saved (for example after editing countrycode in Properties), so it always follows the code; an invalid or empty code leaves the flag as it is. When a file is created, an existing non-empty countryflag is kept. This applies to Radio Browser and Icecast imports, TuneIn imports, Add internet radio url and create utag, Create utag files and Search Radio Browser and tag.

Results window: every created or skipped entry lists the stream URL (@) and the output path; errors list the source URL and the reason. The window can be switched off in the preferences (errors are still shown).

Preferences page: Preferences β†’ Tools β†’ Utag Input has the stream handoff, favicon download, default folder, console message, results window, Radio Browser lookup, TuneIn details and browse-window playlist options.

Optional stream handoff: reuses the running decoder when the playing item is reopened after retagging, helping avoid a reconnect and audible pause.

Station logos: assign a logo by hand (Tagging β†’ Set station logo…), by dropping an image file or image URL on the logo window, or with the optional favicon download. All of them are the same sidecar image beside the .utag file, shown as artwork. See Station logos.

github.com/smoralis/foo_utag
hydrogenaudio.org/index.php/topic,130078.0

foo_tftags ~ Reusable Title Formatting Fields


A foobar2000 component that publishes long titleformat scripts as global tag fields. Write a script once (for example your whole BIO_ALBUMARTIST or BIO_ARTIST code) and use %tf_albumartist% everywhere that evaluates title formatting: playlist views, CPV, PSS/ELP, JS3 scripts, ESlyrics, Last.fm scribbler, and so on.

github.com/smoralis/foo_tftags

BitChord ~ Bit-perfect Streaming Player


A modern YouTube music client with clean aesthetics inspired from Apple Music.

bitchord.kushagrasingh.in
github.com/kushagrasinghx/BitChord