iOS
bluetooth
MIDI
BLE
IoT

MIDI over BLE を試してみる(CoreAudioKit)

本記事は Bluetooth Low Energy Advent Calendar 2014 の1日目の記事となります。


MIDI over Bluetooth LE とは?

今までこうだったのが、

midi_0_r1_c1.jpg

MIDI over BLE によって、こうなります。

midi_1_r1_c1.jpg

どういうことかというと、BLEを使ってワイヤレスでMIDIを送受信できる、ということです。

接続してしまえば、普通のMIDI機器と同等に取り扱えます。


CoreAudioKit

iOS 8 で新規追加されたフレームワーク。

iOS Dev Centerで "CoreAudioKit" で検索しても 「No Documents Found」と言われてしまう(2014年12月1日現在)、謎に包まれたフレームワークです。

midi_2.jpg

個々のクラス名で検索するとかろうじていくつかのドキュメントが引っかかってきますが、その中でちょっとでも全容把握に役立ちそうなのは「iOS 8.0 API Diffs」だけ。。


CoreAudioKit の 全API

クラスは4つしかないので、ここに「iOS 8.0 API Diffs」に載っていた全APIを載せておきます。


CABTMIDICentralViewController.h


  • CABTMIDICentralViewController


CABTMIDILocalPeripheralViewController.h


  • CABTMIDILocalPeripheralViewController


CAInterAppAudioSwitcherView.h


  • CAInterAppAudioSwitcherView

  • -[CAInterAppAudioSwitcherView contentWidth]

  • -[CAInterAppAudioSwitcherView setOutputAudioUnit:]

  • CAInterAppAudioSwitcherView.showingAppNames


CAInterAppAudioTransportView.h


  • CAInterAppAudioTransportView

  • CAInterAppAudioTransportView.connected

  • CAInterAppAudioTransportView.currentTimeLabelFont

  • CAInterAppAudioTransportView.enabled

  • CAInterAppAudioTransportView.labelColor

  • CAInterAppAudioTransportView.pauseButtonColor

  • CAInterAppAudioTransportView.playButtonColor

  • CAInterAppAudioTransportView.playing

  • CAInterAppAudioTransportView.recordButtonColor

  • CAInterAppAudioTransportView.recording

  • CAInterAppAudioTransportView.rewindButtonColor

  • -[CAInterAppAudioTransportView setOutputAudioUnit:]


iOS側の実装

まず CoreAudioKit を import して、

@import CoreAudioKit;

CABTMIDICentralViewController, CABTMIDILocalPeripheralViewController というビューコントローラに遷移できるように実装しておきます。

- (IBAction)centralBtnTapped:(id)sender {

CABTMIDICentralViewController *midiCentralCtr = [[CABTMIDICentralViewController alloc] init];
[self.navigationController pushViewController:midiCentralCtr animated:YES];
}

- (IBAction)peripheralBtnTapped:(id)sender {

CABTMIDILocalPeripheralViewController *midiPeripheralCtr = [[CABTMIDILocalPeripheralViewController alloc] init];
[self.navigationController pushViewController:midiPeripheralCtr animated:YES];
}

どちらも UIViewController のサブクラスで、CABTMIDICentralViewController を使うとアプリはセントラル側としてふるまい、MIDI over BLE をサポートしているペリフェラルデバイスをスキャン、接続することができるようになります。

また CABTMIDILocalPeripheralViewController を使うと、アプリは ペリフェラル側としてふるまい、サービスをアドバタイズ します(=MIDI over BLE をサポートしているセントラルデバイスによって発見・接続できるようになる)。

どちらもパブリックなプロパティ・メソッドは持っていません

とりあえずコードは以上。


Mac側の準備


MIDI Studio の起動

/Applications/Utilities フォルダに、「Audio MIDI 設定.app」というアプリがあるので、起動します。

メニューの、[ウィンドウ] > [MIDI スタジオを表示] から MIDI スタジオを起動します。


スキャン/アドバタイズの開始

Bluetooth の設定アイコンをダブルクリックすると、

midistudio0.jpg

Bluetooth設定ウィンドウが表示されます。

midistudio1.jpg

スキャンは自動的に開始されています。ペリフェラルとしてアドバタイズする場合は、「アドバタイズ」ボタンをクリックします。

midistudio2.jpg

アドバタイズを開始すると、ボタン名が「アドバタイズを停止」に変わります。


接続する:iOS(セントラル)→ Mac(ペリフェラル)

Mac側でアドバタイズを開始し、iOS 側で CABTMIDICentralViewController を表示すると、次のようにペリフェラルである Mac がリストに出てきます。

midi_3.jpg

「i」ボタンをタップすると次のような画面に遷移し、

midi_4.jpg

ConnectのスイッチをOnにすると・・・繋がらない・・・

コンソールには

Connecting to peripheral with UUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ...

と出て、接続を試みてはいるのですが、しばらくするとスイッチが自動的にoffの方に戻ります・・・どなたか接続できない原因/接続方法などわかる方、ご教示いただけますと幸いです・・・!


接続する:Mac(セントラル)→ iOS(ペリフェラル)

iOS側で CABTMIDILocalPeripheralViewController を立ち上げると、次のような画面になります。

midi_5.jpg

「Advertise MIDI Service」セルにあるスイッチをオンにすると、アドバタイズが開始されます。

その後 Mac側のMIDIスタジオの画面を見ると、アドバタイズ開始したiOSデバイスが発見されています。

midistudio3.jpg

ここで「接続」ボタンをクリックすると、iOSデバイス側では CABTMIDILocalPeripheralViewController での STATUS の表示が「Connected to {セントラル名}. Advertising disabled.」に変わり、Mac側では、MIDIスタジオにペリフェラルのアイコンが追加されます。

midistudio4.jpg

この状態で、MIDIデータ出力ポートを選べるMacアプリからMIDIを送信し、

midi_mac.jpg

iOS側ではMIDIを受け取れるアプリで受信すると、

midi_ios.jpg

上記のようにMIDIがワイヤレスで受け取れていることが確認できます。


(追記)

本記事では別アプリを使用しましたが、下記で紹介されているアプリが MIDI over BLE を試すのによさそう。(まだ試してない)


参考資料