(57)【特許請求の範囲】
【請求項１】
波形の複数サンプル値をアドレスに対応付けて所定のアドレス範囲内に記憶する記憶手段と、
生成すべき楽音に応じて前記記憶手段から読み出すべき所定の複数サンプル分の読み出しアドレスを、予め算出し記憶する波形メモリ読出手段と、
前記波形メモリ読出手段に記憶された前記複数サンプル分の読み出しアドレスに応じて前記記憶手段から前記サンプル値を読み出し、該読み出したサンプル値に基づき楽音波形サンプルデータを生成する制御手段と、
前記生成した楽音波形サンプルデータを所定のサンプリング周期で出力する出力手段と
を具備し、
前記制御手段は、前記波形メモリ読出手段に記憶された前記読み出しアドレスが前記記憶手段における前記所定のアドレス範囲の終端アドレスを超えた場合に、超えた分の読み出しアドレスを前記所定のアドレス範囲の先端アドレスからのアドレスに変換し、該変換したアドレスに応じて前記記憶手段から前記サンプル値を読み出すことを特徴とする楽音生成装置。
【請求項２】
前記波形メモリ読出手段は、整数部と小数部とからなる読み出しアドレスを算出して記憶しておくことを特徴とする請求項１に記載の楽音生成装置。
【請求項３】
前記制御手段は、整数部及びそれに隣接する整数部に対応するサンプル値を読み出し、該読み出したサンプル値を小数部にて補間することにより、該当読み出しアドレスに対応するサンプル値を生成することを特徴とする請求項２に記載の楽音生成装置。
【請求項４】
前記記憶手段は圧縮された波形を記憶するものであり、
前記制御手段は、前記記憶手段から圧縮波形サンプル値を読み出し、該読み出された圧縮波形サンプル値を圧縮前波形サンプル値に戻して、該圧縮前波形サンプル値に基づき楽音波形サンプルデータを生成することを特徴とする請求項１に記載の楽音生成装置。
【請求項５】
前記制御手段は、複数チャンネル分のサンプル値を各チャンネル毎に読み出し、該読み出した全チャンネル分の複数サンプル値を加算したものに基づき全チャンネル分の楽音波形サンプルデータを生成することを特徴とする請求項１に記載の楽音生成装置。
【請求項６】
コンピュータに、
波形の複数サンプル値をアドレスに対応付けて所定のアドレス範囲内に記憶する記憶手段から、生成すべき楽音に応じて読み出すべき所定の複数サンプル分の読み出しアドレスを、予め算出し記憶する手順と、
前記記憶された前記複数サンプル分の読み出しアドレスに応じて前記記憶手段から前記サンプル値を読み出し、該読み出したサンプル値に基づき楽音波形サンプルデータを生成する手順と、
前記生成した楽音波形サンプルデータを所定のサンプリング周期で出力する手順と、
前記記憶された前記読み出しアドレスが前記記憶手段における前記所定のアドレス範囲の終端アドレスを超えた場合に、超えた分の読み出しアドレスを前記所定のアドレス範囲の先端アドレスからのアドレスに変換し、該変換したアドレスに応じて前記記憶手段から前記サンプル値を読み出す手順と
を実行させるためのプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、ＣＰＵのような汎用の演算処理手段によって楽音生成を行う楽音生成装置及びプログラムに関する。特に、楽音生成処理時における演算処理手段にかかる処理負荷を低減することにより、楽音の生成を効率的に行うことのできるようにした楽音生成装置及びプログラムに関するものである。
【０００２】
【従来の技術】
最近では、ＣＰＵのような汎用の演算処理手段の演算能力の向上に伴って、汎用コンピュータや専用の楽音発生装置などに搭載されるＣＰＵに所定の楽音生成処理を実行させることによって楽音生成を行うことのできる楽音生成装置（つまりソフト音源）が知られている。すなわち、ＣＰＵに楽音生成処理のためのアプリケーションプログラムを実行させて、該アプリケーションプログラムに基づき楽音を生成する。こうした楽音生成装置においては、所定の１サンプリング周期（つまり、デジタル・アナログ変換器の変換タイミング）毎に各チャンネルの楽音波形サンプルデータを発音チャンネル分演算生成することによって楽音を生成する。したがって、ＣＰＵは各発音チャンネルの処理を行う場合、まず、前回の当該発音チャンネルの演算に用いた各種レジスタ値（例えば、各種制御パラメータなど）をメモリからＣＰＵのレジスタに読み出す等の準備処理が行われる。また、当該発音チャンネルの楽音生成処理後には次回の処理のため、前記レジスタ値をメモリに書き込む必要がある。すなわち、各発音チャンネルの楽音波形サンプルデータを１サンプルずつ生成するようにしていたために、楽音を生成する楽音生成処理以外の準備処理に多くのＣＰＵの演算時間が費やされてしまい（つまり、ＣＰＵのオーバヘッドが大きくなる）、それに伴って演算効率が悪くなって応答や楽音生成処理が遅くなることが生じていた。
【０００３】
そこで、こうしたソフト音源での楽音生成処理を高速に行うために、ＣＰＵのオーバヘッドを小さくすることのできる楽音生成方法が本出願人により既に出願済みである（特開平9−044160号参照）。この楽音生成方法を適用した従来の楽音生成装置で実行する楽音生成処理概要について、図１３を用いて簡単に説明する。図１３は、従来の楽音生成装置の楽音生成処理概要を説明するための概念図である。ただし、この図１３では、所定の音色が割り当てられた発音チャンネルＣｈ１（例えばピアノ音色である１ボイス）〜発音チャンネルＣｈ８（例えばドラム音色である１ボイス）毎に６４サンプル分の楽音波形サンプルデータを生成し（これをフレーム処理と呼ぶ）、該生成した各発音チャンネル毎の６４サンプル分の楽音波形サンプルデータに基づき全発音チャンネル分の楽音生成処理を実行する楽音生成装置を示している。
【０００４】
まず、各フレーム処理１〜フレーム処理３において、発音を割り当てられている各発音チャンネル毎（ここでは、Ｃｈ１〜Ｃｈ８までの８チャンネル分）に、所定のサンプリング周期に従って波形メモリから読み出した１乃至複数の原波形データ（サンプル波形とも呼ぶ）に基づき複数の楽音波形サンプルデータを生成する（▲１▼楽音波形サンプルの生成）。すなわち、所定のサンプリング周期（例えば、デジタル・アナログ変換器の変換タイミングなど）に対応する周波数ナンバをサンプリング周期毎に累算することによって算出される累算Ｆナンバ（整数部と小数部とを含むアドレスであって、読み出しアドレスとも呼ぶ）の整数部に応じて、所定の波形メモリに記憶されている原波形データを読み出す。そして、波形メモリから前記読み出しアドレスの整数部に応じて読み出した原波形データを前記読み出しアドレスの小数部に応じて補間し、該補間処理で得られた波形データに対してフィルタ制御や振幅制御などの各種制御を施すことによって１サンプル分の楽音波形サンプルデータを生成する。これを各発音チャンネル毎に複数サンプル分繰り返し、各発音チャンネルにおいて複数の楽音波形サンプルデータ、例えば６４サンプル分の楽音波形サンプルデータをまとめて生成する。次に、生成した複数の楽音波形サンプルデータの１つ１つについて、Ｃｈ１〜Ｃｈ８までの全ての発音チャンネル分累算する（▲２▼Ｃｈ１〜Ｃｈ８の累算）。すなわち、生成された各発音チャンネル毎の複数楽音波形サンプルデータを全発音チャンネルにわたって累算し、該累算した結果の複数の累算サンプルデータを出力バッファ（ただし、図１３では出力バッファＡ及び出力バッファＢのダブルバッファ構成のものを示した）に書き込む。つまり、波形合成を行う。そして、出力バッファに書き込んだ累算サンプルデータに基づき楽音波形の生成を行う（▲３▼出力バッファからの読み出し）。すなわち、出力バッファに記憶された複数の累算サンプルデータを、上記サンプリング周期毎に１サンプルずつ順次に読み出すことによって、各フレーム処理において全発音チャンネル分を合成した楽音波形を複数サンプル生成する。
【０００５】
上述したように、従来の楽音生成装置では各発音チャンネルの楽音波形サンプルデータを演算する際に複数サンプル分をまとめて生成する（▲１▼楽音波形サンプルの生成参照）。こうした場合には、複数の楽音波形サンプルデータの演算について１回だけ各発音チャンネルに対する準備処理を行えばよい。すなわち、各チャンネル毎に適用すべき各種制御パラメータ（例えばフィルタ制御や振幅エンベロープ制御）の切替などの準備処理を楽音波形サンプルデータを１サンプル生成する度に行わずにすむ。したがって、準備処理の回数を減らすことができることから、それに伴いＣＰＵのオーバヘッドを小さくすることができるようになっている。
【０００６】
また、上述したようなＣＰＵに楽音生成処理のためのアプリケーションプログラムを実行させて楽音を生成するソフト音源を適用した楽音生成装置において、プログラムカウンタを１つずつインクリメントして、その進行に従って楽音生成処理のための各命令が実行されていくようにすると、プログラムが高速に実行されて効率的に楽音生成処理を行うことができる。他方、プログラム内に分岐命令がある場合には、プログラムカウンタをその分岐先のアドレスに一旦ジャンプさせ、その分岐処理が終わるとプログラムカウンタを分岐前の元の値に戻さなくてはならない。こうしたプログラムカウンタを前後に飛ばす処理を行うと、その分だけプログラムの実行は遅くなる。さらに、ＣＰＵがパイプライン処理によりプログラムにおける各命令を処理しているような場合には、こうした非効率の度合いがより大きくなることが知られている。
【０００７】
【発明が解決しようとする課題】
ところで、上述したような従来の楽音生成装置では各発音チャンネルの楽音波形サンプルデータを複数サンプル分まとめて生成する際に、波形メモリから原波形データを読み出すための読み出しアドレスが波形メモリにおける当該原波形データの終端側アドレス（これをエンドポイントと呼ぶ）を超えているか否かの判定（これを終端チェック処理と呼ぶ）を１回１回の原波形データの読み出し毎に（つまり、１サンプル分の楽音波形サンプルデータ生成毎に）行っている。すなわち、波形メモリから原波形データを読み出す際において、読み出しアドレスが読み出すべき原波形データのアドレス範囲を超えている場合には、原波形データをループ読み出しするために波形メモリにおける原波形データの最初の波形メモリアドレス（これをループポイントと呼ぶ）から読み出しを行わなければならない。そのために、１回１回の原波形データの読み出し毎に該読み出しアドレスが波形メモリにおける当該原波形データの終端側アドレスを超えているか否かの判定を行っている。しかし、こうした終端チェック処理はプログラムにおける分岐命令で行われ、そうした分岐命令が１回１回の原波形データの読み出し毎に実行されているためにプログラムの実行が遅くなる、つまりＣＰＵのオーバヘッドが大きく演算効率が悪くなってしまうことから、応答や楽音生成処理が遅く不都合である、という問題点があった。
【０００８】
本発明は上述の点に鑑みてなされたもので、発音チャンネル毎に複数の楽音波形サンプルデータを生成する際に、読み出しアドレスが該波形メモリにおける当該原波形データの終端側アドレスを超えているか否かを判定する終端チェック処理の分岐判断を１回１回の原波形データの読み出し毎に行うことのない、ＣＰＵのオーバヘッドが小さく、楽音生成処理を効率よく実行することができるようにした楽音生成装置及びプログラムを提供することを目的とする。
【０００９】
【課題を解決するための手段】
本発明に係る楽音生成装置は、波形の複数サンプル値をアドレスに対応付けて所定のアドレス範囲内に記憶する記憶手段と、生成すべき楽音に応じて前記記憶手段から読み出すべき所定の複数サンプル分の読み出しアドレスを、予め算出し記憶する波形メモリ読出手段と、前記波形メモリ読出手段に記憶された前記複数サンプル分の読み出しアドレスに応じて前記記憶手段から前記サンプル値を読み出し、該読み出したサンプル値に基づき楽音波形サンプルデータを生成する制御手段と、前記生成した楽音波形サンプルデータを所定のサンプリング周期で出力する出力手段とを具備し、前記制御手段は、前記波形メモリ読出手段に記憶された前記読み出しアドレスが前記記憶手段における前記所定のアドレス範囲の終端アドレスを超えた場合に、超えた分の読み出しアドレスを前記所定のアドレス範囲の先端アドレスからのアドレスに変換し、該変換したアドレスに応じて前記記憶手段から前記サンプル値を読み出すことを特徴とするものである。
【００１０】
この発明によると、波形の複数サンプル値をアドレスに対応付けて所定のアドレス範囲内に記憶する記憶手段から、生成すべき楽音に応じて読み出すべき所定の複数サンプル分の読み出しアドレスを、予め算出し記憶しておき、前記記憶された複数サンプル分の読み出しアドレスに応じて前記記憶手段から前記サンプル値を読み出し、該読み出したサンプル値に基づき楽音波形サンプルデータを生成し、前記生成した楽音波形サンプルデータを所定のサンプリング周期で出力する。前記制御手段は、前記波形メモリ読出手段に記憶された前記読み出しアドレスが前記記憶手段における前記所定のアドレス範囲の終端アドレスを超えた場合に、超えた分の読み出しアドレスを前記所定のアドレス範囲の先端アドレスからのアドレスに変換し、該変換したアドレスに応じて前記記憶手段から前記サンプル値を読み出すことから、楽音生成処理時における演算処理にかかる処理負荷を低減することができ、楽音の生成を効率的に行うことができるようになる。すなわち、楽音波形サンプルデータを生成する際に、記憶手段に記憶された原波形（波形の複数サンプル値）の読み出しのために参照する読み出しアドレスが当該原波形の終端アドレスを超えているか否かの分岐制御（分岐命令）による終端チェック処理を、１回１回の原波形の読み出し毎に行うことがないので、ＣＰＵのオーバヘッドをより小さくすることができ、楽音生成処理を効率よく実行することができるようになる。
【００１１】
本発明は、装置の発明として構成し、実施することができるのみならず、方法の発明として構成し実施することができる。また、本発明は、コンピュータまたはＤＳＰ等のプロセッサのプログラムの形態で実施することができるし、そのようなプログラムを記憶した記憶媒体の形態で実施することもできる。
【００１２】
【発明の実施の形態】
以下、添付図面を参照してこの発明の実施の形態を詳細に説明する。
【００１３】
図１は、この発明に係る楽音生成装置の全体構成の一実施例を示すハード構成ブロック図である。ここに示された楽音生成装置のハードウエア構成例はコンピュータを用いて構成されており、そこにおいて、各発音チャンネル毎に所定サンプル数の楽音波形サンプルデータを生成するための「楽音波形サンプル生成処理」（後述する図７及び図８参照）等の各種制御処理は、コンピュータが各種制御処理を実現する所定の制御プログラムを含むソフトウエアを実行することにより実施される。勿論、これらの各種制御処理はコンピュータソフトウエアの形態に限らず、ＤＳＰによって処理されるマイクロプログラムの形態でも実施可能であり、また、この種のプログラムの形態に限らず、ディスクリート回路又は集積回路若しくは大規模集積回路等を含んで構成された専用ハードウエア装置の形態で実施してもよい。
なお、本発明に係る楽音生成装置は、パーソナルコンピュータは言うに及ばず、電子楽器やカラオケ装置又は電子ゲーム装置、あるいは携帯電話やＰＤＡ（Personal Data(Digital) Assistants）などのマルチメディア機器等、任意の製品応用形態をとっているものであってもよい。
【００１４】
本実施例に示す楽音生成装置は、マイクロプロセッサユニット（ＣＰＵ）１、タイマ２、リードオンリメモリ（ＲＯＭ）３、ランダムアクセスメモリ（ＲＡＭ）４からなるマイクロコンピュータによって制御されるようになっている。ＣＰＵ１は、この楽音生成装置全体の動作を制御するものである。このＣＰＵ１に対して、データ及びアドレスバス１Ｄを介してＲＯＭ３、ＲＡＭ４、MIDIインタフェース（I/F）５、操作子６、ディスプレイ７、外部記憶装置８、ＤＭＡ（Direct Memory Access）コントローラ９がそれぞれ接続されている。更に、ＣＰＵ１には、タイマ割込み処理（インタラプト処理）における割込み時間や各種時間を計時するタイマ２が接続されている。例えば、タイマ２はクロックパルスを発生し、発生したクロックパルスをＣＰＵ１に対して処理タイミング命令として与えたり、あるいはＣＰＵ１に対してインタラプト命令として与える。ＣＰＵ１は、これらの命令に従って「楽音波形サンプル生成処理」等の各種処理を実行する。
【００１５】
ＲＯＭ３は、ＣＰＵ１により実行あるいは参照されるソフト音源を実現するためのアプリケーションプログラムなどの各種制御プログラム、プリセットされた音色データや原波形データ（この実施例では、一例として圧縮されたＤＰＣＭ波形とする）等の各種データを格納するものである。ＲＡＭ４は、ＣＰＵ１が所定のプログラムを実行する際に発生する各種データなどを一時的に記憶するワーキングエリア、あるいは現在実行中の制御プログラムやそれに関連するデータを記憶するメモリ等として使用される。ＲＡＭ４の所定のアドレス領域がそれぞれの機能に割り当てられ、レジスタやフラグ、テーブル、メモリなどとして利用される。この実施例では、例えば音色データエリア、入力バッファエリア、チャンネルレジスタエリア、出力バッファエリア、サンプル情報バッファエリア等のそれぞれの記憶エリアに所定のデータが記憶される。こうした記憶エリアの詳細な説明については後述することから、ここでの説明を省略する。また、これらの記憶エリア以外に、ＲＡＭ４の所定幅のメモリ領域を予めループバッファ（すなわち、所定メモリ範囲のバッファエリアを超えてデータが書き込まれようとした場合に、バッファエリアを超えて書き込もうとしたデータを自動的に該バッファエリアの先頭から書き込むバッファ）として使用するようにセットしておく。この実施例に示す楽音生成装置では、複数楽音波形サンプルデータ生成の際に必要な原波形データ（ＤＰＣＭ波形）をＲＯＭ３あるいはＲＡＭ４などに構成された波形メモリから読み出し、該読み出した原波形データ（ＤＰＣＭ波形）をＰＣＭ化したＰＣＭサンプル波形をループバッファに順次に記憶する。そして、このループバッファに記憶されたＰＣＭサンプル波形に基づき波形補間を行って複数の楽音波形サンプルデータを生成するようにしている（詳しくは後述する）。
【００１６】
MIDIインタフェース（I/F）５は、当該楽音生成装置に接続された外部のMIDI機器（図示せず）からMIDI規格の楽音データ（つまりMIDIデータ）を当該楽音生成装置へ入力したり、あるいは当該楽音生成装置からMIDIデータを外部のMIDI機器へ出力するためのインタフェースである。外部のMIDI機器としてはユーザの操作に応じてMIDIデータを発生するMIDIキーボードや一連のMIDIデータを順次に送信するシーケンサ、あるいはMIDIデータに基づいて楽音を発生する外部音源モジュールや電子楽器など、各種MIDI機器であればどのようなものであってもよい。こうしたMIDIインタフェース５は専用のMIDIインタフェースを用いるものに限らず、RS-232C、USB（ユニバーサル・シリアル・バス）、IEEE1394（アイトリプルイー1394）等の汎用のインタフェースを用いてMIDIインタフェース５を構成するようにしてよい。そうした場合、MIDIデータ以外のデータをも同時に送受信するようにしてもよい。MIDIインタフェース５として上記したような汎用のインタフェースを用いる場合には、外部のMIDI機器はMIDIデータ以外のデータも送受信できるようにしてよい。勿論、楽音生成装置と外部のMIDI機器との間で送受信するデータに関するデータフォーマットはMIDI形式のデータに限らず、他の形式であってもよく、その場合はMIDIインタフェース５と外部のMIDI機器はそれにあった構成とする。
【００１７】
操作子６は、操作子の操作状態を検出し、その操作状態に応じたスイッチ情報をデータ及びアドレスバス１Ｄを介してＣＰＵ１に出力する。操作状態を検出する対象の操作子としては、例えば音高、音色、効果等を選択・設定・制御するために用いる数値データ入力用のテンキーや文字データ入力用のキーボード、あるいはディスプレイ７に表示される所定のポインティングデバイスを操作するために用いるマウスなどの各種操作子がある。ディスプレイ７は例えば液晶表示パネル（ＬＣＤ）やＣＲＴ等から構成され、ＲＯＭ３あるいはＲＡＭ４などに記憶されている音色データや原波形データなどを所定の表示態様で表示するのは勿論のこと、それ以外にもＣＰＵ１の制御状態などを表示することができる。外部記憶装置８は、ソフト音源を実現するためのアプリケーションプログラムなどの各種制御プログラム、プリセットされた音色データや原波形データ等の各種データなどを記憶するものである。例えば、前記ＲＯＭ３に制御プログラムが記憶されていない場合、この外部記憶装置８（例えばハードディスク）に制御プログラムを記憶させておき、それをＲＡＭ４に読み込むことにより、ＲＯＭ３に制御プログラムを記憶している場合と同様の動作をＣＰＵ１にさせることができる。このようにすると、制御プログラムの追加やバージョンアップ等が容易に行える。なお、外部記憶装置８はハードディスク（HD）に限られず、フレキシブルディスク（FD）、コンパクトディスク（CD‐ROM・CD‐RW）、光磁気ディスク（MO）、あるいはDVD（Digital Versatile Disk）等の着脱自在な様々な形態の外部記憶媒体を利用する記憶装置であればどのようなものであってもよい。半導体メモリなどであってもよい。
【００１８】
ＤＭＡコントローラ９は、複数の楽音波形サンプルデータを生成する際に必要とされる原波形データを、ＲＯＭ３あるいはＲＡＭ４などに構成される波形メモリから１乃至複数分まとめてＤＭＡ方式（ダイレクトメモリアクセス方式）で読み出し、ＣＰＵ１内部にある内部ＲＡＭ（内部メモリ）１ａに供給するためのものである。すなわち、ＤＭＡコントローラ９は楽音波形サンプルデータ生成時において、デジタル・アナログ変換器（ＤＡＣ）９Ａのサンプリング周波数（例えば４８ｋＨｚ）に合わせたタイミングで、かつ、所定の複数サンプル数（一例として６４サンプル）分を１単位として該１単位分の楽音波形サンプルデータを生成するのに必要な原波形データをＲＯＭ３あるいはＲＡＭ４から読み出す。こうしたＤＭＡコントローラ９による原波形データの読み出しについては、後述する（後述の図１１参照）。デジタル・アナログ変換器（ＤＡＣ）９Ａは、所定のサンプリング周期毎に出力バッファから読み出した累算サンプルデータを、アナログ信号に変換するものである。このデジタル・アナログ変換器（ＤＡＣ）９Ａでアナログ変換された累算サンプルデータはアンプやスピーカなどを含むサウンドシステム９Ｂに送られて、該サウンドシステム９Ｂから音響的に発音されるようになっている。
【００１９】
なお、上述したような楽音生成装置は操作子６やディスプレイ７などを１つの装置本体に内蔵したものに限らず、それぞれが別々に構成され、MIDIインタフェースや各種ネットワーク等の通信手段を用いて各装置を接続するように構成されたものであってもよいことは言うまでもない。
【００２０】
上述したように、図１に示した楽音生成装置におけるＲＡＭ４は各種データを記憶するための記憶エリアを有している。そこで、その内の音色データを記憶する音色データエリアを図２に、入力バッファを記憶する入力バッファエリアを図４に、チャンネルレジスタを記憶するャンネルレジスタエリアを図５に、出力バッファを記憶する出力バッファエリアを図６にそれぞれ示す。ただし、説明の便宜上、サンプル情報バッファエリアについては後述する（後述の図９参照）。
【００２１】
図２は、ＲＡＭ４上の音色データエリアの一実施例を示す概念図である。この図２に示す音色データエリアにおいて、ＰＤ１、ＰＤ２、・・・、ＰＤ１６は１６種類分の音色データであり、それぞれの音色データは各音域に対応する原波形データを指定するデータ（つまり各音域波形指定）、ビブラート等をかける時に使用するＬＦＯ（Low Frequency Oscillator）制御用のオリジナルデータ、振幅を制御するエンベロープの発生（ＡＥＧ）制御用のオリジナルデータ、その他のオリジナルデータからなっている。ソフト音源が使用する発音用のデータは、発音指示時のタッチデータや音高データ等に応じてこれらのオリジナルデータに加工を施すことにより生成される。また、ＷＤ１、ＷＤ２、・・・、ＷＤｎはＲＯＭ３や外部記憶装置８から読み出してＲＡＭ４の当該エリアに書き込んだ複数のサンプル波形からなるオリジナル波形データであり、入力される音高データに応じて、ＰＤ１、ＰＤ２、・・・、ＰＤ１６の音色データにおける各音域波形指定データによりいずれかのオリジナル波形データが指定される。すなわち、ＷＤ１、ＷＤ２、・・・、ＷＤｎは、各々が波形メモリを構成する１音色毎の原波形データである。
【００２２】
ここで、ＲＯＭ３やＲＡＭ４（あるいは外部記憶装置８など）に構成される波形メモリに記憶されるオリジナル波形データ（原波形データ）について、図３を用いて説明する。図３は、オリジナル波形データのデータ構成を説明するための概念図である。ただし、この図３に示す実施例では所定の１音色分の連続するオリジナルのアナログ波形を８０００サンプルに分け、各サンプル毎に差分値を記憶するＤＰＣＭ波形のような波形サンプルデータ方式のものを示した。
【００２３】
この図３（ａ）及び図３（ｂ）に示した各図から理解できるように、波形メモリに記憶されるオリジナル波形データは所定のサンプリング周波数に伴うサンプリング周期毎に各時点における波形メモリ値（ここでは、１つ前の波形の振幅値と当該波形の振幅値との差分値）を記憶するものであり、各波形メモリ値に対しては各々のサンプル波形を記憶した波形メモリ位置、つまり波形メモリにおける所定の記憶領域のアドレス番号（波形メモリアドレス）が付される。ただし、この実施例では処理の都合上、波形メモリアドレス「‐１」の波形メモリ値を特別なものとして「０」固定としている。すなわち、波形メモリアドレス「‐１」である１番目のサンプル波形は振幅「０」の特別な波形である。また、オリジナル波形データをＤＰＣＭ波形として構成した場合、各サンプル波形の波形メモリ値には１つ前のサンプル波形との差分値が設定されている。オリジナルのアナログ波形が図３（ｂ）に示す曲線のような波形である場合、１番目のサンプル波形（振幅「０」）と２番目のサンプル波形との差分が「Δ０」、２番目のサンプル波形と３番目のサンプル波形との差分が「Δ１」、３番目のサンプル波形と４番目のサンプル波形との差分が「Δ２」、４番目のサンプル波形と５番目のサンプル波形との差分が「Δ３」であることから、図３（ａ）に示すような波形メモリ値を各波形メモリアドレス毎にそれぞれ持っている原波形データが記憶されることになる。
【００２４】
このような波形メモリを利用して楽音波形サンプルデータを生成する場合には、該記憶した波形メモリ値を所定のサンプリング周期で周波数ナンバを累算することにより算出される累算Ｆナンバ（読み出しアドレス）の整数部に対応する波形メモリアドレスの波形メモリ値を取り出し、それらを順次に加算してサンプル波形の振幅とする。すなわち、各サンプル波形の波形メモリ値には１つ前のサンプル波形との差分値が設定されていることから、当該サンプル波形を求める場合には１つ前の波形に対して差分値を加算する。例えば、波形メモリアドレス「‐１」である１番目のサンプル波形は振幅「０」の波形である。次に、波形メモリアドレス「０」である２番目のサンプル波形の波形メモリ値は「Δ０」であることから、２番目のサンプル波形は振幅「０」の波形に対して、アドレス「０」で示される先の記憶領域に記憶された波形メモリ値「Δ０」を加算した振幅「０＋Δ０」の波形である。これを続けていくと、例えば波形メモリアドレス「３」である５番目のサンプル波形は、４番目のサンプル波形の振幅（０＋Δ０＋Δ１＋Δ２）に波形メモリ値「Δ３」を加算した振幅「０＋Δ０＋Δ１＋Δ２＋Δ３」の波形となる。なお、上述したように、この実施例では波形メモリアドレス「‐１」に波形メモリ値「０」を定義している。一般的に波形メモリアドレスは「０」以上の整数値で表わすようにすることが多いが、この実施例では波形メモリアドレスの開始位置を「‐１」から始まるものとして、オリジナル波形全体を波形メモリアドレス上で便宜的にシフトすることによって、後述する「楽音波形サンプル生成処理」（図７及び図８参照）を単純化することができるようにしている。このようなプログラムの単純化によって、「楽音波形サンプル生成処理」を少しでも速く実行することができるようになり、効率的に楽音を生成することができるようにもしている。
【００２５】
ＲＡＭ４の記憶エリアの説明に戻って、図４はＲＡＭ４上の入力バッファエリアの一実施例を示す概念図である。この図４に示す入力バッファエリアにはMIDIインターフェース５を介して入力されるノートオン、ノートオフなどの各種イベントに対応するMIDIイベントデータＩＤ１、ＩＤ２、ＩＤ３、・・・が読み出されることにより、そのイベント処理が楽音生成装置内において実行される。このMIDIイベントデータＩＤ１、ＩＤ２、ＩＤ３、・・・はMIDIイベントのデータ内容（例えばデータ１内容）と、そのデータの発生時刻（例えばデータ１発生時刻）とにより構成される。この発生時刻はMIDIイベントデータ受信時にタイマ２の現在時刻を取り込むことにより知ることができる。
【００２６】
図５は、ＲＡＭ４上のチャンネルレジスタエリアの一実施例を示す概念図である。この図５に示すチャンネルレジスタエリアは、それぞれ互いに独立した複数の楽音の生成を制御するためのデータを記憶するチャンネル（Ｃｈ）レジスタとして使用され、この例では１Ｃｈ、２Ｃｈ、・・・、８Ｃｈの８チャンネル分のエリアが用意されている。各チャンネルのエリアはノートナンバ、波形指定データ、ＬＦＯ制御データ、振幅エンベロープ（ＡＥＧ）制御データ、ノートオンデータ、その他のデータ、及びＣＰＵ１がプログラム実行時に使用するワークエリアからなっている。この波形指定データ、ＬＦＯ制御データ、ＡＥＧ制御データは前記した各オリジナルデータに加工が施された発音用のデータである。
【００２７】
図６は、ＲＡＭ４上の出力バッファエリアの一実施例を示す概念図である。この図６に示すエリアは複数の出力バッファ用のエリアであり、この実施例では出力バッファＡと出力バッファＢとが順次交代して発音波形生成用の出力バッファとして使用されている。この出力バッファは、所定の演算処理（図示せず）により生成された各発音チャンネルの累算サンプルデータＳＤ１、ＳＤ２、ＳＤ３、・・・が生成される毎にチャンネル累算され格納される。出力バッファのいずれかが発音波形生成用の出力バッファとして指定され、波形生成演算に使用される（図１３の▲２▼Ｃｈ１〜Ｃｈ８の累算及び▲３▼出力バッファからの読み出し参照）。この出力バッファは２つ以上用意される。最も簡単な構成としては出力バッファを２個とし、片方に格納されているデータをＤＭＡ９に渡して再生している間に、もう片方に演算した次の累算サンプルデータを格納するダブルバッファ構成とすることができる。なお、出力バッファのサイズは、１００ワード、５００ワード、１Ｋワード、５Ｋワード等任意に設定することができるが、サイズを大きくすると発音に遅れを生じ、サイズを小さくすると時間的マージンが減少し、一時的な演算量の増加時に応答が悪くなることになる。そこで、リアルタイム性が要求されない、例えばシーケンサ演奏等の場合は、演奏タイミングを前にずらすことにより発音遅れを吸収できるため、出力バッファのサイズを大きくすることができる。一方、リアルタイムの演奏が必要とされる、例えば鍵盤演奏等の場合は、発音遅れを防止するため、バッファサイズは１００〜２００ワードとするとよい。以上は、再生のサンプリング周波数が４０ｋＨｚ〜５０ｋＨｚの場合であり、サンプリング周波数を低く設定する場合は、発音遅れを防止するためにもっと小さいサイズにする必要がある。
【００２８】
図１に示す本発明に係る楽音生成装置では、図１３に示した従来の楽音生成処理で実行している処理手順と同様の処理手順に従って楽音を生成する。すなわち、所定のサンプリング周期に従って波形メモリから読み出した１乃至複数の原波形データに基づいて各発音チャンネル毎に複数の楽音波形サンプルデータを生成し（図１３の▲１▼楽音波形サンプルの生成参照）、該生成した複数楽音波形サンプルデータの１つ１つについて全ての発音チャンネル分を累算した結果の複数の累算サンプルデータを出力バッファに書き込み（図１３の▲２▼Ｃｈ１〜Ｃｈ８の累算参照）、該出力バッファに書き込んだ累算サンプルデータに基づいて楽音波形の生成を行う（図１３の▲３▼出力バッファからの読み出し参照）。ただし、既に説明したように、上記の各発音チャンネル毎に複数の楽音波形サンプルデータを生成する際に（▲１▼楽音波形サンプルの生成）、読み出しアドレスが波形メモリにおける当該原波形データの終端側アドレスを超えているか否かを判定する終端チェック処理を１回１回の原波形データの読み出し毎に行うとＣＰＵのオーバヘッドが大きくなり都合が悪い。そこで、図１に示す楽音生成装置では▲１▼楽音波形サンプルの生成時において、複数の楽音波形サンプルデータをまとめて生成するために必要な原波形データを、所定のサンプリング周期に応じて算出される読み出しアドレスに従って波形メモリから読み出す際に１回１回の読み出し毎に終端チェック処理を行うことがないように、所定のループバッファを用いて楽音波形サンプルデータを生成する。こうすることにより、ＣＰＵのオーバヘッドをより小さくすることができるようにしている。
【００２９】
そこで、上述したループバッファを用いて楽音波形サンプルデータを生成する処理、つまり１回１回の読み出し毎に終端チェック処理を行うことなしに波形メモリから原波形データを読み出すことができ、効率的に各発音チャンネル毎に複数の楽音波形サンプルデータを生成することのできる「楽音波形サンプル生成処理」について、図７及び図８を用いて説明する。図７は「楽音波形サンプル生成処理」における前半部分の処理の一実施例を示すフローチャートであり、図８は「楽音波形サンプル生成処理」における後半部分の処理の一実施例を示すフローチャートである。すなわち、図７に示した前半処理に引き続き、図８に示した後半処理が実行される。以下、図７及び図８に示した各々のフローチャートに従って、当該「楽音波形サンプル生成処理」の動作について説明する。ただし、ここでは各フレーム処理において、各発音チャンネル毎に６４サンプル分の楽音波形サンプルデータを生成する場合を例にして説明する。
【００３０】
まず、図７に示したフローチャートに従って、「楽音波形サンプル生成処理」における前半部分の処理動作について説明する。
ステップＳ１では、ループカウンタを「０」にセットする。このループカウンタは、各発音チャンネル毎に生成する楽音波形サンプルデータの数だけカウントされる変数である。すなわち、楽音波形サンプルデータを生成するタイミングである所定のサンプリング周期毎に「１」ずつ加算されるようにしてカウントされる。この実施例においては各フレーム処理において、各発音チャンネル毎に６４サンプル分の楽音波形サンプルデータを生成するようにしたことから、該ループカウンタはサンプリング周期に従って「０」〜「６３」までの６４サンプル分の値を取り得る。ステップＳ２では、累算Ｆナンバの算出を行う。累算Ｆナンバは、所定のサンプリング周期に従う周波数ナンバ（Ｆナンバ）をループカウンタのカウント進行に応じて、つまりサンプリング周期毎に順次に加算することによって算出する。例えば、Ｆナンバが「2.4」である場合、累算Ｆナンバはループカウンタの進行に応じて「0.0」「2.4」「4.8」「7.2」・・・のように順次算出される。この累算Ｆナンバの整数部は波形メモリアドレスに対応するものであることから、この累算Ｆナンバの整数部に対応する波形メモリアドレスを持つ原波形データを波形メモリから読み出すことができるようになっている。こうして算出される累算Ｆナンバに基づき補間係数を求め、求めた補間係数を上記ループカウンタと共にサンプル情報バッファ（後述する図９参照）に保存する（ステップＳ３）。補間係数は累算Ｆナンバの小数部であって、後述する波形補間処理（図８のステップＳ２４参照）実行時に用いられる。例えば、累算Ｆナンバが「2.4」である場合には補間係数は「0.4」となるし、累算Ｆナンバが「4.8」である場合には補間係数は「0.8」となる。
【００３１】
ステップＳ４では、波形メモリアドレス増分値を算出してサンプル情報バッファに保存する。すなわち、上記ステップＳ２において算出した累算Ｆナンバに対応する楽音波形サンプルデータを生成するためには、該累算Ｆナンバに近い前後の波形メモリアドレスの原波形データを波形メモリから読み出して波形補間を行うことが必要である。そこで、こうした楽音波形サンプルデータを生成するための累算Ｆナンバに対応する波形メモリアドレスを増分値でサンプル情報バッファに保存する。例えば、累算Ｆナンバが「4.8」と算出されており、その１つ前の累算Ｆナンバが「2.4」であった場合には、該波形メモリアドレス増分値を「２」（つまり、[累算Ｆナンバ「4.8」の整数部である「４」]−[１つ前の累算Ｆナンバ「2.4」の整数部である「２」]）に決定する。そして、後述するように、該波形メモリアドレス増分値「２」に従ってループバッファに記憶された原波形データをデコードしたＰＣＭサンプル波形を読み出すためのアドレスを求め、これに基づいて波形補間に必要なＰＣＭサンプル波形をループバッファから読み出し、読み出したＰＣＭサンプル波形に基づき波形補間を行うことにより各累算Ｆナンバに対応する楽音波形サンプルデータを生成する（後述する図８のステップＳ２２〜ステップＳ２４参照）。
【００３２】
ステップＳ５では、ループカウンタに「１」を加算する。ステップＳ６では、ループカウンタが６３より大きい値であるか否かを判定する。ループカウンタが６３より大きい値でない場合、つまりループカウンタが６３以下である場合には（ステップＳ６のＮＯ）、ステップＳ２の処理に戻って上記ステップＳ２〜ステップＳ６までの処理を繰り返し実行する。他方、ループカウンタが６３より大きい値である場合、つまりループカウンタが６４となった場合には（ステップＳ６のＹＥＳ）、ステップＳ７の処理へ行く。このように上記したステップＳ２〜ステップＳ６までの処理を繰り返し実行することで、６４サンプル分の楽音波形サンプルデータを生成するために必要なサンプル情報バッファをＲＡＭ４上に順次に生成していくようになっている。すなわち、波形補間係数と波形取得サンプル位置（波形メモリアドレス増分値）とを６４サンプル分取得する。
【００３３】
ここで、上記ステップＳ２〜ステップＳ６までの処理を繰り返すことによって、ＲＡＭ４上に生成されるサンプル情報バッファエリアについて、図９を用いて説明する。図９は、ＲＡＭ４上のサンプル情報バッファエリアの一実施例を示す概念図である。
【００３４】
この図９から理解できるように、各発音チャンネル毎に生成されるサンプル情報バッファ（エリア）は、ループカウンタ「０」から「６３」までの６４サンプルそれぞれの各サンプル位置に応じて、上記ステップＳ３で算出した補間係数（つまり、累算Ｆナンバの小数部）と上記ステップＳ４で決定した波形メモリアドレス増分値とを記憶する。ここでは、ループカウンタが１増える毎に、累算Ｆナンバが「2.4」ずつ増加している場合に記憶される各データ内容を例に示した。
ループカウンタの増加に伴い、累算Ｆナンバは「0.0」「2.4」「4.8」「7.2」…「151.2」となり、累算Ｆナンバの小数部が補間係数であることから、この場合における補間係数は「0.0」「0.4」「0.8」「0.2」…「0.2」となる。波形取得サンプル位置（波形メモリアドレス増分値）は１つ前の累算Ｆナンバの整数部と該累算Ｆナンバの整数部との増加分であることから、この場合における波形メモリアドレス増分値は「0」「2（2-0）」「2（4-2）」「3（7−4）」…「3（151−148）」となる。
【００３５】
なお、上述した「楽音波形サンプル生成処理」においては算出した累算Ｆナンバをサンプル情報バッファに記憶することなく、累算Ｆナンバの小数部のみを補間係数として（ステップＳ３参照）、累算Ｆナンバの整数部の増分値を波形メモリアドレス増分値として（ステップＳ４参照）記憶するようにしたが、こうした補間係数や波形メモリアドレス増分値を記憶する代わりに、累算Ｆナンバのみをそのまま記憶するようにしてもよい。ただし、そうした場合には、該累算Ｆナンバから小数部や整数部のみを取りだし、小数部を補間係数として補間処理を行ったり、整数部から波形メモリアドレス増分値を算出する必要があることは言うまでもない。勿論、補間係数や波形メモリアドレス増分値と共に累算Ｆナンバを記憶しておくようにしてもよい。
【００３６】
図７に示すフローチャートの説明に戻って、ステップＳ７では各チャンネル毎において６４サンプル分の楽音波形サンプルデータを取り出す処理（つまり１回のフレーム処理）で処理する範囲の終端側アドレス（これをフレーム処理のエンドポイントと呼び、ｐＥと略示する）を取得する。例えば、上述した図９に示すようなサンプル情報が生成される場合においては、今回のフレーム処理範囲は累算Ｆナンバ「0.0」〜「151.2」の範囲であり、該フレーム処理のエンドポイントとしては累算Ｆナンバの整数部「１５１」が取得されることになる。ステップＳ８では、当該フレーム処理が最初のフレーム処理であるか否かを判定する。すなわち、今回の各チャンネル毎において６４サンプル分の楽音波形サンプルデータを取り出す処理（フレーム処理）が、第１回目の６４サンプル分を取り出す処理であるか否かを判定する。当該処理が最初のフレーム処理であると判定された場合には（ステップＳ８のＹＥＳ）、当該フレーム処理で処理する範囲のうちの始端側アドレス（これをスタートポイントと呼び、ｐＳと略示する）として１音色の波形メモリの始端側アドレス（これを１音色の波形ＲＯＭのスタートポイントと呼び、ｒＳと略示する）を設定し（ステップＳ９）、ステップＳ１５の処理へジャンプする。
【００３７】
一方、当該フレーム処理が最初のフレーム処理であると判定されなかった場合、つまり２回目以降のフレーム処理であると判定された場合には（ステップＳ８のＮＯ）、１つ前のフレーム処理の終端側アドレス（これを前フレーム処理のエンドポイントと呼び、ｐＥ´と略示する）と今回のフレーム処理のエンドポイント（ｐＥ）とが同じ位置であるか否かを判定する（ステップＳ１０）。前フレーム処理のエンドポイント（ｐＥ´）と今回のフレーム処理のエンドポイント（ｐＥ）とが同じ位置であると判定された場合には（ステップＳ１０のＹＥＳ）、現在の波形読み出しアドレス（つまり累算Ｆナンバ）を次の６４ポイント生成のために保存し（ステップＳ１１）、後述の図８に示すフローチャートに示すステップＳ２４の処理へジャンプする。１つ前のフレーム処理のエンドポイント（ｐＥ´）と今回のフレーム処理の範囲のエンドポイント（ｐＥ）とが同じ位置であると判定されなかった場合には（ステップＳ１０のＮＯ）、フレーム処理のスタートポイント（ｐＳ）として前のフレーム処理のエンドポイント（ｐＥ´）に「１」を加算したものを設定する（ステップＳ１２）。
【００３８】
ステップＳ１３では、上記ステップＳ１２において設定されたフレーム処理のスタートポイント（ｐＳ）が１音色の波形ＲＯＭのスタートポイント（ｒＳ）よりも大きい値であるか否かを判定する。フレーム処理のスタートポイント（ｐＳ）が１音色の波形ＲＯＭのスタートポイント（ｒＳ）よりも大きい値であると判定された場合には（ステップＳ１３のＹＥＳ）、新たなフレーム処理の範囲のスタートポイント（ｐＳ）としてフレーム処理のスタートポイント（ｐＳ）から１音色の波形ＲＯＭのアドレス幅（これをｗＬＥと略示する）を減算したものを再設定すると共に、新たなフレーム処理の範囲のエンドポイント（ｐＥ）として現在のフレーム処理のエンドポイント（ｐＥ）から１音色の波形ＲＯＭのアドレス幅（ｗＬＥ）を減算したものを再設定する（ステップＳ１４）。前記１音色の波形ＲＯＭのアドレス幅（ｗＬＥ）は、１音色の波形ＲＯＭの終端側アドレス（これを１音色の波形ＲＯＭのエンドポイントと呼び、ｒＥと略示する）から１音色の波形ＲＯＭにおいてループ読み出しを行うアドレス（これをループポイントと呼び、ｒＬと略示する）を減算することにより求められるアドレス幅である。ステップＳ１５では、フレーム処理の中のループポイントからエンドポイント間の処理回数（これをＬＴと略示する）を「−１」に初期化する。このステップＳ１５の処理までが前半部分の処理であり、該処理を終了すると図８に示す後半部分の処理が引き続いて実行される。
【００３９】
図８に示すフローチャートにおいて、ステップＳ１６ではフレーム処理のエンドポイント（ｐＥ）が１音色の波形ＲＯＭのエンドポイント（ｒＥ）よりも大きいか否かを判定する。フレーム処理のエンドポイント（ｐＥ）が１音色の波形ＲＯＭのエンドポイント（ｒＥ）よりも大きいと判定された場合には（ステップＳ１６のＹＥＳ）、新たなフレーム処理のエンドポイント（ｐＥ）として現在のフレーム処理のエンドポイント（ｐＥ）から１音色の波形ＲＯＭのループアドレス幅（ｗＬＥ）を減算したものを再設定すると共に、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）に「１」を加算する（ステップＳ１７）。そして、所定のフラグに「１」をセットして（ステップＳ１８）、上記ステップＳ１６の処理に戻る。他方、フレーム処理のエンドポイント（ｐＥ）が１音色の波形ＲＯＭのエンドポイント（ｒＥ）よりも大きいと判定されなかった場合には（ステップＳ１６のＮＯ）、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）が「０」より小さいか否かを判定する（ステップＳ１９）。フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）が「０」より小さいと判定された場合には（ステップＳ１９のＹＥＳ）、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）に対して「０」をセットする（ステップＳ２０）。ステップＳ２１では、波形メモリアドレスを次の６４サンプル生成のために保存する。上記ステップＳ７〜ステップＳ２０までの処理によって、当該フレーム処理のスタートポイント（ｐＳ）とエンドポイント（ｐＥ）の再設定が行われる。すなわち、後述するステップＳ２２で実行する条件分岐を含まない複数回のＲＯＭ波形ＰＣＭ化のループによるバッチ処理において、ループバッファを用いて楽音波形サンプルデータを生成することに伴う処理を実行する。
【００４０】
ステップＳ２２では、条件分岐を含まない複数回のＲＯＭ波形ＰＣＭ化のループによるバッチ処理を行う。すなわち、このステップＳ２２の処理は、波形メモリから１サンプルずつ原波形データ（ＤＰＣＭ波形）を読み出して、該原波形データをＰＣＭ化したＰＣＭサンプル波形をループバッファに書き込む処理である。これについては後述の図１０を用いて説明することから、ここでの説明を省略する。ステップＳ２３では、波形補間に使用するＰＣＭサンプル波形を取得する。すなわち、サンプル情報バッファに記憶した波形メモリアドレス増分値に従って波形メモリアドレスを再計算し、該再計算した波形メモリアドレスに基づきループバッファから波形補間に必要な分のＰＣＭサンプル波形を読み出す。この必要な分のＰＣＭサンプル波形の取りだしの際に、上記ステップＳ７〜ステップＳ２０までの処理によって再設定した当該フレーム処理のスタートポイント（ｐＳ）とエンドポイント（ｐＥ）を用いる。ステップＳ２４では、読み出したＰＣＭサンプル波形に基づき波形補間を実行する。これにより、６４サンプル分の楽音波形サンプルデータを生成する。例えば、波形メモリアドレスが「７」と再計算された場合は、波形補間で使用するＰＣＭサンプルを取り出すべき波形メモリアドレスを「６」と「７」に決定する。そして、波形メモリアドレス「６」と「７」に対応するＰＣＭサンプル波形をループバッファから読み出し、これに基づいて楽音波形サンプルデータを生成する。ステップＳ２５では、次のフレーム処理に具えて所定のフラグをリセットしておく。
【００４１】
上述したように、波形メモリに記憶されている原波形データがＤＰＣＭ波形であるような場合、波形メモリ値には１つ前のサンプル波形との差分値が設定される（図３参照）。そこで、ＰＣＭサンプル波形をループバッファに書き込む際には（ステップＳ２２参照）、２以上のＰＣＭサンプル波形をループバッファに書き込む場合がある。すなわち、原波形データがＤＰＣＭである場合には、波形メモリに記憶されている波形メモリ値として１つ前のＰＣＭサンプル波形との差分値が設定されていることから、所定位置の当該ＰＣＭサンプル波形は１つ前のＰＣＭサンプル波形に差分値を加算して分かる。したがって、１つ前のＰＣＭサンプル波形が分からないと当該位置のＰＣＭサンプル波形も分からない。そこで、こうしたことを避けるために、ＰＣＭサンプル波形をループバッファに書き込む際には、１つのループカウンタに対して２以上のＰＣＭサンプル波形をループバッファに書き込むことがある。例えば、図９に示したサンプル情報バッファにおいて、ループカウンタ「３」に対応するＰＣＭサンプル波形をループバッファに書き込む際には、「５」「６」「７」の３つのＰＣＭサンプル波形が書き込まれる。これは、ループカウンタ「３」時における累算Ｆナンバ「7.2」に対応するＰＣＭサンプル波形を波形補間で生成するには、波形サンプル位置「６」と波形サンプル位置「７」の２つのＰＣＭサンプル波形があればよいのだが、波形サンプル位置「６」のＰＣＭサンプル波形は波形サンプル位置「５」のＰＣＭサンプル波形がないと生成することができない。該ループカウンタ「３」より１つ前のループカウンタ「２」までにおいては、波形サンプル位置「‐１」〜「４」までのＰＣＭサンプル波形を生成するように読み出しサンプルに記憶されている。そこで、ループカウンタ「３」に対応するＰＣＭサンプル波形として、波形サンプル位置「５」を加えた「５」「６」「７」の３つの波形メモリアドレスに対応するＰＣＭサンプル波形が生成されることになる。
【００４２】
ここで、上記ステップＳ２２に示した条件分岐を含まない複数回のＲＯＭ波形ＰＣＭ化のループによるバッチ処理について、具体例を用いて説明する。この複数回のＲＯＭ波形ＰＣＭ化のループによるバッチ処理は、波形メモリ（波形ＲＯＭ）から１サンプルずつ原波形データ（ＤＰＣＭ波形）を読み出して、該原波形データをＰＣＭ化した波形、つまりＤＰＣＭ波形をデコードした結果のＰＣＭサンプル波形をループバッファに順次に書き込む処理である。該処理では、波形メモリから１サンプルずつ原波形データを読み出す際に、当該フレーム処理の範囲が１音色の波形ＲＯＭにおける原波形データの範囲を超えて読み出しを行うものであるか否かによって、波形メモリからの原波形データの読み出し方が異なるようにしている。つまり、１回のフレーム処理において複数の楽音波形サンプルデータを生成するために必要とする原波形データの範囲と１音色の波形ＲＯＭにおける原波形データの範囲によって、波形メモリからの原波形データの読み出し方を異ならせる。そこで、こうした条件分岐を含まない複数回のＲＯＭ波形ＰＣＭ化のループによるバッチ処理において、フレーム処理の範囲と１音色の波形ＲＯＭにおける原波形データの範囲との比較に応じて、どのように波形メモリからの原波形データの読み出し方を異ならせているかについて、図１０を用いて説明する。図１０は、条件分岐を含まない複数回のＲＯＭ波形ＰＣＭ化のループによるバッチ処理について説明するための概念図である。この図１０に示す各図では上から順に、１音色の波形ＲＯＭにおける原波形データの範囲、１回のフレーム処理において複数の楽音波形サンプルデータを生成するために必要とする原波形データの範囲、波形ＲＯＭからの原波形データの読み出し方をそれぞれ示した。
なお、ここでは説明を簡単にするために、１音色の波形ＲＯＭのスタートポイント（ｒＳ）と１音色の波形ＲＯＭのループポイント（ｒＬ）とを同じ波形メモリアドレスに設定したものについて説明する。
【００４３】
まず、図１０（ａ）は、１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えない場合に行われる波形メモリからの原波形データの読み出し方について説明するための概念図である。１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えない場合、上述した「楽音波形サンプル生成処理」（図７及び図８参照）において所定のフラグが「０」にセットされる。すなわち、この図１０（ａ）に示す波形メモリからの原波形データの読み出し方は、前記所定のフラグが「０」である場合に行われる。この場合には、図１０（ａ）から理解できるように、１回のフレーム処理の範囲のスタートポイント（ｐＳ）から１回のフレーム処理の範囲のエンドポイント（ｐＥ）までの該フレーム処理の範囲に従い、１音色の波形ＲＯＭの範囲を超えることなく原波形データが１サンプルずつ読み出される。そして、読み出された各々の原波形データはデコードされ、ＰＣＭサンプル波形としてループバッファに書き込まれる。このように、１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えない場合には、１音色の波形ＲＯＭから１サンプルずつ原波形データを読み出す際に、１サンプル毎に１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えたか否かの終端チェック処理を行わなくてよい。
【００４４】
図１０（ｂ）は、１回のフレーム処理の範囲のスタートポイント（ｐＳ）が１音色の波形ＲＯＭのエンドポイント（ｒＥ）以降の場合（つまり、前回のフレーム処理の範囲のエンドポイント（ｐＥ）と１音色の波形ＲＯＭのエンドポイント（ｒＥ）とが等しい場合）に行われる波形メモリからの原波形データの読み出し方について説明するための概念図である。１回のフレーム処理の範囲のスタートポイント（ｐＳ）が１音色の波形ＲＯＭのエンドポイント（ｒＥ）以降の場合、上述した「楽音波形サンプル生成処理」（図７及び図８参照）において所定のフラグが「０」にセットされる。すなわち、この図１０（ｂ）に示す波形メモリからの原波形データの読み出し方は上記図１０（ａ）に示した読み出し方と同様に、前記所定のフラグが「０」である場合に行われる。ただし、この場合には、上述した図１０（ａ）に示した場合と異なり、フレーム処理の範囲のスタートポイント（ｐＳ）とエンドポイント（ｐＥ）とが再設定されている（上述した図７のステップＳ１４参照）。この場合には、図１０（ｂ）から理解できるように、再設定された１回のフレーム処理の範囲のスタートポイント（ｐＳ）から１回のフレーム処理の範囲のエンドポイント（ｐＥ）までの該フレーム処理の範囲に従い、１音色の波形ＲＯＭの範囲を超えることなく原波形データが１サンプルずつ読み出される。そして、読み出された各々の原波形データはデコードされ、ＰＣＭサンプル波形としてループバッファに書き込まれる。このように、１回のフレーム処理の範囲のスタートポイント（ｐＳ）が１音色の波形ＲＯＭのエンドポイント（ｒＥ）以降の場合においても、１音色の波形ＲＯＭから１サンプルずつ原波形データを読み出す際に、１サンプル毎に１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えたか否かの終端チェック処理を行わなくてよい。
【００４５】
図１０（ｃ）は、１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を１回だけ超えた場合に行われる波形メモリからの原波形データの読み出し方について説明するための概念図である。１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を１回だけ超えた場合、上述した「楽音波形サンプル生成処理」において所定のフラグが「１」にセットされる。また、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）に「０」がセットされる。すなわち、この図１０（ｃ）に示す波形メモリからの原波形データの読み出し方は、前記所定のフラグが「１」であり、かつ、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）が「０」である場合に行われる。この場合には、フレーム処理の範囲のエンドポイント（ｐＥ）が再設定されている（上述した図８のステップＳ１７及びステップＳ１８参照）。
【００４６】
この場合には、図１０（ｃ）から理解できるように、まず１回のフレーム処理の範囲のスタートポイント（ｐＳ）から１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）まで、１音色の波形ＲＯＭの範囲から原波形データが１サンプルずつ読み出される。そして、原波形データを複数サンプル分（ｒＥ―ｐＳ＋１）読み出したとカウントすると、１音色の波形ＲＯＭ範囲のスタートポイント（ｒＳ）まで戻って、更にそこから再設定した１回のフレーム処理の範囲のエンドポイント（ｐＥ）まで原波形データを１サンプルずつ読み出す。そして、読み出された各々の原波形データはデコードされ、ＰＣＭサンプル波形としてループバッファに書き込まれる。このように、１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を１回だけ超えた場合には、１音色の波形ＲＯＭから１サンプルずつ原波形データを読み出す際に読み出した原波形データの数をカウントし、該カウントによって自動的に１音色の波形ＲＯＭ範囲のスタートポイント（ｒＳ）まで戻って原波形データの読み出しを続けることから、１サンプル毎に１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えたか否かの終端チェック処理を行わなくてよい。
【００４７】
図１０（ｄ）は、上記した図１０（ｃ）と同様に、１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えた場合であるが、超えた回数が２回以上である場合に行われる波形メモリからの原波形データの読み出し方について説明するための概念図である。１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を２回以上超えた場合には、上述した「楽音波形サンプル生成処理」において所定のフラグが「１」にセットされ、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）に「超えた回数（例えば２回超えたならば２）」がセットされる。すなわち、この図１０（ｄ）に示す波形メモリからの原波形データの読み出し方は、前記所定のフラグが「１」であり、かつ、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）が「１」以上である場合に行われる。この場合にも、フレーム処理の範囲のエンドポイント（ｐＥ）が再設定されている（上述した図８のステップＳ１７及びステップＳ１８参照）。
【００４８】
この場合には、図１０（ｄ）から理解できるように、まず１回のフレーム処理の範囲のスタートポイント（ｐＳ）から１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）まで、１音色の波形ＲＯＭの範囲から原波形データが１サンプルずつ読み出される。そして、原波形データを複数サンプル分（ｒＥ―ｐＳ＋１）読み出したとカウントすると、１音色の波形ＲＯＭ範囲のスタートポイント（ｒＳ）まで戻って、そこから１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）まで原波形データを１サンプルずつ読み出す（１回目のループ読み出し）。１音色の波形ＲＯＭ範囲全体分の原波形データを読み出すと、また１音色の波形ＲＯＭ範囲のスタートポイント（ｒＳ）まで戻って、更にそこから再設定した１回のフレーム処理の範囲のエンドポイント（ｐＥ）まで原波形データを１サンプルずつ読み出す。そして、読み出された各々の原波形データはデコードされ、ＰＣＭサンプル波形としてループバッファに書き込まれる。上記１音色の波形ＲＯＭ範囲全体分の原波形データの読み出しは、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）に応じた回数だけ行われる。例えば、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）が「１」である場合には１音色の波形ＲＯＭ範囲全体分の原波形データの読み出しを１回だけ行うし、フレーム処理の中のループポイントからエンドポイント間の処理回数（ＬＴ）が「２」である場合には１音色の波形ＲＯＭ範囲全体分の原波形データの読み出しを２回行う（つまり２回ループする）。このように、１回のフレーム処理の範囲のエンドポイント（ｐＥ）が１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を複数回超えた場合には、１音色の波形ＲＯＭから１サンプルずつ原波形データを読み出す際に読み出した原波形データの数をカウントし、該カウントによって１音色の波形ＲＯＭ範囲のスタートポイント（ｒＳ）まで戻り、１音色の波形ＲＯＭ範囲全体分の原波形データの読み出しを自動的に複数回続ける。したがって、この場合にも１サンプル毎に１音色の波形ＲＯＭ範囲のエンドポイント（ｒＥ）を超えたか否かの終端チェック処理を行わなくてよい。
【００４９】
上述したように、図１に示す楽音生成装置においては、生成したサンプル情報バッファに基づき波形メモリから原波形データを読み出して補間処理を行うことで、各フレーム毎に複数の楽音波形サンプルデータを生成する。こうした楽音波形サンプルデータを生成する際において、ＣＰＵ１は波形メモリから該当する原波形データを読み出して内部メモリ１ａに記憶し、該内部メモリ１ａに記憶した原波形データを用いて楽音波形サンプルデータの生成を行う。しかし、ＣＰＵ１による内部メモリ１ａからの原波形データ読み出しによる楽音波形サンプルデータ生成処理の処理時間に比べて、波形メモリから内部メモリ１ａへの原波形データの転送時間が遅いと、ＣＰＵ１では原波形データの転送が終わるまで楽音波形サンプルデータ生成処理の実行を中断することから、その分だけ処理時間が長くなる。また、原波形データをサンプル情報バッファ内容に従って１つ１つ転送していたので、こうしたことによっても転送時間がかかり、その分だけ処理時間が長くなる。そこで、図１に示す楽音生成装置では、ＤＭＡコントローラ９を用いて、ダイレクトメモリアクセス方式によって、複数楽音波形サンプルデータ生成分に必要な原波形データを波形メモリから一括して内部メモリ１ａに書き込む。すなわち、前もって複数楽音波形サンプルデータを生成する分の原波形データを波形メモリから読み出しておいて、内部メモリ１ａに記憶しておく。
【００５０】
そこで、こうしたＤＭＡコントローラ９を用いた波形メモリから内部メモリ１ａへの原波形データの転送処理について、図１１を用いて説明する。図１１は、ＤＭＡコントローラ９を用いた原波形データの転送処理の一実施例を示すフローチャートである。
【００５１】
ステップＳ３１では、転送回数カウンタが０より大きいか否かを判定する。上記転送回数カウンタは、上述した図７及び図８のステップＳ７からステップＳ１８までが実行されることにより設定される変数である。例えば、１回のフレーム処理時におけるフレーム処理の範囲が上述した図１０の各図に示したような範囲である場合の転送回数をそれぞれ示すと、図１０（ａ）の場合は「１」、図１０（ｂ）の場合は「１」、図１０（ｃ）の場合は「２」、図１０（ｄ）の場合は「３」とそれぞれ設定されることになる。こうして設定される転送回数カウンタが０以下である場合には（ステップＳ３１のＮＯ）、当該原波形データの転送処理を終了する。他方、転送回数カウンタが０より大きい場合には（ステップＳ３１のＹＥＳ）、転送回数カウンタから１を減算する（ステップＳ３２）。そして、転送始端と転送長とを求め、ＤＭＡ方式により該転送始端と転送長とで決まる範囲の原波形データを波形メモリから読み出して内部メモリ１ａに転送する（ステップＳ３３）。転送始端は転送開始位置であり、転送長は転送する範囲である。上記ステップＳ３３におけるデータ転送が終了すると（ステップＳ３４）、ステップＳ３１の処理に戻って上記ステップＳ３１〜ステップＳ３４までの処理を繰り返し実行する。これにより、ＰＣＭサンプル波形の基となる全ての原波形データ（つまり、１回のフレーム処理時におけるフレーム処理の範囲で用いる全ての原波形データの全て）を予め波形メモリから内部メモリ１ａへと転送しておくことができることから、ループバッファにＰＣＭサンプル波形を書き込む際に基となる原波形データを内部メモリ１ａから読み出すことができ、処理を速く実行することができるようになる。
【００５２】
ここで、上記原波形データの転送処理を実行することによる楽音波形サンプルデータ生成時間の短縮について、図１２を用いて簡単に説明する。図１２は、上記原波形データの転送処理の実行に伴う楽音波形サンプルデータ生成時間の短縮について説明するための概念図である。図１２の上段に従来の原波形データ読み出し処理を用いた場合における楽音波形サンプルデータ生成時間を示し、図１２の下段に上記原波形データの転送処理を用いた場合における楽音波形サンプルデータ生成時間を示した。
【００５３】
従来の原波形データの読み出し処理、つまりサンプル情報バッファに基づく原波形データの読み出しを波形メモリから１つずつ実行する処理では、楽音波形サンプル生成処理と原波形データの読み出し処理とを同時並行的に実行することができない。そのために、図１２上段に示した図から理解できるように、波形メモリから内部メモリ１ａに原波形データを転送するメモリ転送に相当する外部メモリアクセス時間と複数の楽音波形サンプルデータを生成するのに係る純処理時間とが時間的に交互に連続するようにしか処理を実行することができない。他方、上述の図１１に示したような原波形データの転送処理、つまりＤＭＡコントローラ９により複数楽音波形サンプルデータ生成分に必要な原波形データを波形メモリから一括して内部メモリ１ａに書き込むようにすると、ＣＰＵ１とＤＭＡコントローラ９とがそれぞれ内部メモリ１ａからの原波形データ読み出しによる楽音波形サンプルデータの生成と、波形メモリから内部波形メモリ１ａへの原波形データの書き込み（転送）とをそれぞれ実行することができるようになる。
【００５４】
そのため、図１２下段に示した図から理解できるように、波形メモリから内部メモリ１ａに原波形データを転送するメモリ転送に相当する外部メモリアクセス時間と複数の楽音波形サンプルデータを生成するのに係る純処理時間とを同時刻に重ねることができる。例えば、ＣＰＵ１においてフレーム処理１の複数楽音波形サンプルデータ生成を内部メモリ１ａに記憶された原波形データに基づき実行している最中に、ＤＭＡコントローラ１９ではフレーム処理１に続くフレーム処理２の複数楽音波形サンプルデータを生成するために必要とされる原波形データを波形メモリから内部波形メモリ１ａへ転送する。こうすると、ＣＰＵ１によるＤＭＡコントローラ９を用いた原波形データの転送のためのメモリ転送の準備に係る時間を考慮したとしても、従来と比較して楽音波形サンプルデータ生成のための時間が短くなる。この図１２に示す例においては、Δｔ分だけ実行時間の短縮化が計れていることになる。
【００５５】
なお、上述した実施例において、波形メモリに記憶する原波形データとしてＤＰＣＭ波形を用いた例を示したがこれに限らない。例えば、原波形データとしてＡＤＰＣＭ波形を用いてもよいし、ＰＣＭサンプル波形そのものを用いるようにしてもよい。また、ＭＰ３（MPEG layer３）波形やＡＡＣ（Advanced Audio Coding）波形やＷＭＡ（Windows（登録商標） Media Audio）波形など、あらゆる符号化波形を用いるようにしてもよい。ＰＣＭサンプル波形そのものを用いる場合には、補間処理の際に必要な前後の原波形データ以外の他の原波形データを読み出す必要がないことは言うまでもない。
【００５６】
【発明の効果】
この発明によれば、発音チャンネル毎に複数の楽音波形サンプルを生成する際に、読み出しアドレスが該波形メモリにおける当該原波形の終端側アドレスを超えているか否かを判定する終端チェック処理の分岐判断を１回１回の原波形の読み出し毎に行うことのないようにしたことから、ＣＰＵのオーバヘッドをより小さくすることができ、楽音生成処理を効率よく実行することができるようになる、という効果を得る。
【図面の簡単な説明】
【図１】  この発明に係る楽音生成装置の全体構成の一実施例を示すハード構成ブロック図である。
【図２】  ＲＡＭ上の音色データエリアの一実施例を示す概念図である。
【図３】  オリジナル波形データのデータ構成を説明するための概念図である。
【図４】  ＲＡＭ上の入力バッファエリアの一実施例を示す概念図である。
【図５】  ＲＡＭ上のチャンネルレジスタの一実施例を示す概念図である。
【図６】  ＲＡＭ上の出力バッファエリアの一実施例を示す概念図である。
【図７】  楽音波形サンプル生成処理における前半部分の処理の一実施例を示すフローチャートである。
【図８】  楽音波形サンプル生成処理における後半部分の処理の一実施例を示すフローチャートである。
【図９】  ＲＡＭ上のサンプル情報バッファエリアの一実施例を示す概念図である。
【図１０】  条件分岐を含まない複数回のＤＰＣＭ波形の読み出しについて場合を分けて説明するための概念図である。
【図１１】  ＤＭＡコントローラを用いた原波形データの転送処理の一実施例を示すフローチャートである。
【図１２】  上記原波形データの転送処理の実行に伴う楽音波形サンプルデータ生成時間の短縮について説明するための概念図である。
【図１３】  従来の楽音生成装置の楽音生成処理概要を説明するための概念図である。
【符号の説明】
１…ＣＰＵ、１ａ…内部ＲＡＭ（内部メモリ）、２…タイマ、３…ＲＯＭ、４…ＲＡＭ、５…ＭＩＤＩインタフェース、６…操作子、７…ディスプレイ、８…外部記憶装置、９…ＤＭＡコントローラ、９Ａ…デジタル・アナログ変換器（ＤＡＣ）、９Ｂ…サウンドシステム、１Ｄ…通信バス
【図１】
0003832382.tif 000002
【図２】
0003832382.tif 000003
【図３】
0003832382.tif 000004
【図４】
0003832382.tif 000005
【図５】
0003832382.tif 000006
【図６】
0003832382.tif 000007
【図７】
0003832382.tif 000008
【図８】
0003832382.tif 000009
【図９】
0003832382.tif 000010
【図１０】
0003832382.tif 000011
【図１１】
0003832382.tif 000012
【図１２】
0003832382.tif 000013
【図１３】
0003832382.tif 000014