Download - arduinoでeVY1 Shieldを歌わせてみた
ArduinoでeVY1 Shieldを歌わせてみた
2013/11/16 ta9mar
201311/16
自己紹介
name: たくまー (@ta9mar)
・2.5次元提督
・横浜のandroid系 チーム横音所属
・コピペ・ソルジャー(クラス1st)
・ITニンジャ(下忍)
浅く広くをモットーに生きています
紹介
201311/16
今日でてくる用語
● Arduino(アルドゥイーノ)
AVRのマイコンボード。
PICの敵と思って距離をおいていたが、
あまりの簡単さに篭絡されたの巻。
● eVY1 Shield
スイッチサイエンスさんのSHIELD(arduinoの拡張ボード)。
ヤマハ謹製「NSX-1(YMW820)」音源LSI搭載。
「eVocaloid」音源ボード。「General MIDI」音源も
同時に使用する事ができるため、これ1枚で楽器の演奏にあわせて同時に「歌う」事も可能。
今日の主役今日の主役
画像引用http://www.switch-science.com/
用語
201311/16
今日でてくる用語
● MIDI(Musical Instrument Digital Interface)
30年前からある楽器の通信規格。中身は単純なシリアル通信。31250bps(38400bpsではないので注意)
イベント情報を送って音鳴らしたりする
● (標準)MIDIファイル(.mid)
SMF(Standard MIDI file)
バイナリの楽譜データ。wavのような「音(波形)データ」は入ってない。あくまで音符等の情報。
音源側で音データ持ってて、鳴らしてくれる(音の良さは再生環境依存)
● MML(Music Macro Language)
テキストで表現した簡易的な楽譜データ。
”ドレミファソラシド”⇒”CDEFGABC”みたいな。
詳細は後ほど
用語
201311/16
今日でてこない用語
● Android
Google謹製のモバイルOS
最近4.4(kitkat)が出たらしいよ?知らんけど
用語
201311/16
eVY1 shieldの遊び方
2通りの遊びかたがあります。
①PCにつなぐ
PCとUSBで繋ぐとMIDI楽器として認識される
WinだとMediaplayerで.midデータ鳴らすと再生される
あとブラウザ上で歌わせたりできるらしいよ
②Arduinoに載せる
シリアル通信でデータ送り込んで演奏する
今回はこっち。
今回これやります
初め
201311/16
公式資料
● 公式資料やアプリ(YAMAHA)
http://yamaha-webmusic.github.io/nsx1-apps/manual/
● サンプルスケッチ/midiデータ(スイッチサイエンス)
http://www.switch-science.com/catalog/1490/
資料
201311/16
サンプルスケッチを見るMMLでかえるのうたを歌うサンプルスケッチ
arduinoとeVY1シールドは31250bpsのシリアル通信でやりとりしている。MIDIの速度ですね!
● MML部分。文字から音程を確定してバイナリで3バイト0x90,key,0x7f(keyが音程Cの時0x3c)送ってる。
このバイナリデータは・・・MIDIメッセージですね!
つまりシリアルでMIDIメッセージそのものを送ってやれば音がなる
Serial.begin(31250);
● char mml[] ="CDEFEDC EFGAGFE";
解析
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 鳴らす指示
参考
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};
解析
201311/16
サンプルスケッチを見るMMLでかえるのうたを歌うサンプルスケッチ
● サンプル見て分かったこと
①歌詞をあらかじめ送信しておく
②ch1でNOTE ON(音を鳴らす)するとその音程で歌う
ためしにch2でNOTE ON(0x91)するとピアノの楽器音がなる(歌わない)
● まとめ
①完全にMIDI。MIDIメッセージをシリアルで送ればOK
②歌わせるには事前にSysExで歌詞(発音文字列)を送っておく
③ch1がeVocaloidに割り当てられてる(普通の楽器には使えない)
④ch2以降は普通のMIDI楽器(eVocaloidには使えない)
解析
201311/16
実験1シンセサイザーのMIDI OUTから入力して見る
● そういえばMIDIインターフェースシールド持ってた
arduinoのシリアル送受信を、MIDIの送受信規格に合わせてくれる。
(物理コネクタ形状だけでなく、回路絶縁・電気的に分離して通信する)
● arduinoにeVY1シールド載せて、さらにMIDI-IFシールド載せる3段構成
MIDI-IF
eVY1
arduino
ゴテゴテ!
実験
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
長門
201311/16
実験1シンセサイザーのMIDI OUTから入力して見る
シリアル通信ピンをMIDIシールドが使っちゃうので、eVY1はソフトウェアシリアル使うように変更。これでシリアル2つ使える。
(eVY1シールド上のジャンパで、ソフトウェアシリアルにピン変更できるようになってます)
● arduinoから歌詞だけ送って
シンセから出るMIDIメッセージを転送してみる
● ハードシリアルから入った31250bpsデータをそのままソフトウェアシリアルに1バイトずつ流しだすだけで完成
●
void loop(){ //シリアル受信処理 while(Serial.available()>0){ swSerial.write((byte)Serial.read());//そのまま転送出力 }}
メイン部分これだけ!?
実験
201311/16
実験1シンセサイザーのMIDI OUTから入力して見る
● 結果はこちら
http://init0.net/wp/archives/592
是非皆さんもご家庭の
キーボード・オルガン・電子ピアノなど
MIDI-OUT搭載楽器に繋げてお楽しみください!
- 第1部艦 -
実験
201311/16
実験1シンセサイザーのMIDI OUTから入力して見る
あんまりご家庭にないです?
端末はそんなにたくさん持ってるのに!?
よろしい、ならばやっぱMMLでしょう
実験
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
先頭#で歌詞指定にしてみた
201311/16
実験3MMLを良くしてみる
かえるの歌サンプルのMMLは、CDEFGAB鳴らすだけ
・1オクターブだけ。変えられない
・半音上げたり下げたりできない
・音の長さ500ms固定(tempo:120)
という残念シンプル仕様
本当はMMLもっと色々できるし、結構遊べるよ?
実験
201311/16
そういえばMMLといえば・・・
昔MMLをMIDIファイルに変換して鳴らすアプリ作った気がした
移植・・・しますか
宣伝
201311/16
MIDIファイル(SMF)の超基本構造
● ヘッダ情報(MThd)とトラック情報(MTrk)がある● ヘッダ情報にでSMF0/1/2フォーマット指定があって、トラック情
報の構成が変わる。
0:トラック1つしかない簡単構造。おすすめ
1:複数トラック構造。よく使われる。自前で処理するには複雑。
2:見たことない● 演奏に必要ない情報も入ってる(タイトル名)● トラック情報は基本的にはMIDIメッセージを並べて格納してる
一番の違いは時間の概念がある(デルタタイムという可変長の残念フォーマット)
音譜の時間(差分)情報
参考
201311/16
実験3MMLを良くしてみる
MML文字列をより高度に逐次解析して鳴らして見る
【コマンド入力機能】
・先頭に#があると歌詞(発声文字列)入力と認識します
・MMLを入力すると音を鳴らします
・ch切り替えたい(実装予定)
[ソース公開!予定]
eVY1とMMLであそんでみよう!
実験
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にも色々方言があります
実験
201311/16
本実験アプリのMMLの書式やってみよう
● ch1:eVocaloid、ch2:普通のMidi音源切り替えてみる
● ch2:楽器を変えてみる● ch10:ドラム鳴らして見る
実験
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)」の間にカンマないよ) 発音上書き直した方がいいところもあるよ
どんぶりこ・・・?
どんぐりころころどんぶりこおいけにはまってさあたいへんどじょうがでてきてこんにちわぼっちゃんいっしょにあそびましょ
実験
201311/16
演奏例どんぐりころころ
演奏中・・・
実験
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
実験
201311/16
演奏例どんぐり砲戦
演奏中・・・
12.7mm12.7mmどんぐり砲どんぐり砲
12.7mm12.7mmどんぐり砲どんぐり砲35.6mm35.6mm甘栗砲甘栗砲
金剛
201311/16
実験4その他
・Bluetoothでandroidから演奏できるよ
コンソールはそのままシリアル送受信に繋がってるので、BluetoothモジュールつけるだけでSPPで繋がるよ
準備間に合いませんでした(><)
・Bluetooth(SPP)なら、iOSからでも簡単に演奏できるかも?しらんけど
大破
201311/16
おしまい
● 力尽きて実装できなかった機能
・複数ch同時演奏機能。ch:1(eVocaloid)とch:2以降の伴奏を同時演奏する機能
・演奏した歌詞・MMLを不揮発性メモリに記憶して再演奏できる機能
・それを電源入れたときに演奏、ループ再生する機能(PCなくても演奏デモできる)
いつかがんばるかも?
轟沈