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