A cross-platform audio plugin client for NINJAM β the open-source, internet-based real-time collaboration software for musicians.
π Website: jamwide.audio
NINJAM (Novel Intervallic Network Jamming Architecture for Music) allows musicians to jam together over the internet in real-time. Unlike traditional approaches that try to minimize latency, NINJAM embraces it by using a time-synchronized approach where everyone plays along with what was recorded in the previous interval. This creates a unique collaborative experience where musicians can perform together regardless of geographic location.
JamWide ports the NINJAM client functionality into a cross-platform CLAP audio plugin, allowing you to:
- Use NINJAM directly in your DAW β Connect to jam sessions without leaving your production environment
- Route audio flexibly β Use your DAW's mixer for monitoring and processing
- Record sessions natively β Capture everything directly in your DAW's timeline
- Apply effects β Process incoming audio from other musicians with your favorite plugins
- Connect to any NINJAM server
- Real-time audio streaming with OGG/Vorbis encoding
- Automatic BPM/BPI synchronization with the server
- BPM/BPI voting via chat commands
- Local and remote channel management
- Chat room with message history and timestamps
- Stereo input/output
- Master and metronome volume/pan/mute controls
- Per-channel volume, pan, mute, and solo
- VU meters for all channels
- Visual timing guide for beat alignment
- Soft clipping on master output
- Dear ImGui interface
- Native rendering (Metal on macOS, D3D11 on Windows)
- Server browser with live user lists
- Real-time status and connection display
- Collapsible panels for all sections
Works with any DAW that supports CLAP, VST3, or Audio Unit plugins:
| Format | Hosts |
|---|---|
| CLAP | Bitwig Studio, REAPER, MultitrackStudio |
| VST3 | Ableton Live, Cubase, FL Studio, REAPER, Studio One |
| AU v2 | Logic Pro, GarageBand, MainStage (macOS only) |
- Windows: Windows 10 or later (64-bit)
- macOS: macOS 10.15 (Catalina) or later
- CMake 3.20 or later
- C++20 compatible compiler
- macOS: Xcode 14+ / Apple Clang 14+ (macOS 10.15+)
- Windows: Visual Studio 2022 / MSVC 19.30+ (Windows 10+)
- Git (for submodule dependencies)
- CLAP β Plugin API
- Dear ImGui β User interface
- libogg β Audio container format
- libvorbis β Audio codec
- picojson β JSON parser
# Clone the repository
git clone --recursive https://github.com/mkschulze/JamWide.git
cd JamWide
# Initialize submodules if not cloned with --recursive
git submodule update --init --recursive# Configure - Dev build with verbose logging
cmake -B build -DCMAKE_BUILD_TYPE=Release -DJAMWIDE_DEV_BUILD=ON
# Configure - Production build with minimal logging
cmake -B build -DCMAKE_BUILD_TYPE=Release -DJAMWIDE_DEV_BUILD=OFF
# Build
cmake --build build --config Release
# Quick install (builds and installs to user plugin folders)
./install.shRequirements:
- Visual Studio 2022 (or newer) with C++ Desktop Development workload
- CMake 3.20+ (included with Visual Studio)
- Git for Windows
# Configure with Visual Studio 2022 (or Visual Studio 18 for VS 2026)
cmake -B build -G "Visual Studio 17 2022" -A x64 -DCLAP_WRAPPER_DOWNLOAD_DEPENDENCIES=TRUE
# Build with MSBuild
$MSBUILD = "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
& $MSBUILD build\jamwide.sln /p:Configuration=Release /v:minimal
# Quick install (builds and installs to user plugin folders)
.\install-win.ps1Note: The -DCLAP_WRAPPER_DOWNLOAD_DEPENDENCIES=TRUE flag automatically downloads VST3 SDK and other dependencies.
./install.sh
# Installs to:
# - ~/Library/Audio/Plug-Ins/CLAP/JamWide.clap
# - ~/Library/Audio/Plug-Ins/VST3/JamWide.vst3
# - ~/Library/Audio/Plug-Ins/Components/JamWide.component.\install-win.ps1
# Installs to:
# - %LOCALAPPDATA%\Programs\Common\CLAP\JamWide.clap
# - %LOCALAPPDATA%\Programs\Common\VST3\JamWide.vst3build/JamWide.clapβ CLAP pluginbuild/JamWide.vst3β VST3 pluginbuild/JamWide.componentβ Audio Unit v2
build/CLAP/Release/JamWide.clapβ CLAP pluginbuild/Release/JamWide.vst3β VST3 plugin
Copy JamWide.clap to:
~/Library/Audio/Plug-Ins/CLAP/(user)
Copy JamWide.vst3 to:
~/Library/Audio/Plug-Ins/VST3/(user)
Copy JamWide.component to:
~/Library/Audio/Plug-Ins/Components/(user)
Copy JamWide.clap to:
%LOCALAPPDATA%\Programs\Common\CLAP\(user)
Copy JamWide.vst3 to:
%LOCALAPPDATA%\Programs\Common\VST3\(user)
- Load the JamWide plugin on a track in your DAW
- Open the plugin GUI
- Enter a server address (e.g.,
ninbot.com:2049) or select from the list - Enter your username and optional password
- Click Connect
- Route audio to the plugin's input for your local channel
- The plugin output contains the mixed audio from all participants
| Parameter | Range | Description |
|---|---|---|
| Master Volume | 0.0 β 1.0 | Overall output level |
| Metronome Volume | 0.0 β 1.0 | Click track level |
| Metronome Pan | -1.0 β 1.0 | Click track stereo position |
| Monitor Input | On/Off | Hear your own input |
| Connected | On/Off | Connection state |
β Stable Release β Tested on macOS and Windows in Ableton Live, REAPER, Bitwig Studio, Logic Pro, and GarageBand
- Core NJClient port (audio engine, networking)
- CLAP, VST3, and Audio Unit v2 plugin formats
- Platform GUI (macOS Metal, Windows D3D11)
- Full UI: status, connection, chat, local/remote channels, master controls
- Server browser with live user lists (autosong.ninjam.com)
- VU meters and visual timing guide
- BPM/BPI voting via chat
- Anonymous login support
- Thread-safe command queue architecture
- GitHub Actions CI/CD for Windows and macOS
- Linux support (X11/Wayland + OpenGL)
- UI styling and graphics improvements
- Per-channel receive toggle
JamWide/
βββ src/
β βββ core/ # NJClient port (networking, audio decode/encode)
β βββ plugin/ # CLAP entry point and wrapper
β βββ platform/ # OS-specific GUI (Metal/D3D11 + ImGui)
β βββ threading/ # Run thread, command queue, SPSC ring
β βββ net/ # Server list fetcher
β βββ ui/ # ImGui UI panels
β βββ debug/ # Logging utilities
βββ wdl/ # WDL libraries (jnetlib, sha, etc.)
βββ libs/ # Third-party submodules
βββ CMakeLists.txt
The plugin uses a command queue architecture for thread safety:
- UI Thread - Renders ImGui, sends commands to run thread
- Run Thread - Processes NJClient, handles network I/O
- Audio Thread - Calls AudioProc() for sample processing
Communication is lock-free via SPSC ring buffers.
Contributions are welcome! Please feel free to submit issues and pull requests.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature)
To avoid Dear ImGui ID collisions, run the local checker:
python3 tools/check_imgui_ids.pyIt flags unscoped widget labels that are not wrapped in ImGui::PushID(...).
5. Open a Pull Request
This project is licensed under the GNU General Public License v2.0 β see the LICENSE file for details.
NINJAM and the original client code are Copyright Β© Cockos Incorporated.
- Cockos for creating NINJAM and making it open source
- WDL library by Cockos
- The CLAP team for the excellent plugin API
- Omar Cornut for Dear ImGui
- NINJAM Official Site
- NINJAM Server List
- CLAP Audio Plugin Standard
- ReaNINJAM β Original REAPER extension
Made with βͺ for musicians who want to jam together, anywhere in the world.