以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図1は、電子鍵盤楽器の一実施形態100の外観例を示す図である。電子鍵盤楽器100は、演奏操作子としての複数の鍵からなる鍵盤101と、音量の指定、ソング再生のテンポ設定、ソング再生開始、伴奏再生等の各種設定を指示する第1のスイッチパネル102と、ソングや伴奏の選曲や音色の選択等を行う第2のスイッチパネル103と、ソング再生時の歌詞、楽譜や各種設定情報を表示するLCD104(Liquid Crystal Display:液晶ディスプレイ)等を備える。また、電子鍵盤楽器100は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、又は背面部等に備える。
図2は、図1の電子鍵盤楽器100の制御システム200の一実施形態のハードウェア構成例を示す図である。図2において、制御システム200は、CPU(中央演算処理装置)201、ROM(リードオンリーメモリ)202、RAM(ランダムアクセスメモリ)203、音源LSI(大規模集積回路)204、音声合成LSI205、図1の鍵盤101、第1のスイッチパネル102、及び第2のスイッチパネル103が接続されるキースキャナ206、及び図1のLCD104が接続されるLCDコントローラ208が、それぞれシステムバス209に接続されている。また、CPU201には、自動演奏のシーケンスを制御するためのタイマ210が接続される。更に、音源LSI204及び音声合成LSI205からそれぞれ出力される楽音出力データ218及び歌声音声出力データ217は、D/Aコンバータ211、212によりそれぞれアナログ楽音出力信号及びアナログ歌声音声出力信号に変換される。アナログ楽音出力信号及びアナログ歌声音声出力信号は、ミキサ213で混合され、その混合信号がアンプ214で増幅された後に、特には図示しないスピーカ又は出力端子から出力される。
CPU201は、RAM203をワークメモリとして使用しながらROM202に記憶された制御プログラムを実行することにより、図1の電子鍵盤楽器100の制御動作を実行する。また、ROM202は、上記制御プログラム及び各種固定データのほか、歌詞データ及び伴奏データを含む曲データを記憶する。
CPU201には、本実施形態で使用するタイマ210が実装されており、例えば電子鍵盤楽器100における自動演奏の進行をカウントする。
音源LSI204は、CPU201からの発音制御指示に従って、例えば特には図示しない波形ROMから楽音波形データを読み出し、D/Aコンバータ211に出力する。音源LSI204は、同時に最大256ボイスを発振させる能力を有する。
音声合成LSI205は、CPU201から、歌詞のテキストデータと音高と音長と開始フレームに関する情報を歌声データ215として与えられると、それに対応する歌声の音声データを合成し、D/Aコンバータ212に出力する。
キースキャナ206は、図1の鍵盤101の押鍵/離鍵状態、第1のスイッチパネル102、及び第2のスイッチパネル103のスイッチ操作状態を定常的に走査し、CPU201に割り込みを掛けて状態変化を伝える。
LCDコントローラ208は、LCD104の表示状態を制御するIC(集積回路)である。
図3は、図2の音声合成LSI205の構成例を示すブロック図である。この音声合成LSI205は、後述するソング再生処理により図2のCPU201から指示される歌声データ215を入力することにより、例えば下記文献に記載の「深層学習に基づく統計的音声合成」の技術に基づいて、歌声音声出力データ217を合成し出力する。
(文献)
橋本佳,高木信二「深層学習に基づく統計的音声合成」日本音響学会誌73巻1号(2017),pp.55−62
音声合成LSI205は、音声学習部301と音声合成部302を含む。音声学習部301は、学習用テキスト解析部303と学習用音響特徴量抽出部304とモデル学習部305とを含む。
学習用テキスト解析部303は、歌詞テキストと音高と音長を含む学習用歌声データ311を入力してそのデータを解析する。この結果、学習用テキスト解析部303は、学習用歌声データ311に対応する音素、品詞、単語、音高などを表現する離散数値系列である学習用言語特徴量系列313を推定して出力する。
学習用音響特徴量抽出部304は、上記歌詞テキストを或る歌手が歌うことによりマイク等を介して集録された学習用歌声音声データ312を入力して分析する。この結果、学習用音響特徴量抽出部304は、学習用歌声音声データ312に対応する音声の特徴を表す学習用音響特徴量系列314を抽出して出力する。
モデル学習部305は、下記(1)式に従って、学習用言語特徴量系列313(これを
と置く)と、音響モデル(これを
と置く)とから、学習用音響特徴量系列314(これを
と置く)が生成される確率(これを
と置く)を最大にするような音響モデル
を、機械学習により推定する。即ち、テキストである言語特徴量系列と音声である音響特徴量系列との関係が、音響モデルという統計モデルによって表現される。
モデル学習部305は、(1)式によって機械学習を行った結果算出される音響モデル
を表現するモデルパラメータを学習結果315として出力し、音声合成部302内の音響モデル部306に設定する。
音声合成部302は、テキスト解析部307と音響モデル部306と発声モデル部308とを含む。音声合成部302は、歌詞テキストを含む歌声データ215に対応する歌声音声出力データ217を、音響モデル部306に設定された音響モデルという統計モデルを用いて予測することにより合成する、統計的音声合成処理を実行する。
テキスト解析部307は、自動演奏に合わせた演奏者の演奏の結果として、図2のCPU201より指定される歌詞のテキストデータと音高と音長と開始フレームに関する情報を含む歌声データ215を入力し、そのデータを解析する。この結果、テキスト解析部307は、歌声データ215に対応する音素、品詞、単語などを表現する言語特徴量系列316を解析して出力する。
音響モデル部306は、言語特徴量系列316を入力することにより、それに対応する音響特徴量系列317を推定して出力する。即ち音響モデル部306は、下記(2)式に従って、テキスト解析部307から入力する言語特徴量系列316(これを再度
と置く)と、モデル学習部305での機械学習により学習結果315として設定された音響モデル
とに基づいて、音響特徴量系列317(これを再度
と置く)が生成される確率(これを
と置く)を最大にするような音響特徴量系列317の推定値
を推定する。
発声モデル部308は、音響特徴量系列317を入力することにより、CPU201より指定される歌詞テキストを含む歌声データ215に対応する歌声音声出力データ217を生成する。歌声音声出力データ217は、図2のD/Aコンバータ212からミキサ213及びアンプ214を介して出力され、特には図示しないスピーカから放音される。
学習用音響特徴量系列314や音響特徴量系列317で表される音響特徴量は、人間の声道をモデル化したスペクトル情報と、人間の声帯をモデル化した音源情報とを含む。スペクトルパラメータとしては例えば、メルケプストラムや線スペクトル対(Line Spectral Pairs:LSP)等を採用できる。音源情報としては、人間の音声のピッチ周波数を示す基本周波数(F0)を採用できる。発声モデル部308は、音源生成部309と合成フィルタ部310とを含む。音源生成部309は、音響モデル部306から入力する音源情報319の系列を順次入力することにより、例えば、音源情報319に含まれる基本周波数(F0)で周期的に繰り返され、音源情報319に含まれるパワー値を有するパルス列(有声音音素の場合)、又は音源情報319に含まれるパワー値を有するホワイトノイズ(無声音音素の場合)からなる音源信号を生成する。合成フィルタ部310は、音響モデル部306から順次入力するスペクトル情報318の系列に基づいて声道をモデル化するデジタルフィルタを形成し、音源生成部309から入力する音源信号を励振源信号として、デジタル信号の歌声音声出力データ217を生成し出力する。
本実施形態では、言語特徴量系列316から音響特徴量系列317を予測するために、音響モデル部306がディープニューラルネットワーク(Deep Neural Network:DNN)により実装される。これに対応して、音声学習部301内のモデル学習部305は、言語特徴量から音響特徴量へのDNN内の各ニューロンの非線形変換関数を表すモデルパラメータを学習し、そのモデルパラメータを学習結果315として音声合成部302内の音響モデル部306のDNNに出力する。
通常、音響特徴量は例えば5.1msec(ミリ秒)幅のフレームを単位として算出され、言語特徴量は音素を単位として算出される。従って、音響特徴量と言語特徴量は時間単位が異なる。DNNである音響モデル部306は、入力である言語特徴量系列316と出力である音響特徴量系列317の一対一の対応関係を表すモデルであるため、時間単位の異なる入出力データ対を用いてDNNを学習させることはできない。このため、本実施形態では、予めフレーム単位の音響特徴量系列と音素単位の言語特徴量系列の対応関係が設定され、フレーム単位の音響特徴量と言語特徴量の対が生成される。
図4は、上述の対応関係を示す音声合成LSI205の動作説明図である。例えば、童謡「きらきら星」の歌い出しの歌詞文字列「き」「ら」「き」(図4(a))に対応する言語特徴量系列である歌声音素列「/k/」「/i/」「/r/」「/a/」「/k/」「/i/」(図4(b))が得られているときに、これらの言語特徴量系列が、フレーム単位の音響特徴量系列(図4(c))に対して、1対多の関係(図4の(b)と(c)の関係)で対応付けられる。なお、言語特徴量は音響モデル部306におけるDNNへの入力として使用されるため、数値データとして表現する必要がある。このため、言語特徴量系列としては、「直前の音素は「/a/」であるか?」や「現在の単語に含まれる音素の数は?」などのコンテキストに関する質問に対する二値のデータ(0又は1)、或いは、連続値での回答を連結して得られる数値データが用意される。
図3の音声学習部301内のモデル学習部305は、図4の破線矢印群401として示されるように、フレーム単位で、図4(b)に対応する学習用言語特徴量系列313の音素列と図4(c)に対応する学習用音響特徴量系列314の対を音響モデル部306のDNNに順次与えて学習を行う。なお、音響モデル部306内のDNNは、図4のグレー色の丸印群として示されるように、入力層、1つ以上の中間層、及び出力層からなるニューロン群を含む。
一方、音声合成時には、上記フレーム単位で、図4(b)に対応する言語特徴量系列316の音素列が音響モデル部306のDNNに入力される。この結果、音響モデル部306のDNNは、図4の太実線矢印群402として示されるように、上記フレーム単位で、音響特徴量系列317を出力する。従って、発声モデル部308においても、上述のフレーム単位で、音響特徴量系列317に含まれる音源情報319及びスペクトル情報318がそれぞれ音源生成部309及び合成フィルタ部310に与えられて、音声合成が実行される。
この結果、発声モデル部308は、図4の太実線矢印群403として示されるように、フレーム毎に、例えば225サンプル(samples)ずつの歌声音声出力データ217を出力する。フレームは5.1msecの時間幅を有するため、1サンプルは「5.1msec÷225≒0.0227msec」であり、従って、歌声音声出力データ217のサンプリング周波数は1/0.0227≒44kHz(キロヘルツ)である。
DNNの学習は、フレーム単位の音響特徴量と言語特徴量の対を用いて、下記の(3)式で演算される二乗誤差最小化基準によって行われる。
ここで、
と
はそれぞれt番目のフレームtにおける音響特徴量と言語特徴量、
は音響モデル部306のDNNのモデルパラメータ、
はDNNによって表される非線形変換関数である。DNNのモデルパラメータは誤差逆伝播法によって効率良く推定することができる。前述した(1)式によって表される統計的音声合成におけるモデル学習部305の処理との対応関係を考慮すると、DNNの学習は下記の(4)式のように表すことができる。
ここで、下記(5)式が成立する。
上記(4)式及び(5)式のように、音響特徴量と言語特徴量の関係は、DNNの出力を平均ベクトルとする正規分布
によって表すことができる。DNNを用いた統計的音声合成処理では、通常、言語特徴量
に非依存な共分散行列、即ち全てのフレームにおいて同じ共分散行列
が用いられる。また、共分散行列
を単位行列とすると、(4)式は(3)式と等価な学習処理を示している。
図4で説明したように、音響モデル部306のDNNは、フレーム毎に独立に音響特徴量系列317を推定する。このため、得られる音響特徴量系列317には、合成音声の品質を低下させるような不連続が含まれる。そこで、本実施形態では例えば、動的特徴量を用いたパラメータ生成アルゴリズムを利用することにより、合成音声の品質を改善することができる。
図1、図2、及び図3の構成例を有する本実施形態の動作について、以下に詳細に説明する。図5は、歌詞制御技術の説明図である。図5(a)は、自動演奏に従って進行する歌詞テキストとメロディの関係を示す図である。例えば、前述した童謡「きらきら星」の歌い出しの場合、曲データには、「き/Twin(第1文字)」「ら/kle(第2文字)」「き/twin(第3文字)」「ら/kle(第4文字)」の歌詞の各文字(歌詞情報)と、歌詞の各文字を出力するt1、t2、t3、t4の各タイミング情報と、歌詞の各文字のメロディ音高「E4(第1音高)」「E4(第2音高)」「B4(第3音高)」「B4(第4音高)」等の各音高情報が、含まれている。t4の後のt5、t6、t7の各タイミングには、「ひ/lit(第5文字)」「か/tle(第6文字)」「る/star(第7文字)」の歌詞の各文字が対応付けられている。
例えば、図5(b)における、t1、t2、t3、t4のタイミングは、図5(a)の本来の発声タイミングt1、t2、t3、t4に対応している。ここで、演奏者が、本来の発声タイミングに対応したタイミングt1とt2で、図1の鍵盤101において、曲データに含まれる第1音高E4と同じ音高E4の鍵を2度正しく押鍵したとする。この場合、図2のCPU201は、タイミングt1及びt2で歌詞「き/Twin(第1文字)」及び「ら/kle(第2文字)」と、それぞれのタイミングt1、t2でいずれも演奏者に指定された音高E4を示す情報と、例えばそれぞれ四分音符長の時間長を示す情報(少なくとも曲データ及び演奏者による演奏のいずれかに基づいて得られる)と、が含まれる歌声データ215を、図2の音声合成LSI205に出力する。この結果、音声合成LSI205は、タイミングt1及びt2でそれぞれ歌詞「き/Twin(第1文字)」及び「ら/kle(第2文字)」に対応するそれぞれ四分音符長の歌声音声出力データ217を第1音高(=指定された音高)E4と、第2音高(=指定された音高)E4でそれぞれ出力する。タイミングt1、t2に対応する判定「○」印は、曲データに含まれる音高及び歌詞情報に応じて発声が正しく行われたことを示している。
次に、本来の発声タイミングのいずれかのタイミングで、演奏者がそのいずれかのタイミングに合わせて図1の鍵盤101を押鍵して音高を指定した場合に、その指定された音高が本来指定すべき音高と不一致の場合には、以下の制御が実行される。図2のCPU201は、そのいずれかのタイミングに合わせて、指定すべき音高に対応する文字の次の文字に応じた歌声が出力されないように、歌詞の進行及び自動伴奏の進行を制御する。例えば、或るタイミングに応じて指定すべき音高が第1音高であり、或るタイミングの次のタイミングに応じて指定すべき音高が第2音高の場合に、もし或るタイミングに応じて第1音高以外の音高が指定されたならば、第1音高に対応する第1文字に応じた歌声を出力させても、させなくてもどちらでもよいのであるが、第2音高に対応する第2文字に応じた歌声までは出力させない。その後、CPU201は、演奏者が押鍵することにより指定された音高が本来指定すべき音高と一致した場合に、歌詞の進行及び自動伴奏の進行を再開する。
例えば、図5(b)において、演奏者が、本来の発声タイミングに対応したタイミングt3で、図1の鍵盤101の鍵を押鍵して指定した音高G4が、タイミングt3で本来発声されるべき第3音高B4と不一致であったとする。この場合、図2のCPU201は、タイミングt3に合わせて「き/twin(第3文字)」が出力されてもよいが、第3音高B4の次に指定すべき第4音高(タイミングt4に応じて指定すべき第4音高)に対応する「ら/kle(第4文字)」以降の文字に応じた歌声が出力されないように、歌詞の進行及び自動伴奏の進行を制御する。なお、CPU101は、図5(b)のタイミングt3の場合に「き/twin(第3文字)」を発音しないように制御してもよい。この場合、指定すべきタイミングに応じて鍵を指定したにも関わらず、指定すべき鍵が指定されていない(間違って押鍵した)ので、歌声が出力されない。
上述のようにして歌声が出力されないように歌詞の進行及び自動伴奏の進行が制御されている状態で、演奏者が押鍵して指定した音高が本来指定すべき音高に一致すると、CPU201は、歌詞の進行及び自動伴奏の進行を再開する。例えば図5(b)のタイミングt3で歌詞の進行及び自動伴奏の進行が停止した後、演奏者が、タイミングt3′で、本来指定すべき第3音高B4と一致する音高B4を指定すると、CPU201は、タイミングt3で発音されるはずであった第3音高B4に対応する歌詞情報「き/twin(第3文字)」に応じた歌声「ぃ/in(第3文字´)」を出力し、歌詞の進行及び自動伴奏の進行を再開する。
上述のように歌詞の進行及び自動伴奏の進行が再開された場合、例えば図5(b)のタイミングt3′で再開された歌詞情報「き/twin(第3文字)」に応じた歌声「ぃ/in(第3文字´)」の発声の次に発声されるべき歌詞情報「ら/kle(第4文字)」の発声タイミングt4′は、再開した発声タイミングがt3からt3′にずれた分だけ、本来の発声タイミングt4からt4′にスライドする。
ここで、上述した指定された音高が本来指定されるべき音高と不一致の場合には、指定すべきタイミングに応じた押鍵がなかった場合も含んでいるといえる。即ち、図5では図示していないが、本来の発声タイミングのいずれかのタイミングで図1の鍵盤101の鍵が押されずに音高が指定されなかった場合においても、発声すべき音高に対応する文字(第1文字)の次の文字(第2文字)に応じた歌声が出力されないように、歌詞の進行及び自動伴奏の進行が制御されているといえる。
図5(c)のタイミングt3は、本実施形態による上述の制御動作が行われなかったと仮定した場合において、演奏者が、本来の発声タイミングに対応したタイミングt3で、押鍵により指定された音高G4がタイミングt3で本来指定すべき第3音高B4と不一致であった場合の制御動作を説明したものである。本実施形態による上述の制御動作が行われなかった場合には、図5(c)のタイミングt3では、本来発声されるべき「き/twin(第3文字)」の次の「ら/kle(第4文字)」が発声されてしまい、本実施形態とは異なり、歌詞の進行が不適切になってしまっている。すなわち、タイミングt4で発音されるべき「ら/kle(第4文字)」が、タイミングt4よりも早いタイミングt3で発音されてしまっている。
以上のように、演奏者が本来の発声タイミングで本来指定すべき音高と一致する正しい音高を指定しなかった場合には、本実施形態による制御動作が実行されない場合には、歌詞の進行と自動伴奏の進行とが合わなくなって、演奏者はそのたびに歌詞の進行を修正しなければならなかった。これに対して、本実施形態では、演奏者により本来指定すべき音高と一致する正しい音高が指定されるまで、歌詞の進行と自動伴奏の進行を停止するため、演奏者の演奏に合わせた自然な歌詞進行を行うことが可能となる。
次に、本来の発声タイミングのいずれのタイミングも到来していないタイミングで、演奏者が図1の鍵盤101の任意の鍵(操作子)を押鍵操作し、それにより指定された音高が次に指定すべき音高と不一致であった場合、図2のCPU201は、音声合成LSI205において出力されている歌声音声出力データ217の歌声の音高を、演奏操作により指定された音高に変更することを指示する歌声データ215を、図2の音声合成LSI205に出力する。この結果、図2又は図3の音声合成LSI205は、上記本来の発声タイミングのいずれのタイミングも到来していないタイミングで、発声中の歌声音声出力データ217の音高を、CPU201から指定された音高に変更する。
例えば、図5(b)において、本来の発声タイミングt1、t2、t3、t4のいずれのタイミングも到来していないタイミングt1′で、演奏者が、図1の鍵盤101において音高G4の鍵を押鍵したとする。この場合、CPU201は、指定された音高G4が、後(タイミングt2)で指定すべき歌詞情報「ら/kle(第2文字)」に対応する第2音高E4と不一致と判断し、その結果、音声合成LSI205において出力されている歌詞情報「き/Twin(第1文字)」の歌声音声出力データ217の音高を、いままでの第1音高E4から演奏操作により指定された音高G4に変更して発声を継続させることを指示する歌声データ215を、図2の音声合成LSI205に出力する。この結果、図2又は図3の音声合成LSI205は、タイミングt1′で、発声中の歌詞情報「き/Twin(第1文字)」に応じた「ぃ/in(第1文字´)」の歌声音声出力データ217の音高を、いままでの第1音高E4から、CPU201から指定された音高G4に変更して発声を継続する。
図5(c)のタイミングt1′は、本実施形態による上述の制御動作が行われなかったと仮定した場合において、演奏者が、本来の発声タイミング以外のタイミングt1′で、図1の鍵盤101の鍵を押鍵した場合の制御動作を説明したものである。本実施形態による上述の制御動作が行われなかった場合には、図5(c)のタイミングt1′では、その次の発声タイミングt2で発声されるべき歌詞情報「ら/kle(第2文字)」の発声が行われてしまう。
以上のように、本実施形態による制御動作が実行されない場合には、演奏者が本来の発声タイミング以外のタイミングで指定した音高が指定すべき音高と不一致であった場合でも、どんどん歌詞が先に進んでしまって、不自然な感じになってしまっていた。これに対して、本実施形態では、そのタイミングの直前の本来のタイミングから発声されている歌声音声出力データ217に応じて発声されている音高が演奏者により指定された音高に変更されて継続させることが可能となる。この場合には、例えば図5(b)の本来のソング再生タイミングt1で発声された歌詞情報「き/Twin(第1文字)」に対応する歌声音声出力データ217が途切れることなく、その音高が押鍵タイミングt1′において新たな押鍵による音高に連続的に変化してゆくように聞こえる。これにより、本実施形態では、自然な歌詞進行を行うことができる。
図5には図示していないが、本来の発声タイミングのいずれのタイミングも到来していないタイミングで、その次に発声されるべき歌詞情報に応じた音高と同じ音高を演奏者が指定したとする。この場合、CPU201は、次に発声されるべき歌声のタイミングまで、歌詞の進行及び自動伴奏の進行を一気に進める(ジャンプさせる)ように制御してもよい。
なお、演奏者が本来の発声タイミング以外のタイミングで演奏操作を行い、そのときに指定された音高が、次のタイミングで指定すべき音高と不一致であった場合に、既に出力された歌声音声出力データ217に応じた発声を繰り返し(音高を変更して)で出力してもよい。この場合には、例えば図5(b)の本来のソング再生タイミングt1で発声された歌詞情報「き/Twin(第1文字)」に対応する歌声音声出力データ217に続けて、押鍵タイミングt1′における新たな押鍵により「き/Twin(第1文字)」に対応する歌声音声出力データ217が、別に発声されるように聞こえる。或いは、発声タイミング以外のタイミングでは、歌声音声出力データ217の発声を行わないように制御してもよい。
図6は、本実施形態において、図2のROM202からRAM203に読み込まれる曲データのデータ構成例を示す図である。このデータ構成例は、MIDI(Musical Instrument Digital Interface)用ファイルフォーマットの一つであるスタンダードMIDIファイルのフォーマットに準拠している。この曲データは、チャンクと呼ばれるデータブロックから構成される。具体的には、曲データは、ファイルの先頭にあるヘッダチャンクと、それに続く歌詞パート用の歌詞データが格納されるトラックチャンク1と、伴奏パート用の演奏データが格納されるトラックチャンク2とから構成される。
ヘッダチャンクは、ChunkID、ChunkSize、FormatType、NumberOfTrack、及びTimeDivisionの4つの値からなる。ChunkIDは、ヘッダチャンクであることを示す"MThd"という半角4文字に対応する4バイトのアスキーコード「4D 54 68 64」(数字は16進数)である。ChunkSizeは、ヘッダチャンクにおいて、ChunkIDとChunkSizeを除く、FormatType、NumberOfTrack、及びTimeDivisionの部分のデータ長を示す4バイトデータであり、データ長は6バイト:「00 00 00 06」(数字は16進数)に固定されている。FormatTypeは、本実施形態の場合、複数トラックを使用するフォーマット1を意味する2バイトのデータ「00 01」(数字は16進数)である。NumberOfTrackは、本実施形態の場合、歌詞パートと伴奏パートに対応する2トラックを使用することを示す2バイトのデータ「00 02」(数字は16進数)である。TimeDivisionは、4分音符あたりの分解能を示すタイムベース値を示すデータであり、本実施形態の場合、10進法で480を示す2バイトのデータ「01 E0」(数字は16進数)である。
トラックチャンク1、2はそれぞれ、ChunkID、ChunkSizeと、DeltaTime_1[i]及びEvent_1[i](トラックチャンク1/歌詞パートの場合)又はDeltaTime_2[i]及びEvent_2[i](トラックチャンク2/伴奏パートの場合)からなる演奏データ組(0≦i≦L:トラックチャンク1/歌詞パートの場合、0≦i≦M:トラックチャンク2/伴奏パートの場合)とからなる。ChunkIDは、トラックチャンクであることを示す"MTrk"という半角4文字に対応する4バイトのアスキーコード「4D 54 72 6B」(数字は16進数)である。ChunkSizeは、各トラックチャンクにおいて、ChunkIDとChunkSizeを除く部分のデータ長を示す4バイトデータである。
DeltaTime_1[i]は、その直前のEvent_1[i−1]の実行時刻からの待ち時間(相対時間)を示す1〜4バイトの可変長データである。同様に、DeltaTime_2[i]は、その直前のEvent_2[i−1]の実行時刻からの待ち時間(相対時間)を示す1〜4バイトの可変長データである。Event_1[i]は、トラックチャンク1/歌詞パートにおいて、歌詞の発声タイミングと音高を指示するメタイベントである。Event_2[i]は、トラックチャンク2/伴奏パートにおいて、ノートオン又はノートオフを指示するMIDIイベント、又は拍子を指示するメタイベントである。トラックチャンク1/歌詞パートに対して、各演奏データ組DeltaTime_1[i]及びEvent_1[i]において、その直前のEvent_1[i−1]の実行時刻からDeltaTime_1[i]だけ待った上でEvent_1[i]が実行されることにより、歌詞の発声進行が実現される。一方、トラックチャンク2/伴奏パートに対して、各演奏データ組DeltaTime_2[i]及びEvent_2[i]において、その直前のEvent_2[i−1]の実行時刻からDeltaTime_2[i]だけ待った上でEvent_2[i]が実行されることにより、自動伴奏の進行が実現される。
図7は、本実施形態における電子楽器の制御処理例を示すメインフローチャートである。この制御処理は例えば、図2のCPU201が、ROM202からRAM203にロードされた制御処理プログラムを実行する動作である。
CPU201は、まず初期化処理を実行した後(ステップS701)、ステップS702からS708の一連の処理を繰り返し実行する。
この繰返し処理において、CPU201はまず、スイッチ処理を実行する(ステップS702)。ここでは、CPU201は、図2のキースキャナ206からの割込みに基づいて、図1の第1のスイッチパネル102又は第2のスイッチパネル103のスイッチ操作に対応する処理を実行する。
次に、CPU201は、図2のキースキャナ206からの割込みに基づいて図1の鍵盤101の何れかの鍵が操作されたか否かを判定して処理する鍵盤処理を実行する(ステップS703)。ここでは、CPU201は、演奏者による何れかの鍵の押鍵又は離鍵の操作に応じて、図2の音源LSI204に対して、発音開始又は発音停止を指示する発音制御データ216を出力する。
次に、CPU201は、図1のLCD104に表示すべきデータを処理し、そのデータを、図2のLCDコントローラ208を介してLCD104に表示する表示処理を実行する(ステップS704)。LCD104に表示されるデータとしては、例えば演奏される歌声音声出力データ217に対応する歌詞とその歌詞に対応するメロディの楽譜や、各種設定情報がある(後述する図13及び図14を参照)。
次に、CPU201は、ソング再生処理を実行する(ステップS705)。この処理においては、CPU201が、演奏者の演奏に基づいて図5で説明した制御処理を実行し、歌声データ215を生成して音声合成LSI205に出力する。
続いて、CPU201は、音源処理を実行する(ステップS706)。音源処理において、CPU201は、音源LSI204における発音中の楽音のエンベロープ制御等の制御処理を実行する。
続いて、CPU201は、音声合成処理を実行する(ステップS707)。音声合成処理において、CPU201は、音声合成LSI205による音声合成の実行を制御する。
最後にCPU201は、演奏者が特には図示しないパワーオフスイッチを押してパワーオフしたか否かを判定する(ステップS708)。ステップS708の判定がNOならば、CPU201は、ステップS702の処理に戻る。ステップS708の判定がYESならば、CPU201は、図7のフローチャートで示される制御処理を終了し、電子鍵盤楽器100の電源を切る。
図8(a)、(b)、及び(c)はそれぞれ、図7のステップS701の初期化処理、図7のステップS702のスイッチ処理における後述する図9のステップS902のテンポ変更処理、及び同じく図9のステップS906のソング開始処理の詳細例を示すフローチャートである。
まず、図7のステップS701の初期化処理の詳細例を示す図8(a)において、CPU201は、TickTimeの初期化処理を実行する。本実施形態において、歌詞の進行及び自動伴奏は、TickTimeという時間を単位として進行する。図6の曲データのヘッダチャンク内のTimeDivision値として指定されるタイムベース値は4分音符の分解能を示しており、この値が例えば480ならば、4分音符は480TickTimeの時間長を有する。また、図6の曲データのトラックチャンク内の待ち時間DeltaTime_1[i]値及びDeltaTime_2[i]値も、TickTimeの時間単位によりカウントされる。ここで、1TickTimeが実際に何秒になるかは、曲データに対して指定されるテンポによって異なる。今、テンポ値をTempo[ビート/分]、上記タイムベース値をTimeDivisionとすれば、TickTimeの秒数は、次式により算出される。
TickTime[秒]=60/Tempo/TimeDivision (6)
そこで、図8(a)のフローチャートで例示される初期化処理において、CPU201はまず、上記(6)式に対応する演算処理により、TickTime[秒]を算出する(ステップS801)。なお、テンポ値Tempoは、初期状態では図2のROM202に所定の値、例えば60[ビート/秒]が記憶されているとする。或いは、不揮発性メモリに、前回終了時のテンポ値が記憶されていてもよい。
次に、CPU201は、図2のタイマ210に対して、ステップS801で算出したTickTime[秒]によるタイマ割込みを設定する(ステップS802)。この結果、タイマ210において上記TickTime[秒]が経過する毎に、CPU201に対して歌詞進行及び自動伴奏のための割込み(以下「自動演奏割込み」と記載)が発生する。従って、この自動演奏割込みに基づいてCPU201で実行される自動演奏割込み処理(後述する図10)では、1TickTime毎に歌詞進行及び自動伴奏を進行させる制御処理が実行されることになる。
続いて、CPU201は、図2のRAM203の初期化等のその他初期化処理を実行する(ステップS803)。その後、CPU201は、図8(a)のフローチャートで例示される図7のステップS701の初期化処理を終了する。
図8(b)及び(c)のフローチャートについては、後述する。図9は、図7のステップS702のスイッチ処理の詳細例を示すフローチャートである。
CPU201はまず、図1の第1のスイッチパネル102内のテンポ変更スイッチにより歌詞進行及び自動伴奏のテンポが変更されたか否かを判定する(ステップS901)。その判定がYESならば、CPU201は、テンポ変更処理を実行する(ステップS902)。この処理の詳細は、図8(b)を用いて後述する。ステップS901の判定がNOならば、CPU201は、ステップS902の処理はスキップする。
次に、CPU201は、図1の第2のスイッチパネル103において何れかのソング曲が選曲されたか否かを判定する(ステップS903)。その判定がYESならば、CPU201は、ソング曲読込み処理を実行する(ステップS904)。この処理は、図6で説明したデータ構造を有する曲データを、図2のROM202からRAM203に読み込む処理である。これ以降、図6に例示されるデータ構造内のトラックチャンク1又は2に対するデータアクセスは、RAM203に読み込まれた曲データに対して実行される。ステップS903の判定がNOならば、CPU201は、ステップS904の処理はスキップする。
続いて、CPU201は、図1の第1のスイッチパネル102においてソング開始スイッチが操作されたか否かを判定する(ステップS905)。その判定がYESならば、CPU201は、ソング開始処理を実行する(ステップS906)。この処理の詳細は、図8(c)を用いて後述する。ステップS905の判定がNOならば、CPU201は、ステップS906の処理はスキップする。
最後に、CPU201は、図1の第1のスイッチパネル102又は第2のスイッチパネル103においてその他のスイッチが操作されたか否かを判定し、各スイッチ操作に対応する処理を実行する(ステップS907)。その後、CPU201は、図9のフローチャートで例示される図7のステップS702のスイッチ処理を終了する。
図8(b)は、図9のステップS902のテンポ変更処理の詳細例を示すフローチャートである。前述したように、テンポ値が変更されるとTickTime[秒]も変更になる。図8(b)のフローチャートでは、CPU201は、このTickTime[秒]の変更に関する制御処理を実行する。
まず、CPU201は、図7のステップS701の初期化処理で実行された図8(a)のステップS801の場合と同様にして、前述した(6)式に対応する演算処理により、TickTime[秒]を算出する(ステップS811)。なお、テンポ値Tempoは、図1の第1のスイッチパネル102内のテンポ変更スイッチにより変更された後の値がRAM203等に記憶されているものとする。
次に、CPU201は、図7のステップS701の初期化処理で実行された図8(a)のステップS802の場合と同様にして、図2のタイマ210に対して、ステップS811で算出したTickTime[秒]によるタイマ割込みを設定する(ステップS812)。その後、CPU201は、図8(b)のフローチャートで例示される図9のステップS902のテンポ変更処理を終了する。
図8(c)は、図9のステップS906のソング開始処理の詳細例を示すフローチャートである。
まず、CPU201は、自動演奏の進行において、TickTimeを単位として、直前のイベントの発生時刻からの相対時間をカウントするためのRAM203上の変数DeltaT_1(トラックチャンク1)及びDeltaT_2(トラックチャンク2)の値を共に0に初期設定する。次に、CPU201は、図6に例示される曲データのトラックチャンク1内の演奏データ組DeltaTime_1[i]及びEvent_1[i](1≦i≦L−1)の夫々iを指定するためのRAM203上の変数AutoIndex_1と、同じくトラックチャンク2内の演奏データ組DeltaTime_2[i]及びEvent_2[i](1≦i≦M−1)の夫々iを指定するためのRAM203上の変数AutoIndex_2の各値を共に0に初期設定する(以上、ステップS821)。これにより、図6の例では、初期状態としてまず、トラックチャンク1内の先頭の演奏データ組DeltaTime_1[0]とEvent_1[0]、及びトラックチャンク2内の先頭の演奏データ組DeltaTime_2[0]とEvent_2[0]がそれぞれ参照される。
次に、CPU201は、現在のソング位置を指示するRAM203上の変数SongIndexの値を0に初期設定する(ステップS822)。
更に、CPU201は、歌詞及び伴奏の進行をするか(=1)しないか(=0)を示すRAM203上の変数SongStartの値を1(進行する)に初期設定する(ステップS823)。
その後、CPU201は、演奏者が、図1の第1のスイッチパネル102により歌詞の再生に合わせて伴奏の再生を行う設定を行っているか否かを判定する(ステップS824)。
ステップS824の判定がYESならば、CPU201は、RAM203上の変数Bansouの値を1(伴奏有り)に設定する(ステップS825)。逆に、ステップS824の判定がNOならば、CPU201は、変数Bansouの値を0(伴奏無し)に設定する(ステップS826)。ステップS825又はS826の処理の後、CPU201は、図8(c)のフローチャートで示される図9のステップS906のソング開始処理を終了する。
図10は、図2のタイマ210においてTickTime[秒]毎に発生する割込み(図8(a)のステップS802又は図8(b)のステップS812を参照)に基づいて実行される自動演奏割込み処理の詳細例を示すフローチャートである。以下の処理は、図6に例示される曲データのトラックチャンク1及び2の演奏データ組に対して実行される。
まず、CPU201は、トラックチャンク1に対応する一連の処理(ステップS1001からS1006)を実行する。始めにCPU201は、SongStart値が1であるか否か、即ち歌詞及び伴奏の進行が指示されているか否かを判定する(ステップS1001)。
CPU201は、歌詞及び伴奏の進行が指示されていないと判定した(ステップS1001の判定がNOである)場合には、CPU201は、歌詞及び伴奏の進行は行わずに図10のフローチャートで例示される自動演奏割込み処理をそのまま終了する。
CPU201は、歌詞及び伴奏の進行が指示されていると判定した(ステップS1001の判定がYESである)場合には、トラックチャンク1に関する前回のイベントの発生時刻からの相対時刻を示すDeltaT_1値が、AutoIndex_1値が示すこれから実行しようとする演奏データ組の待ち時間DeltaTime_1[AutoIndex_1]に一致したか否かを判定する(ステップS1002)。
ステップS1002の判定がNOならば、CPU201は、トラックチャンク1に関して、前回のイベントの発生時刻からの相対時刻を示すDeltaT_1値を+1インクリメントさせて、今回の割込みに対応する1TickTime単位分だけ時刻を進行させる(ステップS1003)。その後、CPU201は、後述するステップS1007に移行する。
ステップS1002の判定がYESになると、CPU201は、トラックチャンク1に関して、AutoIndex_1値が示す演奏データ組のイベントEvent[AutoIndex_1]を実行する(ステップS1004)。このイベントは、歌詞データを含むソングイベントである。
続いて、CPU201は、トラックチャンク1内の次に実行すべきソングイベントの位置を示すAutoIndex_1値を、RAM203上の変数SongIndexに格納する(ステップS1004)。
更に、CPU201は、トラックチャンク1内の演奏データ組を参照するためのAutoIndex_1値を+1インクリメントする(ステップS1005)。
また、CPU201は、トラックチャンク1に関して今回参照したソングイベントの発生時刻からの相対時刻を示すDeltaT_1値を0にリセットする(ステップS1006)。その後、CPU201は、ステップS1007の処理に移行する。
次に、CPU201は、トラックチャンク2に対応する一連の処理(ステップS1007からS1013)を実行する。始めにCPU201は、トラックチャンク2に関する前回のイベントの発生時刻からの相対時刻を示すDeltaT_2値が、AutoIndex_2値が示すこれから実行しようとする演奏データ組の待ち時間DeltaTime_2[AutoIndex_2]に一致したか否かを判定する(ステップS1007)。
ステップS1007の判定がNOならば、CPU201は、トラックチャンク2に関して、前回のイベントの発生時刻からの相対時刻を示すDeltaT_2値を+1インクリメントさせて、今回の割込みに対応する1TickTime単位分だけ時刻を進行させる(ステップS1008)。その後、CPU201は、図10のフローチャートで示される自動演奏割込み処理を終了する。
ステップS1007の判定がYESならば、CPU201は、伴奏再生を指示するRAM203上の変数Bansouの値が1(伴奏有り)であるか否かを判定する(ステップS1009)(図8(c)のステップS824からS826を参照)。
ステップS1009の判定がYESならば、CPU201は、AutoIndex_2値が示すトラックチャンク2に関する伴奏に関するイベントEvent_2[AutoIndex_2]を実行する(ステップS1010)。ここで実行されるイベントEvent_2[AutoIndex_2]が、例えばノートオンイベントであれば、そのノートオンイベントにより指定されるキーナンバー及びベロシティにより、図2の音源LSI204に対して伴奏用の楽音の発音命令が発行される。一方、イベントEvent_2[AutoIndex_2]が、例えばノートオフイベントであれば、そのノートオフイベントにより指定されるキーナンバー及びベロシティにより、図2の音源LSI204に対して発音中の伴奏用の楽音の消音命令が発行される。
一方、ステップS1009の判定がNOならば、CPU201は、ステップS1010をスキップすることにより、今回の伴奏に関するイベントEvent_2[AutoIndex_2]は実行せずに、歌詞に同期した進行のために、次のステップS1011の処理に進んで、イベントを進める制御処理のみを実行する。
ステップS1010の後又はステップS1009の判定がNOの場合に、CPU201は、トラックチャンク2上の伴奏データのための演奏データ組を参照するためのAutoIndex_2値を+1インクリメントする(ステップS1011)。
また、CPU201は、トラックチャンク2に関して今回実行したイベントの発生時刻からの相対時刻を示すDeltaT_2値を0にリセットする(ステップS1012)。
そして、CPU201は、AutoIndex_2値が示す次に実行されるトラックチャンク2上の演奏データ組の待ち時間DeltaTime_2[AutoIndex_2]が0であるか否か、即ち、今回のイベントと同時に実行されるイベントであるか否かを判定する(ステップS1013)。
ステップS1013の判定がNOならば、CPU201は、図10のフローチャートで示される今回の自動演奏割込み処理を終了する。
ステップS1013の判定がYESならば、CPU201は、ステップS1009に戻って、AutoIndex_2値が示すトラックチャンク2上で次に実行される演奏データ組のイベントEvent_2[AutoIndex_2]に関する制御しょりを繰り返す。CPU201は、今回同時に実行される回数分だけ、ステップS1009からS1013の処理を繰り返し実行する。以上の処理シーケンスは、例えば和音などのように複数のノートオンイベントが同時タイミングで発音されるような場合に実行される。
図11は、図7のステップS705のソング再生処理の第1の実施形態の詳細例を示すフローチャートである。この処理は、図5で説明した本実施形態による制御処理を実行するものである。
まずCPU201は、図10の自動演奏割込み処理におけるステップS1004で、RAM203上の変数SongIndexに、値がセットされてNull値でなくなっているか否かを判定する(ステップS1101)。このSongIndex値は、現在のタイミングが歌声の再生タイミングになっているか否かを示すものである。
ステップS1101の判定がYESになった、即ち現時点がソング再生のタイミング(図5の例のt1、t2、t3、t4、t5、t6、t7等)になったら、CPU201は、図7のステップS703の鍵盤処理により演奏者による図1の鍵盤101上で新たな押鍵が検出されているか否かを判定する(ステップS1102)。
ステップS1102の判定がYESならば、CPU201は、RAM203上の変数SongIndexが示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex]から音高を読出し、演奏者による押鍵により指定された指定音高が読み出した音高と一致するか否かを判定する(ステップS1103)。
ステップS1103の判定がYESならば、CPU201は、演奏者による押鍵により指定された指定音高を、発声音高として特には図示しないレジスタ又はRAM203上の変数にセットする(ステップS1104)。
続いて、CPU201は、RAM203上の変数SongIndexが示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex]から、歌詞文字列を読み出す。CPU201は、読み出した歌詞文字列に対応する歌声音声出力データ217を、ステップS1104で設定された押鍵に基づく指定音高がセットされた発声音高で発声させるための歌声データ215を生成し、音声合成LSI205に対して発声処理を指示する(ステップS1105)。
以上のステップS1104とS1105の処理は、図5(b)のソング再生タイミングt1、t2、t3′、t4に関して前述した制御処理に対応する。
ステップS1105の処理の後、CPU201は、RAM203上の変数SongIndexが示す再生を行ったソング位置を、RAM203上の変数SongIndex_preに記憶させる(ステップS1106)。
次に、CPU201は、変数SongIndexの値をNull値にクリアして、これ以降のタイミングをソング再生のタイミングでない状態にする(ステップS1107)。
更に、CPU201は、歌詞及び自動伴奏の進行を制御するRAM203上の変数SongStartに、進行を指示する値1をセットする(ステップS1108)。その後、CPU201は、図11のフローチャートで示される図7のステップS705のソング再生処理を終了する。
図5(b)のタイミングt3に関して説明したように、歌詞及び自動伴奏の進行が停止している状態で、タイミングt3′において、演奏(押鍵)による指定音高が曲データから読出した音高に一致すると、ステップS1101の判定がYES→ステップS1102の判定がYESと進んで、ステップS1105でEvent_1[SongIndex]が示す歌声の発声が行われた後に、上述のようにステップS1108で変数SongStartの値が1にセットされる。この結果、図10の自動演奏割込み処理において、ステップS1001の判定がYESとなって、歌声と自動伴奏の進行が再開される。
前述したステップS1103の判定がNO、即ち演奏者による押鍵により指定された指定音高が曲データから読出した音高と不一致ならば、CPU201は、歌詞及び自動伴奏の進行を制御するRAM203上の変数SongStartに、進行の停止を指示する値0をセットする(ステップS1109)。その後、CPU201は、図11のフローチャートで示される図7のステップS705のソング再生処理を終了する。
図5(b)のタイミングt3に関して説明したように、歌声の発声タイミングt3で、演奏(押鍵)による指定音高が曲データから読み出した音高と不一致になると、ステップS1101の判定がYES→ステップS1102の判定がYES→ステップS1103の判定がNOと進んで、上述のようにステップS1109で変数SongStartの値が0にセットされる。この結果、図10の自動演奏割込み処理において、ステップS1001の判定がNOとなって、歌声と自動伴奏の進行が停止される。
前述したステップS1101の判定がNOである、即ち現時点がソング再生のタイミングではないときには、CPU201は、図7のステップS703の鍵盤処理により演奏者による図1の鍵盤101上で新たな押鍵が検出されているか否かを判定する(ステップS1110)。
ステップS1110の判定がNOならば、CPU201はそのまま、図11のフローチャートで示される図7のステップS705のソング再生処理を終了する。
ステップS1110の判定がYESならば、CPU201は、現在音声合成LSI205が発声処理中の、RAM203上の変数SongIndex_preが示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex_pre]の歌詞文字列に対応する歌声音声出力データ217の音高を、ステップS1110で検出された演奏者の押鍵に基づく指定音高に変更することを指示する歌声データ215を生成し、音声合成LSI205に出力する(ステップS1111)。このとき、歌声データ215において、既に発声処理中の歌詞の音素のうち後半部分の音素、例えば歌詞文字列「き」であればそれを構成する音素列「/k/」「/i/」のうちの後半の「/i/」が始まるフレーム(図4(b)及び(c)を参照)が、指定音高への変更の開始位置にセットされる。
以上のステップS1111の処理により、現在の押鍵タイミングの直前の本来のタイミング、例えば図5(b)のt1から発声されている歌声音声出力データ217の発声がその音高が演奏者により指定された指定音高に変更されて、例えば図5(b)の現在の押鍵タイミングt1′でその発声を継続させることが可能となる。
ステップS1111の処理の後、CPU201は、図11のフローチャートで示される図7のステップS705のソング再生処理を終了する。
図12は、図7のステップS705のソング再生処理の第2の実施形態の詳細例を示すフローチャートである。この処理は、図5で説明した本実施形態による他の制御処理を実行するものである。
まず、CPU201は、図7のステップS703の鍵盤処理により演奏者による図1の鍵盤101上で新たな押鍵が検出されているか否かを判定する(ステップS1201)。
ステップS1201の判定がYESならば、CPU201は、図10の自動演奏割込み処理におけるステップS1004で、現在のタイミングが歌声の再生タイミングになっているか否かを示すRAM203上の変数SongIndexに、値がセットされてNull値でなくなっているか否かを判定する(ステップS1102)。
ステップS1102の判定がYESになった、即ち現時点がソング再生のタイミング(図5の例のt1、t2、t3、t4等)になったら、CPU201は、演奏者による押鍵により指定された指定音高を、発声音高として特には図示しないレジスタ又はRAM203上の変数にセットする(ステップS1203)。
続いて、CPU201は、RAM203上の変数SongIndexが示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex]から、歌詞文字列を読み出す。CPU201は、読み出した歌詞文字列に対応する歌声音声出力データ217を、ステップS1104で設定された押鍵に基づく指定音高がセットされた発声音高で発声させるための歌声データ215を生成し、音声合成LSI205に対して発声処理を指示する(ステップS1204)。
その後、CPU201は、RAM203上の変数SongIndexが示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex]から音高を読出し、演奏者による押鍵により指定された指定音高が曲データから読出した音高と一致するか否かを判定する(ステップS1205)。
ステップS1205の判定がYESならば、CPU201は、ステップS1206に進む。この処理は、図5(b)のソング再生タイミングt1、t2、t3′、t4に関して前述した制御処理に対応する。
ステップS1206において、CPU201は、RAM203上の変数SongIndexが示す再生を行ったソング位置を、RAM203上の変数SongIndex_preに記憶させる。
次に、CPU201は、変数SongIndexの値をNull値にクリアして、これ以降のタイミングをソング再生のタイミングでない状態にする(ステップS1207)。
更に、CPU201は、歌詞及び自動伴奏の進行を制御するRAM203上の変数SongStartに、進行を指示する値1をセットする(ステップS1208)。その後、CPU201は、図12のフローチャートで示される図7のステップS705のソング再生処理を終了する。
前述したステップS1205の判定がNOならば、CPU201は、即ち演奏者による押鍵により指定された指定音高が曲データから読出した音高と不一致ならば、CPU201は、歌詞及び自動伴奏の進行を制御するRAM203上の変数SongStartに、進行の停止を指示する値0をセットする(ステップS1209)。その後、CPU201は、図12のフローチャートで示される図7のステップS705のソング再生処理を終了する。これにより、図10の自動演奏割込み処理においてステップS1001の判定がYESとなって歌声と自動伴奏の進行が再開されることは、図11のステップS1108の場合と同様である。
前述したステップS1205の判定がNO、即ち演奏者による押鍵により指定された指定音高が曲データから読出した音高と不一致ならば、CPU201は、歌詞及び自動伴奏の進行を制御するRAM203上の変数SongStartに、進行の停止を指示する値0をセットする(ステップS1210)。その後、CPU201は、図12のフローチャートで示される図7のステップS705のソング再生処理を終了する。これにより、図10の自動演奏割込み処理においてステップS1001の判定がNOとなって歌声と自動伴奏の進行が停止されることは、図11のステップS1109の場合と同様である。
この処理は、図5(b)のソング再生タイミングt3に関して前述した制御処理に対応する。
前述したステップS1201の判定がYESになった後、ステップS1202の判定がNOになった場合、即ち歌声を発声すべきタイミング以外で演奏者による演奏(押鍵)が発声した場合には、以下の制御処理が実行される。
まず、CPU201は、RAM203上の変数SongStartに値0をセットして歌声及び自動伴奏の進行をいったん停止させる(ステップS1211)(図10のステップS1001を参照)。
次に、CPU201は、現在の歌声及び自動伴奏の進行位置に関するRAM203上の各変数DeltaT_1、DeltaT_2、AutoIndex_1、及びAutoIndex_2の値をそれぞれ、各変数DeltaT_1_now、DeltaT_2_now、AutoIndex_1_now、及びAutoIndex_2_nowに退避させる(ステップS1212)。
その後、CPU201は、次ソングイベント検索処理を実行する(ステップS1213)。ここでは、次に到来する歌声に関するイベント情報を指示するSongIndex値が検索される。この処理の詳細については、後述する。
ステップS1213の検索処理の後、CPU201は、検索されたSongIndex値が示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex]から音高を読出し、演奏者による押鍵により指定された指定音高がその読出した音高と一致するか否かを判定する(ステップS1214)。
ステップS1214の判定がYESならば、CPU201は、制御処理を、ステップS1203→S1204→S1205の判定がYES→S1206→S1207→S1208と進める。
上述の一連の制御処理により、本来の発声タイミングが到来していないタイミングで、その次に発声されるべき歌声の音高と同じ音高の鍵を演奏者が押鍵した場合には、CPU201は、次に発声されるべき歌声のタイミングまで、歌詞の進行及び自動伴奏の進行を一気に進める(ジャンプさせる)ように制御することができる。
前述したステップS1214の判定がNOならば、CPU201は、ステップS1212で退避させたRAM203上の各変数DeltaT_1_now、DeltaT_2_now、AutoIndex_1_now、及びAutoIndex_2_nowの値をそれぞれ、各変数DeltaT_1、DeltaT_2、AutoIndex_1、及びAutoIndex_2に戻して、ステップS1213の検索処理により進んだ分を、検索前の元の進行位置に戻す(ステップS1215)。
その後、CPU201は、現在音声合成LSI205が発声処理中の、RAM203上の変数SongIndex_preが示すRAM203上の曲データのトラックチャンク1上のソングイベントEvent_1[SongIndex_pre]の歌詞文字列に対応する歌声音声出力データ217の音高を、ステップS1201で検出された演奏者の押鍵に基づく指定音高に変更することを指示する歌声データ215を生成し、音声合成LSI205に出力する(ステップS1216)。
このステップS1216の処理は、図11のステップS1111の処理と同様であり、現在の押鍵タイミングの直前の本来のタイミング、例えば図5(b)のt1から発声されている歌声音声出力データ217の発声がその音高が演奏者により演奏された指定音高に変更されて、例えば図5(b)の現在の押鍵タイミングt1′でその発声を継続させることが可能となる。
ステップS1216の処理の後、CPU201は、RAM203上の変数SongStartに値1をセットすることにより、ステップS1211で一時的に停止させた歌詞及び自動伴奏の進行を再開させる(ステップS1208)。その後、CPU201は、図12のフローチャートで示される図7のステップS705のソング再生処理を終了する。
前述したステップS1201の判定がNOである、即ち演奏者による演奏(押鍵)がなされていないときには、CPU201は、図10の自動演奏割込み処理におけるステップS1004で、現在のタイミングが歌声の再生タイミングになっているか否かを示すRAM203上の変数SongIndexに、値がセットされてNull値でなくなっているか否かを判定する(ステップS1209)。
ステップS1209の判定がNOならば、CPU201はそのまま、図12のフローチャートで示される図7のステップS705のソング再生処理を終了する。
ステップS1209の判定がYESならば、CPU201は、歌詞及び自動伴奏の進行を制御するRAM203上の変数SongStartに、進行の停止を指示する値0をセットする(ステップS1210)。その後、CPU201は、図12のフローチャートで示される図7のステップS705のソング再生処理を終了する。これにより、図10の自動演奏割込み処理においてステップS1001の判定がNOとなって歌声と自動伴奏の進行が停止されることは、図11のステップS1109の場合と同様である。
図13は、図12のステップS1213の次ソングイベント検索処理の詳細例を示すフローチャートである。図13のフローチャートにおいて、図10の自動演奏割込み処理の場合と同じステップ番号を付した部分は、図10の場合と同じ処理を示すものとする。図13の処理では、基本的には図10の自動演奏割込み処理におけるステップS1002からS1013までの一連の制御フローと同じ制御フローであって、イベントの実行を行う処理のみを除いた制御処理群が実行される。
即ち、図13において、CPU201は、ステップS1002で、トラックチャンク1に関する前回のイベントの発生時刻からの相対時刻を示すDeltaT_1値が、AutoIndex_1値が示すこれから実行しようとする歌声に関する演奏データ組の待ち時間DeltaTime_1[AutoIndex_1]に一致したと判定するまで、ステップS1003で、DeltaT_1値がインクリメントさせて、歌声の進行を進める。
また、CPU201は、トラックチャンク2に関する前回のイベントの発生時刻からの相対時刻を示すDeltaT_2値が、AutoIndex_2値が示すこれから実行しようとする自動伴奏に関する演奏データ組の待ち時間DeltaTime_2[AutoIndex_2]に一致してステップS1007の判定がYESになる毎に、AutoIndex_2値を進めると共に、ステップS1007の判定がNOならば、DeltaT_2値をインクリメントさせて、自動伴奏の進行を進め、その後、ステップS1002の制御処理に戻る。
以上の一連の制御処理の繰返しにおいて、ステップS1002の判定がYESになると、CPU201は、AutoIndex_1値をRAM203上の変数SongIndexに格納して、図13のフローチャートで示される図12のステップS1213の次ソングイベント検索処理を終了する。
図14は、図6のデータ構造として例示した曲データをMusicXML形式で実施した場合の曲データの構成例を示す図である。このようなデータ構成により、歌詞文字列とメロディの楽譜データを持たせることが可能となる。そして、このような曲データをCPU201が例えば図7のステップS704の表示処理でパースすることにより、例えば図1の鍵盤101上で、現在ソング再生中の歌詞文字列に対応するメロディに対応する鍵を光らせて演奏者による歌詞文字列に対応する鍵の押鍵をガイドさせるような機能を持たせることが可能となる。同時に、例えば図15に示されるような表示例の現在ソング再生中の歌詞文字列とそれに対応する楽譜を、図1のLCD104に表示させることが可能となる。
以上説明した実施形態では、言語特徴量系列316から音響特徴量系列317を予測するために、音響モデル部306がDNN(ディープニューラルネットワーク)により実装される。その他、上記予測のために、音響モデル部306がHMM(Hidden Markov Model:隠れマルコフモデル)によって実装されてもよい。この場合、音声学習部301内のモデル学習部305は、音声の音響的な特徴を精度良くモデル化するために,コンテキストを考慮したモデルを学習する。音響特徴量を詳細にモデル化するために、直前、直後の音素だけでなく、アクセント、品詞、文長などの要因も考慮する。しかし、コンテキストの組み合わせが膨大なものとなるため、すべてのコンテキストの組み合わせについて精度良くコンテキスト依存モデルを学習することができる音声データを用意することは困難である。この問題を解決するために、モデル学習部305は、決定木に基づくコンテキストクラスタリングの技術を採用することができる。決定木に基づくコンテキストクラスタリングでは、「直前の音素は/a/であるか?」などのコンテキストに関する質問を用いてコンテキストに依存したモデルを分類し,類似したコンテキストのモデルパラメータを、学習結果315として音響モデル部306に設定する。決定木の構造によって考慮されるコンテキストが変化するため,適切な決定木構造を選択することで高精度かつ汎化性能の高いコンテキストに依存したモデルを推定できる。図3の音声合成部302内の音響モデル部306は、テキスト解析部307により歌声データ215から抽出された言語特徴量系列316に従って、コンテキストに依存したHMMを連結し,出力確率が最大となる音響特徴量系列317を予測する。
以上説明した実施形態は、電子鍵盤楽器について本発明を実施したものであるが、本発明は電子弦楽器など他の電子楽器にも適用することができる。
その他、本発明は上述した実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。また、上述した実施形態で実行される機能は可能な限り適宜組み合わせて実施しても良い。上述した実施形態には種々の段階が含まれており、開示される複数の構成要件による適宜の組み合せにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、効果が得られるのであれば、この構成要件が削除された構成が発明として抽出され得る。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
指定すべき第1音高と、指定された音高とが、一致するか否かを判断する判断処理と、
前記判断処理により前記第1音高との一致が判断された場合に、前記第1音高に対応する第1文字に応じた歌声を出力し、前記判断処理により前記第1音高との不一致が判断された場合に、前記判断処理により前記第1音高との一致が判断されるまで前記第1音高の次に指定すべき第2音高に対応する第2文字に応じた歌声を出力しない歌声出力処理と、
を実行する電子楽器。
(付記2)
前記歌声出力処理に合わせて伴奏データを出力する伴奏データ出力処理、を実行する付記1に記載の電子楽器。
(付記3)
前記歌声出力処理により前記第1音高に対応する前記第1文字に応じた歌声を出力後、前記第2音高を指定すべきタイミングの到来前に指定された音高が前記第2音高と不一致の場合に、出力された前記第1文字に応じた歌声の音高を前記指定された音高に変更して出力する音高変更処理、を実行する付記1または2に記載の電子楽器。
(付記4)
前記歌声出力処理により前記第1音高に対応する前記第1文字に応じた歌声を出力後、前記第2音高を指定すべきタイミングの到来前に指定された音高が前記第2音高と一致の場合に、前記第2音高を指定すべきタイミングの到来前に、前記指定に応じて、前記第2文字に応じた歌声の音高を前記第2音高で出力するとともに、前記伴奏データ出力処理が出力する伴奏データの進行を前記第2文字に応じた歌声の出力に合わせて進める制御処理、を実行する付記2または3に記載の電子楽器。
(付記5)
或る歌手が歌った歌声データ及び歌詞データによる機械学習により生成された学習済みモデルに基づいて、前記或る歌手に応じた歌声を音声合成する音声合成処理、を実行し、
前記歌声出力処理は、操作子が操作されたタイミングに応じて、前記音声合成処理により音声合成された歌声を前記操作された操作子により指定された音高で出力する付記1乃至4のいずれかに記載の電子楽器。
(付記6)
操作子を操作することにより音高を指定すべきタイミングに合わせて、指定すべき音高を示す識別子を表示する表示処理、を実行する付記1乃至5のいずれかに記載の電子楽器。
(付記7)
電子楽器のコンピュータに、
指定すべき第1音高と、指定された音高とが、一致するか否かを判断する判断処理と、
前記判断処理により前記第1音高との一致が判断された場合に、前記第1音高に対応する第1文字に応じた歌声を出力し、前記判断処理により前記第1音高との不一致が判断された場合に、前記判断処理により前記第1音高との一致が判断されるまで前記第1音高の次に指定すべき第2音高に対応する第2文字に応じた歌声を出力しない歌声出力処理と、
を実行させる方法。
(付記8)
電子楽器のコンピュータに、
指定すべき第1音高と、指定された音高とが、一致するか否かを判断する判断処理と、
前記判断処理により前記第1音高との一致が判断された場合に、前記第1音高に対応する第1文字に応じた歌声を出力し、前記判断処理により前記第1音高との不一致が判断された場合に、前記判断処理により前記第1音高との一致が判断されるまで前記第1音高の次に指定すべき第2音高に対応する第2文字に応じた歌声を出力しない歌声出力処理と、
を実行させるプログラム。