Documentation
Everything you need to know about using and building JamWide.
Quick Start
- Install the plugin — Download from the releases page and copy to your plugin folder
- Load in your DAW — Add JamWide to a track
- Connect to a server — Enter a server address or pick from the browser
- Start jamming! — Route audio to the plugin and play
User Guide
Connecting to a Server
- Open the JamWide plugin GUI
- In the connection panel, enter:
- Server: Address and port (e.g.,
ninbot.com:2049) - Username: Your display name
- Password: Leave empty for public servers
- Server: Address and port (e.g.,
- Click Connect
Tip: Use the built-in server browser to see active public servers with player counts.
Audio Routing
JamWide receives audio from your DAW track and sends it to the NINJAM session:
Your Input → DAW Track → JamWide Plugin → NINJAM Server
↓
Plugin Output → Your Speakers
↑
Other Players' Audio
Best Practice: Create a dedicated track for JamWide and route your instrument to it.
Understanding NINJAM Timing
NINJAM uses intervals instead of real-time audio:
- The server defines a BPM and BPI (beats per interval)
- You hear what others played in the previous interval
- Your audio is recorded and sent to others for the next interval
This means there’s always a one-interval delay, but everyone is perfectly synchronized.
Example: At 120 BPM with 16 BPI, each interval is 8 seconds. You hear what others played 8 seconds ago.
Chat
The built-in chat lets you communicate with other musicians:
- Messages appear in the chat panel with timestamps
- Type a message and press Enter to send
- Chat history is preserved during your session
Metronome
Use the metronome to stay in time:
- Adjust volume with the Metronome Volume control
- Pan left/right with Metronome Pan
- The metronome follows the server’s BPM
Parameters Reference
| Parameter | Range | Default | Description |
|---|---|---|---|
| Master Volume | 0.0 – 1.0 | 0.8 | Overall output level |
| Metronome Volume | 0.0 – 1.0 | 0.5 | Click track level |
| Metronome Pan | -1.0 – 1.0 | 0.0 | Click track stereo position |
| Monitor Input | On/Off | Off | Hear your own input |
| Connected | On/Off | Off | Connection state |
Building from Source
Requirements
- 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)
Clone the Repository
git clone --recursive https://github.com/mkschulze/JamWide.git
cd JamWide
Build (macOS)
# Configure - Development build (verbose logging)
cmake -B build -DCMAKE_BUILD_TYPE=Release -DJAMWIDE_DEV_BUILD=ON
# Or Production build (minimal logging)
cmake -B build -DCMAKE_BUILD_TYPE=Release -DJAMWIDE_DEV_BUILD=OFF
# Build
cmake --build build --config Release
Build (Windows)
Requirements:
- Windows 10 or later (64-bit)
- Visual Studio 2022 (or newer) with C++ Desktop Development workload
- CMake 3.20+ (included with Visual Studio)
- Git for Windows
# Configure with automatic dependency downloads
cmake -B build -G "Visual Studio 17 2022" -A x64 -DCLAP_WRAPPER_DOWNLOAD_DEPENDENCIES=TRUE
# Build with MSBuild (recommended)
$MSBUILD = "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
& $MSBUILD build\jamwide.sln /p:Configuration=Release /v:minimal
# Or build with CMake (alternative)
cmake --build build --config Release
Note: The first configuration downloads VST3 SDK and other dependencies automatically. For Visual Studio 2026 or other versions, adjust the generator name (e.g., "Visual Studio 18").
Quick Install
macOS
./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
Windows
.\install-win.ps1
Installs to:
%LOCALAPPDATA%\Programs\Common\CLAP\JamWide.clap%LOCALAPPDATA%\Programs\Common\VST3\JamWide.vst3
Build Output
macOS
build/JamWide.clap— CLAP pluginbuild/JamWide.vst3— VST3 pluginbuild/JamWide.component— Audio Unit v2
Windows
build/CLAP/Release/JamWide.clap— CLAP pluginbuild/Release/JamWide.vst3— VST3 plugin
Architecture
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
Threading Model
JamWide uses a command queue architecture for thread safety:
| Thread | Responsibility |
|---|---|
| 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 between threads is lock-free via SPSC ring buffers.
Troubleshooting
Plugin doesn’t appear in DAW
- Verify the plugin is in the correct folder
- Check that your DAW supports the format (CLAP/VST3/AU)
- Rescan plugins in your DAW
- On macOS, you may need to allow the plugin in System Preferences → Security
Can’t connect to server
- Check your internet connection
- Verify the server address and port
- Try a different server from the browser
- Check if a firewall is blocking the connection
Audio issues
- Ensure your DAW’s sample rate matches a common rate (44.1k, 48k)
- Check that audio is routed to the JamWide track
- Verify Master Volume is not at zero
- Check Monitor Input setting
Contributing
We welcome contributions! See the GitHub repository for:
- Issue reporting
- Pull request guidelines
- Development setup