ProjectM is a C++ application that uses CMake as its build system and SDL2 for graphics. This project is intended to be built and run on macOS with a modern C++ toolchain.
- Xcode Command Line Tools
- Install with:
xcode-select --install
- Install with:
- Homebrew
- Install from: https://brew.sh/
- CMake, SDL2, and libprojectM
- Install with:
brew install cmake sdl2 projectm
- Install with:
To capture system audio on macOS you need a virtual loopback device so the operating system can route the output stream into our capture pipeline. Popular options include BlackHole (free, open source) or Loopback Audio (commercial). Install one of these solutions and set it as the default system output device, then configure the Mac to route sound to both the loopback device and your speakers/headphones (e.g., by creating an aggregate/multi-output device in Audio MIDI Setup).
- Clone this repository and open a terminal in the project root.
- Create a build directory:
mkdir build && cd build
- Run CMake to configure the project:
cmake ..
- Build the project:
cmake --build .
After building, run the executable from the build directory:
cd build
./ProjectMThe application opens a 1280x720 resizable window with real-time music visualizations.
- SPACE - Next preset
- P - Previous preset
- R - Random preset
- L - Lock/unlock preset
- F - Toggle fullscreen
- M - Toggle preset name display
- H - Toggle help overlay (shows controls on-screen)
- ESC / Q - Quit
- 4,199 MilkDrop Presets - Full library of classic visualization presets
- libprojectM 4.1.4 - Latest version with vastly improved Milkdrop compatibility and performance
- On-Screen Display (OSD) - Help overlay showing controls, preset names, and status messages
- Real-time Audio Capture - Captures system audio via BlackHole virtual audio device
- Automatic Preset Transitions - Smooth crossfading between presets every 20 seconds
- OpenGL 3.3 Rendering - Hardware-accelerated graphics with 60 FPS target
- Preset Controls - Navigate, lock, or randomize presets during playback
- Fullscreen Mode - Seamless fullscreen for presentations and recordings
- Apple Silicon (M1) Optimized - Native support for Mac Mini M1
To create music videos:
- Use a screen recorder (QuickTime, OBS, etc.) to capture the ProjectM window
- Play your music through the Multi-Output device (BlackHole + your audio interface)
- Switch between visualization modes (1-4 keys) during recording for variety
- The beat detection and particles will automatically react to the music
To create a standalone .app bundle that can be copied to /Applications:
cd packaging
./create_dmg.shThis script:
- Creates a self-contained
ProjectM.appbundle - Bundles all required libraries (SDL2, FreeType, projectM)
- Fixes library paths so the app works anywhere
- Creates a DMG installer for easy distribution
The resulting app can be:
- Copied to
/Applicationsand run directly - Distributed to other Macs without requiring Homebrew
- Run from any location
App won't launch from Applications:
- The app needs its dependencies bundled. Run
packaging/create_dmg.shto create a proper bundle. - See
docs/app-bundle-fix.mdfor technical details.
No audio data appears:
- BlackHole is installed and detected (check console output)
- Your Multi-Output device includes BlackHole
- The Multi-Output device is set as the default macOS output
- ProjectM has microphone permission (macOS treats loopback capture as input access)
- Music is playing through the Multi-Output device
src/— C++ source filesinclude/— C++ header filesbuild/— Build output (not tracked in git)tests/— Unit and integration testsdocs/— Documentation
Upgraded on: October 10, 2025
This project now uses libprojectM 4.1.4 (released January 2025) with major improvements:
- ✨ Complete expression parser rewrite (much faster execution)
- 🎨 Vastly improved Milkdrop compatibility
- 🎵 Better audio processing matching Milkdrop exactly
- 🌊 Support for new waveform modes (BeatDrop, Milkdrop2077)
- 🔒 ABI stability - future 4.x updates can be dropped in without recompiling
What changed:
- Migrated from C++ API (3.x) to C API (4.x)
- Added playlist library support
- Improved audio device detection (BlackHole + Multi-Output)
- Backup of 3.x version saved in
src/main_3x_backup.cpp
[Specify your license here]