Tag Archives: MIDI

What is still left for MIDI over Bluetooth Low Energy on Linux

I have to confess that I have been a little slow after the release of BlueZ 5.44 with the new MIDI profile support.

But I feel that I need to share the progress we have so far.

What has been done

The central role support is completed along with a midi parser library that implements the details of processing raw MIDI data to ALSA Sequencer events and vice-versa. The library has also been covered with several unit-tests.

What still needs to be done

Few people might notice a unstable MIDI connection, with packet and connection drops. This is because BlueZ in both kernel and user-space needs improvements on the way it handles connection parameters. I have several patches to improve on both sides, but it has not been approved yet. But it will soon be, since the maintainers are providing good feedback on that (kudos for Luiz Augusto von Dentz).

There is also the work in progress to finish a BlueZ tool to provide a peripheral role support for MIDI as well. Most of the work is in the ATT/GATT stack, since libmidi  already does all the heavy lifting when referring to MIDI parsing. My idea is to have a dedicated tool instead of implementing in bluetoothd  itself. They can both co-exist, so it is an acceptable solution IMO. But, please, feel free to discuss the solution with us.

That’s it. I hope this provides a clear view of the current road-map.

MIDI over Bluetooth Low Energy on Linux finally accepted

I am very happy to say that MIDI over BLE on Linux will be part of the next BlueZ release! You can check both commits for this initial release.

In order to build you need alsa-lib dependency and run ./configure  with --enable-midi  option because it is disabled by default since it is an experimental feature yet.

Now you can run bluetoothd and just connect to a BLE device that advertises the MIDI Primary Service. Once done that, bluetoothd will load the MIDI driver and a new ALSA Sequencer client/port will be created for the device. You can check with aseqdump -l  command to list all available ports for subscription. Connect to your Synth and enjoy!

Okay, there might be one caveat on this whole thing. It is very important that Connection Interval property is set via the Connection Update Command from the peripheral, but some devices don’t do it! This is required by the BLE-MIDI spec, but apparently MacOS or iOS force a Connection Interval for their particular adapters on each platform when connected to a MIDI device (yes, clearly they don’t trust device manufactures and they now exactly the most optimal configuration for their specific adapters). And since most MIDI device users use those OSes, they don’t really care about setting the Connection Interval. That’s a shame, I know…

So, If you notice any drop of connection, bad latency and packet drops, force BlueZ do the same – enforce a Connection Interval. To do that you have to edit a file that is located in  /var/lib/bluetooth/[ADAPTER]/[DEVICE]/info  where [ADAPTER] and [DEVICE] is their respective addresses and restart bluetoothd. Add the following lines:

If these values doesn’t work well for you, you might need to try out different MinInterval and MaxInterval for your particular adapter. I know it sucks, but that’s the price to pay for non compliant devices. If that is the case, complain to the manufacturer!

Anyway, back to the good stuff.

There is still work to be done. It is missing the Peripheral role support that can be implemented as a bluetoothd plugin or, perhaps, as a dedicated program if the prior doesn’t meet the low-latency requirements. There is also a support missing in ALSA Sequencer for arbitrary event timestamp, which is required by BLE-MIDI.

I will continue maintaining my personal branch of BlueZ to support MIDI further developments, so feel free to drop a line there, open issues (or use BlueZ bugtracker), send pull-requets etc.

Thanks to ROLI Ltd. for supporting me on this project. Also, Ben Supper, Luiz Augusto von Dentz and Adam Goode for reviewing the patch set.

MIDI over BLE on Linux under review, finally!

I am very happy to say that I finally have a version good enough to be sent for peer-review on linux-bluetooth mainling list.

There will be other little reviews, obviously. But hopefully this patch will be accepted for next BlueZ version.

Please, I invite you to review and test. You can check the patch at linux-bluetooth and a video demo I made (below as well).

Important notes:

  • GATT client (GAP central role)
  • libmidi (MIDI parsing)
  • unit-tests

The GATT server (GAP Peripheral role) can easily be implemented using libmidi . Once this main patch is in mainline, then it will be interesting to start working on it.

As mentioned on my patch, I would like to send kudos to ROLI Ltd. which allowed my to work on this as part of my full-time job.

Linux v4.9 with more USB-MIDI improvements

I am very happy to say that finally all ROLI‘s patches for USB-MIDI gadget driver for the Seaboard GRAND has been accepted upstream and it will be part of v4.9 of the Linux Kernel. Those final patches ended up causing improvements on the core USB Gadget framework as well, fixing potential bugs and making it more robust.

Some changes:

  • Refactor of the MIDI state machine;
  • Properly clean buffers if USB’s endpoint gets disabled;
  • USB Request allocator function aligns OUT endpoints to wMaxPacketSize property;
  • Other things as well…

The patches can be seen on Felipe Balbi’s and Greg Kroah-Hartman’s branches at this moment, since the v4.9 merge window is not open yet.

As always I would like to send appreciations to the Linux community, which has been always very open and helpful.

Make sure to update your kernel to 4.9 when it is available and enjoy!

USB-MIDI Gadget improvements on Linux

Here at ROLI we make heavy usage of Linux and its audio stack (ALSA). And one of our problems was the MIDI Gadget driver. The Linux USB Gadget MIDI driver has been neglected for few years now. It had several bugs, memory leaks and not very clean code-base. Why didn’t anyone care? Well, one of the reasons is that MIDI is a low speed and low throughput protocol, and the current driver was delivering just enough. But that is about to change because ROLI and others have been working on the Multidimensional Polyphonic Expression (MPE) MIDI specification, which increases dramatically the number of MIDI messages per second and per USB request. Thus problems started to arise.

Overall there were several patches that we upstreamed, including performance and memory-footprint improvements by pre-allocating IN USB requests, state machine refactor and fixing an annoying bug that caused the MIDI Streaming endpoint to freeze. There were also critical memory leaks fixes in ChipIdea’s UDC driver.

It is important to note that the Linux community was very helpful and open as always. Our threads created some helpful discussions and motivated others to contribute and improve the MIDI driver too.

So, update your kernel to v4.5 and enjoy a much better MIDI experience for your device on Linux.

PS: v4.6 and v4.7 will also have other improvements that were not merged yet.