nRF51でBLE MIDIをアドバタイズする

BLE MIDI ってのは、Bluetooth SIG で決まってるわけじゃないのでいくつか仕様があるのですが、
今回は iOS の GarageBand と繋げたいので、Apple の BLE MIDI を使います。

仕様はこちら、
[Apple Bluetooth Low Energy MIDI Specification](https://developer.apple.com/bluetooth/Apple-Bluetooth-Low-Energy-MIDI-Specification.pdf)

その仕様によると BLE MIDI の UUID は、

| Name | UUID |
|:-:|:-:|
| Service            | 03B80E5A-EDE8-4B33-A751-6CE34EC4C700 |
| I/O Characteristic | 7772E5DB-3868-4112-A1A9-F2669D106BF3 |

ここまでわかれば、SDK にサンプルとして入ってる ble_nus ( Nordic UART Service ) を、
ちょちょっといじればアドバタイズまではできるはずです。

そして ble_nus の UUID はこちら。

| Name | UUID |
|:-:|:-:|
| Service           | 6E400001-B5A3-F393-E0A9-E50E24DCCA9E |
| TX Characteristic | 6E400002-B5A3-F393-E0A9-E50E24DCCA9E |
| RX Characteristic | 6E400003-B5A3-F393-E0A9-E50E24DCCA9E |

ble_nus.c によると、Service 追加の方法は、

```c
uint8_t         uuid_type;
ble_uuid128_t   nus_base_uuid = {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0,
                                  0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}};
ble_uuid_t      ble_uuid;
uint16_t        service_handle;

// Add custom base UUID.
sd_ble_uuid_vs_add(&nus_base_uuid, &uuid_type);

ble_uuid.type = uuid_type;
ble_uuid.uuid = BLE_UUID_NUS_SERVICE; // 0x0001

// Add service.
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
                         &ble_uuid,
                         &service_handle);

```

Characteristic は、

``` c
ble_gatts_char_md_t      char_md;
ble_gatts_attr_t         attr_char_value;
ble_uuid_t               char_uuid;
ble_gatts_attr_md_t      attr_md;
ble_gatts_char_handles_t rx_handles;

// 省略するけど char_md と attr_char_value をいろいろ設定

char_uuid.type = uuid_type;
char_uuid.uuid = BLE_UUID_NUS_RX_CHARACTERISTIC; // 0x0002;

// Add RX Characteristic.
sd_ble_gatts_characteristic_add(service_handle,
                                &char_md,
                                &attr_char_value,
                                &rx_handles);

```

やり方がわかったので、
これを BLE MIDI に置き換えてみます。
 

まず、Base UUID から
Service UUID の一部を 0 変えたら、
`03B80000-EDE8-4B33-A751-6CE34EC4C700` になるので、前後ひっくり返して...

``` c
ble_uuid128_t   midi_base_uuid = {{0x00, 0xC7, 0xC4, 0x4E, 0xE3, 0x6C, 0x51, 0xA7,
                                   0x33, 0x4B, 0xE8, 0xED, 0x00, 0x00, 0xB8, 0x03}};
```

次に、Service
さっき 0 に変えたところを uuid として指定します。

``` c
ble_uuid.type = uuid_type;
ble_uuid.uuid = 0x0E58;

// Add service.
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
                         &ble_uuid,
                         &service_handle);

```

あとは、Characteristic なんだけど、
Service と Base UUID が違う。

ここで、かなりはまったんだけど。
結局、Base UUID をもう一個作ったらうまくいきました。

``` c
uint8_t         char_uuid_type;
ble_uuid128_t   midi_char_uuid = {{0xF3, 0x6B, 0x10, 0x9D, 0x66, 0xF2, 0xA9, 0xA1,
                                   0x12, 0x41, 0x68, 0x38, 0x00, 0x00, 0x72, 0x77}};
ble_uuid_t      char_uuid;

// Add custom base UUID.
sd_ble_uuid_vs_add(&midi_char_uuid, &char_uuid_type);

char_uuid.type = char_uuid_type;
char_uuid.uuid = 0xE5DB;

```

よかった。
ここまでできたら GarageBand と接続できます。
あとは、Appleの仕様とMIDIの仕様のとおりにノート送ったりするだけなので簡単です。


## なんか作ったよ
BLE MIDI を使って、野菜を楽器にして遊ぶデバイスを作ってみました。
Maker Faire に出したら、ちびっこたちに大人気。
せっかくの無線なのにケーブルいっぱいですみません。

![11825873_1054016321282744_299457450330941207_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/8050/504cb9f1-db06-a000-eedd-1d7dc61e7b07.jpeg)