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