10
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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

仕様はこちら、
Apple Bluetooth Low Energy MIDI Specification

その仕様によると 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 追加の方法は、

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 は、

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 になるので、前後ひっくり返して...

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 として指定します。

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 をもう一個作ったらうまくいきました。

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
10
Help us understand the problem. What are the problem?