以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。本実施形態は、例えば電子鍵盤楽器に適用される、音高(鍵域)や音量(ベロシティ:打鍵の速さ)などの演奏情報によって音色が変化するのを再現するために、例えば大容量フラッシュメモリ208である第1記憶手段の音色波形領域から例えばRAM204である第2記憶手段の波形バッファに、音高又は音量ごとの波形データ(以下これを「スプリット波形」と呼ぶ)を転送する楽音発生装置を対象とする。本実施形態は、このような楽音発生装置において、例えばCPUである第1プロセッサが、例えば大容量フラッシュメモリである第1記憶手段内の第1波形データを、例えばRAMである第2記憶手段に転送する第1転送処理を実行する。また、第1プロセッサが、第1波形データに続く第2波形データのサイズが第2記憶手段内の複数の領域のうちのいずれかの領域のサイズと比較して大きいか否かを判定する判定処理を実行する。更に、第1プロセッサは、上記判定処理により第2波形データのサイズが第2記憶手段内のいずれかの領域のサイズより大きくないと判定された場合に、第2波形データをいずれかの領域に転送する第2転送処理を実行する。これに加えて、例えば音源LSI(大規模集積回路)である第2プロセッサが、第2記憶手段におけるいずれかの領域に転送された第1波形データを読み込む第1読込処理を実行する。また、第2プロセッサが、第2記憶手段におけるいずれかの領域に転送された第2波形データを読み込む第2読込処理を実行する。より具体的には例えば、第2プロセッサによる第1読込処理により読み込まれた第1波形データが発音部から出力された後、第2プロセッサによる第2読込処理により読み込まれた第2波形データが上記発音部から繰り返し出力される。この場合例えば、第1波形データは、開始位置から繰返し位置の前までの波形データを含み、第2波形データは、繰返し位置から終了位置までの波形データを含む。そして、第1転送処理は、例えば、第1プロセッサによる転送の位置が第2プロセッサによる読出しの位置を追い越さないように制御しながら、第1プロセッサが第1波形データを一回で或いは複数回に分けて、第2記憶手段内のいずれかの領域に転送する処理である。更に、第2転送処理は、第1プロセッサが第2波形データの全体を、第2記憶手段内のいずれかの領域に例えば一回で転送する処理である。もっとも、第2転送処理では、第1プロセッサは第2波形データの全体を、第1記憶手段内から第2記憶手段に一回で転送しなくても、複数回に分けて転送してもよい。本発明によれば、繰り返し発音部から出力すべき波形データともいえる第2波形データを、第1プロセッサが第1記憶手段内から第2記憶手段内に繰り返し転送しないため、トラフィックを低減することができ、結果として性能低下を改善する事ができる楽音発生装置を実現できる。
図1は、本発明による電子鍵盤楽器の一実施形態の外観図である。本実施形態は、電子鍵盤楽器100として実施される。電子鍵盤楽器100は、演奏操作子としての複数の鍵からなる鍵盤101と、音色選択操作子としての音色選択を行うための音色選択ボタン102及び音色以外の各種機能選択を行う機能選択ボタン103からなるスイッチ・パネルと、ピッチベンドやトレモロ、ビブラート等の各種モジュレーション(演奏効果)を付加するベンダ/モジュレーション・ホイール104、音色や音色以外の各種設定情報を表示するLCD(Liquid Crystal Display:液晶ディスプレイ)105等を備える。また、電子鍵盤楽器100は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、又は背面部等に備える。
音色選択ボタン102は、図1に示されるように、ピアノ(図中「Piano」)、エレクトリックピアノ(図中「E.piano」)、オルガン(図中「Organ」)、ギター(図中「Guitar)等の各種音色のカテゴリを選択するためのボタン群である。ユーザは、この音色選択ボタン102を押下することにより、例えば16音色のうちのいずれかを選択することができる。
図2は、図1の電子鍵盤楽器100の実施形態のハードウェア例を示す図である。図2の電子鍵盤楽器100において、システム全体はバスコントローラ201によって制御されるバス202を中心に構成される。バスコントローラ201はバス202上のデータの流れを司るものであるが、その役割は、バス202に接続されたデバイスの優先順位のコントロールである。例えば、メモリコントローラ203を介してバス202に接続されるRAM204は、CPU205と音源LSI206によって共有されているが、発音を行う音源LSI206はデータの欠落が許されないために優先度が最も高く設定されており、必要に応じてCPU205のアクセスを制限する。
バス202には、CPU205、音源LSI206、フラッシュメモリコントローラ207、メモリコントローラ203、DMA(ダイレクトメモリアクセス)コントローラ209、I/O(入出力)コントローラ210、I/Oコントローラ210を介して接続されるキー・スキャナ211とLCDコントローラ212とA/D(アナログ/デジタル)コンバータ213が接続される。
CPU205は、電子鍵盤楽器100の全体の制御処理を実行する第1プロセッサである。音源LSI206は、楽音発音専用の大規模集積回路である第2プロセッサである。
フラッシュメモリコントローラ207は、大容量フラッシュメモリ208とバス202を接続するインタフェース回路である。大容量フラッシュメモリ208は、波形データ、制御プログラム、固定データ等格納する。
メモリコントローラ203は、RAM204とバス202を接続するインタフェース回路である。RAM204は、波形データ、制御プログラム、データを必要に応じて配置する。RAM204はまた、CPU205や音源LSI206に内蔵されるDSP(デジタルシグナルプロセッサ)のワーク領域としても使用される。
I/Oコントローラ210は、バス202と、図1の鍵盤101、音色選択ボタン102、機能選択ボタン103、ベンダ/モジュレーション・ホイール104、又はLCD105等の周辺デバイスとを接続するインタフェース回路である。I/Oコントローラ210に接続されるキー・スキャナ211は、図1の鍵盤101や音色選択ボタン102又は機能選択ボタン103等のスイッチ・パネルの状態を走査して、その走査結果をI/Oコントローラ210及びバス202を介してCPU205に通知する。I/Oコントローラ210に接続されるLCDコントローラ212は、図1のLCD105のデバイスをコントロールする。A/Dコンバータ213は、図1のベンダ/モジュレーション・ホイール104の走査位置を検出する。
DMAコントローラ209は、大容量フラッシュメモリ208とRAM204間のDMA転送を制御する。
図3は、音源LSI206のブロック図である。音源LSI206は、波形発生器301、バスインタフェース302、DSP303、及びミキサ304を含む。波形発生器301は、図2のRAM204から波形データ読み出して楽音波形として発生する#1から#256までの256組の発振器である波形読出し装置305を具備する。バスインタフェース302は、バス202と、波形発生器301、DSP303、及びミキサ304との接続を行うバスインタフェース回路であり、これら各部と図2のCPU205又はRAM204との通信を司る。DSP303は、楽音信号に音響効果をもたらすデジタル信号処理回路である。ミキサ304は、波形発生器301が出力する楽音信号を混合したり、DSP303に送ったり、DSP303からの音響信号を受け取ったりすることで全体の楽音信号の流れを制御し、外部に出力する。ミキサ304からのデジタル楽音信号は、図2のD/Aコンバータ214でアナログ楽音信号に変換される。このアナログ楽音信号は、アンプ215で増幅された後に、アナログ楽音出力信号として出力される。
次に、図2の大容量フラッシュメモリ208は、NAND型フラッシュメモリなどの、大容量で安価なメモリデバイスである。なお、この大容量フラッシュメモリ208の代わりに、ハードディスク記憶装置や、ネットワーク上又はクラウド上のディスク装置が使用されてもよい。大容量フラッシュメモリ208には、主に以下のようなデータが格納されている。
・全ての音色の波形データ
・全ての音色のパラメータデータ
・CPU205やDSP303が実行するプログラム、プログラムの使用データ
・音楽データ
・ユーザの設定データ
波形データは例えば、1ワード長が16ビットのリニアPCMフォーマットデータである。
前述した大容量フラッシュメモリ208の内容は、CPU205からは任意のアドレスへのアクセスが可能であるが、音源LSI206からはアクセスすることができないので、大容量フラッシュメモリ208中の波形データをRAM204に転送する必要がある。しかしながら、RAM204の記憶容量は大容量フラッシュメモリ208よりも小さいために、全てのデータをRAM204中の発音チャネル毎のバッファ領域に転送することはできない。従って、RAM204の記憶内容は必要に応じて逐次入れ替える必要がある。入替えが必要なデータの中で特に本実施形態が対象とするものは波形データであるが、波形データの制御の詳細については後述する。
図1から図3に示す本実施形態の動作の概要について、以下に説明する。まず本実施例では、演奏者が図1の音色選択ボタン102を押下することで図1に示される16音色のうちのいずれかを選択することができる。各音色は、それぞれ1音色当たり最大32種類の波形が用いられ、波形データは大容量フラッシュメモリ208に格納されている。図4は、音色波形のスプリット制御の説明図である。図4に示されるように、1音色の音域(キー番号)とベロシティ域が2次元的に分割され、それぞれのスプリット(分割)エリアに、上述の最大32個の波形が割り当てられている。即ち、押鍵時の速さ(ベロシティ)とキー番号(鍵盤101の番号)の2つのファクタから、読み出されるべき波形が1つ決定される、という制御が実施される。
図5は、「フラッシュメモリ音色波形ディレクトリ」のデータ例を示す図である。フラッシュメモリ音色波形ディレクトリは、大容量フラッシュメモリ208上に格納されている全ての波形データの情報をまとめたテーブルである。具体的には、このテーブルは、「音色番号」及び「音色内波形番号」で決まる各音色の各波形それぞれが用いられる鍵域を示す「最低キー番号」と「最高キー番号」(図4の横軸)、前記各波形それぞれが用いられるベロシティ域情報である「最低ベロシティ」と「最高ベロシティ」(図4の縦軸)、実際に大容量フラッシュメモリ208のどのアドレスに配置されているかを示す「波形領域先頭からのアドレス」、波形の長さを示す「波形サイズ」、読出しに使用される「スタートアドレス」、「ループアドレス」、及び「エンドアドレス」の情報をまとめたテーブルである。このテーブルは、電源投入時に、RAM204上に展開される。
図6は、「RAM波形バッファディレクトリ」のデータ例を示す図である。RAM波形バッファディレクトリは、RAM204上のボイス(発振器)チャンネル毎の波形バッファのための情報を保持するテーブルである。具体的には、このテーブルには、ボイスの現在の状況を表す「ボイスステータス」、読み出されるべき波形の3つのアドレス情報である「波形バッファスタートアドレス」と「波形バッファループアドレス」と「波形バッファエンドアドレス」、CPU205による大容量フラッシュメモリ208上の現在の転送波形の読出しアドレスである「転送データポインタ」、CPU205によるRAM204への転送書込みアドレスである「書込みポインタ」、音源LSI206によるRAM204上の現在の読出しアドレスである「読出しポインタ最新値」、そして、書込みポインタと読出しポインタ最新値との差分である「読出しマージン」が保持される。なお、以下の説明では、「読出しポインタ最新値」を「読出しポインタ」と言う。また、「読出しマージン」は、「波形読出しマージン」と記載する。
図7(a)は、大容量フラッシュメモリ208上の音色波形領域からRAM204上の波形バッファへの音色波形転送動作の説明図である。大容量フラッシュメモリ208上には全ての音色の波形データが格納されており、そのサイズは波形毎に異なる。RAM204上には波形バッファが発音ボイスチャンネル分確保されている。これらのサイズは一定であり、実施例では16KB(キロバイト)である。前述したように波形データは、以下のアドレス情報を持つ。
1.スタートアドレス:音源LSI206が読出しを開始するためのアドレス
2.エンドアドレス:音源LSI206が読出しを行う最も後方のアドレス
3.ループアドレス:スタートアドレスとエンドアドレスの間に存在し、
波形読出しがエンドアドレスに達した場合に、次に読み出されるのが
このループアドレスである。なお、ループアドレスが、エンドアドレスと
等しい場合は、ループは行われず、読出しポインタがエンドアドレス
に達した時点で発音を停止する。
また、必ずしもスタートアドレスが波形データの先頭である必要もなく、エンドアドレスが、波形の最後尾である必要もない。
バッファサイズを16K(キロ)ワード、波形番号wを有する波形のスタートアドレスをstart_ad[w]、ループアドレスをloop_ad[w]、エンドアドレスを end_ad[w]としたとき、各波形は、そのサイズによって以下の3つに分類される。
TypeA:
end_ad[w]−start_ad[w]≦16384(16Kワード)
TypeB:
end_ad[w]−start_ad[w]>16384
end_ad[w]−loop_ad[w]+1≦16384
TypeC:
end_ad[w]−loop_ad[w]>16384
本実施形態では、これら3つのType(タイプ)によって波形読込みの手法が変更される。まず、TypeCの波形転送動作は、以下の通りである。TypeCは、ループ区間も波形バッファに格納できないタイプであり、この場合には通常のリングバッファ方式の制御が実施される。図7(b)は、TypeCのリングバッファの動作の説明図である。図7(b)に示されるように、波形バッファvの全体を1つのリングとして、音源LSI206は、発音開始から発音終了まで、単純に波形バッファvの全区間を繰り返し読み続ける。そのため、CPU205は、波形バッファvにおいて、CPU205が更新する書込みポインタwp[v]が、音源LSI206が更新する読出しポインタrp[v]を追い越さないように、大容量フラッシュメモリ208の音色波形領域wからRAM204上の波形バッファvに波形データを転送し続ける。
また、波形読出し式の電子楽器では有限の波形データの読出しを無限に継続させるために、波形データの一区間を繰返し読み出すループという手法を用いるのが一般的である。音色波形領域wにおいて、スタートアドレスから波形の読出しが開始され、エンドアドレスに達すると、それより手前に設定されたループアドレスに不連続に戻り、エンドアドレスに達すると再度ループアドレスに戻るという動作が無限に繰り返される。本実施形態では、CPU205が読み出したデータをそのまま順次リングバッファである波形バッファ[v]に書き込んでゆく。このときのCPU205による波形データ転送における音色波形領域w上の読出しアドレスは転送データポインタtp[v]であり、CPU205よる波形バッファvへの書込みアドレスは書込みポインタwp[v]であり、音源LSI206による波形バッファvからの読出しアドレスは読出しポインタrp[v]である。
例えば、音色波形領域wの波形サイズ(スタートアドレスからエンドアドレスまで)が波形バッファvのサイズよりも小さいか等しいTypeAのループ波形転送動作の場合、音色波形領域w上の全ての波形データを波形バッファvに転送することができるため、音源LSI206による読出しアドレスは、波形バッファvの中にループ区間を設けてループさせておけばよい。従って、CPU205は、音色波形領域w上の波形データをエンドアドレスまで波形バッファvに転送すれば、それ以上の転送は必要ない。
図8は、TypeBのループ波形転送動作の説明図である。本実施形態における特徴的なポイントの1つは、このTypeBの動作である。多くの楽音波形は、全体の波形サイズと比較するとループ区間は短いことが多く、例えば、波形データ全体(スタートアドレスからエンドアドレスまで)をRAM204のバッファ領域内に格納できなくても、ループ区間の波形データ(ループアドレスからエンドアドレスまで)だけであればバッファ領域に格納できるケースは多いはずである。本実施形態では、従来のように、ループ区間の読出しが行われる毎に音色波形領域wから波形バッファvに波形データが転送はされない。
本実施形態では、図8に示されるように、波形データのループ区間(ループアドレスからエンドアドレスまで)が波形バッファvの或る領域内に収まるような制御が実行される。この制御では、図8(b)に示されるように、波形バッファvの先頭にループアドレスの波形データが配置され、波形データ全体が連続的に発音部から出力されるように、スタートアドレスの波形データを波形バッファv内のどの位置に書き込むべきかを示す書込みアドレスが逆算により算出されて、図8(a)に示されるように、その書込みアドレスが示す領域から波形データが格納開始されるように、転送1が開始される。その後、転送2が開始される。もっとも第1プロセッサは転送1を開始する前や、転送1の開始と同時に転送2の処理を実行していてもよく、発音部による発音に間にあうように、波形バッファへの転送1及び転送2の転送が完了していればよい。音源LSI206は、図8(a)に示す波形バッファv上の上記書込みアドレスから波形データの読み込みを開始し、ループ区間に入ると、図8(b)に示す波形バッファvの先頭から実際の波形データのエンドアドレスの位置まで繰り返し波形データを読み込む。それ以降は、音源LSI206が波形バッファv内でループ処理を行うので、CPU205による波形転送は必要なくなる。このときのスタートアドレスの波形バッファv上のアドレスは、下記式の演算により算出される。
波形バッファv上のスタートアドレス=
BUF_SIZE−1−mod(loop_ad[w]
−start_ad[w]+1,BUF_SIZE)
但し、mod(a,m)関数はaをmで除算したモジュロ(剰余)を求める関数。
また、BUF_SIZE=波形バッファvのサイズ=16384バイト
ところで、波形バッファvの書込みポインタwp[v]が音源LSI206の読出しポインタrp[v]を追い越せば、音源LSI206が読み出す波形データは、突然、不連続に過去のデータに戻ってしまい、ノイズが発生することになる。これは音楽的に許容できるものではない。
そこで、本実施例では、波形バッファvにおける読出しポインタrp[v]が、波形データを充当しない状態でどれだけ読めるかというデータのワード数(アドレス)、即ち、書込みポインタwp[v]の値と読出しポインタrp[v]の値の差分が、波形読出しマージンとして管理される。本実施形態では、この波形読出しマージンが所定の値以下に達した場合、その楽音を発生しているボイスチャネルに対してダンプ処理(緩やかな消音処理)が実行され、その処理の後に発音が停止した時点でそのボイスチャネルの波形バッファvからの読出しが中止されることにより、ノイズの発生を防止することができる。
本実施例では、その波形読出しマージンの値は、固定値ではなく再生ピッチが考慮されて、原音ピッチによる再生時には1Kワード未満、1オクターブ上のピッチでの再生時には2Kワード未満、1オクターブ下のピッチでの再生時には512ワード未満になったら、ダンプ処理の実行が決定される。
ダンプ処理の速度は、このまま波形が補充されずに読み進んだとしても、すでに波形バッファvに転送された読込みマージン分の波形データが読み切られる前に消音できるだけの速度であればよい。その速度は現在の再生ピッチに依存する。
図9は、図2のCPU205が実行する制御処理のメインルーチンの処理例を示すフローチャートである。図1の電子鍵盤楽器100において、機能選択ボタン103により装置電源がパワーオンされると、CPU205は、図9のフローチャートで示されるメインルーチンを起動し、まず装置各部を初期化する初期化処理を実行する(ステップS901)。ステップS901の初期化処理が完了すると、ユーザが図1の音色選択ボタン102又は機能選択ボタン103の操作状態を取り込むスイッチ処理(ステップS902)、ステップS902の処理の結果に基づく音色選択ボタン102が操作された際の音色選択イベントの検出及び音色選択処理(ステップS903→S904)、ユーザが図1の鍵盤101を弾いた際の押鍵イベントや離鍵イベントを取り込む鍵盤処理(ステップS905)、ステップS905の処理の結果に基づく押鍵イベントの検出及び押鍵処理(ステップS906→S907)、ステップS905の処理の結果に基づく離鍵イベントの検出及び離鍵処理(ステップS908→S909)、音源LSI206からのイベントの処理を行う音源イベント処理(ステップS910)、音源LSI206に対して一定時間毎の処理を行う音源定期処理(ステップS911)が、繰り返し実行される。
図10(a)は、図9のステップS901の初期化処理の詳細例を示すフローチャートである。まず、CPU205は、大容量フラッシュメモリ208からフラッシュメモリ音色波形ディレクトリ(図5参照)のテーブルデータを、RAM204上の指定されたアドレスに転送する(ステップS1001)。
次に、ステップS1002とステップS1004の繰返し制御処理によりボイス数分のループ処理が実行される。このループ処理中のステップS1003において、ボイスステータスvs[v]、ボイス番号vに対応する波形バッファvの波形バッファスタートアドレスsa[v]、波形バッファループアドレスla[v]、波形バッファエンドアドレスea[v]が初期化される。
次に音色波形領域wから波形バッファvへの波形の転送を管理するための転送要求カウンタ、転送状態フラグ、転送要求バッファ(リンク構造)が初期化される(ステップS1005)。転送要求カウンタは、転送中のボイスが現在いくつあるか管理するものであり、転送状態フラグは、音色波形領域から波形バッファへの転送中か否かを判断するフラグであり、転送要求バッファは次にどのボイスに対して音色波形領域から波形バッファへの波形転送を行うかを管理するためのバッファである。
図10(b)は、図9のステップS904の音色選択処理の詳細例を示すフローチャートである。CPU205は、押鍵処理などで使用するために、図1の音色選択ボタン102の操作により指定された音色番号がRAM204内のワーク領域に保存しておく(ステップS1010)。
図11は、図9のステップS907の押鍵処理の詳細例を示すフローチャートである。CPU205は、鍵盤が弾かれた際の押鍵による演奏情報(鍵盤位置、押された強さ)を、キー番号、ベロシティに変換し、これらに基づく制御処理を実行する。
CPU205は、最初に、この押鍵での発音にどのボイスを使用するかを決定するボイスアサインを実行する(ステップS1101)。CPU205は、RAM204に記憶されている図6に例示されるRAM波形バッファディレクトリにおいて、ボイスステータスが不使用(vs[v]=0)のボイス番号のボイスから優先的にアサインする。CPU205は、ボイスステータスが発音中(vs「v」=1)又は減衰中(vs「v」=2)のボイスをアサインしなくてはならないとき(ステップS1102の判定がYESの場合)は、ダンプ処理を実行する(ステップS1103)。
次に、CPU205は、キー番号、ベロシティ、現在の音色番号から、音色波形領域から波形バッファへ転送を行うべき波形番号wを取得する(ステップS1104)。
次に、CPU205は、キー番号、波形番号wから得られる波形情報から、再生ピッチを計算する(ステップS1105)。
次に、CPU205は、再生ピッチから、波形読出しマージン(図6参照)を決定する(ステップS1106)。
次に、CPU205は、読出しポインタrp[v]の更新処理に必要な、読出しポインタrp[v]に周期的に加算するオフセット値を計算する(ステップS1107)。
次に、CPU205は、波形番号wのスタートアドレスstart_ad[w]、ループアドレスloop_ad[w]、及びエンドアドレスend_ad[w]から、前述した条件に従ってTypeA、TypeB、又はTypeCのいずれかの転送Typeを設定する(ステップS1108)。
次に、CPU205は、転送TypeがTypeA又はTypeCの場合は、読出しポインタrp[v]及び書込みポインタwp[v]を0に設定する(ステップS1109→S1110)。CPU205は、転送TypeがTypeBの場合は、前述したループアドレスが波形バッファvの先頭になるように読出しポインタrp[v]及び書込みポインタwp[v]を逆算して、補正された各値を設定する(ステップS1109→S1111)。
ステップS1110又はS1111の処理の後、CPU205は、音色波形領域から波形バッファへの波形転送を行うために、波形転送管理処理に対して新規転送要求を発行し、波形転送管理処理での処理の終了を待つ(ステップS1112)。
CPU205は、書込みポインタwp[v]と読出しポインタrp[v]の差分から波形読出しマージンを計算することにより(ステップS1113)、ステップS1112の波形転送管理処理で波形バッファに波形が転送されたか否かを確認し、再生ピッチで決定された波形読出しマージンと比較を行う(ステップS1113→S1114→S1113の繰返し)。CPU205は、現在の波形読出しマージンが再生ピッチで決定された波形読出しマージンより大きくなった時点で、波形読出しの開始、即ち発音の開始を行い、ボイスステータス(図6参照)を発音中(vs「v」=1)にする(ステップS1114→S1115)。その後、CPU205は、図11のフローチャートで例示される図9のステップS907の押鍵処理を終了する。
図10(c)は、図9のステップS909の離鍵処理の詳細例を示すフローチャートである。CPU205は、鍵盤を弾いた際の離鍵による演奏情報を(鍵盤位置)をキー番号に変換し、ピッチ、フィルタ、アンプのエンベロープ設定等に基づくリリース状態への移行処理を実行する(ステップS1020)。この処理は、本実施形態の波形転送に関する部分には影響を与えない。ステップS1020の処理の後、CPU205は、図10(c)のフローチャートで例示される図9のステップS909の離鍵処理を終了する。
図12及び図13は、波形転送管理処理を示すフローチャートである。CPU205は、図12のステップS1201、S1202、及びS1203でそれぞれ、波形転送管理処理に対して発行されたイベントが、新規転送要求、転送要求、転送終了、又は転送停止の何れであるかを判定し、それぞれのイベントに対応した処理を実行する。
新規転送要求イベントが発行された場合(図11のステップS1112参照)、図12のステップS1201の判定がYESとなって、図13のステップS1216の処理が実行される。ステップS1216で、CPU205は、転送状態フラグを確認する。
ステップS1216で転送状態フラグが転送終了待ちであると判定された場合は、別のボイスに対して音色波形領域から波形バッファへの波形転送を行っている最中であるので、CPU205は、別のボイスの転送終了イベントからの転送要求イベントで処理されるように、転送要求バッファの先頭に該当ボイスを設定する(図13のステップS1225)。その後、CPU205は、図12及び図13のフローチャートで示される波形転送管理処理を終了する。
ステップS1216で転送状態フラグが待機状態であると判定された場合は、CPU205はまず、該当ボイス番号に対して、転送1回あたりの読出しサイズ(ここでは2ページ)を指定し、後述する波形読出し、波形バッファ転送処理(図14(a))に、転送要求を発行する(図13のステップS1217)。
次に、CPU205は、転送状態フラグを転送終了待ちに設定し(図13のステップS1218)、該当ボイスを転送要求バッファの最後尾に設定する(図13のステップS1219)。
次に、CPU205は、転送データポインタtp[v]を更新し(図13のステップS1220)、転送要求バッファカウンタをインクリメントする(図13のステップS1221)。
次に、CPU205は、転送Typeを確認する(図13のステップS1222)。転送TypeがAの場合は、波形バッファ内に波形の全てが転送可能であるので、全データが転送完了したかを判定する(図13のステップS1223)。この判定は、転送データポインタがエンドアドレスに到達したかどうかで判断できる。
全データの転送が完了している場合は、これ以上の転送は必要ないので、波形転送管理処理に対して、転送停止イベントを発行する(図13のステップS1224)。その後、CPU205は、図12及び図13のフローチャートで示される波形転送管理処理を終了する。
ステップS1222で、転送TypeがB又はCと判定された場合、或いは、ステップS1223で全データの転送が完了していないと判定された馬合には、CPU205は、図12及び図13のフローチャートで示される波形転送管理処理を終了する。
後述する波形読出し、波形バッファ転送処理で指定サイズ分の波形データの転送が終了し波形転送管理処理に対して転送終了の要求イベントが発行された場合(図14(a)のステップS1407)、図12のステップS1201及びS1202の判定がNO、ステップS1203の判定がYESとなって、図12のステップS1206の処理が実行される。ステップS1206で、CPU205は、転送要求バッファに転送待ちのボイスがあるか否か、即ち、転送要求バッファカウンタが0でないか0であるかを判定する。
ステップS1206の判定がNOならば、音色波形領域から波形バッファへの全ての転送が終了した状態(無音)なので、CPU205はそのまま何もせずに、図12及び図13のフローチャートで例示される現在の波形転送管理処理を終了する。
ステップS1206の判定がYESならば、CPU205は、次のボイスが処理されるよう波形転送管理処理に対して、転送要求イベントを発行し(ステップS1207)、図12及び図13のフローチャートで例示される現在の波形転送管理処理を終了する。
上述した図12のステップS1207の処理により、波形転送管理処理に大使って転送要求イベントが発行されると、図12のステップS1201の判定がNO、ステップS1202の判定がYESとなって、図12のステップS1208の処理が実行される。ステップS1208で、CPU205は、転送要求バッファの先頭のボイスについて転送処理を実行する。書込みポインタwp[v]と読出しポインタrp[v]を確認し、波形バッファvへの転送を行うことによって、書込みポインタwp[v]が読出しポインタrp[v]を追い越してしまう場合は、そのボイスvについては、転送要求バッファの最後尾に設定し、先頭から2番目のボイスに対して処理を行う。
次に、CPU205は、該当ボイス番号に対して、転送1回あたりの読出しサイズ(こでは2ページ)を指定し、後述する波形読出し、波形バッファ転送処理(図14(a))に、転送要求を発行する(図12のステップS1209)。
次に、CPU205は、転送状態フラグを転送終了待ちに設定し(図12のステップS1210)、該当ボイスを転送要求バッファの最後尾に設定する(図12のステップS1211)。
次に、CPU205は、転送データポインタtp[v]を更新する(図12のステップS1212)。
次に、CPU205は、転送Typeを確認する(図12のステップS1213)。転送TypeがA又はBの場合は、波形バッファ内に波形の全データが転送完了したかを判定する(図12のステップS1214)。この判定は、転送データポインタがエンドアドレスに到達したかどうかで判断できる。
全データの転送が完了している場合は、これ以上の転送は必要ないので、波形転送管理処理に対して、転送停止イベントを発行する(図12のステップS1215)。その後、CPU205は、図12及び図13のフローチャートで示される波形転送管理処理を終了する。
ステップS1213で、転送TypeがB又はCと判定された場合、或いは、ステップS1214で全データの転送が完了していないと判定された馬合には、CPU205は、図12及び図13のフローチャートで示される波形転送管理処理を終了する。
図13のステップS1224、図12のステップS1215、又は後述する音源イベント処理(図14(b)のステップS1413)において波形転送管理処理に対して転送停止イベントが発行された場合、図12のステップS1201、S1202、及びS1203の判定が何れもNOとなって、ステップS1204が実行される。この場合、発音停止状態となり波形読出しは停止しているので、CPU205は、転送要求バッファから該当ボイスを削除し、転送要求バッファカウンタをデクリメントする(ステップS1204)。その後、CPU205は、図12及び図13のフローチャートで示される波形転送管理処理を終了する。
図14(a)は、波形読出し、波形バッファ転送処理を示すフローチャートである。このフローチャートの処理は、図13のステップS1217又は図12のステップS1209からの転送要求イベントにより起動される。
CPU205は、ステップS1401とS1405のループ制御処理により、以下のステップS1402からS1404の一連の処理を、波形転送管理処理(図13のステップS1217又は図12のステップS1209)で指定された指定サイズ分繰り返し実行する。
まず、ステップS1402で、CPU205は、転送データポインタtp[v]に基づいて、大容量フラッシュメモリ208の音色波形領域wからページ単位で波形データを読み込む。
次に、ステップS1403で、CPU205は、波形バッファループアドレス及び波形バッファエンドアドレスを考慮し、ループ読出しの場合は、不要な部分は読み捨てる。
そして、ステップS1404で、CPU205は、波形バッファvの書込みポインタwp[v]に応じたアドレスに、ステップS1402及びS1403で音色波形領域wから読み出した波形データの書込みを行う。CPU205は、書き込んだサイズ分、書込みポインタwp[v]を更新する。
次に、CPU205は、転送状態フラグに待機状態を設定し(ステップS1406)、前述した波形転送管理処理に対して、転送終了イベントを発行する(ステップS1407)。その後、CPU205は、図14のフローチャートで示される波形読出し、波形バッファ転送処理を終了する。
図14(b)は、図9のステップS910の音源イベント処理の詳細例を示すフローチャートである。CPU205は、図9のステップS909又は図10(c)の離鍵処理によってリリース状態に移行したボイスが、リリースレベルに到達した場合(ステップS1410の判定がYESの場合)、もしくは、ダンプ処理によってボイスがダンプレベルに到達した場合(ステップS1411の判定がYESの場合)は、当該ボイスに対して、波形読出しの停止(発音終了)を行った後(ステップS1412)、前述した波形転送管理処理に対して転送停止イベントを発行する(ステップS1413)。その後、CPU205は、図14(b)のフローチャートで例示される図9のステップS910の音源イベント処理を終了する。
図15(a)は、図9のステップS911の音源定期処理の詳細例を示すフローチャートである。CPU205は、ピッチ変更があった場合(ステップS1501の判定がYES)、ステップS1502とS1508の繰返し制御処理によりボイス数分、以下のステップS1503からS1507の一連の処理を繰り返し実行する。
まず、CPU205は、ボイスステータスが不使用以外のボイスについて、転送Typeを確認する(ステップS1503→S1504)。
CPU205は、転送TypeがA又はBの場合は全データの転送が完了していないボイス(ステップS1504→S1505→S1506)、転送TypeがCの場合は全ボイスに対して(ステップS1504→S1506)、ピッチ変更後の再生ピッチから波形読出しマージンを決定する(ステップS1506)。
続いて、CPU205は、読出しポインタrp[v]の更新処理に必要な読出しポインタrp[v]に周期的に加算するオフセット値を再計算する(ステップS1507)。
その後、CPU205は、読出しポインタrpの更新処理(ステップS1509)と波形読出しマージン確認処理(捨てS1510)を実行し、図15(a)のフローチャートで例示される図9のステップS911の音源定期処理を終了する。
図15(b)は、図15(a)のステップS1509の読出しポインタrp[v]の更新処理(rp更新処理)の詳細例を示すフローチャートである。CPU205は、ステップS1510とS1515の繰返し制御処理によりボイス数分、以下のステップS1511からS1514の一連の処理を繰り返し実行する。
まず、CPU205は、ボイスステータスが不使用以外のボイスについて、転送Typeを確認する(ステップS1511→S1512)。
CPU205は、転送TypeがA又はBの場合は全データの転送が完了していないボイス(ステップS1512→S1513→S1514)、転送TypeがCの場合は全ボイスに対して(ステップS1512→S1514)、読出しポインタrp[v]にオフセット値offsetを加算する(ステップS1514)。その後、CPU205は、図15(b)のフローチャートで例示される図15のステップS1509の読出しポインタrp[v]の更新処理(rp更新処理)を終了する。
図16は、図15(a)のステップS1510のマージン確認処理の詳細例を示すフローチャートである。CPU205は、ステップS1601とS1608の繰返し制御処理によりボイス数分、以下のステップS1602からS1607の一連の処理を繰り返し実行する。
まず、CPU205は、ボイスステータスが発音中のボイスについて、転送Typeを確認する(ステップS1602→S1603)。
CPU205は、転送TypeがA又はBの場合は全データの転送が完了していないボイス(ステップS1603→S1604→S1605)、転送TypeがCの場合は全ボイスに対して(ステップS1603→S1605)、書込みポインタwp[v]と読出しポインタrp[v]の差分から、波形読出しマージンを算出する(ステップS1605)。
続いて、CPU205は、ステップS1605で算出した波形読出しマージンを、再生ピッチから決定された波形読出しマージンと比較する(ステップS1606)。この結果、ステップS1605で算出した現在の波形読出しマージンのほうが小さければ、該当ボイスに対して、指定レイトを用いて、ダンプ処理を実行する(ステップS1607)。ステップS1605で算出した現在の波形読出しマージンのほうが大きければ、ステップS1607はスキップする。
以上説明したようにして、本実施形態では、音源LSI206が読み出す波形データが格納される高速小容量のRAM204と、機器全ての音色波形データを保持するNANDフラッシュなどの低速大容量フラッシュメモリ208を持ち、演奏時に大容量フラッシュメモリ208の音色波形領域からRAM204の波形バッファに転送を開始し、所定容量転送後に音源が読み出しを開始する逐次転送型楽音発生装置において、バッファのサイズBと波形のスタートアドレスからエンドアドレスまでの長さW、波形のループ区間の長さLを比較し、B≧Wの時はエンドで転送停止、B≦WかつB≧Lの時はループ波形データがバッファ内で分断されないようにスタートアドレスを逆算して転送を開始し、エンドで転送停止、B<Lの時は従来通り発音停止まで転送を続ける制御が実施される。このような制御により、上述の3つのケースのうち、2つのケース(B≧W、B≦WかつB≧L)では、エンドアドレスまで波形を転送すれば、それ以上の転送は不要となるため、波形転送によるトータルでのトラフィック平均値を大幅に低減することが可能となる。この結果、性能低下を改善することができる楽音発生装置、又はそのような楽音発生装置を用いた電子楽器を実現できる。あるいは性能低下を補正するためのハードウェアのコストを削減できる楽音発生装置、又はそのような楽音発生装置を用いた電子楽器を実現することが可能となる。
その他、本発明は上述した実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。また、上述した実施形態で実行される機能は可能な限り適宜組み合わせて実施しても良い。上述した実施形態には種々の段階が含まれており、開示される複数の構成要件による適宜の組み合せにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、効果が得られるのであれば、この構成要件が削除された構成が発明として抽出され得る。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
第1記憶手段内の第1波形データを第2記憶手段に転送する第1転送処理と、
前記第1波形データに続く第2波形データのサイズが前記第2記憶手段における複数の領域のうちのいずれかの領域のサイズと比較して大きいか否かを判定する判定処理と、
前記判定処理により前記第2波形データのサイズが前記いずれかの領域のサイズより大きくないと判定された場合に、前記第2波形データを前記いずれかの領域に転送する第2転送処理と、
を実行する第1プロセッサと、
前記第2記憶手段に転送された前記第1波形データを読み込む第1読込処理と、
前記第2記憶手段における前記いずれかの領域に転送された前記第2波形データを読み込む第2読込処理と、
を実行する第2プロセッサと、
を有する楽音発生装置。
(付記2)
少なくとも前記第1プロセッサ及び前記第2プロセッサのいずれかのプロセッサは、前記第1波形データに基づく出力が発音部からなされた後、前記第2波形データに基づく出力が前記発音部から繰り返しなされるように制御している、ことを特徴とする付記1に記載の楽音発生装置。
(付記3)
前記第1プロセッサは、前記第2波形データに基づく出力が発音部からなされている際に、前記第2転送処理を実行していないことを特徴とする付記1又は2に記載の楽音発生装置。
(付記4)
前記第1波形データは、開始位置から繰返し位置の前までの波形データを含み、
前記第2波形データは、前記繰返し位置から終了位置までの波形データを含み、
前記第1プロセッサは、前記第2記憶手段内への前記第1波形データの転送の位置が前記第2プロセッサによる前記第1波形データの読込みの位置を越えないように制御しながら、前記第1転送処理を実行している、
ことを特徴とする付記1乃至3のいずれかに記載の楽音発生装置。
(付記5)
前記第1プロセッサは、前記第2波形データにおける前記繰返し位置が前記第2記憶手段内のいずれかの領域の先頭になるように、前記第2記憶手段内における前記第1波形データの書込み開始位置を算出する算出処理を実行する、ことを特徴とする付記4に記載の楽音発生装置。
(付記6)
第1記憶手段内の第1波形データを第2記憶手段に転送する第1転送処理と、
前記第1波形データに続く第2波形データのサイズが前記第2記憶手段における複数の領域のうちのいずれかの領域のサイズと比較して大きいか否かを判定する判定処理と、
前記判定処理により前記第2波形データのサイズが前記いずれかの領域のサイズより大きくないと判定された場合に、前記第2波形データを前記いずれかの領域に転送する第2転送処理と、
を第1プロセッサに実行させ、
前記第2記憶手段に転送された前記第1波形データを読み込む第1読込処理と、
前記第2記憶手段における前記いずれかの領域に転送された前記第2波形データを読み込む第2読込処理と、
を第2プロセッサに実行させる、
ことを特徴とする楽音発生方法。
(付記7)
第1記憶手段内の第1波形データを第2記憶手段における複数の領域のうちのいずれかの領域に転送する第1転送処理と、
前記第1波形データに続く第2波形データのサイズが前記複数の領域のうちのいずれかの領域のサイズと比較して大きいか否かを判定する判定処理と、
前記判定処理により前記第2波形データのサイズが前記いずれかの領域のサイズより大きくないと判定された場合に、前記第2波形データを前記いずれかの領域に転送する第2転送処理と、
を第1プロセッサに実行させ、
前記第2記憶手段における前記いずれかの領域に転送された前記第1波形データを読み込む第1読込処理と、
前記第2記憶手段における前記第1領域に転送された前記第2波形データを読み込む第2読込処理と、
を第2プロセッサに実行させる、
ためのプログラム。
(付記8)
付記1乃至5の何れかに記載の楽音発生装置と、
前記第1波形データ及び前記第2波形データに基づいて発音する発音部と、
を備える電子楽器。