arduinoでeVY1 Shieldを歌わせてみた

29
ArduinoでeVY1 Shieldを歌わせてみた 2013/11/16 ta9mar

description

Androidの会横浜支部2013/11/16発表資料です

Transcript of arduinoでeVY1 Shieldを歌わせてみた

Page 1: arduinoでeVY1 Shieldを歌わせてみた

ArduinoでeVY1 Shieldを歌わせてみた

2013/11/16 ta9mar

Page 2: arduinoでeVY1 Shieldを歌わせてみた

201311/16

自己紹介

name: たくまー (@ta9mar)

・2.5次元提督

・横浜のandroid系 チーム横音所属

・コピペ・ソルジャー(クラス1st) 

・ITニンジャ(下忍)

浅く広くをモットーに生きています

紹介

Page 3: arduinoでeVY1 Shieldを歌わせてみた

201311/16

今日でてくる用語

● Arduino(アルドゥイーノ)

AVRのマイコンボード。

PICの敵と思って距離をおいていたが、

あまりの簡単さに篭絡されたの巻。

● eVY1 Shield

スイッチサイエンスさんのSHIELD(arduinoの拡張ボード)。

ヤマハ謹製「NSX-1(YMW820)」音源LSI搭載。

「eVocaloid」音源ボード。「General MIDI」音源も

同時に使用する事ができるため、これ1枚で楽器の演奏にあわせて同時に「歌う」事も可能。

今日の主役今日の主役

画像引用http://www.switch-science.com/

用語

Page 4: arduinoでeVY1 Shieldを歌わせてみた

201311/16

今日でてくる用語

● MIDI(Musical Instrument Digital Interface)

30年前からある楽器の通信規格。中身は単純なシリアル通信。31250bps(38400bpsではないので注意)

イベント情報を送って音鳴らしたりする

● (標準)MIDIファイル(.mid)

SMF(Standard MIDI file)

バイナリの楽譜データ。wavのような「音(波形)データ」は入ってない。あくまで音符等の情報。

音源側で音データ持ってて、鳴らしてくれる(音の良さは再生環境依存)

● MML(Music Macro Language)

テキストで表現した簡易的な楽譜データ。

”ドレミファソラシド”⇒”CDEFGABC”みたいな。

詳細は後ほど

用語

Page 5: arduinoでeVY1 Shieldを歌わせてみた

201311/16

今日でてこない用語

● Android

Google謹製のモバイルOS

最近4.4(kitkat)が出たらしいよ?知らんけど

用語

Page 6: arduinoでeVY1 Shieldを歌わせてみた

201311/16

eVY1 shieldの遊び方

2通りの遊びかたがあります。

①PCにつなぐ

PCとUSBで繋ぐとMIDI楽器として認識される

WinだとMediaplayerで.midデータ鳴らすと再生される

あとブラウザ上で歌わせたりできるらしいよ

②Arduinoに載せる

シリアル通信でデータ送り込んで演奏する

今回はこっち。

今回これやります

初め

Page 7: arduinoでeVY1 Shieldを歌わせてみた

201311/16

公式資料

● 公式資料やアプリ(YAMAHA)

http://yamaha-webmusic.github.io/nsx1-apps/manual/

● サンプルスケッチ/midiデータ(スイッチサイエンス)

http://www.switch-science.com/catalog/1490/

資料

Page 8: arduinoでeVY1 Shieldを歌わせてみた

201311/16

サンプルスケッチを見るMMLでかえるのうたを歌うサンプルスケッチ

arduinoとeVY1シールドは31250bpsのシリアル通信でやりとりしている。MIDIの速度ですね!

● MML部分。文字から音程を確定してバイナリで3バイト0x90,key,0x7f(keyが音程Cの時0x3c)送ってる。

このバイナリデータは・・・MIDIメッセージですね!

つまりシリアルでMIDIメッセージそのものを送ってやれば音がなる

Serial.begin(31250);

● char mml[] ="CDEFEDC EFGAGFE";

解析

Page 9: arduinoでeVY1 Shieldを歌わせてみた

201311/16

MIDIの超基本keyとchannel

Key 音階(0-0x7f)

一番低いC(ド)が0、+12すると上のC

基準音(440Hz)のA(ラ)は69。

● channel チャネル(0-15)

1つの楽器に16チャンネル。

ひとつのチャンネルにひとつの楽器を

割り当てられる。途中で楽器変更も可能。

演奏者が16人居ると思えばOK。

ch10(信号上だと9)だけは特別にドラム用。

0 2 4 5 7 9 11 12・・・127

1 3 6 8 10

Ch1ピアノ

Ch2ギター

Ch3弦

Ch10ドラム

Ch15エレピ

・・・ ・・・

前頁の「0x90,0x3c,0x7f」を送信の例      ↑   ↑   ↑強さ127(最強)で      |    60のC(ド)      ch:1にNOTE ON 鳴らす指示

参考

Page 10: arduinoでeVY1 Shieldを歌わせてみた

201311/16

サンプルスケッチを見るMMLでかえるのうたを歌うサンプルスケッチ

歌詞部分。

サンプルでは歌詞はint配列(↑)で

「あ」が1、「い」が2・・・という風に指定

これを「発声文字列」にテーブル(→)で

変換してeVY1に送信!

右が変換テーブル。

MIDI的にはSystemExclusiveで楽器固有メッセージとして送信しているよ。

発音文字列書き方はYAMAHAさんの仕様書内「日本語eVocaloid™Phonetic Alphabet(PA)」を参照。(この変換テーブル少し仕様書より少ないぞ・・・)

//かえるのうたがきこえてくるよint lylics[]={   5,3,42,24,2,15,50,6,9,3,18,7,42,39};

解析

Page 11: arduinoでeVY1 Shieldを歌わせてみた

201311/16

サンプルスケッチを見るMMLでかえるのうたを歌うサンプルスケッチ

● サンプル見て分かったこと

①歌詞をあらかじめ送信しておく

②ch1でNOTE ON(音を鳴らす)するとその音程で歌う

ためしにch2でNOTE ON(0x91)するとピアノの楽器音がなる(歌わない)

● まとめ

①完全にMIDI。MIDIメッセージをシリアルで送ればOK

②歌わせるには事前にSysExで歌詞(発音文字列)を送っておく

③ch1がeVocaloidに割り当てられてる(普通の楽器には使えない)

④ch2以降は普通のMIDI楽器(eVocaloidには使えない)

解析

Page 12: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験1シンセサイザーのMIDI OUTから入力して見る

● そういえばMIDIインターフェースシールド持ってた

arduinoのシリアル送受信を、MIDIの送受信規格に合わせてくれる。

(物理コネクタ形状だけでなく、回路絶縁・電気的に分離して通信する)

● arduinoにeVY1シールド載せて、さらにMIDI-IFシールド載せる3段構成

MIDI-IF

eVY1

arduino

ゴテゴテ!

実験

Page 13: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験1シンセサイザーのMIDI OUTから入力して見る

このゴテゴテしさ・・・

             戦艦 長門級じゃねーか

出典:wikipediahttp://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Japanese_Battleship_Nagato_1944.jpg

長門

Page 14: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験1シンセサイザーのMIDI OUTから入力して見る

シリアル通信ピンをMIDIシールドが使っちゃうので、eVY1はソフトウェアシリアル使うように変更。これでシリアル2つ使える。

(eVY1シールド上のジャンパで、ソフトウェアシリアルにピン変更できるようになってます)

● arduinoから歌詞だけ送って

シンセから出るMIDIメッセージを転送してみる

● ハードシリアルから入った31250bpsデータをそのままソフトウェアシリアルに1バイトずつ流しだすだけで完成

void loop(){ //シリアル受信処理 while(Serial.available()>0){ swSerial.write((byte)Serial.read());//そのまま転送出力 }}

メイン部分これだけ!?

実験

Page 15: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験1シンセサイザーのMIDI OUTから入力して見る

● 結果はこちら

http://init0.net/wp/archives/592

是非皆さんもご家庭の

キーボード・オルガン・電子ピアノなど

MIDI-OUT搭載楽器に繋げてお楽しみください!

                - 第1部艦 -

実験

Page 16: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験1シンセサイザーのMIDI OUTから入力して見る

あんまりご家庭にないです?

端末はそんなにたくさん持ってるのに!?

よろしい、ならばやっぱMMLでしょう

実験

Page 17: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験2MMLをシリアル受信して演奏させる

● いちいち「かえるのうた」サンプルソースに、歌詞・MMLを直書きしてarduionoに書き込みしてたら手軽に楽しめないよ!

歌詞(発音文字列)と、MML文字列を、シリアルで受信して演奏するようにしてみた

⇒arduinoIDEのシリアルコンソールからキーボード入力できるよ

歌詞:

MML:

詳細はこちらに記録済み http://init0.net/wp/archives/596

実験

#k a,e,4 M,n o,M,t a,g a,k' i,k o,e,t e,k M,4 M,j o

CDEFEDC EFGAGFE

先頭#で歌詞指定にしてみた

Page 18: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験3MMLを良くしてみる

かえるの歌サンプルのMMLは、CDEFGAB鳴らすだけ

・1オクターブだけ。変えられない

・半音上げたり下げたりできない

・音の長さ500ms固定(tempo:120)

という残念シンプル仕様

本当はMMLもっと色々できるし、結構遊べるよ?

実験

Page 19: arduinoでeVY1 Shieldを歌わせてみた

201311/16

そういえばMMLといえば・・・

昔MMLをMIDIファイルに変換して鳴らすアプリ作った気がした

                 移植・・・しますか

宣伝

Page 20: arduinoでeVY1 Shieldを歌わせてみた

201311/16

MIDIファイル(SMF)の超基本構造

● ヘッダ情報(MThd)とトラック情報(MTrk)がある● ヘッダ情報にでSMF0/1/2フォーマット指定があって、トラック情

報の構成が変わる。

0:トラック1つしかない簡単構造。おすすめ

1:複数トラック構造。よく使われる。自前で処理するには複雑。

2:見たことない● 演奏に必要ない情報も入ってる(タイトル名)● トラック情報は基本的にはMIDIメッセージを並べて格納してる

一番の違いは時間の概念がある(デルタタイムという可変長の残念フォーマット)

音譜の時間(差分)情報

参考

Page 21: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験3MMLを良くしてみる

MML文字列をより高度に逐次解析して鳴らして見る

【コマンド入力機能】

・先頭に#があると歌詞(発声文字列)入力と認識します

・MMLを入力すると音を鳴らします

・ch切り替えたい(実装予定)

[ソース公開!予定]

eVY1とMMLであそんでみよう!

実験

Page 22: arduinoでeVY1 Shieldを歌わせてみた

201311/16

本実験アプリのMMLの書式

■対応MMLコマンド

 大文字小文字区別しません。どちらでも/混在OK。

・音階 C D E F G A B (ド レ ミ ファ ソ ラ シ ド)

・半音 + # - (音階の後につける)

・休符 R

・明示的音長指定 0-128 (音階(半音)、休符の後につける)

なければLコマンドの音長を使用する

 0を指定した場合、和音指定(次の音が重なる)

・付点 . (音階(半音)、休符の後につける)

・デフォルト音長指定 Ln (n=1-128) default:4(4分音符)

・音量 Vn (n=0-15) default:15(最大)

・オクターブ[絶対指定] On (n=0-9) default:4

・オクターブ[相対指定] > (上げ)

・オクターブ[相対指定] < 下げ)

・テンポ Tn (n=1-255) default:100(100bpm)

・楽器変更 @n (n=0-127) MIDI規定の楽器番号-1を指定(default:0 piano) ※eVocaloidでは無視されるような

MMLにも色々方言があります

実験

Page 23: arduinoでeVY1 Shieldを歌わせてみた

201311/16

本実験アプリのMMLの書式やってみよう

● ch1:eVocaloid、ch2:普通のMidi音源切り替えてみる

● ch2:楽器を変えてみる● ch10:ドラム鳴らして見る

実験

Page 24: arduinoでeVY1 Shieldを歌わせてみた

201311/16

演奏例どんぐりころころ

● 歌詞

● MML

#d o N,g M,4' i,k o,4 o,k o,4 o,d o N,b M,4' i,k o,o,i,k e,J i,h a,m a ,t e,s a,t a,i,h e N\,d o,dZ o,o,g a,d e,t e,k' i,t e,k o J,J i,tS i,w a,b o ,tS a N\,i ,S o,J i,a,s o,b' i,m a,S o

T60L16 G8EEFEDC G8EED8R8 EEGGAA8A >C8<EEG8R8 GGEEFEDC G8EED8R8 G8E8A8GG AABB>C4

・楽譜を見ながらMMLを書くよ

・歌詞を見ながらPA(発声文字列)を書くよ 音符1音に複数発声が当てられてる時はカンマ無しでつなげるよ (さいしょの「ド(d o)ン(N)」の間にカンマないよ) 発音上書き直した方がいいところもあるよ

どんぶりこ・・・?

どんぐりころころどんぶりこおいけにはまってさあたいへんどじょうがでてきてこんにちわぼっちゃんいっしょにあそびましょ

実験

Page 25: arduinoでeVY1 Shieldを歌わせてみた

201311/16

演奏例どんぐりころころ

演奏中・・・

実験

Page 26: arduinoでeVY1 Shieldを歌わせてみた

201311/16

演奏例楽曲だけ入れ替えて見る

● 歌詞(譜面側に合わせて微調整)

● MML(完全入れ替え)

#d o N,g M 4' i,k o,4 o,k o,4 o,o,o,d o N,b M,4' i,k o,o,i,k e,J i,i,h a,m a,a, ,t e,s a,t a,i,h e N\,M,M,M,d o,dZ o,o,g a,d e,t e,k' i,t e,k o,J,J i,tS i,w a,b o,tS a,N\,i,i,S o,J i,a,s o,b' i,m a,S o,d o N,g M 4' i,k o,4 o,k o,4 o,o,o,d o N,b M,4' i,k o,o,i,k e,J i,i,h a,m a,a, ,t e,s a,a,a,t a,i,h e N\

T130L12O4 E2B2A4BRAG4ARB>C2D4<A4B2.ARB>C2D4C4<B4>CR<BA4G4A2E4A4B2. GAB>C2R6<ba6g F+4G4A4>C4 <B2R6A12G6F+ E2R4EF+G A2R6GF+6E D+4E4F+4A4 B2.R4 E2B2A4BRAG4ARB>C2D4<A4B2.ARB>C2D4C4<B4>CR<BA4G4 A4B6AG4F+4 E1

実験

Page 27: arduinoでeVY1 Shieldを歌わせてみた

201311/16

演奏例どんぐり砲戦

演奏中・・・

12.7mm12.7mmどんぐり砲どんぐり砲

12.7mm12.7mmどんぐり砲どんぐり砲35.6mm35.6mm甘栗砲甘栗砲

金剛

Page 28: arduinoでeVY1 Shieldを歌わせてみた

201311/16

実験4その他

・Bluetoothでandroidから演奏できるよ

 コンソールはそのままシリアル送受信に繋がってるので、BluetoothモジュールつけるだけでSPPで繋がるよ

 

  準備間に合いませんでした(><)

・Bluetooth(SPP)なら、iOSからでも簡単に演奏できるかも?しらんけど

大破

Page 29: arduinoでeVY1 Shieldを歌わせてみた

201311/16

おしまい

● 力尽きて実装できなかった機能

・複数ch同時演奏機能。ch:1(eVocaloid)とch:2以降の伴奏を同時演奏する機能

・演奏した歌詞・MMLを不揮発性メモリに記憶して再演奏できる機能

・それを電源入れたときに演奏、ループ再生する機能(PCなくても演奏デモできる)

               いつかがんばるかも?

轟沈