(57)【要約】【課題】演算処理装置上で所定の楽音生成ソフトウェアを実行することにより楽音を生成するソフト音源において、効果付与処理の計算順序を動的に変更できるようにすることを目的とする。【解決手段】各エフェクト処理に対応して波形バッファを用意する。各エフェクト処理ソフトウェアによって演算処理装置で実行される処理は、対応する波形バッファの複数波形サンプルに対して所定のエフェクト処理を施し、処理後の波形サンプルを対応する波形バッファに書き込むものである。また、波形バッファのうちの任意の１つの波形サンプルに所定のレベル制御を施して別の任意の波形バッファに記憶された波形サンプルに足して再び同記憶位置に書き込むａｄｄ処理を備える。エフェクト処理とａｄｄ処理は、所望のエフェクトアルゴリズムに応じて処理順序を指定し、ａｄｄ処理で加算し、加算される波形バッファを指定することができるようにする。【選択図】図５
2006221209.tif 000002
【特許請求の範囲】
【請求項１】
各種のソフトウェアを実行可能な演算処理装置と、
生成された複数波形サンプルを記憶する波形バッファであって、該波形バッファは複数のエフェクト対応に複数設けられているものと、
複数のエフェクト処理ソフトウェアを格納した記憶装置であって、各エフェクト処理ソフトウェアによって前記演算処理装置で実行される処理は、対応する波形バッファの複数波形サンプルに対して所定のエフェクト処理を施し、処理後の波形サンプルを対応する波形バッファに書き込むものであるものと、
前記波形バッファのうちの任意の１つの波形サンプルに所定のレベル制御を施して別の任意の波形バッファに記憶された波形サンプルに足して再び同記憶位置に書き込むａｄｄ処理を前記演算処理装置で実行させるためのａｄｄ処理ソフトウェアを格納した記憶装置と、
各波形バッファ上で実行される各波形バッファに対応する前記エフェクト処理、および任意の２つの波形バッファ間で実行される前記ａｄｄ処理に関して、所望のエフェクトアルゴリズムに応じて、エフェクト処理とａｄｄ処理の処理順序を指定し、該ａｄｄ処理で加算する波形バッファと加算される波形バッファを指定する手段と
を備えたことを特徴とする楽音発生装置。
【請求項２】
ユーザが前記複数エフェクトの結線状態を示すアルゴリズムを指定するための指定手段をさらに備え、
前記波形バッファを指定する手段では、前記指定手段で設定されたアルゴリズムに応じて、複数エフェクト処理および複数ａｄｄ処理の処理順序を変更する
ことを特徴とする請求項１に記載の楽音発生装置。
【請求項３】
処理装置で実行され、複数チャンネル分の楽音を発生可能な楽音発生方法であって、
演奏情報を供給するステップと、
所定時間間隔でタイミング信号を発生するステップと、
前記タイミング信号の発生ごとに、前記演奏情報に応じた所定数のサンプルを生成して複数のエフェクト処理にそれぞれ対応した複数のバッファに出力する処理を複数チャンネル分実行することにより、該複数のバッファのそれぞれに、チャンネル累算された波形データを生成する生成ステップと、
あるバッファの複数波形サンプルに対してエフェクト付与処理を施した後、処理後の波形サンプルをそのバッファに書き込む、各バッファに対応した複数のエフェクト処理と、任意の１つのバッファ上の波形サンプルに所定のレベル制御を施して別の任意のバッファに記憶された波形サンプルに足して再び同記憶位置に書き込むａｄｄ処理とを、指定されたエフェクトアルゴリズムに応じた処理順序で実行することにより、エフェクト処理を施した波形データを生成出力するエフェクト処理ステップと、
該エフェクト処理ステップから出力された波形データを、サンプリング周期ごとに１サンプルずつディジタルアナログ変換器に供給し、アナログ波形に変換するステップと
を備えたことを特徴とする楽音発生方法。
【請求項４】
処理装置で実行され、複数チャンネル分の楽音を発生可能な楽音発生方法に係るプログラムを記憶した、処理装置が読み取り可能な記憶媒体であって、
前記楽音発生方法に係るプログラムは、処理装置に、
演奏情報を供給するステップと、
所定時間間隔でタイミング信号を発生するステップと、
前記タイミング信号の発生ごとに、前記演奏情報に応じた所定数のサンプルを生成して複数のエフェクト処理にそれぞれ対応した複数のバッファに出力する処理を複数チャンネル分実行することにより、該複数のバッファのそれぞれに、チャンネル累算された波形データを生成する生成ステップと、
あるバッファの複数波形サンプルに対してエフェクト付与処理を施した後、処理後の波形サンプルをそのバッファに書き込む、各バッファに対応した複数のエフェクト処理と、任意の１つのバッファ上の波形サンプルに所定のレベル制御を施して別の任意のバッファに記憶された波形サンプルに足して再び同記憶位置に書き込むａｄｄ処理とを、指定されたエフェクトアルゴリズムに応じた処理順序で実行することにより、エフェクト処理を施した波形データを生成出力するエフェクト処理ステップと、
該エフェクト処理ステップから出力された波形データを、サンプリング周期ごとに１サンプルずつディジタルアナログ変換器に供給し、アナログ波形に変換するステップと
を実行させるプログラムを記憶した、処理装置が読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、演算処理装置上で所定の楽音生成ソフトウェアを実行することにより楽音を生成する楽音発生装置および楽音発生方法、並びに該方法に係るプログラムを記憶した記憶媒体に関する。
【背景技術】
【０００２】
従来より、ＣＰＵなどの汎用の演算処理装置上で所定の楽音生成ソフトウェアを実行することにより楽音を生成する楽音発生装置が知られている。これは、いわゆるソフトウェア音源あるいはソフト音源と呼ばれる方式のものである。ソフト音源においても、やはりソフトウェア（ソフトエフェクタ）を用いて、生成した楽音に残響効果（リバーブ）などの効果（エフェクト）付与処理を施して出力するものがある。近年では、ソフト音源においても高機能化が求められ、多種多様な効果付与を施したいという要求がある。
【０００３】
ソフト音源においては、ソフトウェアで楽音を生成する際に複数サンプルをまとめて生成するため、波形生成用バッファ領域が設けられる。図３（ｂ）は、そのような波形生成用バッファ領域の例を示す。図３（ｂ）において、１，２，…，１２８は１２８組の波形サンプル（時間的な順序で並んでいる時系列データである）格納領域である。１組の波形サンプル格納領域は、ＤｒｙＬ，ＤｒｙＲ，Ｒｅｖからなる。ＤｒｙＬはステレオ左側のリバーブをつけない波形サンプルの格納領域、ＤｒｙＲはステレオ右側のリバーブをつけない波形サンプルの格納領域、Ｒｅｖはリバーブへの入力とするための波形サンプルの格納領域である。要するに、（ＤｒｙＬ，ＤｒｙＲ，Ｒｅｖ）を１単位としてインターリーブ形式で波形サンプルを持つようにしていた。これは、波形計算部分で、各チャンネルの出力データを書き出す際にこのような順番に並んでいると都合が良かったためである。
【０００４】
ソフト音源では、例えば、所定の時間間隔であるフレームごとに、楽音生成すべき全チャンネルの１フレーム分の波形サンプル（１２８サンプル）を生成し図３（ｂ）の波形生成用バッファに累算して発音する波形データを算出する。始めに第１チャンネルの１２８サンプルを生成し重み付け（各サンプルのＤｒｙＬ，ＤｒｙＲ，Ｒｅｖの各値にそれぞれ所定の係数を乗算すること）して図３（ｂ）の波形生成用バッファに格納し、次に第２チャンネルの１２８サンプルを生成し重み付けして図３（ｂ）の波形生成用バッファに累算し、次に第３チャンネルの１２８サンプルを生成し重み付けして図３（ｂ）の波形生成用バッファに累算し、…という具合である。これにより、発音すべきチャンネルの波形サンプルの累算結果が１２８サンプル分得られる。生成した波形データは、例えばＤＭＡＣ（ダイレクトメモリアクセスコントローラ）に指示してサウンドＩ／Ｏ（楽音波形データの入出力を実行するコーデック（ＣＯＤＥＣ）と呼ばれるＬＳＩ）に渡し、サウンドＩ／Ｏがディジタルアナログ（Ｄ／Ａ）変換してサウンドシステムにより放音する。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
ところで、ソフト音源でも多様な効果付与を実現したいという要求はあるが、通常、複数の効果付与処理を行なう場合の計算順序（いわばソフトエフェクタの結線関係）は動的に変更できるものではないという不具合がある。
【０００６】
また、ソフト音源に用いる演算処理装置には内部または外部にキャッシュメモリを備えたものも用いられるが、図３（ｂ）のような波形生成用バッファのデータ構造だと、波形生成処理時、特にソフトエフェクタによる計算処理時にキャッシュミスが起こりやすいという不具合がある。例えば、図３（ｂ）の例では、リバーブ付与の計算を行なうソフトエフェクタはインターリーブ形式で飛び飛びに格納されている１２８サンプル分のＲｅｖを取り出して計算処理することになり、キャッシュミスが起こりやすい。付与する効果がリバーブだけの場合はそれ程のオーバヘッドは生じないが、付与する効果が増えると、特にキャッシュミスが起こりやすくなる。例えば、３種類（リバーブ、コーラス、バリエーション）の効果付与で出力が７系統の場合、図３（ｂ）のデータ構造を拡張して（ＤｒｙＬ，ＤｒｙＲ，Ｒｅｖ，ＣｈｏｒｕｓＬ，ＣｈｏｒｕｓＲ，ＶａｒｉａｔｉｏｎＬ，ＶａｒｉａｔｉｏｎＲ）を１単位として１２８サンプル分並べた波形生成用バッファを用いることにすると、エフェクタは、
（１）ＶａｒｉａｔｉｏｎＬ，ＶａｒｉａｔｉｏｎＲを１２８サンプル分まとめてバリエーションの計算処理を実行
（２）ＣｈｏｒｕｓＬ，ＣｈｏｒｕｓＲを１２８サンプル分まとめてコーラスの計算処理を実行
（３）Ｒｅｖを１２８サンプル分まとめてリバーブの計算処理を実行
という順序で計算するため、波形生成用バッファ領域上の飛び飛びのデータ領域を頻繁に行ったり来たりしてアクセスしなければならず、頻繁にキャッシュミスが起こり大変効率が悪い。
【０００７】
この発明は、ソフト音源において、効果付与処理の計算順序を動的に変更できるようにした楽音発生装置および楽音発生方法、並びに該方法に係るプログラムを記憶した記憶媒体を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、各エフェクト処理に対応して波形バッファを用意したことを特徴とする。各エフェクト処理ソフトウェアによって演算処理装置で実行される処理は、対応する波形バッファの複数波形サンプルに対して所定のエフェクト処理を施し、処理後の波形サンプルを対応する波形バッファに書き込むものである。また、波形バッファのうちの任意の１つの波形サンプルに所定のレベル制御を施して別の任意の波形バッファに記憶された波形サンプルに足して再び同記憶位置に書き込むａｄｄ処理を備えている。各波形バッファ上で実行される各波形バッファに対応するエフェクト処理、および任意の２つの波形バッファ間で実行されるａｄｄ処理については、所望のエフェクトアルゴリズムに応じて、エフェクト処理とａｄｄ処理の処理順序を指定し、該ａｄｄ処理で加算する波形バッファと加算される波形バッファを指定することができるようにしている。
【０００９】
さらに、ユーザが前記複数エフェクトの結線状態を示すアルゴリズムを指定するための指定手段をさらに備え、前記指定手段で設定されたアルゴリズムに応じて、複数エフェクト処理および複数ａｄｄ処理の処理順序を変更することができるようにしている。
【００１０】
処理のタイミングとしては、所定時間間隔でタイミング信号を発生するようにし、タイミング信号の発生ごとに、演奏情報に応じた所定数のサンプルを生成して複数のエフェクト処理にそれぞれ対応した複数のバッファに出力する処理を複数チャンネル分実行することにより、該複数のバッファのそれぞれに、チャンネル累算された波形データを生成するようにする。このように演奏情報に応じた波形データを複数のエフェクト処理にそれぞれ対応した複数のバッファに用意した後、上述したエフェクト処理とａｄｄ処理を、指定されたエフェクトアルゴリズムに応じた処理順序で実行し、エフェクト処理を施した波形データを生成出力する。出力された波形データは、サンプリング周期ごとに１サンプルずつディジタルアナログ変換器に供給し、アナログ波形に変換する。
【発明の効果】
【００１１】
以上説明したように、本発明によれば、各エフェクト処理に対応して波形バッファが用意されているので、複数エフェクト間の結線が容易に変更できる。また、エフェクト処理は対応するバッファ上で行なうとともに、ａｄｄ処理でどのバッファからどのバッファへでも累算できるようにしているので、ユーザが任意にソフトエフェクタのアルゴリズムを指定しても、該アルゴリズムに応じてエフェクト処理とａｄｄ処理の順序を入れ替えるだけでよくなる。したがって、エフェクト付与処理の計算順序がユーザの指定に応じて動的に変更できるようになる。また、各エフェクト処理に対応して用意されたバッファ上で波形サンプル生成とエフェクト付与（指定されたエフェクトアルゴリズムに応じた処理順序でエフェクト処理とａｄｄ処理とを行なうようにしている）を行なっているので、複数エフェクト間の結線が容易に変更できる。
【発明を実施するための最良の形態】
【００１２】
以下、図面を用いてこの発明の実施の形態を説明する。
【００１３】
図１は、この発明に係る楽音発生装置を適用した電子楽器のブロック構成図を示す。この電子楽器は、中央処理装置（ＣＰＵ）１０１、リードオンリメモリ（ＲＯＭ）１０２、ランダムアクセスメモリ（ＲＡＭ）１０３、ドライブ装置１０４、タイマ１０６、ネットワーク入出力（Ｉ／Ｏ）インタフェース１０７、キーボード１０８、ディスプレイ１０９、ハードディスク１１０、サンプリングクロック（Ｆｓ）発生器１１１、サウンドＩ／Ｏ１１２、ＤＭＡ（ダイレクトメモリアクセス）コントローラ１１４、サウンドシステム１１５、およびバスライン１１６を備えている。
【００１４】
ＣＰＵ１０１は、この電子楽器全体の動作を制御する。ＣＰＵ１０１は、内部にキャッシュメモリ１１７を備えたものである。キャッシュメモリ１１７のキャッシュライン（キャッシュブロック）サイズは３２バイトである。すなわち、ＣＰＵ１０１がＲＯＭ１０２やＲＡＭ１０３などから適当なアドレスのデータを読み出した際には、そのアドレスを含む連続した３２バイトがキャッシュメモリ１１７の所定のキャッシュラインにコピーされる。その後、この３２バイトの何れかのデータに対する読み出しが発生したときには、ＲＯＭ１０２やＲＡＭ１０３から読み出す代わりに、当該キャッシュラインのデータを供給する。キャッシュメモリ１１７のアクセスは非常に高速に行なわれるので、データがキャッシュメモリ１１７上にある間は、非常に高速に処理できる。なお、キャッシュメモリには、ライトスルー方式とライトバック方式とがあるが、ここで用いたキャッシュメモリ１１７はライトスルー方式とする。
【００１５】
ＲＯＭ１０２は、ＣＰＵ１０１が実行する制御プログラム（ソフトエフェクタを含むソフト音源のプログラムなど）や各種の定数データなどを格納する。またＲＯＭ１０２上には、ＣＰＵ１０１がソフト音源のプログラムを実行して楽音生成するときに使用する波形データ（所定のレートでサンプリングされた波形サンプルデータ）が用意されている。なお、制御プログラムや各種定数データなど、および波形データは、ＲＯＭ１０２でなく、ＲＡＭ１０３上に用意したものを使用することもできる。この場合、制御プログラムなどのデータは、ＣＤ−ＲＯＭなどの外部記憶媒体やネットワークＩ／Ｏ１０７から供給され、ＲＡＭ１０３上に展開されたり、ハードディスク１１０に保存される。ＲＡＭ１０３には、各種のレジスタ、波形生成用バッファ、再生バッファなどのワーク領域が設けられる。ドライブ装置１０４は、ＦＤ（フレキシブルディスク）やフラッシュカードなどの外部記憶媒体１０５との間で各種データを入出力するためのものである。ハードディスク１１０は、各種データの記録用に用いる記憶装置である。
【００１６】
タイマ１０６は、ＣＰＵ１０１に対して所定間隔でタイマ割り込みを発生させるためのタイマクロック信号を発生する。ネットワークＩ／Ｏインタフェース１０７は、外部の公衆回線やＬＡＮ（ローカルエリアネットワーク）を介して各種データを授受するためのインタフェースである。キーボード１０８は、各種の情報を入力するために用いるタイピングキーボードである。ディスプレイ１０９は、各種の情報を表示するディスプレイである。ユーザは、キーボード１０８およびディスプレイ１０９を用いてこの電子楽器に対する各種の設定操作および指示操作を行なうことができる。
【００１７】
Ｆｓ発生器１１１は、サウンドＩ／Ｏ１１２に与える周波数Ｆｓのサンプリングクロックを発生する。サウンドＩ／Ｏ１１２は、コーデック（ＣＯＤＥＣ）と呼ばれるＬＳＩからなる。サウンドＩ／Ｏ１１２は、アナログディジタル（Ａ／Ｄ）変換機能およびディジタルアナログ（Ｄ／Ａ）変換機能を備えており、Ａ／Ｄ入力端子には外部入力１１３からのアナログ楽音信号が入力し、Ｄ／Ａ出力端子にはサウンドシステム１１５が接続される。サウンドＩ／Ｏ１１２は、内部に２つのＦＩＦＯ（First In First Out）方式のスタック領域を備えている。一つはＡ／Ｄ入力端子経由で入力されたディジタル波形データを保持する入力ＦＩＦＯであり、もう一つはＤ／Ａ出力端子経由で出力するディジタル波形データを保持する出力ＦＩＦＯである。
【００１８】
外部入力１１３からサウンドＩ／Ｏ１１２のＡ／Ｄ入力端子に入力したアナログ楽音信号は、周波数Ｆｓのサンプリングクロックに応じてＡ／Ｄ変換され、（必要に応じてＡＤＰＣＭ方式などで圧縮してもよい）入力ＦＩＦＯへ書き込まれる。入力ＦＩＦＯに波形データが入っていると、サウンドＩ／Ｏ１１２は、ＤＭＡコントローラ１１４に対してその入力波形データを処理する要求を出す。ＤＭＡコントローラ１１４は、その処理要求に応じて、入力ＦＩＦＯのデータをＲＡＭ１０３上の所定の領域（あらかじめ確保されている録音バッファ領域）に転送する。このＤＭＡコントローラ１１４によるデータの転送は、ＤＭＡコントローラ１１４がサンプリングクロックＦｓごとにＣＰＵ１０１に割り込み（ハードウェア割り込み）をかけバスライン１１６を確保して行なう。ＣＰＵ１０１は、ＤＭＡコントローラ１１４によるバスライン１１６の確保を意識することはない。
【００１９】
一方、サウンドＩ／Ｏ１１２内の出力ＦＩＦＯに波形データが存在する場合、その出力ＦＩＦＯ内の波形データは、サンプリングクロックＦｓごとにＤ／Ａ変換され、Ｄ／Ａ出力端子経由でサウンドシステム１１５に送出され放音される。出力ＦＩＦＯの波形データが出力されると、出力ＦＩＦＯに空きができるので、サウンドＩ／Ｏ１１２は、ＤＭＡコントローラ１１４に波形データ取得の要求を出す。ＣＰＵ１０１は、あらかじめ出力したい波形データを生成してＲＡＭ１０３上の再生バッファ（後述するＰＢ０，ＰＢ１）に置いておき、ＤＭＡコントローラ１１４にはその波形の再生要求を出しておく。ＤＭＡコントローラ１１４は、サンプリングクロックＦｓごとにＣＰＵ１０１に割り込みをかけてバスライン１１６を確保し、ＲＡＭ１０３上の再生バッファの波形データをサウンドＩ／Ｏ１１２の出力ＦＩＦＯに転送する。このＤＭＡコントローラ１１４による波形データの転送は、ＣＰＵ１０１が意識することはない。出力ＦＩＦＯに書き込まれた波形データは、上述したようにサンプリングクロックＦｓごとにサウンドシステム１１５へと送られて放音される。
【００２０】
ソフト音源はＣＰＵ１０１がＲＯＭ１０２の楽音生成ソフトウェアを実行することにより実現されるが、該ソフト音源を利用する側から見ると、楽音生成ソフトウェアをドライバとして登録しておき、該ドライバを起動した後、所定のソフト音源に係るＡＰＩ（Application Program Interface）に各種演奏入力を表わすＭＩＤＩ（Musical Instruments digital Interface）イベントメッセージを出力して楽音生成に関する各種の処理をソフト音源に行なせる、という手順になる。ＣＰＵ１０１は汎用の演算処理装置であり、該ＡＰＩに対して演奏入力を与える処理、すなわちＭＩＤＩイベントを該ＡＰＩに出力する処理など、ソフト音源とは別の処理も行なっている。ＣＰＵ１０１が該ＡＰＩに対して演奏入力を与える処理とは、例えば、不図示の演奏操作子（鍵盤など）の操作に応じてリアルタイムで発生する演奏入力を該ＡＰＩに出力したり、ネットワークＩ／Ｏ１０７を介してリアルタイムで入力したＭＩＤＩイベントに応じた演奏入力を該ＡＰＩに出力したり、ＲＡＭ１０３上にＭＩＤＩイベントのシーケンスを用意しておき（外部記憶媒体１０５やハードディスク１１０上にあるデータを用いてもよいし、ネットワークＩ／Ｏ１０７を介して入力したデータを用いてもよい）これを順次演奏入力として該ＡＰＩに出力したり、といった処理である。
【００２１】
図２を参照して、ソフト音源の楽音生成原理を説明する。図２において、Ｓ１〜Ｓ４の各区間は、所定のサンプル数（２×１２８サンプル）分の再生を行なう単位となる時間フレームを示す。「演奏入力」のライン上に記載してある下向き矢印は、その時刻で演奏入力があったことを示す。演奏入力とは、上述のソフト音源に係るＡＰＩに、ノートオン、ノートオフ、アフタタッチ、プログラムチェンジなどの各種のＭＩＤＩイベントが入力されることである。図２の例では、フレームＳ１で３つ、Ｓ２で２つ、Ｓ３で１つの演奏入力がそれぞれあったということである。ソフト音源は、複数チャンネル分の複数楽音を同時生成可能であり、ＲＡＭ１０３上に用意される複数チャンネル分のソフト音源レジスタで各楽音を制御するようになっている。ソフト音源は、演奏入力としてノートオンイベントを入力したときは、ソフト音源レジスタに関して発音割り当てを行ない、割り当てたチャンネルに対応するソフト音源レジスタに該チャンネルの発音を制御する各種のデータとノートオンを書き込む。演奏入力としてノートオフイベントを入力したときは、該当するチャンネルに対応するソフト音源レジスタにノートオフを書き込む。ノートオンやノートオフ以外の演奏入力（例えばアフタタッチの変更など）についても同様に、該当するチャンネルに対応するソフト音源レジスタに演奏入力に応じたデータを書き込む。ある時間フレームでソフト音源レジスタに書込まれたデータは、データの種類にかかわりなく、必ず次の時間フレームから波形生成演算に使用される。
【００２２】
図２の「ＣＰＵによる波形生成」の矩形２０１〜２０４は、ＣＰＵ１０１により効果付与も含めた波形生成演算を実行する区間を示す。この波形生成演算では、ソフト音源レジスタに設定された複数チャンネル分のデータに基づいて複数チャンネル分の楽音波形生成を行なう。演奏入力に応じてソフト音源レジスタが書き換えられ、一方、演奏入力のない期間は、ソフト音源レジスタは過去に書込まれたデータを保持している。したがって、各波形生成の区間２０１〜２０４では、直前あるいはさらに前のフレームで検出した演奏入力に応じた波形生成演算を実行することになる。フレームが切り替わるタイミングでフレーム割り込みが発生するので、各フレームでの波形生成演算（後述の図７（ａ））はこのフレーム割り込みを契機として実行される。
【００２３】
例えば、フレームＳ１で検出された３つの演奏入力に対しては、次のフレームＳ２の先頭のフレーム割り込みを契機として区間２０２で波形生成演算を行なう。ＣＰＵ１０１は、この波形生成演算により、ＲＡＭ１０３上の波形生成用バッファに波形データ（複数チャンネル分を累算したものであって、かつ効果も付与したもの）を生成する。生成した波形データはＲＡＭ１０３上の再生バッファ領域に書き込む。この再生バッファ領域としては、連続したアドレスに用意された同じ大きさの２つのバッファ領域ＰＢ０とＰＢ１（２つをまとめてダブルバッファと呼ぶ）を用いる。再生バッファ領域への書き込みは、後述する図７（ａ）のステップ７０７で行なう。また、フレームごとにバッファＰＢ０とＰＢ１とを交互に用いるようにする。例えば、フレームＳ１の区間２０１で生成した波形データはＲＡＭ１０３上の再生バッファ領域ＰＢ０に書き込み、フレームＳ２の区間２０２で生成した波形データは再生バッファ領域ＰＢ１に書き込み、フレームＳ３の区間２０３で生成した波形データは再生バッファ領域ＰＢ０に書き込み、フレームＳ４の区間２０４で生成した波形データは再生バッファ領域ＰＢ１に書き込み、…というように、交互にＰＢ０とＰＢ１に波形データを書き込む。
【００２４】
再生バッファＰＢ０およびＰＢ１に書き込んだ波形データの読み出し再生は、図２の「読み出し再生」に示すように、フレーム割り込みを契機として、波形生成したフレームの次のフレームの区間で行なう。すなわち、フレームＳ１で生成しＰＢ０に書き込んだ波形データは次のフレームＳ２で、フレームＳ２で生成しＰＢ１に書き込んだ波形データは次のフレームＳ３で、フレームＳ３で生成しＰＢ０に書き込んだ波形データは次のフレームＳ４で、…というように、ＰＢ０とＰＢ１の波形データを交互に読み出し再生していく。読み出し再生は、ＤＭＡコントローラ１１４が、サンプリングクロックＦｓごとにＣＰＵ１０１に割り込みをかけて、ＲＡＭ１０３上の再生バッファ（ＰＢ０またはＰＢ１の指定された方）の波形データをサウンドＩ／Ｏ１１２の出力ＦＩＦＯに転送することにより行なう。フレーム割り込みは、再生バッファＰＢ０およびＰＢ１をループ読み出しする際のリターン発生時（すなわちＰＢ１の再生終了時）と、ループ読み出しの中間点通過時（すなわちＰＢ０の再生終了時）に発生する。フレーム割り込みは、サウンドＩ／Ｏ１１２が発生するハードウェア割り込みであり、１フレーム再生完了の時点を示す。すなわち、サウンドＩ／Ｏ１１２は、転送サンプル数（ＤＭＡＣ１１４によりＰＢ０，ＰＢ１からサウンドＩ／Ｏの出力ＦＩＦＯに転送したサンプル数）をカウントし、再生バッファのサイズ（ＰＢ０，ＰＢ１を合せたサイズ）の半分の数のサンプルの転送ごとにフレーム割り込みを発生する。
【００２５】
図３（ａ）は、ＣＰＵ１０１が波形生成を行なうときに使用する波形生成用バッファの構成例を示す。波形生成用バッファは、ｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤの４つからなる。ｍｉｘＡは、ドライ（ｄｒｙ）用、すなわち効果を付けない波形データを設定するバッファである。ｍｉｘＢは、リバーブ（ｒｅｖ）用、すなわちリバーブ処理への入力となる波形データを設定するバッファである。ｍｉｘＣは、コーラス（ｃｈｏ）用、すなわちコーラス処理への入力となる波形データを設定するバッファである。ｍｉｘＤは、バリエーション（ｖａｒ）用、すなわちバリエーション処理への入力となる波形データを設定するバッファである。ｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤのそれぞれは、ステレオ左側（Ｌ側）波形サンプルの記憶領域とステレオ右側（Ｒ側）波形サンプルの記憶領域とを１組として、１２８組のサンプル（サンプル数では、２×１２８＝２５６サンプル）の記憶領域からなる。Ｌ側波形サンプルおよびＲ側波形サンプルは、それぞれ、１６ビット（２バイト）サンプルである。ｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤのそれぞれは、先頭から順に３２バイト単位（すなわち１６サンプル分）でキャッシングされるようにバウンダリ調整されている。
【００２６】
図４は、ソフト音源による楽音生成からチャンネル累算までのアルゴリズムの例を示す。波形メモリ４０１は、所定のレートでサンプリングされた波形サンプルデータを格納したメモリである。ここでは、ＲＯＭ１０２上に波形データが用意されているものとする。ただし、ＲＡＭ１０３上に用意した波形データを用いてもよい。ＲＡＭ１０３上の波形データは、ＲＯＭ１０２、外部記憶媒体１０５、またはハードディスク１１０から読み出したデータ、あるいはネットワークＩ／Ｏ１０７を介して入力したデータや、サウンドＩ／Ｏ１１２により外部入力１１３をサンプリングして得た波形データなどを用いてもよい。
【００２７】
ソフト音源は、まず必要なチャンネル数分（最大チャンネル数はＣＰＵの能力に応じて決めておく。ここでは最大３２チャンネルとする。）の楽音生成処理４０２を実行する。どのチャンネルからでも演算できるので、後着優先で演算処理したり、音量レベルが小さくなったチャンネルは優先度を落としたりしてもよい。１チャンネル分の楽音生成は、波形読み出し＆補間処理４１１により波形メモリの波形データを読み出して補間し、フィルタ４１２でフィルタリングし、フィルタ４１２の出力を８系列に分けてそれぞれ乗算器４１３−１から４１３−８により所定の係数を乗算する処理などからなる。８系列の出力は、乗算器４１３−１でドライＬ（ステレオ左）用係数を乗算して得るドライＬ出力、乗算器４１３−２でドライＲ（ステレオ右）用係数を乗算して得るドライＲ出力、乗算器４１３−３でリバーブＬ用係数を乗算して得るリバーブＬ出力、乗算器４１３−４でリバーブＲ用係数を乗算して得るリバーブＲ出力、乗算器４１３−５でコーラスＬ用係数を乗算して得るコーラスＬ出力、乗算器４１３−６でコーラスＲ用係数を乗算して得るコーラスＲ出力、乗算器４１３−７でバリエーションＬ用係数を乗算して得るバリエーションＬ出力、および乗算器４１３−８でバリエーションＲ用係数を乗算して得るバリエーションＲ出力である。各発音チャンネルごとに得られるこれら８系列の出力は、ミキサ４０３−１から４０３−８により系列ごとにミキシング（チャンネル累算）される。そして、インターリーブ処理４０４−１から４０４−４によりＬとＲでインターリーブして、４０５−１から４０５−４に示す図３（ａ）の波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤに設定する。
【００２８】
ユーザは、キーボード１０８、ディスプレイ１０９を使用してエフェクトエディットコマンドを入力することにより、図６（ａ）のメインフローのステップ６０７においてエフェクトエディット処理プログラム（図示せず）を実行し、ソフトエフェクタのアルゴリズムやパラメータなどをエディット可能である。図５は、ユーザのエディットにより設定されたソフトエフェクタのアルゴリズムの一例であり、図４の処理により波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤ上に生成された波形データに複数の効果を施すようになっている。
【００２９】
ソフトエフェクトのアルゴリズムエディットでは、例えば、ソフトエフェクタの処理のブロック数（図５では３ブロック）、各ブロックの処理内容（図５では、リバーブとコーラスとバリエーション）、複数ブロック間の結線情報（図５では、５つのａｄｄ処理による３つのブロック間の結線）などがユーザにより指定され、エフェクトエディット処理プログラムでは、指定された複数ブロックのエフェクトと複数のａｄｄ処理の処理順序を、指定された結線が可能となるように自動決定し、図５のアルゴリズムを有するエフェクト処理プログラムを作成する。図５のアルゴリズムは、以下の（１）〜（６）の手順の処理を表わしている。
【００３０】
（１）５０１−４の波形生成用バッファｍｉｘＤの波形データを読み出し、バリエーション処理５０７を施して、結果をｍｉｘＤに上書きする。
【００３１】
（２）ａｄｄ（ｍｉｘＤ−＞ｍｉｘＡ）    …図５の５０８
ａｄｄ（ｍｉｘＤ−＞ｍｉｘＢ）    …図５の５０２
ａｄｄ（ｍｉｘＤ−＞ｍｉｘＣ）    …図５の５０４
を実行する。ａｄｄは、−＞の前側に記載してあるバッファの各サンプルに所定の係数を乗算して重み付けし、−＞の後側に記載してあるバッファの各サンプルに足し込む処理である。ａｄｄ処理は、共通ルーチンを使用し、重み付けの係数は、どの処理結果に重み付けしてどこに足し込むかに応じてあらかじめ指定してあるものとする。これらのａｄｄ処理５０８，５０２，５０４により、バリエーション処理５０７を施した結果をそれぞれ重み付けして、ドライ用バッファｍｉｘＡ、リバーブ用バッファｍｉｘＢ、およびコーラス用バッファｍｉｘＣの波形データに加算する処理が実行されたことになる。
【００３２】
（３）波形生成用バッファｍｉｘＣの波形データ（コーラス処理への入力用に用意した波形データに、ａｄｄ処理５０４でバリエーション処理５０７を施した波形データを重み付けして足し込んだデータ）を読み出し、コーラス処理５０６を施して、結果をｍｉｘＣに上書きする。
【００３３】
（４）ａｄｄ（ｍｉｘＣ−＞ｍｉｘＡ）    …図５の５０９
ａｄｄ（ｍｉｘＣ−＞ｍｉｘＢ）    …図５の５０３
を実行する。これらのａｄｄ処理５０９，５０３により、コーラス処理５０６を施した結果をそれぞれ重み付けして、ドライ用バッファｍｉｘＡ、およびリバーブ用バッファｍｉｘＢの波形データに加算する処理が実行されたことになる。
【００３４】
（５）波形生成用バッファｍｉｘＢ（リバーブ処理への入力用に用意した波形データに、ａｄｄ処理５０２でバリエーション処理５０７を施した波形データを重み付けして足し込み、さらにａｄｄ処理５０３でコーラス処理５０６を施した波形データを重み付けして足し込んだデータ）の波形データを読み出し、リバーブ処理５０５を施して、結果をｍｉｘＢに上書きする。
【００３５】
（６）ａｄｄ（ｍｉｘＢ−＞ｍｉｘＡ）    …図５の５１０
を実行する。このａｄｄ処理５１０により、リバーブ処理５０５を施した結果を重み付けしてドライ用バッファｍｉｘＡの波形データに加算する処理が実行されたことになる。結果として、ｍｉｘＡには、ドライ用の波形データにバリエーション、コーラス、およびリバーブを反映させた波形データが設定されたことになる。
【００３６】
上述のリバーブ処理５０５、コーラス処理５０６、およびバリエーション処理５０７は、それぞれ、ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤの波形データに効果付与処理を施して上書きする処理であり、ａｄｄ処理５０２〜５０４，５０８〜５１０は共通ルーチンである。したがって、これらの処理順序を適宜変更するだけで、複数の効果付与の順序（ソフトエフェクタの結線関係）を任意に変更可能である。共通ルーチンａｄｄが使用できるのは、図３（ａ）に示すように、波形生成用バッファをエフェクトごとに独立とし、同じ構造にしたからである。この発明の実施の形態では、ユーザのキーボード１０８などを用いた指定により、ソフトエフェクタのアルゴリズムを任意に指定できるようになっている。
【００３７】
さらにこの発明の実施の形態では、図４および図５のようなアルゴリズムで波形生成を実行する際、キャッシュラインのサイズを単位として処理を行なうことにより、キャッシュのヒット率を飛躍的に高め楽音生成演算を高速化する。キャッシングによる処理の高速化については、図７（ａ）および図７（ｂ）で詳細に説明する。
【００３８】
次に、図６（ａ）（ｂ）および図７（ａ）（ｂ）のフローチャートを参照して、上述の電子楽器のＣＰＵ１０１の処理手順を説明する。
【００３９】
図６（ａ）は、ＣＰＵ１０１の制御プログラムのうちソフト音源に係るメインルーチンの処理手順を示す。このメインルーチンは、ソフト音源のドライバとしてＯＳ（Operating System）に登録されているものである。ソフト音源を使用した楽音生成を行なう際には、まずこのドライバ、すなわち図６（ａ）の処理を起動し、ソフト音源に係るＡＰＩを有効にしておく。図６（ａ）において、ステップ６０１で各種の初期設定を行なう。この初期設定で、再生バッファＰＢ０，ＰＢ１を０クリアするとともに、サウンドＩ／Ｏ１１２とＤＭＡＣ１１４に指示して図１および図２で説明した再生バッファＰＢ０とＰＢ１とを交互に読み出し再生する処理を開始しておく。次にステップ６０２で何らかの起動要因があるか否かチェックし、ステップ６０３で起動要因があればステップ６０４に進む。起動要因がなければ再び６０２に戻る。ステップ６０２〜６０４の起動要因の受け付けが、ソフト音源に係るＡＰＩに対する指示受け付けに相当する。
【００４０】
ステップ６０４では発生している起動要因の種類を判別しそれぞれの処理に分岐する。起動要因がＭＩＤＩイベントの入力であったときは、ステップ６０５のＭＩＤＩ処理を行ない、その後再びステップ６０２に戻る。このＭＩＤＩイベントの入力とステップ６０５のＭＩＤＩ処理が、図２の演奏入力の受け付けに相当する。ステップ６０４で起動要因がフレーム割り込み（１フレーム再生完了）であるときは、ステップ６０６の波形生成処理を行ない、その後再びステップ６０２に戻る。フレーム割り込みは、サウンドＩ／Ｏ１１２が１フレーム再生完了するごとに発生するハードウェア割り込みである。ステップ６０６の波形生成処理が、図２の２０１〜２０４に示した波形生成演算を行なう処理である。この波形生成処理では、一度に、１フレーム分の波形データ（再生バッファＰＢ０，ＰＢ１を合せた大きさの半分に相当する数の波形サンプル）を生成し、再生バッファＰＢ０またはＰＢ１に交互に書き込む。ステップ６０４で起動要因がその他の要求であるときは、ステップ６０７で当該起動要因に応じた処理を行ない、その後再びステップ６０２に戻る。特に、サウンドＩ／Ｏ１１２による外部入力１１３のサンプリングの指示、図５のようなソフトエフェクタのアルゴリズムの設定変更の指示、図４の乗算器４１３−１〜４１３−８の係数（各系列の信号送出レベルを規定する重み付け係数）の設定指示、ソフトエフェクタで用いるａｄｄ処理の重み付け係数の設定指示などの要求がなされたときには、ステップ６０７のその他処理で対応する処理を行なう。ステップ６０４で起動要因がソフト音源の終了要求であったときは、ステップ６０８で終了処理を行なった後、処理を終了する。
【００４１】
図６（ｂ）は、図６（ａ）のステップ６０５のＭＩＤＩ処理のうちノートオンイベントを入力したときに実行されるノートオンイベント処理の手順を示す。まずステップ６１１で、入力したノートオンイベントのＭＩＤＩチャンネル、ノートナンバ、およびベロシティを、それぞれレジスタＭＣ，ＮＮ，ＶＥに設定する。次に、ステップ６１２で、発音チャンネル（第０〜第３１チャンネル）の割り当てを行なう。ステップ６１３で、割り当てた発音チャンネルのソフト音源レジスタに、発音に必要な情報（ノートナンバＮＮやベロシティＶＥなど）を設定する。さらにステップ６１４で、割り当てた発音チャンネルのソフト音源レジスタにノートオンを書き込んで発音開始指示を出し、処理を終了する。
【００４２】
図示しないが、ノートオフや他の演奏入力などのＭＩＤＩイベント処理も同様である。すなわち、ノートオフなら該当する発音チャンネルに対応するソフト音源レジスタにノートオフを設定し、他の演奏入力なら該当する発音チャンネルに対応するソフト音源レジスタに当該演奏入力に対応するデータを書き込む。
【００４３】
図７（ａ）は、図６（ａ）のステップ６０６の波形生成処理の手順を示す。この波形生成処理により、図４および図５のようなアルゴリズムで楽音生成が実行される。まずステップ７０１で、演算準備を行なう。これは、ソフト音源レジスタを参照して波形生成演算を行なうべきチャンネルを認識する処理、今回の波形生成演算で生成した１フレーム分の波形は再生バッファＰＢ０とＰＢ１のどちらに設定すべきかを認識する処理、波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤの全領域の０クリアなどの演算準備である。次に、ステップ７０２で、演算を行なう必要のある全チャンネルに関して１６サンプル（ステレオＬおよびＲの各サンプルを単位として数えると２×１６＝３２サンプル）分の波形発生演算を実行する。これは、図４のアルゴリズムの処理を１６サンプル分実行して、波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤのそれぞれに２×１６サンプル波形生成する処理である。
【００４４】
ステップ７０３では、１フレーム分の波形サンプルが生成できたか否か、すなわち図３（ａ）の波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤ上にそれぞれ２×１２８サンプルが生成されたか否かを判別する。１フレーム完了していなければ、ステップ７０２に戻って、次の２×１６サンプルを生成する。ステップ７０２を繰り返すことにより、図３（ａ）の波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤのそれぞれに関して、先頭から２×１６サンプルずつ波形サンプルを作り込んで行く。
【００４５】
ステップ７０３で図３（ａ）の波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤに１フレーム分の波形が生成できたら、ステップ７０４に進む。ステップ７０４，７０５，７０６では、バリエーション、コーラス、およびリバーブなどの効果付与処理を行なう。これは、図５で説明したように、バリエーション処理、コーラス処理、およびリバーブ処理、並びにａｄｄ処理をユーザが指定したアルゴリズム（ソフトエフェクタのアルゴリズムの設定変更の指示はステップ６０７のその他処理で行なわれる）の通りの順序で実行する処理である。図示しないがステップ７０４，７０５，７０６のソフトエフェクタの処理も、ステップ７０２，７０３と同様、２×１６サンプルごとに実行する。すなわち、図３（ａ）の波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤの先頭から２×１６サンプル分について図５のアルゴリズムの処理を実行し、次の２×１６サンプルについて図５の処理を実行し、…というように処理を進め、最終的に波形生成用バッファｍｉｘＡ上に効果付与された２×１２８サンプルを得る。図５で説明したバリエーション処理、コーラス処理、およびリバーブ処理、並びにａｄｄ処理は、２×１６サンプル分を対象とする処理とする。
【００４６】
なお、図７（ａ）には、図５で説明したａｄｄ処理が現れていないが、これは、ステップ７０４〜７０６のエフェクトブロック処理に含まれているものとする。つまり、ステップ７０４のバリエーション処理には前記（１）と（２）の手順の処理が、ステップ７０５のコーラス処理には前記（３）と（４）の手順の処理が、ステップ７０６のリバーブ処理には前記（５）と（６）の手順の処理が、それぞれ含まれる。
【００４７】
なお、ステップ７０４，７０５，７０６の各エフェクト処理は、２×１６サンプルずつでなく、１フレーム分を一気にまとめて実行してもよい。すなわち、図５で説明したバリエーション処理、コーラス処理、およびリバーブ処理、並びにａｄｄ処理のそれぞれは、１フレーム分を一気に行なう処理としてもよい。この場合でも、１フレームの処理中ではキャッシュは１６サンプルごとに有効に働いている。このようにすれば、各バッファ間にわたる処理ではヒット率が落ちる場合があると考えられるが、各エフェクト処理中で使用するレジスタやバッファに関してはヒット率が上がる。発音チャンネルの処理に比べて、エフェクトの処理は結果が得られるまでの時間が長いので１フレーム分を一気に処理していく方が効率が良い。また、１フレーム分一気にといっても、その中で局所的に１６サンプル単位で処理を行なえば効率的である。要するに、キャッシュミスを起こりにくくするためには、連続したデータを短期間に連続して処理するようにすればよい。
【００４８】
ソフトエフェクタ処理の後、ステップ７０７で、生成した１フレーム分の波形（すなわちｍｉｘＡ上の２×１２８サンプル）を再生予約する。これは、ｍｉｘＡの波形サンプルを再生バッファＰＢ０またはＰＢ１の一方（現在、再生に用いられていない方）にコピーする処理である。既に、ステップ６０１で再生バッファＰＢ０とＰＢ１とを交互に読み出し再生する処理が開始しているので、再生に用いられていない方に生成した波形をコピーするだけで次のフレームで当該波形の発音が実行される。
【００４９】
なお、この例では、波形生成用バッファｍｉｘＡと再生バッファＰＢ０，ＰＢ１とを別々に設けたが、ｍｉｘＡを２面用意し、一方をＰＢ０、他方をＰＢ１として兼用することもできる。この場合は、波形生成処理を直接再生バッファ上で行なうことになるので、ステップ７０７の生成波形をコピーする処理は不要になり、処理速度がより向上する。
【００５０】
図７（ｂ）は、図７（ａ）のステップ７０２の１６サンプル（ステレオＬおよびＲのそれぞれのサンプルを単位で数えれば２×１６＝３２サンプル）分の波形発生処理の手順を示す。まずステップ７１１で、第１番目のチャンネルについて演算準備を行なう。図７（ａ）のステップ７０１の演算準備により、波形演算処理が必要なチャンネルおよびチャンネル間の優先度は求められているので、優先度が最も高いチャンネルを第１番目のチャンネルとする。次に、ステップ７１２〜７１８で当該チャンネルについて１６サンプル分の波形生成を行なう。
【００５１】
まずステップ７１２で、後の処理で用いるエンベロープ値を求める。エンベロープ値は、例えばＡＤＳＲ（アタック、ディケイ、サスティン、リリース）タイプのエンベロープ波形を出力するような演算型のエンベロープ生成処理によって発生すればよい。ステップ７１２で発生したエンベロープ値は、現在生成処理中の１６サンプルに対して共通に用いられる。ここで生成したエンベロープ値は、生成した１つの値を１６サンプルに共通に使用する。すなわち、波形の１６サンプルごとに１つのエンベロープ値が生成されるようになっている。次にステップ７１３でアドレス生成、波形読み出し、および補間処理（図４の４１１）を１６サンプル分行ない、ステップ７１４でそれらのサンプルに対してフィルタ処理（図４の４１２）を行なう。各サンプルは、この段階では未だステレオＬＲ別に分けておらずモノラルである。
【００５２】
次にステップ７１５で、ｍｉｘＡの２×１６サンプルを算出する。これは、図４において、フィルタ処理４１２から出力された１６サンプル（モノラル）に対して以下の処理を行なうものである。まず、ｄｒｙＬ用重み付け係数（ｄｒｙＬの送出レベルを規定する係数）とステップ７１２で求めたエンベロープ値とを加算する。この係数とエンベロープ値は、ともにｄＢ（デシベル）スケール上の値であるので、加算がリニアスケール上の乗算に相当する。その後、乗算器４１３−１で、上記係数とエンベロープ値の加算結果を、フィルタ処理４１２から出力された各波形サンプル値に対して指数変換乗算する。これによりｄｒｙ用のＬ側波形サンプルが１６サンプル得られたことになる。ｄｒｙ用のＲ側波形サンプルも、上記係数をｄｒｙＲ用係数にして同様に求める。以上のようにして求めたドライ用のＬＲの２×１６＝３２サンプルの波形をｍｉｘＡに累算する。
【００５３】
ステップ７１５と同様にして、ステップ７１６ではリバーブ用のＬＲの２×１６＝３２サンプルの波形をｍｉｘＢに累算し、ステップ７１７ではコーラス用のＬＲの２×１６＝３２サンプルの波形をｍｉｘＣに累算し、ステップ７１８ではバリエーション用のＬＲの２×１６＝３２サンプルの波形をｍｉｘＤに累算する。もちろん重み付け係数は、ドライ用、リバーブ用、コーラス用、およびバリエーション用で異なるものを用いる。
【００５４】
次に、ステップ７１９で、演算すべき残りのチャンネルがあるか否か判別する。あれば、ステップ７２０で次チャンネルの演算準備（優先度の高いチャンネルから先に演算するものとする）を行なった後、ステップ７１２に戻る。これを繰り返して、演算すべき全チャンネルについて、ステレオＬおよびＲのそれぞれで１６サンプル分の波形生成を行なって波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤに累算する。ステップ７１９で演算すべき残りのチャンネルがなければ、リターンする。
【００５５】
上述の図７（ａ）および図７（ｂ）の波形生成演算では、２×１６サンプルを単位として効果付与を含む波形生成（図４および図５の処理）を実行している。１６サンプルは３２バイトであり、また図３（ａ）の波形生成用バッファｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤのそれぞれは先頭から順に３２バイト単位でキャッシングされるようにバウンダリ調整されている。したがって、例えばｍｉｘＡの第１サンプル目をアクセスしたときには、キャッシュメモリ１１７に該第１サンプル目を含む１６サンプルがキャッシングされ、この１６サンプルについての処理中は、キャッシュメモリ１１７上で波形生成処理が実行されるので、非常に高速に波形生成できる。２×１６サンプルであるから６４バイト単位であるが、隣り合う１６サンプルずつは別のキャッシュラインにキャッシングされるから、ここでは２つのキャッシュラインが使用される。
【００５６】
特に、この例では複数種類の効果付与のアルゴリズムをユーザが任意に指定できるので、複数種類の効果付与処理がいろいろな順序で行なわれることになるが、付与する効果の種類ごとに独立に波形生成用バッファを設けているので、１つの効果付与処理を実行する際には対応するバッファ上で処理を行なうことになる。そのバッファは当該効果付与に使用する波形サンプルのみからなる（すなわち当該効果処理に不要な波形サンプルが間に挟まっているようなものでない）ので、キャッシュのヒット効率を飛躍的に高めることができキャッシングの効果が高い。
【００５７】
次に、図７（ｃ）のフローチャートを参照して、再生時のＤＭＡコントローラ１１４の処理を説明する。再生時は、サウンドＩ／Ｏ１１２からサンプリング周期ごとにサンプル要求割り込み（ハードウェア割り込み）が発行される。これに応じて、ＤＭＡコントローラ１１４は、図７（ｃ）の処理を行なう。まずステップ７３１で、再生バッファＰＢ０，ＰＢ１の１サンプルをサウンドＩ／Ｏ１１２の出力ＦＩＦＯに送る。出力ＦＩＦＯに書き込まれた波形データは、図１で説明したようにサンプリング周期ごとにＤ／Ａ変換されてサウンドシステム１１５へと送られ放音される。なお、ステップ７３１で「ＤＭＡＢ」とあるのは再生バッファＰＢ０，ＰＢ１のことである。再生バッファＰＢ０，ＰＢ１は、ＤＭＡのバッファと見ることもできるのでＤＭＡＢと記載した。次に、ステップ７３２でポインタｐをインクリメントして処理を終了する。ｐは再生バッファＰＢ０，ＰＢ１から１サンプルを読み出すときのポインタである。以上のようにして、ポインタｐを進めながら、サンプリング周期ごとに再生バッファＰＢ０，ＰＢ１から１サンプルをサウンドＩ／Ｏ１１２に渡す。
【００５８】
なお、ポインタｐは１ずつインクリメントしていくことによりＰＢ０の先頭のサンプルからＰＢ１の最後のサンプルまでを順次読み出すためのポインタであるが、ＰＢ１の最後のサンプルを読出した後はＰＢ０の先頭のサンプルを指すようにポインタ値を更新する必要がある。この処理は、ＤＭＡコントローラ１１４が自動的に行なうように設定されている。
【００５９】
なお、上記発明の実施の形態では、図７（ａ）のステップ７０２，７０３および図７（ｂ）から分かるように、演算が必要な全チャンネルにわたって１６サンプル分の波形生成処理を行なうループ処理を内側のループで実行し、その１６サンプル分の波形生成処理を１フレーム完了まで外側のループで実行して、１フレーム分の波形を生成しているが、これらのループ処理を入れ替えてもよい。すなわち、内側のループで１つのチャンネルに関する１６サンプル分の波形生成を繰り返して１フレーム分波形生成し、これを外側のループで各チャンネルに関して実行し、最終的な１フレーム分の波形を生成するようにしてもよい。上記発明の実施の形態の方式だと全チャンネルにわたる１６サンプルずつ作成していくのでキャッシュのヒット率が高いが、ＣＰＵの処理能力が低いと、１フレーム時間内で１フレーム分の波形生成が完了しない可能性がある。これに対して、上記のループ処理を入れ替える方式であれば、優先度の高いチャンネルは始めに１フレーム分作成されるので、もし１フレーム時間内で全チャンネルの波形生成が完了しない場合でも優先度の高いチャンネルについては発音されることになる。なお、これらの方式を混在させて、所定チャンネル数については前者の方式で、残りのチャンネルについては後者の方式で、というようにしてもよい。
【００６０】
上記発明の実施の形態では、キャッシュメモリをライトスルー方式にしたが、ライトバック方式としてもよい。ライトバック方式にした方が、キャッシュメモリ上で波形サンプルの更新が可能になるので、より高速な波形生成処理が実現される。
【００６１】
なお、ユーザが複数エフェクト間の結線状態だけでなく、複数エフェクトの数や内容を指定できるようにしてもよい。また、キャッシングの単位となるサンプル数は各ＣＰＵごとに異なるので、波形生成の処理単位もそれに応じて変更してよい。
【００６２】
また、波形生成用バッファの数は、上記発明の実施の形態ではｍｉｘＡ〜ｍｉｘＤの４つであったが、これは、その後段のエフェクトのブロック数が３であることに対応しており、エフェクトのブロック数に応じて変更される。各エフェクトの入力用のバッファとｄｒｙ用のバッファが必要なので、バッファの数はエフェクトのブロック数＋１となる。
【００６３】
なお、上述した楽音生成方法を実現するための各種関係情報や動作プログラムなどをハードディスクなどの記憶装置に格納し、ＣＰＵがこれらをＲＡＭに読み出してから使用するように構成し、さらにＣＤ−ＲＯＭ（コンパクトディスク−リード・オンリ・メモリ）やフレキシブルディスク、光磁気ディスクなどの可搬型の記憶媒体に記憶されたデータをハードディスクなどの記憶装置に転送できるように構成すれば、関係情報や動作プログラムなどの追加（インストールなど）や更新（バージョンアップなど）の際に便利である。もちろん、可搬型の記憶媒体から直接ＲＡＭへデータを転送するようにしてもよい。
【００６４】
さらに、可搬型の記憶媒体経由ではなく、通信インターフェース（ネットワークＩ／Ｏ）経由で、ハードディスクなどの記憶装置上の関係情報や動作プログラムなどを通信ネットワーク側からダウンロードするようにしてもよい。上記通信インターフェースは、ＬＡＮ（ローカルエリアネットワーク）やインターネット、電話回線などの通信ネットワークに接続されており、当該通信ネットワークを介してサーバコンピュータと接続される。クライアントとなる本装置は、自装置が有する記憶装置（ハードディスクなど）に関係情報や動作プログラムなどが記憶されていない場合、上記通信インターフェースおよび通信ネットワークを介してサーバコンピュータへ、関係情報や動作プログラムなどを要求するコマンドを送信する。このコマンドを受け取ると、サーバコンピュータは、要求された関係情報や動作プログラムなどを、通信ネットワークを介して本装置へと配信する。そして、配信された関係情報や動作プログラムなどを本装置が通信インターフェースを介して受信し、記憶装置に蓄積することにより、ダウンロードが完了する。
【００６５】
また、本装置を、関係情報や動作プログラムなどをインストールした市販のパーソナルコンピュータなどによって実現しても良い。もちろん、この場合にも、関係情報や動作プログラムなどのデータの配布方法としては、ＲＯＭなどの不揮発性メモリにあらかじめ格納しておく方法、可搬型の記憶媒体に格納して配布する方法、および通信インターフェース経由で配布する方法などが適用可能である。
【図面の簡単な説明】
【００６６】
【図１】この発明に係る楽音発生装置を適用した電子楽器のブロック構成図
【図２】ソフト音源の楽音生成原理を説明するための図
【図３】本発明に係る波形生成用バッファの構成例および従来の波形生成用バッファの構成例を示す図
【図４】ソフト音源による楽音生成からチャンネル累算までのアルゴリズムの例を示す図
【図５】波形データに複数の効果付与を施すソフトエフェクタのアルゴリズムの例を示す図
【図６】メインルーチンおよびノートオンイベントルーチンのフローチャート図
【図７】波形生成処理ルーチンおよび１６サンプル分の波形発生処理ルーチンのフローチャート図
【符号の説明】
【００６７】
１０１…中央処理装置（ＣＰＵ）、１０２…リードオンリメモリ（ＲＯＭ）、１０３…ランダムアクセスメモリ（ＲＡＭ）、１０４…ドライブ装置、１０６…タイマ、１０７…ネットワーク入出力（Ｉ／Ｏ）インタフェース、１０８…キーボード、１０９…ディスプレイ、１１０…ハードディスク、１１１…サンプリングクロック（Ｆｓ）発生器、１１２…サウンドＩ／Ｏ、１１４…ＤＭＡ（ダイレクトメモリアクセス）コントローラ、１１５…サウンドシステム、１１６…バスライン、１１７…キャッシュメモリ、ｍｉｘＡ，ｍｉｘＢ，ｍｉｘＣ，ｍｉｘＤ…波形生成用バッファ。
【図１】
2006221209.tif 000003
【図２】
2006221209.tif 000004
【図３】
2006221209.tif 000005
【図４】
2006221209.tif 000006
【図５】
2006221209.tif 000007
【図６】
2006221209.tif 000008
【図７】
2006221209.tif 000009