レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
おちゃめくらぶ掲示板
-
TALK命令でプチコンが棒歌ロイドに!
プチコンmkIIには多くの命令が追加されているけどその中で一番興味を持ったのはTALK
命令なのでまずはそれを使ってみることにしたにょ。
TALK命令は「TALK"コンニチワ"」で簡単に「こんにちわ」としゃべらすことが可能にょ。
確かにいかにも音声合成といった雰囲気の声なのだけど細かい調整でさまざまな変化を
付けることが可能になっているにょ。
アクセントを付けたりとかは当然としてイントネーションも4種類選べたり、声質も
11種類選べたり、しゃべり方(感情表現)も16種類選べるにょ。
それに加えてピッチ(音の高低)は3500段階、速度も1000段階で設定できるにょ。
音声が付くだけで単純なじゃんけんプログラムでも楽しくなってくるし、時計と組み
合わせてしゃべる時計とかタイマー代わりのプログラムを作ることもできるし、すでに
そういうのを実際にたくさん作られているにょ。
ゲームにおいてもさまざまな場面で有効利用できそうだけどまずはピッチが選べると
分かったときから考えていたボーカロイド風のプログラムを作ってみることにしたにょ。
「要するに曲に合わせて歌う」というものにょ。
これは実際はしゃべり方(感情表現)の中に「歌うように」(E16)というのが含まれている
ため歌っているようにしゃべらせることはそれほど難しくはないにょ。
歌わせるためにまず不可欠なのがピッチの数字がどの音程に当てはまるかということを
知ることにょ。
これはプチコン内蔵の電子マニュアルに参考として1オクターブ分の数字が書かれているにょ。
ピッチ
ド(C3) N1447 差
#ド N1510 53
レ N1559 49
#レ N1626 67
ミ N1686 60
ファ N1745 59
#ファ N1792 47
ソ N1858 66
#ソ N1916 58
ラ N1971 55
#ラ N2031 60
シ N2093 62
ド(C4) N2137 44
TALK "@E16@T500@N1447ド@N1559レ@N1686ミ"
これで、「ド・レ・ミ♪」と歌わせることが可能にょ。
あとは、速度Tの値も適当に変えてやれば歌っているようにすることは可能にょ。
実際にこうやってプチコンに歌わせている様子はYouTubeやニコニコ動画に多く投稿されて
いるにょ。
歌だけではなく「曲に合わせて歌わせる」という場合もmkIIで標準でGM音源相当のMML演奏
機能が加わったためにDTMの知識がある人であればかなり凝った音楽も作ることが可能で
あり、素人が楽譜片手に打ち込んでもそれなりにいい感じの音楽を奏でることが可能に
なっているにょ。
そこに歌が加わるのだけど実際のところ歌と曲を合わせるというのは容易ではないにょ。
というのもTの値は1000で1秒少々発音するけどこれはしゃべる言葉によって微妙に変わって
くるため正確な値は分からないにょ。
したがって、BGMを鳴らしながら上記のようにTALKコマンドを羅列すればいいという単純な
ものではなくWAIT命令を駆使してうまくタイミングを取る必要があるにょ。
そこでもっと手軽に歌わせることができるプログラムを考えたにょ。
なぜそこまでWAIT命令を駆使しないとタイミングを合わせられないかというと音楽(BGM)と
歌が非同期だからにょ。
それならば同期させたら良いだけの話にょ。
つまり、mkIIで新規に導入されたBGM演奏用の命令は使用せずに初代で行っていたように
自前のMML演奏ルーチンを使えばいいにょ。
ということで、私は使い慣れている自前のOMPを利用することにしたにょ。
OMPの利点は何度も言っているようにプログラムサイズとデータサイズが小さくできると
いうことにょ。
プログラムサイズにおいてはQRコード対応によってほとんどアドバンテージは無くなった
とはいえ、1画面というサイズに収めるならばOMPを使わないとかなり厳しいのは確かにょ。
単音版OMPは1画面に余裕で収まるサイズ(18行)でテンポや音長指定が自由にできるという
メリットがあるからね。
1画面というプログラムサイズに収めようとするならばピッチは上記の表の値をデータとして
持つのではなく計算式で求めたいところにょ。(というか、1オクターブで収まる歌という
ものはそれほど多くはないためこの範囲外の数値も必要)
ここで問題なのはこの数字をどうやって求めたらよいのかということにょ。
この数字を元に算出する計算式を求めようと半音分の数字の差を求めたにょ。
音の周波数とこの差を見比べればどのような関数になっているかは概ね見当が付くのだけど
差の数字は上に行くごとに小さくなる(大きくなる)もしくは変わらないというのが普通
だけどこれを見ると大きくなったり小さくなったりしているため一定の関数があるわけでは
なくて恐らく実際に発声する音を聞いて数値化したのではないかと思われるにょ。
そうなると単純計算はできなさそうだけどよく見ると上下であまり差がないことを見ると
一次関数的に表せそうにょ。
実際に数字を入力して相関係数を求めてもいいのだけどそこまでする意味はあまりないと
思ったにょ。
まずは絶対的な基準が欲しいけどラの音(440Hz)を基準にしたにょ。
それが1971で半音9個分低いドが1447であるためその差は524となり、半音1つあたりの増加
量は58.222となるにょ。
ここは厳密に求めているわけではないため58とするにょ。
つまり、音程からこのNの値を求める場合は下記のようにすればいいにょ。
Nの値=1971+(ラとの音程の差)×58
これでドの音の数字を計算すると1449になるにょ。
上記の表とくらべると2ほど誤差が出てきているにょ。
単純に考えると3〜4セント(1セント=1/1200オクターブ)くらいの違いがあるかもしれない
けどこの程度の違いならば常人だとほとんど気にならないし、そもそもこの表の数字自体が
感情や話者(声質)によって変わる数字であるため参考数値となっているので厳格にこの
数字の値そのものに拘る必要もないからね。
音程からピッチの数字が求まればあとはそれを利用して「歌のデータ」から歌わせる
ルーチンを作ればいいだけの話にょ。
その歌のデータだけど私は曲と歌(歌詞)は別々のデータとして持つことにしたにょ。
確かに微調整を行うならば同じ方が(1対1の対応が分かりやすいため)有利だけど別々ならば
新規入力時や曲だけ(歌詞だけ)変えるという時に簡単にできるというメリットがあるにょ。
ということでできたのがボーカロイドならぬ棒歌ロイドである「OSP」にょ。
OMPがMusicなのに対してOSPはSongとなっているにょ。(歌も音楽には変わりないけど)
http://ww5.tiki.ne.jp/~ochame/petitcom/1page.htm#osp
http://youtu.be/gFL20YL9TOk
上記の動作中の動画を見てのように一応は歌っているように聞こえると思うにょ。
これより格段にキレイに歌わせている動画はいくつもあるのだけどそれは上記のように
細かい調整を駆使して行っているのに対してこれは何も考えずド素人が簡単に打ち込んで
このレベルで簡単に歌わせることができるというアドバンテージを持つにょ。
このお手軽さこそがOSPの最大の強みにょ。
このように自動的に歌詞データを元に歌わせるというのは難しい技術は全く含まれてない
ために誰かが必ずやると思ったけど私が何とか一番乗りできたにょ。
偶然にも同日に同じく記述式の歌唱プログラムを投稿していた人がいたけど発表はわずか
1時間だけ私の方が早かったため急いで発表して正解だったにょ(笑)
http://www.nicovideo.jp/watch/sm17300108
OSPも決して歌わせ方が上手いわけではないけどそれは調教次第で変わるのではないかと
思っているにょ。(とりあえず一番乗りを目指したので自分自身でそこまで上手く歌える
ように調教してないということもあり、調教したら上手く歌えるようになるかどうかは
分からないけど)
さて、このOSPはやはり歌詞データの構成が非常にシンプルというのがあるにょ。
1つの音符が1つの区切りに対応しているからね。
この処理が容易にできるのも区切りコードの検索がmkIIで新規に導入されたINSTR関数に
よってすごく楽ができるからにょ。(この命令が無かったらFOR〜NEXTでループさせて
1文字ずつMID$で取り出して調べるしかないので1画面化がかなり難しくなった)
その歌詞データとMMLデータの分離のメリット同期の取りやすさだけではなく自由度の
高さがあると思われるにょ。
今回のOSPは私が使い慣れているOMPのエンジンを使ったわけだけどこのバージョンでは
和音演奏機能は備えてないにょ。
単音版OMPは隠し機能として簡易和音演奏機能が使えるのだけどこのOSPでは音符と歌が
一体化しているため音長ゼロの音を出すことができないにょ。
そのため簡易和音演奏を実現するならば音長0の音ならば発声しないというIF文を1つ
追加する必要があるにょ。
また、OMPの和音演奏バージョンと組み合わせることも可能にょ。(それをやっった場合
1画面には収まらなくなるから今回はやらなかったけど)
OSPは簡単にいえば楽器データが歌に変わっただけであり、「1トラックが歌」として
考えれば常時「歌と音楽」の2重和音を行っているようなものだからね。
しかし、これは同じ高さ、同じ長さの音符で演奏して(歌って)いるために基本的に
音ずれがないというメリットがあるにょ。(といってもTALK命令自体に発声する内容に
よってタイムラグがあるため実際は音ずれがないわけではないけど)
複数トラックでの伴奏を付ける場合にはメロディーラインとOSPのメインエンジンを
同期させればOKにょ。
あとOMPに拘る必要もないにょ。
私は楽譜をそのままOMPデータに変換可能(ド→Aという変換をすべて覚えているため)
とはいえ、そんな人は私以外に居るとはとても思えないにょ(笑)
したがって、各自が初代プチコンにおいて自分で作ったものもしくは使い慣れたMML演奏
ルーチンがあるならばそれを利用してOSPで歌わせることも可能にょ。(若干の手直しは
必要だけど)
こういうことができるのもMMLと歌詞データが分離しているお陰にょ。
構想2週間、制作1時間少々というOSP(制作時間よりも公開のための準備をする方が
その何倍も時間がかかっている)だけどこれで完成というわけではなくさらに簡単に
上手く歌えるようなものを考えていきたいにょ。
もちろん1画面という制約の中での話だけどまだ1行余裕があるので改善は可能だと思う
からね。
今回はTALK命令の1つの使い方である歌について書いたけどTALK命令にはまだ様々な
使い方があるので他にも何かいい活用方法がないかも考えたいところにょ。
|
|
|
掲示板管理者へ連絡
無料レンタル掲示板