ワンチップ・ボーカロイド eVY1を試してみる(その5)
花岡ちゃんのウィークエンド
今回は、eVY1に歌を歌わせる方法を解説します。
eVY1に歌を歌わせるには、まず、MIDIのシステムエクスクルーシブという特殊なメッセージで、歌詞の一部を送り込みます。この後、MIDIで曲を演奏すると、一音ごとに歌詞がついて演奏される訳です。
おもちゃの電子楽器に、あらかじめ組み込まれた曲を、ボタンを押すごとに一音ずつ演奏するものがありますが、それに似ています。
歌詞は、子音と母音の組み合わせで表現します。MIDI仕様書の34ページに一覧表があります。たとえば「花の街」の歌いだし「なないろのたにをこえて」は、次のような文字列になります。一覧表を見ながら変換しますが、なれてしまえば意外と簡単です。
"n a,n a,i,4 o,n o,t a,J i,o,k o,e,t e"
母音と子音の間は半角のスペースで、音と音の間は","で区切ります。文字列の最後にはヌルコード0x00を置く必要がありますが、文字列には必ず最後にヌルコードが入るので、心配する必要はありません。
この文字列をeVY1に送るシステムエクスクルーシブの仕様は、同じ仕様書の8ページの一番下にある、Phonetic symbolsに記載されています。
いっぺんに送れる歌詞の長さは、仕様書によれば、128バイトです。歌詞の一節ずつ、こまめに送った方がいいようです。
次にシーケンサで定期的に歌詞を送り込む方法について説明します。前の投稿で紹介したスケッチを開いた上で、読んでもらうとわかりやすいと思います。
「楽譜」は、const int hana[]に、74,48,47 のように数値の形で記載されています。これは、音程、音の長さ(ステップタイム)、鍵盤を押している長さ(ゲートタイム)を意味しています。ステップタイムは、四分音符を96にしています。48だと八分音符になります。
以前の投稿でちょっと触れたとおり、ゲートタイムが短いほど鋭いスタッカート奏法になり、ゲートタイムをステップタイムと同じにすると、レガート奏法になります。
シーケンサの関数 void seqence(int chan) は、これを読み込んでeVY1に送る訳です。引数のchanはMIDIチャンネルです。0だとボーカロイド、1だとピアノになるので、歌詞を入れる前は、ピアノ音で譜面データのチェックをするとわかりやすいです。
歌詞は 129,0 のように音程部分に129を入れ、二つ目のパラメータで、歌詞を入れた文字列配列、const char* wordTable[] の「節」を指定します。このコマンドのときに、void wordLoader(int wordseq) で、その節の歌詞を送信します。これを譜面データ、主に小節の始めの部分に、適時入れ込むことで、eVY1を歌わせています。
曲の終わりは、譜面の最後に 128,0,0 を置くことで指定します。シーケンサはここで終了し、メインループに戻ってきます。このスケッチでは、その後無限ループでダイナミックストップするので、もう一回聞くにはリセットボタンを押す必要があります。
駆け足で説明しましたが、あとはスケッチを見てください。とても単純なシーケンサです。そのため、これだけでは、ボーカロイドの歌声は単調です。次回は、一音ごとにベロシティを設定して、「花の街」を、もう少し人間らしく歌わせることに挑戦してみたいと思います。
« ワンチップ・ボーカロイド eVY1を試してみる(その4) | トップページ | ワンチップ・ボーカロイド eVY1を試してみる(おしまい) »
「花岡ちゃんのウィークエンド」カテゴリの記事
- レーザー距離センサVL53L0Xを複数使うには(2022.05.01)
- 【訂正!】PIC24Fでレーザー距離センサVL53L0Xを使う(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(おしまい)(2022.04.14)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その3)(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その2)(2022.04.12)
« ワンチップ・ボーカロイド eVY1を試してみる(その4) | トップページ | ワンチップ・ボーカロイド eVY1を試してみる(おしまい) »
コメント