(57)【特許請求の範囲】
【請求項１】
所定の記憶手段の所定のデータサイズのエリアを複数の分割エリアに分割するエリア分割手段と、
前記記憶手段の各分割エリアを指定するエリア指定手段と、
入力された楽音データに応じて波形データを生成するデータ生成手段と、
このデータ生成手段によって生成された波形データを前記記憶手段における前記エリア指定手段によって書き込みが指定された分割エリアに書き込むデータ書込手段と、
前記記憶手段において前記エリア指定手段によって読み出しが指定された分割エリアから記憶された波形データを読み出して出力するデータ読出手段と、
を備えた楽音発生装置において、
前記エリア分割手段は、前記データ生成手段が波形データ生成をはじめてから前記データ読み出し手段が記憶された波形データを読み出して出力し終えるまでに要した時間を測定する時間測定手段を有し、当該時間が所定値を越えていた場合には前記分割エリアのサイズを増加させることを特徴とする楽音発生装置。
【請求項２】
前記時間測定手段による時間測定は演奏に先立つ設定処理において行われることを特徴とする請求項１に記載の楽音発生装置。
【請求項３】
前記時間測定手段による時間測定は実際の楽音発生状態よりも厳しい測定条件においてなされることを特徴とする請求項１に記載の楽音発生装置。
【請求項４】
前記測定条件は実際の楽音発生状態よりもポリ数を増やした状態であることを特徴とする請求項３に記載の楽音発生装置。
【請求項５】
所定の記憶手段の所定のデータサイズのエリアを複数の分割エリアに分割するエリア分割手順と、
前記記憶手段の各エリアを指定するエリア指定手順と、入力された楽音データに応じて波形データを生成するデータ生成手順と、
このデータ生成手順によって生成された波形データを前記記憶手段における前記エリア指定手順によって書き込みが指定された分割エリアに書き込むデータ書込手順と、
前記記憶手段において前記エリア指定手順によって読み出しが指定された分割エリアから記憶された波形データを読み出して出力するデータ読出手順と、
を実行し、
前記エリア分割手順は、前記データ生成手順が波形データ生成をはじめてから前記データ読み出し手順が記憶された波形データを読み出して出力し終えるまでに要した時間を測定する時間測定手順を含み、当該時間が所定値を越えていた場合には前記分割エリアのサイズを増加させることを特徴とする楽音発生処理のプログラムを記録した記録媒体。
【請求項６】
前記時間測定手順による時間測定は測定モードおいて行われることを特徴とする請求項５に記載の楽音発生処理のプログラムを記録した記録媒体。
【請求項７】
前記時間測定手順による時間測定は実際の楽音発生状態よりも厳しい測定条件においてなされることを特徴とする請求項５に記載の楽音発生処理のプログラムを記録した記録媒体。
【請求項８】
前記測定条件は実際の楽音発生状態よりもポリ数を増やした状態であることを特徴とする請求項５に記載の楽音発生処理のプログラムを記録した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、楽音発生装置及び楽音発生処理のプログラムを記録した記録媒体に関する。
【０００２】
【従来の技術】
汎用のコンピュータ上でソフトウェアにより構成された音源、いわゆるソフト音源は、外部の演奏装置からＭＩＤＩデータ等で入力された楽音データに基づいて、デジタル信号の波形データを生成して一定の記憶容量をもつメモリに書き込み、これを読み出してＤ／Ａコンバータを介して外部のサウンドシステムに出力して発音させている。この場合において、波形データはメモリの一定の記憶容量のデータサイズ分だけ生成された後にＤ／Ａ処理される。
【０００３】
【発明が解決しようとする課題】
ところが、波形データはメモリの一定の記憶容量のデータサイズ分だけ生成された後にＤ／Ａ処理されるので、処理速度の遅いコンピュータを用いた場合には、楽音データが入力された時から波形データを生成してメモリに記憶し、実際に発音させるまでに遅延時間が発生する。この遅延時間は、一度に生成する波形データのデータサイズが大きいほど大きくなり、同時に発音するチャンネルが多いほど大きくなる。したがって、この遅延時間があまりに大きいと、楽音データの入力から発音までに時間差がありすぎて違和感を与えるという問題があった。一方、メモリの記憶容量が小さすぎる場合には、一度に生成する波形データのデータサイズは小さくなるが、読み出す波形データのデータサイズも小さくなるので、Ｄ／Ａコンバータの所定のサンプリング周期に対して読み出す波形データが足りなくなって音切れが発生するという問題があった。
本発明の課題は、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止することである。
【０００４】
【課題を解決するための手段】
本発明による楽音発生装置は所定の記憶手段の所定のデータサイズのエリアを複数の分割エリアに分割するエリア分割手段と、前記記憶手段の各分割エリアを指定するエリア指定手段と、入力された楽音データに応じて波形データを生成するデータ生成手段と、このデータ生成手段によって生成された波形データを前記記憶手段における前記エリア指定手段によって書き込みが指定された分割エリアに書き込むデータ書込手段と、前記記憶手段において前記エリア指定手段によって読み出しが指定された分割エリアから記憶された波形データを読み出して出力するデータ読出手段と、を備え、前記エリア分割手段は、前記データ生成手段が波形データ生成をはじめてから前記データ読み出し手段が記憶された波形データを読み出して出力し終えるまでに要した時間を測定する時間測定手段を有し、当該時間が所定値を越えていた場合には前記分割エリアのサイズを増加させるようになっている。
【０００５】
本発明による記録媒体は、所定の記憶手段の所定のデータサイズのエリアを複数の分割エリアに分割するエリア分割手順と、前記記憶手段の各分割エリアを指定するエリア指定手順と、入力された楽音データに応じて波形データを生成するデータ生成手順と、このデータ生成手順によって生成された波形データを前記記憶手段における前記エリア指定手順によって書き込みが指定された分割エリアに書き込むデータ書込手順と、前記記憶手段において前記エリア指定手順によって読み出しが指定された分割エリアから記憶された波形データを読み出して出力するデータ読出手順と、を実行し、前記エリア分割手順は、前記データ生成手順が波形データ生成をはじめてから前記データ読み出し手順が記憶された波形データを読み出して出力し終えるまでに要した時間を測定する時間測定手順を含み、当該時間が所定値を越えていた場合には前記分割エリアのサイズを増加させる楽音発生処理のプログラムを記憶している。
【０００７】
【発明の実施の形態】
【０００８】
以下、本発明の実施形態における楽音発生装置（コンピュータシステム）について、図を参照して説明する。このコンピュータシステムには、種々のカードすなわち回路基板を装着するスロットが設けられており、後述するように、楽音発生のために必要な複数のカードが接続されている。
【０００９】
図１は、実施形態における楽音発生装置のシステム構成を示すブロック図である。ＣＰＵ１は、バス２に接続されたビデオカード３、Ｉ／Ｏカード４、サウンドカード５、ディスクコントローラ６、メモリ７、ＭＩＤＩインターフェース８との間において、コマンド及びデータを授受して、この装置全体を制御する。
【００１０】
ビデオカード３は、ディスプレイ装置９に接続され、ＣＰＵ１の表示コマンドに応じて、楽音発生の操作に必要なメニュー画面を表示する。このメニュー画面には、動作モードを指定するためのアイコンが表示される。Ｉ／Ｏカード４は、演奏操作に応じて音高その他の楽音データを入力するキーボード１０、及び、操作に応じてアイコンを指定するマウス１１に接続され、これらの操作に応じたコマンド及びデータをＣＰＵ１に入力する。サウンドカード５は、Ｄ／Ａコンバータで構成され、ＣＰＵ１によってメモリ７から読み出されたデジタル信号の波形データを所定のサンプリング周期でアナログ信号に変換（Ｄ／Ａ処理）して、外部のサウンドシステムに出力する。ディスクコントローラ６は、ハードディスク１２を制御し、ＣＰＵ１のプログラムロードコマンドに応じて、楽音発生処理のプログラムをメモリ７のプログラムエリアにストアする。
【００１１】
ＭＩＤＩインターフェース８は、楽音データを生成する他の電子機器１３に接続され、送信されるＭＩＤＩデータをＣＰＵ１に入力する。したがって、指定するモードにより、キーボード１０から入力される楽音データに応じて波形データを生成することも、他の電子機器１３からのＭＩＤＩデータの楽音データに応じて波形データを生成することも可能である。なお、図１には示さないが、現在時間を計測するための時間計測部がバス２に接続されている。
【００１２】
メモリ７は、ＲＡＭ等で構成され、プログラムエリアの他に所定のデータサイズからなるデータエリアが設けられており、書き込みモードにおいて、ＣＰＵ１によって作成される波形データが書き込まれるとともに、読み出しモードにおいて、波形データが読み出されてサウンドカード５に送出される。この場合において、ＣＰＵ１は、メモリ７のデータエリアを、任意のデータサイズの複数のエリアに分割するエリア分割手段を構成するとともに、その分割した各エリアを指定するエリア指定手段を構成する。例えば、図２及び図３に示すように、メモリ７のデータエリアを４つのエリアａ、ｂ、ｃ、ｄに分割して、指定したエリアに波形データを書き込み、指定したエリアから波形データを読み出す。
【００１３】
図２は、書き込みモードにおける波形データの書き込み処理時の推移を示している。
（１）は、すべてのエリアに波形データが書き込まれていない状態であり、指定するエリアすべてに波形データを書き込むことができる。
（２）は、エリアａに波形データが書き込まれた状態である。
（３）は、エリアａ及びｂに波形データが書き込まれた状態である。
（４）は、エリアａ、ｂ及びｃに波形データが書き込まれた状態である。
（５）は、エリアａの波形データのＡ／Ｄ処理が終了し、エリアｂ及びｃに波形データが残っている状態である。
（６）は、エリアｄに波形データが書き込まれた状態である。
（７）は、エリアｂの波形データのＡ／Ｄ処理が終了し、エリアｃ及びｄに波形データが残っている状態である。
（８）は、エリアａに波形データが書き込まれた状態である。
【００１４】
図３は、読み出しモードにおけるＤ／Ａ処理時の推移を示している。
（１）は、初期状態である。
（２）は、エリアａの波形データがサウンドカードに転送され、Ｄ／Ａ処理を行っている状態である。
（３）は、エリアｂの波形データのＤ／Ａ処理待ちの状態である。
（４）は、エリアｃの波形データのＤ／Ａ処理待ちの状態である。
（５）は、エリアａの波形データのＤ／Ａ処理が終了し、エリアｂの波形データのＤ／Ａ処理を行っている状態である。
（６）は、エリアｄの波形データのＤ／Ａ処理待ちの状態である。
（７）は、エリアｂの波形データのＤ／Ａ処理が終了し、エリアｃの波形データのＤ／Ａ処理を行っている状態である。
（８）は、エリアａの波形データのＤ／Ａ処理待ちで、かつ、エリアｃの波形データのＤ／Ａ処理を行っている状態である。
【００１５】
次に、図１に示した楽音発生装置の動作について、図４〜図１２に示すＣＰＵ１による楽音発生処理のフローチャートに基づいて説明する。なお、この処理のために必要なレジスタ、フラグ、ポインタがメモリ７に用意されている。
【００１６】
図４は、メインフローである。まず、イニシャライズを行って、メモリのデータエリア、レジスタ、フラグ等をクリアし（ステップＡ１）、以下のループ処理を繰り返す。モードが設定モードであるか生成モードであるかを判別し（ステップＡ２）、設定モードである場合には設定処理を実行し（ステップＡ３）、生成モードである場合には生成処理を実行する（ステップＡ４）。
【００１７】
図５〜図８は、メインフローにおける設定処理のフローである。図５において、発音チャンネル数であるポリ数が入力されたか否かを判別し（ステップＢ１）、入力されたときは、レジスタＰＯＬＹに入力ポリ数をストアする（ステップＢ２）。次に、ＭＩＤＩインターフェースからの楽音データの入力から、サウンドカードへの波形データの出力までの遅延時間を設定するパラメータの値「１」をレジスタＰＡＲＡＭにストアする（ステップＢ３）。次に、ＰＯＬＹの値をインクリメントする（ステップＢ４）。
【００１８】
この実施形態においては、後述するように、メモリの最適な分割を行うために、暫定的な分割を行った後、所定音高による基準の波形データを生成して分割したエリアに書き込み、その基準の波形データをサウンドカードに出力して、システムの処理能力を計測する基準処理を行う。すなわち、データ生成処理速度を測定して、そのデータ生成処理速度に応じたデータサイズの複数のエリアに分割する。その測定の安全率を高めるために、上記ステップＢ４において、入力されたポリ数より１つ多くして実際よりも厳しい条件で測定する。
【００１９】
次に、ＰＡＲＡＭの値に応じて、分割した各エリアのデータサイズ、分割エリア数、基準処理の基準時間、基準処理の基準データサイズを設定するために、プログラム内の対応するテーブルＴＢ［  ］［ＰＡＲＡＭ］を参照して設定を行う。すなわち、ＰＡＲＡＭの値に応じてデータサイズ用のテーブルを参照して、各エリアのデータサイズを設定し、レジスタＳＩＺＥにストアする（ステップＢ５）。ＰＡＲＡＭの値に応じて分割エリア数用のテーブルを参照して、分割エリア数を設定し、レジスタＮＵＭにストアする（ステップＢ６）。ＰＡＲＡＭの値に応じて基準時間用のテーブルを参照して、基準時間を設定し、レジスタＢＴＩＭＥにストアする（ステップＢ７）。ＰＡＲＡＭの値に応じて基準データサイズ用のテーブルを参照して、基準データサイズを設定し、レジスタＢＳＩＺＥにストアする（ステップＢ８）。そして、現在時間をレジスタＳＴＡＲＴにストアする（ステップＢ９）。
【００２０】
ステップＢ１において、ポリ数が入力されない場合には、生成モードへのモード変更がなされたか否かを判別し（ステップＢ１０）、モード変更がされない場合は、ステップＢ１に移行してポリ数入力を判別する。モード変更がされたときは、生成モードへのモード変更を行って（ステップＢ１１）、このフローを終了してメインフローに戻る。
【００２１】
ステップＢ９において現在時間をストアした後は、図６のフローにおいて、チャンネル番号を示すポインタＮを「０」にセットして（ステップＢ１２）、Ｎをインクリメントしながら、以下のループ処理を繰り返す。すなわち、発音レジスタＮＯＴＥ（Ｎ）に所定音高をストアし（ステップＢ１３）、Ｎをインクリメントする（ステップＢ１４）。次に、Ｎの値がＰＯＬＹにストアしたポリ数に達したか否かを判別する（ステップＢ１５）。ポリ数に達していない場合にはステップ１３に移行してループ処理を続行する。
【００２２】
ステップＢ１５において、Ｎがポリ数に達したときは、ＢＳＩＺＥのデータサイズをインクリメントするためのポインタＡを「０」にセットし（ステップＢ１６）、波形データを書き込むエリアを指定するポインタＢを「０」にセットし（ステップＢ１７）、波形データの書き込みごとにインクリメントするポインタＣを「０」にセットする（ステップＢ１８）。
【００２３】
次に、ＮＯＴＥ（Ｎ）でＮチャンネルの発音処理を行い（ステップＢ１９）、波形データのレジスタＷＡＶＥに生成データをストアして累算（合成）する（ステップＢ２０）。次に、Ｎをインクリメントして（ステップＢ２１）、図７のフローにおいて、Ｎの値がＰＯＬＹの値に達したか否かを判別する（ステップＢ２２）。ＰＯＬＹの値に達しない場合、すなわちＰＯＬＹの値に対応するチャンネル数の発音処理が終了していない場合には、図６のステップＢ１９に移行して、発音処理を行う。そして、図７のステップＢ２２においてＮの値がＰＯＬＹの値に達するまで、図６のステップＢ１９から図２０のステップＢ２２までのループ処理を繰り返す。
【００２４】
図２０のステップＢ２２において、Ｎの数がＰＯＬＹの数に達したときは、ポインタＣをインクリメントし（ステップＢ２３）、指定したエリアであるＢＵＦＦＥＲ（Ｂ）にＷＡＶＥの波形データをストアする（ステップＢ２４）。次に、ポインタＡをインクリメントして（ステップＢ２５）、Ａの値がＢＳＩＺＥの値に達したか否かを判別する（ステップＢ２６）。この値に達していない場合、すなわち基準処理の波形データがまだ残っている場合には、ＷＡＶＥを「０」にクリアして（ステップＢ２７）、Ｎを「０」にセットする（ステップＢ２８）。
【００２５】
次に、ポインタＣの値がＳＩＺＥの値に達したか否かを判別し（ステップＢ２９）、この値にまだ達していない場合、すなわちメモリの現在指定しているエリアにまだ波形データをストアするエリア（余裕）がある場合には、図６のステップＢ１９に移行してＮＯＴＥ（Ｎ＝０）でＮ（＝０）チャンネルの発音処理を行う。そして、図７のステップＢ２９までのループ処理を繰り返す。
【００２６】
ステップＢ２９においてＣの値がＳＩＺＥの値に達した場合、すなわちポインタＢで指定した番号のエリアが一杯になった場合には、まだ残っている基準処理の波形データをストアするために、Ｂをインクリメントして次のエリアを指定する（ステップＢ３０）。そして、Ｂの値がＮＵＭの値すなわち分割エリア数に達したか否かを判別する（ステップＢ３１）。この値に達していない場合には、図６のステップＢ１８に移行して、Ｃを「０」にセットする。そして、図７のステップＢ２９までのループ処理をＣの値がＳＩＺＥの値に達するまで繰り返し、Ｃの値がＳＩＺＥの値に達したときは、ステップＢ３０においてＢをインクリメントして、次のエリアを指定する。
【００２７】
図７のステップＢ２６において、Ａの値がＢＳＩＺＥの値に達した場合、すなわち基準処理に必要な波形データの発音がすべて終了したときは、図８のフローにおいて、レジスタＥＮＤに現在時間をストアする（ステップＢ３２）。そして、ＥＮＤの値からＳＴＡＲＴの値を減算して、その値が基準時間ＢＴＩＭＥより大きいか否かを判別する（ステップＢ３３）。すなわち、基準処理に必要な波形データの生成から発音に到るまでの所要時間すなわちシステムの処理時間が基準時間より大きいか否かを判別する。
【００２８】
この所要時間が基準時間より大きい場合には、実際の入力楽音データによる発音に音切れが発生することになる。そこで、ＰＡＲＡＭにストアした設定パラメータが最大値ＭＡＸＰＡＲＡＭであるか否かを判別する（ステップＢ３４）。ＰＡＲＡＭの値が最大値になっていない場合には、ＰＡＲＡＭの値をインクリメントして（ステップＢ３５）、分割したエリアのデータサイズを増加するような分割に変更する。そして、図５のステップＢ５に移行して、変更した分割に基づいて新たな設定を行う。
【００２９】
図８のステップＢ３４において、ＰＡＲＡＭの値が最大値になっている場合には、ＰＡＲＡＭの値をインクリメントできないので、ＰＯＬＹの値が「１」でないか否かを判別する（ステップＢ３６）。この値が「２」以上である場合には、ＰＯＬＹの値をデクリメントする（ステップＢ３７）。すなわち、発音チャンネル数を減らして、基準処理に必要な波形データのデータサイズを少なくする。そして、図５のステップＢ５に移行して、少なくなった基準処理のデータサイズに基づいて新たな設定を行う。
【００３０】
図８のステップＢ３３において、所要時間すなわちシステムの処理時間が基準時間以内になっている場合には、システムのデータ生成処理速度が充分であるので、実際の入力楽音データによる発音に音切れは発生しない。したがって、ＰＯＬＹの値をデクリメントして（ステップＢ３８）、初めに入力されたポリ数に戻す。そして、設定モードから生成モードにモード変更を行って（ステップＢ３９）、このフローを終了してメインフローに戻る。
【００３１】
図８のステップＢ３６において、ＰＯＬＹの値が「１」である場合には、発音チャンネルが１つのみで、かつ、分割するエリアのデータサイズが最大になっているので、システムのデータ生成処理速度が遅すぎて、実際の入力楽音データによる発音に音切れは回避することができない。したがって、設定モードから生成モードにモード変更を行って（ステップＢ３９）、このフローを終了してメインフローに戻る。
【００３２】
このように、入力される楽音データに応じて生成した波形データを記憶するメモリの所定のサイズのデータエリアを、任意のデータサイズの複数のエリアに分割する際に、システムのデータ生成処理速度を測定して、そのデータ生成処理速度に応じたデータサイズの複数のエリアに分割する。
【００３３】
次に、メインフローのステップＡ４における生成処理について、図９〜図１２のフローに基づいて説明する。図９において、波形データを書き込むエリアを指定するポインタＢを「０」にセットし（ステップＣ１）、波形データの書き込みごとにインクリメントするポインタＣを「０」にセットする（ステップＣ２）。また、発音チャンネルのポインタＣＨを「０（最初のチャンネル）」にセットし、波形データをストアするレジスタＷＡＶＥを「０」にクリアする（ステップＣ３）。次に、分割したメモリの各エリア（０）〜（Ｂ）についての書き込みフラグＷＦ（０）〜（Ｂ）をすべて「１（書き込み可能）」にセットする（ステップＣ４）。そして、すべてのチャンネルのオンフラグＯＮＦ（０）〜（ＰＯＬＥＹ）を「０（消音）」にリセットする（ステップＣ５）。
【００３４】
この状態で、ＭＩＤＩ入力があった場合には、ＭＩＤＩの楽音データに応じて波形データを生成して発音処理をすることになる。そして、モード変更がされない限り、次のステップＣ６から図１２のステップＣ３８のループ処理を繰り返し実行することになる。すなわち、ポインタＢで指定されるエリアのＷＦ（Ｂ）が「１」であるか否かを判別し（ステップＣ６）、このフラグが「１」である場合には、ポインタＣＨで指定されるＯＮＦ（ＣＨ）が「１（発音）」であるか否かを判別する（ステップＣ７）。このフラグが「１」である場合には、ＮＯＴＥ（ＣＨ）による楽音生成処理を行って生成データを得る（ステップＣ８）。一方このフラグが「０」である場合には、生成データは「０」とする（ステップＣ９）。
【００３５】
次に、レジスタＷＡＶＥに生成データを累算する（ステップＣ１０）。この後、ＣＨをインクリメントして（ステップＣ１１）、次のチャンネルを指定する。そして、ＣＨの値がＰＯＬＹの値に達したか否かを判別する（ステップＣ１２）。この値に達しない場合には、ステップＣ７に移行して、ステップＣ１２までのループ処理を繰り返す。
【００３６】
ステップＣ１２において、ＣＨの値がＰＯＬＹの値に達して、すべてのチャンネルについての波形データの生成が終了して、レジスタＷＡＶＥにすべてのチャンネルの波形データが累算（合成）された場合には、図１０のフローにおいて、ＷＡＶＥの合成波形データをポインタＢで指定したエリアＢＵＦＦＥＲ（Ｂ）にストアする（ステップＣ１３）。次に、ＷＡＶＥを「０」にクリアして（ステップＣ１４）、ＣＨを「０」に戻して（ステップＣ１５）、Ｃの値をインクリメントする（ステップＣ１６）。
【００３７】
そして、Ｃの値がエリアＢＵＦＦＥＲ（Ｂ）のデータサイズＳＩＺＥに達したか否かを判別し（ステップＣ１７）、ＳＩＺＥに達した場合には、エリアＢＵＦＦＥＲ（Ｂ）への書き込みがそれ以上できないので、ＷＦ（Ｂ）を「０（書き込み不可）」にリセットする（ステップＣ１８）。これは、図２のハッチングで示す状態である。次に、Ｃを「０」にセットして（ステップＣ１９）、ＢＵＦＦＥＲ（Ｂ）の内容すなわち波形データをサウンドカードへ転送する（ステップＣ２０）。これは、図３のハッチングで示す状態である。
【００３８】
次に、Ｂの値をインクリメントして（ステップＣ２１）、次のエリアを指定する。そして、Ｂの値が最後のエリアであるＮＵＭの値に達したか否かを判別する（ステップＣ２２）。ＮＵＭの値に達したときは、Ｂの値を「０」にセットして（ステップＣ２３）、最初のエリアを指定する。この後、若しくはステップＣ２２において指定したエリアが最後のエリアでない場合、又は、ステップＣ１７において、Ｃの値がエリアＢＵＦＦＥＲ（Ｂ）のデータサイズＳＩＺＥに達せずに、まだこのエリアに波形データのストアが可能である場合には、図１１のフローにおいて、ＭＩＤＩ入力があるか否かを判別する（ステップＣ２４）。
【００３９】
ＭＩＤＩ入力があったときは、その楽音データがオンイベントであるか否かを判別する（ステップＣ２５）。オンイベントである場合には、ＣＨを「０（最初のチャンネル）」にセットして（ステップＣ２６）、そのチャンネルのＯＮＦ（ＣＨ）が「０（消音）」すなわち空きチャンネルであるか否かを判別する（ステップＣ２７）。ＯＮＦ（ＣＨ）が「０」である場合には、ＯＮＦ（ＣＨ）を「１（発音）」にセットして（ステップＣ２８）、ＮＯＴＥ（ＣＨ）に入力された楽音データの音高をストアする（ステップＣ２９）。
【００４０】
ステップＣ２７において、ＯＮＦ（ＣＨ）がすでに「１」になっている場合には、ＣＨの値をインクリメントして（ステップＣ３０）、次のチャンネルを指定する。そして、ＣＨの値がＰＯＬＹの値すなわち最大チャンネル数に達したか否かを判別する（ステップＣ３１）。ＰＯＬＹの値に達していない場合には、ステップＣ２７に移行して、ＯＮＦ（ＣＨ）が「０」であるか否かを判別する。ステップＣ３１において、ＣＨの値がＰＯＬＹの値に達した場合には、ステップＣ２４に移行して、ＭＩＤＩ入力を判別する。
【００４１】
ステップＣ２９において音高をストアした後、又は、ステップＣ２４においてＭＩＤＩ入力がない場合には、波形データを読み出すエリアを指定するポインタＤを「０」にセットし（ステップＣ３２）、ＷＦ（Ｄ）が「０（読み出し可能）」であるか否かを判別する（ステップＣ３３）。このフラグが「０」である場合には、ＢＵＦＦＥＲ（Ｄ）の波形データをサウンドカードに転送してＤ／Ａ処理をさせている状態であるので、サウンドカードのＤ／Ａ処理が終了したか否かを判別する（ステップＣ３４）。
【００４２】
Ｄ／Ａ処理が終了したときは、ＷＦ（Ｄ）を「１（書き込み可能）」にセットして（ステップＣ３５）、Ｄの値をインクリメントする（ステップＣ３６）。図３の例では、（５）に示すように、エリアａのＤ／Ａ処理が終了して、エリアｂを指定した状態である。ステップＣ３４において、Ｄ／Ａ処理が終了していない場合には、ステップＣ３６に移行してＤの値をインクリメントする。したがって、生成した波形データを書き込みが指定されたエリアに書き込み、読み出しが指定されたエリアから波形データを読み出して出力する。
【００４３】
ステップＣ３３において、ＷＦ（Ｄ）が「１」である場合には、Ｄの値をインクリメントして（ステップＣ３６）、Ｄの値がＮＵＭの値に達したか否かを判別する（ステップＣ３７）。この値に達していない場合にはステップＣ３３に移行して、新たに指定したエリアのＷＦ（Ｄ）が「０」であるかを判別する。Ｄの値がＮＵＭの値に達した場合には、モード変更か否かを判別し（ステップＣ３８）、モード変更である場合には、設定モードにモード変更して（ステップＣ３９）、このフローを終了してメインフローに戻る。モード変更でない場合には、図９のステップＣ６に移行して、ＷＦ（Ｂ）が「１（書き込み可能）」か否かを判別する。
【００４４】
ステップＣ２５において入力された楽音データがオンイベントでなくオフイベントである場合には、図１２のフローにおいて、ＣＨを「０」にセットして（ステップＣ４０）、ＯＮＦ（ＣＨ）が「１（発音）」であるか否かを判別する（ステップＣ４１）。このフラグが「１」である場合には、ＮＯＴＥ（ＣＨ）の音高がオフイベントの音高と同じであるか否かを判別する（ステップＣ４２）。音高が同じである場合には、ＯＮＦ（ＣＨ）を「０（消音）」にリセットする（ステップＣ４３）。そして、図１１のステップＣ３２に移行して、読み出しエリアを指定するポインタＤを「０」にセットする。
【００４５】
図１２のステップＣ４１においてＯＮＦ（ＣＨ）が「０（消音）」である場合、又は、ステップＣ４２においてＮＯＴＥ（ＣＨ）の音高がオフイベントの音高と異なる場合には、ＣＨの値をインクリメントする（ステップＣ４４）。そして、ＣＨの値がＰＯＬＹの値に達したときは、図１１のステップＣ３２に移行して、読み出しエリアを指定するポインタＤを「０」にセットする。
【００４６】
このように、上記実施形態における楽音発生装置においては、ＣＰＵ１は、所定の記憶手段（メモリ７）の所定のデータサイズのエリアを任意のデータサイズの複数のエリアに分割するエリア分割手段と、前記記憶手段の各エリアを指定するエリア指定手段と、入力された楽音データに応じて波形データを生成するデータ生成手段と、このデータ生成手段によって生成された波形データを前記記憶手段における前記エリア指定手段によって書き込みが指定されたエリアに書き込むデータ書込手段と、前記記憶手段において前記エリア指定手段によって読み出しが指定されたエリアから記憶された波形データを読み出して出力するデータ読出手段と、を備えた構成になっている。
【００４７】
上記構成により、入力される楽音データに応じて生成した波形データを記憶する記憶手段の所定のデータサイズのエリアを、任意のデータサイズの複数のエリアに分割し、生成した波形データを書き込みが指定されたエリアに書き込み、読み出しが指定されたエリアから波形データを読み出して出力する。したがって、作成する波形データのデータサイズを任意に設定できるので、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【００４８】
この場合において、前記エリア分割手段は、前記データ生成手段のデータ生成処理速度を測定する速度測定手段を有し、当該データ生成処理速度に応じたデータサイズの複数のエリアに分割する。したがって、使用するコンピュータの処理能力に応じて、作成する波形データのデータサイズを任意に設定できるので、コンピュータの種類にかかわらず、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【００４９】
あるいはこの場合において、前記エリア分割手段は、同時に発音する発音チャンネル数を測定するチャンネル測定手段を有し、当該測定した発音チャンネル数に応じたデータサイズの複数のエリアに分割する。したがって、発音チャンネル数に応じて、作成する波形データのデータサイズを任意に設定できるので、使用する発音チャンネル数にかかわらず、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【００５０】
また、前記楽音データの入力から当該楽音データに対応する波形データの発音までの遅延時間を任意に設定する遅延設定手段をさらに有し、前記エリア分割手段は、前記遅延設定手段によって設定された遅延時間に応じて記憶手段の所定のデータサイズのエリアを任意のデータサイズの複数のエリアに分割する。したがって、作成する波形データのデータサイズを設定した遅延時間に応じて任意に設定できるので、楽音データの入力形態によって作成する波形データのデータサイズを任意に設定できるので、実情に適応した楽音発生ができる。例えば、手動演奏による入力である場合には遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止し、自動演奏による入力である場合には、発音チャンネル数を増加する等の対応が可能になる。
【００５１】
なお、上記実施形態においては、楽音発生装置内のハードディスク１２に格納された楽音発生処理のプログラムを記録した構成にしたが、フロッピーディスク、ＣＤ、ＭＤ等の外部記録媒体に楽音発生処理のプログラムを記録し、汎用のコンピュータでこの記録媒体のプログラムを読み出して実行させることによって、上記発明を実現することができる。すなわち、所定の記憶手段の所定のデータサイズのエリアを任意のデータサイズの複数のエリアに分割するエリア分割手順と、前記記憶手段の各エリアを指定するエリア指定手順と、入力された楽音データに応じて波形データを生成するデータ生成手順と、このデータ生成手順によって生成された波形データを前記記憶手段における前記エリア指定手順によって書き込みが指定されたエリアに書き込むデータ書込手順と、前記記憶手段において前記エリア指定手順によって読み出しが指定されたエリアから記憶された波形データを読み出して出力するデータ読出手順と、を実行する楽音発生処理のプログラムを記録した記録媒体を構成する。
【００５２】
そして、汎用のコンピュータにこの記録媒体のプログラムを実行させ、入力される楽音データに応じて生成した波形データを記憶する記憶手段の所定のデータサイズのエリアを、任意のデータサイズの複数のエリアに分割し、生成した波形データを書き込みが指定されたエリアに書き込み、読み出しが指定されたエリアから波形データを読み出して出力する。したがって、作成する波形データのデータサイズを任意に設定できるので、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【００５３】
この場合において、前記エリア分割手順は、前記データ生成手順のデータ生成処理速度を測定する速度測定手順を含み、当該データ生成処理速度に応じたデータサイズの複数のエリアに分割する。したがって、使用するコンピュータの処理能力に応じて、作成する波形データのデータサイズを任意に設定できるので、コンピュータの種類にかかわらず、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【００５４】
あるいはこの場合において、前記エリア分割手順は、同時に発音する発音チャンネル数を測定するチャンネル測定手順を含み、当該測定した発音チャンネル数に応じたデータサイズの複数のエリアに分割する。したがって、発音チャンネル数に応じて、作成する波形データのデータサイズを任意に設定できるので、選択する発音チャンネル数にかかわらず、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【００５５】
また、前記楽音データの入力から当該楽音データに対応する波形データの発音までの遅延時間を任意に設定する遅延設定手順をさらに有し、前記エリア分割手順は、前記遅延設定手順によって設定された遅延時間に応じて記憶手段の所定のデータサイズのエリアを任意のデータサイズの複数のエリアに分割する。したがって、作成する波形データのデータサイズを設定した遅延時間に応じて任意に設定できるので、楽音データの入力形態によって作成する波形データのデータサイズを任意に設定できるので、実情に適応した楽音発生ができる。例えば、手動演奏による入力である場合には遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止し、自動演奏による入力である場合には、発音チャンネル数を増加する等の対応が可能になる。
【００５６】
【発明の効果】
本発明によれば、入力される楽音データに応じて生成した波形データを記憶する記憶手段の所定のデータサイズのエリアを、任意のデータサイズの複数のエリアに分割し、生成した波形データを書き込みが指定されたエリアに書き込み、読み出しが指定されたエリアから波形データを読み出して出力する。したがって、楽音データの入力から発音までの遅延時間を小さくして違和感を解消するとともに、音切れの発生を防止する。
【図面の簡単な説明】
【図１】実施形態における楽音発生装置のシステム構成を示すブロック図。
【図２】図１のメモリにおける波形データの推移の状態を示す図。
【図３】図１のメモリにおける波形データの推移の状態を示す図。
【図４】図１のＣＰＵのメインフローチャート。
【図５】図４のメインフローチャートにおける設定処理のフローチャート。
【図６】図５に続く設定処理のフローチャート。
【図７】図６に続く設定処理のフローチャート。
【図８】図７に続く設定処理のフローチャート。
【図９】図４のメインフローチャートにおける生成処理のフローチャート。
【図１０】図９に続く生成処理のフローチャート。
【図１１】図１０に続く生成処理のフローチャート。
【図１２】図１１に続く生成処理のフローチャート。
【符号の説明】
１  ＣＰＵ
５  サウンドカード
７  メモリ
８  ＭＩＤＩインターフェース
１２  ハードディスク
１３  他の電子機器
【図１】
0003873160.tif 000002
【図２】
0003873160.tif 000003
【図３】
0003873160.tif 000004
【図４】
0003873160.tif 000005
【図５】
0003873160.tif 000006
【図６】
0003873160.tif 000007
【図７】
0003873160.tif 000008
【図８】
0003873160.tif 000009
【図９】
0003873160.tif 000010
【図１０】
0003873160.tif 000011
【図１１】
0003873160.tif 000012
【図１２】
0003873160.tif 000013