EDIROL UA-1000 driver module

NiLace <[email protected]> Thu, 18 Jun 2026 00:52:13 +0200
Newsgroups org.alsa-project.alsa-devel
Message-ID <[email protected]>
Hello,

   First message and although I've searching for this I don't believe
this topic has been proposed. I'm writing to ask for a (I believe)
small modification on snd-ua101.

The driver handles audio on the EDIROL UA-1000 perfectly (which is
amazing, thank you), but MIDI control of the device doesn't work at
all, and I think I've found why: the UA-1000 wants its control messages
on USB-MIDI cable 1, while the driver hardcodes cable 0.

Here's what I found:

The UA-1000 (USB 0582:0044) is a 10x10 USB 2.0 interface from 2003.
Besides audio it has a built-in digital mixer, a patch bay/router and
direct monitoring, all driven by Roland SysEx (DT1) messages over its
USB-MIDI interface — on Windows that's what the "UA-1000 Control Panel"
talks to. None of it is reachable from Linux today.

The device has 4 USB interfaces:
 - Interface 0: Control/mixer descriptors (no endpoints)
 - Interface 1: Audio capture (isochronous, EP 1 IN)
 - Interface 2: Audio playback (isochronous, EP 2 OUT)
 - Interface 3: MIDI control (bulk, EP 4 OUT + EP 3 IN)


The driver defines a fixed MIDI endpoint configuration:

   static const struct snd_usb_midi_endpoint_info midi_ep = {
       .out_cables = 0x0001,
       .in_cables  = 0x0001
   };

This configures MIDI on cable 0 (bit 0 set). However, the UA-1000
requires cable 1. I discovered this by capturing USB traffic from the
Windows XP driver using Wireshark/USBPcap while operating the official
EDIROL UA-1000 Control Panel software in a VirtualBox VM with USB
passthrough.

All SysEx messages captured from the Windows driver use USB-MIDI cable
1.
The cable number is encoded in the high nibble of each 4-byte USB-MIDI
packet's first byte (Code Index Number byte).

Here's an example, a captured Monitor Output Link On command:

   Raw USB-MIDI data (hex):
   14 f0 41 10  14 00 69 12  14 00 03 00  14 01 01 7b  15 f7 00 00

   Decoded packet-by-packet:

   Byte  Meaning
   ----  -------
   14    Cable 1 (high nibble = 0x1) | CIN 0x4 (SysEx start/continue)
   f0    SysEx start
   41    Roland manufacturer ID
   10    Device ID (default 0x10)

   14    Cable 1 | CIN 0x4
   00    Model ID byte 1
   69    Model ID byte 2 (0x00 0x69 = UA-1000)
   12    Command: DT1 (Data Set 1 = write)

   14    Cable 1 | CIN 0x4
   00    Address byte 1
   03    Address byte 2 (Monitor Output section)
   00    Address byte 3 (Left channel)

   14    Cable 1 | CIN 0x4
   01    Address byte 4 (Link parameter)
   01    Data (0x01 = on)
   7b    Roland checksum

   15    Cable 1 (high nibble = 0x1) | CIN 0x5 (SysEx ends with 1 byte)
   f7    SysEx end
   00    Padding
   00    Padding
   
If the device used cable 0, the high nibble of each packet would be
0x0_. All 18 capture files I have collected (input channel gain, pan,
solo, link, on/off, monitor output gain, monitor link, direct monitor
toggle, software control, and output volume mode) consistently show
cable 1.

I verified the fix by binary-patching the compiled snd-ua101.ko module.
At the offset where the midi_ep struct is stored, I changed:

   out_cables: 0x0001 -> 0x0002  (cable 0 -> cable 1)
   in_cables:  0x0001 -> 0x0002  (cable 0 -> cable 1)

   Before: 00 00 00 00 01 00 01 00
   After:  00 00 00 00 02 00 02 00

After loading the patched module, all SysEx commands are accepted by
the device. I have built a command-line control tool (ua1000ctl) that
successfully controls the UA-1000's mixer parameters via ALSA rawmidi,
including:

 - Monitor output volume (left, right, linked) — confirmed working
 - Monitor link on/off — confirmed working
 - Direct monitor on/off — confirmed working
 - Input channel on/off, solo, link, pan, and gain — addresses
identified

Audio capture and playback continue to work correctly with the patched
module and the MIDI port remains functional at hw:X,0,0 (subdevice 0).

I have 18 USB capture files covering all major SysEx command categories
and would be happy to share them if valuable.

To be transparent, I have relied heavily on Claude Code to help me in
several tasks I don't have the proper knowledge to do (and probably
would have not been able to implement). I have personally verified each
finding against the device but would like to be honest about it. I used
it for instance to analyze the USB captures, to inspect the device and
to modify a copy of the kernel module. 

If it is still a possibility to ask for an update (or patch) of the
module, it would be amazing though.

Thank you.