(57)【要約】【課題】  読み出し速度が低速の外部記憶装置から波形データを読み出しながら発音しても発音遅れが生じないようにする。【解決手段】  ＡバッファおよびＢバッファを有している第１バッファに、外部記憶装置からアタック部波形データを１クラスタずつ読み出して所定タイミングで転送することにより、アタック波形をバッファリング再生していく。アタック部波形データからループ部波形データに移行する際には、第１バッファおよび第２バッファに移行する波形データが転送されて発音される。次いで、ＣバッファおよびＤバッファを有している第２バッファに、外部記憶装置からループ部波形データを１クラスタずつ読み出して所定タイミングで転送することにより、ループ波形をバッファリング再生していく。【選択図】  図４
2008249756.tif 000002
【特許請求の範囲】
【請求項１】
読み出すべきデータを、所定単位量のデータを単位として指示可能な外部記憶装置であって、楽音波形のアタック部とされるアタック部波形データと、該アタック部波形データに続くループ部波形データとからなる波形データが複数種類記憶されている外部記憶装置から、所望の波形データを読み出しながら発音する楽音発生装置であって、
それぞれリングバッファであって、所定単位量の波形データを格納することができるバッファ領域を、それぞれ複数ずつ有している第１バッファおよび第２バッファが連続して読み出し可能に作成されている波形メモリ部と、
所定量単位の読み出し指示に応じて前記外部記憶装置から所定単位量ずつ読み出された波形データを、前記第１バッファあるいは前記第２バッファに転送する転送手段と、
前記第１バッファあるいは前記第２バッファから波形データを順次読み出して発音する音源手段とを備え、
発音開始が指示された際に、
前記転送手段は前記アタック部波形データを、前記外部記憶装置から所定単位量ずつ読み出して前記第１バッファの複数のバッファ領域にそれぞれ転送し、
前記音源手段は、前記第１バッファの複数のバッファ領域から順次波形データを読み出して発音し、
前記第１バッファの１つのバッファ領域からの波形データの読み出しが終了する毎に、前記転送手段が、続く波形データを前記外部記憶装置から所定単位量ずつ読み出して当該読み出しが終了した前記第１バッファのバッファ領域に転送し、
前記転送手段が転送する所定単位量の波形データに前記ループ部波形データの開始位置であるループスタートが含まれている場合は、
前記転送手段は、前記第１バッファの後続のバッファ領域への波形データの転送が終了した際に、続く波形データを前記第２バッファの複数のバッファ領域に転送し、
前記音源手段は、前記第１バッファの複数バッファ領域から前記ループスタートを含む波形データを読み出したとき、前記第１バッファの後続の波形データを読み出した後、引き続いて前記第２バッファのバッファ領域から波形データを読み出して発音し、
前記第２バッファの１つのバッファ領域からの波形データの読み出しが終了する毎に、前記転送手段が、続く波形データを前記外部記憶装置から所定単位量ずつ読み出して当該読み出しが終了した前記第２バッファのバッファ領域に転送し、
前記転送手段が転送する所定単位量の波形データに前記ループ部波形データの終了位置であるループエンドが含まれている場合は、
前記音源手段は、前記第２バッファの複数バッファ領域から記憶されている波形データの該ループエンドまでの読み出しが終了した際に、続いて、前記第１バッファにおける前記ループスタートの位置から波形データを読み出して発音し、以降は、前記ループスタートを含む波形データを読み出したとき以下の動作を繰り返し行うよう制御されることを特徴とする楽音発生装置。
【請求項２】
前記アタック部波形データの先頭の所定単位量の波形データを記憶するプリロード領域が前記波形メモリ部に作成されており、
発音開始が指示された際に、前記音源手段は前記波形メモリ部のプリロード領域から前記アタック部波形データを読み出して発音開始すると共に、該アタック部波形データが読み出される期間を利用して、前記転送手段は前記アタック部波形データの先頭の所定単位量の波形データに続く波形データを前記外部記憶装置から所定単位量ずつ読み出して前記第１バッファの複数のバッファ領域に転送することを特徴とする請求項１記載の楽音発生装置。
【請求項３】
前記外部記憶装置には、前記第２バッファにおける最も後のバッファ領域に前記ループ部波形データのループエンドが含まれる所定単位量の波形データが転送される長さに調整された波形データが記録されていることを特徴とする請求項１記載の楽音発生装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、読み出しが低速の外部記憶装置から波形データを読み出しながら発音する楽音発生装置に関する。
【背景技術】
【０００２】
従来、電子楽器等に用いられる楽音発生装置として、自然楽器音の立上りから終了までの楽音波形サンプルの波形データを記憶した波形メモリを用意して、この波形メモリから順次楽音波形サンプルを読み出すことにより楽音信号を発生させるようにした波形メモリ音源が知られている。この波形メモリ音源では、波形データを音色や音高（音域）毎に用意することから波形メモリの容量が大容量になる。このため、波形メモリとする記憶媒体としては半導体メモリは適しておらず、大容量とすることが容易なハードディスクが適していることになる。しかし、ハードディスクは、各タイミング毎には所定単位量のクラスタ単位での１アクセスしかできず、さらに、ハードディスクの所望のクラスタ領域を指定して読み出しを行う際には、そのクラスタが読み出しできるようになるまでに時間遅れがある。そのため、ハードディスクから波形データを読み出しながら楽音を生成する際に、押鍵したタイミングから若干遅れて発音されてしまうようになる。
【０００３】
これを解決する従来の楽音発生装置が提案されている。この従来の楽音発生装置では、ハードディスクに楽音波形の先頭波形データとそれに続く後部波形データとを記憶しておき、楽音信号形成に先立ってハードディスクから波形メモリへ先頭波形データを転送しておく。そして、楽音信号発生の指示が出されると、楽音信号発生手段は、波形メモリに記憶された先頭波形データを読み出し、これに基づいて楽音信号の先頭部の波形を生成し、その間、ハードディスクから後部波形データを所定量ずつ順次波形メモリに転送する。先頭波形データは楽音信号発生の指示時には波形メモリに準備されているので、楽音信号号発生の指示から遅れることなく楽音信号の先頭部の波形を生成することができる。そして、先頭波形データに基づく楽音信号の生成に続いて、波形メモリに転送された後部波形データを順次読み出して、楽音信号の後部の波形を生成する。
【特許文献１】特許第２６７１７４７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
上記した従来の楽音発生装置においては、ハードディスクに記憶された波形データをループ読み出しすることについて、特に何の配慮もされていなかった。この場合、ループ開始点を何れかのクラスタの先頭に設定し、ループ終了点をその後の何れかのクラスタの末尾に設定して、クラスタ単位で波形データのループ読み出しを行うことは、比較的容易に行うことができる。
しかしながら、ループ開始点ないしループ終了点をクラスタ内の途中のポイントに設定すると、クラスタ単位のアクセスに遅れのあるハードディスクからの波形データの読み込みがタイミング的に厳しくなる場合があり、ハードディスクからの波形データの読み込みが間に合わないと、発生している楽音が途切れてしまうという問題点があった。特に、ループ開始点の直前の数サンプル（圧縮している場合は、デコード用のその他データも）の波形データを読み込む必要があり、この際に生成している楽音が途切れやすくなってしまうという問題点があった。
【０００５】
そこで、本発明は読み出し速度が低速の外部記憶装置に波形データを記録して、この外部記憶装置から波形データを読み出しながらループ発音しても楽音が途切れることのない楽音発生装置を提供することを目的としている。
【課題を解決するための手段】
【０００６】
上記目的を達成するために、本発明の楽音発生装置は、それぞれ複数ずつバッファ領域を有している第１バッファおよび第２バッファと、外部記憶装置から所定単位量ずつ読み出した波形データを、第１バッファあるいは第２バッファに転送する転送手段とを備え、アタック部波形データは第１バッファの複数のバッファ領域に順次転送されて発音され、アタック部波形データからループ部波形データに移行する際には、第１バッファおよび第２バッファに移行する波形データが転送されて発音され、ループ部波形データは第２バッファの複数のバッファ領域に順次転送されて発音されることを最も主要な特徴としている。
【発明の効果】
【０００７】
本発明によれば、それぞれ複数ずつバッファ領域を有している第１バッファおよび第２バッファと、外部記憶装置から所定単位量ずつ読み出した波形データを、第１バッファあるいは第２バッファに転送する転送手段とを備え、アタック部波形データは第１バッファの複数のバッファ領域に順次転送されて発音され、アタック部波形データからループ部波形データに移行する際には、第１バッファおよび第２バッファに移行する波形データが転送されて発音され、ループ部波形データは第２バッファの複数のバッファ領域に順次転送されて発音されることから、読み出しが低速の外部記憶装置から波形データを読み出して発音するようにしても途切れることなく楽音を発音することができるようになる。
より具体的には、外部記憶装置からの波形データの読み出し再生途中に、第１バッファに読み込まれたループ開始部分の波形データを、そのまま上書きせずに残しておき、ループ開始点へのリターン時に、読み出しアドレスを第２バッファのループ終了点から第１バッファのループ開始点へジャンプさせ、第１バッファに記憶されているループ開始部分の波形データを用いて、後続の波形データを第２バッファへ転送するための時間を稼いでいる。従って、ループ終了点ないしループ開始点がクラスタの途中に設定されている場合でも、波形データのループ読み出しを破綻無く行うことができる。
【発明を実施するための最良の形態】
【０００８】
本発明の実施例である楽音発生装置の構成を示すブロック図を図１に示す。
図１に示す本発明にかかる楽音発生装置１は、種々の波形データが格納されているハードディスク（ＨＤ）１６を備え、ハードディスク１６から波形データを読み出しつつ波形データに基づく楽音を生成できるようにされている。本発明にかかる楽音発生装置１において、ＣＰＵ（Central Processing Unit）１０は楽音発生装置１の全体の動作を制御すると共に、ノートオンイベント処理や転送処理等を実行している。ＲＡＭ（Random Access Memory）１２には、ＣＰＵ１０のワークエリアや各種データ等の記憶エリアが設定されている。フラッシュメモリ１１には、ＣＰＵ１０が実行するノートオンイベント処理や転送処理等の楽音発生に関連する動作ソフトウェアが格納されている。フラッシュメモリ１１は書き換え可能とされていることから、動作ソフトウェアを書き換え可能となり動作ソフトウェアのバージョンアップを容易に行うことができる。表示器１３は液晶等の表示手段を備え、各種楽音設定画面を表示手段に表示したり楽音生成時の動作画面を表示手段に表示している。
【０００９】
操作子１４はパネルに備えられたパネル操作子であり、パネル操作子を走査することによって操作されたパネル操作子のイベントを検出してＣＰＵバス２４に出力している。タイマ１５はウォッチドックタイマ、インターバルタイマ、タイマ割り込みとして機能するタイマである。ハードディスク（ＨＤ）１６は、種々の波形データを含む各種データが所定単位量とされるクラスタ単位で分散的に記憶されている大容量の外部記憶装置である。同時に複数のクラスタへのアクセスを行うことはできず、装置の複数のクラスタ（記憶領域）のうちの所望のクラスタを指定して、そのクラスタへの書き込みないし読み出しを行うようになっている。また、一般に、クラスタの指定後、そのクラスタが読み出しないし書き込みを行えるようになるまでに、数ミリ秒から数十ミリ秒の時間遅れがある。ＨＤ  Ｉ／Ｏ１７は、楽音発生装置１にハードディスク１６を接続するためのインタフェースであり、ハードディスク１６とは所定単位量とされるクラスタ毎の波形データの書き込み／読み出しを行うことができる。転送回路１８は、転送指示を受けてハードディスク１６から読み出されたクラスタ単位の波形データを波形メモリ１９へアクセス調停部２０を介して転送している。波形メモリ１９は、種々の波形データにおけるアタック部の先頭の波形データが所定単位量（１クラスタ）だけ記憶されるプリロード領域と、それぞれ１クラスタ分の波形データを記憶可能なＡバッファ，Ｂバッファを有する第１バッファと、同様のＣバッファ，Ｄバッファを有する第２バッファの領域を有するＲＡＭからなる波形メモリである。なお、プリロード領域については、ＲＯＭ（Read Only Memory）やフラッシュメモリで構成してもよい。
【００１０】
アクセス調停部２０は、転送回路１８による波形メモリ１９へのデータ書き込みと、音源部２１による波形メモリ１９からのデータ読み出しとが時分割で並列に行われるよう、アクセスの調停を行うブロックである。音源部２１はＰＣＭ音源等からなり、音源部２１はＣＰＵバス２４を介して供給される各情報に基づいて、波形メモリ１９の第１バッファおよび第２バッファに転送された波形データを順次読み出し、読み出した波形データに基づいて楽音信号を生成している。音源部２１は、例えば４個の発音チャネルを有し、これら各発音チャネルの楽音信号発生処理を時分割多重制御により行っており、各発音チャネル毎に独立した楽音信号を生成し得るように構成されている。音源部２１は、複数時分割チャンネル動作を行い、ＣＰＵ１０から音源パラメータ情報を発音の開始指示を受けて、複数チャンネル分の複数の楽音信号を生成している。音源パラメータ情報は、割り当てチャンネル、ピッチ情報、エンベロープパラメータ等とされる。音源部２１の各チャンネルでは、それぞれ、波形メモリ１９に記録されている波形データを読み出して、読み出した波形データを音源パラメータ情報に沿って加工することにより楽音信号を生成している。音源部２１で生成された楽音信号はサウンドシステム２２から放音される。ＭＩＤＩ  Ｉ／Ｏ２３は、ＭＩＤＩ機器を楽音発生装置１に接続するインタフェースであり、ＭＩＤＩ機器から出力されたＭＩＤＩ信号を楽音発生装置１において受信することができる。そして、受信したＭＩＤＩ信号に基づいて楽音信号を生成してサウンドシステム２２から放音することができる。なお、楽音発生装置１の各部はＣＰＵバス２４により相互にデータの授受を行っている。
【００１１】
ここで、クラスタについて説明すると、ハードディスク１６はクラスタをデータの記憶単位としてデータを記憶しており、ＣＰＵ１０が１クラスタ分のデータをハードディスク１６へ書き込もうとするときは、ＣＰＵ１０がハードディスク１６の未使用のクラスタを指定して、ＨＤ  Ｉ／Ｏ１７がその指定されたクラスタにＣＰＵ１０から供給されるデータを書き込む。また、ＣＰＵ１０が１クラスタ分のデータをハードディスク１６から読み出そうとするときは、ＣＰＵ１０が読み出したいデータを記憶しているクラスタを指定して、ＨＤ  Ｉ／Ｏ１７がその指定されたクラスタからデータを読み出しＣＰＵ１０に供給する。なお、ハードディスク１６上ではクラスタは連続して書き込まれる必要は無く、それぞれハードディスク１６の任意の位置にクラスタを書き込むことができる。
【００１２】
次に、音源部２１の詳細な構成を示すブロック図を図２に示す。図２に示す音源部２１において、制御レジスタ３０には発音開始時にＣＰＵバス２４からノートオン信号、およびノートオン信号に基づく音色パラメータが発音割当された発音チャネルに書き込まれる。制御レジスタ３０ではノートオン信号におけるノートナンバ（音高）が整数部および小数部から構成される周波数ナンバＦに変換される。また、当該発音チャネルにおいて上述したハードディスク１６から読み出されて波形メモリ１９に転送される波形データはノートオン信号の音高や音色情報に基づいて選択され、制御レジスタ３０には、選択された波形データのアタック部波形データの先頭部が記憶されているプリロード領域のスタートアドレスＰＳおよびエンドアドレスＰＥ、第１バッファの領域のスタートアドレスＢＳ１およびエンドアドレスＢＥ１、第２バッファの領域のスタートアドレスＢＳ２およびエンドアドレスＢＥ２が供給される。
【００１３】
アドレスカウンタ３１は位相発生部およびアドレス生成部からなり、各時分割チャンネルタイミング毎に、制御レジスタ３０から供給される周波数ナンバＦを所定タイミングに従って繰り返し累算することにより、波形メモリ１９から波形データを読み出すためのアドレスを生成している。例えば、プリロード領域に記憶されている先頭部のアタック部波形データの読み出し時には、プリロード領域のスタートアドレスＰＳから読み出しを開始し、次いで、累算値を加算した整数部を読出アドレスとして波形メモリ１９に出力して波形データを順次読み出す。この際に、上記加算値の小数部は補間用データとして補間部３２に供給する。また、先頭部に続くアタック部波形データの読み出し時には、第１バッファのスタートアドレスＢＳ１から読み出しを開始し、次いで、累算値を加算した整数部を読出アドレスとして波形メモリ１９に出力して波形データを順次読み出すと共に、上記加算値の小数部を補間用データとして補間部３２に供給する。さらに、ループ部波形データを繰り返し読み出すときには、ループスタートＬＳから読み出しを開始し、次いで、累算値を加算した整数部を読出アドレスとして波形メモリ１９に出力して波形データを読み出すと共に、上記加算値の小数部を補間用データとして補間部３２に供給する。このような読み出しを実現するために、アドレスカウンタ３１は、生成する読出アドレスが指定されたジャンプ元アドレスに達したとき、該読出アドレスを指定されたジャンプ先アドレスへジャンプさせるアドレスジャンプ機能を有している。
【００１４】
補間部３２は、各時分割チャンネルタイミング毎に、読出アドレスにより波形メモリ１９から読み出された波形データを、アドレスカウンタ３１から出力される補間用データに基づいて補間演算を行う。この場合、波形データの隣接するサンプル値間を補間用データによって一次直線補間してもよいし、２以上のサンプル値を用いて高次の補間を行ってもよい。
制御レジスタ３０から音量制御部３３へは音色パラメータ中のエンベロープデータが供給され、音量制御部３３は、各時分割チャンネルタイミング毎に、ノートオン信号、ノートオフ信号に応答して、楽音の立上りから立下りまでの音量変化に相当するエンベロープ波形を生成し、補間部３２から出力信号に該エンベロープ波形を乗算することにより音量制御を行う。音量制御部３３からの出力信号はミキサ３４に供給され、ミキサ３４において発音中の各チャンネル信号が加算されてＤ／Ａ（デジタル／アナログ）変換器３６へ出力される。なお、制御レジスタ３０はエフェクタデータを処理部（ＤＳＰ：Digital Signal Processor）３５に出力しており、ＤＳＰ３５はエフェクタデータに基づき、ミキサ３４の出力信号にリバーブ、コーラス、ディレイ、パン等の各種音響効果を付与している。このようにして、エフェクトが付加されたミキサ３４からの出力信号はＤ／Ａ変換器３６においてアナログ信号に変換され、サウンドシステム２２に出力される。
【００１５】
次に、外部記憶装置であるハードディスク１６に記録されている波形データについて図３を参照しながら説明する。図３には、ハードディスク発音用の波形データの準備処理が示されている。この準備処理では、まず、波形データの長さを所定の長さとするための準備である「１．アタックとループとを有する波形データ準備」の処理が行われる。この処理においては、アタック（元）と示されている元とされるアタック部波形データと、ループ（元）として示されている元とされるループ部波形データからなる波形データが用意され、このループ部波形データのループサイズがＬとされる。横軸はアドレスであり、Ｐ，１，２，・・・，９，１０・・は単位所定量とされるクラスタのクラスタ番号である。ここで、このクラスタ番号は、各所定単位量のデータ（クラスタ）を読み出す順番を示す番号であり、ハードディスク１９における記憶領域（クラスタ）を特定する番号ではない点に注意されたい。図示されている波形データの場合、波形データの終了位置をクラスタ１０のエンドとするための不足分が検出される。次いで、「２．ループエンドがＬＥクラスタの最後に一致するよう調整」する処理が行われる。この処理では、ループ部波形データの先頭から不足分に相当する波形データが切り出され、ループ部波形データの後部に付加される。図示する場合では、ループエンドを含むＬＥクラスタはクラスタ１０となり、上記調整する処理によりクラスタ１０のエンドと波形データのループエンド（ＬＥ）とは一致するようになる。
【００１６】
このようにして調整した波形データは、「３．同じループサイズの新しいループを設定」する処理に示されているように、ループ（新）として示すループ部波形データのループサイズＬはループ（元）と同じループサイズＬとされ、アタック（新）として示すアタック部波形データの長さは波形データを付加した分だけ長くなる。この結果、波形データは所定数のクラスタの長さに調整されることになる。
次いで、「４．プリロード領域、および、ハードディスクのクラスタ（複数）に記憶」する処理が行われる。この場合、クラスタＰの波形データは波形メモリ１９のプリロード領域にその波形データにおけるプリロード波形データグループの一つとして記憶され、クラスタ１〜クラスタ１０の波形データはハードディスク１６に波形データグループの一つとして記憶される。図３に示す波形データの場合、ループ部波形データはクラスタ５の中途から開始され、クラスタ５がループスタート（ＬＳ）を含むＬＳクラスタ（ループスタートクラスタ：ＬＳＣ）となる。また、クラスタ１０はループエンド（ＬＥ）を含むＬＥクラスタ（ループエンドクラスタ：ＬＥＣ）となる。クラスタＬＳＣｘは、ループスタートクラスタ以降のクラスタで第２バッファに初めて転送されるクラスタであり、クラスタＬＳＣｙは、第２バッファが１クラスタ分記憶するＣバッファ、Ｄバッファから構成される場合はＬＳＣｘ＋１のクラスタとされる。これらについては後述する。
【００１７】
次に、波形メモリ１９に関連するメモリマップを図５に示す。波形メモリ１９は、前述したように種々の波形データにおけるアタック部の先頭の波形データが１クラスタずつ記憶されるプリロード領域と、それぞれ１クラスタ分の波形データを記憶可能な２つのＡバッファ，Ｂバッファを有する第１バッファと、同様の２つのＣバッファ，Ｄバッファを有する第２バッファの領域を有している。プリロード領域は、ハードディスク１６の各波形データの先頭のクラスタのデータ（プリロード波形データ）を、楽音の生成に先立って予め読み込んでおくための領域である。ハードディスク１６に記憶されている波形データは、相互に一緒に使いたい複数の波形データ、例えば、１つの鍵盤の異なる鍵域に割当てて使用する複数の波形データ、同時に鳴らして１つの音色の楽音を形成する複数の波形データ、同じ楽器音の強度別の複数の波形データ等、を１つのグループとしてグループ化されている。それに対応して、プリロード領域には、各グループ毎の先頭の波形データのプリロード領域ＡＷＧ１、ＡＷＧ２、…ＡＷＧｍ、…が用意されている。そして、各グループのプリロード領域には、そのグループに属する波形データのアタック部における先頭の１クラスタ分（プリロード波形データ）を読み込むための領域が用意され、ハードディスク１６からそれぞれ１クラスタ分のプリロード波形データが読み込まれる。例えば、２番目のグループはｋ個の波形データからなるグループであり、対応するＡＷＧ２の領域には、ＡＷ２−１、ＡＷ２−２、…ＡＷ２−ｋのｋ個の領域が用意される。また、この楽音発生装置１では、時分割動作により複数のチャンネルで、ハードディスク１６から複数の波形データを並行して読み出し、複数の楽音波形を同時に生成するようになっている。そのため波形メモリ１９には、複数のチャンネルに対応する複数のチャンネルバッファＣＢＧ１、ＣＢＧ２、ＣＢＧ３、ＣＢＧ４、…の領域が用意されている。各チャンネルバッファには、第１バッファと第２バッファとの領域が設定されており、例えば、チャンネルバッファＣＢＧ２には、第１バッファＰＢ１−２と第２バッファＰＢ２−２の領域が設定されており、第１バッファＰＢ１−２は１クラスタ分の波形データを記憶可能な２つのＡ２バッファ，Ｂ２バッファを有しており、第２バッファＰＢ２−２も１クラスタ分の波形データを記憶可能な２つのＣ２バッファ，Ｄ２バッファを有している。この４つのバッファを用いて、波形データグループの波形データを発音が途切れないように読み出している。
【００１８】
ここで、ノートオンされた際にハードディスク１６中の１つの波形データ２−２を選択し、選択された波形データ２−２の１クラスタ分の先頭のプリロード波形データＡＷ２−２と、プリロード波形データＡＷ２−２に続いて波形データ２−２の後続のクラスタの波形データをチャンネルｉのチャンネルバッファＣＢＧｉを用いて読み出す場合を図６を参照しながら説明する。ノートオンされると、制御レジスタ３０にノートナンバ、ノートオン信号、音色パラメータが与えられると共に、プリロード領域のアタック部波形データＡＷ２−２のスタートアドレスＰＳおよびエンドアドレスＰＥ、第１バッファＰＢ１−ｉのＡｉバッファのスタートアドレスＢＳ１およびＢｉバッファのエンドアドレスＢＥ１、第２バッファＰＢ２−ｉのＣｉバッファのスタートアドレスＢＳ２およびＤｉバッファのエンドアドレスＢＥ２が供給される。アドレスカウンタ３１はスタートアドレスＰＳを波形メモリ１９に出力してアタック部波形データＡＷ２−２の先頭から波形データを読み出し、以降はノートナンバと波形データ２−２とに応じて決定された周波数ナンバＦに応じた読み出し速度でアタック部波形データＡＷ２−２が順次読み出されていく。このとき、第１バッファＰＢ１−ｉのＡｉバッファにはハードディスク１６の波形データ２−２のクラスタ１を記憶するクラスタ（記憶領域）から読み出されたクラスタ１の波形データが転送され、次のクラスタ２の波形データが第１バッファＰＢ１−ｉのＢｉバッファに転送される。
【００１９】
そして、アタック部波形データＡＷ２−２のエンドアドレスＰＥまでの波形データが読み出されると、アドレスカウンタ３１は第１バッファＰＢ１−ｉのスタートアドレスＢＳ１を波形メモリ１９に出力してＡｉバッファの先頭から波形データ２−２のクラスタ１の波形データを読み出し、以降は周波数ナンバＦに応じた読み出し速度でＡｉバッファから波形データを順次読み出していく。そして、Ａｉバッファの波形データが全て読み出されると、Ｂｉバッファの先頭から続くクラスタ２の波形データが順次読み出されるようになる。このとき、Ａｉバッファには波形データ２−２の続く１クラスタ分の波形データをハードディスク１６から読み出して転送する。そこで、Ｂｉバッファの波形データが全て読み出されると、再びＡｉバッファの先頭から続く波形データが順次読み出されるようになる。このとき、Ｂｉバッファには波形データ２−２の続く１クラスタ分の波形データをハードディスク１６から読み出して転送する。このように、アタック部波形データがハードディスク１６から読み出されて第１バッファＰＢ１−ｉに転送されつつ、第１バッファＰＢ１−ｉからアタック部波形データを読み出す動作が繰り返される。この繰り返し読み出す動作を第１バッファＰＢ１−ｉによるバッファリング再生という。そして、波形データ２−２におけるＬＳクラスタがハードディスク１６から読み出されて第１バッファＰＢ１−ｉに転送されると、Ｂｉバッファに転送されたクラスタに続く１クラスタ分の波形データがハードディスク１６から読み出されて第２バッファＰＢ２−ｉのＣｉバッファに転送され、さらに次の１クラスタ分の波形データが第２バッファＰＢ２−ｉのＤｉバッファに転送される。
【００２０】
そして、第１バッファＰＢ１−ｉのＢｉバッファの波形データが全て読み出されると、第２バッファＰＢ２−ｉのＣｉバッファの先頭から続く波形データが順次読み出されるようになる。次いで、第２バッファＰＢ２−ｉのＣｉバッファの波形データが全て読み出されると、第２バッファＰＢ２−ｉのＤｉバッファの先頭から続く波形データが順次読み出されるようになる。このとき、続く１クラスタ分の波形データをハードディスク１６から読み出してＣｉバッファに転送する。さらに、第２バッファＰＢ２−ｉのＤｉバッファの波形データが全て読み出されると、第２バッファＰＢ２−ｉのＣｉバッファの先頭から続く波形データが順次読み出されるようになる。このとき、続く１クラスタ分の波形データをハードディスク１６から読み出してＤｉバッファに転送する。このように、ループ部波形データがハードディスク１６から読み出されて第２バッファＰＢ２−ｉに転送されつつ、第２バッファＰＢ２−ｉからループ部波形データを読み出す動作が繰り返される。この繰り返し読み出される動作を第２バッファＰＢ２−ｉのバッファリング再生という。そして、波形データ２−２におけるＬＥクラスタがハードディスク１６から読み出されて第２バッファＰＢ２−ｉのＤｉバッファに転送されると、このＤｉバッファの波形データが全て読み出された際に、第１バッファＰＢ１−ｉのＡｉバッファにおけるループスタートＬＳの位置からループ部波形データが読み出されるようになる。以後、同様の動作が繰り返されることにより発音停止が指示されるまでループ波形データが繰り返し読み出される。なお、ＬＥクラスタが読み込まれるバッファは、第２バッファＰＢ２−ｉのＣｉバッファであってもよく、また、ＬＳクラスタが読み込まれるバッファは、第１バッファＰＢ１−ｉのＢｉバッファであってもよい。
【００２１】
次に、本発明にかかる楽音発生装置１におけるノートオンされた際の波形データの転送制御や読み出し等の所定の１チャンネルにおけるタイミングを示す図を図４に示す。以下の説明においては、所定のチャンネルのチャンネルバッファＣＢＧは第１バッファＰＢ１および第２バッファＰＢ２の領域を備え、第１バッファＰＢ１はそれぞれ１クラスタ分の波形データを記憶可能なＡバッファとＢバッファとを有し、第２バッファＰＢ２はそれぞれ１クラスタ分の波形データを記憶可能なＣバッファとＤバッファとを有している。
図４の横軸は時間であり、最上段に示す「転送」では、指定されている音色やノートオンの音高などに基づいて選択された波形データの一連のクラスタのデータが、順次、ハードディスク１６から読み出されて第１バッファＰＢ１のＡバッファ，Ｂバッファあるいは第２バッファＰＢ２のＣバッファ，Ｄバッファに転送されることが示されている。付記されている１，２，・・・の番号はクラスタ番号である。その下の段の「ＩＰ割込」は、波形データをハードディスク１６から波形メモリ１９へ転送する転送要求の発生タイミングを示している。その下の４段は、縦軸が波形メモリ１９のアドレスであり、波形メモリ１９に領域が設定されている第１バッファＰＢ１および第２バッファＰＢ２から波形データを読み出す読出アドレスの進行が示されている。その下の段は、やはり縦軸が波形メモリ１９のアドレスであり、波形メモリ１９におけるプリロード領域からプリロード波形データを読み出す読出アドレスの進行が示されている。さらにその下の段には、それらの読出アドレスにより、プリロード領域および第１バッファＰＢ１、第２バッファＰＢ２から読み出された波形データに基づいて生成された再生波形がクラスタ番号に対応して示されている。
【００２２】
図４において、時刻ｔ０でノートオンが検出されると、制御レジスタ３０にノートナンバ、ノートオン信号、音色パラメータが与えられると共に、波形メモリ１９のプリロード領域における指示された音色のアタック部波形データの先頭とされるクラスタＰ（プリロード波形データ）の記憶領域のスタートアドレスＰＳおよびエンドアドレスＰＥ、第１バッファＰＢ１のＡバッファのスタートアドレスＢＳ１およびＢバッファのエンドアドレスＢＥ１が設定される。ここで、エンドアドレスＰＥ及びエンドアドレスＢＥ１はジャンプ元として設定されており、また、スタートアドレスＢＳ１はジャンプ先として設定されている。アドレスカウンタ３１はノートオンにより供給されたスタートアドレスＰＳを直ちに波形メモリ１９に出力してクラスタＰの先頭から波形データを読み出し、以降はノートナンバを変換した周波数ナンバＦに応じた読み出し速度でクラスタＰのアタック部波形データを順次読み出していく。読み出された波形データは音源部２１に供給されてクラスタＰの波形データに基づく再生波形が出力される。このように、ノートオンの直後には波形メモリ１９にプリロードされているクラスタＰの波形データを読み出して発音することから、ノートオンから遅れることなく再生波形が生成されていくようになる。また、このノートオンにより、第１バッファＰＢ１のＡバッファには、選択された波形データの一連のクラスタにおけるクラスタ１の波形データがハードディスク１６から読み出されて転送され、次のクラスタ２の波形データが第１バッファＰＢ１のＢバッファにハードディスク１６から読み出されて転送される。このように、クラスタＰの波形データを読み出して発音している間に、第１バッファＰＢ１のＡバッファ，Ｂバッファにそれぞれ１クラスタ分の波形データを転送しておくようにしている。
【００２３】
そして、時刻ｔ１となってクラスタＰのエンドアドレスＰＥ（ジャンプ元）までの波形データが読み出されると、アドレスカウンタ３１は第１バッファＰＢ１のスタートアドレスＢＳ１（ジャンプ先）を波形メモリ１９に出力してＡバッファの先頭からクラスタ１の波形データ１Ａを読み出し、以降は周波数ナンバＦに応じた読み出し速度で波形データ１Ａを順次読み出していく。これにより、音源部２１は時刻ｔ１からクラスタ１の波形データに基づく再生波形を生成していくようになる。このように、波形メモリ１９にプリロードされているクラスタＰの全ての波形データが読み出された際には、既に第１バッファＰＢ１のＡバッファ，Ｂバッファに続く１クラスタ分の波形データが転送されていることから、音源部２１は途切れることなくクラスタ１の波形データに基づく再生波形を生成することができるようになる。
【００２４】
そして、時刻ｔ２となってＡバッファの波形データ１Ａが全て読み出されると、Ｂバッファの先頭から次のクラスタ２の波形データ２Ｂが順次読み出されるようになる。これにより、音源部２１は時刻ｔ２からクラスタ２の波形データに基づく再生波形を生成していくようになる。また、この時刻ｔ２でＡバッファへ次のクラスタ３の波形データを転送する転送要求のＩＰ割込が発生し、クラスタ３の波形データがハードディスク１６から読み出されてＡバッファへ転送される。次に、時刻ｔ３となって読出アドレスがＢバッファのエンドアドレスＢＥ１（ジャンプ元）まで進行し、波形データ２Ｂが全て読み出されると、読出アドレスはスタートアドレスＢＳ１（ジャンプ先）に戻され、再びＡバッファの先頭から次のクラスタ３の波形データ３Ａが順次読み出さるようになる。これにより、音源部２１は時刻ｔ３からクラスタ３の波形データに基づく再生波形を生成していくようになる。さらに、この時刻ｔ３でＢバッファへ次のクラスタ４の波形データを転送する転送要求のＩＰ割込が発生し、クラスタ４の波形データがハードディスク１６から読み出されてＢバッファに転送される。
【００２５】
次いで、時刻ｔ４となってＡバッファの波形データ３Ａが全て読み出されると、Ｂバッファの先頭から次のクラスタ４の波形データ４Ｂが順次読み出されるようになる。これにより、音源部２１は時刻ｔ４からクラスタ４の波形データに基づく再生波形を生成していくようになる。また、この時刻ｔ４でＡバッファへ次のクラスタ５の波形データを転送する転送要求のＩＰ割込が発生し、クラスタ５の波形データがハードディスク１６から読み出されてＡバッファに転送されるが、この例では、転送されたクラスタ５はループ部波形データの先頭であるループスタートＬＳを含むＬＳクラスタ（ＬＳＣ）とされる。次に、時刻ｔ５になって、読出アドレスがエンドアドレスＢＥ１（ジャンプ元）まで進行し、Ｂバッファの波形データ４Ｂが全て読み出されると、読出アドレスはスタートアドレスＢＳ１（ジャンプ先）に戻され、再びＡバッファの先頭から次のクラスタ５の波形データ５Ａが順次読み出さるようになる。これにより、音源部２１は時刻ｔ５からクラスタ５の波形データに基づく再生波形を生成していくようになる。
【００２６】
また、この時刻ｔ５でＩＰ割込が発生するが、ＬＳクラスタが第１バッファＰＢ１に転送されていることから、第１バッファＰＢ１によるバッファリング再生から第２バッファＰＢ２によるバッファリング再生に継続的に移行してループ再生動作を開始するように、このＩＰ割込は次のクラスタ６を第１バッファＰＢ１のＢバッファに転送する転送要求と、その次のクラスタ７（ＬＳＣｘ）を第２バッファＰＢ２のＣバッファに転送する転送要求と、さらに次のクラスタ８（ＬＳＣｙ）を第２バッファのＤバッファに転送する転送要求と解釈される。これにより、クラスタ６の波形データがハードディスク１６から読み出されて第１バッファＰＢ１のＢバッファにが転送されると共に、クラスタ７の波形データがハードディスク１６から読み出されて第２バッファＰＢ２のＣバッファに、クラスタ８の波形データがハードディスク１６から読み出されてＤバッファに転送される。
そして、Ａバッファの先頭から次のクラスタ５の波形データ５Ａの読み出し中に読み出しアドレスがループ部波形データの先頭であるループスタートＬＳに達した際に、アタック部波形データの読み出しが終了してアタック波形の再生が終了する。次いで、ループ部波形データが引き続いてクラスタ５から読み出されて、音源部２１はループスタートＬＳのタイミングから１回目のループ波形の生成を開始するようになる。さらに、第２バッファＰＢ２から波形データを読み出すために、このタイミングで、制御レジスタ３０には第２バッファＰＢ２のスタートアドレスＢＳ２がジャンプ先として、また、エンドアドレスＢＥ２がジャンプ元としてそれぞれ設定される。
【００２７】
そして、時刻ｔ６となって第１バッファＰＢ１のＡバッファから波形データ５Ａが全て読み出されると、引き続いて第１バッファＰＢ１のＢバッファから波形データ６Ｂが順次読み出さるようになる。これにより、音源部２１は時刻ｔ６からクラスタ６の波形データに基づく再生波形を生成していくようになる。さらに、時刻ｔ７となって第１バッファＰＢ１のＢバッファからクラスタ６の波形データが全て読み出されると、第２バッファＰＢ２のＣバッファから波形データ７Ｃが順次読み出さるようになる。これにより、音源部２１は時刻ｔ７からクラスタ７の波形データに基づく再生波形を生成していくようになる。さらに、時刻ｔ８となって第２バッファＰＢ２のＣバッファからクラスタ７の波形データが全て読み出されると、引き続いて第２バッファＰＢ２のＤバッファから波形データ８Ｂが順次読み出さるようになる。これにより、音源部２１は時刻ｔ８からクラスタ８の波形データに基づく再生波形を生成していくようになる。また、この時刻ｔ８で第２バッファＰＢ２のＣバッファへ次のクラスタ９の波形データを転送する転送要求のＩＰ割込が発生し、クラスタ９の波形データがハードディスク１６から読み出されてＣバッファへ転送される。
【００２８】
次いで、時刻ｔ９となって、読出アドレスがエンドアドレスＢＥ２（ジャンプ元）まで進行し、第２バッファＰＢ２のＤバッファの波形データ８Ｄが全て読み出されると、読出アドレスはスタートアドレスＢＳ２（ジャンプ先）に戻され、再び第２バッファＰＢ２のＣバッファの先頭から波形データ９Ｃが順次読み出さるようになる。これにより、音源部２１は時刻ｔ９からクラスタ９の波形データに基づく再生波形を生成していくようになる。また、この時刻ｔ９で第２バッファＰＢ２のＤバッファへ次のクラスタ１０の波形データを転送する転送要求のＩＰ割込が発生し、クラスタ１０の波形データがハードディスク１６から読み出されてＤバッファへ転送されるが、転送されたクラスタ１０はループ部波形データのエンドであるループエンドＬＥを含むＬＥクラスタ（ＬＥＣ）とされる。次に、時刻ｔ１０になって第２バッファＰＢ２のＣバッファの波形データ９Ｃが全て読み出されると、第２バッファＰＢ２のＤバッファの先頭から次のクラスタ１０の波形データ１０Ｄが順次読み出さるようになる。これにより、音源部２１は時刻ｔ１０からクラスタ１０の波形データに基づく再生波形を生成していくようになる。さらに、ループ部波形データを先頭から再度再生するために時刻ｔ１０においてループスタートＬＳがジャンプ先として設定される。
【００２９】
また、この時刻ｔ１０でＩＰ割込が発生するが、ＬＥクラスタが第２バッファＰＢ２に転送されていることから、２回目のループ再生を開始するようにＩＰ割込は、第１バッファＰＢ１のＢバッファに格納されているクラスタ６の次のクラスタ７を第２バッファＰＢ２のＣバッファに転送する転送要求となる。これにより、クラスタ７の波形データがハードディスク１６から読み出されて第２バッファＰＢ２のＣバッファに転送される。次いで、時刻ｔ１１となって、読出アドレスがエンドアドレスＢＥ２（ジャンプ元）まで進行し、第２バッファＰＢ２のＤバッファの波形データ１０Ｄが全て読み出されると、読出アドレスはループスタートＬＳ（ジャンプ先）に戻され、第１バッファＰＢ１のＡバッファにおけるループスタートＬＳから波形データ５Ａが順次読み出さるようになる。これにより、音源部２１は時刻ｔ１１から２回目のループ再生を開始して、クラスタ５におけるループスタートＬＳからの波形データに基づく再生波形を生成していくようになる。また、この時刻ｔ１１で第２バッファＰＢ２のＤバッファへ次のクラスタ８の波形データを転送する転送要求のＩＰ割込が発生し、クラスタ８の波形データがハードディスク１６から読み出されてＤバッファに転送され、また、第２バッファＰＢ２のスタートアドレスＢＳ２がジャンプ先として設定される。
そして、時刻ｔ１２となって第１バッファＰＢ１のＡバッファからループスタートＬＳ以降の波形データ５Ａが全て読み出されると、引き続いて第１バッファＰＢ１のＢバッファから波形データ６Ｂが順次読み出さるようになる。このように時刻ｔ６以降の動作が時刻ｔ１２以降に繰り返し行われて２回目のループ再生が行われる。以降はノートオフが発生するまで同様のループ再生が繰り返し行われるようになる。以上の説明では、各ＩＰ割込を特定のクラスタの転送要求として説明していたが、ＩＰ割込自体には特定のクラスタを示す情報は含まれていない。各ＩＰ割込の発生時点で、ＣＰＵ１０が、選ばれている波形データやそのときの各バッファの状況に基づいて、そのＩＰ割込がどのクラスタの転送要求とすべきかを判断している。
【００３０】
以上のように、アタック部波形データを再生する際には、ノートオンの直後に発音できるように波形メモリ１９にプリロードされているアタック部波形データの先頭の１クラスタのプリロード波形データを読み出して発音を行い、この１クラスタの波形データの発音中を利用して第１バッファＰＢ１の２つのＡバッファ，Ｂバッファにプリロード波形データに続くアタック部波形データを１クラスタずつハードディスク１６から読み出して転送しておく。そして、第１バッファＰＢ１の１つのバッファの波形データの読み出しが終了する毎に、当該バッファに続くアタック部波形データを１クラスタずつハードディスク１６から読み出して転送する。このように、第１バッファＰＢ１を用いてハードディスク１６に記録されているアタック部波形データをバッファリング再生することができるようになる。アタック部波形データにはループ部波形データが続いており、アタック部波形データに続いてループ波形データが発音される。
【００３１】
ループ部波形データの発音では第１のバッファＰＢ１と第２バッファＰＢ２とが用いられる。アタック部波形データとループ部波形データとの境界であるループスタートＬＳは第１バッファのＡバッファあるいはＢバッファに転送されるようになり、第１バッファＰＢ１から波形データを読み出して発音を行うことにより、アタック部の終わりの波形からループ部の先頭の波形に自然につながって発音されていくようになる。そして、第１バッファＰＢ１からループ部の先頭の波形データが全て読み出された以後は、第２バッファＰＢ２を用いてループ部の後続の波形データの発音が行われる。この場合、第２バッファＰＢ２の１つのバッファの波形データの読み出しが終了する毎に、当該バッファに続くループ部波形データを１クラスタずつハードディスク１６から読み出して転送する。このようにして、第２バッファＰＢ２を用いてハードディスク１６に記憶されているループ部波形データをバッファリング再生することができるようになる。そして、ループ部の末尾であるループエンドＬＥまでの波形データが読み出されると、第１バッファＰＢ１のＡバッファからループスタートＬＳ以後の波形データを読み出して２回目のループの発音を開始する。この場合、第１バッファＰＢ１には新たな波形データを転送することなく１回目のループの発音の際に転送されていたループ部の先頭の波形データを再利用する。そして、第１バッファＰＢ１から全ての波形データが読み出された以後は、第２バッファＰＢ２を利用して１回目のループの発音と同様の動作が発音停止が指示されるまで行われる。
【００３２】
このようにして、ハードディスク１６から波形データを読み出しながら発音しても途切れることのないループ発音を行うことができる。なお、ループ部波形データのＬＳクラスタ（ＬＳＣ）は、アタック部の長さに応じて第１バッファＰＢ１のＡバッファに転送される場合もあるし、Ｂバッファに転送される場合もある。ここで、ＢバッファにＬＳクラスタが転送されると、ループスタートＬＳからのループ再生において第２バッファＰＢ２のＣバッファへの次のクラスタの転送が間に合わないおそれがあることから、ＬＥクラスタの第２バッファＰＢ２の先頭でないバッファ（この場合はＤバッファ）に転送されるように波形データの長さが調整（図２参照）されている。この場合、ループ部波形データのループサイズは、ＬＳクラスタが奇数番号クラスタとされてＡバッファに転送される場合は、ＬＳクラスタも含めて少なくとも４以上の偶数個のクラスタからなるループサイズとされ、ＬＳクラスタが偶数番号クラスタとされてＢバッファに転送される場合は、ＬＳクラスタも含めて少なくとも３以上の奇数個のクラスタからなるループサイズとされている必要がある。
【００３３】
例を挙げて説明すると、クラスタ６がＬＳクラスタ（ＬＳＣ）とされて、そのエンドの直前にループスタートＬＳがあり、クラスタ９がＬＥクラスタ（ＬＥＣ）とされている場合は、第２バッファＰＢ２のＣバッファに転送されたクラスタ９の波形データ９Ｃのエンドに達した際にループエンドＬＥに達したとされて、２回目のループが開始されるようになる。この時点において、第１バッファＰＢ１のＢバッファに格納されているクラスタ６の次のクラスタ７を第２バッファＰＢ２のＣバッファに転送する転送要求のＩＰ割込が発生して、第２バッファＰＢ２のＣバッファへのクラスタ７の転送が開始される。同時に、第１バッファＰＢ１のＢバッファに格納されているクラスタ６のループスタートＬＳから２回目のループ再生が開始されるが、エンドの直前にループスタートＬＳがあることから、すぐにクラスタ６のエンドまでの波形データ６Ｂが読み出されるようになる。続いて、第２バッファＰＢ２のＣバッファの波形データ７Ｃが読み出されるのであるが、このときまでに第２バッファＰＢ２のＣバッファへのクラスタ７の転送が終了していない場合は、発音が途切れることになる。そこで、ループ部波形データのループサイズがＬＥクラスタが第２バッファＰＢ２のＤバッファに転送されるサイズになるよう調整することで、第２バッファＰＢ２のＣバッファへのクラスタ７の転送時間を十分とれるようになり、発音が途切れることを防止することができる。
【００３４】
次に、ノートオン（ｐ，ｎ，ｖ）イベント処理のフローチャートを図７に示す。ｐはパート番号、ｎはノートナンバ（音高）、ｖはベロシティ（演奏強度）であり、ノートオン（ｐ，ｎ，ｖ）イベント処理はノートオンが発生した際（ｔ０）に起動される。
ノートオン（ｐ，ｎ，ｖ）イベント処理が起動されると、ステップＳ１０にて空いている発音チャンネルのうちのチャンネルａが割当チャンネルとされる。次いで、ステップＳ１１にてノートオンのパート（ｐ）で選択されている音色、音高（ｎ）、ベロシティ（ｖ）に基づいて、何れの波形データ（アタック部波形データとループ部波形データ）を読み出すかを決定する。読み出す波形データが決定されるとステップＳ１２にて割り当てられたａチャンネルの制御レジスタ３０に、決定された波形データのプリロードのスタートアドレスＰＳ’、エンドアドレスＰＥ’、ａチャンネルの第１バッファＰＢ１のスタートアドレスＢＳ１’、エンドアドレスＢＥ１’、最初のＩＰ割込を発生させる割込アドレスＩＰ’（第１バッファＰＢ１のＡバッファの終了アドレス）を設定する。ここでは、エンドアドレスＰＥ’およびエンドアドレスＢＥ’はジャンプ元として設定され、スタートアドレスＢＳ１’はジャンプ先として設定される。次いで、ステップＳ１３にてａチャンネルの制御レジスタ３０に、ＤＳＰ３５で使用するビブラートパラメータ、音量制御部３３で使用する音量変化パラメータ、ミキサ３４で使用するミキシング比などのパラメータを設定する。そして、ステップＳ１４にてａチャンネルに発音開始を指示する。これにより、設定されたスタートアドレスＰＳ’からアタック部波形データの先頭のクラスタの波形データの読み出しが開始される。
【００３５】
次いで、ステップＳ１５にてａチャンネルのターゲットとするクラスタ番号を示すターゲットＴＣ（ａ）をクラスタ２とし、ａチャンネルにおいて次に読み込むべきクラスタ番号を示すＮＣ（ａ）をクラスタ１とし、ａチャンネルの波形生成状態Ｓ（ａ）をアタック状態であることを示す「０」とし、ａチャンネルの転送要求Ｒ（ａ）を転送が必要とする「１」に設定する。この設定により、クラスタ１からターゲットとされるクラスタ２までの転送が設定される。この設定が終了するとステップＳ１６にてＣＰＵ１０が波形データを転送中か否かが判断され、転送中でないと判断された場合はステップＳ１７にて転送開始処理が行われてクラスタ１の波形データの転送が開始され、ノートオン（ｐ，ｎ，ｖ）イベント処理は終了する。また、転送中と判断された場合はノートオン（ｐ，ｎ，ｖ）イベント処理は、そのまま終了する。
なお、第１バッファＰＢ１および第２バッファＰＢ２は発音チャンネル毎に予め波形メモリ１９の異なる領域に設定され、波形データ毎に読出アドレスは異なることから、ＰＳ等の記号に「’」を付記して発音チャンネルが異なると異なる値を示すことを意味させている。また、以降のフローチャートの説明においても記号に付記される「’」は同様の意味を示すものとして用いている。
【００３６】
次に、ノートオン（ｐ，ｎ，ｖ）イベント処理のステップＳ１７などで実行される転送開始処理のフローチャートを図８に示す。
転送開始処理が起動されると、ステップＳ２０にて転送必要とされている転送要求（Ｒ＝１）のいずれかのチャンネルが選択され、選択されたチャンネルがｂとされる。この選択は、現在発音中のチャンネルの中から、バッファに読み込み済みの波形データの再生時間が短いものを優先的に選択するのがよい。あるいは、簡略化した方法として、クラスタの転送要求が先に生じたチャンネルから順に選択する方法も考えられる。次いで、ステップＳ２１にて選択されたｂチャンネルにおいて波形生成状態Ｓ（ｂ）がアタック状態（Ｓ＝０）か否かが判断される。図４に示すようにアタック波形を生成中はＳ＝０とされており、ここでアタック状態であると判断された場合は、ステップＳ２２に進みｂチャンネルにおいて次に読み込むべきクラスタ番号ＮＣ（ｂ）に応じて第１バッファＰＢ１のＡ’バッファあるいはＢ’バッファが転送先として特定されるとともに、該特定された転送先が転送回路１８に設定され、ステップＳ２４に進む。また、ステップＳ２１にてｂチャンネルの波形生成状態Ｓ（ｂ）がアタック状態ではなくループ波形を生成中のループ状態（Ｓ＝１）あるいはリターン状態（Ｓ＝２）と判断された場合は、ステップＳ２３に分岐しｂチャンネルにおいて次に読み込むべきクラスタ番号ＮＣ（ｂ）に応じて第２バッファＰＢ２のＣ’バッファあるいはＤ’バッファが転送先として特定され、該特定された転送先が転送回路１８に設定され、ステップＳ２４に進む。そして、ステップＳ２４では、ハードディスク１６においてクラスタ番号ＮＣ（ｂ）の波形データを記憶しているクラスタ（記憶領域）が特定され、ＨＤ  Ｉ／Ｏ１７を介してハードディスク１６に対し当該クラスタからの波形データの読み出し開始を指示するとともに、転送回路１８に対して、設定されている転送先への該読み出された波形データの転送開始が指示され、転送開始処理は終了する。これにより、転送先として設定された第１バッファＰＢ１あるいは第２バッファＰＢ２のバッファにクラスタ番号ＮＣ（ｂ）の波形データの転送が開始される。
【００３７】
図８に示す転送開始処理により開始されたクラスタの波形データが全て転送された際に、図９に示す転送完了割込（ｂ）イベント処理が開始される。
転送完了割込（ｂ）イベント処理が起動されると、次のクラスタを転送する準備のためにステップＳ３０にて次に読み込むべきクラスタ番号ＮＣ（ｂ）が１だけインクリメントされる。次いで、ステップＳ３１にてｂチャンネルにおいて次に読み込むべきクラスタ番号ＮＣ（ｂ）が１だけインクリメントしたターゲットＴＣ（ｂ）に達したか否かが判断される。ここで、１だけインクリメントしたクラスタ番号ＮＣ（ｂ）がターゲットＴＣ（ｂ）に達していないと判断された場合は、ターゲットＴＣ（ｂ）までのクラスタをさらに転送する必要があることからステップＳ３２に進み、ｂチャンネルのクラスタ転送要求Ｒ（ｂ）を転送要とする「１」に設定し、ステップＳ３４に進む。また、１だけインクリメントしたクラスタ番号ＮＣ（ｂ）がターゲットＴＣ（ｂ）に達していると判断された場合は、ターゲットＴＣ（ｂ）までのクラスタの転送は終了したとしてステップＳ３３に進み、ｂチャンネルのクラスタ転送要求Ｒ（ｂ）を転送不要とする「０」に設定し、ステップＳ３４に進む。ステップＳ３４では、次に読み込むべきクラスタ番号ＮＣ（ｂ）がクラスタＬＳＣｘ’に達したか否かが判断される。ここで、クラスタ番号ＮＣ（ｂ）がクラスタＬＳＣｘ’に達していないと判断された場合は、アタック状態（Ｓ＝０）であることからステップＳ３６に進む。
【００３８】
また、クラスタ番号ＮＣ（ｂ）がクラスタＬＳＣｘ’に達したと判断された場合は、ループ状態に移行したとしてステップＳ３５に分岐してｂチャンネルの波形生成状態Ｓがループ状態を示す「１」とされ、ステップＳ３６に戻る。なお、クラスタＬＳＣｘは、ＬＳクラスタ（ＬＳＣ）以降のクラスタで第２バッファＰＢ２に初めて転送されるクラスタであり、ＬＳクラスタがＡバッファに転送されていた場合はＬＳＣ＋２となり、ＬＳクラスタがＢバッファに転送されていた場合はＬＳＣ＋１となる。
ステップＳ３６ではクラスタ番号ＮＣ（ｂ）がＬＥクラスタＬＥＣ’を超えたか否かが判断される。ここで、クラスタ番号ＮＣ（ｂ）がＬＥクラスタＬＥＣ’を超えていないと判断された場合は、ステップＳ３８に進む。また、クラスタ番号ＮＣ（ｂ）がＬＥクラスタＬＥＣ’を超えたと判断された場合は次回のループ発音のために、ステップＳ３７に分岐してｂチャンネルにおいて次に読み込むべきクラスタ番号ＮＣ（ｂ）がｂチャンネルのクラスタＬＳＣｘ’とされ、ステップＳ３８に進む。ステップＳ３８では転送が必要とされている転送要求（Ｒ＝１）のいずれかのチャンネルがあるか否かが判断され、ここでＲ＝１のチャンネルがあると判断された場合はステップＳ３９にて当該チャンネルにおいて転送開始処理が開始され、転送完了割込（ｂ）イベント処理が終了する。また、Ｒ＝１のチャンネルがないと判断された場合は、そのまま転送完了割込（ｂ）イベント処理が終了する。
【００３９】
次に、ＩＰ割込が発生した際に実行されるＩＰ割込（ｃ）イベント処理のフローチャートを図１０に示す。
ｃチャンネルにおいてＩＰ割込が発生しＩＰ割込（ｃ）イベント処理が起動すると、ステップＳ４０にてｃチャンネルのターゲットＴＣ（ｃ）が１だけインクリメントされると共に、ｃチャンネルのクラスタ転送要求Ｒ（ｃ）が転送要の「１」とされる。次いで、ステップＳ４１にてｃチャンネルの波形生成状態Ｓ（ｃ）が「０」「１」「２」のいずれであるか判断される。ここで、波形生成状態Ｓ（ｃ）が「０」のアタック状態と判断されると、ステップＳ４２に分岐してｃチャンネルのターゲットＴＣ（ｃ）がＬＳクラスタＬＳＣ’を超えているか否かが判断される。ここで、ターゲットＴＣ（ｃ）がＬＳクラスタＬＳＣ’を超えていると判断された場合は、波形生成状態がループ状態に移行することからＳ４３にてｃチャンネルに第２バッファＰＢ２のスタートアドレスＢＳ２’がジャンプ先として、またエンドアドレスＢＥ２’がジャンプ元としてそれぞれ設定される。次いで、ステップＳ４４にてクラスタＬＳＣｙ’がターゲットクラスタＴＣ（ｃ）に設定される。これにより、第２バッファＰＢ２のＣバッファにクラスタＬＳＣｘ’が、ＤバッファにクラスタＬＳＣｙ’が転送される設定がされステップＳ５０に進む。なお、クラスタＬＳＣｘは、ループスタートクラスタＬＳＣ以降のクラスタで第２バッファＰＢ２に初めて転送されるクラスタであり、クラスタＬＳＣｙは、図４のように第２バッファＰＢ２への移行時も第２バッファＰＢ２の各クラスタの再生終了毎にＩＰ割込みを発生させるようにしている場合は、第２バッファＰＢ２に２番目に転送されるクラスタである。図４の例では、クラスタＬＳＣｘはクラスタ７、クラスタＬＳＣｙはクラスタ８となる。なお、クラスタＬＳＣｙをどのクラスタにするかは、第１バッファＰＢ１から第２バッファＰＢ２へ移行するときに、ＩＰ割込みをどのタイミングで発生させるかに依存する。第２バッファＰＢ２がｎクラスタ分の領域がある場合には、第２バッファＰＢ２への転送順が、２からｎ番目までの任意の順のクラスタをクラスタＬＳＣｙとしてそのＩＰ割込タイミングを決めることができる。また、ステップＳ４２にてターゲットＴＣ（ｃ）がＬＳクラスタを超えていないと判断された場合は、アタック状態を維持していることからそのままステップＳ５０に進む。
【００４０】
また、ステップＳ４１にて波形生成状態Ｓ（ｃ）が「１」のループ波形を生成しているループ状態と判断されると、ステップＳ４５に分岐してｃチャンネルのターゲットＴＣ（ｃ）がＬＥクラスタＬＥＣ’を超えているか否かが判断される。ここで、ターゲットＴＣ（ｃ）がＬＥクラスタＬＥＣ’を超えていると判断された場合はリターン状態に移行することから、ステップＳ４３にて波形生成状態Ｓ（ｃ）がＳ＝２のリターン状態に設定される。さらに、次回のループ状態に移行することに備えてターゲットＴＣ（ｃ）にクラスタＬＳＣｘ’が設定されると共に、ステップＳ４７にてｃチャンネルにループスタートアドレスＬＳ’のアドレスがジャンプ先として設定され、ステップＳ５０に進む。
さらに、ステップＳ４１にて波形生成状態Ｓ（ｃ）が「２」のループ波形の生成がループスタートに戻るリターン状態と判断されると、ステップＳ４８に分岐して波形生成状態Ｓ（ｃ）がＳ＝１のループ状態に設定される。さらに、ループ状態において、ループ波形のバッファリング再生が行えるように、ステップＳ４９にてｃチャンネルに第２バッファＰＢ２のスタートアドレスＢＳ’がジャンプ先として設定され、ステップＳ５０に進む。
【００４１】
ステップＳ５０ではｃチャンネルに次のＩＰ割込を発生させる割り込みアドレスを設定する。割り込みアドレスは、アタック状態（Ｓ＝０）の場合は第１バッファＰＢ１のＡバッファのエンドアドレスあるいはＢバッファのエンドアドレス（ＢＥ１）であり、今回の割り込みアドレスがＡバッファのエンドアドレスの場合は、Ｂバッファのエンドアドレスが設定され、今回の割り込みアドレスがＢバッファのエンドアドレスの場合は、Ａバッファのエンドアドレスが設定される。また、ループ状態（Ｓ＝１）およびリターン状態（Ｓ＝２）の場合は第２バッファＰＢ２のＣバッファのエンドアドレスあるいはＤバッファのエンドアドレス（ＢＥ２）であり、今回の割り込みアドレスがＣバッファのエンドアドレスの場合は、Ｄバッファのエンドアドレスが設定され、今回の割り込みアドレスがＤバッファのエンドアドレスの場合は、Ｃバッファのエンドアドレスが設定される。ステップＳ５０の処理が終了するとステップＳ５１にてＣＰＵ１０が波形データを転送中か否かが判断され、転送中でないと判断された場合はステップＳ５２にて転送開始処理が行われて転送要求されたクラスタの波形データの転送が開始され、ＩＰ割込（ｃ）イベント処理は終了する。また、転送中と判断された場合はＩＰ割込（ｃ）イベント処理は、そのまま終了する。
【００４２】
次に、図７ないし図１０に示すフローチャートの処理により、本発明にかかる楽音発生装置１が図４に示すように動作する概略説明を行う。この場合、第１バッファＰＢ１はＡバッファとＢバッファからなるリングバッファ構成とされ、第２バッファＰＢ２はＣバッファとＤバッファからなるリングバッファ構成とされているものとする。
時刻ｔ０でノートオンが検出されると、図７に示すノートオン（ｐ，ｎ，ｖ）イベント処理が起動され、発音チャンネルの割当およびノートオン情報に基づいて使用する波形データが決定される。そして、使用する波形データのアタック部波形データの先頭のクラスタＰの波形データを波形メモリ１９から読み出すためのスタートアドレスＰＳ’とエンドアドレスＰＥ’（ジャンプ元）が設定されて、スタートアドレスＰＳ’からエンドアドレスＰＥ’までのクラスタＰの波形データの読み出しが開始される。同時に、ハードディスク１６から転送した波形をバッファする第１バッファＰＢ１のスタートアドレスＢＳ１’（ジャンプ先）とエンドアドレスＢＥ１’（ジャンプ元）が設定されると共に、ターゲットＴＣがクラスタ２に次に読み込むクラスタＮＣがクラスタ１に設定される。さらに、アタック状態（Ｓ＝０）および転送要（Ｒ＝１）に設定されると共に、次のＩＰ割込を発生する割込アドレスをＡバッファのエンドアドレスに設定する。
【００４３】
これにより、図８に示す転送開始処理が起動され、Ｓ＝０であると共にＮＣが１（奇数）とされていることからＡバッファにハードディスク１６から読み出したクラスタ１の波形データを転送する。Ａバッファへのクラスタ１の転送が終了すると、図９に示す転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ２となっても、ＴＣ＋１であるクラスタ３よりＮＣが小さいことからＲ＝１は維持される。これにより、再び転送開始処理が起動されＳ＝０であると共にＮＣが２（偶数）とされていることからＢバッファにハードディスク１６から読み出したクラスタ２の波形データを転送する。Ｂバッファへの波形データ２Ｂの転送が終了すると、転送完了割込（ｂ）イベント処理が再び起動される。そして、ＮＣがインクリメントされてクラスタ３となり、ＴＣ＋１であるクラスタ３に一致することからＲ＝０（転送不要）に設定され転送完了割込（ｂ）イベント処理は終了する。このように、クラスタＰの波形データを波形メモリ１９から読み出している間に、Ａバッファにクラスタ１の波形データ１ＡをＢバッファにクラスタ２の波形データ２Ｂを転送できるようになる。なお、以上の処理の間においてはＮＣがＬＳＣｘ’に達しないことからＳ＝０（アタック状態）が維持される。
【００４４】
そして、クラスタＰの波形データの読み出しが終了すると、その発音チャンネルに設定された第１バッファＰＢ１のスタートアドレスＢＳ１’から波形データ１Ａが読み出されていくようになる。そして、波形データ１Ａの読み出しが終了すると読み出しアドレスがＡバッファのエンドアドレスに達することからＩＰ割込が発生し、図１０に示すＩＰ割込（ｃ）イベント処理が起動する。すると、ＴＣがインクリメントされてクラスタ３とされると共に、Ｒ＝１（転送要）に設定されＢバッファのエンドアドレス（ＢＥ１’）が次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝０であると共にＮＣが３（奇数）とされていることからＡバッファにハードディスク１６から読み出したクラスタ３の波形データ３Ａを転送する。Ａバッファへの波形データ３Ａの転送が終了すると、転送完了割込（ｂ）イベント処理が再び起動される。そして、ＮＣがインクリメントされてクラスタ４となり、ＴＣ＋１であるクラスタ４に一致することからＲ＝０（転送不要）に設定され転送完了割込（ｂ）イベント処理は終了する。これにより、Ｂバッファの波形データ２Ｂを読出中においてＡバッファに次のクラスタ３の波形データが転送されるようになる。
【００４５】
次いで、波形データ２Ｂの読み出しが終了すると読み出しアドレスがＢバッファのエンドアドレス（ＢＥ１’）に達することからＩＰ割込が発生すると共に、読み出しアドレスがＡバッファのスタートアドレス（ＢＳ１’）に設定され、ＩＰ割込（ｃ）イベント処理が起動する。すると、ＴＣがインクリメントされてクラスタ４とされると共に、Ｒ＝１（転送要）に設定されＡバッファのエンドアドレスが次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝０であると共にＮＣが４（偶数）とされていることからＢバッファにハードディスク１６から読み出したクラスタ４の波形データ４Ｂを転送する。Ｂバッファへの波形データ４Ｂの転送が終了すると、転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ５となり、ＴＣ＋１であるクラスタ５に一致することからＲ＝０（転送不要）に設定され転送完了割込（ｂ）イベント処理は終了する。これにより、Ａバッファの波形データ３Ａを読出中においてＢバッファに次のクラスタ４の波形データが転送されるようになる。
【００４６】
さらに、波形データ３Ａの読み出しが終了すると読み出しアドレスがＡバッファのエンドアドレスに達することからＩＰ割込が発生し、ＩＰ割込（ｃ）イベント処理が起動する。すると、ＴＣがインクリメントされてクラスタ５（ＬＳＣ’）とされると共に、Ｒ＝１（転送要）に設定されＢバッファのエンドアドレス（ＢＥ１’）が次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝０であると共にＮＣが５（奇数）とされていることからＡバッファにハードディスク１６から読み出したクラスタ５の波形データ５Ａを転送する。Ａバッファへの波形データ５Ａの転送が終了すると、転送完了割込（ｂ）イベント処理が再び起動される。そして、ＮＣがインクリメントされてクラスタ６となり、ＴＣ＋１であるクラスタ６に一致することからＲ＝０（転送不要）に設定される。この場合、ＴＣはＬＳＣ’（クラスタ５）と一致しているが超えていないため、そのまま転送完了割込（ｂ）イベント処理は終了する。これにより、Ｂバッファの波形データ４Ｂを読出中においてＡバッファに次のクラスタ５の波形データが転送されるようになる。
【００４７】
次いで、波形データ４Ｂの読み出しが終了すると読み出しアドレスがＢバッファのエンドアドレス（ＢＥ１’）に達することからＩＰ割込が発生すると共に、読み出しアドレスがＡバッファのスタートアドレス（ＢＳ１’）に設定され、ＩＰ割込（ｃ）イベント処理が起動する。すると、ＴＣがインクリメントされてクラスタ６とされると共に、Ｒ＝１（転送要）に設定される。この場合、Ｓ＝０（アタック状態）でＴＣ（クラスタ６）がＬＳＣ’（クラスタ５）を超えることからＴＣにＬＳＣｙ’（クラスタ８）が設定されると共に、第２バッファＰＢ２を用いる設定（ジャンプ元およびジャンプ先）が行われる。そして、第２バッファＰＢ２のＣバッファのエンドアドレスが次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝０であると共にＮＣが６（偶数）とされていることからＢバッファにハードディスク１６から読み出したクラスタ６の波形データ６Ｂを転送する。Ｂバッファへの波形データ６Ｂの転送が終了すると、転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ７となり、ＴＣ＋１であるクラスタ９に達していないことからＲ＝１（転送要）が維持されると共に、ＮＣ（クラスタ７）がＬＳＣｘ’（クラスタ７）に一致することからＳ＝１（ループ状態）に設定されて、再び転送開始処理が起動される。
【００４８】
この転送開始処理では、Ｓ＝１であると共にＮＣが７（奇数）とされていることからＣバッファにハードディスク１６から読み出したクラスタ７の波形データ７Ｃを転送する。Ｃバッファへの波形データ７Ｃの転送が終了すると、転送完了割込（ｂ）イベント処理が再び起動され、ＮＣがインクリメントされてクラスタ８となるが、ＴＣ＋１であるクラスタ９に達していないことからＲ＝１（転送要）およびＳ＝１（ループ状態）が維持されて、三度目の転送開始処理が起動される。この転送開始処理では、Ｓ＝１であると共にＮＣが８（偶数）とされていることからＤバッファにハードディスク１６から読み出したクラスタ８の波形データ８Ｄを転送する。Ｄバッファへの波形データ８Ｄの転送が終了すると、転送完了割込（ｂ）イベント処理が三度起動され、ＮＣがインクリメントされてクラスタ９となり、ＴＣ＋１であるクラスタ９に一致することからＲ＝０（転送不要）に設定されるが、Ｓ＝１（ループ状態）は維持されて、転送完了割込（ｂ）イベント処理は終了する。これにより、Ａバッファの波形データ５Ａを読出中においてＢバッファに次のクラスタ６の波形データが、Ｃバッファにその次のクラスタ７の波形データが、Ｄバッファにその次のクラスタ８の波形データが転送されて、１回目のループ波形の生成の準備が整うことになる。
【００４９】
そして、Ａバッファの波形データ５ＡおよびＢバッファの波形データ６Ｂの読み出しが終了すると、続いて第２バッファＰＢ２のＣバッファの波形データ７Ｃの読み出しが開始される。波形データ７Ｃが順次読み出されて読出アドレスがＣバッファのエンドアドレスまで進むとＩＰ割込が発生し、ＩＰ割込（ｃ）イベント処理が起動する。このＩＰ割込（ｃ）イベント処理では、ＴＣがインクリメントされてクラスタ９とされると共に、Ｒ＝１（転送要）に設定される。この場合、Ｓ＝１（ループ状態）でＴＣ（クラスタ９）がＬＥＣ’（クラスタ１０）を超えていないことから、Ｄバッファのエンドアドレス（ＢＥ２’）が次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝１であると共にＮＣが９（奇数）とされていることからＣバッファにハードディスク１６から読み出したクラスタ９の波形データ９Ｃを転送する。Ｃバッファへの波形データ９Ｃの転送が終了すると、転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ１０となり、ＴＣ＋１であるクラスタ１０に達することからＲ＝０（転送不要）に設定されると共に、ＮＣ（クラスタ１０）がＬＥＣ’（クラスタ１０）を超えないことから転送完了割込（ｂ）イベント処理は終了する。これにより、Ｄバッファの波形データ８Ｄを読出中においてＣバッファに次のクラスタ９の波形データが転送されるようになる。
【００５０】
さらに、Ｄバッファの波形データ８Ｄの読み出しが終了すると読出アドレスがＤバッファのエンドアドレス（ＢＥ２’）まで進みＩＰ割込が発生すると共に、読み出しアドレスがＣバッファのスタートアドレス（ＢＳ２’）に設定され、ＩＰ割込（ｃ）イベント処理が起動する。このＩＰ割込（ｃ）イベント処理では、ＴＣがインクリメントされてクラスタ１０とされると共に、Ｒ＝１（転送要）に設定される。この場合、Ｓ＝１（ループ状態）でＴＣ（クラスタ１０）がＬＥＣ’（クラスタ１０）を超えていないことから、Ｃバッファのエンドアドレスが次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝１であると共にＮＣが１０（偶数）とされていることからＤバッファにハードディスク１６から読み出したクラスタ１０の波形データ１０Ｄを転送する。Ｄバッファへの波形データ１０Ｄの転送が終了すると、転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ１１となり、ＴＣ＋１であるクラスタ１１に達することからＲ＝０（転送不要）に設定されると共に、ＮＣ（クラスタ１１）がＬＥＣ’（クラスタ１０）を超えるようになることからＮＣにＬＳＣｘ’（クラスタ７）が設定され転送完了割込（ｂ）イベント処理は終了する。これにより、Ｃバッファの波形データ９Ｃを読出中においてＤバッファに次のクラスタ１０が転送されるようになる。
【００５１】
次いで、Ｃバッファの波形データ９Ｃの読み出しが終了すると読出アドレスがＣバッファのエンドアドレスまで進みＩＰ割込が発生し、ＩＰ割込（ｃ）イベント処理が起動する。このＩＰ割込（ｃ）イベント処理では、ＴＣがインクリメントされてクラスタ１１とされると共に、Ｒ＝１（転送要）に設定される。この場合、Ｓ＝１（ループ状態）でＴＣ（クラスタ１１）がＬＥＣ’（クラスタ１０）を超えるようになることから、ＴＣがＬＳＣｘ’（クラスタ７）に、波形生成状態がＳ＝２（リターン状態）に設定されると共に、次のＩＰ割込があったときに読み出しアドレスをループスタートアドレスＬＳ’とする設定（ジャンプ先）が行われる。そして、Ｄバッファのエンドアドレス（ＢＥ２’）が次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝２であると共にＮＣが７（奇数）とされていることからＣバッファにハードディスク１６から読み出したクラスタ７の波形データ７Ｃを転送する。Ｃバッファへの波形データ７Ｃの転送が終了すると、転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ８となり、ＴＣ＋１であるクラスタ８に達することからＲ＝０（転送不要）に設定され転送完了割込（ｂ）イベント処理は終了する。これにより、Ｄバッファの波形データ１０Ｄを読出中においてＣバッファに２回目のループ波形の生成に用いるクラスタ７の波形データが転送されるようになる。
【００５２】
さらに、Ｄバッファの波形データ１０Ｄの読み出しが終了すると読出アドレスがＤバッファのエンドアドレス（ＢＥ２’）まで進みＩＰ割込が発生すると共に、読み出しアドレスがＡバッファのループスタートアドレス（ＰＳ’）に設定され、ＩＰ割込（ｃ）イベント処理が起動する。このＩＰ割込（ｃ）イベント処理では、ＴＣがインクリメントされてクラスタ８とされると共に、Ｒ＝１（転送要）に設定される。この場合、Ｓ＝２（リターン状態）とされていることから、Ｓ＝１（ループ状態）に設定されると共に、第１バッファＰＢ１の波形データの読み出しに続いて第２バッファＰＢ２から波形データの読み出しを行うよう第２バッファＰＢ２のスタートアドレスＢＳ２’がジャンプ先として設定される。そして、Ｃバッファのエンドアドレスが次のＩＰ割込を発生する割込アドレスとして設定されて転送開始処理が起動される。転送開始処理では、Ｓ＝１であると共にＮＣが８（偶数）とされていることからＤバッファにハードディスク１６から読み出したクラスタ８の波形データ８Ｄを転送する。Ｄバッファへの波形データ１０Ｄの転送が終了すると、転送完了割込（ｂ）イベント処理が起動される。そして、ＮＣがインクリメントされてクラスタ９となり、ＴＣ＋１であるクラスタ９に達することからＲ＝０（転送不要）に設定され転送完了割込（ｂ）イベント処理は終了する。これにより、第１バッファＰＢ１のＡバッファにおいてループスタートアドレスＬＳ’からの波形データ５Ａが読み出されて２回目のループ波形の生成が開始される。なお、この波形データ５Ａを読出中において第２バッファＰＢ２のＤバッファにクラスタ８の波形データが転送されるようになる。
【００５３】
このようにして２回目のループ波形が生成されていくようになるが、時点ｔ１２以降の動作は１回目のループ波形における時点ｔ６以降と同様となるので、その説明は省略するが、繰り返し実行されるループ波形の生成はノートオフされて発音停止の指示がされるまで行われる。なお、ループ波形の生成においてはループ状態（Ｓ＝１）とリターン状態（Ｓ＝２）を交互に繰り返すことによりループ波形を繰り返し生成することができるようになる。
本発明にかかる楽音発生装置１は、図７ないし図１０に示すフローチャートの処理を実行することにより種々の長さの波形データを用いてアタック波形およびループ波形からなる楽音を生成することができる。この場合、ループ部波形データのループサイズは、ＬＳクラスタが奇数番号クラスタとされてＡバッファに転送される場合は、ＬＳクラスタも含めて少なくとも４以上の偶数個のクラスタからなるループサイズとされ、ＬＳクラスタが偶数番号クラスタとされてＢバッファに転送される場合は、ＬＳクラスタも含めて少なくとも３以上の奇数個のクラスタからなるループサイズとされるよう予め調整されてハードディスク１６に記録されている。
【産業上の利用可能性】
【００５４】
以上の説明において第１バッファおよび第２バッファはそれぞれ２つのバッファからなるリングバッファ構成としたが、この構成に限ることはなく任意に変更することができる。例えば、連続するバッファの数は、４以上の任意の数とすることができる。この場合、連続するバッファの数は５であってもよいし、１０であってもよい。さらに、上記リングバッファのサイズは、２以上の任意の数のクラスタを格納できるサイズであってよいし、最初のリングバッファと、ループ開始点（ＬＳ）通過以後のリングバッファとは、サイズを異ならせるようにしてもよい。
さらにまた、第２バッファのサイズが３クラスタ以上を格納できるサイズである場合、第２バッファの最終クラスタ領域を必ずしもＬＥクラスタとする必要は無く、第２バッファの２番目以降の任意のクラスタ領域にＬＥクラスタが転送されるようにしてもよい。さらにまた、ループ開始点（ＬＳ）が第１バッファの最終クラスタ領域以外のクラスタ領域にある場合には、第１バッファの該クラスタ領域の次以降の任意のクラスタ領域を、第２バッファの先頭クラスタとしてもよい。なお、上記の説明では波形データにおけるループ部波形データのサイズがアタック部波形データのサイズより大きくなっていたが、一般的な波形データでは、アタック部波形データのサイズの方が大きい場合が多くされている。
【００５５】
なお、上記した図８におけるステップＳ２２およびステップＳ２３の説明では、第１バッファＰＢ１ないし第２バッファＰＢ２内の転送先のバッファを、転送すべきクラスタのクラスタ番号が偶数か奇数かで決定するものとしていたが、偶数／奇数での判別は、第１バッファＰＢ１および第２バッファＰＢ２がそれぞれ２つのバッファで構成されている場合にのみ可能である。一般的には、第１バッファＰＢ１がｆ個のバッファで、第２バッファＰＢ２がｇ個のバッファで構成されていれば、ループスタートクラスタＬＳＣ、ループエンドクラスタＬＥＣの波形データのｈ番目のクラスタｈを再生するとして、（１）第１バッファＰＢ１における転送先のバッファＴＢ１は、ステップＳ２２において、ＴＢ１＝modulo｛（ｈ−１）／ｆ｝＋１の式で算出でき、また、（２）第２バッファＰＢ２における転送先のバッファＴＢ２は、ステップＳ２３において、ｊ＝ｈ−roundup｛ＬＳＣ／ｆ｝×ｆ、ＴＢ２＝modulo｛（ｊ−１）／ｇ｝＋１の式で算出できる。（ただし、moduloは、｛｝内の除算の余りを求める関数、roundupは、｛｝内の除算結果の小数部を切り上げる関数、ｊは第２バッファが再生する複数クラスタにおけるクラスタ番号を示す変数である。）ここでは、クラスタＬＳＣｘは、ＬＳＣｘ＝roundup｛ＬＳＣ／ｆ｝×ｆ＋１により算出され、第１バッファＰＢ１が転送先となるクラスタｈはｈ＜ＬＳＣｘの場合であり、第２バッファＰＢ２が転送先となるクラスタｈはｈ≧ＬＳＣｘの場合となる。
【００５６】
上記した本発明の説明において、プリロード領域に記憶するプリロード波形データの長さは、１クラスタ分でなく複数クラスタ分であってもよい。プリロード領域を長くすれば、その分だけ波形メモリ１９の領域をより多く使うことになるが、ノートオン直後のハードディスクから波形メモリへ転送する際の時間的余裕を長くすることができる。一般的に、第１バッファと同じ程度のサイズのプリロード領域を設けるのが好適である。すなわち、上記した本発明の実施例では１クラスタ分としたが、２クラスタの方がより好適となる。なお、本発明はループ部のバッファリング再生を行う構成を特徴とするものであり、プリロード領域を再生する構成については必須の構成とする必要はない。
また、波形メモリ１９におけるバッファの各領域を、所定の順番で連続的に配置していたが、メモリマネジメントを用いた仮想メモリ技術を用いればこの条件を緩和することができる。すなわち、メモリ上に配置された複数のバッファをメモリマネジメントにより各バッファ単位で仮想的に並べ替えられるようにして、該複数のバッファが物理的には所定の順番ではない、あるいは連続していない場合でも、仮想的に所定の順番で連続的に配置させ、その仮想的メモリ空間に配置された複数バッファを用いて本発明を実現しても良い。さらに、メモリマネジメントを簡易化して、この発明で使用する複数のバッファを論理的に再配置するためのハードウェア回路のみを設けるようにしてもよい。
【図面の簡単な説明】
【００５７】
【図１】本発明の実施例である楽音発生装置の構成を示すブロック図である。
【図２】本発明の実施例である楽音発生装置における音源部の詳細な構成を示すブロック図である。
【図３】本発明の実施例である楽音発生装置における外部記憶装置に記憶されている波形データを説明するための図である。
【図４】本発明の実施例である楽音発生装置におけるノートオンされた際の波形データの転送や読み出し、転送制御等のタイミングを示す図である。
【図５】本発明の実施例である楽音発生装置における波形メモリに関連するメモリマップを示す図である。
【図６】本発明の実施例である楽音発生装置における波形データの読み出し動作を示す図である。
【図７】本発明の実施例である楽音発生装置が実行するノートオン（ｐ，ｎ，ｖ）イベント処理のフローチャートである。
【図８】本発明の実施例である楽音発生装置が実行する転送開始処理のフローチャートである。
【図９】本発明の実施例である楽音発生装置が実行する転送完了割込処理のフローチャートである。
【図１０】本発明の実施例である楽音発生装置が実行するＩＰ割込（ｃ）イベント処理のフローチャートである。
【符号の説明】
【００５８】
１  楽音発生装置、１０  ＣＰＵ、１１  フラッシュメモリ、１２  ＲＡＭ、１３  表示器、１４  操作子、１５  タイマ、１６  ハードディスク、１７  ＨＤ  Ｉ／Ｏ、１８  転送回路、１９  波形メモリ、２０  アクセス調停部、２１  音源部、２２  サウンドシステム、２３  ＭＩＤＩ  Ｉ／Ｏ、２４  ＣＰＵバス、３０  制御レジスタ、３１  アドレスカウンタ、３２  補間部、３３  音量制御部、３４  ミキサ、３５  処理部（ＤＳＰ）、３６  Ｄ／Ａ変換器
【図１】
2008249756.tif 000003
【図２】
2008249756.tif 000004
【図３】
2008249756.tif 000005
【図４】
2008249756.tif 000006
【図５】
2008249756.tif 000007
【図６】
2008249756.tif 000008
【図７】
2008249756.tif 000009
【図８】
2008249756.tif 000010
【図９】
2008249756.tif 000011
【図１０】
2008249756.tif 000012