"Generic MIDI" control surface, Linux, LEDs with feedback — is it possible?

Hello everyone,

I’m setting up a new MIDI controller, the LAudio EASYCONTROL.9 (aka the WORLDE EASYCONTROL.9, https://www.worlde.com.cn/productshow-143-83.html), for use with Ardour.

After setting up a MIDI map, all the faders, buttons, and knobs are working perfectly. However, the LEDs on the buttons only blink when pressed. I’d like the LEDs to reflect the actual status — for example, showing lit indicators for solo/mute states, and having the start/stop/loop buttons highlighted when active. Is this possible?

Here’s the MIDI map I’ve configured so far:

<?xml version="1.0" encoding="UTF-8"?>
<ArdourMIDIBindings version="1.0.0" name="LAudio EASYCONTROL.9">

<!-- MIDI Mapping for LAudio EASYCONTROL.9 -->
<!-- Intended to be used with the preset 0 -->

  <!-- Channel faders -->
  <Binding channel="1" ctl="3" uri="/route/gain 1"/>
  <Binding channel="1" ctl="4" uri="/route/gain 2"/>
  <Binding channel="1" ctl="5" uri="/route/gain 3"/>
  <Binding channel="1" ctl="6" uri="/route/gain 4"/>
  <Binding channel="1" ctl="7" uri="/route/gain 5"/>
  <Binding channel="1" ctl="8" uri="/route/gain 6"/>
  <Binding channel="1" ctl="9" uri="/route/gain 7"/>
  <Binding channel="1" ctl="10" uri="/route/gain 8"/>
  <Binding channel="1" ctl="11" uri="/bus/gain master"/>

  <!-- Channel buttons -->
  <Binding channel="1" ctl="23" uri="/route/solo 1"/>
  <Binding channel="1" ctl="24" uri="/route/solo 2"/>
  <Binding channel="1" ctl="25" uri="/route/solo 3"/>
  <Binding channel="1" ctl="26" uri="/route/solo 4"/>
  <Binding channel="1" ctl="27" uri="/route/solo 5"/>
  <Binding channel="1" ctl="28" uri="/route/solo 6"/>
  <Binding channel="1" ctl="29" uri="/route/solo 7"/>
  <Binding channel="1" ctl="30" uri="/route/solo 8"/>
  <!-- Solo button for master bus has no sense -->
  <Binding channel="1" ctl="31" uri="/bus/mute master"/>

  <!-- Transport buttons -->
  <Binding channel="1" ctl="49" function="loop-toggle"/>
  <Binding channel="1" ctl="47" function="transport-start"/>
  <Binding channel="1" ctl="48" function="transport-end"/>
  <Binding channel="1" ctl="46" function="transport-stop"/>
  <Binding channel="1" ctl="45" function="transport-roll"/>
  <Binding channel="1" ctl="44" function="toggle-rec-enable"/>

  <!-- Panning -->
  <Binding channel="1" ctl="14"   uri="/route/pandirection 1"/>
  <Binding channel="1" ctl="15"   uri="/route/pandirection 2"/>
  <Binding channel="1" ctl="16"   uri="/route/pandirection 3"/>
  <Binding channel="1" ctl="17"   uri="/route/pandirection 4"/>
  <Binding channel="1" ctl="18"   uri="/route/pandirection 5"/>
  <Binding channel="1" ctl="19"   uri="/route/pandirection 6"/>
  <Binding channel="1" ctl="20"   uri="/route/pandirection 7"/>
  <Binding channel="1" ctl="21"   uri="/route/pandirection 8"/>
  <Binding channel="1" ctl="60"   uri="/route/pandirection master"/>
  
</ArdourMIDIBindings>

Of course, once I get this working, I’m happy to clean it up and create a Merge Request if it would be useful to the project.

I found this repository: GitHub - omargomez2/worlde_easycontrol_midimap: Worlde Easycontrol.9 Generic MIDI Binding Map for Ardour / Harrsion Mixbus

But it uses custom layout of MIDI events and, IIUC, doesn’t set the state of LEDs.

Generally speaking, you cannot control the state of a device with a generic MIDI binding map, it requires dedicated code control (a “control surface module”).

The one exception is a device that can be correctly controlled by simply sending it back what it sends us. In the early 2000s there were quite a few of these. Today, there are very few.

1 Like

Thank you! Just to clarify: is creating a new control surface module a complicated task? Is it well-documented?

As a workaround in my case, I was thinking of setting the channel buttons on my controller to toggle mode using the WORLDE editing tool. It doesn’t work perfectly in WINE, but I have a virtual Windows setup.

P.S. Are the MR’s with the new MIDI maps still welcomed?

It’s not documented any more or less than any of our other code. There are a dozen or so existing control surface modules, and we generally start a new by copying one of the existing ones that is similar to the new device.

Because Ardour is open source, we don’t have some add-on system to support control surfaces - it’s done directly in C++ because the source code is all available.

Yes, we welcome new MIDI binding maps.

1 Like

Ok, thank you for clarifying this. I’ll try to create a MR in case of successful setup of EASYCONTROL.9.

Well, in some cases, it is possible but I don’t think you would like the “solution” I came up with, it’s quite tailored to my needs and I wouldn’t do this with more complicated controllers. Also note that my controller is meant to drive clip launching in Bitwig, not Ardour, thanks to an extension script developed by Jürgen Mossgraber (drivenbymoss extensions) called “Generic Flexi”.

Bitwig offers a java based API for developing extensions allowing DAW control from say external devices, and the generic flexi extension makes use of this API by exposing a rather user friendly configuration interface where you can map incoming MIDI messages to Bitwig’s functions. One of the thing the extension script offers is to send back the incoming MIDI message to the controller. But what if the controller does not understand such incoming message because its incoming MIDI message mapping follows a specific manufacturer implementation ?

That’s where you can add a midi router in between (I use the midi-router-client app which has linux support) and configure some routes and message translation for these MIDI messages that are echoed back to the controller. My controller is the Morningstar MC8 Pro which I use to control the clip launching in Bitwig from my foot, and in some situations, I want visual indications on the controller when I do something in the clip launcher with say the mouse or another controller in parallel (the MC8 Pro allows me to play an instrument and use my feet to control the clip launching but when I am not playing an instrument, I prefer using a much more refined controller like an APC40). So is this middleman rerouting and translating messages to the controller worth it ? In my case yes because I don’t need much visual feedback on the controller itself. But for complex controllers, I would go another route and probably follow Paul’s advice.

2 Likes

So here is my PR for this controller: LAudio EASYCONTROL.9 MIDI map by yashrk · Pull Request #1017 · Ardour/ardour · GitHub