以下、本発明を実施するための形態(以下「本実施形態」と記載する)について図面を参照しながら詳細に説明する。本実施形態は、例えば電子鍵盤楽器に適用される、音高(鍵域)や音量(ベロシティ:打鍵の速さ)などの演奏情報によって音色が変化するのを再現するために、大容量の2次記憶装置(例えばフラッシュメモリ)から1次記憶装置(例えばRAMによる波形メモリ)に、音高または音量ごとの波形データ(以下これを「スプリット波形」と呼ぶ)を読み込む楽音発生装置を対象とする。本実施形態は、このような楽音発生装置において、演奏者が音色選択のために音色の比較操作を行っていることを検知した場合に、演奏者は同じ鍵域のノートを連打しながら音色選択を行う可能性が高いと判断し、次のスプリット波形の波形データとして、前回と同じ鍵域で同じくらいのベロシティに対応する波形データから先に読み込み、また、波形データの読み込み中に押鍵が有った場合は、その押鍵に対応する波形データから優先的に読み込みを行う処理を実行することで、無音状態を最小限に留めることができる電子鍵盤楽器を実現するものである。
図1は、本発明による電子鍵盤楽器の実施形態の外観図である。本実施形態は、電子鍵盤楽器100として実施される。電子鍵盤楽器100は、演奏操作子としての複数の鍵かならる鍵盤101と、音色選択操作子としての音色選択を行うための音色選択ボタン102および音色以外の各種機能選択を行う機能選択ボタン103からなるスイッチ・パネルと、ピッチベンドやトレモロ、ビブラート等の各種モジュレーション(演奏効果)を付加するベンダ/モジュレーション・ホイール104、音色や音色以外の各種設定情報を表示するLCD(Liquid Crystal Display:液晶ディスプレイ)105等を備える。また、電子鍵盤楽器100は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、または背面部等に備える。
音色選択ボタン102は、図1に示されるように、ピアノ(図中「Piano」)、エレクトリックピアノ(図中「E.piano」)、オルガン(図中「Organ」)、ギター/ベース(図中「Guitar/Bass」)、ウインド(図中「Wind」)、ストリング(図中「String」)、シンセ(図中「Synth」)、またはパーカッション(図中「Percussion」)等の各種音色のカテゴリを選択するためのカテゴリボタン群(図中「Category」)と、各カテゴリ内の音色番号を選択するための例えば1〜8の音色番号ボタン群(図中「Number」)を備える。すなわち、演奏者は、まずいずれかのカテゴリボタンを押下することにより音色のカテゴリを選択し、そののちにいずれかの音色番号ボタンを押下することにより選択したカテゴリ内の音色番号を指定する。
図2は、図1の電子鍵盤楽器100の実施形態のハードウェア構成例を示す図である。図2において、電子鍵盤楽器100は、CPU(中央演算処理装置)201、ROM(リードオンリーメモリ)202、RAM(ランダムアクセスメモリ)203、大容量フラッシュ(Flash)メモリ204、波形メモリ206が接続される音源LSI(大規模集積回路)205、図1の鍵盤101と図1の音色選択ボタン102および機能選択ボタン103からなるスイッチ・パネルとが接続されるキー・スキャナ207、図1のベンダ/モジュレーション・ホイール104が接続されるA/Dコンバータ208、図1のLCD105が接続されるLCDコントローラ209、16bit(ビット)フリーランニング・タイマカウンタ212、およびMIDI(Musical Instrument Digital Interface)入力を受け付けるMIDI I/F(インタフェース)213が、それぞれシステムバス214に接続される構成を備える。また、音源LSI205から出力されるデジタル楽音波形データは、D/Aコンバータ210によりアナログ楽音波形信号に変換され、アンプ211で増幅された後に、特には図示しないスピーカまたは出力端子から出力される。
CPU201は、RAM203をワークメモリとして使用しながらROM202に記憶された制御プログラムを実行することにより、図1の電子鍵盤楽器100の制御動作を実行する。また、ROM202は、上記制御プログラムおよび各種固定データを記憶する。
大容量フラッシュメモリ204は、波形データ等の大容量データの格納領域であり、シーケンシャルアクセスにより順次アクセスされる。一方、音源LSI205には、波形データを展開するRAMで構成される波形メモリ206が接続され、発音される楽音の波形データは必ず、この波形メモリ206上に配置されている必要がある。CPU201は、大容量フラッシュメモリ204から波形データをシーケンシャルに読みだし、それを音源LSI205経由で波形メモリ206に転送することで、音色データを入れ替えることができる。
LCDコントローラ209は、LCD105を制御するIC(集積回路)である。キー・スキャナ207は、鍵盤101や音色選択ボタン102または機能選択ボタン103等のスイッチ・パネルの状態を走査して、CPU201に通知するICである。A/Dコンバータ208は、ベンダ/モジュレーション・ホイール104の操作位置を検出するICである。16bitフリーランニング・タイマカウンタ212は、イベントの時刻検出のための計時を行う。
本実施形態においては、鍵域やベロシティによって音量や音高のみならず音色が変化するのを再現するために、大容量フラッシュメモリ204から波形メモリ206に、音高または音量ごとの音色の波形データが読み込まれる。このように、一つの音色に対して、音高または音量ごとに波形データを管理する手法を「音色波形スプリット」と呼び、そのように管理される波形データを「スプリット波形」と呼ぶ。図3は、音色波形スプリットの説明図である。音色波形スプリットにおいては、図3(a)に例示されるように、図1の鍵盤101上で演奏者が演奏する鍵域(図3(a)の横軸の「Key」)ごとにそれぞれ波形データが割り当てられ、また同じ鍵域であっても演奏の強さすなわちベロシティ(図3(a)の縦軸の「Velocity」)ごとでもそれぞれ波形データが割り当てられている。
波形メモリ206に記憶される波形データは、図3(b)に例示される音色波形スプリット情報テーブルに基づいて管理される。大容量フラッシュメモリ204から波形メモリ206に或る音色の波形データが演奏されるときに、CPU201が例えば図2のROM202からその音色に対応する音色波形スプリット情報テーブルのデータを読み出して音源LSI205経由で波形メモリ206内の波形データが記憶される領域とは別の管理領域に転送される。音色波形スプリット情報テーブルには、1つの音色に含まれる各波形データごとに、その波形データの「波形番号」と、その波形データが発音されるべき鍵域およびベロシティの範囲を示す、「最小ベロシティ」、「最大ベロシティ」、「最低キーナンバ(最低キー番号)」、および「最高キーナンバ(最高キー番号)」と、波形メモリ206に転送された1つの音色の記憶領域の先頭からのアドレスを示す「音色先頭からのアドレス」と、その波形データのデータサイズを示す「波形サイズ」の各項目値からなるエントリが登録される。音源LSI205は、鍵盤101上で演奏された鍵のキーナンバとベロシティを、波形メモリ206内の音色波形スプリット情報テーブルの各エントリの「最小ベロシティ」、「最大ベロシティ」、「最低キー(音高)番号」、および「最高キー(音高)番号」の各項目の値と比較することにより、上記演奏された鍵のキーナンバとベロシティに合致するエントリを探しだす。そして、音源LSI205は、波形メモリ206に転送された対象となる音色の記憶領域の先頭から、上記探し出したエントリの「音色先頭からのアドレス」項目の値だけ進んだアドレスから、そのエントリの「波形サイズ」項目の値が示すサイズ分の波形データを演奏で指定された鍵の音高に対応する速度で読み出し、その読み出した波形データに対して演奏で指定されたベロシティの振幅エンベロープを付加し、その結果得られる波形データを出力楽音波形データとして出力する。
1つの音色に含まれる各波形データは、大容量フラッシュメモリ204上では、図3(b)に示されるように、1本の連続したデータの塊として記録されている。その配置状態は、その音色に対応してROM202に記憶されている図3(b)に例示される音色波形スプリット情報テーブルで定義される。すなわち、1つの音色に含まれる各波形データの配置状態は、大容量フラッシュメモリ204および波形メモリ206ともに同じであり、1つの音色波形スプリット情報テーブルで管理される。
音色ごとの波形データの数は定められていないが、最大数と合計の最大サイズは定められている。本実施例では、図3(c)の音色波形サイズ、図3(b)の音色波形スプリット情報テーブルに例示されるように、1つの音色を構成する波形の最大数は例えば32、合計の最大サイズは例えば1MB(メガバイト)である。図3(c)の例では、1つの音色が11個の波形データから構成されていることが示されている。
図4は、波形メモリ206と大容量フラッシュメモリ204(図中では「Flashメモリ」と表示)との音色の配置関係を示す図である。図4に示されるように、波形メモリ206の記憶エリアは、固定エリアとダイナミックエリアに分割されている。一方、大容量フラッシュメモリ204には、各音色に含まれる波形データ群がシーケンシャルに記憶されている。前述したように、本実施形態では、大容量フラッシュメモリ204に記録されている波形データが必要に応じて、音源LSI205に接続される波形メモリ206に転送されて使用される。音色には、図4の401として示されるように、常に波形メモリ206上の固定エリアに固定的に記憶される32種類のスタティック音色と、図4の402として示されるように、波形メモリ206上のダイナミックエリアに動的に1音色のみ読み込まれて使用される32種類のダイナミック音色がある。固定エリアに配置される音色の波形データ群は、電子鍵盤楽器100の電源オン時に一時転送されたら書き換えられることは無い。固定エリアには、例えばドラム音等の、伴奏音としていつも使用されるような32音色分の波形データ群が記憶される。一方、ダイナミックエリアには1音色分の波形データのみが記憶され、ダイナミックエリアに配置される音色の波形データ群は、ユーザが音色を選択するごとに書き換えられる。固定エリアの32音色の波形データ群およびダイナミックエリアの1音色の波形データ群ともに、各音色に対応して波形メモリ206の管理領域に転送された各音色波形スプリット情報テーブル(図3(b)参照)に基づいて、各波形データの鍵域範囲、ベロシティ範囲、記憶アドレス、および波形サイズが管理される。
後述するように、本実施形態では、ダイナミック音色に含まれる各波形データは、演奏者が多数の音色を次々に切り換えて試し演奏をしながら好みの音色を選ぶような特定モード状態、つまり音色比較状態にあるときは、試し演奏される鍵域およびベロシティに応じて優先順位が付けられて波形メモリ206上のダイナミックエリアにバラバラに転送される。しかし、最終的に、演奏者によって音色が決定され、その音色に含まれる全ての波形データが波形メモリ206のダイナミックエリアに転送された時点では、ダイナミックエリア上でのその音色に対応する波形データの配置状態と、大容量フラッシュメモリ204上でのその音色に対応する波形データの配置状態は、同じになる。波形メモリ206上のダイナミックエリアの記憶容量と、大容量フラッシュメモリ204上の各ダイナミック音色の記憶容量は、いずれも同じで、例えば1MBである。つまり、音源LSI205が同時に発音できるダイナミック音色は、1音色である。
演奏者が選択した音色がスタティック音色かダイナミック音色かによって、波形メモリ206の固定エリアまたはダイナミックエリアへの転送が制御される。演奏者が選択した音色がスタティック音色かダイナミック音色かは、図2のROM202に記憶されている図5に例示されるフラッシュメモリ音色情報テーブルを参照することによって判定することができる。図5に例示されるように、フラッシュメモリ音色情報テーブルの各音色ごとのエントリには、音色番号を示す「番号」項目値と、「音色名」項目値と、スタティック音色かダイナミック音色かの種別を示す「種別」項目値と、大容量フラッシュメモリ204の波形記憶領域の先頭からの記憶アドレスのオフセット(16進数)を示す「波形アドレスオフセット」項目値と、その音色に含まれる波形データ群の全体の波形サイズ(16進数)を示す「波形サイズ」項目値が記憶されている。
本実施形態では、CPU201は、演奏者が音色選択のために音色の比較操作を行っている状態を検知した場合に、演奏者は同じ鍵域のノートを連打(試し演奏)しながら音色選択を行う可能性が高いと判断し、次のスプリット波形として、前回と同じ鍵域で同じくらいのベロシティに対応する波形データから先に、大容量フラッシュメモリ204から波形メモリ206に転送する。また、CPU201は、大容量フラッシュメモリ204から波形メモリ206への波形データの転送中に押鍵を検出した場合は、その押鍵に対応する波形データを優先的に、大容量フラッシュメモリ204から波形メモリ206に転送する。このような特定モードの状態を、本実施形態においては「音色比較状態」と呼ぶ。
このため、本実施形態では、音色比較状態を検出する処理が必要となる。本実施形態において、現在の状態が音色比較状態にあるか否かは、音色切替えの頻度に基づいて判定する。通常の演奏状態と比較したときに、音色比較状態では、演奏者は、複数の音色を短時間の間にいくつも選択しては比較する事が多く、またその際に、演奏自体も同じような試し演奏を続ける可能性が高い。例えば、電子鍵盤楽器100に10音色が内蔵されているオルガン音色のカテゴリ(図1の102参照)の中から最も演奏に適したものを探しだそうとしたときに、演奏者はその10音色を次々と切り替えるという操作は一般的であろう。そこで、本実施形態では、CPU201は、演奏者が或る音色選択した時にそれに先行する過去2回の音色選択が30秒以内に発生していたとしたら、通常演奏とは考えづらいため、現在の状態が音色比較状態であると判定する。
次に、一般に音色比較状態では演奏者は同じ鍵域を連打(試し演奏)する可能性が高く、最後に弾かれた鍵(ノート)が次も演奏される可能性が高いといえるので、次に演奏される鍵域は、過去30秒間に弾かれた鍵が含まれる鍵域である可能性が極めて高い。そこで、本実施形態では、CPU201は、上記鍵域以外の鍵域の波形データも含めて演奏履歴を辿ってゆき、新しく演奏された順に波形データを大容量フラッシュメモリ204から波形メモリ206のダイナミックエリアに読み込むことで、ヒット率を高めることができる。
以上の音色比較状態の判定および鍵域の決定を行うために、本実施形態では、CPU201は、次の情報を常に取得する。
1.過去2回の音色切替えが発生した時刻
2.過去8回の押鍵の時刻とキーナンバとベロシティ値
ただし、30秒以前の情報は意味を持たないと判断し、捨てられる。以上のアルゴリズムは、演奏が和音であり、音域を跨いだとしても、当然有効である。なお、本実施形態では、上述の時刻の測定と管理は、タイマカウンタを使って行われる。このカウンタは、1秒毎にインクリメントし続ける、図2に示される16bitフリーランニング・タイマカウンタ212である。イベントが発生した時には、この値を読み込んで時刻を記録しておき、このタイマの現在値と比較して経過時間を計算する。このタイマは、最大値を超えた場合0に戻るが、経過時刻は現在の16bitのタイマ値の符号なし減算によって算出されるため、問題ない。
次に、本実施形態における波形切替え時の処理について説明する。まず、CPU201は、音色比較選択操作が発生した場合、現在の状態が音色比較状態であるか否かを判定する。CPU201は、音色比較状態であると判定した場合は、過去の演奏履歴を調べ、押鍵の新しい順番にキーナンバ、ベロシティを調べる。そして、CPU201は、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)の各エントリの「最小ベロシティ」、「最大ベロシティ」、「最低キー(音高)番号」、および「最高キー(音高)番号」の各項目の値を、上記キーナンバおよびベロシティと比較することにより、これらに合致するエントリを探しだす。そして、CPU201はまず、現在選択されている音色に対応するROM202内のフラッシュメモリ音色情報テーブル(図5参照)上のエントリの「波形アドレスオフセット」項目値から、その音色の波形データの大容量フラッシュメモリ204上での記憶アドレスを特定する。次に、CPU201は、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブルの上記探しだしたエントリの「音色先頭からのアドレス」項目値と「波形サイズ」項目値を参照することにより、該当する波形データを優先して、大容量フラッシュメモリ204から読出し、その波形データを音源LSI205を介して波形メモリ206上のダイナミックエリアに転送する。波形メモリ206のダイナミックエリア上での記憶位置は、上記「音色先頭からのアドレス」項目値と「波形サイズ」項目値とで決定できる。
必要な波形データが大容量フラッシュメモリ204から波形メモリ206に読み込まれるまでに演奏が発生した場合は発音は行うことはできないが、読み込みが完了した波形データのスプリット範囲の押鍵が発生した時には発音処理を行うことができる。
また、演奏中でも、バックグラウンドで、現在選択されている音色に含まれる上記優先された波形データ以外の残りの波形データが、先頭の波形番号(図3(b)参照)から順次、大容量フラッシュメモリ204から波形メモリ206に転送される。
CPU201は、現在の状態が音色比較状態ではないと判定した場合はまず、現在選択されている音色に対応するROM202内のフラッシュメモリ音色情報テーブル(図5参照)上のエントリの「波形アドレスオフセット」項目値から、その音色の波形データの大容量フラッシュメモリ204上での記憶アドレスを特定する。次に、CPU201は、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)上の先頭のエントリから順次(「波形番号」項目値が若い順で)、各エントリの「音色先頭からのアドレス」項目値と「波形サイズ」項目値を参照することにより、各波形データを、大容量フラッシュメモリ204から音源LSI205を介して波形メモリ206上のダイナミックエリアに転送する。波形メモリ206のダイナミックエリア上での記憶位置は、上記「音色先頭からのアドレス」項目値と「波形サイズ」項目値とで決定できる。
図6は、図2のCPU201が実行する制御処理において使用するRAM203上の変数の一覧を示す図である。各変数については、後述する制御処理の詳細説明において詳述する。
以下に、上述の動作を実現するためにCPU201が実行する制御処理の詳細例について説明する。
図7は、CPU201が実行する制御処理の全体処理の例を示すメインルーチンのフローチャートである。この処理例は、CPU201がROM202に記憶された制御プログラムを実行する処理例である。
CPU201は、まずRAM203の内容初期化した後(ステップS701)、ステップS702からS711の一連の処理で示される定常ループ処理に入る。
定常ループ処理では、CPU201はまず、ユーザインタフェース処理(図中「ユーザI/F」と表示)を実行する(ステップS702)。ここでは、CPU201は、図2のキー・スキャナ207を介して図1の音色選択ボタン102の状態を取得する。次に、CPU201は、ステップS702の処理の結果、演奏者が音色選択ボタン102を操作することにより音色選択イベントが発生したか否かを判定する(ステップS703)。そして、CPU201は、音色切り替えが発生した場合(ステップS703の判定がYesの場合)は、音色切替え処理を実行する(ステップS704)。
次に、CPU201は、鍵盤処理を実行する(ステップS705)。ここでは、CPU201は、図2のキー・スキャナ207を介して図1の鍵盤101の押鍵状態を取得する。次に、CPU201は、ステップS705の処理の結果、演奏者が鍵盤101上のいずれかの鍵を押鍵することにより押鍵イベントが発生したか否かを判定する(ステップS706)。そして、CPU201は、押鍵イベントが発生した場合(ステップS706の判定がYesの場合)は、音源発音処理を実行する(ステップS707)。続いて、CPU201は、ステップS705の処理の結果、演奏者が鍵盤101上のいずれかの押鍵中の鍵を離鍵することにより離鍵イベントが発生したか否かを判定する(ステップS708)。そして、CPU201は、離鍵イベントが発生した場合(ステップS708の判定がYesの場合)は、音源リリース処理を実行する(ステップS709)。
その後、CPU201は、音源定常サービス処理を実行する(ステップS710)。ここでは、例えば図1の機能選択ボタン103が押された場合に対応する処理や、図1のベンダ/モジュレーション・ホイール104が操作された場合に対応する処理等の、電子鍵盤楽器100に対する一般的な処理が実行される。
最後に、CPU201は、波形読み込み処理を実行する(ステップS711)。
その後、CPU201は、ステップS702の定常ループ処理の先頭に戻る。
これ以降、本実施形態に関係するステップS701の初期化処理、ステップS707の音源発音処理、ステップS704の音色切替え処理、およびステップS711の波形読み込み処理について、詳細に説明してゆく。
図8は、図7のステップS701の初期化処理の詳細例を示すフローチャートである。
まず、CPU201は、波形メモリ206の固定エリア(図4参照)に、32種類のスタティック音色の各波形データ群を読み込む(ステップS801)。ここでは、CPU201はまず、ROM202内のフラッシュメモリ音色情報テーブル(図5参照)上で、「種別」項目値が「スタティック」であるエントリを抽出する。そして、CPU201は、抽出したエントリごとに、当該エントリの「波形アドレスオフセット」項目値から大容量フラッシュメモリ204上での当該エントリに対応する音色の記憶アドレスを特定する。次に、CPU201は、当該音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)上の先頭のエントリから順次(「波形番号」項目値が若い順で)、各エントリの「音色先頭からのアドレス」項目値と「波形サイズ」項目値を参照することにより、各波形データを、大容量フラッシュメモリ204から音源LSI205を介して波形メモリ206上の固定エリアに転送する。波形メモリ206の固定エリア上での記憶位置は、上記「波形アドレスオフセット」項目値と「音色先頭からのアドレス」項目値と「波形サイズ」項目値とで決定できる。
次に、CPU201は、RAM203上の図6に示される「変数」の値を全て「0
にする(以上、ステップS802)。
ただし、音色番号履歴TONE、押鍵キーナンバ履歴KEY、及び現在読み込み中の波形の番号READING_WAVEの各変数(図6参照)については、無効であることを意味する値「−1」を格納し直しておく。すなわち、CPU201は、以下の一連の処理を実行する。
まず、CPU201は、ステップS803で変数iに初期値「0」を格納した後、ステップS806で変数iの値を+1ずつインクリメントしながら、ステップS805で変数iの値が1になったと判定されるまで、各繰り返しごとに、ステップS804を実行する。ステップS804では、CPU201は、変数iで指定される音色選択履歴バッファ中の音色番号履歴TONE要素TS_HIS[i].TONE(図6参照)に、無効値「−1」を格納する。この処理が、変数iの値として0および1が指定される2回について実行されることにより、過去2回分の音色選択履歴バッファ中の音色番号履歴TONE要素TS_HIS[0].TONEおよびTS_HIS[1].TONEに、それぞれ無効値「−1」が格納される。
次に、CPU201は、ステップS807で変数iに初期値「0」を格納した後、ステップS810で変数iの値を+1ずつインクリメントしながら、ステップS809で変数iの値が15になったと判定されるまで、各繰り返しごとに、ステップS808を実行する。ステップS808では、CPU201は、変数iで指定される押鍵履歴バッファ中の押鍵キーナンバ履歴KEY要素NO_HIS[i].KEY(図6参照)に、無効値「−1」を格納する。この処理が、変数iの値として0から15までが指定される16回について実行されることにより、過去16回分の押鍵履歴バッファ中の押鍵キーナンバ履歴KEY要素NO_HIS[0].KEY〜NO_HIS[15].KEYに、それぞれ無効値「−1」が格納される。
最後に、CPU201は、現在読み込み中の波形の番号READING_WAVE(図6参照)の変数に、無効値「−1」を格納する(ステップS811)。その後、CPU201は、図8のフローチャートで例示される図7のステップS701の初期化処理を終了する。
図9は、図7のステップS707の音源発音処理の詳細例を示すフローチャートである。
CPU201はまず押鍵時に、スプリット波形検索サブルーチンにより、押鍵に対応する鍵域およびベロシティに基づいて、現在選択されている音色中でその押鍵により発音されるべき波形データの波形番号を割り出し、その波形番号をRAM203上の変数wに格納する(ステップS901)。
次に、CPU201は、変数wが示す波形番号に対応するダイナミックエリア波形メモリステータス中の波形メモリ206上での波形の有無を示す要素値WM_ST[w].WAVE(図6参照)の値が「1」であるか否か、すなわち、変数wが示す波形番号に対応する波形データが波形メモリ206のダイナミックエリアに存在するかどうかを判定する(ステップS902)。
CPU201は、ステップS902の判定がYesならば、その波形データに対する発音処理を、音源LSI205に対して指示する発音処理を実行する(ステップS903)。CPU201は、ステップS902の判定がNoならば、ステップS903の発音処理はスキップする。
続いて、CPU201は、ステップS903の発音処理の有無にかかわらず、演奏された押鍵情報を、押鍵情報履歴サブルーチンによって、履歴として残す(ステップS904)。この処理が実行される場合、RAM203上の変数Kに現在押鍵されているキーナンバKeyが格納され、変数Vに現在押鍵されているベロシティ値Velocityが格納され、変数Tに16bitフリーランニング・タイマカウンタ212が示すタイマ値が格納されて、これらの変数が押鍵情報履歴サブルーチンに引数として引き渡される。その後、CPU201は、図9のフローチャートで示される図7のステップS707の音源発音処理を終了する。
図10は、図9のステップS901のスプリット波形検索サブルーチンの詳細処理例を示すフローチャートである。
CPU201はまず、ステップS1001でRAM203上の変数である波形番号カウンタwに値「0」を格納した後、ステップS1006で波形番号カウンタwの値を+1ずつインクリメントしながら、ステップS1007で波形番号カウンタwの値が32に達したと判定するまで、各繰り返しごとに、ステップS1002からS1005までの一連の処理を実行する。
各繰り返しにおいて、CPU201はまず、変数Kに格納された現在押鍵中のキーナンバの値が、ダイナミックエリア波形メモリステータスの最低キーナンバ要素値WM_ST[w].KEY_LO(図6参照)の値以上であるか否かを判定する(ステップS1002)。ここで、ダイナミックエリア波形メモリステータスの最低キーナンバ要素値WM_ST[w].KEY_LOとしては、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)の「最低キーナンバ」項目値が予めコピーされている(後述する図12のステップS1204参照)。ステップS1002の判定がNoならば、変数wが示す波形番号の波形データは現在押鍵中の鍵域およびベロシティに対応するスプリット波形ではないため、ステップS1006に移行する。
ステップS1002の判定がYesならば、CPU201は、変数Kに格納された現在押鍵中のキーナンバの値が、ダイナミックエリア波形メモリステータスの最高キーナンバ要素値WM_ST[w].KEY_HI(図6参照)の値以下であるか否かを判定する(ステップS1003)。ここで、ダイナミックエリア波形メモリステータスの最高キーナンバ要素値WM_ST[w].KEY_HIとしては、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)の「最高キーナンバ」項目値が予めコピーされている(後述する図12のステップS1204参照)。ステップS1002の判定がNoならば、変数wが示す波形番号の波形データは現在押鍵中の鍵域およびベロシティに対応するスプリット波形ではないため、ステップS1006に移行する。
ステップS1003の判定がYesならば、CPU201は、変数Vに格納された現在押鍵中のベロシティの値が、ダイナミックエリア波形メモリステータスの最低ベロシティ要素値WM_ST[w].VEL_LO(図6参照)の値以上であるか否かを判定する(ステップS1004)。ここで、ダイナミックエリア波形メモリステータスの最低ベロシティ要素値WM_ST[w].VEL_LOとしては、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)の「最低ベロシティ」項目値が予めコピーされている(後述する図12のステップS1204参照)。ステップS1004の判定がNoならば、変数wが示す波形番号の波形データは現在押鍵中の鍵域およびベロシティに対応するスプリット波形ではないため、ステップS1006に移行する。
ステップS1004の判定がYesならば、CPU201は、変数Vに格納された現在押鍵中のベロシティの値が、ダイナミックエリア波形メモリステータスの最高ベロシティ要素値WM_ST[w].VEL_HI(図6参照)の値以下であるか否かを判定する(ステップS1005)。ここで、ダイナミックエリア波形メモリステータスの最高ベロシティ要素値WM_ST[w].VEL_HIとしては、現在選択されている音色に対応するROM202内の音色波形スプリット情報テーブル(図3(b)参照)の「最高ベロシティ」項目値が予めコピーされている(後述する図12のステップS1204参照)。ステップS1005の判定がNoならば、変数wが示す波形番号の波形データは現在押鍵中の鍵域およびベロシティに対応するスプリット波形ではないため、ステップS1006に移行する。
ステップS1005の判定がYesならば、現在押鍵中の鍵域が変数wが示す波形番号の波形データに設定されている最低キーナンバ以上最高キーナンバ以下の範囲にあり、かつ現在押鍵中のベロシティが上記波形データに設定されている最低ベロシティ以上最高ベロシティ以下の範囲にあり、現在の押鍵に対して発音処理されるべき波形データである。このため、CPU201は、変数wが示す波形番号を戻り値として、図10のフローチャートで示される図9のステップS901のスプリット波形検索サブルーチンを終了する。なお、このサブルーチンの戻り値は波形番号wであるが、理論的にはスプリットの設定によっては発音しない鍵域を残すことも可能であり、その場合は波形番号として例えば32を返す。
図11は、図9のステップS904の押鍵情報履歴サブルーチンの詳細処理例を示すフローチャートである。
CPU201は、RAM203上の変数である押鍵履歴バッファ書き込みポインタNO_WP(図6参照)によって指定される押鍵履歴バッファの押鍵キーナンバ履歴要素NO_HIS[NO_WP].KEY(図6参照)、押鍵ベロシティ履歴要素NO_HIS[NO_WP].VEL(図6参照)、および押鍵時の時刻要素NO_HIS[NO_WP].TIME(図6参照)に、変数K、V、Tにそれぞれ格納されている現在の押鍵キーナンバ、押鍵ベロシティ、および現在時刻を格納する(ステップS1101)。
ここで、CPU201は、図9のステップS904の押鍵情報履歴サブルーチンが実行されるごとに、ステップS1102で押鍵履歴バッファ書き込みポインタNO_WPの値を+1ずつインクリメントしながら、ステップS1103で押鍵履歴バッファ書き込みポインタNO_WPの値が「16」になったか否かを判定している。そして、CPU201は、ステップS1103の判定がYesになると、ステップS1104で押鍵履歴バッファ書き込みポインタNO_WPの値を「0」に戻す。これにより、押鍵履歴バッファ書き込みポインタNO_WPの値が「0」から「15」までの範囲でサイクリックに変化し、過去の直近16鍵分の押鍵履歴が、押鍵履歴バッファNO_HIS[0]〜NO_HIS[15]にサイクリックに得られることになる。
図12および図13は、図7のステップS704の音色切替え処理の詳細例を示すフローチャートである。ここで、RAM203上の変数Nに演奏者によって選択された音色番号が設定され、変数Tに現在の16bitフリーランニング・タイマカウンタ212のタイマ値が設定されているとする。
CPU201はまず、変数Nに設定されている演奏者によって選択された音色番号によってROM202に記憶されている図5に例示されるフラッシュメモリ音色情報テーブルを参照し、「番号」項目値が演奏者によって選択された音色番号に等しいエントリの「種別」項目値が「ダイナミック音色」であるか否かを判定する(ステップS1201)。
ステップS1201の判定がNoであって演奏者によって選択された音色番号がスプリット音色である場合には、CPU201は、図13のステップS1209に移行する。
ステップS1201の判定がYesであって演奏者によって選択された音色番号がダイナミック音色である場合には、CPU201は次に、変数Nに設定されている演奏者によって選択された音色番号が現在の音色番号と等しいか否かを判定する(ステップS1202)。
ステップS1202の判定がNoであって演奏者によって選択された音色番号が現在の音色番号と等しい場合には、CPU201は、図13のステップS1209に移行する。
ステップS1202の判定がYesであって演奏者によって選択された音色番号が現在の音色番号と等しくない場合には、CPU201は、ステップS1203でRAM203上の波形番号カウンタwの値を初期値「0」に設定した後、ステップS1205で波形番号カウンタwの値を+1ずつインクリメントしながら、ステップS1206で波形番号カウンタwの値が32に達したと判定するまで、繰り返しステップS1204の処理を実行する。
ステップS1204では、新たに選択された音色番号の音色に対応するROM202内の音色波形スプリット情報テーブルから、図3(b)に示される「波形番号」が1から最大で32までの各エントリの「最小ベロシティ」項目値、「最大ベロシティ」項目値、「最低キーナンバ(最低キー番号)」項目値、および「最高キーナンバ(最高キー番号)」項目値と、「音色先頭からのアドレス」項目値(波形アドレスオフセット)と、「波形サイズ」項目値がそれぞれ、波形番号カウンタwが示す図6に示されるRAM203上の構造体変数であるダイナミックエリア波形メモリステータスの、最低ベロシティ要素値WM_ST[w].VEL_LO、最高ベロシティ要素値WM_ST[w].VEL_HI、最低キーナンバ要素値WM_ST[w].KEY_LO、最高キーナンバ要素値WM_ST[w].KEY_HI、波形アドレスオフセット要素値WM_ST[w].OFFSET_ADRS、および波形サイズ要素値WM_ST[w].WAVE_SIZEにコピーされる。なお、図3(b)に例示される音色波形スプリット情報テーブル上で、波形番号カウンタwに対応する「波形番号」項目値に対して、波形データが登録されていない場合には、「波形サイズ」項目値が「0」になっており、従って、波形サイズ要素値WM_ST[w].WAVE_SIZEには「0」がセットされる。また、波形番号カウンタwが示す図6に示されるダイナミックエリア波形メモリステータスの、波形メモリ206上での波形の有無を示す要素値WM_ST[w].WAVEに、「無」を示す初期値「0」が格納される。また、波形番号カウンタwが示すダイナミックエリア波形メモリステータスの、波形読み込み優先順位を示す要素値WM_ST[w].PRIに、「優先度未設定」を示す初期値「1」が格納される。さらに、波形番号カウンタwが示すダイナミックエリア波形メモリステータスの、転送済みのデータサイズを示す要素値WM_ST[w].READ_SIZEに、初期値「0」が格納される。また、図6に示されるRAM203上の変数である現在読み込み中の波形の番号READING_WAVEに、読み込み中の波形無しを示す無効値「−1」が格納される。そして、図6に示されるRAM203上の変数である、読み込みダイナミック音色の波形データのフラッシュメモリ上での格納先頭アドレスFLASH_ADRSに、ROM202内の図5に例示されるフラッシュメモリ音色情報テーブルにおける、「番号」項目値が変数Nに設定されている演奏者によって選択された音色番号に等しいエントリの「波形アドレスオフセット」項目値が格納される。
以上のステップS1204の処理が、新たに選択された音色に含まれる最大32種類の波形データ分繰り返される。
その後、CPU201は、音色比較状態判断サブルーチンを実行する(図13のステップS1207)。この結果、RAM203上の変数mに音色比較状態が設定される。この値が「1」のときは、現在の状態が、演奏者が多数の音色を次々に切り換えて試し演奏をしながら好みの音色を選ぶ音色比較状態にあることを示し、「0」のときは音色比較状態にはないことを示す。
続いて、CPU201は、ステップS1207で得られた変数mの値を引数として、波形読み込み優先度設定サブルーチンを実行する(図13のステップS1208)。ここでは、次にどの波形データが大容量フラッシュメモリ204から波形メモリ206に読み込まれるべきかの波形読み込みの優先度(スケジューリング)の設定が行われる。
図13のステップS1208の処理の後、または図12のステップS1201またはS1202の判定がNoの場合に、CPU201は、変数Nに得られている現在選択されている音色番号と、変数Tに得られている現在の16bitフリーランニング・タイマカウンタ212のタイマ値とを引数として、音色選択情報履歴サブルーチンを実行する(図13のステップS1209)。ここでは、直近過去2回分の音色選択における音色番号と選択時刻の履歴が記録される。
図14は、図13のステップS1207の音色比較状態判断サブルーチンの詳細処理例を示すフローチャートである。ここでは、音色選択履歴バッファに記録されている音色切り替えの全てが30秒以内に発生したものであるか否かが判断される。
CPU201はまず、RAM203上の変数T_OLDに、RAM203上の変数である音色選択履歴バッファ書き込みポインタTS_WP(後述する図17参照)によって指定される過去2回の音色選択のうち古いほうの音色選択時の時刻要素TS_HIS[TS_WP].TIMEの値を格納する(ステップS1401)。なお、音色選択履歴バッファ書き込みポインタTS_WPの値は、後述する図17のステップS1702〜S1704によって、過去2回の音色選択のうち直近の音色選択でないほう、すなわち古いほうの音色選択時をポイントしている。
次に、CPU201は、RAM203上の変数T_CURに、現在の16bitフリーランニング・タイマカウンタ212のタイマ値を格納する(ステップS1402)。
そして、CPU201は、変数T_CURの値から変数T_OLDの値を減算して得られる過去2回の音色選択のうち古いほうの音色選択から今回の音色選択までの経過時間が31秒よりも短いか否かを判定する(ステップS1403)。
CPU201は、ステップS1403の判定がYesならば、現在の状態が、演奏者が多数の音色を次々に切り換えて試し演奏をしながら好みの音色を選ぶ音色比較状態にあることを示す値「1」を、RAM203上の変数mに格納する(ステップS1404)。
一方、CPU201は、ステップS1403の判定がNoならば、現在の状態が、演奏者が多数の音色を次々に切り換えて試し演奏をしながら好みの音色を選ぶ音色比較状態にはないことを示す値「0」を、RAM203上の変数mに格納する(ステップS1405)。
ステップS1404またはS1405の処理の後、CPU201は、図14のフローチャートで示される図13のステップS1207の音色比較状態判断サブルーチンの処理を終了する。
図15および図16は、図13のステップS1208の波形読み込み優先度設定サブルーチンの詳細処理例を示すフローチャートである。ここでは、次にどの波形データが大容量フラッシュメモリ204から波形メモリ206に読み込まれるべきかの波形読み込みの優先度(スケジューリング)の設定が行われる。すなわち、CPU201は、現在の状態が音色比較状態である場合は、押鍵履歴バッファNO_HIS[0]〜NO_HIS[15]にサイクリックに得られている過去の直近16鍵分の押鍵履歴を先頭から辿っていって、新しい押鍵に対応する波形データほど読み込みの優先度を高く設定する。また、CPU201は、押鍵履歴を調査して以前読み込まれていない波形データ群については、波形番号順に波形データが読み込まれるように優先度を設定する。さらに、現在の状態が音色比較状態では無い場合には、CPU201は単純に、波形番号順に波形データが読み込まれるように優先度を設定する。
CPU201はまず、RAM203上の変数であるプライオリティカウンタpに、最高優先度の値「0」を初期設定する(ステップS1501)。
次に、CPU201は、図12のステップS1207で得られた変数mの値が「1」であるか否か、すなわち、現在の状態が音色比較状態であるか否かを判定する(ステップS1502)。
現在の状態が音色比較状態ではない(ステップS1502の判定がNoである)場合には、CPU201は、図16のステップS1514以降の、現在の音色に含まれる全ての波形データについて、波形番号順に波形データが読み込まれるように優先度を設定する処理に移行する。
現在の状態が音色比較状態である(ステップS1502の判定がYesである)場合には、CPU201は、ステップS1503でRAM203上の変数である履歴順を制御するためのカウンタ変数hに初期値「0」を設定した後、ステップS1512でカウンタ変数hの値を+1ずつインクリメントしながら、ステップS1513でカウンタ変数hの値が16に達したと判定されるまで、ステップS1504からS1511までの一連の処理を繰り返し実行する。
上記一連の処理において、CPU201はまず、押鍵履歴バッファ書き込みポインタNO_WPの値から1を減算しさらにカウンタ変数hの値を減算した結果を、RAM203上の変数iに格納する(ステップS1504)。ここで、押鍵履歴バッファ書き込みポインタNO_WP(図6参照)の値は、前述した図9のステップS904の押鍵情報履歴サブルーチンである図11のステップS1101およびS1102により、最新の押鍵履歴値が格納されている押鍵履歴バッファを指し示すポインタ値+1の値となっている。そこで、ステップS1504において、まず、押鍵履歴バッファ書き込みポインタNO_WPの値から1が減算されることにより、最新の押鍵履歴値が格納されている押鍵履歴バッファを指し示すポインタ値が得られる。さらに、このポインタ値からカウンタ変数hの値が減算される。ここで、ステップS1504からS1511までの一連の処理の繰り返しにおいて、前述したように、カウンタ変数hは0から15まで変化する。従って、ステップS1504の演算により、ステップS1504からS1511までの一連の処理の繰り返しにおいて、変数iの値は、最新の押鍵履歴値が格納されている押鍵履歴バッファを指し示すポインタ値から「0」まで順次−1ずつ減ってゆくポインタ値が得られることになる。ただし、図11の説明で前述しように、押鍵履歴バッファ書き込みポインタNO_WPの値は、値「0」から始まって値「15」まで達すると値「0」に戻るようになっている。すなわち、押鍵履歴バッファNO_HIS[NO_WP](図6参照)は、16個の記憶容量を有するリングバッファとなっている。そこで、CPU201は、ステップS1505で変数iの値が0より小さくなったか否かを判定し、この判定がYesになった場合は、ステップS1506で変数iの値に値「16」を加算することにより、ステップS1504からS1511までの一連の処理の繰り返しにおいて、変数iの値は、最新の押鍵履歴値が格納されている押鍵履歴バッファを指し示すポインタ値から最も古い16番目の押鍵履歴バッファを指し示す値まで順次指定するポインタ値として機能する。
ステップS1504からS1506までの演算処理の後、CPU201は、変数iが指し示す押鍵履歴バッファNO_HIS[i]を参照し、その押鍵履歴のキーナンバ要素値NO_HIS[i].KEY(図6および図11のステップS1101参照)をRAM203上のキーナンバ変数kに格納し、また、同じくその押鍵履歴のベロシティ要素値NO_HIS[i].VEL(図6および図11のステップS1101参照)をRAM203上のベロシティ変数vに格納する(ステップS1507)。
その後、CPU201は、前述した図10のフローチャートで例示される、図9のステップS901と同様のスプリット波形検索サブルーチンを実行する。この処理の結果、変数iが指し示す押鍵履歴に対応するキーナンバ値k(変数kの値)およびベロシティ値v(変数vの値)に基づいて、現在選択されている音色中でその押鍵履歴の押鍵に対応するスプリット波形の波形データの波形番号が割り出され、その波形番号がRAM203上の変数wに得られる(ステップS1508)。
CPU201は、ステップS1508で得られた変数wが指し示すダイナミックエリア波形メモリステータスの波形読み込み優先順位の要素値WM_ST[w].PRI(図6参照)の値が無効値「−1」(図12のステップS1204参照)であるか否かを判定する(ステップS1509)。
CPU201は、WM_ST[w].PRIに優先度が設定されていない(ステップS1509の判定がYesである)場合には、WM_ST[w].PRIに、プライオリティカウンタpの現在値を格納し(ステップS1510)、プライオリティカウンタpの値を+1インクリメントする(ステップS1511)。
一方、CPU201は、WM_ST[w].PRIに既に優先度が設定されている(ステップS1509の判定がNoである)場合には、ステップS1510およびS1511は実行しない。すなわち、この場合には、CPU201は、WM_ST[w].PRIに新たに優先度を設定することはしない。
以上のステップS1504からS1511までの一連の処理の繰り返しにより、変数iの値によりポイントされる、最新の押鍵履歴の押鍵に対応する波形データから最も古い16番目の押鍵履歴の押鍵に対応する波形データまで、その順で最高優先度「0」から順次低くなる(値が順次大きくなる)優先度が設定される。
カウンタ変数hの値が15に達する(ステップS1513の判定がYesになる)と、CPU201は、図16のステップS1514以降の、押鍵履歴に存在しない波形データ群について、波形番号順に波形データが読み込まれるように優先度を設定する処理に移行する。なお、この処理は、ステップS1502の判定で現在の状態が音色比較状態ではない(ステップS1502の判定がNoである)と判定された場合に実行される、現在指定されている音色に含まれる全ての波形データについて波形番号順に波形データが読み込まれるように優先度を設定する処理と、共通の処理である。
図13において、CPU201は、ステップS1514でRAM203上の変数である波形番号カウンタwに初期値「0」を格納した後、ステップS1518で波形番号カウンタwの値を+1ずつインクリメントしながら、ステップS1519で1音色に含まれる波形データ数の最大値「32」に達したと判定されるまで、ステップS1515からS1517までの一連の処理を繰り返し実行する。
上記一連の処理において、CPU201はまず、波形番号カウンタwが指し示すダイナミックエリア波形メモリステータスの波形読み込み優先順位の要素値WM_ST[w].PRI(図6参照)の値が無効値「−1」(図12のステップS1204参照)であるか否かを判定する(ステップS1515)。
CPU201は、WM_ST[w].PRIに優先度が設定されていない(ステップS1515の判定がYesである)場合には、WM_ST[w].PRIに、プライオリティカウンタpの現在値を格納し(ステップS1516)、プライオリティカウンタpの値を+1インクリメントする(ステップS1517)。
一方、CPU201は、WM_ST[w].PRIに既に優先度が設定されている(ステップS1515の判定がNoである)場合には、ステップS1516およびS1517は実行しない。すなわち、この場合には、CPU201は、WM_ST[w].PRIに新たに優先度を設定することはしない。
以上のステップS1515からS1517までの一連の処理の繰り返しにより、現在の状態が音色比較状態であった場合には、押鍵履歴に存在しない波形データ群について波形番号順に波形データが大容量フラッシュメモリ204から波形メモリ206に読み込まれるように優先度が設定され、現在の状態が音色比較状態でなかった場合には、現在指定されている音色に含まれる全ての波形データについて波形番号順に波形データが読み込まれるように優先度が設定される。
図17は、図13のステップS1209の音色選択情報履歴サブルーチンの詳細処理例を示すフローチャートである。
CPU201は、RAM203上の変数である音色選択履歴バッファ書き込みポインタTS_WP(図6参照)によって指定される音色選択履歴バッファの音色番号履歴要素TS_HIS[TS_WP].TONE(図6参照)および音色選択時の時刻要素TS_HIS[TS_WP].TIME(図6参照)に、変数N、Tにそれぞれ格納されている現在の音色番号および現在時刻を格納する(ステップS1701)。
ここで、CPU201は、図13のステップS1209の音色選択情報履歴サブルーチンが実行されるごとに、ステップS1702で音色選択履歴バッファ書き込みポインタTS_WPの値を+1ずつインクリメントしながら、ステップS1703で音色選択履歴バッファ書き込みポインタTS_WPの値が「1」になったか否かを判定している。そして、CPU201は、ステップS1703の判定がYesになると、ステップS1704で音色選択履歴バッファ書き込みポインタTS_WPの値を「0」に戻す。これにより、音色選択履歴バッファ書き込みポインタTS_WPの値が「0」と「1」の間でサイクリックに変化し、直近2つ分の音色選択履歴が、音色選択履歴バッファTS_HIS[0]とTS_HIS[1]にサイクリックに得られることになる。
図18および図19は、図7のステップS711の波形読み込み処理の詳細例を示すフローチャートである。演奏による発音処理を止めないようにするために、図7に例示したメインループにおいて、ステップS711で波形読み込み処理だけに処理を集中させず、他の処理も並行に処理するために、ステップS711で波形読み込み処理の1回の実行においては、一定の容量のメモリ転送が完了した時点で処理を中断し、他のメインループの処理を行って再び波形転送プログラムが起動された時に処理を再開する仕組みになっている。
CPU201はまず、ステップS1801において、各種初期設定を行う。具体的には、CPU201は、RAM203上の変数である、今回読み込みサイズカウンタc、波形メモリ上のアドレスカウンタwp、最高プライオリティ波形番号h、および波形番号カウンタwに、それぞれ初期値「0」を設定する。また、CPU201は、大容量フラッシュメモリ204上のアドレスカウンタ(以下、「フラッシュメモリ上のアドレスカウンタ」と呼ぶ)rpに、RAM203上の変数である、読み込みダイナミック音色の波形データのフラッシュメモリ上での格納先頭アドレスFLASH_ADRSに格納されている値がコピーされる。なお、読み込みダイナミック音色の波形データのフラッシュメモリ上での格納先頭アドレスFLASH_ADRSには、図7のステップS704の音色切替え処理内の図12のステップS1204において、ROM202内の図5に例示されるフラッシュメモリ音色情報テーブルにおける、「番号」項目値が変数Nに設定されている演奏者によって選択された音色番号に等しいエントリの「波形アドレスオフセット」項目値が格納されている。また、CPU201は、RAM203上の変数であるプライオリティカウンタpに、最低優先度(プライオリティ)の値「32」を初期値として格納する。
上記初期設定の後、CPU201は、RAM203上の変数である現在読み込み中の波形の番号READING_WAVEの値が無効値「−1」であるか否か、すなわち、現在波形データの読み込みが行われているか否かを判定する(ステップS1802)。
現在波形データの読み込みが行われていない(ステップS1802の判定がYesである)場合には、CPU201は、(ステップS1801で初期値「0」に初期化されている)波形番号カウンタwの値をステップS1808で+1ずつインクリメントしながら、ステップS1809で31に達したと判定されるまで、ステップS1804からS1807の一連の処理を繰り返し実行する。この一連の処理の繰り返しにより、CPU201は、波形番号カウンタwが示すダイナミックエリア波形メモリステータスの要素値WM_ST[w].PRIに書き込まれている波形読み込みの優先順位を順次調べ、波形転送が必要かつ、完了していないものの中で最も優先順位の高い波形データを選定する。
ステップS1804からS1807の一連の処理において、CPU201はまず、RAM203上のダイナミックエリア波形メモリステータスの波形メモリ206上での有無を示す要素値WM_ST[w].WAVEの値が「1」であるか否か、すなわち、波形番号カウンタwが示す波形番号の波形データが波形メモリ206上のダイナミックエリアに転送されているか否かを判定する(ステップS1804)。
波形番号カウンタwが示す波形番号の波形データが波形メモリ206上のダイナミックエリアに転送されている(ステップS1804の判定がYes)ならば、その波形データはさらに転送の必要はないため、CPU201は、ステップS1808の処理に移行して、次の波形番号に対する処理に進む。
波形番号カウンタwが示す波形番号の波形データが波形メモリ206上のダイナミックエリアに転送されていない(ステップS1804の判定がNo)ならば、CPU201は、波形番号カウンタwが指し示すダイナミックエリア波形メモリステータスの波形サイズ要素値WM_ST[w].WAVE_SIZEが「0」であるか否かを判定する(ステップS1805)。ステップS1204の説明で前述したように、図3(b)に例示される音色波形スプリット情報テーブル上で、波形番号カウンタwに対応する「波形番号」項目値に対して、波形データが登録されていない場合には、「波形サイズ」項目値が「0」になっており、波形サイズ要素値WM_ST[w].WAVE_SIZEにも「0」がセットされる。
このため、WM_ST[w].WAVE_SIZEが「0」(ステップS1805の判定がYes)ならば、波形番号カウンタwに対応する波形データは存在しないため、CPU201は、ステップS1808の処理に移行して、次の波形番号に対する処理に進む。
WM_ST[w].WAVE_SIZEが「0」でない(ステップS1805の判定がNO)ならば、CPU201は、波形番号カウンタwが指し示すダイナミックエリア波形メモリステータスの要素値WM_ST[w].PRIに書き込まれている波形読み込みの優先順位が、プライオリティカウンタpの値よりも小さいか否か(優先順位が高いか否か)を判定する(ステップS1806)。
WM_ST[w].PRIの優先順位がプライオリティカウンタpの値よりも小さい(ステップS8016の判定がYesである)場合には、CPU201は、カウンタ変数hに波形番号カウンタwの値を格納して記憶させ、また、プライオリティカウンタpの優先順位をWM_ST[w].PRIの優先順位で書き換える(ステップS1807)。
WM_ST[w].PRIの優先順位がプライオリティカウンタpの値よりも小さくはない(ステップS8016の判定がNoである)場合には、CPU201は、ステップS1807の書き換えは行わない。
以上のステップS1804からS1807の一連の処理が繰り返し実行される結果、最終的にカウンタ変数hには、波形転送が必要かつ完了していないものの中で最も優先順位の高い波形データの「波形番号」が得られることになる。
上記繰り返し処理の結果、ステップS1809の判定がYesになると、CPU201は、カウンタ変数hに得られた優先順位の最も高い波形番号をRAM203上の変数である現在読み込み中の波形番号READING_WAVEに格納し、また、波形番号カウンタwが示すダイナミックエリア波形メモリステータスの、転送済みのデータサイズを示す要素値WM_ST[w].READ_SIZEを値「0」に初期設定する(ステップS1810)。
その後、CPU201は、図19のステップS1811以降の処理に移行し、カウンタ変数hに得られた波形番号の波形データを大容量フラッシュメモリ204から波形メモリ206へ転送する処理を開始する。
前述したステップS1802の判定において、現在波形データの読み込みが行われている(ステップS1802の判定がNoである)と判定された場合には、CPU201は、カウンタ変数hに、RAM203上の変数である現在読み込み中の波形番号READING_WAVEの値を格納した後、図19のステップS1811以降の処理に移行し、カウンタ変数hに得られた波形番号の残りの波形データを大容量フラッシュメモリ204から波形メモリ206へ転送する処理を実行する。
上記転送処理において、CPU201はまず、大容量フラッシュメモリ204において、RAM203上の変数であるフラッシュメモリ上のアドレスカウンタrpの値に、カウンタ変数hが示す波形番号に対応するダイナミックエリア波形メモリステータスの転送済みのデータサイズを示す要素値WM_ST[h].READ_SIZEと、大容量フラッシュメモリ204の波形先頭アドレスとを加算して得られるアドレスから、1ワード分の波形データを読み込み、RAM203上の変数dに代入する(ステップS1811)。ここで、フラッシュメモリ上のアドレスカウンタrpの値は、図18のステップS1801で設定された、ROM202内の図5に例示されるフラッシュメモリ音色情報テーブル上の現在の音色番号に等しいエントリの「波形アドレスオフセット」項目値である。
次に、CPU201は、波形メモリ206上の、フラッシュメモリ上のアドレスカウンタrpの値に、WM_ST[h].READ_SIZEの値と、ダイナミックエリア波形メモリステータスの波形アドレスオフセット要素値WM_ST[w].OFFSET_ADRSとを加算して得られるアドレスに、変数dに格納されている1ワード分の波形データを、音源LSI205経由で書き込む(ステップS1812)。なお、波形アドレスオフセット要素値WM_ST[w].OFFSET_ADRSには、図7のステップS704の音色切替え処理内の図12のステップS1204において、現在の音色に対応するROM202内の音色波形スプリット情報テーブルから、図3(b)に示される「音色先頭からのアドレス」項目値(波形アドレスオフセット)がセットされている。
その後、CPU201は、カウンタ変数hが示す波形番号に対応するダイナミックエリア波形メモリステータスの転送済みのデータサイズを示す要素値WM_ST[h].READ_SIZEの値を+1インクリメントし、また、RAM203上の変数である(ステップS1801で値「0」に初期化されている)今回読み込みサイズカウンタcの値を+1インクリメントする(ステップS1813)。
そして、CPU201は、カウンタ変数hが示す波形番号に対応するダイナミックエリア波形メモリステータスの転送済みのデータサイズを示す要素値WM_ST[h].READ_SIZEの値が、カウンタ変数hが示す波形番号に対応するダイナミックエリア波形メモリステータスの波形サイズ要素値WM_ST[w].WAVE_SIZEに等しくなったか否かを判定する(ステップS1814)。波形サイズ要素値WM_ST[w].WAVE_SIZEには、図7のステップS704の音色切替え処理内の図12のステップS1204において、現在の音色に対応するROM202内の音色波形スプリット情報テーブルから、図3(b)に示される「波形サイズ」項目値がセットされている。
ステップS1814の判定がNoならば、CPU201は、今回読み込みサイズカウンタcの値が100000バイトに等しくなったか否か、すなわち、今回転送されたサイズが100KB(キロバイト)に達したか否かを判定する(ステップS1815)。
ステップS1815の判定がNoならば、CPU201は、ステップS1811の処理に戻って転送を続行する。
ステップS1815の判定がYesになったならば、CPU201は、図18および図19のフローチャートで例示される図7のステップS711の波形読み込み処理を終了する。このように、本実施形態では、一定の容量(例えば100KB)のメモリ転送が完了した時点で処理が中断され、他のメインループの処理を行って再び波形転送プログラムが起動された時に図18のステップS1802→S1803を介して、処理が再開される。このとき、カウンタ変数hが示すダイナミックエリア波形メモリステータスの、転送済みのデータサイズを示す要素値WM_ST[w].READ_SIZEには、図19のステップS1813の処理によって前回までに転送が完了したサイズが格納されているため、図19のステップS1811およびS1812のアドレス演算処理によって、前回転送が完了したアドレスの次のアドレスから転送を再開することができる。
転送済みのデータサイズを示す要素値WM_ST[h].READ_SIZEの値が波形サイズ要素値WM_ST[w].WAVE_SIZEに等しくなった場合(ステップS1814の判定がYesになった場合)、CPU201は、カウンタ変数hが示すダイナミックエリア波形メモリステータス中の波形メモリ206上での波形の有無を示す要素値WM_ST[w].WAVE(図6参照)に、変数hが示す波形番号に対応する波形データが波形メモリ206のダイナミックエリアに存在することを示す値「1」を設定する(ステップS1816)。
その後、CPU201は、前述した図15および図16のフローチャートで例示される、図13のステップS1208と同様の波形読み込み優先度設定サブルーチンを実行する。この処理の結果、図7のステップS711の波形読み込み処理での波形データの転送中に演奏車による押鍵が発生して新たな押鍵履歴情報が追加されても、その履歴情報と矛盾しないように波形読み込みの優先順位情報を更新することができる。これにより、押鍵したにもかかわらず波形が無いために発音できなかったケースがあったとしても、その次に読み込まれるべき波形データを、すぐにその押鍵に対応したものとなるように、波形転送の優先順位を修正することが可能となる。
以上説明した実施形態により、複数波形の転送を伴う音色切り替えの際に、波形メモリに所望の波形が存在しないために発音できないという無音時間を大幅に短縮することが可能となる。これにより、演奏者のストレスを軽減、あるいは全く感じさせないレベルに抑制することができる。例えば、1つの音色に必要な波形のうち、10パーセントの容量を持つ1つの波形データが揃っただけで演奏可能となるケースでは、予想が外れない限りは、無音状態が10分の1まで短縮ができることになる。予想が外れても押鍵されたものから読み込みを行うので、全部読み込むよりは遥かに短い無音時間で済むという効果が得られる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
一次記憶装置と、
楽音の音色と演奏情報とに対応した複数の波形データが記憶された二次記憶装置と、
外部より演奏情報が供給される毎に、当該供給される演奏情報を演奏履歴バッファに順次記憶させる記憶制御処理と、外部より音色選択情報が供給される毎に、当該音色選択情報が供給されるタイミングに基づいて特定モードか否か判別する判別処理と、前記特定モードと判別された場合に、前記演奏履歴バッファに記憶されている各演奏情報に対して優先度を付与する優先度付与処理と、前記優先度付与部により付与された優先度に基づいて前記演奏履歴バッファから選択された演奏情報と前記供給された音色選択情報とに基づいた波形データを前記二次記憶装置から読み出し、当該読み出された波形データを前記一次記憶装置に読み込ませる波形読み込み処理と、を実行する処理部と、
を備えた波形読み込み装置。
(付記2)
前記一次記憶装置は、ランダムアクセスメモリを備え、前記二次記憶装置は、前記一次記憶装置より容量の大きいフラッシュメモリを備えた付記1記載の波形読み込み装置。
(付記3)
前記処理部は、前記判別処理により特定モードでないと判別された場合は、前記演奏情報が供給される毎に、当該供給される演奏情報と前記供給される音色選択情報とに基づいた波形データを前記二次記憶装置から読み出し、当該読み出された波形データを前記一次記憶装置に読み込ませる通常波形読み込み処理を実行する、付記1または2に記載の波形読み込み装置。
(付記4)
前記処理部はさらに、前記音色選択情報が供給される毎に、当該音色選択情報が供給されるタイミングを音色選択履歴バッファに順次記憶する音色選択履歴記憶処理を実行し、
前記判別処理は、前記音色選択情報が供給される毎に、当該音色選択情報が供給されるタイミングと前記音色選択履歴バッファに記憶されているタイミングとの差が予め定められた値を超えているか否かにより、特定モードか否か判別する、付記1乃至3のいずれかに記載の波形読み込み装置。
(付記5)
前記処理部において、前記波形読み込み処理は、前記演奏履歴バッファから前記優先度付与部により付与された優先度の最も高い演奏情報を選択する、付記1乃至4のいずれかに記載の波形読み込み装置。
(付記6)
前記処理部において、前記波形読み込み処理は、前記演奏履歴バッファから前記優先度付与部により付与された優先度の高い順に前記演奏情報を選択し、当該選択された演奏情報と前記供給された音色選択情報とに基づいた波形データを前記二次記憶装置から順次読み出し、当該読み出された波形データを前記一次記憶装置に読み込ませる、付記1乃至4のいずれかに記載の波形読み込み装置。
(付記7)
前記演奏情報は、発生すべき楽音の音高とベロシティとを少なくとも含む情報である、付記1乃至6のいずれかに記載の波形読み込み装置。
(付記8)
一次記憶装置と、楽音の音色と演奏情報とに対応して複数の波形データが記憶された二次記憶装置と、を有する波形読み込み装置に用いられる波形読み込み方法であって、前記波形読み込み装置は、
外部より演奏情報が供給される毎に、当該供給される演奏情報を演奏履歴バッファに順次記憶させ、
外部より音色選択情報が供給される毎に、当該音色選択情報が供給されるタイミングに基づいて特定モードか否か判別し、
前記特定モードと判別された場合に、前記演奏履歴バッファに記憶されている各演奏情報に対して優先度を付与し、
前記優先度付与部により付与された優先度に基づいて前記演奏履歴バッファから選択された演奏情報と前記供給された音色選択情報とに基づいた波形データを前記二次記憶装置から読み出し、当該読み出された波形データを前記一次記憶装置に読み込ませる、波形読み込み方法。
(付記9)
一次記憶装置と、楽音の音色と演奏情報とに対応した複数の波形データが記憶された二次記憶装置と、を有する波形読み込み装置に用いられる波形読み込み装置として用いられるコンピュータに、
外部より演奏情報が供給される毎に、当該音色選択情報が供給される演奏情報を演奏履歴バッファに順次記憶させるステップと、
外部より音色選択情報が供給される毎に、当該供給されるタイミングに基づいて特定モードか否か判別するステップと、
前記特定モードと判別された場合に、前記演奏履歴バッファに記憶されている各演奏情報に対して優先度を付与するステップと、
前記優先度付与部により付与された優先度に基づいて前記演奏履歴バッファから選択された演奏情報と前記供給された音色選択情報とに基づいた波形データを前記二次記憶装置から読み出し、当該読み出された波形データを前記一次記憶装置に読み込ませるステップと、
を実行させるプログラム。
(付記10)
付記1に記載の波形読み込み装置と、
演奏情報を供給する演奏操作子と、
音色選択情報を供給する音色選択操作子と、
前記演奏操作子による演奏情報の供給に応答して、当該演奏情報と前記音色選択操作子による音色選択情報とに基づいて、前記一次記憶装置から読み出された波形データに対応する楽音を生成する音源と、
を備えた電子楽器。
(付記11)
一次記憶装置と、
楽音の音色と演奏情報とに対応した複数の波形データが記憶された二次記憶装置と、
外部より演奏情報が供給される毎に、当該供給される演奏情報を演奏履歴バッファに順次記憶させる記憶制御部と、
外部より音色選択情報が供給される毎に、当該音色選択情報が供給されるタイミングに基づいて特定モードか否か判別する判別部と、
前記特定モードと判別された場合に、前記演奏履歴バッファに記憶されている各演奏情報に対して優先度を付与する優先度付与部と、
前記優先度付与部により付与された優先度に基づいて前記演奏履歴バッファから選択された演奏情報と前記供給された音色選択情報とに基づいた波形データを前記二次記憶装置から読み出し、当該読み出された波形データを前記一次記憶装置に読み込ませる波形読み込み部と、
を備えた波形読み込み装置。