(57)【要約】【課題】デジタルアナログ変換器の前段に配置するリングバッファなどの記憶手段の容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生する。【解決手段】ＣＰＵ１は、楽音波形データを生成する処理を行なう波形生成タスク（０）およびタスク（１）ないしタスク（Ｎ）を各タスク単位で繰り返し実行する際に、ＲＡＭ４のリングバッファにおいて、読出アドレスＡＲから書込アドレスＡＷまでのアドレス差が所定範囲より小さい場合には、波形生成タスク（０）を他のタスク（１）ないしタスク（Ｎ）よりも優先的に実行する。【選択図】        図１
2004246145.tif 000002
【特許請求の範囲】
【請求項１】
楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間内に実行可能な数のタスクを実行するタスク実行手段と、
前記波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む波形書込手段と、
読出アドレスで指定される前記記憶手段のエリアから楽音波形データを読み出す波形読出手段と、
前記読出アドレスから前記書込アドレスまでのアドレス差が所定範囲より小さい場合には前記制限時間内において前記波形生成タスクを前記他のタスクよりも優先的に実行する指令を前記タスク実行手段に与える指令発生手段と、
を備えた楽音発生装置。
【請求項２】
前記指令発生手段は、前記アドレス差が前記所定範囲より大きい場合には前記他のタスクを前記波形生成タスクよりも優先的に実行する指令を前記タスク実行手段に与えることを特徴とする請求項１記載の楽音発生装置。
【請求項３】
前記指令発生手段は、前記アドレス差が前記所定範囲内である場合には前記波形生成タスクと前記他のタスクとを優劣なく平等に実行する指令を前記タスク実行手段に与えることを特徴とする請求項１記載の楽音発生装置。
【請求項４】
前記指令発生手段は、優先的に実行するタスクの優先度を高く設定する指令を前記タスク実行手段に与えることを特徴とする請求項１ないし３のいずれか１項記載の楽音発生装置。
【請求項５】
前記指令発生手段は、優先的に実行するタスク以外のタスクの優先度を低く設定する指令を前記タスク実行手段に与えることを特徴とする請求項１ないし３のいずれか１項記載の楽音発生装置。
【請求項６】
楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間内に実行可能な数のタスクを実行するコンピュータを用いて楽音を発生する楽音発生装置のプログラムであって、
前記波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む第１のステップと、
読出アドレスで指定される前記記憶手段のエリアから楽音波形データを読み出す第２のステップと、
前記読出アドレスから前記書込アドレスまでのアドレス差が所定範囲より小さい場合には前記制限時間内において前記波形生成タスクを前記他のタスクよりも優先的に実行するように前記コンピュータに指令する第３のステップと、
を実行することを特徴とする楽音発生処理のプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、楽音発生装置及び楽音発生処理のプログラムに関する。
【０００２】
【従来の技術】
従来の楽音発生装置の中には、ハードウェアによって楽音を生成するハードウェア音源の代わりに、コンピュータのオペレーションシステム（ＯＳ）上で動作するソフトウェアによって楽音を生成するソフトウェア音源を用いたものがある。ソフトウェア音源は、楽音発生処理を実行するアプリケーションプログラム（以下、「楽音発生処理のプログラム」という）をコンピュータのハードディスク等にインストールして、ＣＰＵ等の演算処理装置がその楽音発生処理のプログラムを実行することにより、鍵盤演奏による押鍵情報、シーケンス情報、又はＭＩＤＩ情報等からなる楽音イベントのデータが入力された場合に、その楽音イベントに応じて簡単に楽音を発生できるので、ハードウェア音源よりも安価に楽音発生装置を実現できるという利点がある。
【０００３】
従来の具体的な楽音発生装置における楽音発生方法は、（１）アプリケーションプログラムから演奏情報が出力されたときに発生する第１の割込（ソフトウェア割込）に応じて起動され、その演奏情報に対応した発音制御情報を生成する第１のステップ、（２）バッファに記憶されている波形サンプル数の減少を検出したときに発生される第２の割込（ハードウェア割込）により起動され、（第１のステップによって生成された）発音制御情報に基づいて複数の波形サンプルを一括して生成し、その生成された波形サンプルをバッファに記憶する第２のステップ、及び、（３）バッファに記憶された波形サンプルを各サンプリング周期毎に１サンプルずつ読み出してデジタルアナログ変換器に順次出力する第３のステップを含む構成になっている。また、第１のステップ及び第２のステップは、所定のオペレーティングシステムにおける仮想デバイスドライバであり、さらに、第２の割込は、デジタルアナログ変換器に送出された波形サンプル数が所定数に達したことを検出したときに発生される構成になっている。
【０００４】
すなわち、楽音情報処理や波形生成処理等からなる上記第１〜第３のステップを含むような楽音発生処理のプログラムをコンピュータのＣＰＵが実行する構成になっている。ところが、楽音発生処理のプログラムを実行するためにＣＰＵの動作を占有することはできない。したがって、ＣＰＵが楽音発生処理のプログラムを実行するために割り当てられた期間内に、まとめて楽音情報処理や波形生成処理を行うために、一定レートのデータストリームが必要なデジタルアナログ変換器の前段に、リングバッファやダブルバッファ等からなる記憶手段であるＦＩＦＯ（先入れ先出し）バッファが配置されている（例えば、特許文献１参照）。
【０００５】
【特許文献１】
特許第２９０４０８８号公報（段落番号「００１１」「００１２」、図４〜図７）
【０００６】
【発明が解決しようとする課題】
しかしながら、上記従来の楽音発生装置、及びその装置において実行される楽音発生処理のプログラムによる楽音発生方法においては、ＦＩＦＯバッファの容量が大きいと、コストアップの要因になるばかりでなく、楽音イベントのデータがコンピュータに入力されてから、その楽音イベントに対する楽音波形が生成されて出力されるまでに時間がかかり過ぎて、入力される楽音イベントに対する楽音の出力応答が遅くなることになる。このため、鍵盤演奏等のように、リアルタイムで楽音イベントが入力される場合には、演奏よりも遅れて楽音が発生されるので、演奏者ばかりでなく演奏を聴いている人にも違和感を与えてしまう。
【０００７】
一方、出力応答を速くするためにＦＩＦＯバッファの容量を小さくした場合には、ＣＰＵによる楽音波形生成の演算負荷が大きくなったときに、ＦＩＦＯバッファへの書込処理が遅くなり、ＦＩＦＯバッファが空（新しい楽音波形のデータが書き込まれない状態）になって、読み出すべき楽音波形データがなくなる状態、すなわちバッファ・アンダー・フローの状態が発生してしまう。この場合には、ノイズを発生したり、以前に読み出した古い楽音波形データを出力することになるので、発生する楽音の音質が著しく劣化してしまう。
【０００８】
例えば、上記特許文献１においては、段落番号「００５６」、「００５７」及び図７の（ｂ）に記載されているように、ＭＩＤＩ演奏入力に対応する波形生成演算が所定時間である１フレーム内に終了しない場合がある。例えば、マルチメディアソフト等のリアルタイム性を要求される処理を並行して実行している場合には、そのためにＣＰＵパワーが割かれてソフトウェア音源を実行するための時間が割り当てられないことがある。この場合には、演算の終了しなかったフレーム時間については、波形生成をキャンセルしてＤＭＡ処理（再生処理）を中断することになる。
【０００９】
また、この再生中断は、段落番号「００５８」及び図８の（ａ）、並びに、「００５９」及び図８の（ｂ）に記載された第１及び第２の変形例においても解消されていない。第１の変形例においては、１フレームの再生が終了するタイミングよりもＴｊ時間だけハードウェア割込を早くしているが、波形生成演算が１フレーム内に終了しない場合には、波形生成をキャンセルして再生処理を中断することは避けられない。また、第２の変形例においては、ソフトウェア割込の優先順位をハードウェア割込よりも高い優先順位にしているが、その分だけ波形生成演算が遅れてしまうので、この場合も波形生成をキャンセルして再生処理を中断することは避けられない。したがって、従来の楽音発生装置においては、このような再生中断に起因するノイズの発生や以前に読み出した古い楽音波形データを出力することを回避することは困難であった。
【００１０】
本発明の課題は、デジタルアナログ変換器の前段に配置する記憶手段であるバッファの容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生するような楽音発生装置及び楽音発生処理のプログラムを提供することである。
【００１１】
【課題を解決するための手段】
請求項１に記載の楽音発生装置は、楽音波形データを生成する処理を行なう波形生成タスク（実施形態においては、図２のタスク（０）に相当する）および他のタスク（実施形態においては、図２のタスク（１）ないしタスク（Ｎ）に相当する）からなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間（実施形態においては、図３ないし図５における所定値に相当する）内に実行可能な数のタスクを実行するタスク実行手段（実施形態においては、ＣＰＵ１によって実行される図３ないし図５のタスク処理ルーチンに相当する）と、波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段（実施形態においては、図１１のリングバッファに相当する）のエリアに書き込む波形書込手段（実施形態においては、ＣＰＵ１によって実行される図８の生成処理に相当する）と、読出アドレスで指定される記憶手段のエリアから楽音波形データを読み出す波形読出手段（実施形態においては、ＣＰＵ１によって実行される図９の出力処理に相当する）と、読出アドレスから書込アドレスまでのアドレス差が所定範囲（実施形態においては、Ｍ２からＭ３までの範囲に相当する）より小さい場合には制限時間内において波形生成タスクを他のタスクよりも優先的に実行する指令（実施形態においては、図１０のステップＦ８に相当する）をタスク実行手段に与える指令発生手段（実施形態においては、ＣＰＵ１によって実行される図１０のバッファチェック処理に相当する）とを備えた構成になっている。
【００１２】
この場合において、請求項２に記載したように、指令発生手段は、アドレス差が所定範囲より大きい場合には他のタスクを波形生成タスクよりも優先的に実行する指令（実施形態においては、図１０のステップＦ７に相当する）をタスク実行手段に与えるような構成にしてもよい。
【００１３】
また、請求項３に記載したように、指令発生手段は、アドレス差が所定範囲内である場合には波形生成タスクと他のタスクとを優劣なく平等に実行する指令（実施形態においては、図１０のステップＦ６に相当する）をタスク実行手段に与えるような構成にしてもよい。
【００１４】
また、請求項４に記載したように、指令発生手段は、優先的に実行するタスクの優先度を高く設定する指令（実施形態においては、図１０のステップＦ６、Ｆ７、およびＦ８に相当する）をタスク実行手段に与えるような構成にしてもよい。
【００１５】
また、請求項５に記載したように、指令発生手段は、優先的に実行するタスク以外のタスクの優先度を低く設定する指令（実施形態の変形例に相当する）をタスク実行手段に与えるような構成にしてもよい。
【００１６】
請求項６に記載の楽音発生処理のプログラムは、楽音波形データを生成する処理を行なう波形生成タスク（実施形態においては、図２のタスク（０）に相当する）および他のタスク（実施形態においては、図２のタスク（１）ないしタスク（Ｎ）に相当する）からなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間（実施形態においては、図３ないし図５における所定値に相当する）内に実行可能な数のタスクを実行するコンピュータ（実施形態においては、図１のＣＰＵ１に相当する）を用いて楽音を発生する楽音発生装置のプログラム（外部記憶媒体又は通信網からハードディスクなどのメモリににインストールされて、実行されるプログラムに相当する）であって、
波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段（実施形態においては、図１のＲＡＭ４のリングバッファに相当する）のエリアに書き込む第１のステップと、読出アドレスで指定される記憶手段のエリアから楽音波形データを読み出す第２のステップと、読出アドレスから書込アドレスまでのアドレス差が所定範囲（実施形態においては、Ｍ２からＭ３までの範囲に相当する）より小さい場合には制限時間内において波形生成タスクを他のタスクよりも優先的に実行するようにコンピュータに指令する第３のステップとを実行する構成になっている。
【００１７】
【発明の実施の形態】
以下、本発明による楽音発生装置の実施形態について、図を参照して説明する。
図１は、ソフトウェア音源の機能を具備した楽音発生装置の構成を示すブロック図である。この図において、ＣＰＵ１は、システムバス２を介してＲＯＭ３、ＲＡＭ４、操作部５、表示部６、ＣＯＤＥＣ７に接続され、これら各部との間においてデータやコマンドを授受してこの装置全体を制御する。ＣＰＵ１はまた、外部の鍵盤装置やシーケンサ等から入力される楽音イベントのデータ（以下、「イベントデータ」という）であるＭＩＤＩデータを処理する。
【００１８】
ＲＯＭ３は、楽音発生処理のプログラムや初期データ等を記憶している。ＲＡＭ４は、半導体メモリやハードディスク等の記憶手段で構成れたＣＰＵ１のワークエリアであり、楽音発生処理のプログラムその他のアプリケーションソフトを起動するためのオペレーションシステム（ＯＳ）のソフトウェアを記憶している。また、ＲＡＭ４には、楽音発生処理のプログラムの実行に必要な各種のレジスタ、フラグ、ポインタのエリア、及び、楽音波形データを一時的にストアするＦＩＦＯバッファとしてのリングバッファのエリア、及び、ソフトウェア音源で楽音波形データを生成するための波形テーブルが設けられている。
【００１９】
操作部５は、キーボードやマウス等のポインティングデバイスで構成され、操作に応じてデータやコマンドをＣＰＵ１に入力する。表示部６は、楽音発生処理に関連する各種の情報やこの装置の状態を示すその他の情報を表示する。ＣＯＤＥＣ７は、デジタルアナログ変換器、ＤＭＡＣ（ダイレクト・メモリ・アクセス・コントローラ）、サンプリングパルス発生器等（図示せず）で構成され、デジタルの楽音波形データをアナログの楽音信号に変換して、外部のサウンドシステムに出力する。
【００２０】
図２は、楽音発生処理のプログラムを実行するのために、ＲＡＭ４に設定されるタスク群および各タスクに対する優先度を設定するプライオリティ（ＰＲＩＯＲＩＴＹ）データ群を示す図である。この図に示すように、タスク群には、楽音波形データを生成する波形生成タスク（０）、および、その他のタスクであるタスク（１）ないしタスク（Ｎ）からなる複数のタスクで構成されている。また、プライオリティデータ群は、各タスク（０）ないしタスク（Ｎ）にたいする優先度であるプライオリティ（０）ないしプライオリティ（Ｎ）で構成されている。プライオリティデータ群に設定される優先度には、高い優先度を表す「Ｈｉｇｈ」、各タスクに優先度がない通常の状態を表す「Ｎｏｒｍａｌ」、低い優先度を表す「Ｌｏｗ」がある。
【００２１】
その他のタスクとしては、例えば、操作部５のキーボードからの演奏データや外部からのＭＩＤＩデータを入力するデータ入力処理、表示部６に対して文字や図形情報をドット（画素）に分解して１画面のビットマップデータを生成する画像データ生成処理、発生する楽音に対してリバーブなどのエフェクトを付加するエフェクト処理などがある。
【００２２】
なお、ＣＰＵ１がタスク（０）ないしタスク（Ｎ）を各タスク単位で連続して実行する際には制限時間があり、ＣＰＵ１を構成するデバイスの処理速度に応じて、制限時間の所定値が規定されている。タスク処理ルーチンの開始からカウントアップされる時間が所定値に達したときは、次のタスクを実行することはできず、改めてタスク処理ルーチンを開始することになる。
【００２３】
次に、この楽音発生装置の動作について、図３〜図１０に示すＣＰＵ１のフローチャートおよび図１１に示すリングバッファにおける書込アドレスと読出アドレスとの関係を示す図に基づいて詳細に説明する。
図３ないし図５は、タスク処理ルーチンのメインフローチャートである。所定のイニシャライズ処理（ステップＡ１）においては、レジスタやフラグをクリアするとともに、プライオリティ（０）ないしプライオリティ（Ｎ）を「Ｎｏｒｍａｌ」に設定する。次に、レジスタＴＩＭＥＲに「０」をストアしてクリアする（ステップＡ２）。ＴＩＭＥＲのカウント値は、一定時間ごとのタイマインタラプトに応じてカウントアップ（インクリメント）される。
【００２４】
次に、タスク群およびプライオリティデータ群を指定するポインタｎを「０」にセットして（ステップＡ３）、ｎの値をインクリメントしながら、各タスクの優先度を判定する。すなわち、タスク（ｎ）のプライオリティ（ｎ）が「Ｈｉｇｈ」であるか否かを判別し（ステップＡ４）、「Ｈｉｇｈ」である場合には、タスク（ｎ）処理を実行する（ステップＡ５）。そして、ＴＩＭＥＲのカウント値が所定値に達したか否かを判別する（ステップＡ６）。所定値に達していない場合には、ｎの値をインクリメントして（ステップＡ７）、次のタスクを指定する。このとき、インクリメントしたｎの値が最大タスク数を超えたか否かを判別する（ステップＡ８）。最大タスク数を超えていない場合には、ステップＡ４からの処理を繰り返す。
【００２５】
ステップＡ６において、ＴＩＭＡＲのカウント値が所定値に達したときは、ステップＡ２に移行して、ＴＩＭＡＲのカウント値を「０」にリセットして、ステップＡ３以後の処理を繰り返す。すなわち、プライオリティが「Ｈｉｇｈ」のタスクをすべて処理する前に、ＴＩＭＥＲのカウント値が所定値に達したときは、あらためてタスク処理ルーチンの最初から処理を繰り返す。
【００２６】
ステップＡ８において、ｎの値が最大タスク数を超えたとき、すなわち、プライオリティが「Ｈｉｇｈ」のタスクをすべて処理した後は、図４のフローにおいて、ポインタｎを「０」にセットして（ステップＡ９）、ｎの値をインクリメントしながら、各タスクの優先度を判定する。すなわち、タスク（ｎ）のプライオリティ（ｎ）が「Ｎｏｒｍａｌ」であるか否かを判別し（ステップＡ１０）、「Ｎｏｒｍａｌ」である場合には、タスク（ｎ）処理を実行する（ステップＡ１１）。そして、ＴＩＭＥＲのカウント値が所定値に達したか否かを判別する（ステップＡ１２）。所定値に達していない場合には、ｎの値をインクリメントして（ステップＡ１３）、次のタスクを指定する。このとき、インクリメントしたｎの値が最大タスク数を超えたか否かを判別する（ステップＡ１４）。最大タスク数を超えていない場合には、ステップＡ１０からの処理を繰り返す。
【００２７】
ステップＡ１２において、ＴＩＭＡＲのカウント値が所定値に達したときは、図３のステップＡ２に移行して、ＴＩＭＡＲのカウント値を「０」にリセットして、ステップＡ３以後の処理を繰り返す。すなわち、プライオリティが「Ｎｏｒｍａｌ」のタスクをすべて処理する前に、ＴＩＭＥＲのカウント値が所定値に達したときは、あらためてタスク処理ルーチンの最初から処理を繰り返す。
【００２８】
ステップＡ１４において、ｎの値が最大タスク数を超えたとき、すなわち、プライオリティが「Ｎｏｒｍａｌ」のタスクをすべて処理した後は、図５のフローにおいて、ポインタｎを「０」にセットして（ステップＡ１５）、ｎの値をインクリメントしながら、各タスクの優先度を判定する。すなわち、タスク（ｎ）のプライオリティ（ｎ）が「Ｌｏｗ」であるか否かを判別し（ステップＡ１６）、「Ｌｏｗ」である場合には、タスク（ｎ）処理を実行する（ステップＡ１７）。そして、ＴＩＭＥＲのカウント値が所定値に達したか否かを判別する（ステップＡ１８）。所定値に達していない場合には、ｎの値をインクリメントして（ステップＡ１９）、次のタスクを指定する。このとき、インクリメントしたｎの値が最大タスク数を超えたか否かを判別する（ステップＡ２０）。最大タスク数を超えていない場合には、ステップＡ１６からの処理を繰り返す。
【００２９】
ステップＡ１８において、ＴＩＭＡＲのカウント値が所定値に達したときは、図３のステップＡ２に移行して、ＴＩＭＡＲのカウント値を「０」にリセットして、ステップＡ３以後の処理を繰り返す。すなわち、プライオリティが「Ｌｏｗ」のタスクをすべて処理する前に、ＴＩＭＥＲのカウント値が所定値に達したときは、あらためてタスク処理ルーチンの最初から処理を繰り返す。
また、ステップＡ２０において、ｎの値が最大タスク数を超えたとき、すなわち、プライオリティが「Ｌｏｗ」のタスクをすべて処理した後は、図３のステップＡ２に移行して、ＴＩＭＡＲのカウント値を「０」にリセットして、ステップＡ３以後の処理を繰り返す。
【００３０】
図６は、図３におけるステップＡ５、図４におけるステップＡ１１、又は、図５におけるステップＡ１７のタスク処理（ｎ）のうち、タスク処理（０）すなわち楽音波形を生成する波形生成タスク処理のフローチャートである。
このフローでは、ＭＩＤＩデータを入力する入力処理（ステップＢ１）、そのＭＩＤＩデータに応じて楽音波形データを生成する生成処理（ステップＢ２）、生成した楽音波形データをＣＯＤＥＣ７に出力する出力処理（ステップＢ３）、ＲＡＭ４のリングバッファをチェックするバッファチェック処理（ステップＢ４）を実行する。
【００３１】
図７は、図６におけるステップＢ１の入力処理のフローである。
まず、ＭＩＤＩ入力があるか否かを判別し（ステップＣ１）、ＭＩＤＩ入力がなければこのフローを終了するが、ＭＩＤＩ入力があったときは、そのイベントデータの内容を判別する（ステップＣ２）。イベントデータがノートオンである場合には、発音チャンネルにアサインが可能であるかを示すフラグＥｎａｂｌｅが「１（アサイン可能）」であるか否かを判別する（ステップＣ３）。Ｅｎａｂｌｅが「０（アサイン不可）」である場合には、入力されたイベントデータを無視する。すなわち、発音チャンネルにノートオンの新たなイベントデータをアサインする処理を停止する。そして、メインフローに戻る。一方、Ｅｎａｂｌｅが「１」である場合には、発音チャンネルを指定するポインタＣＨに「０」をセットして（ステップＣ４）、ＣＨの値をインクリメントしながら、イベントデータがアサイン可能な発音チャンネルを捜す。
【００３２】
すなわち、ＣＨで指定する発音フラグＯＮＦ（ＣＨ）が「０（消音）」であるか否かを判別し（ステップＣ５）、このフラグが「１（発音）」である場合には、イベントデータをアサインできないので、次の発音チャンネルを指定するためにＣＨの値をインクリメントする（ステップＣ６）。そしてインクリメントしたＣＨの値が発音チャンネルの最大数より大きくなったか否かを判別する（ステップＣ７）。ＣＨの値が最大数より大きい場合には、すべての発音チャンネルが発音中で空きチャンネルがないので、このフローを終了する。ＣＨの値が最大数以下である場合には、ステップＣ５に移行して消音中の発音チャンネルを捜す。ステップＣ５において、発音フラグＯＮＦ（ＣＨ）が「０」である場合には、そのフラグを「１」にセットして（ステップＣ８）、イベントデータのノートすなわち音高をレジスタＮＯＴＥ（ＣＨ）にストアする（ステップＣ９）。そして、図６のフローに戻る。
【００３３】
ステップＣ２において、イベントデータがノートオフである場合には、発音チャンネルを指定するポインタＣＨに「０」をセットして（ステップＣ１０）、ＣＨの値をインクリメントしながら、そのイベントデータについて発音中の発音チャンネルを捜す。
すなわち、ＣＨで指定する発音フラグＯＮＦ（ＣＨ）が「１（発音中）」であるか否かを判別する（ステップＣ１１）。このフラグが「１」である場合には、ノートオフのイベントデータのノートがレジスタＮＯＴＥ（ＣＨ）のノートと一致するか否かを判別する（ステップＣ１２）。ＯＮＦ（ＣＨ）が「０」である場合、又は、ノートオフのイベントデータのノートがＮＯＴＥ（ＣＨ）のノートと異なる場合には、ＣＨの値をインクリメントする（ステップＣ１３）。そしてインクリメントしたＣＨの値が発音チャンネルの最大数より大きくなったか否かを判別する（ステップＣ１４）。
【００３４】
ＣＨの値が最大数以下である場合には、ステップＣ１４からステップＣ１１に移行して対応する発音チャンネルを捜す。その発音チャンネルが見つかった場合、すなわち、ステップＣ１２においてノートオフのイベントデータのノートがＮＯＴＥ（ＣＨ）のノートと一致した場合には、その発音チャンネルのフラグＯＮＦ（ＣＨ）を「０（消音）」にリセットして（ステップＣ１５）、図６のフローに戻る。
ステップＣ２において、イベントデータがノートオン及びノートオフ以外のデータ、例えばプログラムチェンジのデータである場合には、その楽音イベントに対応するその他の処理を行う（ステップＣ１６）。そして、図６のフローに戻る。
【００３５】
図８は、図６におけるステップＢ２の生成処理のフローである。このフローでは、ノートオンのイベントデータのノート（音高）、音色及びベロシティ等に基づいて、所定のサンプリング周期毎にＲＡＭ４の波形テーブルからノートに対応する読出レートでデータを読み出して、音色及びベロシティ等に応じてアンプ処理及びフィルタ処理等を行って楽音波形データを生成する。
【００３６】
まず、波形生成に用いる５個のレジスタＷ、ＷＬ、ＷＲ、ＷＨＬ、ＷＨＲをクリアするために、それぞれに「０」をストアする（ステップＤ１）。Ｗは、生成した楽音波形データをストアするレジスタである。ＷＬ及びＷＲは、各発音チャンネルごとにパンデータ（左右分離比率データ）によって左チャンネル及び右チャンネルに分離した楽音波形データをストアするレジスタである。ＷＨＬ及びＷＨＲは、左チャンネル及び右チャンネルの各々において複数の発音チャンネルの楽音波形データを合成してストアするレジスタである。
【００３７】
次に、発音チャンネルを指定するポインタＣＨに「０」をセットして（ステップＤ２）、ＣＨの値をインクリメントしながら楽音波形データを生成する。すなわち、ＣＨで指定した発音フラグＯＮＦ（ＣＨ）が「１」であるか否かを判別する（ステップＤ３）。このフラグが「１」である場合には、その発音チャンネルにアサインされたイベントデータに基づいて波形生成を行う（ステップＤ４）。そして、生成した楽音波形データをレジスタＷにストアする（ステップＤ５）。次に、Ｗの楽音波形データに左チャンネルのパンデータＰＡＮＬ（ＣＨ）の値を乗算してレジスタＷＬにストアする（ステップＤ６）。同様に、Ｗの楽音波形データに右チャンネルのパンデータＰＡＮＲ（ＣＨ）の値を乗算してレジスタＷＲにストアする（ステップＤ７）。
【００３８】
次に、レジスタＷＨＬにレジスタＷＬの楽音波形データを累算し（ステップＤ８）、レジスタＷＨＲにレジスタＷＲの楽音波形データを累算する（ステップＤ９）。すなわち、各発音チャンネルの楽音波形データを合成するための累算を行う。この後、ＣＨの値をインクリメントする（ステップＤ１０）。このとき、インクリメントしたＣＨの値が発音チャンネルの最大数より大きいか否かを判別し（ステップＤ１１）、ＣＨの値が最大数以下である場合には、ステップＤ３に移行してＯＮＦ（ＣＨ）の値を判別する。そして、ＣＨの値が最大数に達するまで、ステップＤ３からステップＤ１１までの処理を繰り返す。
【００３９】
ステップＤ１１においてＣＨの値が最大数より大きくなった場合、すなわち、ノートオンのイベントデータをアサインしたすべての発音チャンネルについて楽音波形データを生成し、レジスタＷＨＬ及びＷＨＲに楽音波形データにおける累算が終了した場合には、レジスタＷＨＬの楽音波形データにレジスタＭａｓｔｅｒ  Ｖｏｌｕｍｅの音量データを乗算し（ステップＤ１２）、レジスタＷＨＬの楽音波形データにＭａｓｔｅｒ  Ｖｏｌｕｍｅの音量データを乗算する（ステップＤ１３）。そして、図６のフローに戻る。
【００４０】
図９は、図６におけるステップＢ３の出力処理のフローである。このフローでは、生成して累算した楽音波形データをＲＡＭ４のリングバッファにストアし、サンプリング周期毎の出力タイミングに応じて、ストアした楽音波形データを出力する。リングバッファは、図１１に示すように、最小値のアドレスから最大値のアドレスまでのエリアで構成され、このリングバッファ内において、循環的に図の矢印の方向に順次進行する書込アドレスＡＷ及び読出アドレスＡＲによって対応するエリアが指定される。すなわち、最大値のアドレスの次には最小値のアドレスに戻って、リング状にアドレスが進行する。
【００４１】
図９のフローにおいて、まず、書込アドレスＡＷで指定されるリングバッファのエリアＢＵＦＦＥＲ（ＡＷ）に、レジスタＷＨＬ及びＷＨＲの合成された楽音波形データをストアする（ステップＥ１）。そして、書込アドレスＡＷをインクリメントして（ステップＥ２）、次の書込エリアを指定する。このときＡＷが最大値よりも大きくなったか否かを判別し（ステップＥ３）、最大値より大きくなった場合はＡＷを最小値にする（ステップＥ４）。
【００４２】
次に、サンプリング周期毎の出力タイミングになったか否かを判別する（ステップＥ５）。出力タイミングでない場合にはこのフローを終了するが、出力タイミングになったときは、読出アドレスＡＲで指定されるリングバッファのエリアＢＵＦＦＥＲ（ＡＲ）より、楽音波形データを読み出してＣＯＤＥＣ７に出力する（ステップＥ６）。そして、読出アドレスＡＲをインクリメントして（ステップＥ７）、次の読出エリアを指定する。このときＡＲが最大値よりも大きくなったか否かを判別し（ステップＥ８）、最大値より大きくなった場合はＡＲを最小値にする（ステップＥ９）。そして、図６のフローに戻る。
【００４３】
図１０は、図６におけるステップＢ４のバッファチェック処理のフローである。このフローにおいては、まず、書込アドレスＡＷのアドレス位置が読出アドレスＡＲのアドレス位置よりも大きいか否かを判別する（ステップＦ１）。書込アドレスＡＷが読出アドレスＡＲよりも大きい場合には、書込アドレスＡＷから読出アドレスＡＲを減算したアドレス差をレジスタＭ１にストアする（ステップＦ２）。
一方、読出アドレスＡＲが書込アドレスＡＷよりも大きい場合には、書込アドレスＡＷと最大値のアドレスから読出アドレスＡＲを減算した値とを加算した値をレジスタＭ１にストアする（ステップＦ３）。すなわち、リングバッファの書込アドレスＡＷが最大値のアドレスを過ぎて最小値のアドレスに戻った後には、書込アドレスＡＷのほうが読出アドレスＡＲより先行していても、アドレス値は読出アドレスＡＲのほうが大きいので、ステップＦ３のように、書込アドレスＡＷと最大値のアドレスから読出アドレスＡＲを減算した値とを加算した値をレジスタＭ１にストアする。
ステップＦ２又はステップＦ３のいずれにおいても、先に進行する書込アドレスＡＷのアドレス位置に対して、後から進行する読出アドレスＡＲのアドレス位置がどれだけ近いかを表すアドレス差がレジスタＭ１にストアされることになる。
【００４４】
次に、レジスタＭ１にストアした値（以下、「Ｍ１」という）と第１の所定数のサンプリング周期値Ｍ２とを比較する（ステップＦ４）。例えば、Ｍ２は５サンプリング周期である。Ｍ１がＭ２よりも大きい場合には、新たなノートオンのイベントデータが入力された場合でも、読出アドレスＡＲが書込アドレスＡＷに追いつくまでの間に、そのイベントデータの波形生成処理を完了することができる。この場合には、波形生成タスクを他のタスクよりも優先的に実行する必要はない。
【００４５】
この場合には、さらに、Ｍ１と第２の所定数のサンプリング周期値Ｍ３とを比較する（ステップＦ５）。例えば、Ｍ３は１０サンプリング周期である。Ｍ１がＭ３以下である場合には、他のタスクを波形生成タスクより優先的に実行する余裕はない。したがって、この場合には、波形生成タスクと他のタスクとを優劣なく平等に処理するために、プライオリティ（０）を「Ｎｏｒｍａｌ」にセットする（ステップＦ６）。
これに対して、Ｍ１がＭ３よりも大きい場合には、新たなノートオンのイベントデータが入力された場合でも、読出アドレスＡＲが書込アドレスＡＷに追いつくまでの間に、十分過ぎるな余裕で新たなイベントデータの波形生成タスクを完了することができる。この場合には、他のタスク（１）ないし（Ｎ）を波形生成タスクよりも優先的に処理しても差し支えない。したがって、プライオリティ（０）を「Ｌｏｗ」にセットする（ステップＦ７）。
【００４６】
ステップＦ４において、Ｍ１がＭ２以下である場合には、新たなノートオンのイベントデータが入力された場合には、読出アドレスＡＲが書込アドレスＡＷに追いつくまでの間に、そのイベントデータの波形生成処理を完了できないおそれがある。この場合には、波形生成タスクを他のタスクよりも優先的に実行する必要がある。したがって、プライオリティ（０）を「Ｈｉｇｈ」にセットする（ステップＦ８）。
【００４７】
この場合において、所定値の制限時間内に他のタスクであるタスク（１）ないしタスク（Ｎ）のすべてが実行できないことがある。すなわち、キーボードからの演奏データや外部からのＭＩＤＩデータのイベントデータを入力するデータ入力処理、表示すべき１画面のビットマップデータを生成する画像データ生成処理、リバーブなどのエフェクトを付加するエフェクト処理などのタスクが実行できないことがある。しかしながら、これらのタスクが犠牲になったとしても、ノイズの発生や古い楽音波形データを出力するという不具合を回避するほうが、楽音発生装置の機能としては重要である。
【００４８】
例えば、イベントデータを入力できなかったり、表示された画像に多少のちらつきがあったり、リバーブが軽くなるような状態が一時的にあった場合でも、聴く人に特別に違和感を与えることは少ないが、ノイズが発生したり、同じ楽音が重なった場合には、その不具合が目立つので、聴く人に大きな違和感を与えてしまう。
【００４９】
以上のように、上記実施形態の楽音発生装置によれば、ＣＰＵ１は、楽音波形データを生成する処理を行なう波形生成タスク（０）およびタスク（１）ないしタスク（Ｎ）を各タスク単位で繰り返し実行する際に、予め規定された制限時間である所定値内に実行可能な数のタスクを実行する。また、波形生成タスクによって生成した楽音波形データを書込アドレスＡＷで指定されるＲＡＭ４のリングバッファのエリアに書き込み、読出アドレスＡＲで指定されるリングバッファのエリアから楽音波形データを読み出す。この場合において、読出アドレスＡＲから書込アドレスＡＷまでのアドレス差Ｍ１がＭ２より小さい場合には、所定値内において波形生成タスク（０）を他のタスク（１）ないしタスク（Ｎ）よりも優先的に実行するので、デジタルアナログ変換器であるＣＯＤＥＣ７の前段に配置するＲＡＭ４のリングバッファの容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できる。
【００５０】
この場合において、アドレス差Ｍ１がＭ３より大きい場合には、他のタスク（１）ないしタスク（Ｎ）を波形生成タスク（０）よりも優先的に実行するので、データ入力処理、画像データ生成処理、エフェクト処理などを円滑に行なうことにより、より高い音質の楽音を発生できる。
【００５１】
また、アドレス差Ｍ１がＭ２からＭ３までの範囲内である場合には、波形生成タスク（０）と他のタスク（１）ないしタスク（Ｎ）とを優劣なく平等に実行するので、ＣＰＵ１のデバイスの処理速度に適応した本来のプログラムの設計通りの高い音質の楽音を発生できる。
【００５２】
なお、上記実施形態においては、優先的に実行する波形生成タスク（０）の優先度を他のタスク（１）ないし（Ｎ）よりも高く設定するように構成にしたが、実施形態の変形例として、優先的に実行する波形生成タスク（０）以外のタスク（１）ないし（Ｎ）の優先度を低く設定するように構成してもよい。
【００５３】
なおまた、上記実施形態においては、楽音発生処理のプログラムをＲＯＭ３に記憶する構成にしたが、例えば、フレキシブルディスク（ＦＤ）又はＣＤ−ＲＯＭなどの外部記憶媒体に記憶されている楽音発生処理のプログラム、又は、インターネット等の通信網を介して接続されたサーバに記憶されている楽音発生処理のプログラムを、汎用のコンピュータシステムにおける書き換え可能なハードディスクやフラッシュメモリで構成されたメモリにインストールして、その楽音発生処理のプログラムをコンピュータによって実行するような構成にしてもよい。この場合には、プログラムの発明を実現できる。
【００５４】
すなわち、その楽音発生処理のプログラムは、楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に、あらかじめ規定された制限時間内に実行可能な数のタスクを実行するコンピュータを用いて楽音を発生する楽音発生装置のプログラムであって、
波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む第１のステップと、読出アドレスで指定される記憶手段のエリアから楽音波形データを読み出す第２のステップと、読出アドレスから書込アドレスまでのアドレス差が所定範囲より小さい場合には制限時間内において波形生成タスクを他のタスクよりも優先的に実行するようにコンピュータに指令する第３のステップとを実行する。
したがって、デジタルアナログ変換器の前段に配置するリングバッファなどの記憶手段の容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できる。
【００５５】
なおまた、上記実施形態においては、ソフトウェアによって楽音を発生させるソフトウェア音源の楽音発生装置を例に採って本発明を説明したが、本発明の適用範囲はソフトウェア音源に限定されるものではない。ＤＳＰ（デジタル・シグナル・プロセッサ）等のようにハードウェア音源を用いた楽音発生装置においても、本発明を適用することは可能である。例えば、波形メモリに記憶されているＰＣＭ波形データを読み出すタスクを優先的に実行することにより、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できる。
【００５６】
【発明の効果】
本発明によれば、複数のタスクのうち楽音波形を生成する波形生成タスクを優先して実行するので、デジタルアナログ変換器の前段に配置する記憶手段であるバッファの容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できるという効果が得られる。
【図面の簡単な説明】
【図１】本発明の実施形態における楽音発生装置の構成を示すブロック図。
【図２】図１のＲＡＭに設定されるタスク群および各タスクに対する優先度を設定するプライオリティデータ群を示す図。
【図３】図１のＣＰＵによって実行されるタスク処理ルーチンのメインフローチャート。
【図４】図３に続くタスク処理ルーチンのメインフローチャート。
【図５】図４に続くタスク処理ルーチンのメインフローチャート。
【図６】図３ないし図５における波形生成のタスク処理のフローチャート。
【図７】図６のタスク処理における入力処理のフローチャート。
【図８】図６のタスク処理における生成処理のフローチャート。
【図９】図６のタスク処理における出力処理のフローチャート。
【図１０】図６のタスク処理におけるバッファチェック処理のフローチャート。
【図１１】図１のＲＡＭのリングバッファにおける書込アドレスおよび読出アドレスの位置関係を示す図。
【符号の説明】
１  ＣＰＵ
３  ＲＯＭ
４  ＲＡＭ
５  操作部
６  表示部
７  ＣＯＤＥＣ
【図１】
2004246145.tif 000003
【図２】
2004246145.tif 000004
【図３】
2004246145.tif 000005
【図４】
2004246145.tif 000006
【図５】
2004246145.tif 000007
【図６】
2004246145.tif 000008
【図７】
2004246145.tif 000009
【図８】
2004246145.tif 000010
【図９】
2004246145.tif 000011
【図１０】
2004246145.tif 000012
【図１１】
2004246145.tif 000013