(57)【要約】      （修正有）【課題】第１プロセッサが第１記憶手段内の波形データを第２記憶手段に良好に転送し、第２プロセッサが第２記憶手段内の波形データを良好に読み込む楽音発生装置、方法、プログラム及び電子機器を提供する。【解決手段】大容量フラッシュメモリの音色波形領域からＲＡＭの波形バッファに波形データを転送する場合に、ＲＡＭ上で転送可能領域の波形バッファが探索される。波形データを格納するだけの十分な転送可能領域が見つからない場合に、音源による読出しがループ区間に入っている波形バッファが検索され、その波形バッファの非ループ区間が波形データを転送するのに十分なサイズであれば、その非ループ区間が開放されることにより、その波形バッファが転送可能区間と使用区間の２つに分割され、その転送可能区間を使って波形データが転送される。【選択図】図１８
2019028199.tif 000002
【特許請求の範囲】
【請求項１】
第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、
第１記憶手段内から、前記第１波形データに続く第２波形データを前記第２記憶手段に転送する第２転送処理と、
を実行する第１プロセッサと、
前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データを読み込む読込処理、
を実行する第２プロセッサと、
を有し、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかが、
前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第１波形データが読み込まれた後に、前記第２記憶手段内の前記第１波形データを転送可能とすることにより、前記第２記憶手段内における転送可能領域を増加させる領域確保処理を実行する、
ことを特徴とする楽音発生装置。
【請求項２】
前記第１転送処理及び前記第２転送処理は、前記第１波形データ及び前記第２波形データを一括して転送する場合を含む、ことを特徴とする請求項１に記載の楽音発生装置。
【請求項３】
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きなサイズを有する第１の転送可能領域を前記第１記憶手段内で探索する第１探索処理を実行し、
前記第１プロセッサにより前記第１転送処理及び前記第２転送処理が実行されることにより、前記第１探索処理により探索された前記第１の転送可能領域に、前記第１波形データと前記第２波形データが連続して記憶されている、ことを特徴とする請求項１又は２に記載の楽音発生装置。
【請求項４】
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第１の転送可能領域が見つからない場合に、前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きな合計サイズを有する２つ以上の連続する転送可能領域を前記第１記憶手段内で探索する第２探索処理を実行し、
前記第１プロセッサにより前記第１転送処理及び前記第２転送処理が実行されることにより、前記第１探索処理により探索された前記第２の転送可能領域に、前記第１波形データと前記第２波形データが連続して記憶されている、ことを特徴とする請求項３に記載の楽音発生装置。
【請求項５】
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第２の転送可能領域が見つからない場合であって、前記領域確保処理により増加された前記転送可能領域のサイズが前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きいサイズとなる第３の転送可能領域を前記第２記憶手段内で探索する第３探索処理を実行し、前記第１プロセッサにより前記第１転送処理及び前記第２転送処理が実行されることにより、前記第３探索処理により探索された前記第３の転送可能領域に前記第１波形データと前記第２波形データが連続して記憶されている、ことを特徴とする請求項４に記載の楽音発生装置。
【請求項６】
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第３の転送可能領域のサイズが前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きくはない場合に、リングバッファとして使用可能な第４の転送可能領域を前記第１記憶手段内で探索する第４探索処理を実行し、
前記第１プロセッサは、前記第４探索処理により探索された前記第４の転送可能領域に前記第１波形データと前記第２波形データを順次転送する、ことを特徴とする請求項５に記載の楽音発生装置。
【請求項７】
前記第２プロセッサは、前記読込処理において、前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データの読込みに続けて、前記第２記憶手段に転送された前記第２波形データを読み込む処理を更に実行し、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサが、
前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第２波形データの読込みを開始した場合に、前記第２記憶手段上の前記第２波形データを前記第２記憶手段上の別の領域に複製して、前記第２プロセッサによる前記第２波形データの読込みを複製元の領域から複製先の領域に移動させることにより、
連続する転送可能領域を増加させる、
ことを特徴とする請求項１乃至６の何れかに記載の楽音発生装置。
【請求項８】
第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、
第１記憶手段内から、前記第１波形データに続く第２波形データを前記第２記憶手段に転送する第２転送処理と、
を第１プロセッサで実行させ、
前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データを読み込む読込処理、
を第２プロセッサで実行させ、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサに、前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第１波形データが読み込まれた後に、前記第２記憶手段内の前記第１波形データを転送可能とすることにより、前記第２記憶手段内における転送可能領域を増加させる領域確保処理を実行させる、
ことを特徴とする楽音発生方法。
【請求項９】
第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、
第１記憶手段内から、前記第１波形データに続く第２波形データを前記第２記憶手段に転送する第２転送処理と、
を第１プロセッサで実行させ、
前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データを読み込む読込処理、
を第２プロセッサで実行させ、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサに、前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第１波形データが読み込まれた後に、前記第２記憶手段内の前記第１波形データを転送可能とすることにより、前記第２記憶手段内における転送可能領域を増加させる領域確保処理を実行させる、
ためのプログラム。
【請求項１０】
請求項１乃至７の何れかに記載の楽音発生装置と、
前記第１波形データ及び前記第２波形データに基づいて発音する発音部と、
を備える電子楽器。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、楽音発生装置、方法、プログラム、及びその装置を用いた電子楽器に関する。
【背景技術】
【０００２】
波形読込み方式により楽音波形を発生する音源装置では、より多数の、より長時間の波形データを利用できるようにするために、使用しない波形データは例えばＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリ、又はハードディスク記憶装置等の二次記憶装置（第１記憶手段）の音色波形領域に保存しておき、その中で使用する波形データを音源装置が直接アクセスできる高速な波形バッファとして機能する例えばＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）等の一次記憶装置（第２記憶手段）に転送して発音させるというシステムを採用するものがある。つまり、高価なＲＡＭが有する記憶容量以上の記憶容量の波形データを安価なＲＯＭ等に保持しておき、必要な場合のみそれを波形バッファに移動して発音に使用するというコスト的には効率的な方法であると言える。
【０００３】
ところで楽音波形データのサイズは様々であり、理想的には全ての発音チャネル分の夫々の波形データをそのまま格納できるだけの領域が第２記憶手段の波形バッファ上に用意されていることが好ましいが、現実には、コストを抑えるために、第２記憶手段の波形バッファ上に十分な領域が用意されていない。そのために、波形バッファを楽音波形データのサイズを気にする必要のないいわゆる「リングバッファ」として機能させ、発音部が発音中に音源が対象発音チャネルの波形バッファ（リングバッファ領域）の所定区間を繰り返し読み出すのと並行して、ＣＰＵが波形バッファに波形データを逐次補充している。
【０００４】
従来技術としては、例えば特許文献１に記載の技術が知られている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−１２２６６８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、上述の方法は、波形バッファの容量は少なくて済むが、転送データのトラフィックが多いという欠点がある。特に波形のループ区間の転送を発音終了まで行わなければ成らない場合などは元波形の容量よりも多くのデータ転送が発生することさえありうる。例えば、波形バッファ（リングバッファ）のサイズが１６Ｋ（キロ）バイト、波形データの容量が３０Ｋバイト、ループ区間の容量が２０Ｋバイトという場合に、押鍵による発音が長時間持続すれば、ループ区間を何度も繰り返して転送する必要があるために、３０Ｋバイト＋（ループ回数−１）×２０Ｋバイトのデータを転送することになり、波形データの容量よりも遥かに多くのデータ転送が発生することも起こりうる。この結果、ＣＰＵやメモリシステムのバスの占有率が高くなり同時発音数の減少、演奏レイテンシーの悪化等、性能低下を招く。また、その性能低下を少なくするために高性能なＣＰＵやバスシステムを使用すれば、コストが増大する。
【０００７】
そこで、本発明は、第１プロセッサが第１記憶手段内の波形データを第２記憶手段に良好に転送し、第２プロセッサが第２記憶手段内の波形データを良好に読み込む楽音発生装置等を提供することを目的とする。
【課題を解決するための手段】
【０００８】
態様の一例では、第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、第１記憶手段内から、第１波形データに続く第２波形データを第２記憶手段に転送する第２転送処理と、を実行する第１プロセッサと、第１転送処理により転送された第２記憶手段内の第１波形データを読み込む読込処理、を実行する第２プロセッサと、を有し、少なくとも第１プロセッサ及び第２プロセッサのうちのいずれかのプロセッサが、第２プロセッサによる読込処理により、第２記憶手段内の第１波形データが読み込まれた後に、第２記憶手段内の第１波形データを転送可能とすることにより、第２記憶手段内における転送可能領域を増加させる領域確保処理を実行する。
【発明の効果】
【０００９】
本発明によれば、第１プロセッサが第１記憶手段内の波形データを第２記憶手段に良好に転送し、第２プロセッサが第２記憶手段内の波形データを良好に読み込む楽音発生装置等を提供することが可能となる。
【図面の簡単な説明】
【００１０】
【図１】本発明による電子鍵盤楽器の一実施形態の外観図である。
【図２】電子鍵盤楽器の一実施形態のハードウェア例を示す図である。
【図３】音源ＬＳＩを示すブロックである。
【図４】波形読出しループの動作の説明図である。
【図５】「フラッシュメモリ音色波形ディレクトリ」のデータ例を示す図である。
【図６】「ＲＡＭ波形バッファディレクトリ」のデータ例を示す図である。
【図７】大容量フラッシュメモリ上の音色波形領域からＲＡＭ上の波形バッファへの音色波形転送動作の説明図である。
【図８】非ループ区間の開放動作の説明図である。
【図９】メインルーチンの処理例を示すフローチャートである。
【図１０】初期化処理及び音色選択処理の詳細例を示すフローチャートである。
【図１１】押鍵処理の詳細例を示すフローチャートである。
【図１２】波形バッファアサイン処理の詳細例を示すフローチャートである。
【図１３】バッファステータスが転送可能時の処理の詳細例を示すフローチャートである。
【図１４】ＲＡＭ波形バッファ分割処理、連続バッファを使用したバッファサイン処理、
【図１５】波形転送管理処理の例を示すフローチャート（その１）である。
【図１６】波形転送管理処理の例を示すフローチャート（その１）である。
【図１７】波形読出し、波形バッファ転送処理及び音源イベント処理の例を示すフローチャートである。
【図１８】他の実施形態における波形バッファのデータ移動動作例の説明図である。
【図１９】他の実施形態における波形読出しループの移動動作例の説明図である。
【発明を実施するための形態】
【００１１】
以下、本発明を実施するための一形態について図面を参照しながら詳細に説明する。本実施形態は、例えば電子鍵盤楽器に適用される、音高（鍵域）や音量（ベロシティ：打鍵の速さ）などの演奏情報によって音色が変化するのを再現するために、例えば大容量フラッシュメモリである第１記憶手段の音色波形領域から例えばＲＡＭである第２記憶手段の波形バッファに、音高又は音量ごとの波形データ（以下これを「スプリット波形」と呼ぶ）を転送する楽音発生装置を対象とする。本実施形態は、このような楽音発生装置において、例えばＣＰＵである第１プロセッサが、例えば大容量フラッシュメモリである第１記憶手段内の第１波形データを例えばＲＡＭである第２記憶手段に転送する第１転送処理を実行する。また、第１プロセッサが、第１記憶手段内から、第１波形データに続く第２波形データを第２記憶手段に転送する第２転送処理を実行する。一方、例えば音源ＬＳＩ（大規模集積回路）である第２プロセッサが、第１転送処理により転送された第２記憶手段内の第１波形データを読み込む読込処理を実行する。このような構成においては、少なくとも第１プロセッサ及び第２プロセッサのうちのいずれかのプロセッサが、第２プロセッサによる読込処理により、第２記憶手段内の第１波形データが読み込まれた後に、第２記憶手段内の第１波形データを転送可能とすることにより、第２記憶手段内における転送可能領域を増加させる領域確保処理を実行する。これにより、第２プロセッサによる読出しがループ区間に入った場合に非ループ区間が開放できることに着目し、発音中でも不要になった領域を増やすことができるようになり、結果として、ループ部再生によって生ずる転送の繰り返しを回避することが可能となり、全体的な転送トラフィックを下げることが可能となり、同時発音数を改善できる、もしくは、同時発音数を確保するためのハードウェアのコストを削減できる楽音発生装置又はそれを利用した電子楽器を実現することが可能となる。
【００１２】
図１は、本発明による電子鍵盤楽器の一実施形態の外観図である。本実施形態は、電子鍵盤楽器１００として実施される。電子鍵盤楽器１００は、演奏操作子としての複数の鍵からなる鍵盤１０１と、音色選択操作子としての音色選択を行うための音色選択ボタン１０２及び音色以外の各種機能選択を行う機能選択ボタン１０３からなるスイッチ・パネルと、ピッチベンドやトレモロ、ビブラート等の各種モジュレーション（演奏効果）を付加するベンダ／モジュレーション・ホイール１０４、音色や音色以外の各種設定情報を表示するＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ：液晶ディスプレイ）１０５等を備える。また、電子鍵盤楽器１００は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、又は背面部等に備える。
【００１３】
音色選択ボタン１０２は、図１に示されるように、ピアノ（図中「Ｐｉａｎｏ」）、エレクトリックピアノ（図中「Ｅ．ｐｉａｎｏ」）、オルガン（図中「Ｏｒｇａｎ」）、ギター（図中「Ｇｕｉｔａｒ）等の各種音色のカテゴリを選択するためのボタン群である。ユーザは、この音色選択ボタン１０２を押下することにより、例えば１６音色のうちの何れかを選択することができる。
【００１４】
図２は、図１の電子鍵盤楽器１００の実施形態のハードウェア例を示す図である。図２の電子鍵盤楽器１００において、システム全体はバスコントローラ２０１によって制御される。バスコントローラ２０１はバス２０２上のデータの流れを司るものであるが、その役割は、バス２０２に接続されたデバイスの優先順位のコントロールである。例えば、メモリコントローラ２０３を介してバス２０２に接続されるＲＡＭ２０４は、ＣＰＵ２０５と音源ＬＳＩ２０６によって共有されているが、発音を行う音源ＬＳＩ２０６はデータの欠落が許されないために優先度が最も高く設定されており、必要に応じてＣＰＵ２０５のアクセスを制限する。
【００１５】
バス２０２には、ＣＰＵ２０５、音源ＬＳＩ２０６、フラッシュメモリコントローラ２０７、メモリコントローラ２０３、ＤＭＡ（ダイレクトメモリアクセス）コントローラ２０９、Ｉ／Ｏ（入出力）コントローラ２１０、Ｉ／Ｏコントローラ２１０を介して接続されるキー・スキャナ２１１とＬＣＤコントローラ２１２とＡ／Ｄ（アナログ／デジタル）コンバータ２１３が接続される。
【００１６】
ＣＰＵ２０５は、電子鍵盤楽器１００の全体の制御処理を実行する第１プロセッサである。音源ＬＳＩ２０６は、楽音発音専用の大規模集積回路である第２プロセッサである。
【００１７】
フラッシュメモリコントローラ２０７は、大容量フラッシュメモリ２０８とバス２０２を接続するインタフェース回路である。大容量フラッシュメモリ２０８は、波形データ、制御プログラム、固定データ等格納する。
【００１８】
メモリコントローラ２０３は、ＲＡＭ２０４とバス２０２を接続するインタフェース回路である。ＲＡＭ２０４は、波形データ、制御プログラム、データを必要に応じて配置する。ＲＡＭ２０４はまた、ＣＰＵ２０５や音源ＬＳＩ２０６に内蔵されるＤＳＰ（デジタルシグナルプロセッサ）のワーク領域としても使用される。
【００１９】
Ｉ／Ｏコントローラ２１０は、バス２０２と、図１の鍵盤１０１、音色選択ボタン１０２、機能選択ボタン１０３、ベンダ／モジュレーション・ホイール１０４、又はＬＣＤ１０５等の周辺デバイスとを接続するインターフェース回路である。Ｉ／Ｏコントローラ２１０に接続されるキー・スキャナ２１１は、図１の鍵盤１０１や音色選択ボタン１０２又は機能選択ボタン１０３等のスイッチ・パネルの状態を走査して、その走査結果をＩ／Ｏコントローラ２１０及びバス２０２を介してＣＰＵ２０５に通知する。Ｉ／Ｏコントローラ２１０に接続されるＬＣＤコントローラ２１２は、図１のＬＣＤ１０５のデバイスをコントロールする。Ａ／Ｄコンバータ２１３は、図１のベンダ／モジュレーション・ホイール１０４の走査位置を検出する。
【００２０】
ＤＭＡコントローラ２０９は、大容量フラッシュメモリ２０８とＲＡＭ２０４間のＤＭＡ転送を制御する。
【００２１】
図３は、音源ＬＳＩ２０６を示すブロック図である。音源ＬＳＩ２０６は、波形発生器３０１、バスインタフェース３０２、ＤＳＰ３０３、及びミキサ３０４を含む。波形発生器３０１は、図２のＲＡＭ２０４から波形データ読み出して楽音波形として発生する＃１から＃２５６までの２５６組の発振器である波形読出し装置３０５を具備する。バスインタフェース３０２は、バス２０２と、波形発生器３０１、ＤＳＰ３０３、及びミキサ３０４との接続を行うバスインタフェース回路であり、これら各部と図２のＣＰＵ２０５又はＲＡＭ２０４との通信を司る。ＤＳＰ３０３は、楽音信号に音響効果をもたらすデジタル信号処理回路である。ミキサ３０４は、波形発生器３０１が出力する楽音信号を混合したり、ＤＳＰ３０３に送ったり、ＤＳＰ３０３からの音響信号を受け取ったりすることで全体の楽音信号の流れを制御し、外部に出力する。ミキサ３０４からのデジタル楽音信号は、図２のＤ／Ａコンバータ２１４でアナログ楽音信号に変換される。このアナログ楽音信号は、アンプ２１５で増幅された後に、アナログ楽音出力信号として出力される。
【００２２】
次に、図２の大容量フラッシュメモリ２０８は、ＮＡＮＤ型フラッシュメモリなどの、大容量で安価なメモリデバイスである。なお、この大容量フラッシュメモリ２０８の代わりに、ハードディスク記憶装置や、ネットワーク上又はクラウド上のディスク装置が使用されてもよい。大容量フラッシュメモリ２０８には、主に以下のようなデータが格納されている。
・全ての音色の波形データ
・全ての音色のパラメータデータ
・ＣＰＵ２０５やＤＳＰ３０３が実行するプログラム、プログラムの使用データ
・音楽データ
・ユーザの設定データ
波形データは例えば、１ワード長が１６ビットのリニアＰＣＭフォーマットデータである。
【００２３】
前述した大容量フラッシュメモリ２０８の内容は、ＣＰＵ２０５からは任意のアドレスへのアクセスが可能であるが、音源ＬＳＩ２０６からはアクセスすることができないので、大容量フラッシュメモリ２０８中の波形データをＲＡＭ２０４に転送する必要がある。しかしながら、ＲＡＭ２０４の記憶容量は大容量フラッシュメモリ２０８よりも小さいために、全てデータをＲＡＭ２０４中の発音チャネル毎のバッファ領域に転送することはできない。従って、ＲＡＭ２０４の記憶内容は必要に応じて逐次入れ替える必要がある。入替えが必要なデータの中で特に本実施形態が対象とするものは波形データであるが、波形データの制御の詳細については後述する。
【００２４】
図１から図３の本実施形態の動作の概要について、以下に説明する。まず本実施例では、演奏者が図１の音色選択ボタン１０２を押下することで図１に示される１６音色のうちのいずれかを選択することができる。各音色は、それぞれ１音色当たり最大３２種類の波形から構成され、波形データは大容量フラッシュメモリ２０８に格納されている。１音色の音域（キー番号）とベロシティ域が２次元的に分割され、それぞれのスプリット(分割)エリアに、上述の最大３２個の波形が割り当てられている。即ち、押鍵時の速さ(ベロシティ)とキー番号（鍵盤１０１の番号）の２つのファクタから、読み出されるべき波形が１つだけ決定される、という制御が実施される。
【００２５】
本実施例の音源ＬＳＩ２０６は、波形読出しの際にループ処理を実行することが可能である。図４は、波形読出しループの動作の説明図である。以下の３つのアドレス情報に基づいてループ処理の制御が実行される。
【００２６】
１．波形バッファスタートアドレス：音源ＬＳＩ２０６が読出しを開始する
ためのアドレス
２．波形バッファエンドアドレス：音源ＬＳＩ２０６が読出しを行う最も
後方のアドレス
３．波形バッファループアドレス：波形バッファスタートアドレスと波形
バッファエンドアドレスの間に存在し、波形読出しが波形バッファ
エンドアドレスに達した場合に、次に読み出されるのがこの波形
バッファループアドレスである。
【００２７】
図４に示されるように、波形バッファに記憶されている波形バッファスタートアドレスから波形バッファエンドアドレスまでの波形データが読み出されるときに、波形バッファループアドレスから波形バッファエンドアドレスまでのループ区間で、繰り返し読出し動作が実行される。なお、波形バッファループアドレスが、波形バッファエンドアドレスと等しい場合は、ループ処理は行われず、読出しポインタが波形バッファエンドアドレスに達した時点で発音が停止する。
【００２８】
図５は、「フラッシュメモリ音色波形ディレクトリ」のデータ例を示す図である。フラッシュメモリ音色波形ディレクトリは、大容量フラッシュメモリ２０８上に格納されている全ての波形データの情報をまとめたテーブルである。具体的には、このテーブルは、「音色番号」及び「音色内波形番号」で決まる各音色の各波形それぞれが用いられる鍵域を示す「最低キー番号」と「最高キー番号」、前記各波形それぞれが用いられるベロシティ域情報である「最低ベロシティ」と「最高ベロシティ」、実際に大容量フラッシュメモリ２０８のどのアドレスに配置されているかを示す「波形領域先頭からのアドレス」、波形の長さを示す「波形サイズ」、読出しに使用される「スタートアドレス」、「ループアドレス」、及び「エンドアドレス」の情報をまとめたテーブルである。このテーブルは、電源投入時に、ＲＡＭ２０４上に展開される。
【００２９】
図６は、「ＲＡＭ波形バッファディレクトリ」のデータ例を示す図である。ＲＡＭ波形バッファディレクトリは、ＲＡＭ２０４の波形バッファ上に格納されている波形データの情報をまとめたテーブルである。このテーブル上のバッファ番号ｂによって決まるバッファディレクトリの１つが持つ情報は、波形バッファｂの使用状態を表す「バッファステータスｖｓ［ｂ］」、波形バッファｂ自体のスタート位置、ループ位置を表す、エンド位置をそれぞれ表す「波形バッファスタートアドレスｂｓａ［ｂ］」、「波形バッファループアドレスｂｌａ［ｂ］」、及び「波形バッファエンドアドレスｂｅａ［ｂ］」、波形バッファｂに対応する転送元の大容量フラッシュメモリ２０８の音色波形領域のスタート位置、ループ位置を表す、エンド位置をそれぞれ表す「スタートアドレスｓａ［ｂ］」、「ループアドレスｌａ［ｂ］」、及び「エンドアドレスｅａ［ｂ］」、ＣＰＵ２０５による大容量フラッシュメモリ２０８上の現在の転送波形の読出しアドレスである「転送データポインタ」、ＣＰＵ２０５によるＲＡＭ２０４への転送書込みアドレスである「書込みポインタ」、音源ＬＳＩ２０６によるＲＡＭ２０４上の現在の読出しアドレスである「読出しポインタ」、そして、書込みポインタと読出しポインタ最新値との差分である「波形読出しマージン」が保持される。
【００３０】
図６の例において、テーブルのバッファ情報の数は５１３用意されている。これは実際にＲＡＭ２０４上の波形バッファが常に５１３個に分割されているということではなく、初期状態では連続した転送可能領域を示すバッファ情報が１つ存在するだけであり、このバッファのバッファステータスｖｓ［ｂ］は１である。そのバッファのバッファスタートアドレスとバッファエンドアドレスはバッファ領域の全ての先頭と最後尾を保持する。これ以外のバッファの情報のバッファステータスは、具体的なＲＡＭ空間（ＲＡＭ２０４のアドレス空間）を指し示していないためＮＵＬＬ値を持つ。その後、発音チャンネルのために新しいバッファ領域が確保されていくと、最大で２５６発音チャンネルが不連続に配置されることが起こりうる。この場合、前後に最大２５７個の転送可能領域が存在するので、最大２５６＋２５７＝５１３個のバッファが必要になる。
【００３１】
図７は、大容量フラッシュメモリ２０８上の音色波形領域からＲＡＭ２０４上の波形バッファへの音色波形転送動作の説明図である。まず、演奏されると、転送されるべき波形のサイズが調べられる。波形サイズより大きい波形領域があるかが検索され、見つかればそこを波形バッファにおける転送先の領域とし、波形転送が開始される。まず、もし１つのバッファ領域の転送可能領域のサイズが十分であればその領域が使用される。見つからない場合、２つ以上の連続した転送可能領域が探索され、その合計サイズが十分であればそれらが結合されて使用される。この場合、波形バッファのディレクトリ情報が１つに集約され、空いたもののステータスはＮＵＬＬとされる。
【００３２】
更に見つからない場合は、すでに読出しがループ区間に入っている波形バッファが検索され、その波形バッファの非ループ区間が十分なサイズであれば、非ループ区間が開放されることにより、その波形バッファｖが転送可能区間と使用区間の２つに分割され、その転送可能区間が新たな波形データの転送先の領域として使用される。図８は、非ループ区間の開放動作の説明図である。図８（ａ）に示されるように、波形バッファ中の波形バッファスタートアドレス（図中「スタート」と記載）から読出しが開始され、最初は非ループ区間に対する読出しが実行される。その後、図８（ｂ）に示されるように、波形バッファループアドレス（図中「ループ」と記載）から波形バッファエンドアドレス（図中「エンド」と記載）のループ区間に対する読出しに移行する。ループ区間の読出し中においては、非ループ区間からの読出しは行われなくなるため、図８（ｃ）に示されるように、その非ループ区間が転送可能領域として開放され、他の楽音発生のために使用される。
【００３３】
それでも見つからない場合は、本実施例ではリングバッファの必要容量である１６ＫＢの空き領域が探索され、見つかった領域がリングバッファ方式で使用されることで発音が行われる。リングバッファ方式では、波形バッファがリングとして扱われることで、見かけ上無限のメモリ空間を確保する手法である。この場合、ＣＰＵ２０５による書込みポインタのアドレス値が音源ＬＳＩ２０６による読出しポインタのアドレス値を追い抜くことも追いつかれることも無いように、制御が実施される。このリングバッファ領域すらみつからない場合は、発音が断念される。
【００３４】
ところで、波形バッファｖの書込みポインタｗｐ［ｖ］が音源ＬＳＩ２０６の読出しポインタｒｐ［ｖ］を追い越せば、音源ＬＳＩ２０６が読み出す波形データは、突然、不連続に過去のデータに戻ってしまい、ノイズが発生することになる。これは音楽的に許容できるものではない。
【００３５】
そこで、本実施例では、波形バッファｖにおける読出しポインタｒｐ［ｖ］が、波形データを充当しない状態でどれだけ読めるかというデータのワード数(アドレス)、即ち、書込みポインタｗｐ［ｖ］の値と読出しポインタｒｐ［ｖ］の値の差分が、波形読出しマージンとして管理される。本実施形態では、この波形読出しマージンが所定の値以下に達した場合、その楽音を発生しているボイスチャネルに対してダンプ処理(緩やかな消音処理)が実行され、その処理の後に発音が停止した時点でそのボイスチャネルの波形バッファｖからの読出しが中止されることにより、ノイズの発生を防止することができる。
【００３６】
本実施例では、その波形読出しマージンの値は、固定値ではなく再生ピッチが考慮されて、原音ピッチによる再生時には１Ｋワード未満、１オクターブ上のピッチでの再生時には２Ｋワード未満、１オクターブ下のピッチでの再生時には５１２ワード未満になったら、ダンプ処理の実行が決定される。
【００３７】
ダンプ処理の速度は、このまま波形が補充されずに読み進んだとしても、すでに波形バッファｖに転送された読込みマージン分の波形データが読み切られる前に消音できるだけの速度であればよい。その速度は現在の再生ピッチに依存する。
【００３８】
図９は、図２のＣＰＵ２０５が実行する制御処理のメインルーチンの処理例を示すフローチャートである。図１の電子鍵盤楽器１００において、機能選択ボタン１０３により装置電源がパワーオンされると、ＣＰＵ２０５は、図９のフローチャートで示されるメインルーチンを起動し、まず装置各部を初期化する初期化処理を実行する（ステップＳ９０１）。ステップＳ９０１の初期化処理が完了すると、ユーザが図１の音色選択ボタン１０２又は機能選択ボタン１０３の操作状態を取り込むスイッチ処理（ステップＳ９０２）、ステップＳ９０２の処理の結果に基づく音色選択ボタン１０２が操作された際の音色選択イベントの検出及び音色選択処理（ステップＳ９０３→Ｓ９０４）、ユーザが図１の鍵盤１０１を弾いた際の押鍵イベントや離鍵イベントを取り込む鍵盤処理（ステップＳ９０５）、ステップＳ９０５の処理の結果に基づく押鍵イベントの検出及び押鍵処理（ステップＳ９０６→Ｓ９０７）、ステップＳ９０５の処理の結果に基づく離鍵イベントの検出及び離鍵処理（ステップＳ９０８→Ｓ９０９）、及び音源ＬＳＩ２０６からのイベントの処理を行う音源イベント処理（ステップＳ９１０）が、繰り返し実行される。
【００３９】
図１０（ａ）は、図９のステップＳ９０１の初期化処理の詳細例を示すフローチャートである。まず、ＣＰＵ２０５は、大容量フラッシュメモリ２０８からフラッシュメモリ音色波形ディレクトリ（図５参照）のテーブルデータを、ＲＡＭ２０４上の指定されたアドレスに転送する（ステップＳ１００１）。
【００４０】
次に、ステップＳ１００２とステップＳ１００５の繰返し制御処理によりバッファ情報数（＝５１３）分のループ処理が実行される。このループ処理中のステップＳ１００３において、バッファ番号ｂ（図６のＲＡＭ波形バッファディレクトリを参照）の値が判定される。
【００４１】
ＣＰＵ２０５は、バッファ番号ｂ＝０のときは、ＲＡＭ２０４に記憶される図６に例示されるＲＡＭ波形バッファディレクトリを初期化した後に、そのディレクトリ内のバッファ番号ｂ＝０に対応するバッファステータスを転送可能（＝１）に設定する（ステップＳ１００３→Ｓ１００４）。その後、ＣＰＵ２０５は、ループ処理を続行する（ステップＳ１００４→Ｓ１００６）。
【００４２】
一方、ＣＰＵ２０５は、バッファ番号ｂ≠０のときは、ＲＡＭ波形バッファディレクトリを初期化した後に、そのディレクトリ内の上記バッファ番号ｂに対応するバッファステータスをＮＵＬＬ（＝０）に設定する（ステップＳ１００３→Ｓ１００５）。その後、ＣＰＵ２０５は、ループ処理を続行する（ステップＳ１００５→Ｓ１００６）。
【００４３】
上記ステップＳ１００２からＳ１００６のループ処理が終了後、ＣＰＵ２０５は、ＲＡＭ２０４上の波形バッファのリンク情報を初期化する（ステップＳ１００７）。リンク情報とは、ＲＡＭ２０４上の波形バッファ領域に対して、先頭から順番にどのＲＡＭ波形バッファが使用されているかのバッファ番号が取得できる情報である。初期化時は、波形領域が１つなので、リンク情報の先頭番号が０に設定される。
【００４４】
最後に、ＣＰＵ２０５は、大容量フラッシュメモリ２０８の音色波形領域から波形バッファへの波形転送を管理するための、転送要求カウンタ、転送状態フラグ、転送要求バッファ（リンク構造）を初期化する（Ｓ１００８）。転送要求カウンタは、ＲＡＭ２０４上の波形バッファに対して、ＲＡＭ波形バッファディレクトリで示されるバッファのうち、波形データが転送中のバッファが現在いくつあるか管理するもので情報である。転送状態フラグは、音色波形領域から波形バッファへ波形データを転送中か否かを判断するフラグ情報である。転送要求バッファは、次にどの波形バッファに対して音色波形領域から波形バッファへの波形転送を行うかを管理するためのバッファである。その後、ＣＰＵ２０５は、図１０（ａ）のフローチャートで示される図９のステップＳ９０１の初期化処理を終了する。
【００４５】
図１０（ｂ）は、図９のステップＳ９０４の音色選択処理の詳細例を示すフローチャートである。ＣＰＵ２０５は、押鍵処理などで使用するために、図１の音色選択ボタン１０２の操作により指定された音色番号を、ＣＰＵ２０５内のワークメモリ等に保存しておく（ステップＳ１０１０）。
【００４６】
図１１は、図９のステップＳ９０７の押鍵処理の詳細例を示すフローチャートである。ＣＰＵ２０５は、鍵盤が弾かれた際の押鍵による演奏情報（鍵盤位置、押された強さ）を、キー番号、ベロシティに変換し、これらに基づく制御処理を実行する。
【００４７】
ＣＰＵ２０５は、最初に、この押鍵での発音にどのボイスを使用するかを決定するボイスアサインを実行する（ステップＳ１１０１）。
【００４８】
次に、ＣＰＵ２０５は、キー番号、ベロシティ、現在の音色番号から、音色波形領域から波形バッファへ転送を行うべき波形番号ｗを取得する（ステップＳ１１０２）。
【００４９】
次に、ＣＰＵ２０５は、キー番号、波形番号ｗから得られる波形情報から、再生ピッチを計算する（ステップＳ１１０３）。
【００５０】
次に、ＣＰＵ２０５は、再生ピッチから、波形読出しマージン（図６参照）を決定する（ステップＳ１１０４）。
【００５１】
次に、ＣＰＵ２０５は、波形バッファアサイン処理を実行する（ステップＳ１１０５）。この処理の詳細については、図１２を用いて後述する。
【００５２】
次にＲＡＭ波形バッファディレクトリ（図６）で示されるいずれかのバッファステータスが転送可能のバッファのバッファ番号で、アサインが行われたか否かを判定する（ステップＳ１１０６）。
【００５３】
ステップＳ１１０６の判定がＹＥＳ（アサインが行われた）ならば、バッファ番号に対応する波形バッファに対して、波形データが転送状態であるか否かを判定する（ステップＳ１１１１）。
【００５４】
ステップＳ１１１１で転送が完了している（ＮＯ）と判定した場合は、ＣＰＵ２０５は、波形読出し装置３０５（図３参照）による波形読出しを開始する（ステップＳ１１１１→Ｓ１１１４）。その後、ＣＰＵ２０５は、図１１のフローチャートで例示される図９のステップＳ９０７の押鍵処理を終了する。
【００５５】
ステップＳ１１１１で転送中である（ＹＥＳ）と判定した場合は、ＣＰＵ２０５は、バッファ番号ｂに対応する書込みポインタｗｐ［ｂ］と読出しポインタｒｐ［ｂ］の差分からの波形読み出しマージンの計算（ステップＳ１１１２）と、現在の波形読み出しマージンが波形読み出し開始マージンの閾値より大きくなったか否かの判定（ステップＳ１１１３）を繰り返し実行する。やがてステップＳ１１１３で現在の波形読み出しマージンが波形読み出し開始マージンの閾値より大きくなったと判定されると、ＣＰＵ２０５は、波形読出し装置３０５（図３参照）による波形読出しを開始する（ステップＳ１１１３→Ｓ１１１４）。その後、ＣＰＵ２０５は、図１１のフローチャートで例示される図９のステップＳ９０７の押鍵処理を終了する。
【００５６】
前述したステップＳ１１０６の判定がＮＯ（アサインが行われなかった）ならば、ＣＰＵ２０５は、バッファステータスが転送可能でバッファ番号ｂが連続するバッファ領域でアサインが可能か否かを判定する（ステップＳ１１０７）。
【００５７】
ステップＳ１１０７の判定がＹＥＳ（アサインが可能）ならば、ＣＰＵ２０５は、連続バッファ領域を使用したアサイン処理を実行する（ステップＳ１１０８）。この処理の詳細については、図１４（ｂ）及び（ｃ）を用いて後述する。その後、ＣＰＵ２０５は、前述したステップＳ１１１１からＳ１１１４の一連の処理を実行する。
【００５８】
ステップＳ１１０７の判定がＮＯ（アサインが不可能）ならば、図８で説明した非ループ区間を開放することによるバッファアサインが可能か否かを判定する（ステップＳ１１０９）。
【００５９】
ステップＳ１１０９の判定がＹＥＳ（アサインが可能）ならば、ＣＰＵ２０５は、非ループ区間を使用したアサイン処理を実行する（ステップＳ１１１０）。この処理の詳細については、図１４（ｄ）を用いて後述する。その後、ＣＰＵ２０５は、前述したステップＳ１１１１からＳ１１１４の一連の処理を実行する。
【００６０】
ステップＳ１１０９の判定がＮＯ（アサインが不可能）ならば、ＣＰＵ２０５内のワークメモリ等から、１６ＫＢ以上の転送可能バッファがあるか否かを判定する（ステップＳ１１１５）。
【００６１】
ステップＳ１１１５の判定がＹＥＳならば、ＣＰＵ２０５は、リングバッファ方式での発音処理を実行する（ステップＳ１１１６）。その後、ＣＰＵ２０５は、図１１のフローチャートで例示される図９のステップＳ９０７の押鍵処理を終了する。
【００６２】
ステップＳ１１１５の判定もＮＯならば、ＣＰＵ２０５は、発音処理は断念して、図１１のフローチャートで例示される図９のステップＳ９０７の押鍵処理を終了する。
【００６３】
図１２は、図１１のステップＳ１１０５の波形バッファアサイン処理の詳細例を示すフローチャートである。
【００６４】
まず、ＣＰＵ２０５は、ＲＡＭ波形バッファのリンク情報から、ＲＡＭ２０４上の波形バッファ領域に対する先頭のバッファ番号を取得する（ステップＳ１２０１）。
【００６５】
次に、ＣＰＵ２０５は、ＲＡＭ波形バッファに対するループ処理の際に、直前のバッファ番号に対するバッファステータスが転送可能であったことを示すフラグ（以後「フラグＡ」と記載）を０に書記設定する（ステップＳ１２０２）。
【００６６】
次に、ＣＰＵ２０５は、ステップＳ１２０３とＳ１２１４の繰返し制御処理により、ＲＡＭ波形バッファディレクトリのバッファ数分、以下のステップＳ１２０４からＳ１２１３までの一連の処理を、繰り返し実行する。
【００６７】
この一連の処理において、ＣＰＵ２０５はまず、リンク情報から取得したバッファ番号ｂのバッファステータスを判定する（ステップＳ１２０４）。
【００６８】
ステップＳ１２０４で判定したバッファステータスが、ＮＵＬＬ（ｖｓ［ｂ］＝０）、減衰中（ｖｓ［ｂ］＝４）、又はリングバッファ使用中（ｖｓ［ｂ］＝５）である場合（図６参照）、ＣＰＵ２０５は、フラグＡを０に設定する（ステップＳ１２１２）。
【００６９】
続いて、ＣＰＵ２０５は、ＲＡＭ波形バッファのリンク情報から、次に処理するバッファ番号を取得する（ステップＳ１２１３）。その後、ＣＰＵ２０５は、ループ処理を続行する（ステップＳ１２１３→Ｓ１２１４）。
【００７０】
ステップＳ１２０４で判定したバッファステータスが、転送可能（ｖｓ［ｂ］＝１）である場合（図６参照）、ＣＰＵ２０５は、バッファステータスが転送可能時の処理を実行する（ステップＳ１２１１）。この処理の詳細については、図１３及び図１４（ａ）を用いて後述する。その後、ＣＰＵ２０５は、ループ処理を続行する（ステップＳ１２１１→Ｓ１２１４）。
【００７１】
ステップＳ１２０４で判定したバッファステータスが発音中（ｖｓ［ｂ］＝２ｏｒ３）である場合（図６参照）、ＣＰＵ２０５は、ループ区間読出し中（ｖｓ［ｂ］＝３）か否か（ｖｓ［ｂ］＝２）を判定する（ステップＳ１２０５）。
【００７２】
ステップＳ１２０５でループ区間読出し中（ｖｓ［ｂ］＝３）と判定した場合、ＣＰＵ２０５は、非ループ区間のサイズ（ｎｏｎ−ｌｏｏｐ＿ｓｚ）を取得する（ステップＳ１２０６）。ｎｏｎ−ｌｏｏｐ＿ｓｚは、図６のＲＡＭ波形バッファディレクトリ中の該当バッファ番号ｂに対応する波形バッファループアドレスと波形バッファスタートアドレスの差として算出できる。
【００７３】
次に、ＣＰＵ２０５は、ステップＳ１２０６で算出したｎｏｎ−ｌｏｏｐ＿ｓｚを、押鍵情報から取得した波形番号の波形サイズ（ｗａｖｅ＿ｓｚ［ｗ］）と比較する（ステップＳ１２０７）。ｗａｖｅ＿ｓｚ［ｗ］は、図５のフラッシュメモリ音色波形ディレクトリ中の該当波形番号ｗに対応する波形サイズとして算出できる。
【００７４】
ステップＳ１２０７で非ループ区間のサイズｎｏｎ−ｌｏｏｐ＿ｓｚが押鍵に対応する波形データのサイズｗａｖｅ＿ｓｚ［ｗ］より大きいと判定した場合、ＣＰＵ２０５は、現在のバッファ番号をＣＰＵ２０５内のワークメモリ等に保存する（ステップＳ１２０８）。ステップＳ１２０７で非ループ区間のサイズｎｏｎ−ｌｏｏｐ＿ｓｚが押鍵に対応する波形データのサイズｗａｖｅ＿ｓｚ［ｗ］以下と判定した場合、ＣＰＵ２０５は、上記ステップＳ１２０８の処理はスキップする。
【００７５】
その後、ＣＰＵ２０５は、フラグＡを０に設定する（ステップＳ１２０９）。更に、ＣＰＵ２０５は、ＲＡＭ波形バッファのリンク情報から、次に処理するバッファ番号を取得する（ステップＳ１２１０）。その後、ＣＰＵ２０５は、ループ処理を続行する（ステップＳ１２１０→Ｓ１２１４）。
【００７６】
図１３は、図１２のステップＳ１２１１のバッファステータスが転送可能時の処理の詳細例を示すフローチャートである。
【００７７】
まずＣＰＵ２０５は、現在のバッファ番号ｂの波形バッファのサイズｂｕｆ＿ｓｚを取得する（ステップＳ１３０１）。ｂｕｆ＿ｓｚは、ＲＡＭ波形バッファディレクトリ内のバッファ番号ｂに対応する波形バッファエンドアドレスと波形バッファスタートアドレスの差として算出できる。
【００７８】
次に、ＣＰＵ２０５は、上記ｂｕｆ＿ｓｚを、押鍵情報から取得した波形番号ｗの波形データのサイズ（ｗａｖｅ＿ｓｚ［ｗ］）と比較する（ステップＳ１３０２）。ｗａｖｅ＿ｓｚ［ｗ］は、図５のフラッシュメモリ音色波形ディレクトリ中の該当波形番号ｗに対応する波形サイズとして算出できる。
【００７９】
ステップＳ１３０２で波形バッファのサイズｂｕｆ＿ｓｚが押鍵に対応する波形データのサイズｗａｖｅ＿ｓｚ［ｗ］以上であると判定した場合、ＣＰＵ２０５は、現在のバッファ番号ｂで示されるバッファ情報の分割処理を実行する。この処理の詳細については図１４（ａ）を用いて後述する。
【００８０】
次に、ＣＰＵ２０５は、バッファ番号ｂのバッファに対する書込みポインタｗｐ［ｂ］と読出しポインタｒｐ［ｂ］を０に設定する（ステップＳ１３０４）。
【００８１】
次に、ＣＰＵ２０５は、後述する波形転送管理処理に対して、新規転送要求イベントを発行する（ステップＳ１３０５）。
【００８２】
その後、ＣＰＵ２０５は、現在のバッファ番号ｂで示されるバッファのアドレス情報（図６参照）である波形バッファスタートアドレスｂｓａ［ｂ］、波形バッファループアドレスｂｌａ［ｂ］、波形バッファエンドアドレスｂｅａ［ｂ］、スタートアドレスｓａ［ｂ］、ループアドレスｌａ［ｂ］、エンドアドレスｅａ［ｂ］を更新する（ステップＳ１３０６）。
【００８３】
更に、ＣＰＵ２０５は、現在のバッファ番号ｂで示される波形バッファの波形読出しマージン（図６参照）を更新する（ステップＳ１３０７）。
【００８４】
そして、ＣＰＵ２０５は、現在のバッファ番号ｂで示されるバッファステータス（図６参照）を発音中に変更する（ステップＳ１３０８）。その後、ＣＰＵ２０５は、図１３のフローチャートで例示される図１２のステップＳ１２１１のバッファステータスが転送可能時の処理を終了すると共に、図１２のステップＳ１２０３からＳ１２１４のループ処理を抜ける。
【００８５】
ステップＳ１３０２で波形バッファのサイズｂｕｆ＿ｓｚが押鍵に対応する波形データのサイズｗａｖｅ＿ｓｚ［ｗ］より小さいと判定した場合、ＣＰＵ２０５は、フラグＡの値を判定する（ステップＳ１３０９）。
【００８６】
ステップＳ１３０９でフラグＡの値が０であると判定した場合、ＣＰＵ２０５は、次のループ処理で使用できるよう現在の波形バッファのサイズｂｕｆ＿ｓｚを、ＣＰＵ２０５内のワークメモリ等にｐｒｅ＿ｂｕｆ＿ｓｚとして保存しておく（ステップＳ１３１３）。
【００８７】
次に、ＣＰＵ２０５は、波形バッファサイズｂｕｆ＿ｓｚを判定する（ステップＳ１３１４）。
【００８８】
ステップＳ１３１４でｂｕｆ＿ｓｚが１６ＫＢ以上と判定した場合、ＣＰＵ２０５は、バッファ番号ｂをＣＰＵ２０５内のワークメモリ等に保存しておく（ステップＳ１３１５）。ステップＳ１３１４でｂｕｆ＿ｓｚが１６ＫＢより小さいと判定した場合、ＣＰＵ２０５は、上記ステップＳ１３１５の処理はスキップする。
【００８９】
その後、ＣＰＵ２０５は、フラグＡの値を１に設定する（ステップＳ１３１６）。
【００９０】
更に、ＣＰＵ２０５は、ＲＡＭ波形バッファのリンク情報から、次に処理するバッファ番号を取得する（ステップＳ１３１７）。その後、ＣＰＵ２０５は、図１３のフローチャートで例示される図１２のステップＳ１２１１のバッファステータスが転送可能時の処理を終了し、図１２のステップＳ１２０３からＳ１２１４のループ処理を継続する。
【００９１】
ステップＳ１３０９でフラグＡの値が１であると判定した場合、ＣＰＵ２０５は、ＣＰＵ２０５のワークメモリに記憶してある連続した直前の波形バッファサイズｐｒｅ＿ｂｕｆ＿ｓｚ（ステップＳ１３１３参照）と現在の波形バッファのサイズｂｕｆ＿ｓｚとを加算した波形バッファサイズｒｅ＿ｂｕｆ＿ｓｚ＋ｂｕｆ＿ｓｚと、波形データのサイズｗａｖｅ＿ｓｚ［ｗ］とを比較する（ステップＳ１３１０）。
【００９２】
ステップＳ１３１０でｒｅ＿ｂｕｆ＿ｓｚ＋ｂｕｆ＿ｓｚがｗａｖｅ＿ｓｚ［ｗ］以上であると判定した場合、ＣＰＵ１０１は、直前のバッファ番号と現在のバッファ番号とで示されるバッファ番号の組合せをＣＰＵ１０１内のワークメモリに保存する（ステップＳ１３１１）。
【００９３】
その後、ＣＰＵ２０５は、フラグＡの値を０に設定する（ステップＳ１３１２）。
【００９４】
更に、ＣＰＵ２０５は、ＲＡＭ波形バッファのリンク情報から、次に処理するバッファ番号を取得する（ステップＳ１３１７）。その後、ＣＰＵ２０５は、図１３のフローチャートで例示される図１２のステップＳ１２１１のバッファステータスが転送可能時の処理を終了し、図１２のステップＳ１２０３からＳ１２１４のループ処理を継続する。
【００９５】
ステップＳ１３１０でｒｅ＿ｂｕｆ＿ｓｚ＋ｂｕｆ＿ｓｚがｗａｖｅ＿ｓｚ［ｗ］より小さいと判定した場合、ＣＰＵ１０１は、前述したステップＳ１３１３以降の処理を実行する（ステップ１５１０→Ｓ１３１３）。
【００９６】
図１４（ａ）は、図１３のステップＳ１３０３のＲＡＭ波形バッファ分割処理の詳細例を示すフローチャートである。
【００９７】
まずＣＰＵ１０１は、バッファサイズｂｕｆ＿ｓｚを、押鍵情報から取得した波形番号ｗの波形データのサイズ（ｗａｖｅ＿ｓｚ［ｗ］）と比較する（ステップＳ１４０１）。
【００９８】
ステップＳ１４０１で波形バッファのサイズｂｕｆ＿ｓｚが押鍵に対応する波形データのサイズｗａｖｅ＿ｓｚ［ｗ］以下であると判定した場合、ＣＰＵ２０５は、そのまま図１４のフローチャートで例示される図１３のステップＳ１３０３のＲＡＭ波形バッファ分割処理を終了する。
【００９９】
ステップＳ１４０１で波形バッファのサイズｂｕｆ＿ｓｚが押鍵に対応する波形データのサイズｗａｖｅ＿ｓｚ［ｗ］より大きいと判定した場合、ＣＰＵ２０５は、波形データ分を使用し、残りを転送可能とする波形バッファの分割を行う。まずＣＰＵ１０１は、現在のバッファ番号の波形バッファのサイズを波形データと同じサイズに設定する（ステップＳ１４０２）。
【０１００】
次にＣＰＵ１０１は、ＲＡＭ波形バッファのリンク情報から、バッファステータスがＮＵＬＬであるバッファのバッファ番号を取得する。次に、ＣＰＵ１０１は、前述のバッファサイズｂｕｆ＿ｓｚから波形データのサイズｗａｖｅ＿ｓｚ［ｗ］を差し引いた残りのサイズを設定し、バッファステータスを転送可能に設定する（以上、ステップＳ１４０３）。
【０１０１】
最後に、ＣＰＵ１０１は、ＲＡＭ波形バッファのリンク情報に対して、バッファステータスを転送可能としたバッファが現在のバッファの直後になるよう更新を行う（ステップＳ１４０４）。その後、ＣＰＵ１０１は、図１４（ａ）のフローチャートで示される図１３のステップＳ１３０３のＲＡＭ波形バッファ分割処理を終了する。
【０１０２】
図１４（ｂ）は、図１１のステップＳ１１０８の連続バッファを使用したバッファアサイン処理の詳細例を示すフローチャートである。
【０１０３】
まずＣＰＵ１０１は、ＣＰＵ１０１のワークメモリから、転送可能バッファで領域が連続したバッファ番号の組合せ（図１３のステップＳ１３１１参照）を取得する（ステップＳ１４１０）。
【０１０４】
次に、ＣＰＵ１０１は、ＲＡＭ波形バッファ結合処理を実行する（ステップＳ１４１１）。この処理の詳細は、図１４（ｃ）を用いて後述する。
【０１０５】
その後、ＣＰＵ１０１は、現在のバッファ番号ｂに対応する書込みポインタｗｐ［ｂ］と読出しポインタｒｐ［ｂ］を０に設定する（ステップＳ１４１２）。
【０１０６】
次に、ＣＰＵ２０５は、後述する波形転送管理処理に対して、新規転送要求イベントを発行する（ステップＳ１４１３）。
【０１０７】
その後、ＣＰＵ２０５は、現在のバッファ番号ｂで示されるバッファのアドレス情報（図６参照）である波形バッファスタートアドレスｂｓａ［ｂ］、波形バッファループアドレスｂｌａ［ｂ］、波形バッファエンドアドレスｂｅａ［ｂ］、スタートアドレスｓａ［ｂ］、ループアドレスｌａ［ｂ］、エンドアドレスｅａ［ｂ］を更新する（ステップＳ１４１４）。
【０１０８】
更に、ＣＰＵ２０５は、現在のバッファ番号ｂで示される波形バッファの波形読出しマージン（図６参照）を更新する（ステップＳ１４１５）。
【０１０９】
そして、ＣＰＵ２０５は、現在のバッファ番号ｂで示されるバッファステータス（図６参照）を発音中に変更する（ステップＳ１４１６）。その後、ＣＰＵ２０５は、図１４（ｂ）のフローチャートで例示される図１１のステップＳ１１０８の連続バッファを使用したバッファアサイン処理を修了する。
【０１１０】
図１４（ｃ）は、図１４（ｂ）のステップＳ１４１１のＲＡＭ波形バッファ結合処理の詳細例を示すフローチャートである。
【０１１１】
まずＣＰＵ１０１は、直前のバッファ番号に対するバッファステータスをＮＵＬＬに変更する（ステップＳ１４２０）。
【０１１２】
そして、ＣＰＵ１０１は、直前のバッファ番号と現在のバッファ番号に対して、直前のバッファ番号が最後尾になるよう、ＲＡＭ波形バッファのリンク情報を更新する（ステップＳ１４２１）。その後、ＣＰＵ１０１は、図１４（ｃ）のフローチャートで示される図１４（ｂ）のステップＳ１４１１のＲＡＭ波形バッファ結合処理を修了する。
【０１１３】
図１４（ｄ）は、図１１のステップＳ１１１０の非ループ区間を使用したバッファアサイン処理の詳細例を示すフローチャートである。
【０１１４】
まずＣＰＵ１０１は、ＣＰＵ１０１のワークメモリから非ループ区間サイズが波形サイズより大きいバッファ番号を取得する（ステップＳ１４３０）。
【０１１５】
次に、ＣＰＵ２０５は、現在のバッファ番号のバッファサイズをループ区間サイズと同じサイズに設定する（ステップＳ１４３１）。
【０１１６】
次に、ＣＰＵ１０１は、ＲＡＭ波形バッファのリンク情報からバッファステータスがＮＵＬＬであるバッファのバッファ番号を取得し、バッファサイズを非ループ区間サイズに設定し、バッファステータスを発音中に設定する（ステップＳ１４３２）。
【０１１７】
次に、ＲＡＭ波形バッファのリンク情報に対して、バッファステータスを発音中としたバッファが現在のバッファに直前になるよう更新を行う（ステップＳ１４３３）。
【０１１８】
その後、ＣＰＵ１０１は、現在のバッファ番号ｂに対応する書込みポインタｗｐ［ｂ］と読出しポインタｒｐ［ｂ］を０に設定する（ステップＳ１４３４）。
【０１１９】
次に、ＣＰＵ２０５は、後述する波形転送管理処理に対して、新規転送要求イベントを発行する（ステップＳ１４３５）。
【０１２０】
その後、ＣＰＵ２０５は、現在のバッファ番号ｂで示されるバッファのアドレス情報（図６参照）である波形バッファスタートアドレスｂｓａ［ｂ］、波形バッファループアドレスｂｌａ［ｂ］、波形バッファエンドアドレスｂｅａ［ｂ］、スタートアドレスｓａ［ｂ］、ループアドレスｌａ［ｂ］、エンドアドレスｅａ［ｂ］を更新する（ステップＳ１４３６）。
【０１２１】
更に、ＣＰＵ２０５は、現在のバッファ番号ｂで示される波形バッファの波形読出しマージン（図６参照）を更新する（ステップＳ１４３７）。その後、ＣＰＵ１０１は、図１４（ｄ）のフローチャートで示される図１１のステップＳ１１１０の非ループ区間を使用したバッファアサイン処理を修了する。
【０１２２】
図１５及び図１６は、波形転送管理処理を示すフローチャートである。ＣＰＵ２０５は、図１５のステップＳ１５０１、Ｓ１５０２、及びＳ１５０３でそれぞれ、波形転送管理処理に対して発行されたイベントが、新規転送要求、転送要求、転送終了、又は転送停止の何れであるかを判定し、それぞれのイベントに対応した処理を実行する。
【０１２３】
新規転送要求イベントが発行された場合（図１３のステップＳ１３０５、図１４（ｂ）のステップＳ１４１３、図１４（ｄ）のステップＳ１４３５参照）、図１５のステップＳ１５０１の判定がＹＥＳとなって、図１６のステップＳ１５１６の処理が実行される。ステップＳ１５１６で、ＣＰＵ２０５は、転送状態フラグを確認する。
【０１２４】
ステップＳ１５１６で転送状態フラグが転送終了待ちであると判定した場合は、別のバッファに対して音色波形領域から波形バッファへの波形転送を行っている最中であるので、ＣＰＵ２０５は、別のバッファの転送終了イベントからの転送要求イベントで処理されるように、転送要求バッファの先頭に該当バッファを設定する（図１６のステップＳ１５２５）。その後、ＣＰＵ２０５は、図１５及び図１６のフローチャートで示される波形転送管理処理を終了する。
【０１２５】
ステップＳ１５１６で転送状態フラグが待機状態であると判定した場合は、ＣＰＵ２０５はまず、該当バッファ番号に対して、転送１回あたりの読出しサイズ（ここでは２ページ）を指定し、後述する波形読出し、波形バッファ転送処理（図１７（ａ））に、転送要求を発行する（図１６のステップＳ１５１７）。
【０１２６】
次に、ＣＰＵ２０５は、転送状態フラグを転送終了待ちに設定し（図１６のステップＳ１５１８）、該当バッファを転送要求バッファの最後尾に設定する（図１６のステップＳ１５１９）。
【０１２７】
次に、ＣＰＵ２０５は、転送データポインタｔｐ［ｖ］を更新し（図１６のステップＳ１５２０）、転送要求バッファカウンタをインクリメントする（図１６のステップＳ１５２１）。
【０１２８】
次に、ＣＰＵ２０５は、バッファステータスを判定する（図１６のステップＳ１５２２）。バッファステータスが発信中と判定した場合は、波形バッファ内に波形の全てが転送可能であるので、全データが転送完了したかを判定する（図１６のステップＳ１５２３）。この判定は、転送データポインタがエンドアドレスに到達したかどうかで判断できる。
【０１２９】
全データの転送が完了している場合は、これ以上の転送は必要ないので、波形転送管理処理に対して、転送停止イベントを発行する（図１６のステップＳ１５２４）。その後、ＣＰＵ２０５は、図１５及び図１６のフローチャートで示される波形転送管理処理を終了する。
【０１３０】
ステップＳ１５２２で、バッファステータスが発信中以外と判定した場合、或いは、ステップＳ１５２３で全データの転送が完了していないと判定した馬合には、ＣＰＵ２０５は、図１５及び図１６のフローチャートで示される波形転送管理処理を終了する。
【０１３１】
後述する波形読出し、波形バッファ転送処理で指定サイズ分の波形データの転送が終了し波形転送管理処理に対して転送終了の要求イベントが発行された場合（図１７（ａ）のステップＳ１７０７）、図１５のステップＳ１５０１及びＳ１５０２の判定がＮＯ、ステップＳ１５０３の判定がＹＥＳとなって、図１５のステップＳ１５０６の処理が実行される。ステップＳ１５０６で、ＣＰＵ２０５は、転送要求バッファに転送待ちのバッファがあるか否か、即ち、転送要求バッファカウンタが０でないか０であるかを判定する。
【０１３２】
ステップＳ１５０６の判定がＮＯならば、音色波形領域から波形バッファへの全ての転送が終了した状態なので、ＣＰＵ２０５はそのまま何もせずに、図１５及び図１６のフローチャートで例示される現在の波形転送管理処理を終了する。
【０１３３】
ステップＳ１５０６の判定がＹＥＳならば、ＣＰＵ２０５は、次のバッファが処理されるよう波形転送管理処理に対して、転送要求イベントを発行し（ステップＳ１５０７）、図１５及び図１６のフローチャートで例示される現在の波形転送管理処理を終了する。
【０１３４】
上述した図１５のステップＳ１５０７の処理により、波形転送管理処理に対して転送要求イベントが発行されると、図１５のステップＳ１５０１の判定がＮＯ、ステップＳ１５０２の判定がＹＥＳとなって、図１５のステップＳ１５０８の処理が実行される。ステップＳ１５０８で、ＣＰＵ２０５は、転送要求バッファの先頭のバッファについて転送処理を実行する。書込みポインタｗｐ［ｖ］と読出しポインタｒｐ［ｖ］を確認し、波形バッファｖへの転送を行うことによって、書込みポインタｗｐ［ｖ］が読出しポインタｒｐ［ｖ］を追い越してしまう場合は、そのバッファｖについては、転送要求バッファの最後尾に設定し、先頭から２番目のバッファに対して処理を行う。
【０１３５】
次に、ＣＰＵ２０５は、該当バッファ番号に対して、転送１回あたりの読出しサイズ（こでは２ページ）を指定し、後述する波形読出し、波形バッファ転送処理（図１７（ａ））に、転送要求を発行する（図１５のステップＳ１５０９）。
【０１３６】
次に、ＣＰＵ２０５は、転送状態フラグを転送終了待ちに設定し（図１５のステップＳ１５１０）、該当バッファを転送要求バッファの最後尾に設定する（図１５のステップＳ１５１１）。
【０１３７】
次に、ＣＰＵ２０５は、転送データポインタｔｐ［ｖ］を更新する（図１５のステップＳ１５１２）。
【０１３８】
次に、ＣＰＵ２０５は、バッファステータスを判定する（図１５のステップＳ１５１３）。バッファステータスが発信中と判定した場合は、波形バッファ内に波形の全データが転送完了したかを判定する（図１５のステップＳ１５１４）。この判定は、転送データポインタがエンドアドレスに到達したかどうかで判断できる。
【０１３９】
全データの転送が完了している場合は、これ以上の転送は必要ないので、波形転送管理処理に対して、転送停止イベントを発行する（図１５のステップＳ１５１５）。その後、ＣＰＵ２０５は、図１５及び図１６のフローチャートで示される波形転送管理処理を終了する。
【０１４０】
ステップＳ１５１３で、バッファステータスが発信中以外と判定した場合、或いは、ステップＳ１５１４で全データの転送が完了していないと判定した場合には、ＣＰＵ２０５は、図１５及び図１６のフローチャートで示される波形転送管理処理を終了する。
【０１４１】
図１６のステップＳ１５２４、図１５のステップＳ１５１５、又は後述する音源イベント処理（図１７（ｂ）のステップＳ１７１３）において波形転送管理処理に対して転送停止イベントが発行された場合、図１５のステップＳ１５０１、Ｓ１５０２、及びＳ１５０３の判定が何れもＮＯとなって、ステップＳ１５０４が実行される。この場合、ＣＰＵ２０５は、転送要求バッファから該当バッファを削除し（ステップＳ１５０４）、転送要求バッファカウンタをデクリメントする（ステップＳ１５０５）。その後、ＣＰＵ２０５は、図１５及び図１６のフローチャートで示される波形転送管理処理を終了する。
【０１４２】
図１７（ａ）は、波形読出し、波形バッファ転送処理を示すフローチャートである。このフローチャートの処理は、図１６のステップＳ１５１７又は図１５のステップＳ１５０９からの転送要求イベントにより起動される。
【０１４３】
ＣＰＵ２０５は、ステップＳ１７０１とＳ１７０５のループ制御処理により、以下のステップＳ１７０２からＳ１７０４の一連の処理を、波形転送管理処理（図１６のステップＳ１５１７又は図１５のステップＳ１５０９）で指定された指定サイズ分繰り返し実行する。
【０１４４】
まず、ステップＳ１７０２で、ＣＰＵ２０５は、転送データポインタｔｐ［ｖ］に基づいて、大容量フラッシュメモリ２０８の音色波形領域ｗからページ単位で波形データを読み込む。
【０１４５】
次に、ステップＳ１７０３で、ＣＰＵ２０５は、波形バッファループアドレス及び波形バッファエンドアドレスを考慮し、ループ読出しの場合は、不要な部分は読み捨てる。
【０１４６】
そして、ステップＳ１７０４で、ＣＰＵ２０５は、波形バッファｖの書込みポインタｗｐ［ｖ］に応じたアドレスに、ステップＳ１７０２及びＳ１７０３で音色波形領域ｗから読み出した波形データの書込みを行う。ＣＰＵ２０５は、書き込んだサイズ分、書込みポインタｗｐ［ｖ］を更新する。
【０１４７】
次に、ＣＰＵ２０５は、転送状態フラグに待機状態を設定し（ステップＳ１７０６）、前述した波形転送管理処理に対して、転送終了イベントを発行する（ステップＳ１７０７）。その後、ＣＰＵ２０５は、図１７のフローチャートで示される波形読出し、波形バッファ転送処理を終了する。
【０１４８】
図１７（ｂ）は、図９のステップＳ９１０の音源イベント処理の詳細例を示すフローチャートである。ＣＰＵ２０５は、図９のステップＳ９０９の離鍵処理によってリリース状態に移行したバッファが、リリースレベルに到達した場合（ステップＳ１７１０の判定がＹＥＳの場合）、もしくは、ダンプ処理によってバッファがダンプレベルに到達した場合（ステップＳ１７１１の判定がＹＥＳの場合）は、当該バッファに対して、波形読出しの停止（発音終了）を行った後（ステップＳ１７１２）、前述した波形転送管理処理に対して転送停止イベントを発行する（ステップＳ１７１３）。その後、ＣＰＵ２０５は、図１７（ｂ）のフローチャートで例示される図９のステップＳ９１０の音源イベント処理を終了する。
【０１４９】
以上説明したようにして、本発明の一実施形態では、音源ＬＳＩ２０６がが読み出す波形データが格納される高速小容量のＲＡＭ２０４と、機器全ての音色波形データを保持するＮＡＮＤフラッシュなどの低速大容量フラッシュメモリ２０８とを有し、演奏時に大容量フラッシュメモリ２０８内の音色波形領域からＲＡＭ２０４内の波形バッファに転送を開始し、所定容量転送後に音源が読み出しを開始する逐次転送型楽音発生装置において、音源ＬＳＩ２０６による読出しがループ区間に入った場合は先頭部からループ区間までの波形領域を開放することで、バッファ領域を節約することが可能となる。音源ＬＳＩ２０６による読出しがループ区間に入った場合に非ループ区間が開放できて、発音中でも不要になった領域を増やすことができるようになる。この結果、発音時には、可能な限り読み出し波形を全てバッファに転送して読出しを行うので、ループ部再生によって生ずる転送の繰り返しを回避することができ、全体的な転送トラフィックの平均値を下げることができ、同時発音数を改善することができる楽音発生装置、又はそのような楽音発生装置を用いた電子楽器を実現できる。あるいは同時発音数を改善するためのハードウェアのコストを削減できる楽音発生装置、又はそのような楽音発生装置を用いた電子楽器を実現することが可能となる。
【０１５０】
本発明の他の実施形態について説明する。図１、図２、図３、図５、図６については、他の実施形態の場合も同様である。図１８は、他の実施形態における波形バッファのデータ移動動作例の説明図である。上述の実施形態では、音源ＬＳＩ２０６によりＲＡＭ２０４内の非ループ区間の波形データが読み込まれた後に、その非ループ区間の波形データが転送可能領域とされてＲＡＭ２０４内における転送可能領域を増加させる処理が実行されることにより、他の発音ボイスチャンネルで大容量フラッシュメモリ２０８から転送される波形データのための領域が確保できた。これに対して、他の実施形態では、音源ＬＳＩ２０６による読出しがループ区間に入った場合は、図１８の１８０１又は１８０２に示されるように、ループ区間の波形データをＲＡＭ２０４上の別の領域に複製して音源ＬＳＩ２０６による読出しを複製先の領域移動させて、音源動作中にガベージコレクションを実現することで、例えば図１８の転送可能領域Ａ→Ｂ→Ｃというように、転送可能領域のサイズ増やすことを可能にし、これにより新たな波形データを読み込める可能性を向上させるものである。
【０１５１】
この処理は、音源ＬＳＩ２０６による波形読出しアドレスを定期的に監視し、新たにループに入った読出し波形又は発音が完了して転送可能となった領域を見つけ出すたびに、処理が可能か否かを判断して実行される。
【０１５２】
なお、図１８の例では、読出しループに突入した波形がＲＡＭ２０４内でコピー可能な最も先頭に近い転送可能領域に集められるが、最後尾に集められることでも同様の効果が得られる。
【０１５３】
図１９は、他の実施形態における波形読出しループの移動動作例の説明図である。この図は、波形読出しループの移動動作時の波形読出しアドレスの変化を詳しく説明したものである。発音開始直後の状態１からループ区間を移動した状態５まで、順を追って説明する。
【０１５４】
まず、図１９（ａ）の状態１では、波形が所定の空き領域に配置され、発音が開始されて、読出しが実行されているが、太い白矢印で示される読出し処理は未だループ区間には入っていない。また、波形データも、大容量フラッシュメモリ２０８からＲＡＭ２０４に転送中である。
【０１５５】
次に、図１９（ｂ）の状態２では、太い白矢印で示される読出し処理がループ区間に入ったので、それと同じサイズの空き領域が確保される。これが図１９（ｂ）で「コピー領域」と記載された領域である。このとき空き領域は分割され、コピー領域のステータスは「転送中」とされる。この時点では未だ、ループ区間の波形も大容量フラッシュメモリ２０８からＲＡＭ２０４に転送中である。
【０１５６】
次に、図１９（ｃ）の状態３の時点では、音源ＬＳＩ２０６による波形読出し処理は継続されているが、大容量フラッシュメモリ２０８からＲＡＭ２０４のループ区間への波形データの転送が終わり、１９０１として示されるように、ＲＡＭ２０４の先頭の蒸気コピー領域にループ区間の波形データが転送（複写）される。この間、音源ＬＳＩ２０６による読出し処理は、コピー元の領域に対して実行されている。
【０１５７】
更に、図１９（ｄ）の状態４は、ループ区間の波形データが全て転送完了した状態であるが、音源ＬＳＩ２０６による読出し処理はコピー元の領域に他愛してそのまま継続されている。ただし、波形バッファループアドレスは既にコピー領域の新ループ区間の先頭に変更されているので、図１９（ｄ）から図１９（ｅ）に示されるように、読出し処理が次に元のループ区間の波形バッファエンドアドレスに達した時に、元のループ区間から新ループ区間にジャンプする。
【０１５８】
最後に、図１９（ｅ）の状態５では、音源ＬＳＩ２０６は新ループ区間に移動して読出しを開始したので、元の波形バッファの領域は不要になり前後の空き領域と結合される。このとき、バッファディレクトリ数が減少するので、これ以降のバッファディレクトリ情報は先頭に向けてシフト移動する。余った後方のバッファ情報のステータスはＮＵＬＬに置き換えられる。
【０１５９】
以上のようにして、他の実施形態では、高速なＲＡＭ２０４の利点を活かし、ＲＡＭ２０４上のループ波形データを高速に(一般にはＮＡＮＤ型の大容量フラッシュメモリ２０８の１０倍程度の速度で)移動できることに着目し、発音中でもダイナミックにガーベージコレクションを実現できるため、領域の節約になり、結果として、発音時には、ＣＰＵ１０１が可能な限り大容量フラッシュメモリ２０８から音色波形領域の波形データをＲＡＭ２０４上の空いている波形バッファに全て転送して、音源ＬＳＩ２０６がその波形データを読み出すため、ループ区間の再生によって生ずる転送の繰り返しを回避することが可能となる。
【０１６０】
その他、本発明は上述した実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。また、上述した実施形態で実行される機能は可能な限り適宜組み合わせて実施しても良い。上述した実施形態には種々の段階が含まれており、開示される複数の構成要件による適宜の組み合せにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、効果が得られるのであれば、この構成要件が削除された構成が発明として抽出され得る。
【０１６１】
以上の実施形態に関して、更に以下の付記を開示する。
（付記１）
第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、
第１記憶手段内から、前記第１波形データに続く第２波形データを前記第２記憶手段に転送する第２転送処理と、
を実行する第１プロセッサと、
前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データを読み込む読込処理、
を実行する第２プロセッサと、
を有し、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかが、
前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第１波形データが読み込まれた後に、前記第２記憶手段内の前記第１波形データを転送可能とすることにより、前記第２記憶手段内における転送可能領域を増加させる領域確保処理を実行する、
ことを特徴とする楽音発生装置。
（付記２）
前記第１転送処理及び前記第２転送処理は、前記第１波形データ及び前記第２波形データを一括して転送する場合を含む、ことを特徴とする付記１に記載の楽音発生装置。
（付記３）
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きなサイズを有する第１の転送可能領域を前記第１記憶手段内で探索する第１探索処理を実行し、
前記第１プロセッサにより前記第１転送処理及び前記第２転送処理が実行されることにより、前記第１探索処理により探索された前記第１の転送可能領域に、前記第１波形データと前記第２波形データが連続して記憶されている、ことを特徴とする付記１又は２に記載の楽音発生装置。
（付記４）
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第１の転送可能領域が見つからない場合に、前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きな合計サイズを有する２つ以上の連続する転送可能領域を前記第１記憶手段内で探索する第２探索処理を実行し、
前記第１プロセッサにより前記第１転送処理及び前記第２転送処理が実行されることにより、前記第１探索処理により探索された前記第２の転送可能領域に、前記第１波形データと前記第２波形データが連続して記憶されている、ことを特徴とする付記３に記載の楽音発生装置。
（付記５）
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第２の転送可能領域が見つからない場合であって、前記領域確保処理により増加された前記転送可能領域のサイズが前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きいサイズとなる第３の転送可能領域を前記第２記憶手段内で探索する第３探索処理を実行し、前記第１プロセッサにより前記第１転送処理及び前記第２転送処理が実行されることにより、前記第３探索処理により探索された前記第３の転送可能領域に前記第１波形データと前記第２波形データが連続して記憶されている、ことを特徴とする付記４に記載の楽音発生装置。
（付記６）
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサは、前記第３の転送可能領域のサイズが前記第１波形データと前記第２波形データを合わせた波形のサイズよりも大きくはない場合に、リングバッファとして使用可能な第４の転送可能領域を前記第１記憶手段内で探索する第４探索処理を実行し、
前記第１プロセッサは、前記第４探索処理により探索された前記第４の転送可能領域に前記第１波形データと前記第２波形データを順次転送する、ことを特徴とする付記５に記載の楽音発生装置。
（付記７）
前記第２プロセッサは、前記読込処理において、前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データの読込みに続けて、前記第２記憶手段に転送された前記第２波形データを読み込む処理を更に実行し、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサが、
前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第２波形データの読込みを開始した場合に、前記第２記憶手段上の前記第２波形データを前記第２記憶手段上の別の領域に複製して、前記第２プロセッサによる前記第２波形データの読込みを複製元の領域から複製先の領域に移動させることにより、
連続する転送可能領域を増加させる、
ことを特徴とする付記１乃至６の何れかに記載の楽音発生装置。
（付記８）
第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、
第１記憶手段内から、前記第１波形データに続く第２波形データを前記第２記憶手段に転送する第２転送処理と、
を第１プロセッサで実行させ、
前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データを読み込む読込処理、
を第２プロセッサで実行させ、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサに、前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第１波形データが読み込まれた後に、前記第２記憶手段内の前記第１波形データを転送可能とすることにより、前記第２記憶手段内における転送可能領域を増加させる領域確保処理を実行させる、
ことを特徴とする楽音発生方法。
（付記９）
第１記憶手段内の第１波形データを第２記憶手段に転送する第１転送処理と、
第１記憶手段内から、前記第１波形データに続く第２波形データを前記第２記憶手段に転送する第２転送処理と、
を第１プロセッサで実行させ、
前記第１転送処理により転送された前記第２記憶手段内の前記第１波形データを読み込む読込処理、
を第２プロセッサで実行させ、
少なくとも前記第１プロセッサ及び前記第２プロセッサのうちのいずれかのプロセッサに、前記第２プロセッサによる前記読込処理により、前記第２記憶手段内の前記第１波形データが読み込まれた後に、前記第２記憶手段内の前記第１波形データを転送可能とすることにより、前記第２記憶手段内における転送可能領域を増加させる領域確保処理を実行させる、
ためのプログラム。
（付記１０）
付記１乃至７の何れかに記載の楽音発生装置と、
前記第１波形データ及び前記第２波形データに基づいて発音する発音部と、
を備える電子楽器。
【符号の説明】
【０１６２】
１００  電子鍵盤楽器
１０１  鍵盤
１０２  音色選択ボタン
１０３  機能選択ボタン
１０４  ベンダ／モジュレーション・ホイール
１０５  ＬＣＤ
２０１  バスコントローラ
２０２  バス
２０３  メモリコントローラ
２０４  ＲＡＭ
２０５  ＣＰＵ
２０６  音源ＬＳＩ
２０７  フラッシュメモリコントローラ
２０８  大容量フラッシュメモリ
２０９  ＤＭＡコントローラ
２１０  Ｉ／Ｏコントローラ
２１１  キー・スキャナ
２１２  ＬＣＤコントローラ
２１３  Ａ／Ｄコンバータ
２１４  Ｄ／Ａコンバータ
２１５  アンプ
３０１  波形発生器
３０２  バスインタフェース
３０３  ＤＳＰ
３０４  ミキサ
３０５  波形読出し装置
【図１】
2019028199.tif 000003
【図２】
2019028199.tif 000004
【図３】
2019028199.tif 000005
【図４】
2019028199.tif 000006
【図５】
2019028199.tif 000007
【図６】
2019028199.tif 000008
【図７】
2019028199.tif 000009
【図８】
2019028199.tif 000010
【図９】
2019028199.tif 000011
【図１０】
2019028199.tif 000012
【図１１】
2019028199.tif 000013
【図１２】
2019028199.tif 000014
【図１３】
2019028199.tif 000015
【図１４】
2019028199.tif 000016
【図１５】
2019028199.tif 000017
【図１６】
2019028199.tif 000018
【図１７】
2019028199.tif 000019
【図１８】
2019028199.tif 000020
【図１９】
2019028199.tif 000021