Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

miyakeryo
アプリケーションエンジニアです。
http://reframe.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした