Topic: oscmix: mixer/control software for UCX II

Over the past few months, I've been working on software to control my UCX II in CC-mode from Linux, and while there is still lots left to do, I think I'm at a point where it might be useful for others.

https://github.com/michaelforney/oscmix

See the README for more details. The main component is the oscmix program, which communicates using SysEx messages through the UCX II's MIDI Port 2 (same as the iPad app), and provides an OSC API exposing the full functionality of the device. Note that this has no relation to the OSC API provided by TotalMix FX. It works on Linux and BSDs, as well as any other POSIX OS as long as you can supply it with file descriptors for reading and writing to the MIDI port.

I didn't originally set out to make a UI, but I started mocking up one in GTK, and it's gotten to the point where it's fairly usable, but is still missing some functionality.

I also experimented with a web UI (though I'm no web developer). It can connect to oscmix through a WebSocket-to-UDP bridge (provided). I had the crazy idea of compiling oscmix to WebAssembly and hooking it up to WebMIDI, which turned out to be fairly straightforward. So you can also connect directly to your device from the browser without installing any software locally. This should technically work on any operating system with a browser that supports these two APIs. It seems to work on Android and macOS (in CC-mode).

I've set it up so builds are automatically deployed at https://michaelforney.github.io/oscmix/, so feel free to check it out! One important note is that the maximum length of MIDI port names on Linux is 31 characters, and combining the card name "Fireface UCX II (XXXXXXXX)" with the port name "Port 2" exceeds that limit. So you'll see two input ports and two output ports with the exact same name. You need to select the second port.

If you're interested in the technical side, I've documented the SysEx protocol as I understand it at doc/protocol.md, as well as the technique I used to capture packets with a Raspberry Pi in between an iPad and the UCX II. There is also a wireshark dissector in the tools directory. Thanks RME for help with a few bits I couldn't figure out myself.

Only the UCX II is supported, since that's the only device I have. I'm not sure how similar the protocol for other devices is, but maybe there is potential for adding other devices. I'm happy to help out anyone interested in this.

You can report any issues you encounter to the issue tracker, but please keep in mind that this is just a hobby project I'm working on for fun in my free time.

https://mforney.org/misc/oscmix-web.png

Re: oscmix: mixer/control software for UCX II

Looks cool, many thanks for your efforts!

BR Ramses - UFX III, 12Mic, XTC, ADI-2 Pro FS R BE, RayDAT, X10SRi-F, E5-1680v4, Win10Pro22H2, Cub14

3 (edited by sjzstudio 2024-02-15 22:20:24)

Re: oscmix: mixer/control software for UCX II

If RME could take a look at this and even help to make this work for e.g. all Firewire series devices.
As a UFX+ and 802 owner I would be really happy about this

Is It possible to make eg appimage to use this easily?

Re: oscmix: mixer/control software for UCX II

sjzstudio wrote:

If RME could take a look at this and even help to make this work for e.g. all Firewire series devices.
As a UFX+ and 802 owner I would be really happy about this

Is It possible to make eg appimage to use this easily?

Do you know ffado.org?

UCX - FF 400 - Babyface pro - Digiface USB - ADI-2 (original)
Mac mini M1 - Macbook pro - iPad Air2

Re: oscmix: mixer/control software for UCX II

Firewire project. But how is it related to usb devices? I use both via usb.

Re: oscmix: mixer/control software for UCX II

sjzstudio wrote:

Firewire project. But how is it related to usb devices? I use both via usb.

Your question was:
If RME could take a look at this and even help to make this work for e.g. all Firewire series devices.
As a UFX+ and 802 owner I would be really happy about this

So how should one know, you use the USB connection? Both your devices have firewire ports and you even call them Firewire devices.

UCX - FF 400 - Babyface pro - Digiface USB - ADI-2 (original)
Mac mini M1 - Macbook pro - iPad Air2

7 (edited by sjzstudio 2024-02-16 16:34:32)

Re: oscmix: mixer/control software for UCX II

Good point.
Apparently a writing and thought error on my part. I meant the Fireface series.

Re: oscmix: mixer/control software for UCX II

sjzstudio wrote:

As a UFX+ and 802 owner I would be really happy about this

If you want to help add support for other devices, here are some things you could do to get started:

  • Send me the USB descriptors for the device. Put the device in CC mode, then find the device ID in the output of `lsusb`, then run `lsusb -d XXXX:YYYY -v`. It should look something like https://github.com/michaelforney/oscmix … c-desc.txt.

  • Check what USB MIDI ports are available on the device by running `aconnect -l`. Check if any of them are sending data by running `aseqdump -p XX:YY` on each port. My UCX II has two ports, and the second one is used to interact with the device. When I dump from 24:1, the second port, I see alternating SysEx packets "F0 00 20 0D 10 00 00 3C 00 04 03 F7" and "F0 00 20 0D 10 00 00 00 0C 04 03 F7". When decoded, these mean "register 3080 (DSP version and load) set to 1E00 (30, 0%)" and "register 3083 (ARC encoder delta) set to 0000".

  • If you are successful with this, I think there is a good chance in being able to support the device, so please open an issue on GitHub, and I can help you with the next steps: showing register changes (e.g. when turning a volume knob), and dumping all the registers.

Is It possible to make eg appimage to use this easily?

You can go to https://michaelforney.github.io/oscmix/ to try it without installing anything. If you want the GTK UI, it's easy to build yourself. Just install the GTK 3 and ALSA development packages (on Debian, libgtk-3-dev and libasound2-dev), then run `make` in the oscmix source directory.

Re: oscmix: mixer/control software for UCX II

Yes. I Will Do this as soon as possible. With both devices.

10 (edited by maggie33 2024-02-17 07:30:24)

Re: oscmix: mixer/control software for UCX II

Wow! Really good work! Very interesting how you got the direct access via descriptors.
Will have a more detailed look at your github repo, soon. Very interesting!

PS:
Working on a quite similar idea, since some weeks -  but via nodejs - https://openstagecontrol.ammd.net
My idea is, to hook the Fireface via USB to a Win or Mac "host" and use 3 OSC Controllers for in, pb and out busses. And a raspi serves the GUI frontend via web for independant clients/browsers.

Edit: to avoid misunderstandings: openstage has been developed by jean emmanuel. Just have a look in his github repo.

“Do It For Her”
My Gear: Bontempi Magic light Keyboard

11 (edited by sjzstudio 2024-02-17 10:28:38)

Re: oscmix: mixer/control software for UCX II

Send me the USB descriptors for the device. Put the device in CC mode, then find the device ID in the output of `lsusb`, then run `lsusb -d XXXX:YYYY -v`. It should look something like https://github.com/michaelforney/oscmix … c-desc.txt.

Fireface 802:

Bus 001 Device 002: ID 0424:3fdd Microchip Technology, Inc. (formerly SMSC) Fireface 802 (23731709)
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x0424 Microchip Technology, Inc. (formerly SMSC)
  idProduct          0x3fdd
  bcdDevice            0.01
  iManufacturer           1 RME
  iProduct                2 Fireface 802 (23731709)
  iSerial                 3 3987CF5DXXXXXXX
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x01c8
    bNumInterfaces          5
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         5
      bFunctionClass          1 Audio
      bFunctionSubClass       0
      bFunctionProtocol      32
      iFunction               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol     32
      iInterface              0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               2.00
        bCategory               8
        wTotalLength       0x0055
        bmControls           0x00
      AudioControl Interface Descriptor:
        bLength                 8
        bDescriptorType        36
        bDescriptorSubtype     10 (CLOCK_SOURCE)
        bClockID                1
        bmAttributes            3 Internal programmable clock
        bmControls           0x03
          Clock Frequency Control (read/write)
        bAssocTerminal          0
        iClockSource            0
      AudioControl Interface Descriptor:
        bLength                17
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             3
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bCSourceID              1
        bNrChannels             2
        bmChannelConfig    0x00000000
        iChannelNames           0
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                17
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             5
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bCSourceID              1
        bNrChannels            22
        bmChannelConfig    0x00000000
        iChannelNames           0
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             4
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID               2
        bCSourceID              1
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID               5
        bCSourceID              1
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 2
        bSourceID               3
        bmaControls(0)     0x0000000c
          Volume Control (read/write)
        iFeature                0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           3
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels             2
        bmChannelConfig    0x00000000
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0400  1x 1024 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes           17
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Feedback
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       2
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           3
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels            22
        bmChannelConfig    0x00000003
          Front Left (FL)
          Front Right (FR)
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0400  1x 1024 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes           17
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Feedback
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           6
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels            22
        bmChannelConfig    0x00000000
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0400  1x 1024 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       2
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           6
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels            12
        bmChannelConfig    0x00000000
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0400  1x 1024 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      3 MIDI Streaming
      bInterfaceProtocol      0
      iInterface              2
      MIDIStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength       0x0061
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               1 Embedded
        bJackID                 3
        bNrInputPins            1
        baSourceID( 0)          2
        BaSourcePin( 0)         1
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               2 External
        bJackID                 2
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               1 Embedded
        bJackID                 7
        bNrInputPins            1
        baSourceID( 0)          6
        BaSourcePin( 0)         1
        iJack                   5
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               2 External
        bJackID                 6
        iJack                   5
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               1 Embedded
        bJackID                 1
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               2 External
        bJackID                 4
        bNrInputPins            1
        baSourceID( 0)          4
        BaSourcePin( 0)         1
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               1 Embedded
        bJackID                 5
        iJack                   5
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               2 External
        bJackID                 8
        bNrInputPins            1
        baSourceID( 0)          8
        BaSourcePin( 0)         1
        iJack                   5
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x07  EP 7 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
        bRefresh                0
        bSynchAddress           0
        MIDIStreaming Endpoint Descriptor:
          bLength                 6
          bDescriptorType        37
          bDescriptorSubtype      1 (GENERAL)
          bNumEmbMIDIJack         2
          baAssocJackID( 0)       1
          baAssocJackID( 1)       5
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x86  EP 6 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
        bRefresh                0
        bSynchAddress           0
        MIDIStreaming Endpoint Descriptor:
          bLength                 6
          bDescriptorType        37
          bDescriptorSubtype      1 (GENERAL)
          bNumEmbMIDIJack         2
          baAssocJackID( 0)       3
          baAssocJackID( 1)       7
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        4
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x88  EP 8 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x09  EP 9 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0


client 16: 'Fireface 802 (23731709)' [type=kernel,card=0]
    0 'Fireface 802 (23731709) Port 1'
    1 'Fireface 802 (23731709) Port 2'

16:1 System exclusive F0 00 20 0D 10 00 00 12 00 78 0B F7
Another message appears, but the lines update so quickly that I can't read them

12

Re: oscmix: mixer/control software for UCX II

Thanks to sjzstudio and maggie33 (I assume) for providing USB descriptors for the 802. I opened a github issue about adding support for the 802 at https://github.com/michaelforney/oscmix/issues/4. For anyone interested in that, we can continue there.

13 (edited by maggie33 2024-02-22 13:01:58)

Re: oscmix: mixer/control software for UCX II

mcf wrote:

Thanks to sjzstudio and maggie33 (I assume) for providing USB descriptors for the 802. I opened a github issue about adding support for the 802 at https://github.com/michaelforney/oscmix/issues/4. For anyone interested in that, we can continue there.

Yes, you assume correct ;-)

PS:
Working on a quite similar idea, since some weeks -  but via nodejs - https://openstagecontrol.ammd.net
My idea is, to hook the Fireface via USB to a Win or Mac "host" and use 3 OSC Controllers for in, pb and out busses. And a raspi serves the GUI frontend via web for independant clients/browsers.

mcf, just to show you what i mean: A quick screen-record of my current state. Left side: original tm app on mac, with an offline UFX III device. Right side: the "remote" GUI running in local safari. Sure - it can also run on any browser (iPhone/Androids) in LAN without any 3rd party software.

EDIT: Link deleted, because i see a lot of bot traffic on my server. Contact me, if you are interested

But it is still full of bugs and the code is not ready yet for public sharing. About 30-40% are done. And as i use the images from the original Totalmix App (located in ressources dir on mac's) - I have first to ask RME if its ok...

If you are interested to combine our efforts, let me know here or via github.

regards, maggie

“Do It For Her”
My Gear: Bontempi Magic light Keyboard

Re: oscmix: mixer/control software for UCX II

mcf wrote:

Thanks to sjzstudio and maggie33 (I assume) for providing USB descriptors for the 802. I opened a github issue about adding support for the 802 at https://github.com/michaelforney/oscmix/issues/4. For anyone interested in that, we can continue there.

In the next few days, I'll look into the related issues of the UFX+ device on Github.

Re: oscmix: mixer/control software for UCX II

mcf wrote:

Over the past few months, I've been working on software to control my UCX II in CC-mode from Linux, and while there is still lots left to do, I think I'm at a point where it might be useful for others.
https://github.com/michaelforney/oscmix

Very cool. Could you please make README more verbose about compilation and usage?

After installing

pkg-config libasound2-dev libgtk-3-dev

dependencies I managed to compile, but where do I get

alsarawio alsaseqio

from?


Another thumbs-up for the WebSocket idea...

Re: oscmix: mixer/control software for UCX II

mcf wrote:

Thanks to sjzstudio and maggie33 (I assume) for providing USB descriptors for the 802...

Having a look at https://github.com/michaelforney/oscmix … e.lua#L454 I see

usb_table:add(0x2a393f82, rme_proto)  -- UCX II
usb_table:add(0x2a393fcd, rme_proto)  -- 802

My UCX II is 0x2a393fd9 ... also could join in with a BabyFace, if you'd like to include more devices - how to discuss, IRC?

17

Re: oscmix: mixer/control software for UCX II

cupakm wrote:

Very cool. Could you please make README more verbose about compilation and usage?

After installing

pkg-config libasound2-dev libgtk-3-dev

dependencies I managed to compile, but where do I get

alsarawio alsaseqio

from?

Feel free to send a pull request if you have an idea on how to make it clearer. alsarawio and alsaseqio are built and installed default, and the README already mentions that they are bundled. You said you already managed to compile it, so you should find them right there in the source directory.

The README also links to the man page, and provides some explicit examples of how to run it on Linux and BSD.

18

Re: oscmix: mixer/control software for UCX II

cupakm wrote:
mcf wrote:

Thanks to sjzstudio and maggie33 (I assume) for providing USB descriptors for the 802...

Having a look at https://github.com/michaelforney/oscmix … e.lua#L454 I see

usb_table:add(0x2a393f82, rme_proto)  -- UCX II
usb_table:add(0x2a393fcd, rme_proto)  -- 802

My UCX II is 0x2a393fd9 ... also could join in with a BabyFace, if you'd like to include more devices - how to discuss, IRC?

That's just the wireshark dissector used for debugging and reverse engineering; it isn't needed for normal usage, or for running the dissector in CC-mode. But yeah, feel free to update it with your device IDs.

I just created an IRC channel #oscmix on Libera, feel free to pop in there. I am interested in supporting more devices, but need people willing to do the work to map registers to mixer functions and discover any protocol differences, which requires considerable effort. So far, maggie33 has been a huge help with the 802.

Re: oscmix: mixer/control software for UCX II

mcf wrote:

You said you already managed to compile it, so you should find them right there in the source directory.

Yes, sorry, they're indeed there.

Re: oscmix: mixer/control software for UCX II

mcf wrote:

I just created an IRC channel #oscmix on Libera, feel free to pop in there. I am interested in supporting more devices, but need people willing to do the work to...

Would some more persistent communication channel work for you?

You may wish to have a look at https://forum.rme-audio.de/viewtopic.php?id=38691 and include Crosfeed and RoomEQ to the GTK UI. Needs FW update... (should be doable in VM https://forum.rme-audio.de/viewtopic.php?id=38961 if you don't happen to have Win machine around)

21

Re: oscmix: mixer/control software for UCX II

cupakm wrote:

Would some more persistent communication channel work for you?

I can look into setting up logging for the channel. Alternatively, you could look into setting up an IRC bouncer. Unfortunately, it looks like the libera-matrix bridge has been recently been taken offline.

You may wish to have a look at https://forum.rme-audio.de/viewtopic.php?id=38691 and include Crosfeed and RoomEQ to the GTK UI. Needs FW update... (should be doable in VM https://forum.rme-audio.de/viewtopic.php?id=38961 if you don't happen to have Win machine around)

Room EQ and crossfeed are already supported (since a couple days after the feature was released for UCX II) through

/output/{1..20}/crossfeed
/output/{1..20}/volumecal
/output/{1..20}/roomeq/enabled
/output/{1..20}/roomeq/delay
/output/{1..20}/roomeq/band{1,8,9}type
/output/{1..20}/roomeq/band{1..9}gain
/output/{1..20}/roomeq/band{1..9}freq
/output/{1..20}/roomeq/band{1..9}q

It is just missing UI controls. Patches welcome.

22 (edited by maggie33 2024-05-29 10:36:18)

Re: oscmix: mixer/control software for UCX II

Current WIP state regarding Fireface 802 adoption based on mcf's project can now be checked/tested now here:

       So, no need to compile anything...
       Easiest way: Use a current Chrome browser and use the MIDI Connection Type.
       Safari: No webmidi support.
       Firefox: Only partial webmidi supported.
       (for Websocket option: you would need to setup a websocket bridge, compile things, etc...)


“Do It For Her”
My Gear: Bontempi Magic light Keyboard

23 (edited by sjzstudio 2024-05-29 17:26:00)

Re: oscmix: mixer/control software for UCX II

I tried the Web UI. It  Mostly worked. I can adjust the levels, connect the phantom. Of course, it's still experimental.

24 (edited by gleeman 2024-11-14 10:40:00)

Re: oscmix: mixer/control software for UCX II

I'm automating the start of oscmix for my Fireface UCX with this script, I'll paste it here in case it is useful to someone else
It assumes oscmix is installed in /home/<user>/oscmix and that alsarawio and alsaseqio are in your PATH

ucxii.sh on # starts oscmix 
ucxii.sh off # stops oscmix
ucxii.sh gui # starts the gui
#!/bin/bash
if [ "$#" -ne 1 ]; then
    echo "Usage: $0 <on|off|gui>"
    exit 1
fi

if [ $1 == "on" ]; then
    rawport="$(amidi -l | awk 'NR==3{split($2,a,":"); print a[2]}')"
    seqioport="$(aconnect -l | grep "Fireface UCX" | awk 'NR==1{print $2}')1"
    alsarawio $rawport oscmix &
    alsaseqio $seqioport oscmix &
elif [ $1 == "off" ]; then
    killall -9 oscmix oscmix-gtk
elif [ $1 == "gui" ]; then
    GSETTINGS_SCHEMA_DIR=$HOME/oscmix/gtk $HOME/oscmix/gtk/oscmix-gtk &
fi
ps aux | grep -e "oscmix"

Re: oscmix: mixer/control software for UCX II

nice!

“Do It For Her”
My Gear: Bontempi Magic light Keyboard

Re: oscmix: mixer/control software for UCX II

Hello, I'm a new happy owner of a Babyface Pro FS and I'm interested in using OscMix. So here is the USB description of the interface :

Babyface Pro FS :

Bus 001 Device 002: ID 2a39:3fb0 RME Babyface Pro (Class Compliant Mode)
Couldn't open device, some information will be missing
Negotiated speed: High Speed (480Mbps)
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 [unknown]
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x2a39 RME
  idProduct          0x3fb0 Babyface Pro (Class Compliant Mode)
  bcdDevice            0.01
  iManufacturer           1 RME
  iProduct                2 Babyface Pro (73074345)
  iSerial                 3 2A17A6F05122128
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x01a7
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         4
      bFunctionClass          1 Audio
      bFunctionSubClass       0 [unknown]
      bFunctionProtocol      32
      iFunction               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol     32
      iInterface              0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               2.00
        bCategory               8
        wTotalLength       0x0055
        bmControls           0x00
      AudioControl Interface Descriptor:
        bLength                 8
        bDescriptorType        36
        bDescriptorSubtype     10 (CLOCK_SOURCE)
        bClockID                1
        bmAttributes            3 Internal programmable clock
        bmControls           0x03
          Clock Frequency Control (read/write)
        bAssocTerminal          0
        iClockSource            0
      AudioControl Interface Descriptor:
        bLength                17
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             3
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bCSourceID              1
        bNrChannels            12
        bmChannelConfig    0x00000000
        iChannelNames           0
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                17
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             5
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bCSourceID              1
        bNrChannels            12
        bmChannelConfig    0x00000000
        iChannelNames           0
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             4
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID               2
        bCSourceID              1
        bmControls         0x0000
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID               5
        bCSourceID              1
        bmControls         0x0000
        iTerminal               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           3
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels             2
        bmChannelConfig    0x00000003
          Front Left (FL)
          Front Right (FR)
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0096  1x 150 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes           17
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Feedback
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       2
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           3
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels            12
        bmChannelConfig    0x00000000
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0384  1x 900 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes           17
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Feedback
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               4
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           6
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels            12
        bmChannelConfig    0x00000000
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0384  1x 900 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       2
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol     32
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                16
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           6
        bmControls           0x00
        bFormatType             1
        bmFormats          0x00000001
          PCM
        bNrChannels             2
        bmChannelConfig    0x00000003
          Front Left (FL)
          Front Right (FR)
        iChannelNames           0
      AudioStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bSubslotSize            3
        bBitResolution         24
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            5
          Transfer Type            Isochronous
          Synch Type               Asynchronous
          Usage Type               Data
        wMaxPacketSize     0x0096  1x 150 bytes
        bInterval               1
        AudioStreaming Endpoint Descriptor:
          bLength                 8
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bmControls           0x00
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         1 Audio
      bInterfaceSubClass      3 MIDI Streaming
      bInterfaceProtocol      0
      iInterface              2
      MIDIStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength       0x0061
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               1 Embedded
        bJackID                 3
        bNrInputPins            1
        baSourceID( 0)          2
        BaSourcePin( 0)         1
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               2 External
        bJackID                 2
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               1 Embedded
        bJackID                 7
        bNrInputPins            1
        baSourceID( 0)          6
        BaSourcePin( 0)         1
        iJack                   5
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               2 External
        bJackID                 6
        iJack                   5
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               1 Embedded
        bJackID                 1
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               2 External
        bJackID                 4
        bNrInputPins            1
        baSourceID( 0)          1
        BaSourcePin( 0)         1
        iJack                   4
      MIDIStreaming Interface Descriptor:
        bLength                 6
        bDescriptorType        36
        bDescriptorSubtype      2 (MIDI_IN_JACK)
        bJackType               1 Embedded
        bJackID                 5
        iJack                   5
      MIDIStreaming Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (MIDI_OUT_JACK)
        bJackType               2 External
        bJackID                 8
        bNrInputPins            1
        baSourceID( 0)          5
        BaSourcePin( 0)         1
        iJack                   5
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x07  EP 7 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
        bRefresh                0
        bSynchAddress           0
        MIDIStreaming Endpoint Descriptor:
          bLength                 6
          bDescriptorType        37
          bDescriptorSubtype      1 (Invalid)
          bNumEmbMIDIJack         2
          baAssocJackID( 0)       1
          baAssocJackID( 1)       5
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x86  EP 6 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
        bRefresh                0
        bSynchAddress           0
        MIDIStreaming Endpoint Descriptor:
          bLength                 6
          bDescriptorType        37
          bDescriptorSubtype      1 (Invalid)
          bNumEmbMIDIJack         2
          baAssocJackID( 0)       3
          baAssocJackID( 1)       7

By the way, I'm using it with EndeavourOS (Ach Linux distro) with Pipewire and Wireplumber and I've a probleme : when the computer resume from suspend, the volume of all I/O are set to 0. Is it normal ? Is there a way to keep the volume as they were before suspending ? At start up, the volume seems correct but when I launch QasMixer, the sliders are set to 0. It's like the volume are not saved in the system. Can anyone help me ? Thanks