Update on MIDI controllers

Hey everyone,

just a quick update about custom MIDI controller mapping as I know it’s important to a lot of you and I’m sorry it didn’t make it into the last development cycle.

It was my plan to get it done over the summer but, as is often the way with coding, the timeline and timing refactor got out of control and monopolised my time.

APC40s are back in stock so that somewhat diminishes the urgency but I will work on custom MIDI in the next cycle. To do it properly is quite a major piece of work, as I need to refigure the on-screen display as well. I reckon a good few months of development time, and honestly I’m not even 100% sure what it needs to look like right now.

But let me know what is holding you back, perhaps there’s a simpler interim solution that I can come up with that could get integrated more quickly. What do you need?

Thanks for your continuing support,

Seb

1 Like

Hi Seb

I can imagine that adding other controllers are a major bit of work. Good to hear the APC40s are back in stock, I just managed to get my hands on a used one as I fell in love with playing around with patches in Liberation and then panicked I would never get the controller that integrates so well, and that is also useful for using Live.

Best regards, Dan

1 Like

As an interim solution you could direct people towards MIDI translators (I like Bome), which would let you get certain features and components functional faster, assuming your full mapper comes later. So for example, you could ship “how do I display each mappable control’s current Ch/CC/Note in the UI” without needing to make an immediate architectural decision about “Do I allow one midi control to target multiple UI controls, and do I allow multiple MIDI controls to target the same UI control?” (Yes to both please! Happy to articulate why.) You can probably build range scaling, relative encoder vs absolute, and how to initialize/echo values to indicators all without building the core router, shipping something useful and polished incrementally.

The best MIDI mapping experience I’ve had is what our mutual friend Mark Slee has done in Chromatik. It feels from the future compared to the de facto approach of most apps with their big “recreating a spreadsheet” grid view.

When you hover anything mappable in the UI, there’s a small bar at the bottom that displays its current OSC / MIDI address. You make mappings by learning an incoming note/channel, and then it highlights all mappable elements in the UI that can be clicked to create the mapping. He also has elegant UI that visualizes min/max/range type issues and helps you see how unipolar-to-bipolar type mappings are actually functioning.

While I think that a table-based mapping manager is inevitable and even preferred for power users, this is better for new users whose brains aren’t ready to link fifty unfamiliar phrases in a table column with what they do in the app yet.

Other thoughts:

  • Please consider import/export via CSV or JSON a first class feature.
  • Please default to decimal display, and build in a hex option only if time allows or the spirit moves you
  • Please build OSC input mappings side by side. MIDI is trapped in mediocrity. Consider how it feels to Z-rotate with 7 bits of resolution, consider how few controllers support 14 bit output, and that every pot or encoder less than a Monome Arc is 96 pulses per revolution or less. Dampening (“physics”) isn’t the answer.

I’ve spent a lot of painful time mapping controllers. If you’re looking for some controllers worth trying to see what it can be like on the other side, from best to worst (in terms of config utilities and documentation):

  1. Traktor F1
  2. DJTT MidiFighter Twister
  3. Roli (e.g. light block)
  4. Erae
  5. APC stuff, including Mini and Mk2

I haven’t tried any Novation stuff or the Ableton Push, and I’m eagerly tracking the progress of the Intech team.

1 Like

TLDR: If the short term solution allows clip triggering via either QWERTY keyboard or dmx board, I’d say do it. Otherwise, just go all in with Midi mapping.

My understanding of the scope of Liberation currently is that it is standalone live laser busking software first. Speaking from the perspective of when I did not have a APC, playback with only a mouse / trackpad is not ideal. If I could trigger clips with one hand and tweak / jam with the other, I’d be quite confident playing live to an audience sans APC (or other controller)

That being said, my original suggestion was for WASD keys for selection and spacebar as a the trigger. Alternatively, shift + WASD could auto trigger the next cue in your deck. Shift lock could be useful. Spacebar is currently occupying timeline start/stop. Can the F-keys be used to trigger?

Next is a question of how important is custom QWERTY shortcuts to current and future users.

When it comes to mapping what is going to be mappable? I’ve used software where they paywall very specific things.

If I were to suggest what I would use mapping for (as an APC40mk2 user) likely would be a streamlined “Master playback” on a separate controller. Fast auto-triggering timelines is my first thought. Isolated DMX / video clips second.

2 Likes

Just a note (from an inMusic engineer) that we’re planning a lighting edition of the APC40 MK2. It’ll be the same controller with the same USB ID (so it’ll work with everything the current controller does) but with more generic labels and no bundled Ableton. I’m going to try to get a dry wipe scribble overlay bundled also.

We’re not discussing it widely yet so don’t repost, but hopefully this’ll solve the supply issues for all the video and laser people who rely on the APC40.

Rob

10 Likes

I wanted to add my opinion here as an extensive MIDI and OSC power user. I think @Jeff makes many great points, and I want to support and expand on them.

I have many hundreds of custom mappings and implementations (maybe over 1000) for Ableton Live, OBS, Max, Resolume, TouchDesigner, ChamSys MagicQ, other laser software, Radiator, dozens of synthesizers, and lots of other boutique and custom software. I’ve created MIDI control plugins for Moog synths that are reasonably popular among Ableton Live (Max4Live) users. I had a chat with Seb a few weeks ago about the updates to MIDI send/receive and have been testing extensively ever since.

I have built Bome presets and translators for more than a dozen different controllers to at least 6 different pieces of software and a couple dozen hardware devices. I am currently porting presets and concepts to Chataigne for more flexibility with OSC, DMX and custom TCP/IP interfaces. While I don’t represent the average user by any stretch of the imagination, I would be more comfortable using this middleware approach as an interim solution if I could access all the current MIDI targets that the APC can reach in addition to the current send/receive system targets.

Using either Bome or Chataigne, I cannot seem to echo APC40 commands through the MIDI send/receive interface. I wonder if achieving this level of parity between interfaces would be a pretty low barrier to allow more customization using the send/receive system.

For example, I want to map zone delay values to pads on a LaunchPad so I have 8-16 different preset delays with which I can jam on the selected clip. It wouldn’t need any type of feedback for the current delay value of a clip because 1, LED pulse/flash feedback can be baked into the controller preset in Bome/Chataigne, and 2, I expect a lot of clips will have in-between values that don’t need to be reflected or updated by hardware. I would use the same concept of fixed values on pads to toggle delay patterns and modes rather than using the encoders.

I’ve tested these aforementioned targets via the send/receive system with no success, for example Zone Delay B0 11 00.

Chromatik has a really nice system, but it seems like it would be quite a task to implement. I think a “stepping stone” approach toward getting there, and something that aligns with the concept of having values displayed on screen along with ranges/scaling, could be something like Eventide has done with the H9000.

H9000 provides a very basic external control interface where the user can right-click any UI element and map to any of the supported modulation input types: CV/pedal, analog switch, MIDI note/CC/PC/start/stop, or inbuilt macro controls. Both input and destination values can be scaled to a range (14-bit resolution). The modulation and/or target values can be inverted to invert the modulation action. Every target in the UI can receive one modulation input (one>many, but not many>one). This fairly basic set of controls facilitates most of my use-cases, although I wish I could adjust the response curves.

The video below shows what I’m talking about in the H9000 emote interface.

The screenshot below shows a mapped object with all of the mappings (CC# and range between white and green dots) highlighted in green in the GUI.

I think a toggle action to show the MIDI mappings as an overlay like this would be useful.

YES, YES, 1000 TIMES YES! The project file structure is one of my favorite features of Bome and why I almost always default to using it as a middleware over even well-featured native MIDI implementations. It’s SO much easier to iterate mappings in text than in a GUI.

+1 for native OSC even if it’s only custom mappings. ChamSys MagicQ has a very functional default set of OSC commands and simple (UI/UX-wise) implementation for custom OSC commands pointing to any mappable element.

(I deleted a paragraph here about MIDI 2.0, but I would love to talk about that in the future.)

I’ve programmed or programmed with all of the following controllers for laser/visual uses. Many of my friends use the same controllers for lasers with other software.

  1. Novation Launch Control
  2. Novation Launch Control XL mk2
  3. Novation LaunchPad mk2
  4. Novation LaunchPad Pro mk2
  5. Novation LaunchPad Mini
  6. NI Traktor D2
  7. Akai APC40 mk1 and mk2
  8. Akai APC Mini mk1 and mk2
  9. Korg NanoKontrol 2
  10. Korg NanoPAD 2
  11. Behringer BCF2000
  12. Behringer BCR2000
  13. Behringer X-Touch Compact/Extender
  14. Behringer X-Touch Mini

While I think it’s worth considering the capabilities and workflows of popular controllers from an overall design ethos, I think more preset mappings or controller-specific behavior should be avoided. I don’t think the average entry-level user will be looking too far past the APC40, and my opinion is that it’s more important to have a flexible system that allows power users the ability to use these types of controllers in a variety of ways. For example, being able to adjust the behavior of a switch/pad/button to act as either a momentary or toggle, regardless of the actual controller behavior. Same with value scaling, curve adjustment, min/max values/thresholds, inversion, etc.

Features like this benefit all controllers, including custom software tools and/or scripts sending MIDI/OSC/whatever messages. Novation and NI have great controller editors allowing customization of these types of behaviors, but it’s SO much easier to manage modulation routing and behavior in one piece of software.

Things I would personally like to be accessible as MIDI targets in the send/receive system:

  1. Zone Delay, delay mode, chase pattern, and chase mode (APC40 mapping accessible to send/receive system)
  2. Clip modulation parameter input (or 2). Static mappings (maybe 16-64 “slots”) to send to particular clips as a fixed modulator. This would be useful to modulate “go-to” clips stored on dedicated pads of a separate controller.
  3. All four FX modulation inputs for all 24 slots. I want to control all 4 of each FX slots’ modulation inputs with something like a Launch Control XL or MIDI Fighter Twister. 4x CC inputs + 2x button inputs per channel acting as fixed presets for a certain % level.
  4. (Longer term) Group/clip assignments to zones. This was already mentioned in the docs as on the roadmap. I’d love to have a section on a separate Launchpad page to show beam/canvas mappings in one view without having to scroll. I would want feedback in this feature to send the controller the mappings of the current clip/group.

I’m sure I could go on, but I feel like this is already a lot. Hopefully some of this is useful feedback and as a feature request. I’m happy to clarify and/or elaborate upon request.

3 Likes

Hi everyone,

Thank you all so much for your extensive insights, it’s clear that you all care deeply about custom control of Liberation and I really appreciate this and want to give you the flexibility you desire and deserve :blush:

I think we’re all on the same page; you know I’m a musician so I want all the same things as you, on screen adjustments, import settings files, OSC, everything! It will take a while though so I want to make sure I can at least provide options from the start.

First, let’s address some confusion :

That’s because they are entirely separate systems. Honestly I kind of regret the Send/Receive system because it wasn’t designed for this and I worry that I’ve led you all down a dead end street!

The APC40 system is different but it is built on a base MidiController object, so I plan to adapt this system to offer custom control. But right now it’s hard coded to auto-connect to an interface containing “APC40 MkII” so will be hard to hijack.

But, I can make a new class based on the same MidiController object that loads a custom json file for its mappings.

Differences between Send/Receive and MidiController systems

Currently the MidiController can only do things the APC40 can do - which is a lot, but all based on app state / scroll position, so it can only access on-screen clips, and adjust parameters for the currently selected clip.

But it has been well architected so its mapping should be flexible.

This is in contrast to the Send/Receive system which can only operate on static values, and is completely oblivious to the app state, scroll position etc. Everything in this is hard coded (ugh!)

Although the MidiController system was designed with a different paradigm in mind, there’s no reason I can’t add some static options to it. And I plan to do this next.

Updates to parameter system

I have made some minor updates to 0.8.0. There used to be just one “parameter” on each effect, now you can control up to 3 via midi CC messages, and add up to 16.

And you can also add parameters to clips! Again up to 16, but these are not yet mapped to MIDI, but it’s a first step. (You can adjust them through the right click menu)

I plan to add pages to the group of eight rotaries on the APC to allow you to choose between the current setup, and the parameters for the currently playing clips, and then some custom pages too.

JSON file format

I’ve been experimenting with serialising the MIDIController mapping to JSON and I’m pretty happy I’m on the right track. Here’s some selected excerpts :

{
         "action": "ClipButtonPress",
         "actionX": 0,
         "actionY": 0,
         "channel": 1,
         "midiType": "NoteOn",
         "pitch": 32
      },
      {
         "action": "ClipButtonRelease",
         "actionX": 0,
         "actionY": 0,
         "channel": 1,
         "midiType": "NoteOff",
         "pitch": 32
      },
      {
         "action": "ClipButtonPress",
         "actionX": 0,
         "actionY": 1,
         "channel": 1,
         "midiType": "NoteOn",
         "pitch": 24
      },
      {
         "action": "ClipButtonRelease",
         "actionX": 0,
         "actionY": 1,
         "channel": 1,
         "midiType": "NoteOff",
         "pitch": 24
      },
      {
         "action": "ClipButtonPress",
         "actionX": 0,
         "actionY": 2,
         "channel": 1,
         "midiType": "NoteOn",
         "pitch": 16
      },
      {
         "action": "ClipButtonRelease",
         "actionX": 0,
         "actionY": 2,
         "channel": 1,
         "midiType": "NoteOff",
         "pitch": 16
      },
      {
         "action": "ClipButtonPress",
         "actionX": 0,
         "actionY": 3,
         "channel": 1,
         "midiType": "NoteOn",
         "pitch": 8
      },
      {
         "action": "ClipOffsetXRelative",
         "midiType": "NoteOn",
         "pitch": 58,
         "relativePosition": -8
      },
      {
         "action": "TempoMultiplierToggle",
         "midiType": "NoteOn",
         "pitch": 103
      },
      {
         "action": "TempoMultiplier",
         "control": 15,
         "midiType": "ControlChange"
      },
      {
         "action": "TempoNudgeBack",
         "midiType": "NoteOnOrOff",
         "pitch": 100
      },
      {
         "action": "TempoNudgeForward",
         "midiType": "NoteOnOrOff",
         "pitch": 101
      },
      {
         "action": "DisarmAll",
         "channel": 1,
         "midiType": "NoteOn",
         "pitch": 102,
         "requiresShift": true,
         "shiftState": false
      },
      {
         "action": "ArmAll",
         "channel": 1,
         "midiType": "NoteOn",
         "pitch": 102,
         "requiresShift": true,
         "shiftState": true
      }
   ]

Every action in Liberation has a name, and can be mapped onto a midi action.

This is actually a reflection of how the system works under the hood, and this has been stuff I’ve set up in code up until now, but hopefully we’ll get to do it in json.

For APC40 implementation,I have a lot of custom code that then updates the button colours and states, and rotary modes / values. I’m not quite sure how to abstract that out yet, but at least for input it should be relatively straightforward to get this running.

Summary

So in summary, there’s a long way to go but I hope to give you the hooks that you need to get started. And moving slowly towards the final goal of full integration.

It’s probably worth setting up a zoom call just for the MIDI controller contingent all but I have a show soon so it will have to wait until next month.

Thanks again for your enthusiasm and insights!

Seb

Hi Seb.

I am finally getting back around to this after focusing on shows for the past few months.

Thanks for the clarification about MIDIController vs Send/Receive. Also thanks for implementing the additional parameters; I’m going to test this with my Launch Control over the next 2 weeks.

This JSON format looks great to me. When will this be available for testing?

Will the complete list be published in the docs along with the release of this new MIDI system?

Does this mean that MIDI actions configured in the MIDIController JSON mapping will not receive feedback when the same action is performed using the mouse or another controller? This would be less than ideal if clips are toggled from the APC or mouse but don’t update on a second controller (or translator in my case).

My goal is to use a Launchpad for about 30-40 “go-to” clips and some preset value toggles (zone delay and chase pattern values, for example). If I scroll the APC or UI to play clips from the same area of the clip deck and toggle a clip that’s also mapped on the LaunchPad, I would want Liberation to send the updated note on/off value to my translator so I can control LED behavior on the controller.

I think this is a nice start and would be happy to test and give more feedback now that I have some time off over the Summer.

When i look at liberation i can see that iincredible well designed. But these days APC40,s are getting harder to purchase. There are great other midicontrollers available like for example a Launchpad X wich has even a fader function.

In the world of DMX control most consoles like avoite, grandma etc have motorized faders so they are always in sync with the software. With EDM for example just before the drop you can ramp up the speed and then select the next cue with touchsceen or midi button and then speed fader goes back to default. I,m really impressed with Liberation and capabilities but it seems risky to me from a bussiness point of view aswell to only go with an APC40MK2. I know it makes sence as it has buttons, faders and knobs in one device but a Xone K2 or a behringer X touch compact can also be a really great control device. From a bussiness point of view i think more people will start buying and using Liberation if they chan choose there own prefered controller.

Im not sure if you know this…but…you can map Liberation to any controller you like. Its just requires some manual labor to make work…and a deeper dive into the MIDI Map i think has been on the roadmap for a while now and in fact I beleive is the topic of this thread if im not mistaken.

Seb posted the current midi table here on the forums to help people branch out until he has the bandwidth refactor the controls.

I currently spread my setup between a APC40 mk 2 and MPK Mini plus and I lve been sending MIDI messages from Chamsys MagicQ(my preferred lighting desk) to trigger various things as well.

Id also take another look for APC 40s. Akai brought the mk 2 back from the discontinued pile. I was able to grab two at MSRP not that long ago.

Just food for thought.

Dustin L. Derry
CEO, LSO
(312) 498 - 2317 Mobile
dustin@stonewolf.com

1 Like

If you want to simply busk Live with your own controller, it’s super easy. It depends what type you have (pads, faders, encoders).

Least amount of work for simple clip triggering only without the use of additional software is to use the midi send receive. * Note on/ off only. No parameter adjustments this way via midi, (I don’t have a device connected atm, iac bus is to trigger through a DAW). Select your controller and lay clips out starting at 00 coordinates. Copy the pattern from the photo. RTM to get a better understanding. The pros of triggering like this are that group/ clip fades times are respected. Smash some keys and away you go.

Way #2

Go to Settings and in MIDI INPUT DEVICE select your trigger controller.

If your device’s notes are layed out on your device in a way that isn’t like a piano ( grid controller for example) or unable to be remapped via manufacturer software for send/ receive layoutI’ll suggest using the midi notes node. Here if you select IGNORE OUT OF RANGE NOTES, and a fast way to “map’ your note of choice to the clip is by selecting AUTO EXTEND RANGE hit your note and the note min and max should adjust. If not move the slider for either or manually type in the note number. If you want to use the harp mode, broaden the range and tweak to desired look.

Neat trick is to add multiple scenes to one clip, using a neighbouring note.

You can use midi notes with effects too Caveat, is that Effect bank must be engaged first. You need to play with this. It’s been a few months since I’ve tried with medium success.

Note * You can not modify fade in time. This a direct trigger. You can play with fade out (release) and there are some fantastic looks when you start playing with color.

You can record your midi notes into the timeline( I am unsuccessful at recording send/receive midi into time line). Make sure the midi notes clip is playing on the timeline when you playback and away you go.

Caveat to this method is that your clips must be engaged for the trigger to work. You can use the same midi notes trigger on different clips, just engage a new clip. I’ve used my external step sequencer this way, and I love it.

What about triggering and effects without a computer? Having a second controller with some faders and pots is my answer. Use midi notes with your trigger and setup and send /receive device with pots and or faders. Setup second device as channel 15 and or 16, RTM for cc values. I have a mini with pads and pots only use mapping software by manufacturer, I can upload a momentary or gate on the pad and assign it to a cc value. Interestingly, velocity play a factor when using this method with a pad cc note on my device, which can lead to some subtle randomness, which at times is very welcome.

Feedback or flame request in this one from other users please

2 Likes