以下、図面を用いてこの発明の実施の形態を説明する。
図1は、この発明の一実施形態であるDSPを利用した音響処理装置の構成を示す。中央処理装置(CPU)101は、この音響処理装置の全体の動作を制御する。フラッシュメモリ102は、CPU101やDSP110が実行・使用する各種のプログラムやデータを格納した不揮発性メモリである。RAM103は、CPU101が実行するプログラムのロード領域やワーク領域に使用する揮発性メモリである。マウス104やキーボード105は、ユーザが本装置に各種の指示を与えたりデータを入力するための操作子である。ハードディスク106は、プログラムやデータを記憶する外部記憶装置である。ディスプレイ107は、各種の情報を表示するための表示装置である。その他I/O108は、本装置に各種の外部機器を接続するためのインタフェースである。
波形入力部109は、DSP110にデジタル音響信号を入力する部分であり、例えば、(1)外部から入力したアナログ音響信号をデジタルに変換するAD変換器、(2)外部機器からデジタル音響信号を受信する通信I/Oインタフェース、(3)CPU101からの指示に応じてデジタル音響信号を発生する音源、(4)ハードディスク106やRAM103などに記憶された音響信号を再生するレコーダなどである。DSP110は、1チップの大規模集積回路(LSI)として構成され、CPU101から与えられる各種のマイクロプログラムを実行することにより、ディストーション、コーラス、リバーブ、ハウリングキャンセラ、イコライザなどの各種の音響信号処理を行い、処理後の波形信号を波形出力部112に出力する。このDSP110は、複数のマイクロプログラムを時分割で並列に実行可能なものである。DSP110に設定する信号処理のプログラムやパラメータ(係数を含む)は、もともとフラッシュメモリ102やハードディスク106に記憶されているものであり、信号処理の選択操作に応じて、CPU101がフラッシュメモリ102等から選択された信号処理のプログラムやパラメータを読出してDSP110に設定する。遅延メモリ111は、DSP110での処理において長時間遅延した信号が必要な場合に使用する外部メモリである。波形出力部112は、DSP110からのデジタル音響信号を出力する部分であり、例えば、(1)デジタル音響信号をアナログに変換して外部に出力するDA変換器、(2)外部機器へデジタル音響信号を送信する通信I/Oインタフェース、(3)デジタル音響信号をハードディスク106やRAM103などに録音するレコーダなどである。以上の、波形入力部109、DSP110、および波形出力部112は、それぞれ、所定のサンプリング周波数(例えば、96kHz)でデジタル音響信号の処理を行う。このサンプリング周波数は、ユーザが変更できるようになっていてもよい。
図1の装置は、例えば汎用的なPCに所定のソフトウェアをインストールして所謂AWS(オーディオワークステーション)として、ハードディスクレコーディング機能、効果付与機能、及びシーケンサ機能などを実現した機器でも良いし、あるいはデジタルミキサなどの機器であっても良い。本発明に係る信号処理装置(DSP)は、音響信号を処理する機器でマイクロプログラムを入れ替えて動作させるものであればどのようなものにでも適用して好適なものである。
図2は、本発明の一実施形態であるDSP110の詳細構成を示す。221〜231は、従来より知られている通常のDSPの信号処理回路と同様の回路である。乗算器226は、セレクタ224により選択されたI/O RAM221又はテンポラリRAM222のデータと、セレクタ225により選択された補間部251から供給される係数データ又はYRAM223のデータとを乗算し、乗算結果を加算器228に出力する。加算器228は、セレクタ227により選択された内部バス229、I/O RAM221、又はテンポラリRAM222のデータと、乗算器226から出力されたデータとを加算し、加算結果を内部バス229に出力する。内部バス229には、外部RAM(遅延メモリ)111に対する書込部230及び読出部231が接続されており、内部バス229上のデータを外部RAM111に書込み、又は外部RAM111内のデータを内部バス229に読出すことができる。内部バス229上のデータは、I/O RAM221、テンポラリRAM222、又はYRAM223に書込んだり、セレクタ227に入力させることができる。これら各部はパイプライン処理を行っており、1ステップ毎にI/O RAM221からデータを読出し、1ステップ毎にI/O RAM221に処理後のデータを書込むことができる。ここでは、I/O RAM221は、DSP110と外部のデバイスとの間で音響信号の入出力をおこなうためのインターフェースとしての働きを有する。DSP110は、あるサンプリング周期で波形入力部109から供給された音響信号を、次のサンプリング周期でマイクロプログラムの所望のステップに配置した読出命令によりI/O RAM221の入力用領域から読み出して利用することができ、また、あるサンプリング周期に、マイクロプログラムの所望のステップに配置された書込命令によってI/O RAM221の出力用領域に書き込まれた音響信号を、次のサンプリング周期に、波形出力部112に出力するようになっている。上述した信号処理回路の各部は、マイクロプログラムメモリ214から読み出されたマイクロプログラムの命令コードに応じて制御信号発生部252が発生する制御信号に基づいて動作することにより、各種の信号処理を行うものである。マイクロプログラムの各ステップには、DSP110内のRAM221、222、223の書込/読出命令、セレクタ224、225、227を制御する選択命令、外部RAM111の書込/読出命令、アドレスレジスタ232への書込命令、乗算器226及び加算器228を制御する命令などを適宜組み合わせた命令コードが記憶されている。
本実施形態のDSP110は各サンプリング周期毎に4096ステップの処理を繰り返し実行するものであり、マイクロプログラム(MP)メモリ214には、図1に示したCPU101がその4096ステップ分のマイクロプログラムを設定する。また、CPU101は、係数メモリ213に上記4096の各ステップ毎の係数データを、アドレスメモリ215に上記4096の各ステップ毎のアドレスデータ(遅延メモリ111のアクセスアドレス)を、それぞれ設定する。特に、本実施形態のDSP110では、上記4096ステップを128ステップ/ページ単位で32ページ分のページ領域に分け、指定されたページの順番でマイクロプログラムを実行する。実行するページの順番は、PAテーブル211及びSPテーブル212の設定による。ステップ読出部240に入力するFsは、上述したサンプリング周波数の周期で発生するサンプリングクロックであり、Φはそのサンプリング周期内で上記4096ステップの処理を行うためにDSP内部の各部に供給される動作クロックである。すなわち、この動作クロックは、サンプリング周波数の4096倍以上の周波数とされる。また、サンプリングクロックFsは、波形入力部109、波形出力部112にも供給されており、波形入力部109、DSP110、波形出力部112は、それぞれ、この共通のサンプリングクロックFsに同期して音響信号の処理を行う。ステップ読出部240は、1サンプリング周期内の上記4096の各ステップのタイムスロット毎に、そのタイムスロットで実際に実行すべき命令がMPメモリ214から読出されるように(同時に、その命令に対応する係数データ及びアドレスデータが係数メモリ213及びアドレスメモリ215から読出されるように)制御する。
ここで、図3を参照して、図2のPAテーブル211とSPテーブル212の構造及びステップ読出部240によるMPメモリ241からの命令ステップの読出し制御について説明する。
図3(a)は、SPテーブル212の詳細な構造を示す。SPテーブル212は、時分割実行する最大8つの各プログラムのMPメモリ214内での先頭ページのページアドレスを記憶するテーブルである。すなわち、8つのプログラムをインデックスb(bは0〜7の整数で3ビットデータ)でプログラムb(要するにプログラムbは第b+1番目のプログラムである)と呼ぶとき、SPテーブル212の要素SP(b)には、プログラムbのMPメモリ214内の先頭ページのページアドレスが記憶されている。SP(b)=0のとき(b≠0の場合)、プログラムbは割当て無し(存在しない)を示す。SP(0)には特別な意味を持たせる。SP(0)=0は、プログラム0の先頭ページがページアドレス0のページであることを示す。SP(0)≠0は、そのSP(0)の値(≠0)をインデックスbとするプログラムが、(インデックス0,1,…と順に見ていったとき)最初に割当てられているプログラムであることを示す。例えば、SP(0)=1は、プログラム0は割当てが無く、プログラム1が最初に割当てられているプログラムであることを示す。SP(0)=2は、プログラム0と1は割当てが無く、プログラム2が最初に割当てられているプログラムであることを示す。
SP(b)は、0〜31の32ページ分のページアドレスを表すため5ビットデータとする。上記8つのプログラムのそれぞれは、論理的に一連の処理を実行するひとかたまりのプログラムであるので「ブロック」と呼び、インデックスbは「ブロックアドレス」と呼ぶことがある。なお、図3(c)の右段に示すように、MPメモリ214は全体で4096ステップ分の命令を格納する領域を持ち、128ステップ/ページ単位で32ページ分のページ領域に分けられている。0〜31のページアドレスでページを特定することができる。
図3(b)は、PAテーブル211の詳細な構造を示す。ページアドレスをp(pは0〜31の整数)として、そのページpに対応するPA(p)に、当該ページpの次に実行すべきページアドレスを記憶する。PA(p)は、0〜31のページアドレスを表すため5ビットデータとする。ページpが当該プログラムの最終ページであって、次に実行すべきページがないときは、PA(p)=0とする。なお、プログラムを複数ページに割当てる場合、若い番号で空いているページから順番に割当てるようにしているので、「次のページ」がページアドレス0のページになることはあり得ない。
図3(c)は、SPテーブル212及びPAテーブル211の格納値の具体例を示す。プログラム0に注目すると、まずSP(0)=0であるから当該プログラム0は、MPメモリ214のページ0から開始することが分かる。次に、そのページ0に対応するPAテーブル211の要素PA(0)=1であるので、次に実行するMPメモリ214内のページがページ1であることが分かる。同様にして、PA(1)=2→PA(2)=11→PA(11)=12→PA(12)=13→PA(13)=0とリンクを辿ることができるので、要するに当該プログラム0はMPメモリ214のページ0→1→2→11→12→13の順で実行すべきことが分かる。すなわち、DSP110は、8つのプログラムの各々を、SPテーブル212とPAテーブル211を用いてシーケンシャルに読み出しし、実行することができる。このSPテーブルとPAテーブルを用いた方式は、シーケンシャルアクセスには適しているが、ランダムアクセスには適さない。ここでは、DSP110の実行するプログラムがシーケンシャルに読み出されるべきデータであることが確定しているので、この方式が採られている。なお、図3(c)のPAテーブル中の「プログラム0−1」や「プログラム0−2」などの「プログラムi−j」の記載は、その要素に対応するページがプログラムiの第j番目のページであることを示す。
再び図2に戻って、ステップ読出部240によるプログラムの読み出しを説明する。ステップ読出部240内の241と243は、ブロックアドレスbとページアドレスpを記憶するレジスタである。(なお、図中の丸付き数字は、ビット数を示している。)ステップ読出部240は、サンプリング周期毎に、レジスタ241の記憶するブロックアドレスbを0〜7で順に変化させながら、各ブロックアドレスbにおいて、まず、SPテーブル212の記憶するプログラムbの開始ページの番号SP(b)をレジスタ243にロードし、続いて、PAテーブル211が記憶する次ページの番号を、その値が「0」となるまで、レジスタ243に順次ロードする。それと平行して、その各時点におけるレジスタ243の示すページの命令コードを順次読出して制御信号発生部252に渡すことで、8つのブロックに対応する8つのプログラムを各サンプリング周期内に時分割実行する(後述する図7)。242のcntは、1ページ内の128ステップの命令を読出すために使用する7ビットのカウンタである。すなわち、ブロックアドレスbとページアドレスpが決定してMPメモリ214内の読出すべきページが確定したら、cntを0〜127で変化させ、これを当該ページの先頭からの相対アドレスとして当該ページ内の128ステップ分の命令を順番に読出す。上記ではMPメモリ214のページ分けとアクセス方式を説明したが、係数メモリ213とアドレスメモリ215も同様に32ページにページ分けされており、MPメモリ214から読出した命令に対応する係数データとアドレスデータが読出されるように構成されている。
図4は、プログラムの実行途中で何れかのプログラムを削除し、新たなプログラムを設定して実行する場合の、SPテーブル212及びPAテーブル211の例を示す。411と421は最初の状態、412と422はプログラム1を削除した状態、413と423は新規にプログラム1を登録した状態を示す。太線で囲んだ部分は有意なデータを示す。最初の状態のテーブル411,421では、MPメモリ214において、プログラム0はページ0,1,2,11,12,13の順に格納され、プログラム1はページ3,4の順に格納され、プログラム2は割当て無しで、プログラム3はページ9,10の順に格納され、プログラム4はページ5,6,7,8,の順に格納されている。それ以降のプログラム5〜7の割当ても無い。従って、図2のステップ読出部240は、プログラム0の上記ページを順に辿って各ページから命令を読出して制御信号発生部252に渡し、次にプログラム1の上記ページを順に辿って各ページから命令を読出して制御信号発生部252に渡し、…と繰り返すことにより、一連のプログラムが実行される。
これらのプログラムの実行中に、斜線を付してあるプログラム1を削除する指示が来たとする。このとき、CPU101は、プログラム1に対応するSP(1)とそこから辿れるPA(3),PA(4)とを全て0(当該ページが未使用であることを示す)とし、プログラム1が利用していたMPメモリ214と係数メモリ213とアドレスメモリ215内の当該ページを開放する。412と422はプログラム1を削除した後のSPテーブル212及びPAテーブル211を示す。ステップ読出部240はSPテーブル212を参照して各プログラムの先頭ページを認識するが、SP(1)=0とされた段階でプログラム1が削除されたことは分かるので、プログラム1は実行されなくなる。その他のプログラムは引き続き実行中である。
次に、新たにプログラム1に割当てて実行したいプログラムが選択された場合、CPU101は、新たに選択されたプログラムの容量を確認し、MPメモリ214の何ページ分を使用するかを決定する。ここでは3ページ分を使用するものとする。図示しないが、RAM103には、8つの各ブロックbの使用状態BS(b)(=0:未使用、1:使用中)を記憶したBSテーブルと、32の各ページpの使用状態PS(p)(=0:未使用、1:使用中)を記憶したPSテーブルとが設けられており、CPU101は、これらのテーブルを使用して新たに選択されたプログラムに対するブロックの割当てとページの割当てとを行う。例えば、CPU101は、BS(1)=0でブロック1が未使用(未割当て)の状態にあり、PS(3)=0、PS(4)=0、PS(14)=0でページアドレスが若い方からページ3、4、14が未使用(未割当て)の状態であることを認識し、新たに選択されたプログラムに対してブロック1とページ3、4、14とを割当て、このプログラムの3ページ分の命令コードをMPメモリ214の割当てたページ3、4、14の領域に書き込むとともに(同時に係数メモリ213とアドレスメモリ215についても、このプログラムの係数データとアドレスデータを、それぞれ対応するページの領域に書き込む)、SPテーブル212に割当てたブロックの開始ページSP(1)=3を設定し、PAテーブル211に割当てたページのリンクPA(3)=4、PA(4)=14、PA(14)=0を設定する。これにより、ステップ読出部240は、SP(1)=3からプログラム1を辿れるので、実行中のプログラムに加えて、新たに選択されたプログラム1についても実行が開始される。そして、CPU101は、BSテーブルにブロック1の使用中を示す要素(BS(1)=1)を、PSテーブルにページ3、4、14の使用中を示す要素(PS(3)=1、PS(4)=1、PS(14)=1)を設定する。
上記方式を採っているため、DSP110では、最大8つのプログラムの一部のプログラムを、残りのプログラムの実行中に、MPメモリ内の各プログラムの配置状態に影響されることなく、自由に削除したり、新たに追加したりすることができる。この場合、削除したり追加するプログラム以外の実行中のプログラムを停止する必要はない。また、削除したり追加するプログラムの大きさが区々である場合にはページの断片化が発生することがあるが、断片化が発生しても問題なく動作が継続できる。
再び図2を参照して、遅延メモリ111のアクセスアドレスの生成方式について説明する。加算器254は、アドレスメモリ215からのアドレスデータ(20ビット)とベースカウンタ253からのベースカウンタ値(20ビット)とアドレスレジスタ232から読出したデータ(20ビット)とを加算することにより、遅延メモリの仮想アドレス(22ビット ただし、範囲制限前のアドレス)を生成する。このDSP110では、各プログラムが利用する遅延用のメモリ領域が、遅延メモリ111上で複数の領域に分割されて配置されていたとしても、そのプログラムからは仮想的に1つの連続した領域(仮想遅延メモリと呼ぶ)に見えるよう、アドレス変換を行っている。仮想アドレスとは、各プログラムが、その利用する仮想遅延メモリ上でのアドレスを示すものである。アドレスレジスタ232から加算器254に出力されるアドレスデータはベースカウンタ値からのオフセットであり、説明の簡単化のためにまずこの値を0と仮定し、加算器254がアドレスメモリ215からのアドレスデータとベースカウンタ253からのベースカウンタ値とを加算する場合を説明する。ベースカウンタ253は、8つのブロックに対応する8つの独立したカウンタbで構成されており、各ブロックbのカウンタbは、そのブロックbのプログラムbの実行期間に、そのプログラムbに割当てられた仮想遅延メモリbの最終アドレスを初期値として、サンプリングクロック毎に1つずつカウントダウンした値を出力する。そして、0(仮想遅延メモリbの先頭アドレス)の次は、再びその最終アドレスに戻ってサンプリングクロック毎のカウントダウンを繰り返す。この最終アドレスは、後述する実遅延メモリ111の1ページのサイズと当該プログラムbに割当てられたメモリサイズBMS(b)とに基づいて、1ページのサイズ(=216)×BMS(b)−1の計算式により算出される。いま、プログラムb中のあるステップの書込み命令で、その命令に対応するアドレスメモリ215内のそのステップのアドレスデータの値が0であるとする。サンプリングクロックtにおけるベースカウンタ値をBC(t)と表現すると、その時点で上記書込み命令で、仮想遅延メモリのアドレスBC(t)+0の位置にデータが書込まれる。サンプリングクロックtが1ずつ進むと、BC(t)は1ずつカウントダウンされるので、アドレスが減少する方向でデータが書込まれていく(アドレス0の次は再び最終アドレスに戻るので、仮想遅延メモリをリングメモリとして使っていることになる)。仮想遅延メモリからデータを読出す場合は、要するに、あるクロックtの時点では、BC(t)+1の位置に1サンプリングクロック前の値が存在し、BC(t)+2の位置に2サンプリングクロック前の値が存在し、…となる。従って、その時点で、読出し命令でnサンプリングクロック前のデータを読出したければ、その読出し命令に対応するアドレスメモリ215内のアドレスデータの値をnとすればよい。以上のようにして、遅延したデータを得ることができる。一般的に、プログラムbの中で仮想遅延メモリによりデータをnサンプリング周期だけ遅延したい場合には、そのデータが得られるステップで書込み命令によりアドレスデータxの示すアドレスに書き込み、遅延されたデータが必要なステップで読出命令によりアドレスデータ(x+n)の示すアドレスから読み出せばよい。ただし、仮想メモリにおける各データの遅延用の領域は、相互に重ならないように配置する必要がある。
上述したように、アドレスレジスタ232は、アドレスを変調するためのものである。例えば、楽音波形データにコーラス効果を付与したい場合、付番221〜231で説明した信号処理回路で低周波波形を生成し、その低周波波形のデータを内部バス229からアドレスレジスタ232に取り込み、そのデータを加算器254に入力して、遅延メモリの読出しアドレスを低周波波形で揺らす。これにより、読出しアドレスが変調され、楽音波形にコーラス効果を付与することができる。
遅延メモリ111のページ分けについて説明する。なお、遅延メモリのページ分けは、上述したMPメモリ214等のページ分けとは独立に行われる。実遅延メモリ111は64Kword/ページ単位(正確に言えば216=65536word/ページ)で32ページ分の領域に分けられている。各プログラムが利用できる仮想遅延メモリは最大16ページの大きさである。この仮想遅延メモリのページは、仮想ページアドレスvp=0,1,…,15で順に特定することができる。従って、加算器254の出力である22ビットの仮想アドレス(範囲制限前)は、上位6ビットが仮想ページアドレスvpに相当し、下位16ビットが仮想ページアドレスvpが示す仮想ページ内におけるアドレスa16に相当する。各プログラムbの仮想アドレス(範囲制限前)は、範囲制限部255で、そのプログラムに割当てられたメモリサイズBMS(b)に基づいて、仮想遅延メモリbの範囲(0〜最終アドレス)に入るよう制限され、(正式な)仮想アドレスに変換されるが、その詳細については後述する。そして、範囲制限部255から出力される20ビットの正式な仮想アドレスのうちの上位4ビットである仮想ページアドレスvpuがブロックページ(BP)テーブル217に供給され、実遅延メモリ111のページを示す5ビットの実ページアドレスrpに変換される。変換された実ページアドレスrpの下位に、範囲制限部255から出力される20ビットの仮想アドレスのうちの下位16ビットであるアドレスa16が付加され、実遅延メモリ111には、全21ビットからなる実アドレスが供給される。
ここで、図5を参照して、BMSテーブル216とBPテーブル217の構造について説明する。
図5(a)は、BMSテーブル216の詳細な構造を示す。BMSテーブル216は、時分割実行する最大8つの各プログラムが使用する遅延メモリ111の領域サイズを記憶するテーブルである。BMS(b)には、プログラムbが使用する仮想遅延メモリのメモリサイズ(実遅延メモリ111において当該プログラムbに割当てられた領域のサイズでもある)として、そのページ数を格納する。このページ数分の各ページは、使用仮想ページアドレスvpuで特定できる。例えば、BMS(b)=5であれば、当該プログラムは、使用仮想ページアドレスvpu=0,1,2,3,4の5ページ分を使用するということである。図5(c)の右段に示すように、実遅延メモリ111は64KWord/ページでページ分けされ、全体で32ページ(ページアドレス0〜31)ある。BMS(b)は、5ビットデータでページ数を表すが、上述したように1プログラムが利用する遅延メモリのページ数の最大値は16ページであるので、BMS(b)は実際には0〜16の値(0は遅延メモリを使用していないことを示す)を取る。なお、各プログラムbの使用仮想ページアドレスvpuは、上述した範囲制限部255の動作により0〜BMS(b)−1の範囲に入るよう制限されている。
図5(b)は、図2のBPテーブル217の詳細な構造を示す。BPテーブル217は、各ブロック毎、すなわち各プログラム毎に1枚のBPテーブルを持つ。BP(vpu)には、使用仮想ページアドレスvpuに対応する実ページアドレスを格納する。例えば、図5(c)では、BMS(0)=5であるので、プログラム0が使用する仮想遅延メモリ(実遅延メモリ111)のページ数は5ページであり、対応するプログラム0用BPテーブルでは要素BP(0)〜BP(4)が有効であることが分かる。また、例示したプログラム1用BPテーブルではBP(0)=4、BP(1)=5、BP(2)=6であるので、当該プログラム1は、仮想遅延メモリの使用仮想ページアドレス0,1,2を順に実遅延メモリ111の実ページアドレス4,5,6にマッピングして利用していることが分かる。このBPテーブルを用いた方式では、仮想ページアドレスを順番に進める必要がなく、仮想アドレスによるランダムアクセスに適している。すなわち、DSP110は、プログラムb中の各書込命令ないし読出命令に対応して供給される仮想アドレスが如何なるアドレスであっても、BPテーブルで対応する実アドレスに直ちに変換して遅延メモリ111に供給することができる。
再び図2に戻って、ステップ読出部240がブロックアドレスbをBMSテーブル216とBPテーブル217に出力すると、BMSテーブル216からは当該ブロックアドレスに対応するプログラムbが使用する遅延メモリのページ数BMS(b)が範囲制限部255とベースカウンタ253に出力され、BPテーブル217ではそのプログラムbに対応する1枚のBPテーブルが特定される。範囲制限部255は、加算器の出力である22ビットデータ(上位6ビットは仮想ページアドレスvp、下位16ビットは当該仮想ページ内アドレスa16)と使用ページ数BMS(b)とを入力し、仮想ページアドレスvpが使用ページ数BMS(b)より小さければそのまま、大きければ使用ページ数BMS(b)を減算して、使用仮想ページアドレスvpu(4ビット)としてBPテーブルに出力するとともに、ページ内アドレスa16(16ビット)を遅延メモリ111に実アドレスの下位16ビットとして出力する。
ここで、範囲制限部255による範囲制限前の仮想アドレス(vp、a16)から仮想アドレス(vpu、a16)への変換方式について詳しく説明する。加算器254には、ベースカウンタ253からのカウンタ値、アドレスメモリ215からのアドレスデータ、および、アドレスレジスタ232からのデータの3つが入力する。ここで、ベースカウンタ253からのカウンタ値は、各サンプリング周期のブロックアドレスがbである期間に注目すると、ベースカウンタ253のカウンタbから出力されるカウンタ値は、仮想遅延メモリbの最終アドレス(216×BMS(b)−1)から先頭アドレス(0)の間を、フリーランで、サンプリングクロック毎に1ずつカウントダウンしている。また、アドレスメモリ215からのアドレスデータは、プログラムb用であり、仮想遅延メモリbの範囲内に設定された値となっている。そして、アドレスレジスタ232からのデータは、遅延メモリにおけるデータの遅延時間を変調するためのデータであり、通常、その値はページサイズ(216)の100分の1以下である。(遅延時間の変調は、フェイザー、フランジャー、コーラスなどの音響効果処理において使用される。)
これらを勘案すると、加算器254から出力される仮想アドレス(範囲制限前)vpは、仮想遅延メモリbの最終アドレスの2倍のアドレス(217+α)から先頭アドレス(0−α)の範囲で変化する(αは遅延時間変調の最大振幅)。範囲制限部255では、仮想アドレス(範囲制限前)が最終アドレスから先頭アドレスの範囲にあるとき、その仮想アドレス(範囲制限前)をそのまま出力し、最終アドレスより大きくなったとき、その仮想アドレス(範囲制限前)から仮想メモリのサイズ(216×BMS(b))を減算した値を出力し、先頭アドレスより小さくなったとき(マイナス値となる)、その仮想アドレス(範囲制限前)に仮想メモリのサイズ(216×BMS(b))を加算した値を出力することにより、22ビットの仮想アドレス(vp、a16)を20ビットの仮想アドレス(vpu、a16)へと変換するようになっている。
なお、この実施例では、仮想メモリのサイズが216×BMS(b)であり、下位16ビットがオール0であることが保証されているので、上位6ビットについてのみ演算処理を行えばよい。具体的には、6ビットの仮想ページアドレスvpが、0〜BMS(b)−1の範囲内であればその下位4ビットを使用仮想ページアドレスvpuとして出力し、BMS(b)以上であればvp−BMS(b)を算出してその下位4ビットをvpuとして出力し、マイナス値であればvp+BMS(b)を算出してその下位4ビットをvpuとして出力する。そして、ページ内アドレスa16については、変換を行うことなく、そのまま出力すればよい。
MPメモリ214内の命令のうち遅延メモリにアクセスする命令を実行する場合、ステップ読出部240から出力されるブロックアドレスbで、BPテーブル217のうちの1枚が特定されている。従って、範囲制限部255から出力される上記使用仮想ページアドレスvpuをインデックスとして、当該BPテーブルからBP(vpu)を読出すことで、実遅延メモリ111の実ページアドレスrp(5ビット)を取得できる。さらに、範囲制限部255はページ内アドレスa16(16ビット)を出力するので、これらを合わせて遅延メモリ111のアドレス端子に入力させることにより、実際のアクセスが実現される。
図6は、プログラムの実行途中に、プログラムの変更指示に応じて、何れかのプログラムを削除し、新たなプログラムを設定して実行する場合の、BPテーブル217及び遅延メモリ111の使用状況の例を示す。611と621は最初の状態、612と622はプログラム1を削除した状態、613と623は新規にプログラム1を登録した状態を示す。太線で囲んだ部分は有意なデータを示す。最初の状態では、プログラム1に対応するBMS(1)=3とする。従って、611に示すように、プログラム1用BPテーブルは先頭から3ページ分の要素BP(0)〜BP(2)に有意な値が格納されている。BP(0)=4は、プログラム1が使用する第1ページ目(使用仮想ページアドレスvpu=0)が遅延メモリ111の実ページアドレス4のページに割当てられていることを示している。同様に、使用仮想ページ1は実ページ5に、使用仮想ページ2は実ページ6に、それぞれ割当てられている。従って、プログラム1は、これらの3ページを使用して、遅延したデータを取得する処理を行う。他のプログラムも同様であり、それぞれ割当てられた遅延メモリのページを使用して、遅延したデータを取得する処理を行う。上述したように、範囲制限部255により使用仮想ページアドレスvpuが遅延仮想メモリ内を示すように制限されているので、要素BP(3)〜BP(15)の値は特に気にしなくて良い。
プログラムの実行中に、斜線を付してあるプログラム1を削除する指示が来たとする。このとき、CPU101は、DSP110の制御レジスタに、プログラム1に対応するBMS(1)=0を設定するとともに、RAM103に設けられているMSテーブル(図示せず)に、開放したページ4、5、6に対応するMS(4)=0、MS(5)=0、MS(6)=0を書込む。ここで、MSテーブルは、遅延メモリ111の各実ページrpの使用状態MS(rp)(=0:未使用、1:使用中)を記憶するテーブルである。これにより、612に示すようにプログラム1用BPテーブルの全要素が開放され、622に示すように遅延メモリ111中でプログラム1が使用していたページが開放される。その他のプログラムは引き続き実行中であり、BMSテーブル216とBPテーブル217により遅延メモリ111の該当ページが使用されている。
次に、ブロック1で新たに実行すべきプログラム(新たなプログラム1)が指示された場合、CPU101は、新たに選択されたプログラムで使用する遅延メモリ111のページ数を見積もるとともに、RAM103上のMSテーブルを参照して(図8のステップ815)、その見積もったページ数だけ遅延メモリ111の空き状態のページを検出する。ここでは、5ページ分を使用するものとし、遅延メモリ111の実ページアドレスが若い方から実ページ4,5,6,9,10が空き状態であることが検出される。そこで、CPU101は、プログラム1に対応するBMS(1)=5と設定し、プログラム1用のBPテーブルを613に示すように設定し、さらにMSテーブルにページ4、5、6、9、10のMS(rp)=1を設定することにより、623の斜線に示すページの割当てを行う。これにより、実行中のプログラムに加えて、新たに選択されたプログラム1についても遅延メモリの割当てが為されて実行が開始される。
以上のようにして、プログラムの削除や追加や遅延量の変更などに伴う遅延メモリの領域割当ての変更を、他のプログラムの実行を止めることなく実施できる。この場合、遅延メモリ111中のページの断片化が発生することがあるが、断片化が発生しても問題なく動作が継続できる。
図7は、DSP110が行う各種ハードウェア処理のうちの、ステップ読出部240の各レジスタに関連した処理の手順を示す。この処理は、サンプリングクロックFsの入力毎に実行される。ステップ701でブロックアドレスb(レジスタ241)に0を設定し、ステップ702でSPテーブル212からSP(b)を取得して0か否かを判定する。0(YES)なら、プログラム0の命令コードの読出しと実行を行うために、ステップ703でページアドレスp(レジスタ243)を0にリセットし、ステップ704で、cnt(レジスタ242)を0から127までカウントアップし、MPメモリ214のページアドレスpのページから128ステップ分の命令コードを順次読出して実行する。ステップ705でPAテーブル211からPA(p)を取得して0か否かを判定し、0でないときは、プログラムpには次のページがあるということであるから、ステップ706でp(レジスタ243)にPA(p)を代入して、ステップ704に戻り、次のページの実行に入る。ステップ705でPA(p)が0(YES)のときは、そのページがプログラムbの最終ページであり、その実行が完了したということであるので、ステップ708に進む。
ステップ702でSP(b)が0でないときには(ただし、b=0)、ブロック0には何のプログラムも割当てられておらず、最初にプログラムが割当てられているブロックのアドレスがSP(b)であるということだから、ステップ707でb(レジスタ241)にSP(b)の値をセットし、ステップ709に進む。ステップ709で、b(レジスタ241)が8か否かを判定し、8であるとき(YES)はそのサンプリング周期の処理を終了する。8でないとき(NO)は、ステップ710でSPテーブル212からSP(b)を取得して0か否かを判定し、0のとき(YES)は、ブロックbは何れのプログラムにも割当てられていないということなので、ステップ708に戻り、ブロックアドレスbをインクリメントし、ステップ709に進む。ステップ710でSP(b)が0でないとき(NO)は、SP(b)はプログラムbの開始ページを示しているので、ステップ711に進み、ページアドレスp(レジスタ243)にそのSP(b)の値をセットして、ステップ704に進む。
図8は、図1のCPU101の処理を示す。図8(a)は、DSP110からのプログラムbの信号処理の消去を指示する消去イベントが発生したときの処理である。ステップ801で、DSP110にプログラムbの出力のミュートを指示する。ミュートの完了後、ステップ802で、SPテーブル212のSP(b)に0を書込んで当該プログラムの処理を停止する。なお、停止するのがプログラム0である場合、CPU101は、SP(1),SP(2),…を順に参照し、次に割当てられているプログラムのブロックアドレスを求め、そのブロックアドレスをSP(0)に書込む。また、b≠0であるSP(b)に0を書込んだ場合も、SP(0)がそのbの値と等しいかチェックし、等しい場合は、SP(b+1),SP(b+2),…を順に参照し、次に割当てられているプログラムのブロックアドレスを求め、そのブロックアドレスをSP(0)に書込む。ステップ803では、PAテーブル211に、プログラムbが使用していた1ないし複数ページp(ステップ802で0を書込む前のSP(b)からリンクされていた全てのページ)について次のページにリンクしないためのPA(p)=0を書込むが、このステップの処理は必須ではなくフェールセーフのためである。ステップ804では、RAM103上のBSテーブルに、ブロックbが何のプログラムにも割当てられていないこと(不使用)を示すBS(b)=0を書込み、ステップ805では、RAM103上のPSテーブルに、MPメモリ214中のプログラムbが使用していた1ないし複数ページpが開放されたこと(不使用)を示すPS(p)=0を書き込む。さらに、ステップ806では、ブロックbのプログラムの使用する遅延メモリ111のページ数BMS(b)を0にするとともに、遅延メモリ111中のプログラムbが使用していた1ないし複数ページrpが開放されたこと(不使用)を示すMS(rp)=0を書込む。ただし、プログラムbの使用ページ数が0の場合もあり、その場合にはこのステップで何もしなくてよい。
なお、BSテーブル、PSテーブル、及びMSテーブルは、CPU101側で状態管理するために使用するRAM103上のテーブルである。ブロックアドレスbに対し、BS(b)=1のとき当該ブロックbが既にプログラムに割当てられていること(使用中)を示し、BS(b)=0のとき当該ブロックbが未だ割当てられていないこと(未使用)を示す。ページアドレスpに対し、PS(p)=1のときMPメモリ214、係数メモリ213、およびアドレスメモリ215の各々の当該ページpが既にプログラムに割当てられていること(使用中)を示し、PS(p)=0のとき当該ページpが未だ割当てられていないこと(未使用)を示す。実ページアドレスrpに対し、MS(rp)=1のとき遅延メモリ111の当該実ページrpが既にプログラムに割当てられていること(使用中)を示し、MS(rp)=0のとき当該実ページrpが未だ割当てられていないこと(未使用)を示す。
図8(b)は、未使用のブロックbに新しく選択された信号処理の設定を指示する選択イベントが発生したときの処理である。この選択イベントは、CPU101がBSテーブルを参照して、ブロックbが空きであることが確認されている場合にのみ発行可能なイベントである。ステップ811では、選択された新信号処理のプログラムのサイズ(MPメモリ214上のページ数)をレジスタNPSに設定し、該プログラムが使用する遅延メモリのサイズ(遅延メモリ111上のページ数)をレジスタNMSに設定する。
ステップ812では、PSテーブルを参照して、レジスタNPSの示すページ数だけMPメモリ上の空きページp(係数メモリとアドレスメモリの空きページでもある)を検出して新信号処理のプログラムに割当て、PSテーブルに該ページpが割当済みであることを示すPS(p)=1を書込む。ステップ813では、PAテーブル211に、割当てたページpを順次リンクするようPA(p)を設定する。割当てたページをリンクする際の順番は任意でよいが、例えば、ページ番号の若い順にリンクするようにしてもよい。また、NPSが1のときは、当然ながらリンクは行われない。ステップ814で、新信号処理のプログラムの命令コードと係数データとアドレスデータを、それぞれ、ページサイズ(128ステップ)ずつに分割して、MPメモリ214と係数メモリ213とアドレスメモリ215の前記リンクされた複数ページ(ないし前記1ページ)に順次書込む。
次に、ステップ815で、MSテーブルを参照して、レジスタNMSの示すページ数だけ遅延メモリ111上の空きページrpを検出して新信号処理のプログラムに割当て、MSテーブルに該ページrpが割当済みであることを示すMS(rp)=1を書込む。ステップ816で、BMSテーブル216のBMS(b)にページ数NMSを書込み、ブロックbのBPテーブルのBP(0)〜BP(NMS−1)に割当てたページrpのページ番号を順次書込む。ステップ817で、遅延メモリ111の割当てたページrpの領域を全てゼロクリア(0を書込む)する。
ステップ818では、SPテーブル212のSP(b)に、ステップ813でリンクされた複数ページのうちの先頭ページ(ただし、NPSが1のときはリンクされない1ページ)の番号を書込む。このSPテーブルへのSP(b)の設定によって、DSP110内において、ブロックbに設定されたプログラムbのサンプリング周期毎の実行が開始される。ステップ819で、BSテーブルにブロックbに既にプログラムが割当てられていることを示すBS(b)=1を設定し、ミュート(ブロックbのプログラムの削除時にステップ801で設定したもの)を解除すると、DSP110からの当該プログラムbで処理された音響信号が出力される。
なお、上記実施形態では、遅延メモリのページ制御について、あるプログラムを削除して「新たなプログラム」をMPメモリに書込む例で説明したが、「新たなプログラム」を書込む場合に限定されるものではない。すなわち、「新たなプログラム」は、実行指示に先立ってMPメモリに書込まれているプログラムであってもよい。また、現在実行されているMPを、さらに「新たなプログラム」として実行指示し、複数回繰り返して実行させる場合も含む。
上記実施形態において、ユーザが、ユーザインターフェース(ディスプレイ107、マウス104、キーボード105等)を用いて、プラグインされているエフェクタを削除する操作を行ったときには、信号処理の消去イベントが生成され、図8(a)の処理が実行される。また、ユーザが、エフェクタラックのあるブロックで現在のエフェクタとは違うエフェクタを選択する操作を行ったときには、信号処理の消去イベントと選択イベントとが続けて生成され、図8(a)の処理と図8(b)の処理とが続けて実行される。
上記実施形態では、ステップ数は4096、ブロック数は8、ページ数は32、ページのサイズは128ステップであったが、それぞれ、任意の数値で設計することができる。
また、上記実施形態では、各ステップごとに遅延メモリ111の書込命令ないし読出命令を実行できるようになっていたが、遅延メモリ111のアクセス速度が遅い場合等に対応するために、数ステップに1回ずつ書込命令ないし読出命令が実行できるようにしてもよい。
101…CPU、102…フラッシュメモリ、103…RAM、104…マウス、105…キーボード、106…ハードディスク、107…ディスプレイ、108…その他I/O、109…波形入力部、110…DSP、111…遅延メモリ、112…波形出力部、113…CPUバス、201…制御レジスタ、211…ページ配置(PA)テーブル、212…スタートページ(SP)テーブル、213…係数メモリ、214…マイクロプログラム(MP)メモリ、215…アドレスメモリ、216…ブロックメモリサイズ(BMS)テーブル、217…ブロックページ(BP)テーブル、240…ステップ読出部、255…範囲制限部。