MultiRolandDriver is an independent project and is not affiliated with, sponsored by, or endorsed by Roland Corporation.
Open-source CoreMIDI driver plugin for macOS that replaces Roland's broken legacy drivers. Supports 32 Roland/Edirol USB devices as a universal binary (arm64 + x86_64).
This driver provides modern macOS (Apple Silicon) support for a wide range of legacy synthesizers. It was developed to ensure continued interoperability and preservation of hardware instruments that are no longer supported by their original manufacturer.
Technical Implementation: This driver contains no code, binaries, or firmware from Roland Corporation. It is a 100% original implementation written from scratch, based entirely on public USB-MIDI specifications and observation of hardware communication protocols. No kernel extension or DriverKit extension is required — the driver is a standard CoreMIDI plugin. The pre-built installer deploys system-wide and requires an administrator password. Building from source installs per-user with no elevated privileges. A single universal binary covers all 32 supported devices.
Purpose: This is a non-commercial project dedicated to the synthesizer community, ensuring that classic instruments from 2002--2014 remain functional in modern studio environments.
Roland's official macOS drivers consist of a kernel extension (kext) and a CoreMIDI plugin that work together. The kext component is deprecated and no longer loads on modern macOS, which breaks the entire driver. This plugin replaces both components with a single CoreMIDI plugin using IOKit USB access -- no kernel extension or DriverKit extension required.
All devices use USB Vendor ID 0x0582 (Roland).
| Device | USB PID | Ports | Notes |
|---|---|---|---|
| SC-8850 | 0x0003 |
6 | Part A/B/C/D + MIDI Port 1/2 |
| SC‑8820 | 0x0007 |
2 | Part A/B |
| SK‑500 | 0x000B |
2 | Part A/B |
| SC‑D70 | 0x000C |
2 | Composite (Audio+MIDI) — driver claims only MIDI interface |
| XV‑5050 | 0x0012 |
1 | |
| SD‑90 | 0x0016 |
2 | Composite (Audio+MIDI) — driver claims only MIDI interface |
| V‑Synth | 0x001D |
1 | |
| SD‑20 | 0x0027 |
1 | |
| SD‑80 | 0x0029 |
2 | |
| XV‑2020 | 0x002D |
1 | |
| Edirol PCR | 0x0033 |
3 | Advanced Driver mode required |
| Fantom‑X | 0x006D |
1 | |
| G‑70 | 0x0080 |
2 | |
| V‑Synth XT | 0x0084 |
1 | |
| Juno‑G | 0x00A6 |
1 | |
| MC‑808 | 0x00A9 |
1 | |
| SH‑201 | 0x00AD |
1 | |
| SonicCell | 0x00C2 |
1 | |
| V‑Synth GT | 0x00C7 |
1 | |
| Fantom‑G | 0x00DE |
1 | |
| Juno‑Di / Stage / XPS‑10 | 0x00F8 |
1 | |
| VS‑700C | 0x00FC |
1 | |
| GAIA SH‑01 | 0x0111 |
1 | Requires Roland's SH‑01 audio driver in HAL. The SH‑01 has three vendor interfaces: 0+1 (audio, 0xff/0x02) and 2 (MIDI, 0xff/0x03). Roland's driver claims 0+1 first; without it this driver lands on interface 0 (no usable pipes) and the synth firmware freezes. |
| SD-50 | 0x0114 |
1 | Composite (Audio+MIDI) — driver claims only MIDI interface |
| Lucina AX‑09 | 0x011C |
1 | |
| Juno‑Gi | 0x0123 |
1 | |
| Jupiter‑80 | 0x013A |
1 | |
| Jupiter‑50 | 0x0154 |
1 | |
| INTEGRA‑7 | 0x015B |
1 | |
| FA‑06/07/08 | 0x0174 |
2 | |
| JD‑Xi | 0x01A1 |
1 | |
| UM‑ONE | 0x012A |
1 | |
| QUAD‑CAPTURE | 0x012F |
1 | Composite (Audio+MIDI) — driver claims only MIDI interface |
make clean && make
make installBuilds a universal binary (arm64 + x86_64), signs with your Apple Development certificate, and installs the plugin to ~/Library/Audio/MIDI Drivers/ — no administrator password required. MIDIServer is restarted automatically.
Download MultiRolandDriver-vX.Y.Z.pkg from Releases and double-click to install.
The installer deploys the plugin to /Library/Audio/MIDI Drivers/ (system-wide) and requires an administrator password. MIDIServer is restarted automatically — no reboot required. If a previous version was installed per-user (~/Library/Audio/MIDI Drivers/), it is removed automatically.
The pre-built package is signed with a certificate and accepted by macOS for safe installations.
- macOS 12 Monterey or later
- No kernel extensions required
- No third-party dependencies (Apple frameworks only)
MultiRolandDriver.plugin (CFPlugIn, MIDIDriverInterface v1 + v2)
|
+-- MultiRolandDriver.cpp CFPlugIn factory + MIDIDriverInterface vtable
| QueryInterface supports kMIDIDriverInterface2ID (v2)
| and kMIDIDriverInterfaceID (v1) fallback.
| In v2 mode: Start receives the persistent MIDIDevice
| list directly; FindDevices is a no-op.
| Start/Stop/Send + USB hotplug (IOServiceAddMatchingNotification)
|
+-- RolandUSBDevice.cpp/h Per-device USB I/O (IOKit user-space)
| Open/Close/StartIO/StopIO/SendMIDI
| Async bulk IN read + ReadCallback
|
+-- USBMIDIParser.cpp/h USB-MIDI 1.0 packet handling
CIN-based parse (BulkIn) and build (BulkOut)
Cable number in high nibble = port routing
On startup, the plugin matches live USB devices (by locationID) against the persistent MIDIDevice list maintained by MIDIServer. Orphan entries from previous sessions are removed automatically.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.