blob: b03ee8002842727c6f5357bb816122e92a578c25 [file] [log] [blame]
Glenn Kasten806a68c2015-05-21 13:03:49 -07001page.title=MIDI
2@jd:body
3
4<!--
5 Copyright 2015 The Android Open Source Project
6
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18-->
19
20<div id="qv-wrapper">
21 <div id="qv">
22 <h2>In this document</h2>
23 <ol id="auto-toc">
24 </ol>
25 </div>
26</div>
27
28<p>
29<a href="http://en.wikipedia.org/wiki/MIDI">MIDI</a> (Musical Instrument Digital Interface)
30is a standard protocol for inter-connecting computers with musical instruments, stage lighting,
31and other time-oriented media.
32</p>
33
34<p>
35The physical <a href="http://en.wikipedia.org/wiki/Transport_layer">transport layer</a>
36specified in original MIDI 1.0 is a current loop with
37<a href="http://en.wikipedia.org/wiki/DIN_connector">5-pin DIN</a> connector.
38</p>
39
40<p>
41Since MIDI 1.0, additional transports have been defined, including MIDI over USB
42and a proposed draft for MIDI over
43<a href="http://en.wikipedia.org/wiki/Bluetooth_low_energy">Bluetooth Low Energy</a> (BLE.)
44</p>
45
46<p>
47Strictly speaking, MIDI is unrelated to audio. But since MIDI is commonly used with
48music, this article is placed in the audio section.
49</p>
50
Clay Murphyfb126fb2015-06-02 15:44:05 -070051<h2 id="for-android">MIDI for Android</h2>
Glenn Kasten806a68c2015-05-21 13:03:49 -070052
53<p>
54Android 3.1 and later support
55<a href="http://en.wikipedia.org/wiki/USB_On-The-Go">USB On-The-Go</a>,
56which permits an Android device to act as USB host to drive USB
57peripherals. The USB host mode APIs introduced in Android 3.1 permit
58developers to implement MIDI over USB at the application level, but until
59recently there have been no built-in platform APIs for MIDI.
60</p>
61
62<p>
Glenn Kastena7790a92015-09-24 14:03:17 -070063Beginning with the Android 6.0 (Marshmallow) release, device makers can enable optional MIDI support in the platform.
Glenn Kasten806a68c2015-05-21 13:03:49 -070064Supported transports include USB, draft BLE, and virtual (inter-app).
65</p>
66
67<p>
Glenn Kastena7790a92015-09-24 14:03:17 -070068For details on application programming with the new MIDI APIs, see the
69<a href="https://developer.android.com/reference/android/media/midi/package-summary.html"><code>android.media.midi</code></a>
70package.
Glenn Kasten806a68c2015-05-21 13:03:49 -070071</p>
72
73<p>
74The remainder of this article discusses how an Android device maker can
75enable MIDI support in the platform.
76</p>
77
Clay Murphyfb126fb2015-06-02 15:44:05 -070078<h2 id="transport">Enabling transports</h2>
Glenn Kasten806a68c2015-05-21 13:03:49 -070079
Glenn Kasten0cd546a2015-08-12 10:47:33 -070080<p>
81The implementation depends on ALSA for USB host mode and USB peripheral mode transports.
82ALSA is not used for the BLE and virtual transports.
83</p>
84
Clay Murphyfb126fb2015-06-02 15:44:05 -070085<h3 id="usb-host">USB host mode</h3>
Glenn Kasten806a68c2015-05-21 13:03:49 -070086
87<p>
88To enable MIDI for USB host mode, first support USB host mode in general, and
Glenn Kasten0cd546a2015-08-12 10:47:33 -070089then enable <code>CONFIG_SND_RAWMIDI</code> and <code>CONFIG_SND_USB_MIDI</code> in your kernel configuration.
90See <a href="{@docRoot}devices/tech/config/kernel.html">Android Kernel Configuration.</a>
Glenn Kasten806a68c2015-05-21 13:03:49 -070091</p>
92
Glenn Kastena7790a92015-09-24 14:03:17 -070093<p>
94The MIDI over USB transport is formally defined by the
95<a href="http://www.usb.org/developers/docs/devclass_docs/midi10.pdf">
96Universal Serial Bus Device Class Definition for MIDI Devices Release 1.0 Nov 1, 1999</a>
97standard published by the
98<a href="http://www.usb.org/">USB Implementers Forum, Inc</a>.
99</p>
100
Clay Murphyfb126fb2015-06-02 15:44:05 -0700101<h3 id="usb-peripheral">USB peripheral mode</h3>
Glenn Kasten806a68c2015-05-21 13:03:49 -0700102
103<p>
104To enable MIDI for USB peripheral mode, you may need to apply patches
105to your Linux kernel to integrate the
106<code>drivers/usb/gadget/f_midi.c</code> into the USB gadget
107driver. As of this writing, these patches are available for Linux kernel version
1083.10. These patches have not yet been updated for
109<a href="http://en.wikipedia.org/wiki/Configfs">ConfigFs</a>
110(a new architecture
111for USB gadget drivers), nor are they merged at upstream
Glenn Kasten0cd546a2015-08-12 10:47:33 -0700112<a href="http://kernel.org">kernel.org</a>.
Glenn Kasten806a68c2015-05-21 13:03:49 -0700113</p>
114
115<p>
Glenn Kasten0cd546a2015-08-12 10:47:33 -0700116The patches are shown in commit order for the kernel tree at project <code>kernel/common</code>
117branch <code>android-3.10</code>:
Glenn Kasten806a68c2015-05-21 13:03:49 -0700118</p>
119<ol>
Glenn Kasten0cd546a2015-08-12 10:47:33 -0700120<li><a href="https://android-review.googlesource.com/#/c/127450/">https://android-review.googlesource.com/#/c/127450/</a></li>
121<li><a href="https://android-review.googlesource.com/#/c/127452/">https://android-review.googlesource.com/#/c/127452/</a></li>
122<li><a href="https://android-review.googlesource.com/#/c/143714/">https://android-review.googlesource.com/#/c/143714/</a></li>
Glenn Kasten806a68c2015-05-21 13:03:49 -0700123</ol>
124
125<p>
126In addition, the end user must also check the box for MIDI
Glenn Kastena7790a92015-09-24 14:03:17 -0700127in the <em>Settings / Developer options / Networking / Select USB Configuration</em> dialog,
Glenn Kasten806a68c2015-05-21 13:03:49 -0700128or by pulling down from the top of screen while attached
Glenn Kastena7790a92015-09-24 14:03:17 -0700129to the USB host, selecting entry "USB for ...", and then choosing <strong>MIDI</strong>.
Glenn Kasten806a68c2015-05-21 13:03:49 -0700130</p>
131
Clay Murphyfb126fb2015-06-02 15:44:05 -0700132<h3 id="ble">BLE</h3>
Glenn Kasten806a68c2015-05-21 13:03:49 -0700133
134<p>
Glenn Kasten0cd546a2015-08-12 10:47:33 -0700135MIDI over BLE is always enabled, provided the device supports BLE.
Glenn Kasten806a68c2015-05-21 13:03:49 -0700136As this transport is in draft status, it is subject to change.
137</p>
138
Clay Murphyfb126fb2015-06-02 15:44:05 -0700139<h3 id="virtual">Virtual (inter-app)</h3>
Glenn Kasten806a68c2015-05-21 13:03:49 -0700140
141<p>
142The virtual (inter-app) transport is always enabled.
143</p>
144
Clay Murphyfb126fb2015-06-02 15:44:05 -0700145<h2 id="claim-feature">Claiming the feature</h2>
Glenn Kasten806a68c2015-05-21 13:03:49 -0700146
147<p>
148Applications can screen for the presence of MIDI support using the
149<code>android.software.midi</code> feature.
150</p>
151
152<p>
153To claim MIDI support, add this line to your <code>device.mk</code>:
154</p>
155<pre>
156PRODUCT_COPY_FILES += \
157frameworks/native/data/etc/android.software.midi.xml:system/etc/permissions/android.software.midi.xml
158</pre>
159
160<p>
161See the
162<a href="{@docRoot}compatibility/android-cdd.pdf">Android Compatibility Definition Document (CDD)</a>
163for information
164on requirements to claim the feature.
165</p>
166
167<h2 id="hostDebugging">Debugging while in host mode</h2>
168
169<p>
170While in USB host mode, Android Debug Bridge (adb) debugging over USB is unavailable.
171See section <a href="http://developer.android.com/tools/help/adb.html#wireless">Wireless usage</a>
172of
173<a href="http://developer.android.com/tools/help/adb.html">Android Debug Bridge</a>
174for an alternative.
175</p>