(57)【特許請求の範囲】
【請求項１】
発音させるべき楽音の波形データを、当該楽音のピッチ毎に記憶する第１の記憶手段と、
前記波形データの一部分が記憶可能な領域を複数有するとともに、当該複数の領域は、前記複数の部分波形データのなかで先頭に位置する先頭波形データをピッチ毎に記憶可能な先頭波形記憶領域を含む第２の記憶手段と、
各ピッチに対応するキーが所定の順序で配列され、当該いずれかのキー操作により発音すべき楽音のピッチを取得するキーボードと、
前記いずれかのキー操作によるピッチを取得する前に、前記先頭波形記憶領域にピッチ毎の先頭波形データを事前に記憶させる先頭波形記憶制御手段と、
前記いずれかのキー操作によるピッチ取得に応答して、当該操作されたキーに隣接する複数のキー夫々に対応するピッチの部分波形データを前記第１の記憶手段から読み出して、前記第２の記憶手段の空いている領域に順次記憶させる周辺ピッチ波形記憶制御手段と、
前記ピッチ取得に応答して、前記複数の領域に記憶される部分波形データのうち、前記取得されたピッチに対応する前記先頭波形記憶領域に記憶された先頭波形データを先頭に所定の順番で読み出すとともに、読出しの終了した領域に記憶された波形データを消去する読出し手段と、
前記取得されたピッチに対応する波形データにおいて、当該波形データを分割して得られる複数の部分波形データ夫々を所定の順番で前記第１の記憶手段から読み出して前記第２の記憶手段の空いている領域に順次記憶させる記憶制御手段と、
を具備することを特徴とする楽音発生装置。
【請求項２】
前記記憶制御手段は、前記読出し手段にて読み出しの行なわれている領域において、当該領域に記憶された部分波形データが所定量読み出されるに応答して、前記第２記憶手段の空いている領域に前記部分波形データの記憶を開始させることを特徴とする請求項１記載の楽音発生装置。
【請求項３】
発音させるべき楽音の波形データを、当該楽音のピッチ毎に記憶する第１の記憶手段と、前記波形データの一部分が記憶可能な領域を複数有するとともに、当該複数の領域は、前記複数の部分波形データのなかで先頭に位置する先頭波形データをピッチ毎に記憶可能な先頭波形記憶領域を含む第２の記憶手段と、各ピッチに対応するキーが所定の順序で配列され、当該いずれかのキー操作により発音すべき楽音のピッチを取得するキーボードと、を有する楽音発生装置として用いられるコンピュータに、
前記いずれかのキー操作によるピッチを取得する前に、前記先頭波形記憶領域にピッチ毎の先頭波形データを事前に記憶させる先頭波形記憶制御機能と、
前記いずれかのキー操作によるピッチ取得に応答して、当該操作されたキーに隣接する複数のキー夫々に対応するピッチの部分波形データを前記第１の記憶手段から読み出して、前記第２の記憶手段の空いている領域に順次記憶させる周辺ピッチ波形記憶制御機能と、
前記ピッチ取得に応答して、前記複数の領域に記憶される部分波形データのうち、前記取得されたピッチに対応する前記先頭波形記憶領域に記憶された先頭波形データを先頭に所定の順番で読み出すとともに、読出しの終了した領域に記憶された波形データを消去する読出し機能と、
前記取得されたピッチに対応する波形データにおいて、当該波形データを分割して得られる複数の部分波形データ夫々を所定の順番で前記第１の記憶手段から読み出して前記第２の記憶手段の空いている領域に順次記憶させる記憶制御機能と、
を実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、楽音の波高値の時間変化を表す波形データを用いて発音させるべき楽音の波高値を順次、生成しその楽音を発音させる楽音発生装置に関する。
【背景技術】
【０００２】
楽音の発音は通常、予め定めた時間間隔で楽音の波高値を生成することで行われる。生成された波高値をＤ／Ａ変換し、それによって得られたアナログ信号（オーディオ信号）を音声に変換することにより、その楽音が発音される。
【０００３】
そのような波高値の生成を行う方式として、楽音の波高値の時間変化を表す波形データを用いて行うＰＣＭ音源方式が知られている（特許文献１〜４）。そのＰＣＭ音源方式では一般的に、楽音（波形）を予め定めたサンプリング周期でサンプリングして得られた波形データが用いられる。人工的に作り出した、或いは作り出せる楽音では、その波形データは直接、生成することができる（特許文献１）。
【０００４】
大部分の楽音は、発音中に固有の時間変化をする。このため、波形データとしては、楽音の発音中の時間変化を再現できるものが用意されるのが普通である。そのような波形データは、多くのサンプリングデータ（波高値）から構成される。それにより、一部のサンプリングデータを繰り返し読み出すことで発音時間を制御することを想定した波形データ（特許文献３）であっても、そのデータ量は大きいのが実情である。
【０００５】
その波形データは通常、楽音のピッチによって変化する。しかし、波形データの大きさから、ＰＣＭ音源方式を採用した従来の楽音発生装置は、複数の波形データのみを用意し、波形データ毎にそれぞれ異なるピッチ範囲を割り当てていた。それにより、ピッチ範囲内の各ピッチの楽音は同じ波形データを用いて発音させていた。その場合、ピッチの相違は、波形データからサンプリングデータを読み出す速さ（歩進幅）を変化させることで実現される。
【０００６】
より高音質の楽音を発音できるようにするには、波形データはピッチ毎に用意すべきと言える。楽音の発音に用いる波形データは、高速な処理を行う必要から、アクセス速度の速い半導体メモリ（記憶装置）に用意しておかなければならない。このため、ピッチ毎に用意した波形データを単に半導体メモリにコピー（展開）すると、半導体メモリに占める波形データの割合（専有率）が高くなってしまうことが考えられる。その割合が高くなると、他の処理のために半導体メモリのなかで利用可能な部分が少なくなるから、その処理を高速に行えないといった不具合が発生しやすくなる。このことから、大容量の半導体メモリが搭載されることも多くはなっているが、ピッチ毎に波形データを用意する場合には、半導体メモリの専有率を抑えることも重要であると考えられる。
【特許文献１】特許第２５７１５５９号
【特許文献２】特許第２５８５５１９号
【特許文献３】特開昭５８−１７８３９５号公報
【特許文献４】特開平１１−２９６１７４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明の課題は、半導体メモリの専有率を抑えつつ、ピッチ毎に用意された波形データを用いて楽音を発音できる楽音発生装置を提供することにある。
【課題を解決するための手段】
【０００８】
本発明の楽音発生装置は、発音させるべき楽音の波形データを、当該楽音のピッチ毎に記憶する第１の記憶手段と、前記波形データの一部分が記憶可能な領域を複数有するとともに、当該複数の領域は、前記複数の部分波形データのなかで先頭に位置する先頭波形データをピッチ毎に記憶可能な先頭波形記憶領域を含む第２の記憶手段と、各ピッチに対応するキーが所定の順序で配列され、当該いずれかのキー操作により発音すべき楽音のピッチを取得するキーボードと、前記いずれかのキー操作によるピッチを取得する前に、前記先頭波形記憶領域にピッチ毎の先頭波形データを事前に記憶させる先頭波形記憶制御手段と、前記いずれかのキー操作によるピッチ取得に応答して、当該操作されたキーに隣接する複数のキー夫々に対応するピッチの部分波形データを前記第１の記憶手段から読み出して、前記第２の記憶手段の空いている領域に順次記憶させる周辺ピッチ波形記憶制御手段と、前記ピッチ取得に応答して、前記取得されたピッチに対応する前記複数の領域に記憶される部分波形データのうち、前記先頭波形記憶領域に記憶された先頭波形データを先頭に所定の順番で読み出すとともに、読出しの終了した領域に記憶された波形データを消去する読出し手段と、前記取得されたピッチに対応する波形データにおいて、当該波形データを分割して得られる複数の部分波形データ夫々を所定の順番で前記第１の記憶手段から読み出して前記第２の記憶手段の空いている領域に順次記憶させる記憶制御手段と、を具備することを特徴とする。
【０００９】
なお、前記記憶制御手段は、前記読出し手段にて読み出しの行なわれている領域において、当該領域に記憶された部分波形データが所定量読み出されるに応答して、前記第２記憶手段の空いている領域に前記部分波形データの記憶を開始させる、ことが望ましい
【００１０】
本発明のプログラムは、発音させるべき楽音の波形データを、当該楽音のピッチ毎に記憶する第１の記憶手段と、前記波形データの一部分が記憶可能な領域を複数有するとともに、当該複数の領域は、前記複数の部分波形データのなかで先頭に位置する先頭波形データをピッチ毎に記憶可能な先頭波形記憶領域を含む第２の記憶手段と、各ピッチに対応するキーが所定の順序で配列され、当該いずれかのキー操作により発音すべき楽音のピッチを取得するキーボードと、を有する楽音発生装置として用いられるコンピュータに、前記いずれかのキー操作によるピッチを取得する前に、前記先頭波形記憶領域にピッチ毎の先頭波形データを事前に記憶させる先頭波形記憶制御機能と、前記いずれかのキー操作によるピッチ取得に応答して、当該操作されたキーに隣接する複数のキー夫々に対応するピッチの部分波形データを前記第１の記憶手段から読み出して、前記第２の記憶手段の空いている領域に順次記憶させる周辺ピッチ波形記憶制御機能と、前記取得されたピッチに対応する前記ピッチ取得に応答して、前記複数の領域に記憶される部分波形データのうち、前記先頭波形記憶領域に記憶された先頭波形データを先頭に所定の順番で読み出すとともに、読出しの終了した領域に記憶された波形データを消去する読出し機能と、前記取得されたピッチに対応する波形データにおいて、当該波形データを分割して得られる複数の部分波形データ夫々を所定の順番で前記第１の記憶手段から読み出して前記第２の記憶手段の空いている領域に順次記憶させる記憶制御機能と、を実現させる。
【発明の効果】
【００１１】
本発明は、ピッチ毎に用意した楽音の波高値の時間変化を表す波形データを用いて、発音させるべき楽音の波高値を生成する場合に、その波形データを分割して得られる複数の部分波形データのなかで先頭に位置する第１の部分波形データを波形データ（ピッチ）毎に半導体メモリ等の記憶装置に記憶させ、その第１の部分波形データに続く部分波形データである第２の部分波形データは状況に応じて随時、動的にその記憶装置に記憶させる。そのため、波形データを全て記憶装置に記憶させる場合と比較して、波形データがその記憶装置に占める専有率を低く抑えることができる。それにより、記憶装置は多くの処理の実行用として、より適切な形で共有化することができる。楽音は、ピッチ毎に用意した波形データを用いて発音させるため、より高音質の楽音を発音できることとなる。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
＜第１の実施の形態＞
図１は、第１の実施の形態による楽音発生装置の構成を説明する図である。
【００１３】
その楽音発生装置１０は、図１に示すように、装置１０全体の制御を行うＣＰＵ１１と、そのＣＰＵ１１がワークに用いるＲＡＭ１２と、ＣＰＵ１１が実行するプログラムや各種制御用データ、及び波形データ等を格納したＲＯＭ１０３と、例えばキーボードやポインティングデバイス（マウス等）、ＣＤ−ＲＯＭやＤＶＤ等の記録媒体にアクセスする媒体駆動装置、及びそれらのインターフェース等からなる入力部１４と、表示装置に画像を表示させる表示部１５と、外部装置との間でＭＩＤＩデータを送受信するためのＭＩＤＩインターフェース（Ｉ／Ｆ）１６と、発音させる楽音のデジタルデータ（波高値）を外部装置に出力するためのオーディオインターフェース（Ｉ／Ｆ）１７と、を備えた構成となっている。
【００１４】
上記ＭＩＤＩ  Ｉ／Ｆ１６には、キーボード２１、及びそれに対する操作内容を示すＭＩＤＩデータを生成して出力するＭＩＤＩインターフェース（Ｉ／Ｆ）２２を備えた電子楽器２０が接続され、上記オーディオＩ／Ｆ１７には、波高値を入力して音声に変換できる音源システム３０が接続されている。それにより、本実施の形態による楽音発生装置１０は、電子楽器２０のＭＩＤＩ  Ｉ／Ｆ２２からＭＩＤＩデータを入力して、そのＭＩＤＩデータにより発音が指示された楽音の波高値を生成し、それを音源システム３０に出力することにより楽音を発音させるようになっている。音源システム３０は、例えばＤ／Ａ変換器、アンプ、及びスピーカを少なくとも備えたものである。
【００１５】
その楽音発生装置１０は、例えばパーソナルコンピューター（ＰＣ）に、楽音発生装置１０として動作させるためのアプリケーション・プログラム（以下「アプリケーション」）を搭載させることにより実現させている。そのアプリケーションは、例えば入力部１４を構成する媒体駆動装置がアクセス可能な記録媒体に記録して提供するものである。そのアプリケーションは、インターネット等のネットワークを介して配信するようにしても良い。
【００１６】
アプリケーションを搭載（インストール）できるように、ＲＯＭ１３としては書き込み可能なメモリ（例えばフラッシュメモリ）が採用されている。そのアプリケーションが記録された記録媒体には、楽音の波高値を生成するための各種波形データが多数、記録されている。その波形データのなかには、ピッチ毎に用意したものが存在する。楽音発生装置１０を実現させるＰＣは、ＲＯＭ１３の他に、或いはその代わりにハードディスク装置等の補助記憶装置を搭載したものであっても良い。そのアプリケーションについては以降「楽音発生アプリケーション」と呼ぶことにする。
【００１７】
ピッチ毎に用意した波形データは、ＲＯＭ１３に保存させることができるようになっている。また、必要に応じて、記録媒体からコピーすることもできるようにしている。ここでは説明上、便宜的にＲＯＭ１３に保存されている場合のみを想定する。楽音の発音に用いる波形データとしては、同様にピッチ毎に用意した波形データのみを想定する。
【００１８】
ＲＯＭ１３に保存した波形データは、ＲＡＭ１２にコピーして使用している。これは、一般的にＲＡＭ１２はＲＯＭ１３よりもアクセス速度が速いからである。それにより、より高速に、発音させるべき楽音の波高値を生成できるようにしている。
【００１９】
波形データをピッチ毎に用意することにより、それを構成するサンプリングデータ（波高値）は単に順次、読み出せば良いようにしている。それにより、データを読み出す速さ（歩進幅）に応じた補間を行わなくとも良いようにしている。その補間演算を行う必要性を回避させたため、発音させるべき楽音の波高値はより簡単に生成することができる。
【００２０】
本実施の形態では、各波形データは３つに分割して、つまり発音開始時に用いる部分の波形データ（第１の部分波形データ。以降「先頭波形データ」と呼ぶ）、その後の発音に用いる部分の波形データ（以降「中間波形データ」と呼ぶ）、及び更にその後の発音に用いる部分の波形データ（以降「最終波形データ」と呼ぶ）に分割して用意している（それらは共に第２の部分発音データに相当）。中間波形データ、及び最終波形データは、そのうちの一方による発音が終了した後、他方による発音を行うものとして用意している。それにより、先頭波形データによる発音が終了した後は、楽音の発音自体が終了するまでの間、中間波形データ→最終波形データ、最終波形データ→中間波形データ、のように交互に発音用の部分波形データの切り換えるようにしている。
【００２１】
本実施の形態では、上記先頭波形データは波形データ（ピッチ）毎にＲＡＭ１２に予めロード（コピー）する。その後は、ユーザーの電子楽器２０への演奏操作によって入力するＭＩＤＩデータで発音開始が指示された楽音のピッチに対応する中間波形データをロードする。その後は、その楽音の発音を終了させるまでの間、最終波形データ、中間波形データを交互にロードし、それらのうちの一方は不必要になった段階で消去する。このことから、ＲＡＭ１２に保存される先頭波形データ以外の部分波形データは、楽音の発音開始を指示するＭＩＤＩデータの入力、発音開始から経過した時間、その消音を指示するＭＩＤＩデータの入力等による消音、といった状況に応じて変化することとなる。
【００２２】
そのようにして、先頭波形データ以外の部分波形データは、必要なもののみを必要な間だけＲＡＭ１２に保存させている。このため、ＲＡＭ１２に保存させた波形データがそれに占める割合（専有率）は、各部分波形データを波形データ毎に全て保存させた場合と比較して大幅に小さくさせることができる。それにより、楽音の発音に係わらない処理（上記楽音発生アプリケーション以外のプログラムの実行による処理）における速度の低下はより回避、或いはより抑えることができる。ピッチ毎に用意した波形データを用いて楽音を発音させるため、より高音質の楽音を発音させることができる。
【００２３】
上述したような先頭波形データ以外の部分波形データのＲＡＭ１２への保存を実現するために、本実施の形態では、図２〜図５に示す各種データを管理している。図２〜図５を参照して、それらのデータについて具体的に説明する。
【００２４】
図２は、音色データの構成を説明する図である。その音色データは、波形データを音色単位で管理するために音色毎に用意されるデータである。図２に示すように、音色データは、対応するチャンネル番号を示すデータｉＩＤ、発音中の楽音数を示すデータｉＮｏｔｅＯｎＣｎｔ、対応するピッチデータのなかで先頭ピッチ（例えば最低ピッチ）のピッチデータの格納場所を示すデータｐＴＤ、前の音色データの格納場所を示すデータｐＰｒｅｖ、及び次の音色データの格納場所を示すデータｐＮｅｘｔ、を備えている。
【００２５】
図３は、ピッチデータの構成を説明する図である。そのピッチデータは、音色毎、ピッチ毎に用意されるデータであり、上記データｐＴＤとしては、対応する音色での先頭ピッチのピッチデータの格納場所を示すデータがそれぞれの音色データに格納される。図３に示すように、ピッチデータは、対応するピッチを示すデータｉＰｉｔｃｈ（ピッチ番号：ノートナンバー）、そのピッチの楽音の状態を示すデータｉＳｔａｔｕｓ（０の値は消音中、１の値は発音中、２の値は消音処理中、をそれぞれ表す）、対応するソースデータの格納場所を示すデータｐＳＤ、前のピッチデータの格納場所を示すデータｐＰｒｅｖ、及び次のピッチデータの格納場所を示すデータｐＮｅｘｔ、を備えている。
【００２６】
図４は、ソースチデータの構成を説明する図である。そのソースデータは、波形データ毎に用意されるデータである。図４に示すように、ソースデータは、対応する波形データのＲＡＭ１２にコピーされた先頭波形データの先頭アドレスを示すデータｐＤＡｔａ［０］、ＲＡＭ１２にコピーされた中間波形データの先頭アドレスを示すデータｐＤＡｔａ［１］、ＲＡＭ１２にコピーされた最終波形データの先頭アドレスを示すデータｐＤＡｔａ［２］、波形データのファイル名（オリジナルの格納場所）を示すデータｆｉｌｅＮａｍｅ、その波形データ全体の長さを示すデータｆＬｅｎｇｔｈ、波高値生成用に参照中の部分波形データ（図中「バッファ」と表記）を示すデータｉＩｎｄｅｘ、波形データが対応するベロシティ範囲の下限値を示すデータｍｉｎＶｅｌ、その上限値を示すデータｍａｘＶｅｌ、前のピッチデータの格納場所を示すデータｐＰｒｅｖ、及び次のピッチデータの格納場所を示すデータｐＮｅｘｔ、を備えている。
【００２７】
図５は、発音データの構成を説明する図である。その発音データは、発音中の波形データ毎に用意されるデータである。図５に示すように、発音データは、識別情報であるデータｉＩＤ、対応する音色データ（チャンネル）を示すデータｉＴｏｎｅ（例えば対応する音色データ中のデータｉＩＤ）、楽音のピッチを示すデータｉＰｉｔｃｈ、そのベロシティを示すデータｉＯｎＶｅｌ、そのピッチの楽音の状態を示すデータｉＳｔａｔｕｓ（０の値は消音中、１の値は発音中、２の値は消音処理中、をそれぞれ表す）、対応するソースデータの格納場所を示すデータｐＳＤ、発音開始時刻を示すデータｌＯｎＳｔａｒｔ、その消音開始時刻を示すデータｌＯｆｆＳｔａｒｔ、消音処理中での減衰率を示すデータｆＲｅｌｅａｓｅ、前の発音データの格納場所を示すデータｐＰｒｅｖ、及び次のピッチデータの格納場所を示すデータｐＮｅｘｔ、を備えている。上記データｉＯｎＶｅｌは電子楽器２０から入力するＭＩＤＩデータ中から抽出したベロシティ値である。そのベロシティ値は、周知のように、押鍵時の速さ、つまり楽音を発音させる強さを表している。
【００２８】
上記発音データ以外のデータ、つまり音色データ、ピッチデータ、及びソースデータは、例えば楽音発生アプリケーションの実行中、消去させないデータとしている。このことから、ＲＡＭ１２への先頭波形データ以外の部分波形データのロード（コピー）は、状況により、必要に応じて発音データの生成、或いは消去をしながら、存在する発音データを含む各種データを随時、更新していくことで行うようになっている。以降は図６〜図１０に示す各種フローチャートを参照して、それらのデータを管理しながら必要な部分波形データをＲＡＭ１２に保存させる楽音発生装置１０の動作について詳細に説明する。
【００２９】
図６は、全体処理のフローチャートである。これは、上記楽音発生アプリケーションを起動させてから終了させるまでの間に実行する処理を抜粋してその流れを示したものである。それにより、ＣＰＵ１１が、その楽音発生アプリケーションをＲＯＭ１３からＲＡＭ１２に読み出して実行することで実現される。始めに図６を参照して、その全体処理について詳細に説明する。
【００３０】
先ず、ステップ１０１では、ＭＩＤＩ  Ｉ／Ｆ１６用のドライバをＲＯＭ１３からＲＡＭ１２にロードして起動させる。続くステップ１０２では、同様にオーディオＩ／Ｆ１７用のドライバをロードして起動させる。以降は、発音させるべき楽音の波高値（オーディオデータ）をオーディオＩ／Ｆ１７から出力するためのオーディオデータ出力スレッドを起動させ（ステップ１０３）、音色定義ファイルとしてＲＯＭ１３に保存されている図２〜図４に示す各種データを読み込んでＲＡＭ１２に展開し（ステップ１０４）、波形データ毎にその先頭波形データ（図中「音色データ」と表記）をＲＯＭ１３から読み出してＲＡＭ１２にロードする（ステップ１０５）。そのロードにより初期化が終了し、ステップ１０６に移行して、入力部１４、或いはＭＩＤＩ  Ｉ／Ｆ１６によるデータの入力を待つ。ここでは、入力部１４を操作してのデータ入力については、楽音発生アプリケーションの終了指示のみを想定する。
【００３１】
電子楽器２０のキーボード２１を構成するキー（鍵）をユーザーが押鍵、或いは離鍵すると、ＭＩＤＩ  Ｉ／Ｆ２２はその演奏操作の内容、及びその操作が行われたキーに応じたＭＩＤＩデータを生成して楽音発生装置１０のＭＩＤＩ  Ｉ／Ｆ１６に出力する。入力部１４を構成するキーボード、或いはポインティングデバイスを操作すると、その操作内容が入力部１４からＣＰＵ１１に通知される。それにより、ステップ１０６からステップ１０７に移行し、入力が楽音発生アプリケーションの終了コマンドか否か判定する。そのアプリケーションを終了させるための操作をユーザーが入力部１４に対して行った場合、判定はＹＥＳとなってステップ１１０に移行する。そうでない場合には、判定はＮＯとなってステップ１０８に移行する。
【００３２】
ステップ１０８では、入力がＭＩＤＩデータか否か判定する。ＭＩＤＩ  Ｉ／Ｆ１６がＭＩＤＩデータを入力した場合、判定ＹＥＳとなり、ステップ１０９に移行して、その入力に対応するためのＭＩＤＩ  ＩＮ処理を実行した後、上記ステップ１０６に戻る。一方、そうでない場合には、判定はＮＯとなり、そのステップ１０６に戻る。
【００３３】
上記ステップ１０７の判定がＹＥＳとなって移行するステップ１１０では、オーディオデータ出力スレッドを終了させる。その終了は、例えばそのスレッド終了管理用の変数に、終了を指示する値を代入することで行う。以降は、ＲＡＭ１２に格納されている図２〜図５に示す各種データを消去し（ステップ１１１）、オーディオＩ／Ｆ１７のドライバを終了（開放）させ（ステップ１１２）、ＭＩＤＩ  Ｉ／Ｆ１６のドライバを終了（開放）させる（ステップ１１３）。そのようにして各種ドライバやデータをＲＡＭ１２から消去させた後、一連の処理を終了、つまり楽音発生アプリケーションを終了させる。
【００３４】
図７は、上記ステップ１０９として実行されるＭＩＤＩ  ＩＮ処理のフローチャートである。次にそのＩＮ処理について、図７に示すそのフローチャートを参照して詳細に説明する。
【００３５】
このＩＮ処理は、ＭＩＤＩ  Ｉ／Ｆ１７を介して入力したＭＩＤＩデータに対応するための処理である。そのＭＩＤＩデータの種類は多数、存在するが、ここでは本発明に特に係わるデータ、つまりノートオンメッセージ、ノートオフメッセージの２種類のＭＩＤＩデータのみにのみ注目して説明する。
【００３６】
先ず、ステップ２０１では、入力したＭＩＤＩデータが楽音の発音開始を指示するノートオンメッセージか否か判定する。そのＭＩＤＩデータがノートオンメッセージでなかった場合、判定はＹＥＳとなってステップ２０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ２０２に移行する。
【００３７】
ステップ２０２では、入力したＭＩＤＩデータから、チャンネル番号、ノートナンバー（ピッチ）、及びベロシティ値を抽出し、それぞれ変数ｉｃｈ、ｉＰｉｔ、及びｉＶｅｌに代入する。続くステップ２０３では、変数ｉｃｈ、ｉＰｉｔの各値で指定されるピッチデータ、つまり新たに楽音の発音開始が指示されたチャンネル、そのピッチから対応するピッチデータを特定してそのインデクス値を変数ｔｄに代入し、その変数ｔｄの値で指定されるピッチデータを更新する。具体的にはデータｉＳｔａｔｕｓの値を１に変更する。対応する音色データ中のデータｉＮｏｔｅＯｎＣｎｔは、その値をインクリメントして更新する。その後、ステップ２０４に移行する。
【００３８】
ステップ２０４では、発音データの格納用にＲＡＭ１２に確保した領域中から、発音データが格納されていない場所（位置）を特定し、その場所を示すインデクス値を変数ｎｄに代入する。次に移行するステップ２０５では、変数ｎｄの値で指定される場所に発音データを格納する。具体的には、データｉＴｏｎｅ（図中「ｎｄ．ｉＴｏｎｅ」と表記）として変数ｉｃｈの値、データｉＰｉｔｃｈ（図中「ｎｄ．ｉＰｉｔｃｈ」と表記）として変数ｉＰｉｔの値、データｉＯｎＶｅｌ（図中「ｎｄ．ｉＯｎＶｅｌ」と表記）として変数ｉＶｅｌの値、データｉＳｔａｔｕｓ（図中「ｎｄ．ｉＳｔａｔｕｓ」と表記）として１、データｐＳＤ（図中「ｎｄ．ｐＳＤ」と表記）として対応するピッチデータのデータｐＳＤ（図中「ｔｄ．ｐＳＤ」と表記）、データｌＯｎＳｔａｒｔ（図中「ｎｄ．ｌＯｎＳｔａｒｔ」と表記）として現在時刻を示す値、をそれぞれ格納する。その後、一連の処理を終了する。
【００３９】
このようにして、ノートオンメッセージのＭＩＤＩデータの入力により、そのＭＩＤＩデータから特定される音色データ、ピッチデータが更新され、発音データが新たに生成される。
【００４０】
上記ステップ２０１の判定がＮＯとなって移行するステップ２０６では、入力したＭＩＤＩデータが楽音の発音終了を指示するノートオフメッセージか否か判定する。そのＭＩＤＩデータがノートオフメッセージだった場合、判定はＹＥＳとなってステップ２０７に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００４１】
ステップ２０７では、入力したＭＩＤＩデータから、チャンネル番号、及びノートナンバー（ピッチ）を抽出し、それぞれ変数ｉｃｈ、及びｉＰｉｔに代入する。続くステップ２０８では、変数ｉｃｈ、ｉＰｉｔの各値で指定される発音データ（それら各値をデータｉＴｏｎｅ、ｉＰｉｔｃｈとして格納している発音データ）を特定してそのインデクス値を変数ｔｄに代入する。また、変数ｉｃｈ、ｉＰｉｔの各値で指定されるピッチデータを特定してそのインデクス値を変数ｔｄに代入し、その変数ｔｄの値で指定されるピッチデータのデータｉＳｔａｔｕｓの値を２に変更する。その変更後は、ステップ２０９に移行して、変数ｎｄの値で指定される発音データ中のデータｉＳｔａｔｕｓとして２、データｆＲｅｌｅａｓｅ（図中「ｎｄ．ｆＲｅｌｅａｓｅ」と表記）として１．０、データｌＯｆｆＳｔａｒｔ（図中「ｎｄ．ｌＯｆｆＳｔａｒｔ」と表記）として現在時刻を示す値、をそれぞれ格納する。そのようにして、ノートオフメッセージのＭＩＤＩデータにより特定されるピッチデータ、及び発音データを更新した後、一連の処理を終了する。
【００４２】
図８は、図６に示す全体処理内のステップ１０３で起動されるオーディオデータ出力スレッドの実行により実現される処理のフローチャートである。次に図８を参照して、その処理について詳細に説明する。この出力スレッドは、サンプリング周期でオーディオＩ／Ｆ１７を介して出力する、発音させるべき楽音の波高値（オーディオデータ）を生成するためのものである。
【００４３】
先ず、ステップ３０１では、各種変数に初期値を代入し、オーディオＩ／Ｆ１７を介して出力するオーディオデータ一時格納用の領域（出力バッファ）をＲＡＭ１２に確保するといった初期化を行う。次のステップ３０２では、終了が指示されたか否か判定する。上述したように、図６に示す全体処理のステップ１１０では、オーディオデータ出力スレッドの終了管理用の変数に、終了を指示する値を代入する。このことから、その変数にその値が代入されていた場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップ３０３に移行する。
【００４４】
ステップ３０３では、発音させるべき楽音のオーディオデータを作成（生成）して出力バッファに格納するための出力データ作成処理を実行する。次に移行するステップ３０４では、出力バッファに格納されたオーディオデータをサンプリング周期で順次、出力するための処理を実行する。その実行後は上記ステップ３０２に戻る。それにより、楽音発生アプリケーションの起動中は、ステップ３０２〜３０４で形成される処理ループを繰り返し実行する。
【００４５】
次に、上記ステップ３０３として実行される出力データ作成処理について、図９に示すそのフローチャートを参照して詳細に説明する。その作成処理では、複数のサンプリング周期分のオーディオデータを一度に作成し、出力バッファに保存するようにしている。図中の「ｌＳａｍｐｌｅｓ」は一度に作成するオーディオデータ数を示す定数である。
【００４６】
先ず、ステップ４０１では、変数ｉに０を代入する。続くステップ４０２では、変数ｉの値が定数ｌＳａｍｐｌｅｓ未満か否か判定する。変数ｉの値は、１サンプリング周期分のオーディオデータを作成する度にインクリメントするようになっている。このため、一度に作成すべきオーディオデータを全て作成していない場合、変数ｉの値は定数ｌＳａｍｐｌｅｓ未満の関係を満たすから、判定はＹＥＳとなってステップ４０２に移行する。そうでない場合には、つまり作成すべきオーディオデータを全て作成した場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００４７】
ステップ４０３では、変数ｉの値を定数ｌＳＲで割った値を変数ｌＴｉｍｅの値に加算して得られる値（＝ｌＴｉｍｅ＋ｉ／ｌＳＲ）を変数ｌＳＴｉｍｅに代入する。変数ｌＴｉｍｅに代入された値は、次のオーディオデータを出力すべき時刻を示す値であり、定数ｌＳＲは、出力バッファに格納したオーディオデータのサンプリングレートを示す値である。それにより、変数ｉの値を定数ｌＳＲで割った値は、変数ｉの値にサンプリング周期を掛けた値（時間を示す値）である。このことから、変数ｌＳＴｉｍｅには、対象とするオーディオデータを出力すべき時刻を示す値が代入される。その代入後はステップ４０４に移行する。
【００４８】
ステップ４０４では、１サンプリング周期分のオーディオデータ作成用の変数ｉＶａｌｕｅに０を代入する。次のステップ４０５では、変数ｎｄに、発音データ格納用領域の先頭に位置する発音データの格納場所を指定するインデクス値を代入する。その次に移行するステップ４０６では、変数ｎｄの値で指定される格納場所に発音データが存在するか否か判定する。その発音データが存在しない場合、判定はＮＯとなってステップ４１６に移行する。そうでない場合には、判定はＹＥＳとなってステップ４０７に移行する。
【００４９】
ステップ４０７では、変数ｎｄの値で指定される格納場所のデータｉＳｔａｔｕｓの値が消音中を示す０でないか否か判定する。その値が０であった場合、判定はＮＯとなってステップ４１０に移行する。そうでない場合には、判定はＹＥＳとなってステップ４０８に移行する。
【００５０】
ステップ４０７でのＹＥＳの判定は、現在、注目している発音データに対応する楽音は発音すべきものであることを意味する。このことから、ステップ４０９では、その楽音を発音させるためのサンプリングデータをＲＡＭ１２から読み出すためのサンプリングデータ読み取り処理を実行する。その実行によって変数ｉＶｔｍｐには、そのサンプリングデータが代入される。
【００５１】
ステップ４０８に続くステップ４０９では、そのデータｉＳｔａｔｕｓの値が２か否か判定する。現在、注目している発音データに対応する楽音が消音処理中であった場合、判定はＹＥＳとなってステップ４１２に移行する。そうでない場合には、判定はＮＯとなり、変数ｉＶａｌｕｅに、それまでの値に変数ｉＶｔｍｐの値を加算した値（＝ｉＶａｌｕｅ＋ｉＶｔｍｐ）を代入し（ステップ４１０）、変数ｎｄに次の発音データの格納場所を示すインデクス値を代入する（ステップ４１１）。その代入後は上記ステップ４０６に戻る。
【００５２】
このように、消音処理中でない楽音では、ステップ４０８のサンプリングデータ読み取り処理の実行によって変数ｉＶｔｍｐに代入されたサンプリングデータは変数ｉＶａｌｕｅのそれまでの値に加算される。それにより、消音処理を開始するまではサンプリングデータ（波形データ）に従って発音させている。
【００５３】
上記ステップ４０９の判定のＹＥＳとなって移行するステップ４１２〜４１５では、消音したと見なせるまで、発音させる楽音の音量を徐々に小さくさせていくための処理が行われる。波形データを構成するサンプリングデータの値は大きく変化することから、消音したと見なせるか否かの判定は、消音処理中に更新していくデータｆＲｅｌｅａｓｅの値により行っている。図中の「ＲＥＤ＿ＯＦＦ」「ＲＥＬＥＡＳＥ」はそれぞれ、その判定用に設定した定数、データｆＲｅｌｅａｓｅ更新用に設定した定数である。
【００５４】
先ず、ステップ４１２では、変数ｉＶｔｍｐに、注目している発音データ中のデータｆＲｅｌｅａｓｅの値をそれまでの値に掛けて得られる値（＝ｉＶｔｍｐ＊ｆＲｅｌｅａｓｅ）を代入する。続くステップ４１３では、そのデータｆＲｅｌｅａｓｅの値が定数ＲＥＤ＿ＯＦＦ未満か否か判定する。その値が定数ＲＥＤ＿ＯＦＦ以上であった場合、判定はＮＯとなり、ステップ４１４でデータｆＲｅｌｅａｓｅをそれまでの値に定数ＲＥＬＥＡＳＥを掛けた値に更新した後、上記ステップ４１０に移行する。そうでない場合には、判定はＹＥＳとなってステップ４１５に移行し、データｉＳｔａｔｕｓの値を０に、その他のデータをリセットする操作を行うことで該当する発音データを消去すると共に、他の対応する各種データの更新、及び楽音の発音用にＲＡＭ１２にロードした部分波形データの消去（開放）を行う。その開放により、発音データを消去した楽音の発音用の部分波形データは先頭波形データのみとなる。発音データ以外の各種データの更新は、音色データではデータｉＮｏｔｅＯｎＣｎｔの値をデクリメントする更新、ピッチデータではデータｉＳｔａｔｕｓの値を０にする更新、ソースデータでは先頭波形データを示す値にデータｉＩｎｄｅｘを変更する更新、をそれぞれ行う。そのような更新を行った後、上記ステップ４１０に移行する。
【００５５】
上記ステップ４１５では、発音データの消去に併せて、その発音データの格納場所を示すインデクス値をデータｐＰｒｅｖ、或いはｐＮｅｘｔとして有する発音データはデータｐＰｒｅｖ、或いはｐＮｅｘｔを更新する。消去する発音データが最後に位置するもの、つまりその格納場所を示すインデクス値が最大のものでなければ、発音データを消去した格納場所に別の発音データを移動させて、発音データが先頭から連続するようにさせる。それにより、変数ｎｄの値で指定される格納場所に発音データが存在しないことでステップ４０６の判定がＮＯとなった場合には、他に注目すべき発音データが存在しないようにさせている。他に注目すべき発音データが存在しないことは、１サンプリング周期分のオーディオデータの作成が終了したことを意味する。
【００５６】
そのステップ４０６の判定がＮＯとなって移行するステップ４１６では、変数ｉＶａｌｕｅの値を１サンプリング周期分のオーディオデータとして、変数ｌＳｔｉｍｅの値と共に、出力バッファの変数ｉの値で指定される格納場所に格納する。その格納後は、ステップ４１７で変数ｉの値をインクリメントしてから上記ステップ４０２に戻る。
【００５７】
図１０は、上記ステップ４０８として実行されるサンプリングデータ読み取り処理のフローチャートである。最後に図１０を参照して、そのデータ読み取り処理について詳細に説明する。
【００５８】
上述したように、波形データはピッチ毎に用意しているから、波形データから抽出した（読み出した）サンプリングデータは基本的にそのまま楽音の発音に用いることができる。それにより、サンプリングデータ読み取り処理では、対象とする部分発音データ中のサンプリングデータを読み出すべきサンプリングデータの位置（アドレス）を特定し、その位置のサンプリングデータを読み出すようになっている。また、必要に応じて、次に参照すべき部分波形データのＲＡＭ１２へのロード、及びロードした部分波形データの消去（開放）を行うようになっている。ここでは説明上、便宜的に全ての部分波形データは同じサイズ（同じサンプリングデータ数）として説明を行うこととする。図中に表記の「ＳＩＺＥ」はそのサイズを示す定数である。
【００５９】
先ず、ステップ５０１では、変数ｌＳｔｉｍｅの値から変数ｎｄの値で指定された格納場所に格納されている発音データ中のデータｌＯｎＳｔａｒｔの値を引いた値、つまりその発音データにより発音中の楽音の発音を開始させてから経過した時間を示す値を変数ｌＴに代入する。続くステップ５０２では、変数ｌＰｏｓに、変数ｌＴの値に定数ｌＳＲを掛けた乗算結果を定数ＳＩＺＥで割ったときに得られる余り（＝（ｌＴ＊ｌＳＲ）％ＳＩＺＥ）を代入する。その後は、注目する発音データ中のデータｐＳＤをステップ５０３で変数ｓｄに代入し、ステップ５０４に移行する。
【００６０】
ステップ５０４では、変数ｌＰｏｓの値が０か、つまりそれまで参照していた部分波形データからのサンプリングデータの読み出しが一通り終了したか否か判定する。その読み出しが一通り終了していない場合、判定はＮＯとなってステップ５０９に移行する。そうでない場合には、判定はＹＥＳとなってステップ５０５に移行する。
【００６１】
ステップ５０５〜５０８では、サンプリングデータの一通りの読み出しが終了したことにより、次に読み出しを行うべき部分波形データを別のものに切り換えるための処理が行われる。
【００６２】
先ず、ステップ５０５では、変数ｓｄの値で指定されるソースデータ中のデータｉＩｎｄｅｘの値が０でないか否か、つまりそれまで参照していた部分波形データは先頭波形データでないか否か判定する。その部分波形データが先頭波形データであった場合、判定はＮＯとなり、ステップ５０６でそのデータｉＩｎｄｅｘの値を１に更新した後、ステップ５０９に移行する。そうでない場合には、判定はＹＥＳとなってステップ５０７に移行する。
【００６３】
ステップ５０７では、データｉＩｎｄｅｘの値が示す部分波形データをＲＡＭ１２から開放（消去）する。その次のステップ５０８では、そのデータｉＩｎｄｅｘの値を、それまでの値を２で割って得られる余りに１を加算した値（＝（ｓｄ．ｉＩｎｄｅｘ）％２＋１）に更新する。ステップ５０９には、その更新を行った後に移行する。
【００６４】
データｉＩｎｄｅｘの値は０、１、或いは２である。ステップ５０７に移行する場合、その値は１、或いは２である。このため、その値が１であれば２、その値が２であれば１に更新されることになる。それにより、先頭波形データを参照した後は、楽音の発音を消音させるまでの間、中間波形データと最終波形データは交互に参照される。
【００６５】
ステップ５０９では、データｉＩｎｄｅｘの値に対応する部分波形データを参照の対象に設定する。次のステップ５１０では、対象とする部分波形データ中の変数ｌＰｏｓの値で指定されるサンプリングデータ（先頭から変数ｌＰｏｓの値番目のデータ）を読み出して変数ｉＶｔｍｐに代入する。その次のステップ５１１では、変数ｉＶｔｍｐの値、即ち読み出したサンプリングデータに発音データ中のデータｉＯｎＶｅｌの値（ベロシティ値）を反映させるために、そのサンプリングデータの値に対し、データｉＯｎＶｅｌの値を対応するソースデータ中のデータｍａｘＶｅｌの値で割った値を乗算して得られる値を変数ｉＶｔｍｐに代入する。それにより、変数ｉＶｔｍｐに代入したサンプリングデータを、ユーザーが実際に押鍵したときのベロシティ値と波形データのベロシティ範囲の上限値の比に応じて更新してからステップ５１２に移行する。
【００６６】
ステップ５１２では、変数ｌＰｏｓの値が定数ＳＩＺＥに０．８を掛けた値以上か否か判定する。その大小関係が満たされている場合、判定はＹＥＳとなってステップ５１３に移行し、データｉＩｎｄｅｘの値を２で割って得られる余りに１を加算した値に対応する部分波形データをＲＯＭ１３から読み出してＲＡＭ１２にロードした後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００６７】
上記ステップ５１３でロードされる部分波形データは、データｉＩｎｄｅｘの値が０、或いは２であれば中間波形データであり、その値が１であれば最終波形データである。そのような部分波形データを、現在、対象としている部分波形データの８０％以上、サンプリングデータを読み出した状況、つまりその部分波形データで読み出すべきサンプリングデータが残り２０％以下となった状況となると事前にＲＡＭ１２にロードさせている。それにより、参照すべき部分波形データを切り換えるタイミングでは次に参照すべき部分波形データをＲＡＭ１２に確実に用意するようにしている。
【００６８】
なお、本実施の形態では、発音させる楽音はユーザーが電子楽器２０を操作して指定するようになっているが、その指定はスタンダードＭＩＤＩファイルといった再生データにより自動的に行わせても良い。波形データについては、それを３つの部分波形データに分割しているが、その分割数はそれより多くとも少なくとも良い。そのサンプリングデータは、圧縮処理を施したものであっても良い。
＜第２の実施の形態＞
上記第１の実施の形態では、先頭波形データ以外の部分波形データは、発音させるべき楽音のオーディオデータ作成に用いる部分波形データのみをＲＡＭ１２にロードしている。これに対し、第２の実施の形態は、発音させるべき楽音とピッチが近い楽音の発音に用いられる部分波形データを事前にＲＡＭ１２にロードするようにしたものである。これは、楽曲では、或るピッチの楽音を発音させた後、それと近いピッチの楽音を発音させることが比較的に多いためである。第２の実施の形態では、そのことに着目し、次に用いる可能性が高いと考えられる部分波形データを投機的にロードしておくことにより、発音させるべき楽音は常に確実にスムーズに発音できるようにさせている。投機的にロードする部分波形データは発音させる楽音とピッチの近い楽音用のものに限定しているため、波形データによるＲＡＭ１２の専有率の上昇は僅かなものに抑えることができる。
【００６９】
第２の実施の形態における楽音発生装置の構成は、基本的に第１の実施の形態におけるそれと同じである。動作も大部分は同じか、或いは基本的に同じである。このことから、第１の実施の形態で付した符号をそのまま用いて、第１の実施の形態から異なる部分についてのみ説明する。
【００７０】
第２の実施の形態では、図６に示す全体処理内でステップ１０９として実行されるＭＩＤＩ  ＩＮ処理が第１の実施の形態から異なっている。このことから、その異なる部分について、図１１、及び図１２に示す各フローチャートを参照して詳細に説明する。
【００７１】
図１１は、第２の実施の形態におけるＭＩＤＩ  ＩＮ処理のフローチャートである。図１１に示すように、第２の実施の形態では、ステップ２０５の処理を実行した後、ステップ６０１に移行して、そのステップ２０５で生成・格納した発音データが示す楽音とピッチが近い周辺ピッチの楽音発音用の部分波形データをＲＯＭ１３から読み込んでＲＡＭ１２にロードするための周辺ピッチのデータ読み込み処理を実行する。一連の処理はその実行後に終了するようになっている。
【００７２】
図１２は、そのステップ６０１として実行される周辺ピッチのデータ読み込み処理のフローチャートである。次に図１２を参照して、そのデータ読み込み処理について詳細に説明する。
【００７３】
キーボード２１への演奏操作は、両手を使って行うことがある。このことから、本実施の形態では、キーボード２１を右手による演奏操作が行われると想定する高音域、その高音域以外の部分を左手による演奏操作が行われると想定する低音域に分け、音域毎に部分波形データの投機的なロードを行っている。図中に表記の「ＤＩＶＰＩＴ」は、それらの音域の境界となる鍵のピッチ（ノートナンバー）として設定した定数である。「ＲＮＧＨＩＧＨ」「ＲＮＧＬＯＷ」はそれぞれ、部分波形データを投機的にロードする周辺ピッチ範囲として高音域、低音域で設定した定数である。
【００７４】
先ず、ステップ７０１では、変数ｉＲｎｇに定数ＲＮＧＨＩＧＨを代入する。次のステップ７０２では、変数ｎｄの値で指定される格納場所に新たに格納した発音データが示す楽音発音用の部分波形データとして、中間波形データをＲＯＭ１３か読み込んでＲＡＭ１２にロードする。それにより、入力したＭＩＤＩデータにより発音開始が指示された楽音発音用の中間波形データを第１の実施の形態よりも早い段階でロードする。そのロード後はステップ７０３に移行する。
【００７５】
ステップ７０３では、そのＭＩＤＩデータから抽出されたピッチ（ノートナンバー）を示すデータｉＰｉｔの値が定数ＤＶＰＩＴ未満か否か、つまりそのＭＩＤＩデータが発音開始を指示する楽音が低音域に属するピッチの楽音か否か判定する。その低音域に属するピッチの楽音であった場合、判定はＹＥＳとなり、ステップ７０４で変数ｉＲｎｇに定数ＲＮＧＬＯＷを代入した後、ステップ７０５に移行する。そうでない場合には、判定はＮＯとなり、次にその０ステップ７０５の処理を実行する。
【００７６】
ステップ７０５以降では、変数ｉの値を順次、インクリメントしながら、入力したＭＩＤＩデータが発音開始を指示する楽音より変数ｉの値分だけ高音、低音となっている楽音発音用の中間波形データを必要に応じてＲＡＭ１２にロードするための処理が行われる。それにより、本実施の形態では、発音開始が指示された楽音より変数ｉＲｎｇの値分、ピッチが離れた高音、低音の楽音を対象にして、対象とする楽音（周辺ピッチの楽音）のなかで発音中でない楽音発音用の中間波形データをロードしている。
【００７７】
先ず、ステップ７０５では、変数ｉに０を代入する。続くステップ７０６では、変数ｔｈ、ｔｌにそれぞれ、新たに格納した発音データに対応するピッチデータ中のデータｐＮｅｘｔ、ｐＰｒｅｖを代入する。その次に移行するステップ７０７では、変数ｉの値が変数ｉＲｎｇの値未満か否か判定する。変数ｉの値が変数ｉＲｎｇの値以上であった場合、判定はＮＯとなり、投機的にロードすべき中間波形データは全てロードしたとして、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなってステップ７０８に移行する。
【００７８】
ステップ７０８では、変数ｔｈの値で指定されるピッチデータ中のデータｉＳｔａｔｕｓの値が０か否か、つまりそのピッチデータによって特定される楽音が消音中か否か判定する。その楽音が発音中であった場合、判定はＮＯとなってステップ７１０に移行する。そうでない場合には、判定はＹＥＳとなり、ステップ７０９でその楽音発音用の中間波形データをＲＯＭ１３から読み込んでＲＡＭ１２にロードした後、そのステップ７１０に移行する。
【００７９】
ステップ７１０では同様に、変数ｔｌの値で指定されるピッチデータ中のデータｉＳｔａｔｕｓの値が０か否か判定する。そのピッチデータによって特定される楽音が発音中であった場合、判定はＮＯとなってステップ７１２に移行する。そうでない場合には、判定はＹＥＳとなり、ステップ７１１でその楽音発音用の中間波形データをＲＯＭ１３から読み込んでＲＡＭ１２にロードした後、そのステップ７１２に移行する。
【００８０】
ステップ７１２では、変数ｔｈ、ｔｌにそれぞれ、それまでの値で指定される各ピッチデータ中のデータｐＮｅｃｔ、ｐＰｒｅｖを代入する。それにより、着目するピッチデータを高音側ではノートナンバーで１だけ大きいピッチデータに、低音側ではノートナンバーで１だけ小さいピッチデータにそれぞれ変更する。次のステップ７１３では、変数ｉの値をインクリメントする。その後は上記ステップ７０７に戻る。
【００８１】
このようにして、発音させるべきとなっていない楽音の発音用の中間波形データを事前に、つまり発音させるべきとなる前の段階でロードする。このため、特に詳細な説明は省略するが、図１０に示すサンプリングデータ読み取り処理内のステップ５１２において、データｉＩｎｄｅｘの値を２で割って得られる余りに１を加算した値に対応する部分波形データが既にロードされているか否かを併せて判定するようになっている。それにより、変数ｌＰｏｓの値が定数ＳＩＺＥに０．８を掛けた値以上であり、且つ次にロードすべき部分波形データがロードされていない場合に、その判定がＹＥＳとなるようにさせている。そのようにして、部分波形データの不必要なロードを行うことを回避させている。
【００８２】
なお、本実施の形態（第１および第２の実施の形態）では、ピッチ毎に１種類の波形データ（３つの部分波形データから構成されている）を用意しているが（ここでは音色毎に用意していることは便宜的に無視している）、波形データはベロシティによっても異なるから、ピッチ毎に対象となるベロシティ範囲が異なる複数の波形データを用意しても良い。そのように対象となるベロシティ範囲が異なる複数の波形データを用意した場合には、例えばベロシティ範囲が異なる先頭波形データを事前に全てロードしておき、部分波形データは、発音させるべき楽音のベロシティ値に応じたものを必要に応じてロードするようにすれば良い。そのようにすることにより、ピッチ毎にベロシティ値に応じた波形データを用いて楽音を発音できるようになる。
【図面の簡単な説明】
【００８３】
【図１】第１の実施の形態による楽音発生装置の構成を説明する図である。
【図２】音色データの構成を説明する図である。
【図３】ピッチデータの構成を説明する図である。
【図４】ソースデータの構成を説明する図である。
【図５】発音データの構成を説明する図である。
【図６】全体処理のフローチャートである。
【図７】ＭＩＤＩ  ＩＮ処理のフローチャートである。
【図８】オーディオデータ出力スレッドの実行によって実現される処理のフローチャートである。
【図９】出力データ作成処理のフローチャートである。
【図１０】サンプリングデータ読み取り処理のフローチャートである。
【図１１】ＭＩＤＩ  ＩＮ処理のフローチャートである（第２の実施の形態）。
【図１２】周辺ピッチのデータ読み取り処理のフローチャートである。
【符号の説明】
【００８４】
１０    楽音発生装置
１１    ＣＰＵ
１２    ＲＡＭ
１３    ＲＯＭ
１４    入力部
１５    表示部
１６、２２    ＭＩＤＩインターフェース（Ｉ／Ｆ）
１７    オーディオインクリメント（Ｉ／Ｆ）
２０    電子楽器
２１    キーボード
３０    音源システム
【図１】
0004655812.tif 000002
【図２】
0004655812.tif 000003
【図３】
0004655812.tif 000004
【図５】
0004655812.tif 000005
【図６】
0004655812.tif 000006
【図７】
0004655812.tif 000007
【図８】
0004655812.tif 000008
【図９】
0004655812.tif 000009
【図１０】
0004655812.tif 000010
【図１１】
0004655812.tif 000011
【図１２】
0004655812.tif 000012
【図４】
0004655812.tif 000013