2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリー

ブログパーツ

無料ブログはココログ

« 2013年10月 | トップページ | 2013年12月 »

2013年11月

2013年11月28日 (木)

eVY1+Arduinoで打ち込み歌謡曲

花岡ちゃんのウィークエンド

eVY1をテストして、なんとかそれなりに歌わせるところまではできました。でも、せっかくGM音源が内蔵されているのに、なんのテストもしていません。どうもモヤモヤします。

そこで、思い切ってArduinoでマルチトラックのシーケンサを作り、伴奏付きで歌わせてみることにしました。実際のところ、そんなものを作っても使い道はあまりありませんが。

作ったのは8チャンネルのモノフォニックシーケンサです。チャンネルに和音の記述が出来ないという意味での「モノフォニック」です。もっとも、eVY1内蔵のGM音源はマルチチェンバーなので、工夫すれば1チャンネルで和音を出すことも出来ます。

とりあえずお聞きください。曲は69年のヒット歌謡曲「あなたの心に」のサワリです。オリジナルの耳コピです。
サウンドはベリンガーのUSBミキサーで直接録音してみました。結構いい音で入っています。ステレオになってますので、ヘッドホンで聞いてみてください。

たかがこれだけのことに、結構苦労しました。ボーカロイドに歌ってもらうのは、なかなか大変です。
参考のためにスケッチを公開します。

「new_eVY1_seq.zip」をダウンロード

これは、解説なしではわかりにくいので、次回解説します。

2013年11月16日 (土)

eVY1に上手に歌ってもらうには

花岡ちゃんのウィークエンド

eVY1は音素片合成なので、上手に歌ってもらうには、イロイロとノウハウがあるようです。今回の実験で気づいたコトを、すこしばかりメモしておきます。

■促音を出すには
昔、SC-01という英語の音素片合成のICがあり、これをPC8801のプリンタポートにつないで、日本語を無理矢理発音させたことがありました。たしかLogin誌に製作記事が載っていたのだと思います。英語の音素ばかりなので、「はぁじぃめ まぁしぃて」なんて感じで、なるほど、外人さんが喋ってるみたいになるもんだなと感心したことを覚えています。そのときは、促音を数百msの無音時間を挟むことで実現していました。
eVY1でも理屈は同じです。花の街の「わになって」の部分は、「な」の音を、ゲートタイムを短くしてスタッカートにし、「て」の音につなげているだけです。
eVY1シールドをパソコンにつないでMIDIシーケンサで鳴らす場合は、「な」の音を短めにして休符をいれればいいでしょう。

■鼻音には要注意
レガートで演奏していると、歌詞が思ったように発音されないことがあります。花の街の「なないろ」の部分は、レガートで歌わせると「なあいろ」になってしまいます。これは、鼻音が前音の母音にかくれてしまって聞き取れないからです。「や」「な」などは子音が弱いので、こういうことが起りがちです。対処法は、促音と同じで、前の音との間に無音時間を挟めばOKです。この場合の無音時間は、促音の時より、ずっと短い時間で大丈夫です。
これは人間が歌を歌う場合でも同じで、「なな」や「やま」などはしっかり発音しないと「なあ」「やわ」なんて聞こえます。独唱の場合は気をつければすぐになおるのですが、合唱では、ひとりひとりが同じように発音し、なおかつタイミングもぴたりと合わなければならないので、かなり大変です。
僕は、中学の時に、合唱部に所属していたので、こういったハナシはとても懐かしいですね。

【後日追加】Arduinoでマルチトラックシーケンサーを作って、「あなたの心に」を伴奏付きで演奏してみました。まだ最後の部分などはことばが聞き取りづらいですが、伴奏のせいかかなりまともに聞こえます。
演奏動画はこちら

2013年11月10日 (日)

ワンチップ・ボーカロイド eVY1を試してみる(おしまい)

花岡ちゃんのウィークエンド

シーケンサを手直しして、一音ずつにベロシティを付けられるようにしました。
譜面の、音程、ステップタイム、ゲートタイムの後に、ベロシティを追加し、いままで127(最大音量)で送っていたMIDIデータに、これを乗せるようにしました。詳しくはスケッチを見てください。
eVY1_hananomachi_vol.ino をダウンロード

例によって「花の街」に強弱を付けてみました。合唱団のように大げさなクレッシェンド・デクレッシェンドを付けると、ラジオのフェージングみたいになってしまいまして、この辺は抑えめにしてあります。主に、歌詞の始めと終わりを弱めにすることで、言葉を自然にするようにつとめました。こんな感じです。(残念ながら、この動画だと、前の演奏と違いはわかりにくいみたいです… スケッチを実行してもらった方がわかりやすいようです。)

アカペラの独唱としては、僕のセンスではこんなもののようです。

次にシーケンサの追加説明をします。
スケッチの最初の部分で、シーケンサのグローバル変数を設定しています。
tempoは曲のテンポを決めますが、あまり細かく調整できません。このシーケンサの最大の欠点です。
transposeはその名の通り、曲の移調です。12で1オクターブ動きます。
startFromは楽譜hana[]のスタートバイトを決めるものです。途中から再生したい場合に使います。

最後に曲の作り方を解説します。

1:譜面を用意し、印刷する。
2:あとでわかりやすいように小節に番号を振り、音程とステップタイム(今回は四分音符が96)を譜面に書き込む。
Dscn2677
3:書き込みを見ながら、hana[]に楽曲データを入力する。ベロシティの初期値は63にする。
4:loop()のseqence(0)をseqence(1)にしてピアノ音に切り替え、入力したデータを確認する。
5:歌詞データを発音記号になおしながら、wordTable[]に入力。
6:ボーカロイドに切り替え、ゲートタイム、ベロシティの順にチューニングする。

てな感じです。

GM音源のテストなどをしていないので、ちょっと不完全燃焼気味ですが、とりあえず今回の検証作業はおしまいにします。この素材は、いずれ、なかなか進まない「ABCは知ってても」のカテゴリで応用できるのではないかと思っています。

2013年11月 8日 (金)

ワンチップ・ボーカロイド 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 を置くことで指定します。シーケンサはここで終了し、メインループに戻ってきます。このスケッチでは、その後無限ループでダイナミックストップするので、もう一回聞くにはリセットボタンを押す必要があります。

駆け足で説明しましたが、あとはスケッチを見てください。とても単純なシーケンサです。そのため、これだけでは、ボーカロイドの歌声は単調です。次回は、一音ごとにベロシティを設定して、「花の街」を、もう少し人間らしく歌わせることに挑戦してみたいと思います。

2013年11月 7日 (木)

ワンチップ・ボーカロイド eVY1を試してみる(その4)

花岡ちゃんのウィークエンド

今回は、歌詞を入れる話を投稿しようかと思っていたのですが、前回のMIDI解説を読み直していたところ、レガートがうまくいかない理由に思い当たりました。ブログは人のためならず、ですねえ。

さっそく、スケッチを修正して、「花の街」に再挑戦しました。

前回に比べると、だいぶ滑らかになっているのではないでしょうか。

もう20年以上前になりますが、マイコン(HD6301)でMIDI楽器を鳴らす仕事をしたことがあります。そのとき、レガートに演奏させようと、鍵盤を放すイベントのすぐ後に鍵盤を押すイベントを入れたところ、「音が遅れる」感じになってしまいました。結局、鍵盤を放すイベントを抜いて、押すイベントだけで構成すると、レガート奏法にすることが出来ました。
これを思い出した訳です。

スケッチを調べてみると、ゲートタイム経過後に、必ず鍵盤を放すイベントを送るようになっていました。レガートにするつもりで、ゲートタイムをステップタイムと同じにしても、このイベントは送られます。そこで、その場合は鍵盤を放すイベントを送らないようにしました。

【後日追加】これは音源がシングルチェンバー(単音)か、マルチチェンバーでも、ギターのようにサスティンレベルが0の音の場合です。そうでない場合は、発音した音程で鍵盤を放すイベントをおくらないと、その音が出たままになってしまいます。

新しいスケッチはこれです。

eVY1_hananomachi_new.inoをダウンロード

2013年11月 5日 (火)

ワンチップ・ボーカロイド eVY1を試してみる(その3)

花岡ちゃんのウィークエンド

今回は、前回アップした簡易シーケンサについて説明します。

eVY1シールドはMIDIで動かすので、まずはMIDIの話を少し。
MIDIは電子楽器などの制御用に開発された、通信のソフト・ハードの仕様です。80年代に制定され、その後30年の永きにわたって、スタンダードフォーマットとして使われてきました。最近、MIDI制定に尽力したRolandの社長さんに、グラミー賞が授与されて話題になりましたね。

eVY1を搭載しているデバイス、NSX-1のMIDI仕様書を使って説明します。
MIDIで曲を演奏するだけなら、仕様書の1ページ目にあるChannel MessageのKey ONイベントだけでOKです。イベントのフォーマットは下記の通りで、3バイトのデータで構成されています。

0x9n 0xKK 0xVV

0x9n -> チャンネル n をKey ON
0xKK -> 音程を示す数値 0x00-0x7F
0xVV -> 音量(ベロシティ)を示す数値 0x00-0x7F

最初のバイトはStatus byteと言って、発音開始などのコマンドとして機能します。それ以降のバイトがパラメータで、音程などの情報を送ります。Status byteは、必ず最上位ビットが1で、パラメータはこれが0です。最上位ビットはコマンドか数値かの識別に使われている訳です。そのため、送ることの出来る数値の範囲は0-127となります。

Status byteの下位4ビットはチャンネル番号です。おおざっぱに言うと、一本のMIDI通信線にチャンネル番号の異なる、最大16台の楽器が接続でき、この番号でメッセージを送る楽器を選択できます。eVY1シールドのように、一つのモジュールに複数の音源が入っているものでも、内部的に、それぞれの音源にチャンネルが割当られています。

音を鳴らすには、ベロシティに0以外の数値を入れてKey ONイベントを送ります。これはピアノなら、鍵盤を押し下げたイベントに相当します。ベロシティは鍵盤を押し下げる早さです。これはつまり鍵盤を叩く強さで、音の大きさを意味しています。もちろん、数値が大きい方が音量が大きくなります。
同じイベントをベロシティ0で送ると、鍵盤を放したイベントを意味します。

音程も同様に数値で表現します。下記のように鍵盤に数値が割り当てられている、と考えるとわかりやすいでしょう。

Photo

もちろん、上下のオクターブも、同じように順番に数値が割り当てられています。つまり、図のドの1オクターブ下は62になります。

今回このキーでやってみましたが、実際のところ1オクターブ下の方がいいみたいです。そんなとき、プログラム内部で12を引いてやることで、簡単に移調が出来るのがこの方式の利点です。

MIDIの説明が長くなってしまいました。でも、この話をしておかないと、後の説明がわかりにくいので、やむを得ません。次回は歌詞をeVY1に送る方法について解説します。

2013年11月 3日 (日)

ワンチップ・ボーカロイド eVY1を試してみる(その2)

花岡ちゃんのウィークエンド

入手したeVY1シールドは、MIDIでデータを送ると演奏するようになっているので、アルディーノで簡単なシーケンサを作り、アカペラで歌わせてみました。まずは、この動画です。

声質はやや固めで、華やかなアニメ声とは少し違う感じがします。そういうわけで、昔の女学生が歌うような曲を歌わせてみました。
レガートに歌わせるのは、ちょっと難しいみたいで、こんな風にスタッカート気味で歌わせた方が、もたつきません。アカペラだとすこしばかり不自然な感じもしますが、伴奏がつけばもっとよくなるでしょう。
【後日追加】実はMIDIデータの送り方が悪く、レガートが苦手になっていました。eVY1の実力はもっとちゃんとしています。後ほど歌う動画と改訂版のスケッチを、ここにリンクします。 →こちらが改訂版の動画とスケッチです

アルディーノに組み込んだシーケンサは単音のものですが、ピッチ、ステップタイム、ゲートタイムの3つを指定できるようになっています。本宅にはこんなものがあるくらいですから、その辺は手慣れたもんです。

Img_0280

試した限りでは、譜面に歌詞を合わせただけだと、あまり出来がよくありません。とくに、早いフレーズはゲートタイムの調整などのチューニングが必要です。サンプル曲も、テンポがゆっくりな「花の街」より、16分音符のおおい「春の日の花と輝く」の方が、チューニングの効果がありました。

とりあえず、それぞれのサンプルスケッチを公開します。いずれも、ロードしてリセットすれば、5秒後に歌いだします。

eVY1_hananomachi_tuned.ino(花の街)をダウンロード
eVY1_harunohi.ino(春の日に花と輝く)をダウンロード

スケッチの解説は次回に。

2013年11月 1日 (金)

ワンチップ・ボーカロイド eVY1を試してみる(その1)

花岡ちゃんのウィークエンド

ボーカロイドをワンチップに収めたヤマハのデバイス、eVY1をアルディーノのシールドに仕立てたものを入手しました。おなじみスイッチサイエンスの商品です。

詳しい説明はこちらのサイトがわかりやすいと思います。

アルディーノ・ウノも同時に購入し、サンプルスケッチを試してみました。

Dscn2676

ステレオミニジャックの出力レベルが不明ですが、とりあえずミニスピーカーを接続すると、かすかに「カエルの歌」が聞こえてきます。ヘッドホンなら十分な音量です。

ただ、サンプルスケッチをいったん終了し、次に電源を入れても、うんともすんとも言いません。アルディーノからシリアルデータは送られているようですが‥ いろいろ調べたところ、eVY1シールドがリセット中にデータを送っているのがまずいようです。
そこで、リセット後、eVY1の初期化を待ってから「カエルの歌」のmidiデータを送るように修正したら、うまくいくようになりました。setup()にdelay(5000)を追加しただけです。
改良版のスケッチを参考のため公開します。

「eVY1_MML_sample_hana.ino」をダウンロード

起動すると5秒待ってから、曲が始まります。

今日からヤマハのサポートサイトもオープンしたので、「歌う組み込み音声合成」としての可能性を調べてみたいと思います。次回は、もうちょっとちゃんとした曲を、アルディーノから歌わせてみましょう。

« 2013年10月 | トップページ | 2013年12月 »