以下、図面を用いて本発明の実施の形態を説明する。
図1は、本発明に係る楽音生成装置を適用した電子楽器のハードウェア構成を示すブロック図である。CPU(中央処理装置)101は、ROM102やRAM103に記憶されている制御プログラムを実行することにより、本電子楽器の全体の動作を制御する。ROM(リードオンリメモリ)102は、電源投入時のスタートアップルーチンや低レベルI/O処理を司るBIOS(Basic Input/Output System)およびCPU101が実行する制御プログラムや各種データを格納する不揮発性メモリである。RAM(ランダムアクセスメモリ)103は、各種のワーク領域として使用する揮発性メモリである。操作子(SW)104は、ユーザがこの電子楽器に各種の指示を与えるために外部パネル上に設けられた各種のスイッチなどである。表示部105は、CPU101からの指示に基づいて、与えられた各種の情報を表示するディスプレイである。
鍵盤106は、演奏操作用の複数の鍵を有する。これら各鍵の演奏操作に応じて、押鍵された鍵の音高を示すキーコード、押鍵/離鍵を示すキーオン/キーオフ信号、およびタッチデータなどの各種キー情報がCPU101に送出される。外部記憶装置107は、例えばハードディスクやフラッシュメモリなどであり、CPU101が実行するプログラムや波形データなどの各種のデータを記憶する。音源回路108は、CPU101からの指示に応じて、複数の楽音発生チャンネルで楽音信号を発生する音源である。ここでは、波形メモリ109に格納されている波形データを読み出して楽音信号を生成する音源とする。後に詳しく説明するが、波形メモリ109は、楽音のピッチに時間変化を与えるためのピッチ変化波形データや楽音の振幅に時間変化を与えるための振幅変化波形データを格納しており、音源回路108は、楽音生成する際にこれらのピッチ変化波形データや振幅変化波形データに基づいてピッチや振幅に時間変化を与える機能を有するものである。音源回路108から出力された楽音信号は、DA(ディジタル・アナログ)変換器110によりアナログ音響信号に変換され、サウンドシステム(SS)111により外部に放音される。バス120は、上記各部を相互に接続するバスラインであり、コントロールバス、データバス、およびアドレスバスを総称したものである。
図2は、図1の音源回路108の詳細な構成を示すブロック図である。制御レジスタ201は、音源回路108内の各部を制御するデータをバス120を介してCPU101から受け取り記憶する複数のレジスタである。音源回路108内で処理したデータのうち所定のものを記憶し、バス120を介してCPU101に送ることも可能である。特に、制御レジスタ201は、各発音ch(チャンネル)毎のパラメータおよびノートオンを設定するレジスタを含む。CPU101は、鍵盤106の操作を検出したとき、その操作に応じて楽音生成するchを割り当て、そのchに対応する制御レジスタに、その演奏情報に基づくパラメータを設定しノートオンを書き込む。これにより、音源回路108は、そのchでの楽音生成処理を開始する。なお、本実施形態の音源回路108では発音chを64ch備えているものとする。以下で説明する図2の各部の動作では、主として1ch分の処理を説明する。同様の処理が、時分割で全64chに対して行われ、複数の楽音が並行して生成される。
図2を参照して音源回路108の動作を説明する前に、波形メモリ109のメモリマップを説明しておく。
図3に、波形メモリ109のメモリマップを示す。TW#1〜TW#Ntwは、それぞれ、音色毎に設けられた楽音波形データを示す。音色毎だけでなく、1つの音色であっても、所定の音域に分割して楽音波形データを持っても良いし、アタック部とループ部とに分割して楽音波形データを持っても良い。1つの楽音波形データ、例えばTW#1は、所定のサンプリング周波数で録音された一群の楽音波形サンプルデータからなる。なお、TW#1〜TW#Ntwのそれぞれを、TW領域の楽音波形データと呼ぶものとする。
PW領域には、Npw個のピッチ変化波形データPW#1〜PW#Npwが格納されている。1つのピッチ変化波形データ、例えばPW#1は、生成する楽音のピッチに変化を付与するためのピッチ変化波形サンプルデータからなる。上述した波形データTW#N(N=1〜Ntw)は所定のサンプリング周波数で録音された楽器音から抽出されたピッチの揺らぎを示すピッチ変化波形データであるが、そのピッチ変化は、そのサンプリング周期の例えば50倍程度の周期毎に(あるいはもっと遅い周期で)変化させれば充分であるので、ピッチ変化波形サンプルデータは上記サンプリング周期の50倍程度の所定の遅い周期(読出しレート)で値を切り替えていくデータとしている。
AW領域には、Naw個の振幅変化波形データAW#1〜AW#Nawが格納されている。1つの振幅変化波形データ、例えばAW#1は、生成する楽音の振幅波形(エンベロープ)に変化を付与するための振幅変化波形サンプルデータからなる。上記ピッチ変化波形と同様に、振幅変化波形データは、所定のサンプリング周波数で録音された楽器音から抽出された振幅の変化ないし揺らぎを示すピッチ変化波形データであるが、その変化は緩やかであるので、上記サンプリング周期の50倍程度の所定の遅い周期(読出しレート)で値を切り替えていくデータとしている。
図2の音源回路108の動作の概要を説明する。上述したように音源回路108は、時分割処理で64chの楽音信号ないし変調信号を生成可能である。ここでは、64ある発音chのうちの任意の発音chを、他の発音chに対するピッチ変調用としたり、他の発音chに対する振幅変調用とすることができる。楽音用の発音chは、波形メモリ109から楽音波形TWを読み出して楽音信号を生成するように設定される。ピッチ変調用の発音chは、波形メモリ109のPW領域からピッチ変化波形データを読み出してピッチ変化波形を生成するよう設定され、さらに、そのピッチ変化波形による他のchへのピッチ変調経路が設定される。振幅変調用の発音chは、波形メモリ109のAW領域から振幅波形データを読み出して振幅変化波形を生成するよう設定され、さらに、その振幅変化波形による他chへの振幅変調経路が設定される。例えば、ch1を楽音信号発生のために使用して楽音信号を発生し、ch2をPW領域のピッチ変化波形の読み出しに使用し、ch3をAW領域に振幅変化波形の読み出しに使用し、ch1で発生する楽音信号に対して、ch2で生成したピッチ変化波形を用いてピッチ変化を付与し、ch3で生成した振幅変化波形を用いて振幅変化を付与する、といった動作が可能である。どの発音chで生成している楽音信号に対し、どの発音chで生成したピッチ変化波形ないし振幅変化波形に基づくピッチ変調ないし振幅変調をかけるかの設定は任意である。一部の発音chを他の発音chに対する変調用に用いる場合、生成できる楽音信号のch数は、64からその変調用に用いる発音chのch数を差し引いたch数となる。
図2において、レート生成部202は、CPU101から制御レジスタ201経由で受け取った各種情報に基づき、各発音ch毎に、読み出す波形データの元の音高と発音すべき楽音の音高との音高比に応じた読出しレート(Fナンバ)を発生する。ただし、上述したピッチ変化波形や振幅変化波形を読み出すことが割り当てられた発音chでは、上記PW#1〜PW#Npwから選ばれた1つのピッチ変化波形データや、上記AW#1〜AW#Nawから選ばれた1つの振幅変化波形データを読み出すための読出しレート(Fナンバ)を発生するように、制御レジスタ201を設定する。この場合の読出しレートは、ピッチ変化波形データないし振幅波形データの時間軸方向における伸縮を制御する。
図4は、レート生成部202の詳細な構成を示す。ピッチレジスタ401およびピッチEGレジスタ402は、制御レジスタ201に含まれるレジスタであり、各ch毎に設けられている。ピッチレジスタ401は、当該chで発生すべき楽音の音高に応じたピッチシフト量(演奏操作された鍵と読み出す楽音波形とのピッチ差)を示すピッチデータが設定されるレジスタである。補間部404は、ピッチレジスタ401のピッチデータを時間的に補間して、補間結果を加算部406に出力する。ピッチEGレジスタ402は、当該chで発生する楽音のピッチの変化を規定するピッチEGデータ(幾つかの目標値とレートからなる)が設定されるレジスタである。ピッチEG405は、ピッチEGレジスタ402に設定されたピッチEGデータに基づいて折れ線的なピッチ変化波形データを生成し出力する。この折れ線的なピッチ変化波形データは、ピッチEGレジスタ402で指定された目標値に、ピッチEGレジスタ402で指定されたレートで、サンプリング周期毎に近づけていき、目標値に達した時点で、新たな目標値とレートを設定することを繰り返すことにより、折れ線状に変化する波形である。ミキサ出力ch403は、図2の矢印221のルートでミキサ208の出力chから供給されるピッチ変化波形データの入力を示す。このミキサ出力ch403は、後述するピッチ変化波形出力chのPM#1〜PM#32のうち、制御レジスタ201で指定されたchである。補間部404、ピッチEG405、および、ミキサ出力ch403からの出力データは、何れもセント値(デシベル値)で、当該chで読み出す楽音波形TW#N(N=1〜Ntw)の録音時の音高からのずれ量を表す相対値であり、加算部406で加算することで合成できる。セント→Fナンバ変換部407は、加算部406から出力されるセントスケールのレート値を周波数スケールに変換し、Fナンバとして出力する。
上述したのは、TW領域の楽音波形を読み出すことが設定された発音chのレート生成部202の説明である。PW領域のピッチ変化波形を読み出すことが設定された発音chでは、ピッチレジスタ401には、選ばれたピッチ変化波形データを読み出すための読み出しアドレスを生成するのに使用するレート値が出力されるようなピッチデータを設定するものとする。ピッチ変化波形は、基本的には読み出したものをそのまま使うので、ピッチEG405は使わず、ミキサ出力ch403からの入力も使わない設定とする。ただし、ピッチEGによりピッチ変化量を上げ下げしたい場合や、ピッチ変化波形をさらに別の波形により変調したい場合は、ピッチEGレジスタ402やピッチEG405を使用し、あるいはミキサ出力ch403からの入力を有効にしてもよい。同様に、AW領域の振幅変化波形を読み出すことが設定された発音chでは、ピッチレジスタ401には、選ばれた振幅変化波形データを読み出すための読み出しアドレスを生成するのに使用するレート値が出力されるようなピッチデータを設定するものとする。振幅変化波形は、基本的には読み出したものをそのまま使うので、ピッチEG405は使わず、ミキサ出力ch403からの入力も使わない設定とする。ただし、ピッチEGにより振幅変化量を上げ下げしたい場合や、振幅変化波形をさらに別の波形により変調したい場合は、ピッチEGレジスタ402やピッチEG405を使用し、あるいはミキサ出力ch403からの入力を有効にしてもよい。なお、PW領域のピッチ変化波形やAW領域の振幅変化波形は、楽音のサンプリング周波数より低いサンプリング周波数でサンプリングされたデータでよい。従って、例えば、ピッチ変化波形のサンプリング周波数が楽音波形のサンプリング周波数の50分の1程度であるとすると、サンプリング周期の50周期分で楽音波形サンプルを50回読み出す毎に1回ピッチ変化波形サンプルを進める程度で読み出せばよい。そのため、ピッチ変化波形を読み出すのに使用するレートは、そのサンプリング周期の50周期分で1進むような値に調整されている。振幅変化波形も同様である。
図2に戻って、読出部203は、各発音ch毎に、レート生成部202から出力されたFナンバ(レート)をサンプリング周期毎に累算して読み出しアドレスを生成し、波形メモリ109の該読み出しアドレスから波形サンプル(TW領域の楽音波形)を読み出す。読み出された波形サンプルデータは、読出部203内にある補間部で補間処理され、乗算器205に出力される。乗算器205は、読出部203から出力される波形サンプルデータに、振幅変化生成部204から出力される振幅データを乗算してエンベロープを付与する。
上述したのは、TW領域の楽音波形を読み出すことが設定された発音chの読出部203と乗算器205の説明である。PW領域のピッチ変化波形を読み出すことが設定された発音chでは、読出部203は、上述したのと同様の処理により、PW領域のピッチ変化波形サンプルを読み出す。補間処理は、ピッチ変化波形をそれ程細かく制御する必要はないことから、ここでは行わない(行うこととしてもよい)。乗算器205によるピッチ変化波形の振幅の制御は、上述した楽音波形の振幅制御と同様にして行う。AW領域の振幅変化波形を読み出すことが設定された発音chでも同様である。
振幅変化生成部204は、CPU101から制御レジスタ201経由で受け取った情報に基づき、各発音ch毎に、生成される楽音の振幅の時間変化を制御するための振幅エンベロープデータを生成出力する。
図5は、振幅変化生成部204の詳細な構成を示す。振幅レジスタ501および振幅EGレジスタ502は、制御レジスタ201に含まれるレジスタであり、各ch毎に設けられている。振幅レジスタ501は、当該chで発生すべき楽音の音量(演奏情報のうちのタッチデータ(ベロシティ)により決まる音量)を示す音量データが設定されるレジスタである。補間部504は、振幅レジスタ501の音量データを時間的に補間して、補間結果を加算部506に出力する。振幅EGレジスタ502は、当該chで発生する楽音の振幅の変化を規定する振幅EGデータ(幾つかの目標値とレートからなる)が設定されるレジスタである。振幅EG505は、振幅EGレジスタ502に設定された振幅EGデータに基づいて折れ線的な振幅変化波形データを生成し出力する。この折れ線的な振幅変化波形データは、振幅EGレジスタ502で指定された目標値に、振幅EGレジスタ502で指定されたレートで、サンプリング周期毎に近づけていき、目標値に達した時点で、新たな目標値とレートを設定することを繰り返すことにより、折れ線状に変化する波形である。ミキサ出力ch503は、図2の矢印222のルートでミキサ208の出力chから供給される振幅変化波形データの入力を示す。このミキサ出力ch503は、後述する振幅変化波形出力chのAM#1〜AM#32のうち、制御レジスタ201で指定されたchである。補間部504、振幅EG505、および、ミキサ出力ch503からの出力データは、何れもデシベル値で、加算部506で加算することで合成できる。デシベル→リニア変換部507は、加算部506から出力される音量を示すデシベル値をリニア値に変換し、振幅制御波形として出力する。
上述したのは、TW領域の楽音波形を読み出すことが設定された発音chの振幅変化生成部204の説明である。乗算器205のところで説明したように、PW領域のピッチ変化波形を読み出すことが設定された発音chやAW領域の振幅変化波形を読み出すことが設定された発音chでは、ピッチ変化波形の振幅や振幅変化波形の振幅を制御するためのデータを、振幅変化生成部204で出力するように設定すればよい。
図2に戻って、乗算器207は、発音ch毎に、乗算器205から出力される波形サンプルデータに、クロスフェード制御部206から出力される係数を乗算する。クロスフェード制御部206は、制御レジスタ201によりフェードアウトするchとフェードインするchとクロスフェード開始指示が与えられたとき、それらのchにおいてフェードアウトおよびフェードインの処理を行うための係数を発生する。フェードアウトするchでは、1から0へ時間的に徐々に減少していく係数を発生し、フェードインするchでは、0から1へ時間的に徐々に増加していく係数を発生する。フェードインするchの信号とフェードアウトするchの信号との混合は、後述するミキサ208により行う。最終的に、乗算器207からは、各発音chで生成された楽音信号が、各サンプリング周期毎に64ch時分割で出力され、ミキサ208に入力する。
クロスフェード制御部206やミキサ208によるクロスフェード処理は、要するに、発生する波形データを差し替える場合に利用する機能であるので、楽音波形をクロスフェードして差し替える場合だけでなく、後述するように、ピッチ変化波形や振幅変化波形を差し替える場合にも使用できる。
ミキサ208は、内部に400の時分割的なミキシング用演算ch(MIX#1〜MIX#400)を備える。これらの各ミキシング用演算chは、制御レジスタ201の設定に基づいて、乗算器207から出力される64ch分の信号と、DSP209から出力される複数ch(ここでは32chとする)分の信号とから、指定された任意のchの信号を入力し、指定されたミキシング処理を施す。各ミキシング用演算chのミキシング結果は、制御レジスタ201の設定に基づいて、レート生成部202、振幅変化生成部204、DSP209、および/または、DAC I/O210の指定されたchに出力される。各ミキシング用演算ch毎に、どのchから入力しどのchに出力するかは、制御レジスタ201で設定できる。
64の発音chで生成された楽音信号ないし変化波形であって、乗算器207からミキサ208に時分割で入力する64ch分の信号を、音源入力chTG#1〜TG#64と呼ぶ(矢印231)。DSP209からミキサ208に入力する32ch時分割の信号をDSP入力chDSPi#1〜DSPi#32と呼ぶ(矢印232)。ミキサ208からレート生成部202への出力は、ここでは時分割32chとし、PM#1〜PM#32と呼ぶ(矢印221)。ミキサ208から振幅変化生成部204への出力は、ここでは時分割32chとし、AM#1〜AM#32と呼ぶ(矢印222)。レート生成部202や振幅変化生成部204への出力は、生成する楽音のピッチや振幅に変化を付与するためのものである。ミキサ208からDSP209へは32ch時分割の信号が出力され、それらをDSP出力chDSPo#1〜DSPo#32と呼ぶ(矢印223)。ミキサ208からDAC I/O210へは2chのステレオLRの信号が出力され、それらをDAC#1〜DAC#2と呼ぶ(矢印224)。
DSP209は、DSPi#1〜DSPi#32から入力した信号に対して、CPU101が制御レジスタ201に設定したマイクロプログラムや係数データ等に基づく1ないし複数の信号処理(例えば、楽音信号に対する各種エフェクトの付与処理など)を施し、その結果を、DSPo#1〜DSPo#32に出力する。DSPi#1〜DSPi#32のどのchの信号に、どのような信号処理を施して、DSPo#1〜DSPo#32のどのchに出力するかは、CPU101が設定するマイクロプログラムで任意に制御することができる。ミキサ208からDAC I/O210に出力されたステレオLRの楽音信号は、アナログオーディオ信号に変換されて出力される。
図6は、ミキサ208の詳細なハードウェア構成を示す。入力RAM(IRAM)602は、ミキサ208に入力される音源入力chTG#1〜TG#64およびDSP入力chDSPi#1〜DSPi#32の合計96chの各楽音信号のサンプルデータを記憶するバッファであり、IRAM‐AとIRAM‐Bのダブルバッファ構成からなる。2つのバッファAとBは、それぞれ96ch分のサンプルデータを記憶する容量を持ち、各バッファAおよびBは1サンプリング周期毎に交互に書込モードと読出モードに切り替わる。書込回路601は、ミキサ208に入力される上記各入力chのデータを、IRAM602の2つのバッファA,Bのうち現在書込モードとなっている方のバッファに書き込む制御を行う。IRAM602の各バッファA,Bにおける96のサンプル記憶領域のアドレスは、96の各入力chTG#1〜TG#64およびDSPi#1〜DSPi#32に対応している。
出力RAM(ORAM)605は、ミキサ208の出力chである、レート生成部202への出力chPM#1〜PM#32、振幅変化生成部204への出力chAM#1〜AM#32、DSP出力chDSPo#1〜DSPo#32、およびDAC出力DAC#1,#2の合計98chの各ディジタルオーディオ信号(ミキシング出力であるディジタルサンプルデータ)をバッファ記憶するもので、ORAM‐AおよびORAM‐Bのダブルバッファ構成からなる。ORAM605における2つのバッファAとBは、それぞれ98ch分のサンプルデータを記憶する容量を持ち、各バッファA,Bは1サンプリング周期毎に交互に書込モードと読出モードに切り替わる。これにより、ORAM605は、見かけ上同時に読み出しと書き込みが可能なバッファとなっている。読出回路606は、上記各出力chのデータをORAM605の2つのバッファA,Bのうち現在読出モードとなっている方のバッファから読み出す制御を行う。なお、書込モードとなっている方のバッファでは、同じ出力chへの累算のために読み出しと書き込みが時分割処理される。ORAM605の各バッファA,Bにおける98個のサンプル記憶領域のアドレスは、98の各出力chPM#1〜PM#32、AM#1〜AM#32、DSPo#1〜DSPo#32、およびDAC#1,#2に対応している。
IRAM602とORAM605との間に設けられた乗算回路603および加算回路604がミキシング用演算ch(MIXch)の実体部分を構成する。すなわち、乗算回路603と加算回路604を時分割使用することで、各MIXchにおける係数乗算および加算などのミキシング演算が行われる。上述したように、時分割的なMIXchは400ch(MIX#1〜MIX#400)設けられている。1つのMIXchにおいて、IRAM602のどこからサンプルデータを読み出し、ミキシング結果をORAM605のどの領域(出力ch)のデータに足し込む(分配する)かは、MIXch毎に制御レジスタ201で指定することができる。図6の制御レジスタ201中に図示したSRCchと乗算係数とDESTchは、MIXch毎に設けられているレジスタである。各MIXchにおいて、SRCchは、TG#1〜TG#64およびDSPi#1〜DSPi#32の96chのどのchから入力するかを示すソースchデータであり、乗算係数は、その入力データに乗算する係数データであり、DESTchは、PM#1〜PM#32、AM#1〜AM#32、DSPo#1〜DSPo#32、およびDAC#1,#2の98chのどのchへ出力するかを示すデスティネーションchデータである。なお、各MIXchでは、入力した信号をステレオ・パン制御して、DESTchで指定されたchとその次のchにステレオLRの信号を出力する機能を備えている。
加算回路604は、同じ出力chに分配された信号を加算(ミキシング)するためのものである。例えば、あるMIXchの演算タイミングで、その演算結果をDSPo#1に分配する場合、その演算タイミングの前半において、ORAM605の現在読出モードとなっているバッファから該DSPo#1のデータを読み出して加算回路604に供給し、乗算回路603から与えられる該MIXchの演算結果と加算する。この加算結果は、その演算タイミングの後半において、ORAM605の現在書込モードとなっているバッファの該DSPo#1の位置に書き込まれる。これにより、1サンプリング周期の間において、同一の出力chに分配された信号が加算(ミキシング)される。ORAM605の現在書込モードとなっているバッファは、次の1サンプリング周期において読出モードに切り替わる。読出モードにおける各出力chのデータの読み出しが終わると、所定のタイミングで当該バッファのデータがクリアされ、次に書込モードに切り替わったとき、次の新たな1サンプルについてのミキシング累算が可能となるようになっている。
なお、IRAM602における書き込みタイミングは、入力chTG#1〜TG#64およびDSPi#1〜DSPi#32の時分割タイミングに同期して適当なタイミングに設定される。IRAM602における読み出しタイミングは、MIXchの時分割タイミングに同期して適当なタイミングに設定される。ORAM605における書き込みタイミングは、MIXchの時分割タイミングに同期して適当なタイミングに設定される。ORAM605における読み出しタイミングは、出力chPM#1〜PM#32、AM#1〜AM#32、DSPo#1〜DSPo#32、およびDAC#1,#2の時分割タイミングに同期して適当なタイミングに設定される。
図7は、ミキサ208によるミキシングの設定例を示す。入力chのブロックは、図6のミキサ208のIRAM602に入力データがバッファされる各入力chTG#1〜TG#64およびDSPi#1〜DSPi#32を模擬的に示している。MIXchのブロックは、400chある各ミキシング用演算chを、MIX#1〜MIX#400で模擬的に示している。出力chのブロックは、ORAM605にミキシング出力データがバッファされる各出力chPM#1〜PM#32、AM#1〜AM#32、DSPo#1〜DSPo#32、およびDAC#1,#2を模擬的に示している。
上述したように各MIXchでは、どの入力chからサンプルデータを入力して、ミキシング結果をどの出力chのデータに足し込む(分配する)かを指定することができる。各chを結ぶ実線は、それらの割当の設定を示している。例えば、TG#1の入力は、MIX#1およびMIX#4に入力されて、ミキシングされ、MIX#1の出力は、DSP#3に出力されている。MIX#4の出力は、DAC#1および#2に出力されている。
特に、TG#3はピッチ変化波形データを読み出すために割り当てられており、該TG#3で読み出されたピッチ変化波形データが、MIX#3経由でPM#1に出力されるように割り当てられている。PM#1に出力されたデータは、図2のルート221によりレート生成部202に入力する。図4のレート生成部202で説明したように、制御レジスタ201で、各発音chにおいてミキサ出力ch403として使用するchをPM#1〜PM#32から選択指定できるので、例えばTG#1の楽音発生処理で上記PM#1をミキサ出力ch403として使用することが設定されていたとすると、該TG#1で発生する楽音にPM#1のピッチ変化波形データに基づくピッチ変化が付与されることになる。
同様に、TG#5は振幅変化波形データを読み出すために割り当てられており、該TG#5で読み出された振幅変化波形データが、MIX#6経由でAM#1に出力されるように割り当てられている。AM#1に出力されたデータは、図2のルート222により振幅変化生成部204に入力する。図5の振幅変化生成部204で説明したように、制御レジスタ201で、各発音chにおいてミキサ出力ch503として使用するchをAM#1〜AM#32から選択指定できるので、例えばTG#1の楽音発生処理で上記AM#1をミキサ出力ch503として使用することが設定されていたとすると、該TG#1で発生する楽音にAM#1の振幅変化波形データに基づく振幅変化が付与されることになる。
図8は、ミキサ208における入力側の書込回路601による書込処理タイミングと、ミキシング処理部によるミキシング処理タイミングと、出力側の読出回路606による読出処理タイミングとの大まかな関係を示すタイミングチャートである。図8(a)に示す1サンプリング周期は、図1および図2の音源回路108で処理される楽音波形データの1サンプリング周期に相当する。1サンプリング周期の間で、DSP209における全処理ステップ(例えば1024ステップ)が一巡し、また、音源回路108における時分割処理サイクルが一巡する。ミキサ208における処理クロックは、DSP209におけるステップクロックと同様であるものとし、例えば、1024ステップの時分割動作が可能である。
図8(b)は、書込回路601によるIRAM602への書込処理が行われるタイミングを示す。1サンプリング周期の間で、全96の入力chの書き込みが行われる。IRAM602のバッファAとBとは読み出しと書き込みが交互に切り替わるので、例えば、「書込処理1」と記載された1サンプリング周期の間でIRAM602のバッファAに対して書込が行われ、「書込処理2」と記載された1サンプリング周期の間でIRAM602のバッファBに対して書込が行われ、「書込処理3」と記載された1サンプリング周期の間でIRAM602のバッファAに対して書込が行われ、…というようにして順次バッファAあるいはBに書込が行われる。1サンプリング周期の間での全96の各入力chTG#1〜TG#64およびDSPi#1〜DSPi#32の時分割的書込タイミングについては、説明を省略するが、基本的に1サンプリング周期を構成する1024ステップのうちの所定のタイムスロットに各入力chの書込タイミングが割り当てられているものとする。
上記のように書込回路601によりIRAM602の一方のバッファへ書き込まれたデータは、次の1サンプリング周期において読出モードに切り替えられ、時分割的なMIXchのタイミングに従い、制御レジスタ201のソースchデータSRCchで指示される入力chのサンプルデータが読み出されてミキシング処理される。図8(c)は、IRAM602のバッファから読み出したサンプルデータに対してミキシング演算処理を行うタイミングを示す。1サンプリング周期の間で、96の入力chの各1サンプルデータを64の出力chの何れか1つまたは複数のデータに足し込む(分配する)ミキシング演算処理を行う。なお、96の入力ch全部を必ずしも何れかの出力chに分配する必要はなく、96の入力chの中に使用されていないchがある場合、その入力chについては何れの出力chにも分配されないようにしてよい。図8(c)の「ミキシング処理」と記載された1サンプリング周期の間では、「書込処理1」のときにIRAM602のバッファAに書き込まれたデータが読み出され、この読み出されたデータに対するミキシング演算処理が行われる。各MIXchMIX#1〜MIX#400の処理タイミングについては説明を省略するが、基本的に、1サンプリング周期=1024ステップ中の所定のタイムスロットを各chMIX#1〜MIX#400に割り当てておき、それらのタイムスロットで各MIXchのミキシング処理を行うものとする。
図8(d)は、ORAM605のバッファからの読出処理を行うタイミングを示す。例えば、図8(c)の「ミキシング処理」のときに書込モードになっていたORAM605のバッファがAであるとすると、このバッファAは次の1サンプリング周期においては読出モードに切り替わる。(d)の例において、「読出処理」と記載された1サンプリング周期の間では、「ミキシング処理」のときにミキシング演算処理されてORAM605のバッファAに書き込まれたデータが、読出回路606の制御によって、読み出される。1サンプリング周期の間で全98の各出力chPM#1〜PM#32、AM#1〜AM#32、DSPo#1〜DSPo#32、およびDAC#1,#2のデータをORAM605から時分割的に読み出すタイミングについては説明を省略するが、1サンプリング周期=1024ステップ中の所定のタイムスロットを割り当てて読み出しを行うようにしている。
図8の801は、変調波形を発生する変調ch生成処理の実行タイミングを示している。変調chとは、上述したピッチ変化波形や振幅変化波形の発生のために割り当てられたchをいう。変調chにより発生されたピッチ変化波形や振幅変化波形をまとめて変調波形と呼ぶ。上述したように、32音モードのときは、32ch分の発音chを任意に割り当ててピッチ変化波形や振幅変化波形を読み出すことができ、図8(b)の書込処理でIRAM602に書き込むことができる。書き込んだピッチ変化波形や振幅変化波形のデータは、図8(c)のミキシング処理を経て、図8(d)の読出処理でPM#1〜PM#32、AM#1〜AM#32から読み出すことができる。PM#1〜PM#32、AM#1〜AM#32のデータに基づいて、生成している楽音波形にピッチ変化や振幅変化が付与される。802は、読み出したピッチ変化波形データあるいは振幅変化波形データに基づいて楽音波形にピッチ変化や振幅変化を付与する被変調ch生成処理を示す。
図9は、ノートオン処理のフローチャートを示す。CPU101は、新たな楽音の発音開始を指示するコマンドであるノートオンの発生を検出すると、ステップ901で、そのノートオンのパート番号PTに、ノート番号をNNに、ベロシティをVELに、それぞれ設定する。ステップ902では、パートPTの音色データを確認する。ステップ903では、その音色がピッチ変調や振幅変調を行うよう設定された音色かを判定する。
ピッチ変調および振幅変調の何れをも行わない場合はステップ911へ、ピッチ変調のみを行う場合はステップ921へ、振幅変調のみを行う場合はステップ931へ、ピッチ変調と振幅変調の両方を行う場合はステップ941へ、それぞれ進む。説明の便宜のため、ステップ941〜945の処理を先に説明する。ステップ941では、発音chをTG#1〜TG#64から3ch確保し、楽音波形の読み出し用に割り当てたch番号をAtに、ピッチ変化波形の読み出し用に割り当てたch番号をApに、振幅変化波形の読み出し用に割り当てたch番号をAaに、それぞれセットする。なお、それらの各波形を読み出すために割り当てられた発音chは、単にAt,Ap,Aaの記号で呼ぶものとする。次に、ステップ942では、MIXchの割り当てを行う。まず、ユーザの指定に応じて、Atで生成した楽音波形をDSP209やDAC210に出力するためのMIXchを割り当てる。また、Apで読み出したピッチ変化波形をPM#1〜PM#32の何れかに出力するためのMIXchと、Aaで読み出した振幅変化波形をAM#1〜AM#32の何れかに出力するためのMIXchを割り当てる。なお、同時に、PM#1〜PM#32のうち使用するch(PM#nとする)と、AM#1〜AM#32のうち使用するch(AM#mとする)も割り当てるものとする。
次に、ステップ943で、割り当てた発音chの設定を行う。まずステップ961では、Apにピッチ変化波形生成のための各種パラメータを設定する。これは、Apに対応する制御レジスタ201に、ピッチ変化波形データを読み出すためのパラメータとして、当該音色で使用するピッチ変化波形データのうちの、当該パートPTの現時点のビブラート深さVDに応じたピッチ波形データを特定するデータ、ビブラート速さに応じたピッチデータ(図4のピッチレジスタ401に設定する値であり、この場合は時間軸を制御する)などを設定するものである。ここでは、読み出すピッチ変化波形データによるピッチ変調の深さを調整するため、Apの図5の振幅レジスタ501には、前記ビブラート深さVDに応じた音量データが設定される。この実施形態では、ビブラート深さに応じて異なるピッチ波形データを読み出すようになっているが、さらに、ビブラート速さに応じて異なるピッチ波形データを読み出すようにしてもよい。
ステップ962では、Aaに振幅変調波形生成のための各種パラメータを設定する。これは、Aaに対応する制御レジスタ201に、振幅変化波形データを読み出すためのパラメータとして、当該音色で使用する振幅波形データを特定するデータ、時間軸方向の伸縮を規定するピッチデータ(図4のピッチレジスタ401に設定する値)などを設定するものである。ここでは、読み出す振幅波形データによる振幅変調の深さを調整するため、Apの図5の振幅レジスタ501には、ベロシティVELに応じた音量データが設定される。さらに、該ベロシティVELや当該パートPTの音量等に応じて異なる振幅変化波形データを読み出すようにしてもよい。
ステップ963では、Atに楽音波形(被変調波形)生成のための各種パラメータを設定する。これは、Atに対応する制御レジスタ201に、図2、図4、および図5で説明した楽音波形データを読み出すためのパラメータを設定する処理であり、当該音色の楽音波形データのうち、ノート番号NNやベロシティVELに応じた楽音波形データを特定するデータ、ノート番号NNとその特定された楽音波形データとの音高差を示すピッチデータなどを設定する。特に、図4のミキサ出力ch403からの入力として、上記PM#nからのデータが入力するように設定する。また、図5のミキサ出力ch504に、上記AM#mからのデータが入力するように設定する。この場合は、楽音信号のピッチや振幅の変化は、ピッチ変化波形データ、振幅変化波形データにより付与されるので、さらに変化をつける必要がなければ、ピッチEGレジスタ402や振幅EGレジスタ502にはそれぞれ変化波形データが一定値となるようなピッチEGデータや振幅EGデータを設定してもよい。なお、Ap、Aa、Atの3つの発音chは、それぞれ、この後の発音開始指示に応じて直ちに波形が出力されるように、クロスフェード係数が1に設定される。
次に、ステップ944で、割り当てた各MIXchの設定を行う。これは、ユーザの指定に応じて、Atで生成した楽音波形をDSP209やDAC210に出力するためのMIXchのSRCchと乗算係数とDESTchの設定を行うとともに、Apで発生したピッチ変化波形を上記PM#nに出力するMIXchの設定と、Aaで発生した振幅変化波形を上記AM#mに出力するMIXchの設定を行うものである。
次に、ステップ945で、Ap,Aa,Atの同時発音開始指示を行う。これにより、上述したピッチ変化波形によるピッチ変化と振幅変化波形による振幅変化が付与されて楽音生成が実行される。
次に、ステップ950で、パートPTのノート番号NNに対応付けて、オンフラグ「1」、割り当てたAt,Ap,Aaの発音ch、およびMIXchの情報を記憶し、終了する。なお、ここで記録された情報は、発音開始後の発音chの制御や、発音終了後の発音chの開放などに用いられる。
ステップ911〜915は、ピッチ変調および振幅変調の何れをも行わない場合であるので、上述したステップ941〜945の処理からApとAaに係る処理を除いて、楽音生成のためのAtの処理のみ行うようにすればよい。ただし、この場合は、ピッチEG405や振幅EG505に時間変化するピッチ変化波形データや振幅変化波形データを発生させるようなピッチEGデータや振幅EGデータを設定しなければならない。ステップ921〜925は、ピッチ変調のみを行う場合であるので、上述したステップ941〜945の処理からAaに係る処理を除いて、楽音生成のためのAtの処理とピッチ変調のためのApの処理のみ行うようにすればよい。この場合は、振幅EG505に時間変化する振幅変化波形データを発生させるような振幅EGデータを設定しなければならない。ステップ931〜935は、振幅変調のみを行う場合であるので、上述したステップ941〜945の処理からApに係る処理を除いて、楽音生成のためのAtの処理と振幅変調のためのAaの処理のみ行うようにすればよい。この場合は、ピッチEG405に時間変化するピッチ変化波形データを発生させるようなピッチEGデータを設定しなければならない。この実施形態では、ノートオンが発生してから、MIXch、PM#n、AM#mを割り当てるようになっていたが、楽音信号を生成する発音chであるAtに対し、ノートオンの発生より前に、必要なMIXch、PM#n、AM#mを予め割り当てておくようにしてもよい。
図10(a)は、楽音の発生中に、パートPTのビブラート深さを値VDに変化させるコマンドが発生したときの処理である。楽音にビブラートを付与する場合、図4のピッチEGレジスタ402に所定のパラメータを設定して直線的に変化するピッチEGでビブラートを付与することができる。しかし、さらにリアルなビブラートを実現するためには、ビブラート付きで演奏された楽器音から抽出されたピッチ変化波形を読み出して、そのピッチ変化波形によりピッチ変化を楽音に付与する必要がある。
ステップ1001で、記録された情報に基づいて、ビブラート量の変更が指示されたパートPTと同じパートの、何れかのノート番号NNの楽音波形が、音源の発音chで発音されていないかを検出する。何れのノート番号NNでも発音されていなければ、ステップ1002で処理を終了する。その発音があった場合は、ステップ1003で、その発音でピッチ変化波形の読出しに使っているApがあるか判定する。なければ、ビブラートを図4のピッチEG405を用いて付与していると言うことであるから、ステップ1004で、図4のピッチEGレジスタ402に、指定されたビブラート深さVDに応じたビブラート振幅を設定し、折れ線的なピッチEG405でその振幅のビブラート波形を発生させる。Apがあれば、ステップ1005で、ピッチ変化波形データの切り替えが必要なビブラート深さか否かを判定する。これは、例えば、浅いビブラートを付ける場合、中くらいのビブラートを付ける場合、深いビブラートを付ける場合で、異なるピッチ変化波形データを使用するため、ビブラート量が変更されたときに、使用するピッチ変化波形の切り替えを行う必要があるか判定する処理である。切り替えを行う必要がなければ、Apの振幅レジスタ501の音量データをビブラート深さVDに応じた値に変更し、Apで発生しているピッチ変化波形の振幅を制御することにより、指定されたビブラート量の変更を実行する。ステップ1005で、ビブラート深さVDに応じて別のピッチ変化波形への切り替えが必要になった場合は、ステップ1007に進む。
ステップ1007では、新たにピッチ変化波形を読み出すための発音chを割り当て、それを新Apとする。ステップ1008では、その新Apで読み出したピッチ変化波形データを出力するためのMIXchを割り当て、その出力先として、旧Apと同じPM#nを設定する。これにより、旧Ap で読み出されるピッチ変化波形データと、新Apで読み出されるピッチ変化波形データとは、PM#nで混合されることになる。ステップ1009で、新Apの発音chの設定を行う。ここでの設定は、基本的にはステップ961で行われた旧Apの設定と同様であるが、新Apで読み出されるピッチ変化波形データは現時点のビブラート深さVDに応じた別のピッチ変化波形データであり、また、クロスフェード係数は0に設定される。続いて、ステップ1010で発音開始を指示することにより、新Apでのピッチ変化波形データの読み出しが開始される。次に、ステップ1011で、旧Apから新Apへのクロスフェードの開始を指示する。これにより、旧Apで読み出されたピッチ変化波形データがフェードアウトを開始し、新Apで読み出されたピッチ変化波形データがフェードインを開始する。Atで読み出されている楽音波形は、旧Apのピッチ変化波形データと新Apのピッチ変化波形データの混合波形によってピッチに変化が付与される。ステップ1012で、フェードアウトされる旧Apの発音chとMIXchとを記録し、ステップ1013で、パートPTのノート番号NNに対応付けて、新Apの発音chとMIXchを記憶し、ステップ1001に戻る。
図10(b)は、クロスフェードの終了割り込み処理の流れを示す。クロスフェードが終了したとき、割り込みが掛かり、ステップ1021で、フェードアウトした旧Apの発音chとMIXchとを開放し、フェードアウト中として記憶されていた発音chとMIXchの情報は消去される。なお、上記ステップ1007〜1013の付番1040の処理は、Apでのクロスフェードの処理であるが、AaやAtでのクロスフェードも同様の処理である。その場合は、ステップ1021では、フェードアウトした旧Aaや旧Atを開放する処理となる。
図10(c)は、ノートオフの流れを示すフローである。ステップ1031で、ノートオフが指示されたパート番号をPTに、ノート番号をNNに、セットする。ステップ1032で、NNの発音があるか調べ、なければ終了する。あれば、ステップ1034で、Atに減衰の開始を指示する。ステップ1035で、Apがあるか判別し、あれば、ステップ1036で、リリース用Apを割り当て、設定し、記憶する処理(付番1040の処理)を行う。これはリリースの際には、リリース用のピッチ変化波形に切り替えてピッチ変化を付与する必要があるので、クロスフェードで旧Apから新Apに切り替えるものである。Aaについても同様に、ステップ1037で、旧Aaがあるか判別し、あれば、ステップ1038で、リリース用Aaの割り当てと設定と記憶の処理(付番1040と同様の処理)を行う。なお、ステップ1034での減衰開始の指示に応じて、Atの振幅EG502は音量が徐々に減衰する振幅変化波形データを発生し、その振幅変化波形データで振幅が制御されているAtの楽音信号が減衰する。楽音信号の振幅が所定レベル以下に減衰したら、3つの発音ch、At、Ap、Aaと、使用されているMIXch、PM#n、AM#m等が開放され、当該パートPTのノート番号NNに対応付けられている情報も消去される。
なお、上記実施形態では、発音指示に応じて、変調波形(ピッチ変化波形と振幅変化波形)と被変調波形(楽音波形)とを同時に発音開始するようになっていたが、必ずしも同時に発音開始しなくてもよい。何れか一方を他方より遅らせて発音開始させてもよい。あるいは、相互に独立したタイミングで発音開始させてもよい。
また、上記実施形態では、64chある発音chに対してピッチ変化波形や振幅変化波形を読み出すための発音chを任意に割り当てるようにしたが、固定的に割り当てるようにしてもよい。
なお、この実施形態では、発音できる楽音信号のch数は、音源の発音ch数から変調用に用いる発音ch数を差し引いたものとして動的に決まるようになっていたが、発音モードとして静的に設定するようにしてもよい。例えば、変調用に全く発音chを使用しない64音モード、楽音生成用の各発音chに1つの発音chで生成した変化波形でピッチないし振幅の変調をかける32音モード、同2つの発音chで生成した変化波形でピッチおよび振幅の変調をかける20音モード等である。さらに、発音モードを設定する場合は、各発音chが楽音生成用か変調用かを予め決めてしまうことができ、発音割当の処理をより軽くすることができる。
また、この実施形態では、ノートオンの発生時に、ピッチ変調用、振幅変調用、楽音生成用の各発音chを個別に割り当てるようになっていたが、変調用と楽音生成用の発音chを予め組にしておき、複数の組のなかから1つの組を割り当てるようにしてもよい。