以下、図面を用いて本発明の実施の形態を説明する。
図1は、本発明の実施の形態に係る楽音生成装置の全体構成を示す。この楽音生成装置は、汎用のPC(パーソナルコンピュータ)にサウンドボードを実装して構成してもよいし、汎用のPCではなく電子楽器などの楽音信号生成を行う専用の装置として構成してもよい。
図1において、CPU101は、装置全体の動作を制御する処理装置である。ランダムアクセスメモリ(RAM)102は、CPU101が実行するプログラムのロード領域やワーク領域に使用する揮発性メモリである。NOR型フラッシュメモリ103は、イニシャルプログラムローダなどのプログラムや音色データなどの各種のデータを格納した書き替え可能な不揮発性メモリである。操作子104は、本システムを汎用PCで構成する場合はキーボードやマウスなどであり、電子楽器などとして構成する場合は外部パネル上に設けられた各種のスイッチなどの操作子である。表示器105は、各種の情報を表示するためのディスプレイである。MIDI I/O106は、各種のMIDI機器と接続しMIDI信号を入出力するインターフェースである。
NAND型フラッシュメモリ107は、複数の波形データを格納した書き替え可能な不揮発性メモリであり、ページ単位(ここでは、1ページ=2048バイト)でデータが読み書きされる。ページ単位のデータ読出しは、バースト転送で高速に行うことができる。NAND型フラッシュメモリ107のメモリマップは、図2で詳しく説明する。DP RAM109は、NAND型フラッシュメモリ107から波形メモリ111への波形データ転送用のバッファメモリであり、同時読み書きが可能なデュアルポート(2−port)の半導体メモリにより構成されている。その容量は、1ページ(2048バイト)+エラー訂正コード分である。DP RAM109は、スタティックRAM(SRAM)で構成されている。波形メモリ111は、各波形データの先頭ページ(クラスタ)のデータを予め記憶しておくプリロード領域と、各発音チャンネル(ch)毎の2ページ分のバッファ領域とを有する。波形メモリ111は、シンクロナスダイナミックRAM(SDRAM)で構成されている。波形メモリ111のメモリマップは、図3で詳しく説明する。なお、DP RAM109と波形メモリ111とは、ランダムアクセス(個別にアドレスを指定して行う読み出しまたは書き込み)を、フラッシュメモリ107に比較して、極めて高速に行うことができる。さらに、連続したアドレスへのアクセスは、バーストモードを用いて高速化することができる。
F→DP転送部108は、NAND型フラッシュメモリ107からDP RAM109に波形データをページ単位で転送する処理を行う。DP→M転送部110は、DP RAM109から波形メモリ111に波形データを(1ページ分のデータを所定回数に分けて)転送する処理を行う。これらの転送部108,110は、転送制御部112による制御の元で動作する。転送の動作のタイミングについては、図4などで詳しく説明する。転送制御部112は、フラッシュメモリ107からDP RAM109への転送とDP RAM109から波形メモリ111への転送とを制御する。複数の転送要求が生じた場合は、(1度に1ページしか転送できないので)先着順に1ページずつ転送するよう制御する。なお、現在入手できるNAND型フラッシュメモリのデータ幅は8ビットに限定される。そのため、F→DP転送部108は、NAND型フラッシュメモリの連続する2アドレスから読み出した2データをつなげて16ビットのデータに変換し、データ幅が16ビットであるDP RAM109に書き込む。また、波形メモリ111のデータ幅も16ビットであり、各アドレスに16ビットのデータが記憶される。従って、DP→M転送部110は、上記F→DP転送部108で行っているような変換を行わなくてよい。
音源113は、複数の発音ch(ここでは128chとする)を備えており、各発音ch毎に読出しアドレスを生成して波形メモリ111から波形データ(波形サンプルデータ)を読出し、読出された波形データに対してエンベロープ付与を行い、各発音ch毎の楽音信号を生成する。さらに、音源113は、生成された複数chの楽音信号を混合し、混合された楽音信号に対してリバーブなどの効果を付与する。音源113から出力された楽音信号は、DAC(ディジタルアナログ変換器)114によりアナログ音響信号に変換され、サウンドシステム115により放音される。
図2は、NAND型フラッシュメモリ107のメモリマップを示す。NAND型フラッシュメモリは、マスクROMよりもコストが安く、ページの頭出し(ここで言う「頭出し」とは、フラッシュメモリにリードコマンドとリードアドレスが与えられてからデータ読出しが開始されるまでの時間区間あるいはそこで行われる処理を指すものとする)に時間が掛かるが、読出しが始まった後のデータ転送速度は速い(バースト転送)という特徴を有する。NAND型フラッシュメモリ107には、予め複数の波形データWave1,Wave2,…を格納しておく。1つの波形データ、例えばWave2は、アドレスが連続した複数のページW2(0),W2(1),…に記憶する。なお、各波形データWave*(*は1,2,…)の連続する複数のページあるいはそのページに記憶された波形サンプルデータは、W*(0),W*(1),…と表記するものとする。上述したとおり、1ページは2048バイト(1024ワード=1024サンプル)である。1つの波形が連続した複数のページに記憶されているので、どのページを読出すかページ毎に指示しなくてもよく、ch毎にページの指示は1回で済む。なお、各波形データWave1,Wave2,…のそれぞれの先頭ページ(W*(0))だけを、別の箇所にまとめて記憶するようにしてもよい。その場合でも、第2ページ(W*(1))以降は、それぞれ連続して記憶されていなければならない。図中、WAは、波形データの第2ページW*(1)のアドレスを設定する制御レジスタの1つである(後に詳しく説明する)。また、NAND型フラッシュメモリ107は、8ビット幅でデータを読み書きするものとする。
図3は、波形メモリ111のメモリマップを示す。波形メモリ111には、プリロード領域301とバッファ領域302が設けられている。プリロード領域301は、図2に示したNAND型フラッシュメモリ107に記憶されている波形データWave1,2,…の数分の各先頭ページW1(0),W2(0),W3(0),…を記憶する領域である。プリロード領域301への各先頭ページの記憶は、システム立ち上げ時に行われる。バッファ領域302には、発音ch数×2のバッファ、すなわち各発音ch毎の2つのバッファ(1つのバッファの大きさは1ページ=2048バイトである)が設けられている。発音chi(iは1,2,…,128)に対応する領域をBia,Bibで表す。Bia,Bibは、波形メモリ111のアドレス空間内に連続して配置される。
PAは、音源113が波形メモリ111から波形サンプルを読出す際、最初に読出すべきプリロード領域301中の先頭ページの読出しアドレスを設定する制御レジスタの1つである。この図では第2chで波形データWave3の再生が指定されたケースを示しており、PAでその先頭ページW3(0)が指定されている。矢印311は、音源が当該先頭ページの波形サンプルを読出す際の読出しアドレス(ピッチカウンタ)の進行方向を示す。BAは、前記プリロード領域301の先頭ページを読み終えた後、バッファ領域302中のどのバッファから波形サンプルを読出すかを示す読出しアドレスを設定する制御レジスタの1つである。この図では第2chでの再生が指定されているので、ページW3(0)を読み終えた時点の初期値として、BAには、第2chが使用するバッファB2a,B2bの先頭アドレスが設定される。矢印312は、読出しアドレス(ピッチカウンタ)の進行方向を示す。矢印312のようにバッファB2aとB2bを読出した後、引き続きバッファの先頭に戻って矢印313,314のように読出しを続ける。このような波形メモリの読出しを行うためには、プリロード領域W3(0)の読出しを行っている間に、次に読出すべき波形サンプルデータをバッファB2aに格納し、さらにバッファB2aを読出している間にバッファB2bに波形サンプルデータを格納し、次にバッファB2bを読出している間にバッファB2aに波形サンプルデータを格納し、…というようにバッファB2aとB2bとを交互に使用して再生を続ける。なお、各chのバッファ数は3以上であってもよい。また、波形メモリ111は、16ビット幅でデータを読み書きするものとする。
図4(a)は、転送制御部112の制御の元で転送部108,110が実行する波形データの転送のタイミングを説明するためのタイムチャートである。矢印tの向きに時間が進むものとする。複数の縦線401はサンプリングクロックの発生タイミングを示し、隣り合う縦線401の間の区間が1サンプリング周期(以下、1DACという)を示している。本実施形態では、1DACは22.67n秒である。「NAND型フラッシュ→DPメモリ」と記載したタイムチャートは、F→DP転送部108によりNAND型フラッシュメモリ107からDP RAM110に、1ページ分の波形サンプルとエラー訂正コードを転送する処理のタイムチャートである。「DPメモリ→波形メモリ」と記載したタイムチャートは、DP→M転送部110によりDP RAM110から波形メモリ111のバッファ領域(その中の指定したchに対応するバッファ)に、1ページ分の波形サンプルを転送する処理、および、音源113が波形メモリ111から波形サンプルを読出す処理のタイムチャートである。
411は、NAND型フラッシュメモリ107の頭出しを行っている期間を示す。頭出し411の後、412に示すように、1ページ分のデータ2048バイトがページ読出し(バースト転送)される。413はエラー訂正コードの読出し期間を示す。本実施形態では、411〜413に示すように、4DACでNAND型フラッシュメモリ107から1ページのデータおよびエラー訂正コードを読出してDP RAM107に書込むことができる。この4DACという転送時間は、NAND型フラッシュメモリ107のページ読出し(バースト転送)に関する仕様に基づいて決まるものである。
421は、音源113が楽音生成のために波形メモリ111から128ch分の波形サンプルを読出す期間である。422は、DP RAM107上の1ページ分の波形サンプルを波形メモリ111の対応するchのバッファに転送する期間を示す。この転送は、DRAM間のデータ転送であり、バーストモードによる高速なデータ転送を行うものとする。423は、波形メモリ111のリフレッシュを行う期間である。リフレッシュ423の区間の時間長さは、波形メモリ111の仕様により決まる。1DACからリフレッシュ423の区間を除いた区間を、波形サンプル読出し区間421とバースト転送区間422とで分けあう。
波形サンプル読出し区間421の時間長さは、本装置で何chの楽音生成を行うか、および、各chで何点補間を行うかという要求仕様、並びに、音源113が時分割で各chの波形サンプルを波形メモリ111から読出すときにどれ程の時間分解能で1DAC中に何サンプル読出し可能かという仕様に基づいて、設計者が決める。バースト転送422の区間の時間長さは、この区間で何サンプルの転送を行う必要があるかという要求仕様、および、DP RAM107から波形メモリ111へのバースト転送に関する速度の仕様に基づいて、設計者が決める。ただし、DP RAM107は読出しと書込みが同時に実行可能なメモリで、その大きさは1ページ+エラー訂正コード分であるから、フラッシュメモリ107からDP RAM107へ読出した1ページデータは、フラッシュメモリ107からDP RAM107へのページ読出しにかかるDAC数と同じDAC数で、DP RAM107から波形メモリ111に転送する必要がある。従って、1回のバースト転送422の区間では、1ページデータのサンプル数を前記DAC数で割ったサンプル数(小数点以下切上げ)の転送を行う必要がある。本実施形態では、フラッシュメモリ107の1ページ分のデータ2048バイト=1024サンプルをDP RAM107に読出すのに4DACかかるので、DP RAM107に読出された1ページ分のデータを波形メモリ111に転送するのも4DACに分けて行う。従って、1回のバースト転送区間422では、1ページ分のデータ2048バイト=1024サンプルの4分の1に当たる256サンプルを転送する。
本実施形態では、各chは2点補間を行い、全部で128chの楽音生成を行うことを前提とし、その処理を可能にするために必要な波形サンプル読出し区間421の時間長さが確保されているものとする。また、1DACから波形サンプル読出し区間421とリフレッシュ423を除いた区間422で、256サンプル=512バイトのバースト転送が可能なハードウェアを用いているものとする。なお、4DACで1ページデータをDP RAM107から波形メモリ111へ転送し終えた後、区間425で、DP RAM107内のエラー訂正コードに基づいて、それまでに波形メモリ111のバッファ領域に転送した1ページ分の波形サンプル2048バイトのエラー訂正を行う。NAND型フラッシュメモリでは、このようなエラー訂正が必須である。
なお、DPメモリ→波形メモリのバースト転送は、NAND型フラッシュ→DPメモリの転送が開始されたタイミングから2DAC遅れたDAC周期から開始する。これは、付番412に示した2048バイト=1024サンプルの1ページデータを付番422に示したバースト転送で256サンプルずつ4回に分けて転送することが可能となるように(要するに4回のバースト転送のそれぞれについて、そのバースト転送が開始するまでに、そのバースト転送で転送する256サンプルのデータがNAND型フラッシュメモリ107からDP RAM109に転送し終えているように)、2DAC遅れさせているものである。(従って、DP RAM109は、2−portでなくとも良く、例えば図1の121,122に示すような2個のRAMでも良いが、ここでは書込みと読出しを安全に行うために2−portのRAMを用いた。)
図5は、音源部113と転送制御部112に関する詳細図である。音源部113は、制御レジスタ(音源レジスタ)501を備える。制御レジスタ501は、各ch毎のパラメータおよびノートオンNONを記憶するレジスタである。CPU101は、例えばMIDI I/O106経由で楽音発生指示を受けたとき、楽音生成するchを割り当て、そのchに対応する制御レジスタに、その演奏情報に基づくパラメータを設定してノートオンを書込む。これにより、音源113は、そのchでの楽音生成処理を開始する。各レジスタの詳細を以下に示す。
(1)WA:図2で説明したNAND型フラッシュメモリ107中の当該chで読出す波形データWave*の第2ページW*(1)のアドレスをセットする。
(2)PA:図3で説明した波形メモリ111のプリロード領域301中の当該chで読出す波形データWave*の先頭ページW*(0)のアドレスをセットする。システム立上げ時に、NAND型フラッシュメモリ107の全波形データWave1,2,…の先頭ページW1(0),W2(0),…が、プリロード領域301に既に格納されている。
(3)BA:図3で説明した波形メモリ111のバッファ領域302中の当該chに対応する1組のダブルバッファBna,Bnbのアドレスをセットする。
(4)F:Fナンバをセットする。Fナンバは、読み出される波形データのピッチをシフトするパラメータであり、その値は発生させたい楽音のピッチ(音高)に応じて決定される。すなわち、Fナンバの値は、波形データのピッチからシフトしなくてよい場合は「1」とされ、ピッチアップしたいときは「1」より大きな値とされ、ピッチダウンしたいときは「1」より小さな値とされる。
(5)IL,HT,1DR,1DL,2DR,2DL,RR:楽音のエンベロープを制御するためのパラメータをセットするレジスタである。ILはイニシャルレベル、HTはホールドタイムを示す。これらは、楽音発生開始からホールドタイムHTの時間区間は、エンベロープ波形として、イニシャルレベルILを固定的に出し続けることを指示するパラメータである。NAND型フラッシュメモリ107に用意してある波形データは、何れも、その立ち上がり部分については元のサンプリング波形における音量変化をそのまま利用する方がリアルな楽音が得られるような波形データとしてある。そこで、その立ち上がり部分のホールドタイムHTだけの時間区間ではイニシャルレベルILをエンベロープ波形としている。1DRは1stディケイレート、1DLは1stディケイレベルである。ホールドタイムHTの後、1stディケイレート1DRの変化率で目標値1stディケイレベル1DLに至るエンベロープ波形を出力するためのパラメータである。2ndディケイレート2DRと2ndディケイレベル2DLも同様であり、1stディケイの後、2ndディケイレート2DRの変化率で目標値2ndディケイレベル2DLに至るエンベロープ波形を出力するためのパラメータである。2ndディケイの後、ノートオフが来たら、リリースレートRRの変化率で徐々に音量レベルを減少させていく。音量レベルが所定レベル以下になったら消音する。
(6)NON:楽音の発生開始を指示するノートオンをセットするレジスタである。
CPU101が、あるchに対応する制御レジスタ501にノートオンNONも含めて上記パラメータをセットすると、音源部113は当該chにおける楽音発生の処理を開始する。なお、図5の音源部113内に示されている各種パラメータは、それぞれ、その時点で処理中のchのパラメータを示している。すなわち、処理するchが変われば、それに応じてパラメータの値も変化する。
以下、音源部113の各ブロックにおける1ch分の処理を説明する。同様の処理が、時分割で全128chに対して行われ、複数の楽音が並行して生成される。
ピッチカウンタ503には、ノートオンNONおよびFナンバが入力する。ピッチカウンタ503は、ノートオン時点でゼロリセットされ、その後、1DAC毎にFナンバを累算する。この累算値は、整数部アドレスと小数部アドレスとして出力される。ピッチカウンタ503は、ノートオフ後も累算を続けるが、そのchの楽音生成処理が停止されると累算を停止する。ピッチカウンタ503の累算値の整数部の下位10ビットは読出部506に入力する。
PBアドレス発生部505は、上記制御レジスタの(2)と(3)で説明したアドレスPA(発音開始直後に読出すべき波形メモリ111のプリロード領域301の先頭ページのアドレス(図3))とBA(波形メモリ111の当該chに対応するバッファアドレス(図3))を入力し、PBアドレスを読出部506に出力する。PBアドレスは、波形メモリ111中の読出すべき領域の先頭を指定するための上位アドレスである(実際にはPBアドレスは上位部分のみであるので、このPBアドレスの下位に10ビット分の0を付けたアドレスが波形メモリ111中の読出すべき領域の先頭を指定する絶対アドレスになる)。具体的には、PBアドレス発生部505は、発音開始直後はPAをPBアドレスとして出力し、該PAで指定された波形メモリ111のプリロード領域301の先頭ページの波形サンプルデータを読み終えたら、BAをPBアドレスとして出力し、該BAで指定された波形メモリ111のバッファ領域302の当該chに対応するバッファB*aの波形サンプルデータを読み終えたら、BA+1をPBアドレスとして出力し(上述したようにBAは下位10ビット以下を除いた上位部分であるので、BA+1はバッファB*bを指すことになる)、該BA+1で指定された波形メモリ111のバッファ領域302の当該chに対応するバッファB*bの波形サンプルデータを読み終えたら、再びBAをPBアドレスとして出力し、以後、バッファB*aとB*bを交互に読出すようにBAとBA+1を交互にPBアドレスとして出力する。このようなPBアドレスの下位に、ピッチカウンタ503から出力される整数部下位10ビットを付加し、読出しアドレス(絶対アドレス)が生成される。読出部506は、波形メモリ111から、該読出しアドレスで当該chの波形サンプルデータを読出す。ここでは該読出しアドレスの波形サンプルとその次の波形サンプルの2サンプルを読出すものとする。なお、波形メモリ111のアドレスは、ワード単位である。
補間部507は、1DAC毎に、読出された2サンプルの間を小数部アドレス(ピッチカウンタ503から出力されたもの)に応じて2点補間(直線補間)して、1つの補間サンプルを算出する。楽音生成処理が停止されたchについては、補間サンプル「0」を出力する。
振幅エンベロープジェネレータ(EG)502は、当該chのエンベロープ波形生成用のパラメータに基づいて、振幅エンベロープ(AE)波形を生成し、音量制御部508に出力する。音量制御部508は、1DAC毎に、補間サンプルの振幅をAE波形の値に基づいて制御し、当該chの楽音サンプルとして出力する。累算部509は、1DAC毎に、全chの各楽音サンプルを累算し、全chを混合した結果の楽音サンプルとして出力する。なお、不図示の効果付与部でリバーブその他の効果を付与して出力しても良い。
ピッチカウンタ503から出力された整数部上位ビット(整数部から下位10ビットを除いた部分)は、Cアドレス発生部504およびPBアドレス発生部505に入力する。Cアドレス発生部504には、NAND型フラッシュメモリ107の第2ページアドレスWAが入力する(図2)。Cアドレス発生部504は、入力したデータに基づいてCアドレスを生成出力する。Cアドレスは、NAND型フラッシュメモリ107の波形データの読出しページを特定するクラスタ(ページ)アドレスである。Cアドレスがどのように変化するかについては、図6で詳しく説明する。
当該chに対応して生成されたCアドレスは、そのch番号とともに、転送制御部112内の転送待ちキュー521に入力される。転送待ちキュー521は、先入れ先出しのキューである。ピッチカウンタ503から転送指示が出力されたとき、転送待ちキュー521は、Cアドレスとch番号とを取り込んでキューに登録する。そのタイミングについては、図6で詳しく説明する。転送待ちキュー521に登録されたCアドレスとch番号は、要するに、当該ch番号のchについて、その時点で波形メモリ111から読出し再生しているページデータの読出しが終わるまでに、当該CアドレスのページデータをNAND型フラッシュメモリ107からDP RAM109経由で波形メモリ111に転送しておく必要がある、ということを意味している。
F→DP転送指示部522は、NAND型フラッシュメモリ107からDP RAM109へのページデータの転送が行われていないとき、転送待ちキュー521からCアドレスとch番号を取り出し、F→DP転送部108に、NAND型フラッシュメモリ107中の当該Cアドレスで特定されるページデータをDP RAM109へ転送する指示を出す。この指示に応じて、F→DP転送部108は、図4の「NAND型フラッシュ→DPメモリ」のタイムチャートで説明した1ページデータの転送(付番411〜413)を行う。具体的には、F→DP転送部108がフラッシュメモリ107にCアドレスを指定した読出し命令を出力すると、フラッシュメモリ107から1ページデータがバースト転送されてくるので、その転送データをDP RAM109へ書込む。
また、F→DP転送指示部522は、F→DP転送部108に転送指示を出したとき、DP→M転送指示部523に対して該転送指示とch番号を伝える。DP→M転送指示部523は、この転送指示を受けて、DP→M転送部110に当該ch番号と転送指示を出力し、DP→M転送部110がDP RAM109のページデータを波形メモリ111の当該chに対応するバッファにバースト転送するように制御する。これにより、図4の「DPメモリ→波形メモリ」のタイムチャートで説明したDP RAM110から波形メモリ111のバッファ領域へのバースト転送(付番422)が行われる。具体的には、DP→M転送部110は、DP→M転送指示部523からch番号と転送指示を受けると、その転送指示のタイミングから2DAC周期後の1DAC周期の区間で、音源113による波形メモリ111のアクセス期間(図4の421)の後に、DP RAM110にページデータのアドレスを指定した読出し命令を出力する。これにより、DP RAM110から当該ページデータのうちの先頭の256Wがバースト転送されてくるので、その転送データを波形メモリ111の当該chのバッファ領域へ図4の422に示したように書込む。さらに、引き続く256W×3ブロックのデータについても、DP→M転送部110の制御の元で、引き続く3DACの区間を利用して、バースト転送により波形メモリ111の当該chのバッファ領域へ書込む。
なお、DPメモリ→波形メモリのバースト転送で、256Wを当該chの波形メモリ111のバッファ領域に転送する際、当該chのバッファはB*a,B*bの2つあり、どちらに転送するかを決めておく必要がある。本実施形態のシステムでは、その時点で、当該chについて波形メモリ111のプリロード領域301またはバッファB*a,B*bの何れかから波形サンプルの音源113による読出しが行われているはずであるから、プリロード領域301またはバッファB*aから読出しが行われているならバッファB*bをバースト転送先とし、バッファB*bから読出しが行われているならバッファB*aをバースト転送先としている。
図6は、発音開始以降の各種アドレスの時間変化(1ch分)を示す。図中、「整数部下位10bits&小数部」は、図5のピッチカウンタ503でFナンバを累算した累算結果の整数部の下位10ビットおよび小数部の時間変化を示す。Fナンバの累算に応じて値が増加していき、整数部の下位10ビットが1023を越えたとき桁上がりが生じ、0に戻って(厳密には小数部の値が残っているので1以下の値である)再び増加する。これにより、図のような鋸歯状の変化を示す。「整数部上位bits」は、ピッチカウンタ503の上位部分(累算結果から整数部の下位10ビットおよび小数部を除いた上位部分)の時間変化を示す。発音開始直後は0であり、以後、「整数部下位10bits&小数部」の桁上がりが生じる毎に、1ずつ増加していく。
「転送指示」は、図5のピッチカウンタ503から転送待ちキュー521に出力される転送指示信号を示す。発音開始時に付番601のように出力され、以後、「整数部下位10bits&小数部」の桁上がりが生じる毎に付番602,603のように出力される。「PBアドレス」は、図5のPBアドレス発生部505から出力されるPBアドレスの時間変化を示す。発音開始直後はPBアドレスとしてPA(波形メモリ111のプリロード領域301の先頭ページを指すアドレス(図3))が出力され、以後は、「整数部上位bits」がカウントアップされる毎にBAとBA+1(BAは当該chに対応するバッファB*aのアドレス、BA+1は当該chに対応するバッファB*bのアドレス)が交互にPBアドレスとして出力される。
「Cアドレス」は、図5のCアドレス発生部504が転送待ちキュー521に出力するCアドレスの時間変化を示す。発音開始直後は、次に波形メモリ111に読出しておくべきページは、当該波形データの第2ページアドレスWAで指されるページであるから(図2)、CアドレスとしてWAが出力され、以後は、「整数部上位bits」がカウントアップされる毎に1ずつ増加していく。Cアドレスは、WAに「整数部上位bits」の値を加算して生成する。ただし、転送指示が来るたびにWAからインクリメントしていってCアドレスを生成してもよい。なお、WAも、上記PBアドレスなどと同様に、下位に10ビットの0を付加して絶対アドレスになるものであるので、図2の例で言えば、WA+1で第3ページW2(2)を指し、WA+2で第4ページW2(3)を指し、…という対応となる。
「転送実行タイミング」は、図5のF→DP転送指示部522およびDP→M転送指示部523が、図4で説明した転送を実際に実行するタイミングを示す。例えば、転送待ちキュー521に転送指示601が出力され、Cアドレスとch番号がキューに登録されたとしても、その時点で他のchの転送が行われている場合があるので、直ちに図4の転送が行われるとは限らず、他のchの転送が終わった後に、少し遅れた付番611のタイミングで転送が行われる。同様に、転送指示602で転送待ちキュー521に登録されたCアドレスとch番号の転送は付番612で、転送指示603で転送待ちキュー521に登録されたCアドレスとch番号の転送は付番613で、…というように、転送指示から少し遅れて転送が実行される。その遅れは、他のchで実行されている転送の混み具合によるので、一定ではない。もちろん、転送指示601で転送待ちキュー521に登録した転送は転送指示602が来る前に実行し、転送指示602で転送待ちキュー521に登録した転送は転送指示603が来る前に実行し、…というように、次の転送指示が来る前に実行する必要はある。
ここで、NAND型フラッシュメモリ107のアクセスに関するタイミング設計について説明する。
上述したように、本実施形態では、サンプリング周波数は44.1kHzであり、その場合の1DAC周期は22.67n秒である。図2で説明したように、波形データは1ページが2048バイト(1024サンプル)のページ単位でフラッシュメモリ107に連続して格納されている。あるchについて、1ページ分1024個の波形サンプルをDP RAM109経由で波形メモリ111に転送し、それらの波形サンプルをピッチアップせずに(すなわちFナンバ=1)再生する場合を考えると、再生時間は1024DAC(これを「基本再生期間」と呼ぶ)となる。一方、フラッシュメモリ107からの1ページの読出し(これを「1単位アクセス」と呼ぶ)は、図4で説明したように、4DACかかる。従って、上記基本再生期間の間に、1024/4=256回の単位アクセスを行うことができる。よって、ピッチアップしない場合、再生可能なch数の最大値は256chとなる。
次に、全発音chで同時に1オクターブ、ピッチアップする場合を考える。この場合、全chでFナンバ=2で波形サンプルが読出されるので、1単位アクセスで波形メモリ111に転送された1ページ分1024個の波形サンプルは、1DAC毎に1つおきに使用され、前記基本再生期間の半分の512DACで再生が完了することになる。従って、この再生期間の間に、512/4=128回の単位アクセスを行うことができる。よって、全chで1オクターブのピッチアップをした場合、再生可能なch数の最大値は128chとなる。このケースが後述の第1実施例に相当する。
以上のように、発音可能ch数とFナンバ上限値(ピッチアップの上限)とはトレードオフの関係にある。従って、フラッシュメモリ107の仕様(特に、ページの大きさと1単位アクセスに何DACかかるか)に基づいて基本再生期間が決まるので、それに基づいて発音可能ch数とFナンバ上限値(全chで同時にピッチアップするときのFナンバ上限値)を決めればよい。すなわち、先に発音可能ch数が決まっているのであればそれに対応してFナンバに制限をかければよい。逆に、Fナンバ上限値が決まっているのであればそれに対応して発音可能ch数を決めればよい。なお、ピッチダウンする場合は、1ページ分1024個の波形サンプルで前記基本再生期間以上の期間の再生が可能になり、その期間に上述のケースより多くの回数の単位アクセスを行うことができるので、発音可能ch数とFナンバ上限値との関係には少し余裕が出る。
次に、波形メモリ111のアクセスに関するタイミング設計について説明する。
本実施形態のシステムでは、1単位アクセスでDP RAM109に転送された1024サンプルを、4DACに分けて256サンプル(512バイト)ずつDP RAM109から波形メモリ111のバッファへバースト転送している(図4)。4DACに分けて256サンプルずつバースト転送するのは、1単位アクセス(フラッシュメモリ107からの1ページデータの読出し)に4DACかかることに合わせたものである。1DAC周期からこのバースト転送の期間と波形メモリ111のリフレッシュの期間を除いた期間が、音源113が各発音chの楽音生成のために波形サンプルを読出す期間になる。従って、バースト転送の期間を大きく取らなければならないようなケースでは、発音chのための読出し期間を減らさないといけないので、それに応じて発音可能ch数を減らすように設計する必要がある。逆に、バースト転送の期間と回数をもっと減らすことができれば、それに応じて発音可能ch数を増加することができる。
ここで、「帯域幅」と「全帯域幅」について説明しておく。「全帯域幅」とは、上述した基本再生期間(1ページ分のサンプルデータをサンプリング周期ごとに1サンプルの速度で再生した場合の再生時間)にフラッシュメモリ107から読出し可能な最大ページ数(言い替えると、基本再生期間に転送指示を出すことができる回数の上限値)である。本実施形態では、基本再生期間が1024DACで、フラッシュメモリ107から1ページ読出しするのに4DACかかるので、全帯域幅は256である。「帯域幅」とは、ある1つのchで、基本再生期間に、フラッシュメモリ107から読出す最大ページ数(当該chが転送指示を出す最大回数)である。例えば、あるchにおいて、Fナンバ=1で楽音生成するなら、基本再生期間1024DACの間に1回だけ転送指示を出せば、その1回の転送で波形メモリに書込まれた1024サンプルで基本再生期間内におけるFナンバ=1の再生がまかなえるので、当該chの帯域幅は1である。もしFナンバ=2なら帯域幅は2である。もしFナンバ=1.1なら、基本再生期間の10期間分で11回の転送指示(11ページ分の転送)が必要だから、前記10期間のうちのどこかで2回の転送指示を出さなければならず、当該chの帯域幅は2となる。従って、Fナンバの小数部を切り上げた値が、そのchの帯域幅となる。また、全chの帯域幅の和が全帯域幅を越えることがないようにすることが必要である。越えてしまうと、何れかのchで発生した転送要求が処理できなくなるからである。
以上のようなタイミング設計に係る条件に応じて、以下では、上述の実施形態のシステムにおける第1〜第3の3つの実施例を説明する。
図7(a)は、第1〜第3実施例の何れにも適用されるノートオンイベント処理のフローチャートである。この処理は、CPU101が、例えばMIDI I/O106からMIDIノートオンイベントを入力したときに、実行するものである。ステップ701では、入力したMIDIノートオンイベントの演奏情報に基づいて、ノートナンバとベロシティをレジスタnn,velにセットする。ステップ702では、フラッシュメモリ107中の現在選択されている音色に対応する複数の波形データの中から、nn,velに応じた1つの波形データを決定(選択)する。図1のNOR型フラッシュメモリ103には、各音色の音色データが用意されており、その音色データ中にはnn,velに応じた波形データを選択するための波形選択情報が含まれている。ステップ703では、発音chの割当を行い、そのch番号をレジスタaにセットする。ステップ704では、音源113の制御レジスタ501のa chの領域に各種パラメータを設定する。ピッチシフトを制御するFナンバは、決定された波形データをピッチシフトしない場合のピッチ(セント)と、ノートナンバnnの示すピッチ(セント)との音高差(セント)から決めることができる。上述したWA,PAやエンベロープ関連のパラメータは音色データに含まれている。BAは、割り当てられたch番号から決めることができる。最後に、ステップ705で、ノートオンNONにa chの発音開始指示を書込み、処理を終了する。
以上により、a chについてノートオンNONを含む音源レジスタにデータが設定されたので、これ以後は図1〜図6で説明した動作によりa chでの発音が行われる。この発音処理は、図1のNAND型フラッシュメモリ107から音源113に至るハードウェアで実行され、CPU101に割込みがかかることはない。
第1実施例について説明する。第1実施例は、Fナンバ上限値を2に制限するとともに、ch数Sを再生可能な128chに設定した場合(全chで同時に1オクターブピッチアップするケースを限界とする場合)である。全帯域幅Tが256であり、ch数Sはそれより少ない128chである。
上述したように、1つの音色について、録音時の音高を変えた複数の波形データが用意されており、図7(a)のステップ702では、音色毎の波形選択情報に応じて、フラッシュメモリ107中の複数の波形データの中から、ノートナンバnnとベロシティvelに応じた1つの波形データが選択されるようになっている。波形選択情報は、その音色の楽音を発音する全ノートナンバ、発音する全ベロシティのうちに、互いに重ならない複数の音域と強度の範囲(リージョン)を定義するとともに、その各リージョンに、その音色に対応する複数の波形データの1つを割り当てる情報である。前述したステップ702では、この波形選択情報をノートナンバnnとベロシティvelで参照し、複数の範囲の中からそのノートナンバnnとベロシティvelが含まれる1つのリージョンを検出して、その検出されたリージョンに割り当てられた1つの波形データを選択している。つまり、ノートナンバnnに応じて1つの波形データが選択されることになる。そして、ここで選択される波形データの録音時のピッチはノートナンバnnが示すピッチとは限らないので、前述したステップ704では、その波形データをノートナンバnnが示すピッチまでピッチシフトするためのFナンバが決定される。
第1実施例では、ステップ702において、ステップ704で決定されるFナンバが2以下となる波形データが選択されるように、この波形選択情報を工夫している。具体的には、ある音色の複数の波形データの各々について、その波形データが割り当てられるリージョンのノートナンバの上限が、その波形データを1オクターブだけピッチアップしたピッチに対応するノートナンバ以下となるようにしている。
このようにして、各音色の波形選択情報を用意することにより、ステップ702でノートナンバnnに応じて選択される波形データに対し、ステップ704で決定されるFナンバを2以下にすることができる。なお、ここではFナンバの上限を2に制限する例を示したが、上限は2に限らない。2.5以下、3以下等に制限した設計も可能である。要するに、全帯域幅Tをch数Sで割った商T/Sの整数部がFナンバ以下になるようにすればよい。従って、この条件が満たされるように各音色ごとに複数の波形データを用意しておき、図7(a)のステップ702と704で楽音生成に使用する波形データとFナンバを決定する際に、FナンバがT/Sの整数部以下にできるような波形データを選択し、そのようなFナンバを決定するようにすればよい。
図7(b)は、第1実施例の発音割当処理を示す。第1実施例では、図7(a)のステップ703で、この図7(b)の処理を行う。ステップ711で、空きchをサーチする。空きchがあれば、ステップ713で該空きch番号をレジスタaにセットして終了する。ステップ712で空きchがなければ、ステップ714で消音するchの番号を決定してレジスタaにセットし、ステップ715でa chを急速減衰ののち停止させてchを開放し、終了する。
次に、第2実施例について説明する。第2実施例は、Fナンバ上限値を制限せず、基本再生期間において全chについての単位アクセスの回数(帯域幅)の合計は上限である全帯域幅に抑えるケースである。要するに、基本再生期間において、ピッチアップしたchについては多くの回数の単位アクセスが必要になるが、逆にピッチダウンしたchについては単位アクセスの数は減らせるので、全体として基本再生期間における単位アクセスの上限の数(全帯域幅)に抑えれば良いとするケースである。
図7(c)は、第2実施例の発音割当処理を示す。第2実施例では、図7(a)のステップ703で、この図7(c)の処理を行う。ステップ721で、ceil(Fナンバ)をレジスタbwにセットする。ceil(j)は、数値jの小数部を切り上げる関数である。従って、bwに、Fナンバの小数部を切り上げた数すなわち当該chの帯域幅がセットされることになる。一方、音源113の全帯域幅、すなわち前記基本再生期間に転送指示を出すことができる回数の上限は一定値(この実施形態では、1回の転送に4DACかかるので、1024/4=256回)であり、この値をTbwとする。また、割り当て済みの全帯域幅をAbwとする。ステップ722では、当該chにこれから割り当てようとする帯域幅bwと、全帯域幅Tbwから割り当て済み帯域幅Abwを減算した値(空きの帯域幅を示している)とを比較する。前者が後者より大きければ、当該chの帯域幅を割り当てることができないので、ステップ723で消音するch番号を決定してレジスタbにセットし、ステップ724でb chを急速減衰ののち停止させてchを開放し、ステップ725でAbwからCbw(b)を減算して、ステップ722に戻る。Cbw(i)は、ichに割り当てた帯域幅を表す。b chを消音したので、b chに割り当てていた帯域幅は空きとなり、その分を割り当て済み帯域幅Abwから減算するものである。
ステップ722でbw≦Tbw−Abwのときは、割り当てる帯域幅があるということであるから、ステップ726に進む。ステップ726では空きchをサーチする。空きchがあれば、ステップ728で該空きch番号をレジスタaにセットし、ステップ732に進む。ステップ727で空きchがなければ、ステップ729で消音するchの番号を決定してレジスタaにセットし、ステップ730でa chを急速減衰ののち停止させてchを開放し、ステップ731でAbwからCbw(b)を減算して、ステップ732に進む。ステップ732では、いまa chに割り当てた帯域幅bwをCbw(a)にセットし、割り当て済み帯域幅Abwにbwを加算する。
なお、ノートオフされたc chの楽音が所定レベル以下に減衰したら、そのc chを停止し空きchとして開放するとともに、帯域情報の更新「Abw←Abw−Cbw(c)、および、Cbw(c)←0」を行うものとする。また、図7(c)の処理では、Aパートを行ってからBパートを行うようになっているが、先にBパートを行ってからAパートを行うようにしてもよい。
次に、第3実施例について説明する。第3実施例は、基本再生期間における単位アクセスの上限値と発音可能ch数とを同数に設定することで処理を簡略化するケースである。図1から図6で説明した実施形態では、音源部113の全帯域幅Tbwは256である。第3実施例では、発音chは全部で256chあるものとする(図1〜6の説明で発音ch数を128chと説明した部分は256に読み替えるものとする)。その256chが全部発音していれば、最低でも256の帯域幅を使用する。逆に、未使用帯域が1つでもあるということは、1つ以上の空きchが必ずあることを意味している。そのため、第3実施例では、第2実施例のBパートに対応する処理は不要となる。
図4(b)は、第3実施例において、図4(a)の期間421で256ch分の波形サンプルを、音源113が波形メモリ111から1DACの間に読出すことを示す図である。1ch分の波形サンプルは、複数のNサンプルをバーストモードで読出すものとする。図中、1ch’の期間で第1chのNサンプルをバーストモードで読出し、2ch’の期間で第2chのNサンプルをバーストモードで読出し、…、というようにする。Nをいくつに採るかは、何点補間を行うかによる。2点補間ならN=2、3点補間ならN=3、…というようにすればよい。逆に言えば、期間421で図4(b)に示すように256ch分の波形サンプルを読出せる性能のハードウェアを用いる必要がある。
図8は、第3実施例の発音割当処理を示す。第3実施例では、図7(a)のステップ703で、この図8の処理を行う。ステップ801〜805は第2実施例の図7(c)のステップ721〜725と同じである。ステップ806で空きchをサーチするが、上述したように割り当てる帯域幅があれば空きchはあるはずだから、空きchサーチでは必ず空きchが見つかる。ステップ807,808は、図7(c)のステップ728,732と同じ処理である。
上記実施形態の各実施例によれば、図4で説明したように、2つの転送(フラッシュメモリ107からDP RAM109への転送とDP RAM109から波形メモリ111への転送)の相互タイミングを工夫して、あるページのフラッシュメモリ107からDP RAM109への転送の完了前に、そのページ中の転送済みデータのDP RAM109から波形メモリ111への転送を開始するようにしている。また、フラッシュメモリ107からDP RAM109へ4DACで転送されたページデータは、2DACの遅れの後、DP RAM109から波形メモリ111へ同じ4DACで転送される。これにより、中間バッファであるDP RAM109の容量を1ページまで縮小することができた。また、DP RAM109から波形メモリ111への転送をバーストで行うことにより、音源部113による波形メモリ111のアクセス回数を増やし、その結果、発音可能ch数を増やすことができた。
なお、上記各実施例における各種の値は、それぞれ適宜変更することができる。フラッシュメモリ107のページのサイズは2048バイトに限らない。1024バイト、4096バイト等、任意のサイズであってよい(フラッシュメモリ107の仕様による)。基本再生期間における単位アクセス回数Tは256に限らず、300、450、512等、任意の数であってよい(フラッシュメモリ107の仕様による)。波形メモリ111からの読出しサンプルデータ数は256(1ch当たり2サンプルで128ch分)に限らず、310、460、512等、任意の数であってよい(音源113が波形メモリ111から波形サンプルを読出す際、どれほどの分解能のタイムスロットで1サンプル読出し可能かの仕様による)。発音可能ch数も128chに限らず、(上述のボトルネックとなる種々の条件のもとで)64、80、160等、任意の数で設計することが可能である。
また、上記実施形態において、補間部507による補間処理は2点補間であったが、3点補間、4点補間等、任意数の点間の補間であってよい。ただし、例えば4点補間を行う場合は、各chで波形メモリ111から波形サンプルを読出すときに、1回の読出しで連続する4サンプルを読出すことになるので、発音可能ch数を減らさなければならない場合はある。波形メモリ111から複数サンプルを読出す場合、バーストモードにより高速に読出すようにしてもよい。上記第3実施例では、1ch毎に複数サンプルをバーストで読出す例を説明した。また、補間部507を、サンプルバッファを備えた補間部としてもよい。
上記実施形態において、任意のブロックを1チップLSI化してよい。例えば、下記のような1チップLSI化が可能である。
(1)音源部、転送制御部、F→DP転送部、DP RAM、およびDP→M転送部の5ブロックを1チップ(集積回路)化する。波形メモリは別のチップで構成する。この場合、上記実施形態と同様に、波形メモリの書込み、および、読出しをバーストで行なって高速化する必要がある。
(2)音源部、転送制御部、F→DP転送部、DP RAM、DP→M転送部、および波形メモリの6ブロックを1チップ化する。この場合、内蔵される波形メモリは、読出し、および、書込みの速度が充分に高速であるので、バーストで行う必要がなくなる。
(3)さらに、1チップに各種I/OやCPUも含めるなど、プロセスの進化に合わせて、1チップ化するブロックを増やしていくとよい。
上記実施形態では、各波形データをNAND型フラッシュメモリの連続するページに記憶したが、その代わりに、NAND型フラッシュメモリの連続しない複数のページに分散して記憶するようにしてもよい。また、Cアドレス発生部や転送待ちキューの行っている役割を、転送要求信号を割り込み信号として、CPUが割り込み処理として実行するようにしてもよい。