MIDI map for M-Audio Oxygen Pro 49

Hi everybody, I am trying to configure the DAW mode of the M-Audio Oxygen Pro 49 MIDI controller keyboard. I built the MIDI map working on the Oxygen 49 one, routing the MIDI control signal to the transport, gain, pan direction, recording status, solo and mute.

Keyboard model is available on the manufacturer website but I can not post it here.

Everything works fine, except for the following:

  • Gain master should be triggered by channel 16 control 32 (that is the ninth fader on the keyboard), but the master fader doesn’t appear to respond. Same for master mute.
  • I can’t find which MIDI control numbers trigger the “select” function that should allow to select the tracks

That’s all… I can send you the MIDI map if you need… thanks in advance!

1 Like

Hey Francesco! Could you put it somewhere online? Like Github or just some file hosting?

Interestingly, I had the very same issue with my map for Novation Impulse 61 (it’s part of the bundle). Apparently, the “/bus/gain master” URI doesn’t work anymore, and it’s used in many maps.

Could you check if using /route/gain master rather than /bus/gain master works?

Can I share it here? I’m not on Github

<?xml version="1.0" encoding="UTF-8"?>
<ArdourMIDIBindings version="1.0.0" name="M-Audio Oxygen Pro 49">
<!-- 2015 05 26 Erik Deroo: Map file creation -->
<!-- Auto-map should be ON -->

<!-- Transport controls -->
  <Binding msg="bf 71 7f"         function="loop-toggle"/>
  <Binding msg="bf 72 7f"         action="Transport/Rewind"/>
  <Binding msg="bf 73 7f"         action="Transport/Forward"/>
  <Binding msg="bf 74 7f"         function="transport-stop"/>
  <Binding msg="bf 75 7f"         function="transport-roll"/>
  <Binding msg="bf 76 7f"         action="Transport/record-roll"/>
  
<!-- Gain controls. Faders are mapped to faders. -->  
  <Binding channel="16" ctl="33" uri="/route/gain 1"/>
  <Binding channel="16" ctl="34" uri="/route/gain 2"/>
  <Binding channel="16" ctl="35" uri="/route/gain 3"/>
  <Binding channel="16" ctl="36" uri="/route/gain 4"/>
  <Binding channel="16" ctl="37" uri="/route/gain 5"/>
  <Binding channel="16" ctl="38" uri="/route/gain 6"/>
  <Binding channel="16" ctl="39" uri="/route/gain 7"/>
  <Binding channel="16" ctl="40" uri="/route/gain 8"/>
  <Binding channel="16" ctl="32" uri="/route/gain master"/>

<!-- Pan controls. Encoders are mapped to pan direction. -->
  <Binding channel="16" ctl="17" uri="/route/pandirection 1"/>
  <Binding channel="16" ctl="18" uri="/route/pandirection 2"/>
  <Binding channel="16" ctl="19" uri="/route/pandirection 3"/>
  <Binding channel="16" ctl="20" uri="/route/pandirection 4"/>
  <Binding channel="16" ctl="21" uri="/route/pandirection 5"/>
  <Binding channel="16" ctl="22" uri="/route/pandirection 6"/>
  <Binding channel="16" ctl="23" uri="/route/pandirection 7"/>
  <Binding channel="16" ctl="24" uri="/route/pandirection 8"/>
  
<!-- Status controls -->
<!-- Status buttons are mapped to solo toggles.  -->

  <Binding channel="16" ctl="49" uri="/route/recenable 1"/>
  <Binding channel="16" ctl="50" uri="/route/recenable 2"/>
  <Binding channel="16" ctl="51" uri="/route/recenable 3"/>
  <Binding channel="16" ctl="52" uri="/route/recenable 4"/>
  <Binding channel="16" ctl="53" uri="/route/recenable 5"/>
  <Binding channel="16" ctl="54" uri="/route/recenable 6"/>
  <Binding channel="16" ctl="55" uri="/route/recenable 7"/>
  <Binding channel="16" ctl="56" uri="/route/recenable 8"/>

  <Binding channel="16" ctl="57" uri="/route/solo 1"/>
  <Binding channel="16" ctl="58" uri="/route/solo 2"/>
  <Binding channel="16" ctl="59" uri="/route/solo 3"/>
  <Binding channel="16" ctl="60" uri="/route/solo 4"/>
  <Binding channel="16" ctl="61" uri="/route/solo 5"/>
  <Binding channel="16" ctl="62" uri="/route/solo 6"/>
  <Binding channel="16" ctl="63" uri="/route/solo 7"/>
  <Binding channel="16" ctl="64" uri="/route/solo 8"/>

  <Binding channel="16" ctl="65" uri="/route/mute 1"/>
  <Binding channel="16" ctl="66" uri="/route/mute 2"/>
  <Binding channel="16" ctl="67" uri="/route/mute 3"/>
  <Binding channel="16" ctl="68" uri="/route/mute 4"/>
  <Binding channel="16" ctl="69" uri="/route/mute 5"/>
  <Binding channel="16" ctl="70" uri="/route/mute 6"/>
  <Binding channel="16" ctl="71" uri="/route/mute 7"/>
  <Binding channel="16" ctl="72" uri="/route/mute 8"/>
  
  <Binding channel="16" ctl="73" uri="/route/select 1"/>
  <Binding channel="16" ctl="74" uri="/route/select 2"/>
  <Binding channel="16" ctl="75" uri="/route/select 3"/>
  <Binding channel="16" ctl="76" uri="/route/select 4"/>
  <Binding channel="16" ctl="77" uri="/route/select 5"/>
  <Binding channel="16" ctl="78" uri="/route/select 6"/>
  <Binding channel="16" ctl="79" uri="/route/select 7"/>
  <Binding channel="16" ctl="80" uri="/route/select 8"/>
  
  
</ArdourMIDIBindings>

EDIT: Enclosed your code in PREFORMATTED tags (aka three backticks for this forum software) so that it actually could be seen. – Seablade

1 Like

the /route/gain master works, thanks a lot!

now I have to figure out how to make the “select” function work, since I don’t find any “select” command on Ardour manual.

Moreover, the keyboard controller manual says that if I change bank I will have 8 more knobs/faders/etc. for each bank. The only way I can achieve this at the moment is by changing the channel associated to the bank, e.g bank 1 on MIDI 16, bank 2 on MIDI 15 and so on, otherwise with the default settings the banks stay all on channel 16 and it does not work. Do you think it is a good way to configure it?

Great. I’ve already fixed the code so that /bus/... master should work also.

For selection, use:

.... function="select-set" arg="track/bus remote-ID"/>

This is not currently documented. There are also select-add, select-remove, select-toggle functions. Unfortunately you cannot use bank-relative IDs or names for the argument.

It works! Thanks again! :smiley: (but the numbers should start with 0, so the first track is 0, then 1 and so on)

now I have some more things to configure:

  • the banks 1-4 which according to the controller manual should allow to control up to 32 tracks (only the first 8 configured as for now). The only way to make it work I can imagine at the moment is to assign each bank to a different MIDI channel, and then map each control of each channel to tracks 9-16, 17-24 etc., but I don’t know if it is a good way to configure it (for example, in order to share it with others, since the keyboard factory settings should be changed to have the MIDI map working properly)

  • the secondary pad function “sends” which should allow each knob to set the sends level instead of the pan (here too I was thinking of assigning the knobs to another channel to make it work). I guess the command is /route/send/gain right?

  • the controls save, quantize, undo, view (this one to switch between mixer, edit etc.). In this case can the MIDI commands be configured to trigger some Ardour shortcut?

How to handle banking depends entirely on what the device does. Some send precisely the same messages after you have pressed “bank left” or “bank right”. In that case, you need to make the bank buttons tell ardour to change banks. Some devices changes the messages they send for each “strip” after banking. In that case, ardour doesn’t need to know about banking, you just need a bigger binding map.

Your final commands are all handled via the action=“…” binding type. You can find the available action names by running Ardour from the command line with -A which will (eventually) print the full list of all possible actions in a browser window.

And yes, “/route/send/gain ID level” should work for send gains.

1 Like

With Novation Impulse 49, I didn’t manage to bind bank, track and plugin page buttons on Ardour generic midi. The buttons work in HUI protocol (Ableton, Reaper). When I try to connect mackie from Ardour, buttons lit for 4 seconds (try to enter HUI mode), than controller switch to generic midi.

Impulse 49 works only generic midi mode, Midi fader mode button lit.
Mixer fader mode, bank up, bank down, next track, prev track not works.

Midi encoder mode button lit.
Mixer encoder mode, plugin, page up, page down not works.

  1. HUI is similar to Mackie Control Protocol, but not identical.

  2. Ardour does not support random buttons via HUI or MCP. We expect either “an MCP device”, or some random set of MIDI messages. There’s no way to combine both of these ways of working.

I managed to configure banking following the Ardour tutorial, and setting the maximum bank size to 8 with this line: <DeviceInfo bank-size="8"/> so now when I change bank fader 1 controls fader 9 on the DAW and so on. Each track is now mapped as B1, B2 and so on.

But after this the select-set command does not work anymore!!!

I mapped the “sends” button to trigger the sends view (I am mapping in Mixbus primarily)

The only way I had to configure the actions (save, quantize, undo, view) was by moving them to channel 15 otherwise they overlap with the recenable command.

So the MIDI map is almost complete, the only thing missing is the select-set with banks and it would be great if there is some command which allows to switch the view between Rec, Edit, Cue and Mix instead of Main Menu/WindowMenu which doesn’t seem to work.

MIDI map is now as follows:

<?xml version="1.0" encoding="UTF-8"?>
<ArdourMIDIBindings version="1.0.0" name="M-Audio Oxygen Pro 49">
<DeviceInfo bank-size="8"/>    
<!-- 2022 12 04 Francesco Grasselli: Map file creation -->
<!-- Auto-map should be ON -->

<!-- Transport controls -->
  <Binding msg="bf 71 7f"         function="loop-toggle"/>
  <Binding msg="bf 72 7f"         action="Transport/Rewind"/>
  <Binding msg="bf 73 7f"         action="Transport/Forward"/>
  <Binding msg="bf 74 7f"         function="transport-stop"/>
  <Binding msg="bf 75 7f"         function="transport-roll"/>
  <Binding msg="bf 76 7f"         action="Transport/record-roll"/>
  
<!-- Action controls (Pads in DAW mode). -->
  
  <Binding channel="16" ctl="85" action="Mixer/ToggleMixbusPane"/>
  <Binding channel="16" ctl="86" action="Window/toggle-io-plugins"/>
  <Binding channel="16" ctl="87" action="Mixer/ToggleStripBus"/>
  
  <Binding channel="15" ctl="48" action="Common/Save"/>  
  <Binding channel="15" ctl="49" action="Editor/quantize"/>  
  <Binding channel="15" ctl="50" action="Main Menu/WindowMenu"/>  
  <Binding channel="15" ctl="51" action="Editor/undo"/>  
  
<!-- Bank controls. -->
  
  <Binding channel="16" ctl="110" function="prev-bank"/>      
  <Binding channel="16" ctl="111" function="next-bank"/>      
  
<!-- Gain controls. Faders are mapped to faders. -->  
  <Binding channel="16" ctl="33" uri="/route/gain B1"/>
  <Binding channel="16" ctl="34" uri="/route/gain B2"/>
  <Binding channel="16" ctl="35" uri="/route/gain B3"/>
  <Binding channel="16" ctl="36" uri="/route/gain B4"/>
  <Binding channel="16" ctl="37" uri="/route/gain B5"/>
  <Binding channel="16" ctl="38" uri="/route/gain B6"/>
  <Binding channel="16" ctl="39" uri="/route/gain B7"/>
  <Binding channel="16" ctl="40" uri="/route/gain B8"/>
  <Binding channel="16" ctl="32" uri="/route/gain master"/>

<!-- Pan controls. Encoders are mapped to pan direction. -->
  <Binding channel="16" ctl="17" uri="/route/pandirection B1"/>
  <Binding channel="16" ctl="18" uri="/route/pandirection B2"/>
  <Binding channel="16" ctl="19" uri="/route/pandirection B3"/>
  <Binding channel="16" ctl="20" uri="/route/pandirection B4"/>
  <Binding channel="16" ctl="21" uri="/route/pandirection B5"/>
  <Binding channel="16" ctl="22" uri="/route/pandirection B6"/>
  <Binding channel="16" ctl="23" uri="/route/pandirection B7"/>
  <Binding channel="16" ctl="24" uri="/route/pandirection B8"/>
  
<!-- Status controls -->
<!-- Status buttons are mapped to rec, select, mute and solo toggles.  -->

  <Binding channel="16" ctl="49" uri="/route/recenable B1"/>
  <Binding channel="16" ctl="50" uri="/route/recenable B2"/>
  <Binding channel="16" ctl="51" uri="/route/recenable B3"/>
  <Binding channel="16" ctl="52" uri="/route/recenable B4"/>
  <Binding channel="16" ctl="53" uri="/route/recenable B5"/>
  <Binding channel="16" ctl="54" uri="/route/recenable B6"/>
  <Binding channel="16" ctl="55" uri="/route/recenable B7"/>
  <Binding channel="16" ctl="56" uri="/route/recenable B8"/>

  <Binding channel="16" ctl="57" uri="/route/solo B1"/>
  <Binding channel="16" ctl="58" uri="/route/solo B2"/>
  <Binding channel="16" ctl="59" uri="/route/solo B3"/>
  <Binding channel="16" ctl="60" uri="/route/solo B4"/>
  <Binding channel="16" ctl="61" uri="/route/solo B5"/>
  <Binding channel="16" ctl="62" uri="/route/solo B6"/>
  <Binding channel="16" ctl="63" uri="/route/solo B7"/>
  <Binding channel="16" ctl="64" uri="/route/solo B8"/>

  <Binding channel="16" ctl="65" uri="/route/mute B1"/>
  <Binding channel="16" ctl="66" uri="/route/mute B2"/>
  <Binding channel="16" ctl="67" uri="/route/mute B3"/>
  <Binding channel="16" ctl="68" uri="/route/mute B4"/>
  <Binding channel="16" ctl="69" uri="/route/mute B5"/>
  <Binding channel="16" ctl="70" uri="/route/mute B6"/>
  <Binding channel="16" ctl="71" uri="/route/mute B7"/>
  <Binding channel="16" ctl="72" uri="/route/mute B8"/>
  
  <Binding channel="16" ctl="73" function="select-set" arg="0"/>
  <Binding channel="16" ctl="74" function="select-set" arg="1"/>
  <Binding channel="16" ctl="75" function="select-set" arg="2"/>
  <Binding channel="16" ctl="76" function="select-set" arg="3"/>
  <Binding channel="16" ctl="77" function="select-set" arg="4"/>
  <Binding channel="16" ctl="78" function="select-set" arg="5"/>
  <Binding channel="16" ctl="79" function="select-set" arg="6"/>
  <Binding channel="16" ctl="80" function="select-set" arg="7"/>
  
  
</ArdourMIDIBindings>


1 Like

Update: MIDI CC values in the keyboard can be changed so I moved channel 15 CC 48-51 back to channel 16. Now, one must edit them by clicking shift + DAW button on the keyboard before loading the MIDI map, and then again, when editing, make sure to press “Shift + pad N” to trigger the secondary shortcut function instead of the primary pad function (pads no. 13-16 in my case). From there, the CC number which appears on the display can be reassigned as desired. In my case I reassigned them to follow the controls 85-86, that is controls 89-92 (the control 88 has no function on the keyboard so can be assigned to whatever you need). Don’t know why they didn’t set it this way as a factory default though :slight_smile: The situation is now as follows:

  <Binding channel="16" ctl="89" action="Common/Save"/>  
  <Binding channel="16" ctl="90" action="Editor/quantize"/>  
  <Binding channel="16" ctl="91" action="Main Menu/WindowMenu"/>  
  <Binding channel="16" ctl="92" action="Editor/undo"/>  

Now the only things left to configure are the select-set which does not work with the banks and (if it exists) some function to switch the view across Rec, Edit, Cue and Mix

EDIT: select-set now works simply by removing the B before track number; nevertheless, it switches to the next bank when I press the bank button. The view switch can be triggered assigning the pad to the Common/toggle-editor-and-mixer function.

The only thing remaining is that I would like to reconfigure MIDI CC 85-86-87 because they are intended to reroute the knob controls between pan, devices and aux sends, so it should be possible, by pressing MIDI CC 85-86-87, to have the knobs control alternatively the pan (already working), the device controls (not specified on the manual - I was thinking something like Mixer/increment-gain) or the send level. I don’t know if such a function is available in Ardour

1 Like