2014年1月 日本Androidの会 定例会


2014年1月15日に日本マイクロソフトで開催された日本Androidの会の定例会にて参加しました。
今回のテーマは Android組み込みからMIDI/ボカロへ です。

私も Android でボカロしてみよう というタイトルで講演しました。
講演内容は、APPREVIEWさんで記事にして頂きました。
eVocaloidをArduinoから利用できるeVY1シールドを使って「Androidでボカロしてみよう」

20140115 android controll evy1


Android から eVY1 シールドを制御する (10インチタブレット)


20140115evy1_sample7

Android 端末から eVY1 シールドを制御します。
歌詞入力 を10インチタブレット向けにカスタマイズしたものです

ソースコードは Google Code に置いています。

主な機能
(1) ピアノの鍵盤を模したものを2つ用意しました。
それぞれ楽器とオクターブが選択できます。
異なる楽器を演奏することも、
2オクターブの同じ楽器にすることができます。
(2) 下段にパーカッションのボタンを8個用意しました。
パーカッションの種類を変更することができます。
(3) 上段に歌詞の入力欄に用意しました。
Set ボタンを押すと、入力された歌詞が設定されます。
上側の鍵盤にタッチすると、順番に歌詞を発声します


Android から eVY1 シールドを制御する (SDカード編)


20140115evy1_sample6

SDカード上にある SMF ( Standard MIDI File ) 形式のファイルを解析して、演奏します。
Android 端末の USB-HOST 機能を使っています。

ソースコードは Google Code に置いています。

主な機能
SMFマルチトラック編 とほぼ同じものです。
主な違いは下記の項目です。
(1) MIDIファイルの置き場所を assets から SD カードに変更しました。
(2) SD カードにある任意の MIDI ファイルを演奏できるようにしました。
ディレクトリは /evy1/ です。
(3) Stop のときに、全てのチャネルに Sound Off を送信するようにしました。
(3) USBドライバを USB-MIDI-Driver から 自作のものに変更しました。
参照:Android から USB MIDI 機器を制御する
(4) 非同期タスクを AsyncTask から Loader に変更しました。

参考
SMF ( Standard MIDI File ) – wikipedia
USB-MIDI-Driver


Android から eVY1 シールドを制御する (歌詞入力)


20140114evy1_sampale5

Android 端末から eVY1 シールドを制御します。
歌詞を入力して、ボカロに歌わせます。

ソースコードは Google Code に置いています。

ソースコードの簡単な説明
(1) UI として、ピアノの鍵盤を模したボタンを用意しました。

(2) 歌詞入力の EditView 欄を用意しました。
Set ボタンを押すと、入力された歌詞が設定されます。
鍵盤にタッチすると、順番に歌詞を発声します

(3) 「Vocal ON」と「Piano ON」にチェックすると、Vocaloid と Piano を同時に演奏することができます。


eVY1 のインターフェイスとエンドポイント


20140105usb_sample1_evy1

eVY1 シールドのインターフェイスとエンドポイントを取得します。
ソースコードは 前回のUSB機器 と同じものです。

eVY1の結果
Direction IN が用意されているが、どういう風に使うのかな。

Vendor ID : 10552
Product ID : 258
Interface 0
  Class : Audio Devices
  Subclass : Audio Control
  Protocol : None protocol (0)
Interface 1
  Class : Audio Devices
  Subclass : MIDI Streaming
  Protocol : None protocol (0)
Endpoint 0
  Direction : OUT host to device
  Transfer Type : Bulk
Endpoint 1
  Direction : IN device to host
  Transfer Type : Bulk

参考
Universal Serial Bus Device Class Definition for Audio Devices – usb.org


Android から eVY1 シールドを制御する (キーボード)


20140106evy1_sample4

Android 端末から eVY1 シールドを制御します。
Note On を使ってボカロを鳴らします。
USB MIDI 機器を制御する を eVY1 向けにカスタマイズしたものです。

ソースコードは Google Code に置いています。

eVY1 の簡単な説明
eVY1 は USB MIDI 機器です。
チャネル 0 は、特別で Vocaloid が割り当てられています。
歌詞は、System Exclusive メッセージの Phonetic symbols で設定します。
発音とコードとの関係は、日本語 eVocaloid Phonetic Alphabet に例示があります。
例えば、「あ」は「a」、「く」は「k M」と記述します。
ローマ字に似ていますが、少し違いがあります。
チャネル 0 の Note On メッセージにより一音づつ発声するようです。

ソースコードの簡単な説明
(1) UI として、ピアノの鍵盤を模したボタンを用意しました。
鍵盤の 「C」「D」「E」 にタッチすると、それぞれの音階で「ど」「れ」「み」と発声します。
このサンプルでは、Note On の前に、Phonetic symbols を1音だけ設定しています。

(2) 下段にパーカッションのボタンを用意しました。
例えば、60 にタッチすると、Hi Bongo の音が出ます。

(3) 上段のチャネル選択により、鍵盤の楽器を変更できます。
ch 0 は Vocaloid です。
ch 1 は Piano です。
それ以外のチャネルは、USB MIDI 機器を制御する を参照ください。

(4) 「With Vocal」にチェックすると、Vocaloid と Piano (あるいはチャネル毎の楽器) を同時に演奏することができます。

参考
YMW820 アプリケーションノート – ヤマハ
Android から USB MIDI 機器を制御する ( Program Change )


Android から USB MIDI 機器を制御する ( Program Change )


20140106usb_midi_sample2

Android から USB MIDI 機器を制御します。
Program Change を使って楽器を選択します。

ソースコードは Google Code に置いています。

MIDIの簡単な説明
MIDI には、16個のチャネルがあり、チャネル毎に楽器が選択できます。
Program Change メッセージを使って楽器が選択します。
Program Change は、2バイト構成で、status ( 0xC0 ) + channel、instrument です。
instrument は、楽器の番号で、General MIDI Level 1 Sound Set で規定されています。
チャネル9は、特別にパーカッションが割り当てられています。
音階はなく、note の35から81 に、異なるパーカッションが割り当てられています。
パーカッションの番号は、同じくGeneral MIDI Level 1 Sound Set で規定されています。

ソースコードの簡単な説明
(1) UI として、ピアノの鍵盤を模したボタンを用意しました。
例えば、鍵盤の C にタッチすると、C (ド) の音が出ます。

(2) 下段にパーカッションのボタンを用意しました。
ボタンの番号と楽器の対応は、Percussion Key Map と同じです。
例えば、60 にタッチすると、Hi Bongo の音が出ます。

(3) 上段のチャネル選択により、鍵盤の楽器を変更できます。
このサンプルでは、下記のように割り当てています。
ch 0 : デフォルト
ch 1 : Acoustic Piano
ch 2 : Vibraphone
ch 3 : Drawbar Organ
ch 4 : Acoustic Steel Guitar
ch 5 : Acoustic Bass,
ch 6 : Violin
ch 7 : String Ensemble 1
ch 8 : Trumpet
ch 9 : ※ Acoustic Piano
ch 10 : Tenor Sax
ch 11 : Flute
ch 12 : Banjo
ch 13 : Tinkle Bell
ch 14 : Lead Calliope
ch 15 : Pad Fantasia
※ ch 9 は、Percussion なので、ここを選択すると、ch 1 ( Acoustic Piano ) に変更をしている。

参考
General MIDI Level 1 Sound Set – midi.org
MIDI – wikipedia
General MIDI – wikipedia


Android から USB MIDI 機器を制御する ( Note On )


20140105usb_midi_sampl1_not_connect

Android から USB MIDI 機器を制御します。
Note On を使って音を鳴らします。
Android 端末の USB HOST 機能を使っています。

ソースコードは Google Code に置いています。

MIDI の簡単な説明
Note On メッセージを使って、音を鳴らします。
Note Off メッセージを使って、鳴らした音を止めます。
Note On は、3バイト構成で、status ( 0×90 ) + channel、note、velocity です。
channel は、楽器の選択に使用しますが、このサンプルでは 0 固定です。
velocity は、音量ですが、このサンプルでは 127 (最大) 固定です
note は、音階の番号です。例えば、 60 は C (ド) の音です。

※ velocity の原義は速度です。
打鍵の速さが、音の大きさに比例するので、この名称になっているのかな。

USB MIDI の簡単な説明
MIDIメッセージをUSBで送信するには、先頭に CIN + cable を付加して、4バイト区切りにします。
CIN (Code Index Number ) は、Note On では 0×90 です。
cable は、複数の MIDI 機器を接続したときのケーブルの番号ですが、このサンプルでは 0 固定です。

20140105usb_midi_structure

ソースコードの簡単な説明
(1) UI としてピアノの鍵盤を模したボタンを用意しています。
例えば、C にタッチすると、C (ド) の音が出ます。

(2) Android 端末に USB MIDI 機器を接続します。
(2-1) アクセス許可のポップアップ画面が表示されます。
UsbManager#requestPermission を使用しています。
(2-2)「OK」をクリックして、許可します。
BroadcastReceiver で受け取ります。
(2-3) MIDI 機器であることを確認します。
Class は Audio Devices (1)、Subclass は MIDI Streaming (3) です。
(2-4) 接続されると、coneccted という表示に変わります。

20140105usb_midi_sampl1_permission
20140105usb_midi_sampl1_connected

(3) 鍵盤にタッチすると、MIDI 機器から音が出ます。
(3-1) MIDI メッセージの Note On で音を鳴らして、Note Off で止めます。
note は、鍵盤に対応していて、C は 60 です。
(3-2) MIDI メッセージを 4バイト区切りの USB MIDI の形式に変換します。
(3-3) この4バイトを UsbRequest#queue で送信します。

参考
MIDI Messages – midi.org
Universal Serial Bus Device Class Definition for MIDI Devices – usb.org
MIDI – wikipedia


USB HID 機器のインターフェイスとエンドポイント


20140105usb_sample1_gamepad

USB HID 機器のインターフェイスとエンドポイントを取得します。
ソースコードは 前回のISB機器 と同じものです。

キーボードとマウス
キーボードとマウスは取得できませんでした。
API 16 から追加された android.hardware.input を使用するようです。

ゲームパッド
ゲームパッドは取得できました。
ゲームパッドの結果

Vendor ID : 63334
Product ID : 1
Interface : 0
  Class : HID Human Interface Devices
  Subclass : None Subclass (0)
  Protocol : None protocol (0)
Endpoint 0
  Direction : IN device to host
  Transfer Type : Interrupt

参考
android.hardware.input – Android Developers
Device Class Definition for Human Interface Devices – usb.org


USB 機器のインターフェイスとエンドポイント


20140104usb_sample1

USB ホスト API を使って、USB 機器のインターフェイスとエンドポイントを取得します。

ソースコードは Github に置いています。

中身は、Android Developers の解説に、若干の変更を加えたものです。

(1) 機器の接続と切断は、UsbManager.ACTION_USB_DEVICE_ATTACHED と UsbManager.ACTION_USB_DEVICE_DETACHED のイベントを BroadcastReceiver で受けています。
(2) Vendor ID の一覧は usb.org の Company List に掲載されています。
掲載されていないものの方が多いようですが。
(3) Class は Android API の UsbConstants で定義されています。
(4) Subclass と Protocol は Class 毎に規定されている個別の仕様書を調べる必要があります。
例えば、USBメモリは、Mass Storage Class です。

USBメモリの結果

Vendor ID : ADATA Technology (4703)
Product ID : 0
Interface : 0
  Class : Mass Storage Devices
  Subclass : SCSI transparent command set
  Protocol : BBB Bulk-Only
Endpoint 0
  Direction : OUT host to device
  Transfer Type : Bulk
Endpoint 1
  Direction : IN device to host
  Transfer Type : Bulk

参考
android.hardware.usb – Android Developers
USB ホストとアクセサリ‎ – ソフトウェア技術ドキュメントを勝手に翻訳
Company List – usb.org
Universal Serial Bus Mass Storage Class Specification Overview – usb.org