3 title: MIDI Binding Maps
8 <a href="/using-control-surfaces/midi-learn"><dfn>MIDI learning</dfn></a>
9 for more or less any control. This was a nice feature that quite a few other
10 DAWs are providing by now, but it didn't allow Ardour to work "out of the
11 box" with sensible defaults for existing commercial MIDI
12 controllers. In Ardour 3 and later versions, we have augmented the
13 MIDI learn feature with the ability to load a <dfn>MIDI binding map</dfn>
14 for a given controller, which can set up an arbitrary number of physical
15 controls with anything inside Ardour that can be controlled.
18 At this time, these binding maps need to be created with a text editor.
19 Currently, we have presets for:
22 <li>Behringer BCF 2000</li>
23 <li>Korg_nanoKONTROL</li>
24 <li>M-Audio Oxygen 8 v2</li>
26 <li>Behringer DDX3216</li>
27 <li>M-Audio Axiom 25</li>
30 MIDI binding maps are accessible by double-clicking <kbd class="menu">Edit
31 > Preferences > Control Surfaces > Generic MIDI</kbd>. Ardour will
32 retain your selection after you choose one.
35 <h2>Creating new MIDI maps</h2>
36 <h3>The Basic Concept</h3>
38 Since the beginning of time (well, sometime early in the 2.X series),
39 Ardour has had the concept of identifying each track and bus with a
40 <dfn>remote control ID</dfn>. This ID uniquely identifies a track or bus
41 so that when messages arrive from elsewhere via MIDI or OSC , we can determine
42 which track or bus they are intended to control. Ardour has a
44 href="/working-with-tracks/controlling-track-ordering/track-ordering-and-remote-control-ids/">number
45 of ways of assigning remote control IDs</a>, but they don't really matter
46 very much when creating MIDI binding maps, so we won't discuss that here.
47 You just need to know that there is a "first track" and its remote control
50 <h3>Getting Started</h3>
52 MIDI bindings are stored in files with the suffix ".map" attached to their
53 name. The minimal content looks like this:
56 <?xml version="1.0" encoding="UTF-8"?>
57 <ArdourMIDIBindings version="1.0.0" name="The name of this set of
59 </ArdourMIDIBindings>
62 So, to start, create a file with that as the initial contents.
65 On OS X, Ardour loads midi maps from its binary-bundle folder in
66 <code>Ardour-<version>/midi_maps/</code> and checks
67 various other locations as well (defined by the ARDOUR_MIDIMAPS_PATH
68 environment variable). On GNU/Linux the easiest is to save the file to
69 <code>~/.config/ardour3/midi_maps/</code>.
72 <h3>Finding out what your MIDI control surface sends</h3>
74 This is the most complex part of the job, but its still not very hard.
75 You need to connect the control surface to an application that will show
76 you the information that the device sends each time you modify a knob,
77 slider, button etc. There are a variety of such applications (notably
78 <code>gmidimon</code> and <code>kmidimon</code>, but you can actually use
79 Ardour for this if you want. Start Ardour in a terminal window, connect
80 MIDI ports up, and in the Preferences window, enable "Trace Input" on the
81 relevant MIDI port. A full trace of the MIDI data received will show up in
82 the terminal window. (Note: in Ardour3, you get a dedicated, custom dialog
83 for this kind of tracing.)
85 <h3>Types of Bindings</h3>
87 There are two basic kinds of bindings you can make between a MIDI message
88 and something inside Ardour. The first is a binding to a specific parameter
89 of a track or bus. The second is a binding to a function that will change
90 Ardour's state in some way.
92 <h4>Binding to Track/Bus controls</h4>
94 A track/bus binding has one of two basic structures
97 <Binding <em>msg specification</em> uri="<em>... control address ...</em>"/>
98 <Binding <em>msg specification</em> function="<em>... function name ...</em>"/>
101 <h4>Message specifications</h4>
103 You can create a binding for either 3 types of channel messages, or for a
104 system exclusive ("sysex") message. A channel message specification looks
108 <Binding channel="1" ctl="13" ....
111 This defines a binding for a MIDI Continuous Controller message involving
112 controller 13, arriving on channel 1. There are 16 MIDI channels, numbered
113 1 to 16. Where the example above says <code>ctl</code>, you can alternatively
114 use <code>note</code> (to create binding for a Note On message) or
115 <code>pgm</code> (to create a binding for a Program Change message).
118 As of Ardour 4.2, <code>enc-r</code>, <code>enc-l</code>, <code>enc-2</code> and
119 <code>enc-b</code> may be used for surfaces that have encoders that send
120 offsets rather than values. These accept Continuous Controller messages
121 but treat them as offsets. These are good for banked controls as they are
122 always at the right spot to start adjusting. (
123 <a href="/using-control-surfaces/midi-binding-maps/working-with-encoders/">
124 Learn more about working with encoders
128 You can also bind sysex messages:
131 <Binding sysex="f0 0 0 e 9 0 5b f7" ....
132 <Binding sysex="f0 7f 0 6 7 f7" ....
135 The string after the <code>sysex=</code> part is the sequence of MIDI bytes,
136 as hexadecimal values, that make up the sysex message.
139 Finally, you can bind a totally arbitrary MIDI message:</p>
141 <Binding msg="f0 0 0 e 9 0 5b f7" ....
142 <Binding msg="80 60 40" ....
145 The string after the <code>msg=</code> part is the sequence of MIDI bytes, as
146 hexadecimal values, that make up the message you want to bind. Using this is
147 slightly less efficient than the other variants shown above, but is useful for
148 some oddly designed control devices.
152 As of Ardour 4.6 it is possible to use multi-event MIDI strings such as
153 two event CC messages, RPN or NRPN.
157 The <code>sysex=</code> and <code>msg=</code> bindings will only work with
158 <code>function=</code> or <code>action=</code> control addresses. They
159 will <em>not</em> work with the <code>uri=</code> control addresses.
162 <h4>Control address</h4>
164 A <dfn>control address</dfn> defines what the binding will actually control.
165 There are quite a few different things that can be specified here:
167 <dl class="wide-table">
169 <dd>the gain control ("fader") for the track/bus</dd>
171 <dd>the trim control for the track/bus (new in 4.1)</dd>
173 <dd>a toggleable control for solo (and listen) of the track/bus</dd>
175 <dd>a toggleable control to mute/unmute the track/bus</dd>
176 <dt>/route/recenable</dt>
177 <dd>a toggleable control to record-enable the track</dd>
178 <dt>/route/panwidth</dt>
179 <dd>interpreted by the track/bus panner, should control image "width"</dd>
180 <dt>/route/pandirection</dt>
181 <dd>interpreted by the track/bus panner, should control image "direction"</dd>
182 <dt>/route/plugin/parameter</dt>
183 <dd>the Mth parameter of the Nth plugin of a track/bus
185 <dt>/route/send/gain</dt>
186 <dd>the gain control ("fader") of the Nth send of a track/bus</dd>
188 <p>Each of the specifications needs an address, which takes various forms too. For track-level controls (solo/gain/mute/recenable), the address is one the following:</p>
189 <dl class="wide-table">
190 <dt>a number, eg. "1"
192 <dd>identifies a track or bus by its remote control ID
194 <dt>B, followed by a number
196 <dd>identifies a track or bus by its remote control ID within the current bank (see below for more on banks)
198 <dt>one or more words
200 <dd>identifies a track or bus by its name
204 For send/insert/plugin controls, the address consists of a track/bus
205 address (as just described) followed by a number identifying the plugin/send
206 (starting from 1). For plugin parameters, there is an additional third
207 component: a number identifying the plugin parameter number (starting from
211 One additional feature: for solo and mute bindings, you can also add
212 <code>momentary="yes"</code> after the control address. This is useful
213 primarily for NoteOn bindings — when Ardour gets the NoteOn it
214 will solo or mute the targetted track or bus, but then when a NoteOff
215 arrives, it will un-solo or un-mute it.
218 <h4>Bindings to Ardour "functions"</h4>
220 Rather than binding to a specific track/bus control, it may be useful to
221 have a MIDI controller able to alter some part of Ardour's state. A
222 binding definition that does this looks like this:
225 <Binding channel="1" note="13" function="transport-roll"/>
228 In this case, a NoteOn message for note number 13 (on channel 1) will
229 start the transport rolling. The following function names are available:
231 <dl class="narrower-table">
233 <code>transport-stop</code>
235 <dd>stop the transport
238 <code>transport-roll</code>
240 <dd>start the transport "rolling"
243 <code>transport-zero</code>
245 <dd>move the playhead to the zero position
248 <code>transport-start</code>
250 <dd>move the playhead to the start marker
253 <code>transport-end</code>
255 <dd>move the playhead to the end marker
258 <code>loop-toggle</code>
260 <dd>turn on loop playback
263 <code>rec-enable</code>
265 <dd>enable the global record button
268 <code>rec-disable</code>
270 <dd>disable the global record button
273 <code>next-bank</code>
275 <dd>Move track/bus mapping to the next bank (see Banks below)
278 <code>prev-bank</code>
280 <dd>Move track/bus mapping to the previous bank (see Banks below)
284 <h4>Binding to Ardour "actions"</h4>
286 You can also bind a sysex or arbitrary message to any of the items
287 that occur in Ardour's main menu (and its submenus). The best place
288 to look for the (long) list of how to address each item is in your
289 keybindings file, which will contain lines that look like this:
292 (gtk_accel_path "<Actions>/Editor/temporal-zoom-in" "equal")
295 To create a binding between an arbitrary MIDI message (we'll use a
296 note-off on channel 1 of MIDI note 60 (hex) with release velocity
297 40 (hex)), the binding file would contain:
300 <Binding msg="80 60 40" action="Editor/temporal-zoom-in"/>
303 The general rule, when taken an item from the keybindings file and
304 using it in a MIDI binding is to simply strip the
305 <code><Action></code> prefix of the second field in the
306 keybinding definition.
309 <h3>Banks and Banking</h3>
311 Because many modern control surfaces offer per-track/bus controls
312 for far fewer tracks & busses than many users want to control,
313 Ardour offers the relatively common place concept of <dfn>banks</dfn>. Banks
314 allow you to control any number of tracks and/or busses easily,
315 regardless of how many faders/knobs etc. your control surface has.<br />
316 To use banking, the control addresses must be specified using the
317 <dfn>bank relative</dfn> format mentioned above ("B1" to identify
318 the first track of a bank of tracks, rather than "1" to identify
322 One very important extra piece of information is required to use
323 banking: an extra line near the start of the list of bindings
324 that specifies how many tracks/busses to use per bank. If the
325 device has 8 faders, then 8 would be a sensible value to use for
326 this. The line looks like this:</p>
328 <DeviceInfo bank-size="8"/>
331 In addition, you probably want to ensure that you bind something
332 on the control surface to the <code>next-bank</code> and
333 <code>prev-bank</code> functions, otherwise you and other users
334 will have to use the mouse and the GUI to change banks, which
335 rather defeats the purpose of the bindings.
337 <h2>A Complete (though muddled) Example</h2>
339 <?xml version="1.0" encoding="UTF-8"?>
340 <ArdourMIDIBindings version="1.0.0" name="pc1600x transport controls">
341 <DeviceInfo bank-size="16"/>
342 <Binding channel="1" ctl="1" uri="/route/gain B1"/>
343 <Binding channel="1" ctl="2" uri="/route/gain B2"/>
344 <Binding channel="1" ctl="3" uri="/route/send/gain B1 1"/>
345 <Binding channel="1" ctl="4" uri="/route/plugin/parameter B1 1 1"/>
346 <Binding channel="1" ctl="6" uri="/bus/gain master"/>
348 <Binding channel="1" note="1" uri="/route/solo B1"/>
349 <Binding channel="1" note="2" uri="/route/solo B2" momentary="yes"/>
351 <Binding channel="1" note="15" uri="/route/mute B1" momentary="yes"/>
352 <Binding channel="1" note="16" uri="/route/mute B2" momentary="yes"/>
354 <Binding sysex="f0 0 0 e 9 0 5b f7" function="transport-start"/>
355 <Binding sysex="f0 7f 0 6 7 f7" function="rec-disable"/>
356 <Binding sysex="f0 7f 0 6 6 f7" function="rec-enable"/>
357 <Binding sysex="f0 0 0 e 9 0 53 0 0 f7" function="loop-toggle"/>
359 <Binding channel="1" note="13" function="transport-roll"/>
360 <Binding channel="1" note="14" function="transport-stop"/>
361 <Binding channel="1" note="12" function="transport-start"/>
362 <Binding channel="1" note="11" function="transport-zero"/>
363 <Binding channel="1" note="10" function="transport-end"/>
364 </ArdourMIDIBindings>
367 Please note that channel, controller and note numbers are specified as
368 decimal numbers in the ranges 1-16, 0-127 and 0-127 respectively
369 (the channel range may change at some point).