1page.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> 35Strictly speaking, MIDI is unrelated to audio. But since MIDI is commonly used with 36music, this article is placed in the audio section. 37</p> 38 39<h2 id="transports">Transports</h2> 40 41<p> 42The physical <a href="http://en.wikipedia.org/wiki/Transport_layer">transport layer</a> 43specified in original MIDI 1.0 is a current loop with 44<a href="http://en.wikipedia.org/wiki/DIN_connector">5-pin DIN</a> connector. 45</p> 46 47<p> 48Since MIDI 1.0, additional transports have been defined, including MIDI over USB 49and a proposed draft for MIDI over 50<a href="http://en.wikipedia.org/wiki/Bluetooth_low_energy">Bluetooth Low Energy</a> (BLE). 51</p> 52 53<h2 id="for-android">MIDI for Android</h2> 54 55<p> 56Android 3.1 and later support 57<a href="http://en.wikipedia.org/wiki/USB_On-The-Go">USB On-The-Go</a>, 58which permits an Android device to act as USB host to drive USB 59peripherals. The USB host mode APIs introduced in Android 3.1 permit 60developers to implement MIDI over USB at the application level, but until 61recently there have been no built-in platform APIs for MIDI. 62</p> 63 64<p> 65Beginning with the Android 6.0 (Marshmallow) release, device makers can enable optional MIDI support in the platform. 66Android directly supports USB, draft BLE, and virtual (inter-app) transports. 67Android indirectly supports MIDI 1.0 via an external adapter. 68</p> 69 70<p> 71For details on application programming with the new MIDI APIs, see the 72<a href="https://developer.android.com/reference/android/media/midi/package-summary.html"><code>android.media.midi</code></a> 73package. 74</p> 75 76<p> 77The remainder of this article discusses how an Android device maker can 78enable MIDI support in the platform. 79</p> 80 81<h2 id="transport">Enabling transports</h2> 82 83<p> 84The implementation depends on ALSA for USB host mode and USB peripheral mode transports. 85ALSA is not used for the BLE and virtual transports. 86</p> 87 88<h3 id="usb-host">USB host mode</h3> 89 90<p> 91To enable MIDI for USB host mode, first support USB host mode in general, and 92then enable <code>CONFIG_SND_RAWMIDI</code> and <code>CONFIG_SND_USB_MIDI</code> in your kernel configuration. 93See <a href="{@docRoot}devices/tech/config/kernel.html">Android Kernel Configuration.</a> 94</p> 95 96<p> 97The MIDI over USB transport is formally defined by the 98<a href="http://www.usb.org/developers/docs/devclass_docs/midi10.pdf"> 99Universal Serial Bus Device Class Definition for MIDI Devices Release 1.0 Nov 1, 1999</a> 100standard published by the 101<a href="http://www.usb.org/">USB Implementers Forum, Inc</a>. 102</p> 103 104<h3 id="usb-peripheral">USB peripheral mode</h3> 105 106<p> 107To enable MIDI for USB peripheral mode, you may need to apply patches 108to your Linux kernel to integrate the 109<code>drivers/usb/gadget/f_midi.c</code> into the USB gadget 110driver. As of this writing, these patches are available for Linux kernel version 1113.10. These patches have not yet been updated for 112<a href="http://en.wikipedia.org/wiki/Configfs">ConfigFs</a> 113(a new architecture 114for USB gadget drivers), nor are they merged at upstream 115<a href="http://kernel.org">kernel.org</a>. 116</p> 117 118<p> 119The patches are shown in commit order for the kernel tree at project <code>kernel/common</code> 120branch <code>android-3.10</code>: 121</p> 122<ol> 123<li><a href="https://android-review.googlesource.com/#/c/127450/">https://android-review.googlesource.com/#/c/127450/</a></li> 124<li><a href="https://android-review.googlesource.com/#/c/127452/">https://android-review.googlesource.com/#/c/127452/</a></li> 125<li><a href="https://android-review.googlesource.com/#/c/143714/">https://android-review.googlesource.com/#/c/143714/</a></li> 126</ol> 127 128<p> 129In addition, the end user must also check the box for MIDI 130in the <em>Settings / Developer options / Networking / Select USB Configuration</em> dialog, 131or by pulling down from the top of screen while attached 132to the USB host, selecting entry "USB for ...", and then choosing <strong>MIDI</strong>. 133</p> 134 135<h3 id="ble">BLE</h3> 136 137<p> 138MIDI over BLE is always enabled, provided the device supports BLE. 139As this transport is in draft status, it is subject to change. 140</p> 141 142<h3 id="virtual">Virtual (inter-app)</h3> 143 144<p> 145The virtual (inter-app) transport is always enabled. 146</p> 147 148<h2 id="claim-feature">Claiming the feature</h2> 149 150<p> 151Applications can screen for the presence of MIDI support using the 152<code>android.software.midi</code> feature. 153</p> 154 155<p> 156To claim MIDI support, add this line to your <code>device.mk</code>: 157</p> 158<pre> 159PRODUCT_COPY_FILES += \ 160frameworks/native/data/etc/android.software.midi.xml:system/etc/permissions/android.software.midi.xml 161</pre> 162 163<p> 164See the 165<a href="{@docRoot}compatibility/android-cdd.pdf">Android Compatibility Definition Document (CDD)</a> 166for information 167on requirements to claim the feature. 168</p> 169 170<h2 id="hostDebugging">Debugging while in host mode</h2> 171 172<p> 173While in USB host mode, Android Debug Bridge (adb) debugging over USB is unavailable. 174See section <a href="http://developer.android.com/tools/help/adb.html#wireless">Wireless usage</a> 175of 176<a href="http://developer.android.com/tools/help/adb.html">Android Debug Bridge</a> 177for an alternative. 178</p> 179