Linux support for DspMixFX?

Can you please add Linux support for DspMixFX?
I am using UR22C for guitar practice and as interface for ST-M10 mic. I am dualbooting Windows 10 and Gentoo Linux. It is frustrating to constantly reboot back to windows to play some guitar or fixing compression on microphone because I forgot to turn off something.

P.S. Sorry for bad Endlish

1 Like

I own UR44C and have spent some time by reverse engineering dspMixFx and its protocol.

I found that in Linux (as well as in Windows before installing Steinberg driver), sound card provides two midi input/output ports.
First ones connected to physical MIDI interfaces, but secondary connected to internal Yamaha mixer with DSP to control it.
After installing Steinberg driver the second midi ports became hidden, and only dspMixFx access to it (or access directly to usb endpoint).

I didn’t reversed all messages, moreover I didn’t chacked on new firmware 3.0, but on 2.x firmware I recognized the next.

It uses SYSEX messages with Yamaha vendor ID. I found 3 most important messages for update parameter, query parameter and receive parameter value.
Probably full midi implementation chart could be requested from Yamaha, of found in owner’s manual for some similar products like mixers, etc. At least earlier Yamaha published very detail information for their SYSEX parameters and codes.

3 Likes
  1. Change parameter:

F043103E14010100pppp0000ccvvvvvvvvvvF7

where
pppp - parameter number
cc - channel (for input 1-6 value was 0-5, for others 0)
vvvvvvvvvv - value, packed as signed 32bit integer

some parameter numbers:

[0] = "input-stereo",         -- ch1:grp1-2, ch3:grp3-4, ch5:grp5-6   0:off,1:on  def:0
[2] = "input-invert-phase",   -- 0:off,1:on  def:0
[3] = "input-lowpass-filter", -- 0:off,1:on  def:0
[4] = "input-hpf-settings",   -- 0:40Hz, 1:60Hz, 2:80Hz, 3:100Hz, 4:120Hz  def:2
[7] = "input-solo-mix1",      -- 0:unsolo,1:solo  def:0
[8] = "input-solo-mix2",      -- 0:unsolo,1:solo  def:0
[9] = "input-mute-mix1",      -- 0:mute,1:unmute  def:1
[10] = "input-mute-mix2",     -- 0:mute,1:unmute  def:1
[12] = "input-volume-mix1",   -- 0-127: 0:-∞,1:-74dB,2:-72dB,...,103:0dB, 127:+6dB    def:103
[13] = "input-volume-mix2",   -- 0-127: 0:-∞,1:-74dB,2:-72dB,...,103:0dB, 127:+6dB    def:103
[14] = "input-send",          -- 0-127: 0:-∞,1:-74dB,2:-72dB,...,103:0dB, 127:+6dB  def:0
[15] = "input-pan-mix1",      -- -16..+16: L16..C..R16  def:0
[16] = "input-pan-mix2",      -- -16..+16: L16..C..R16  def:0
[17] = "daw-solo-mix1",   -- ch1;  0:unsolo,1:solo  def:0
[18] = "daw-solo-mix2",   -- ch1;  0:unsolo,1:solo  def:0
[19] = "daw-mute-mix1",   -- ch1;  0:mute,1:unmute  def:1
[20] = "daw-mute-mix2",   -- ch1;  0:mute,1:unmute  def:1
[21] = "daw-volume-mix1", -- ch1;  0-127: 0:-∞,1:-74dB,2:-72dB,...,103:0dB, 127:+6dB    def:103
[22] = "daw-volume-mix2", -- ch1;  0-127: 0:-∞,1:-74dB,2:-72dB,...,103:0dB, 127:+6dB    def:103
[23] = "daw-pan-mix1",    -- ch1;  -16..+16: L16..C..R16  def:0
[24] = "daw-pan-mix2",    -- ch1;  -16..+16: L16..C..R16  def:0
[28] = "master-unmute-mix1",     -- ch1;  0:mute,1:unmute  def:1
[29] = "master-unmute-mix2",     -- ch1;  0:mute,1:unmute  def:1
[32] = "master-pan-mix1",        -- ch1;  -16..+16: L16..C..R16  def:0
[33] = "master-pan-mix2",        -- ch1;  -16..+16: L16..C..R16  def:0
[34] = "headphones2-select-mix", -- ch1;  0:mix1,1:mix2
[37] = "rev-x-select-mix", -- ch1;  0:mix1,1:mix2
[40] = "phantom-power",  --ch1 for input1+2, ch2 for input3+4  0:off, 1:on   Device report only when change on panel
[41] = "line-input-level", --ch3; 0:+4db, 1:-10db    def:1
-- Ch.Strip
-- compressor
[43] = "comp-enable",  -- 0:off,1:on  def:1
[44] = "comp-drive",   -- 100:5,0:0..200:10  def:100
[45] = "comp-attack",  -- 57:0.092ms .. 283:80ms  def:184 4.122ms
[46] = "comp-release", -- 24:9.3ms .. 300:999ms  def:159 92ms
[47] = "comp-ratio",   -- 0:0 .. 30:2.50 .. 75:6.00 .. 119:500, 120:inf  def:30  2.50
[48] = "comp-knee",    -- 0:soft,1:medium,2:hard  def:1
[199] = "side-chain-enable",
[51] = "side-chain-freq",  -- 0:050 .. 21:1.68 .. 60:16.00 def:21 1.68
[52] = "side-chain-gain",  -- 4:20Hz .. 124:20kHz,  def:34 112.0Hz
[53] = "side-chain-q",     -- 0:18dB .. 360:18dB  def:68 -11.2dB
[54] = "morphing",
[55] = "eq-enable",
[56] = "eq-high-freq",    -- 60:500Hz 124:20kHz def:112:10kHz
[57] = "eq-high-gain",    -- 0:-18dB 360:18dB  def: 180:0Db
[58] = "eq-mid-freq",     -- 4:20Hz 124:20khz  def: 72: 1kHz
[59] = "eq-mid-gain",     -- 0:-18dB 360:18dB  def: 180:0Db
[60] = "eq-mid-q",        -- 0:0.50  60:16     def: 12:1
[61] = "eq-low-freq",     -- 4:20Hz  72: 1kHz  def: 32:100Hz
[62] = "eq-low-gain",     -- 0:-18dB 360:18dB  def: 180:0Db
[63] = "eq-output-level", -- 0:-18dB 360:18dB  def: 180:0Db
[100] = "loopback-mode", -- ch1; 0:off, 1:LiveCast, 2:VoiceChat

For example, to change Input1 volume to 0 dB it needs to send SYSEX to midi port2:
F043103E14010100000C0000000000000067F7

  1. Request parameter value from device

F043303E1401040200pppp0000ccF7

  1. Reply parameter value (device responces with this message on sending request parameter message)

F043103E1401040200pppp0000ccvvvvvvvvvvF7

There are few other SYSEX for query meter values, but I didn’t fully recognized it.

If Steinberg provided MIDI port selection in dspMixFx, it would fully worked in Wine, since 2nd midi port available in Wine applications.
But we have what we have.

2 Likes

Whoa! This is amazing. I tried to capture USB traffic between PC and UR22C, but failed due to lack of skills and experience. But this is some new level stuff!

Thank you for the valuable information!
Did you perform the analysis on Linux?
Do you know how to access hidden MIDI after installing drivers on Windows?
I’m a Windows user, so I’d like to know how to access control MIDI ports on Windows.

I ran virtualbox with windows and usb device forwarding, then enabled usbmon kernel module and ran wireshark on linux. For easier parsing usb packets I wrote small lua module for wireshark… It was long way but I finally recognized that I posted above.

I don’t know how to enable second port in Windos, because I more a Linux user.
But if do not install drivers, the sound card will work in Class Compliant mode, and both midi ports will be available (however without ASIO)

By the way I started writing python application for Linux to be dspMixFx alternative. I don’t know how many time it will take, because I don’t have enough experience, but hope I could implement at least basic controls.

Thank you for your response!
I hope Steinberg will release the SysEX MIDI port and specifications (or maybe the protocol for dspMixFx Remote Bridge).
I’m looking forward to your Python program.
Thank you!

Just stumbled upon your awesome work on reverse engineering dspMixFx and its protocol. I do own a UR44C and use it on Linux as well.

How is work on the Python script going so far? If you could share your current progress and the Wireshark Lua script with us (e.g. on GitHub), I would be happy to support you with further reverse engineering and coding.

Thanks again for your amazing work on this. I created a GitHub repository where I started to collect information on reverse engineering the UR44C. It’s still in a very early stage with some errors.

I would be happy if there are some people interested in this topic, so that we could collaborate on creating a dspMixFx alternative for Linux.

1 Like

Currently no GUI, but virtually all parameters are supported from command-line.

2 Likes