SlideShare a Scribd company logo
1 of 24
Download to read offline
Android6.0から追加された
MIDI API を使ってみました
MIDIは電子楽器の規格
楽器同士を接続してコントールしたりする
公式リファレンスを見てみる
MidiManager m =
(MidiManager)context.getSystemService(Context.MIDI_SERVICE);
MidiDeviceInfo[] infos = m.getDevices();
ふむふむ
どうやらBLE接続もできるようだ
Using MIDI Over Bluetooth LE
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name=“android.permission.ACCESS_COARSE_LOCATION”/>
Scan for MIDI Devices
MIDI over BTLE UUID = “03B80E5A-EDE8-4B33-A751-6CE34EC4C700"
Open a MIDI Bluetooth Device
m.openBluetoothDevice(bluetoothDevice, callback, handler);
BLE接続で試してみよう
まずこちらを用意しました
MIDI機器とデバイスをワイヤレスで接続
詳しくは mi.1 で調べてみてください
では実装していきます
mi.1をスキャン
BluetoothManager bluetoothManager =

(BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
マネージャー取得
BluetoothAdapter adapter = bluetoothManager.getAdapter();
アダプター取得


BluetoothLeScanner scanner= adapter.getBluetoothLeScanner();
スキャナー取得
scanner.startScan(mScanCallback);
スキャン (permission.ACCESS_COARSE_LOCATIONの許可が必要)

BLEデバイスを取得
private ScanCallback mCallback = new ScanCallback() {



@Override

public void onScanResult(int callbackType, final ScanResult result) {

mHandler.post(new Runnable() {

@Override

public void run() {

BluetoothDevice device = result.getDevice());

}

});

}



@Override

public void onBatchScanResults(List<ScanResult> results) {

}

…

ここからMIDI
MidiManager取得
MidiManager manager = (MidiManager)
context.getSystemService(Context.MIDI_SERVICE);
MIDIデバイスオープン
manager.openBluetoothDevice(bluetoothDevice,
callback, handler);
第一引数に BLEデバイス
第二引数に MidiManager.OnDeviceOpenedListener
第三引数に Handler
MidiDevice取得
midiManager.openBluetoothDevice(bluetoothDevice, new
MidiManager.OnDeviceOpenedListener() {
@Override
public void onDeviceOpened(MidiDevice device) {
if (device == null) {
// 失敗
} else {
// 成功
// deviceからinfoなどが取得できる
// midi信号の送受信を行うにはdeviceからポートを取得
}
}, new Handler(Looper.getMainLooper())
);
midiデバイス情報を見てみる
midiManager.openBluetoothDevice(bluetoothDevice, new
MidiManager.OnDeviceOpenedListener() {
@Override
public void onDeviceOpened(MidiDevice device) {
if (device == null) {
// 失敗
} else {
// 成功
MidiDeviceInfo info = device.getInfo()
}
}, new Handler(Looper.getMainLooper())
);
MidiDeviceInfo#getProperties()
Bundle pr = info.getProperties();
// 製造元
String manufacturer = pr.getString(MidiDeviceInfo.PROPERTY_MANUFACTURER);
// 製品名
String product = pr.getString(MidiDeviceInfo.PROPERTY_PRODUCT);
// 機器名
String name = pr.getString(MidiDeviceInfo.PROPERTY_NAME);
// バージョン
String version = pr.getString(MidiDeviceInfo.PROPERTY_VERSION);
MidiDeviceInfo#getPorts()
MidiDeviceInfo.PortInfo[] portInfos = info.getPorts();
// INポート+OUTポート
String portName = portInfos[0].getName();
int portType = portInfos[0].getType();
// public static final int TYPE_INPUT = 1;
// public static final int TYPE_OUTPUT= 2;
int portNumber = portInfos[0].getNumber();
midi信号を送信
MidiInputPort取得
midiManager.openBluetoothDevice(bluetoothDevice, new
MidiManager.OnDeviceOpenedListener() {
@Override
public void onDeviceOpened(MidiDevice device) {
if (device == null) {
// 失敗
} else {
// 成功
if (info.getInputPortCount() != 0) {
MidiInputPort inputPort = device.openInputPort(0);
}
}
}, new Handler(Looper.getMainLooper()) );
MIDIメッセージ送信
byte[] buffer = new byte[32];
int numBytes = 0;
int channel = 3; // MIDI channels 1-16 are encoded as 0-15.
buffer[numBytes++] = (byte)(0x90 + (channel - 1)); // ノートON
buffer[numBytes++] = (byte)60; // pitch is middle C
buffer[numBytes++] = (byte)127; // max velocity
// MIDIのデータは3バイトで構成
int offset = 0;
try {
inputPort.send(buffer, offset, numBytes);
} catch (IOException e) {
e.printStackTrace();
}
MIDIメッセージ構成
// ステータスバイト MIDIチャンネル 1 - 16
buffer[numBytes++] = (byte)(0x90 + (channel - 1)); // ノートON
8nH 1000 xxxx ノートオフ   盤を離す
9nH 1001 xxxx ノートオン   盤を押す
AnH 1010 xxxx ポリフォニックキープレッシャー
BnH 1011 xxxx コントロールチェンジ
CnH 1100 xxxx プログラムチェンジ  音色を選択
DnH 1101 xxxx チャンネルプレッシャ
EnH 1110 xxxx ピッチベンドチェンジ
// データバイト
buffer[numBytes++] = (byte)60; // 盤の真ん中ら辺のドの音
buffer[numBytes++] = (byte)127; // max velocity
まとめ
• とりあえずBLEでMIDI信号のやりとりをする
だけならGATTサーバーなどの実装は不要
• USB接続時の実装も大体同じ
• mi.1すごい

More Related Content

Viewers also liked

Usecase examples of Packer
Usecase examples of Packer Usecase examples of Packer
Usecase examples of Packer Hiroshi SHIBATA
 
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk SessionPythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk SessionShinichi Nakagawa
 
20160913 cookpad ios_jp
20160913 cookpad ios_jp20160913 cookpad ios_jp
20160913 cookpad ios_jpKazuaki Matsuo
 
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjpShinichi Nakagawa
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practicecch-robo
 
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?ak_shio_555
 
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-Ryutaro Miyashita
 
アクセシビリティはじめました
アクセシビリティはじめましたアクセシビリティはじめました
アクセシビリティはじめましたYuichi Sugiyama
 
BCU30 - Webでできるマルチメディア表現
BCU30 - Webでできるマルチメディア表現BCU30 - Webでできるマルチメディア表現
BCU30 - Webでできるマルチメディア表現Leonardo Ken Orihara
 
DroidKaigi 2017 welcometalk DAY02
DroidKaigi 2017 welcometalk DAY02DroidKaigi 2017 welcometalk DAY02
DroidKaigi 2017 welcometalk DAY02Masahiro Hidaka
 
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介Masataka Kono
 
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiReact Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiYukiya Nakagawa
 

Viewers also liked (13)

Usecase examples of Packer
Usecase examples of Packer Usecase examples of Packer
Usecase examples of Packer
 
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk SessionPythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
Pythonではじめる野球プログラミング PyCon JP 2014 9/14 Talk Session
 
RxSwift x Realm
RxSwift x RealmRxSwift x Realm
RxSwift x Realm
 
20160913 cookpad ios_jp
20160913 cookpad ios_jp20160913 cookpad ios_jp
20160913 cookpad ios_jp
 
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practice
 
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?
 
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
 
アクセシビリティはじめました
アクセシビリティはじめましたアクセシビリティはじめました
アクセシビリティはじめました
 
BCU30 - Webでできるマルチメディア表現
BCU30 - Webでできるマルチメディア表現BCU30 - Webでできるマルチメディア表現
BCU30 - Webでできるマルチメディア表現
 
DroidKaigi 2017 welcometalk DAY02
DroidKaigi 2017 welcometalk DAY02DroidKaigi 2017 welcometalk DAY02
DroidKaigi 2017 welcometalk DAY02
 
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
 
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiReact Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
 

Android midi