従来、ディレイ処理のディレイタイムを自動演奏のテンポに完全に同期させることができなかったのは、以下の理由による。まず、自動演奏を進行させる自動演奏制御処理は、一般的に、CPU(中央演算処理装置)により実行される。CPUは、ハードウェアタイマすなわちシステムクロックを、ゼロから、指定されたテンポの1拍を所定数分割、例えば480分割した時間に対応するシーケンスクロックカウント上限値まで、循環的にカウントするシーケンスクロックカウンタを実装する。このシーケンスクロックカウンタは、システムクロックのカウント値が、シーケンスクロックカウント上限値に達する毎に、シーケンスクロック割込みを発生する。CPUは、このシーケンスクロック割込みに同期して自動演奏を進行させる自動演奏制御処理を実行する。これに対して、ディレイ処理は、一般的に、デジタル音声処理を専用のハードウェアと専用のソフトウェアにより実行するDSP(デジタルシグナルプロセッサ)を用いて実現される。このディレイ処理におけるディレイタイムは、DSPにおいて、指定されたテンポの1拍に対して所定自然数倍又は所定自然数分の1倍の関係を有するように、例えば1/4拍、1/3拍、1/2拍、2/3拍、1拍、3/2拍、2拍、3拍などの値に設定される。このとき、ディレイタイムは、サンプリングクロックの何クロック分にあたるかというサンプル数で与えられる。DSPは、音響信号を1サンプルずつ記憶するディレイ用リングバッファメモリの書込みアドレスと読出しアドレスの差を、上記ディレイタイムのサンプル数に設定する。そして、DSPは、ディレイ用リングバッファメモリに書き込んだ音響信号を、上記ディレイタイムに対応するサンプル数分だけ遅延させて読み出すことによって、テンポの拍に同期したディレイ効果を実現する。ここで、DSPにおけるサンプリングクロックと、CPUにおけるシステムクロックは、それぞれ異なる発振子から生成されているため、従来は、ディレイ処理のディレイタイムを自動演奏のテンポに完全に同期させることができなかった。この結果、従来例えば、ディレイ処理で出力される音響信号を入力側にフィードバックして音響信号の書込みと遅延読出しを繰り返す、いわゆるサンプルルーパー等の処理を実行したような場合に、自動演奏のテンポがディレイ処理後の音響信号のテンポからずれていってしまい、聴感上違和感を生じてしまっていた。
本実施形態は、以下に説明する動作を実行するディレイタイム割込み発生処理と、シーケンスクロック補正処理の機能を備える処理同期部を、例えば第1又は第2の音響処理プロセッサ内に実装することにより、CPUにおける自動演奏制御処理をDSPにおけるディレイ処理に同期させることを可能とするものである。
ディレイタイム割込み発生処理は、例えばDSPにより実行される。まず、DSP内に、サンプリングクロックをゼロからディレイタイムサンプリング数まで循環的にカウントするディレイタイムカウンタが実装される。このディレイタイムカウンタは、サンプリングクロックのカウント値がカウント上限値であるディレイタイムサンプリング数に達する毎に、CPUに対してディレイタイム割込みを発生させる。
一方、シーケンスクロック補正処理は、例えばCPUにより実行される。この処理において、CPUは、前述のシーケンスクロック割込みがディレイタイムに対応する回数だけ発生する毎の時刻と、DSPからディレイタイム割込みが発生する毎の時刻との時間差を計測する。そして、CPUは、その時間差が小さくなるように前述のシーケンスクロックカウンタにセットするシーケンスクロックカウント上限値を増加又は減少させる。この結果、次回のディレイ処理においては、CPUにおいてディレイタイム分だけ進行する自動演奏の時間と、DSPにおけるディレイタイム分のディレイ処理の時間とのずれが無くなることが期待される。
上述の機能を実現する本発明を実施するための形態について、図面を参照しながら以下に詳細に説明する。図1は、本発明による電子鍵盤楽器の実施形態の外観図である。本実施形態は、音響処理プロセッサ(CPUとDSP)間の処理同期装置を備えた電子楽器である電子鍵盤楽器100として実施される。電子鍵盤楽器100は、発生すべき楽音の音高を指定する演奏操作子としての複数の鍵からなる鍵盤101と、楽音にディレイ効果を与えるエフェクト機能を指定するための機能選択操作子102と、伴奏やシーケンサ、オートアルペジオなどの自動演奏機能や音色選択操作子としての音色選択を行うための音色選択ボタン103からなるスイッチ・パネルと、ピッチベンドやトレモロ、ビブラート等の各種モジュレーション(演奏効果)を付加するベンダ/モジュレーション・ホイール104、及び音色や音色以外の各種設定情報を表示するLCD(Liquid Crystal Display:液晶ディスプレイ)105等を備える。また、電子鍵盤楽器100は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、又は背面部等に備える。
機能選択操作子102は、図1に示されるように、テンポ(TEMPO)を指定するためのDOWNボタン、UPボタン、ディレイ効果を与えるエフェクト機能(DELAY)を指定するためのHOLDボタン、TIMEノブ、REPEATノブ、LEVELノブ、SYNCボタン、及びBEATノブを備える。これらの詳細については後述する。
図2は、図1の電子鍵盤楽器100の実施形態のハードウェア構成例を示す図である。図2において、電子鍵盤楽器100は、CPU(中央演算処理装置)201、CPU ROM(リードオンリーメモリ)202、CPU RAM(ランダムアクセスメモリ)203、音源LSI(大規模集積回路)204、キー・スキャナ211、A/Dコンバータ212、及びMIDI I/F((Musical Instrument Digital Interface Interface)214が、それぞれシステムバス216に接続される構成を備える。CPU201にはシステムクロックを供給する発振子209が接続され、音源LSI204にはサンプリングクロックを供給する発振子210が接続される。音源LSI204は、波形発生器205とDSP206とCPU I/F215を内蔵する。波形発生器205には、波形メモリである音源ROM207が接続される。DSP206には、遅延メモリであるDSP RAM208が接続される。本実施形態においては、このDSP206及びDSP RAM208により、第1の処理部206aを構成する。キー・スキャナ211には、図1の鍵盤105と図1の機能選択操作子102及び音色選択ボタン103からなるスイッチ・パネルとが接続される。A/Dコンバータ212には、図1のベンダ/モジュレーション・ホイール104が接続される。LCDコントローラ213には、図1のLCD105が接続される。LCDコントローラ213、MIDI I/F214は、MIDI入力を受け付ける。また、音源LSI205内のDSP206から出力されるデジタル楽音波形データは、D/Aコンバータ217によりアナログ楽音波形信号に変換され、アンプ218で増幅された後に、特には図示しないスピーカ又は出力端子から出力される。
CPU201は、CPU RAM203をワークメモリとして使用しながらCPU ROM202に記憶された制御プログラムを実行することにより、図1の電子鍵盤楽器100の制御動作を実行する。CPU201は、システムバス216からキー・スキャナ211又はA/Dコンバータ212を介して、図1の鍵盤101、機能選択操作子102、音色選択ボタン103、ベンダ/モジュレーション・ホイール104等の演奏指示を受け取る。または、CPU201は、MIDI I/F214を介して、外部の図示しない機器から、演奏指示を示すMIDI入力を受け取る。CPU201は、これらの演奏指示に基づいて、音源LSI204に対して、楽音の発音/消音の指示、ディレイ効果の付与指示等を出力する。また、CPU201は、CPU ROM202に記憶された自動演奏データに基づいて、自動演奏による楽音の発音/消音の指示等を出力する。
本実施形態においては、このCPU201により第1の処理部を構成する。
音源LSI204に内蔵される波形発生器205は、CPU201からの楽音の発音/消音指示に従って、波形メモリである音源ROM207から楽音波形データを読出し、DSP206に音響信号として供給する。
音源LSI204に内蔵されるDSP206は、波形発生器205から入力する楽音波形データに対して、DSP RAM208を遅延メモリとして使用しながらディレイ効果を付加し、その結果得られる楽音波形データをD/Aコンバータ217に出力する。ディレイ効果の設定は、CPU201から設定される。
音源LSI204に内蔵されるCPU I/F215は、CPU201との間の各種データの通信および割込み指示を処理する。CPU I/F215により、CPU201からはDSP206が単なるメモリとして見え、DSP206からもCPU201がメモリとして見えるように制御される。一方がメモリに書込みを行うと、他方がそれを読むことができる仕組みになっている。
発振子209は、CPU201に対して基準クロックであるシステムクロックを供給する。発振子210は、音源LSI204内の波形発生器205及びDSP206に対してサンプリングクロックを生成するための基準クロックを供給する。音源LSI204が内蔵する波形発生器205及びDSP206は、音源LSI204専用の発振子210からサンプリングクロックを生成するための共通の基準クロックが供給されるため、完全に同期して動作する。一方、CPU201は、専用の発振子209からシステムクロックを供給されて動作する。このため、CPU201の動作は基本的には、波形発生器205及びDSP206の動作とは同期しない。しかしながら、本実施形態では、後述する処理同期機能により、CPU201が実行する自動演奏制御処理のテンポは、DSP206が実行するディレイ処理におけるディレイタイムに同期するように制御される。
本実施形態においては、発振子210により第1のクロック発生部を構成し、発振子209により第2のクロック発生部を構成する。
キー・スキャナ207は、鍵盤105や機能選択操作子102又は音色選択ボタン103等のスイッチ・パネルの状態を走査して、CPU201に通知するIC(集積回路)である。A/Dコンバータ208は、ベンダ/モジュレーション・ホイール104の操作位置を示すアナログ信号をデジタル信号として検出するICである。LCDコントローラ209は、LCD105を制御するICである。
図3は、図2のCPU201が内蔵するカウンタ回路の構成例を示す図である。CPU201は、発振子209が発振するシステムクロックを分周して計数を行うシーケンスクロックカウンタ301と、時計として時刻を参照するためのフリーランニングタイマカウンタ302を内蔵する。これらのタイマカウンタは共に、1μsec(マイクロ秒)単位で値をインクリメントする。シーケンスクロックカウンタ301は、発振子209が発振するシステムクロックを、ゼロから、指定されたテンポの1拍を480分割した時間に対応するシーケンスクロックカウント上限値まで、循環的にカウントする。シーケンスクロックカウンタ301は、システムクロックのカウント値がシーケンスクロックカウント上限値に達する毎に、CPU201に対してシーケンスクロック割込みを発生する。シーケンスクロックカウンタ301は、カウント値がシーケンスクロックカウント上限値に達すると、カウント値を0に戻って係数を循環的に繰り返す。
本実施形態においては、このシーケンスクロックカウンタ301が第2のカウンタに対応し、シーケンスクロックカウント上限値が第2のカウント値に対応する。
CPU201は、シーケンスクロックカウンタ301が発生させるシーケンスクロック割込みに同期して、自動演奏を進行させる自動演奏制御処理を実行する。すなわち、自動演奏制御処理は、指定されたテンポの1拍を480分割したシーケンスクロック割込みを基準として動作する。テンポの1拍の間に480回のシーケンスクロック割込みのトリガ信号が発生され、それに併せて自動演奏が進行する。演奏のテンポは、このシーケンスクロック割込みの発生頻度に依存する。自動演奏のテンポは、図1の機能選択操作子102中のTEMPOエリアのDOWNボタン102a又はUPボタン102bによって、上下させることができる。このDOWNボタン102aおよびUPボタン102bにより、本実施形態においては、テンポ指定部を構成する。テンポは、最低値30BPM(Beat Per Minute)から、1BPM刻みで、最高値300BPMまで設定できる。これに同期して、シーケンスクロック割込みの時間間隔が決定される。
フリーランニングタイマカウンタ302は、32ビットのデータ幅を持ち、最大値を超えると0に戻って計数を繰り返す時計であり、参照した時点の時刻をカウンタ値で知ることができる。CPU201は、後述するように、シーケンスクロック割込みが音源LSI204内のDSP206で実行されるディレイ処理において設定されているディレイタイムに対応する回数だけ発生する毎に、フリーランニングタイマカウンタ302を参照することにより、各発生時刻を取得してDSP206におけるディレイ処理との同期制御を実行する。
次に、音源LSI204内での音響信号の流れについて説明する。図2に示されるように、波形発生器205から出力される音響信号は、DSP206に送られて、このDSP206内でディレイ効果を付加される。波形発生器205から出力される音響信号のうち、ユーザ(演奏者)による鍵盤101の演奏に基づいて波形発生器205で生成される音響信号に対してディレイ効果が付加される。一方、CPU201による自動演奏制御処理に基づいて波形発生器205で生成される音響信号については、ディレイ効果が付加されずにDSP206の出力段でディレイ効果が付加された音響信号と混合されて出力されてもよいし、ディレイ効果が付加されてもよい。音源LSI204内部での音響信号の受け渡し、及びDSP206から出力される音響信号はいずれも、同じサンプリングクロックに基づいて例えば44.1KHz(キロヘルツ)というサンプリング周波数でサンプリングされ、処理される。このサンプリングクロックは、音源LSI204に接続される発振子210が発生させる基準クロックを音源LSI204内部で分周することにより生成されており、発振子210の発振周波数とサンプリング周波数は完全に比例関係にある。発振子210の発振周波数に変動が起これば、同じ比率でサンプリング周波数に影響が及ぶ。
音源LSI204内の波形発生器205は、一般的な波形読出し方式による楽音波形の生成機能を備える。具体的には、波形発生器205は、波形メモリとして機能する音源ROM207から、CPU201から予め指示された種別の楽音波形データを、CPU201から逐次指定されるノートオン指示で指定された音高に対応する読出し速度で補間を行いながら読み出すことにより、音響信号を生成する。
図4(a)は、音源LSI204内のDSP206が実行するディレイ処理の機能ブロック図である。まず、波形発生器205から入力された音響信号407が分岐させられ、一方はダイレクトに出力側の加算器406へ送られ、もう一方はアンプ402及び加算器405から遅延装置401に送られ、遅延処理が実行される。遅延装置401の出力は、アンプ403を介して加算器406で、原音である上記ダイレクトの音響信号407と混合される。このときの原音に対する遅延音のレベルは、ディレイ入力音量調整用のアンプ402とディレイ出力音量調整用のアンプ403によって調整することができる。遅延装置401の出力はフィードバック量調整用のアンプ404によって設定された量だけ、加算器405を介して遅延装置401の入力側にフィードバックすることができる。アンプ404における増幅率を1.0倍に近づけるほど、音響信号のリピート回数が多くなる。
また、このディレイ処理にはディレイホールドモードという特殊モードが用意されている。ユーザが図1の機能選択操作子102内のHOLDボタンを押下してそのLEDを点灯させることにより、ディレイホールドモードが設定される。この状態になると、フィードバック量調整用のアンプ404のゲインは1.0倍となり、ユーザが再びHOLDボタンを押下してそのLEDを消灯させてこの状態を解除するまで、遅延装置401が出力する遅延された音響信号を減衰させずに永遠に繰り返し出力することができる。このモードがオンされた瞬間に、通常1.0倍に設定されているディレイ入力音量調整用のアンプ402の増幅率は0倍に設定され、それ以降入力された音響信号407にディレイ効果がかからない状態になる。その結果、このモードがオンされる直前まで遅延装置401に入力していた音響信号が遅延装置401で繰り返し遅延させられる音響信号と、入力された音響信号407を加算器406でそのまま混合した音響信号が出力される。この機能は、いわゆるサンプルルーパーと呼ばれる。
図4(b)は、図4(a)の遅延装置401の説明図である。遅延装置401は、DSP206がDSP RAM208にアクセスする機能として実現される。DSP RAM208は、ディレイ用リングバッファメモリとして動作し、概念的にはリングバッファと呼ばれる形式で管理され、バッファエリアの最終アドレス414のメモリ領域は先頭アドレス413のメモリ領域と仮想的に連続しているように、最終アドレス414の次のアドレスにおいて、アドレスを指定するライトポインタ410及びリードポインタ411の値の折り返しが行われる。このディレイ用リングバッファメモリ上のライトポインタ410の値が示す書込みアドレスとリードポインタ411の値が示す読出しアドレスを一定の間隔で設定しておき、サンプリングクロックの一周期ごとに、各ポインタの値を1アドレスずつインクリメントし、加算器405から入力された音響信号の値の書込みと、出力側に送る音響信号の値の読出しが行われる。また、図4(c)に示されるように、ディレイ用リングバッファメモリにおいて、ライトポインタ410又はリードポインタ411が最終アドレス414を指し示している場合、次に指し示すのは先頭アドレス413となる。このアドレス移動は、機器が動作している限り無限に繰り返される。
この結果、図4(b)又は(c)に示されるように、上記書込みが行われてから読出しが行われるまでディレイ用リングバッファメモリ上の各アドレスに一時記憶されている音響信号の各16ビットの波高値が、遅延中の音響信号412となる。また、上記ライトポインタ410とリードポインタ411の相対的なアドレス差が、遅延量を示すディレイタイムとなる。1アドレス離れるごとに、下記(1)式で示される遅延が発生する。
(1÷44.1KHz)sec≒約22.7μsec ・・(1)
本実施例では、例えば、300000×2バイト(300000ワード)のディレイ用リングバッファメモリを有し、1サンプルは1ワード(2バイト=16ビット)なので、最大で22.7μsec×300000≒約6.8secのディレイタイムが実現できる。例えば、1secのディレイタイムを発生させたい場合には、ライトポインタ410はリードポインタ411よりも、44.1KHz×1000×1sec=44100アドレス少ない値に設定しておけば良い。図4(b)又は(c)に示される設定例では、ディレイ用リングバッファメモリの約1/4の記憶領域が遅延中の音響信号412となっているため、6.8sec÷4=約1.7secのディレイタイムが発生するように設定されている。従って、ライトポインタ410とリードポインタ411の差は、44100×1.7sec=74970アドレスとなる。
上述のディレイタイムを含むディレイ効果指定は、図1の機能選択操作子102のDELAYエリアに示される操作子群によって、下記のように行うことができる。
・SYNCボタン(LEDインジケータ付き):この操作子により、ディレイタイムをテンポに同期させるモードであるディレイテンポシンクロナイズドモードを使用するか否かが切り替えられる。ユーザは、このモードをオンした場合には、後述するBEATノブにより、ディレイタイムをテンポに同期させる設定を行うことができるようになる。なお、このモードがオフの場合には、ディレイタイムは後述するTIMEノブにより自由な値に設定することができる。
・HOLDボタン(LEDインジケータ付き):この操作子により、前述のディレイホールドモードを使用するか否かが切り替えられる。
・BEATノブ:ディレイテンポシンクロナイズドモードがオンされたときに、この操作子により、ディレイタイムがテンポの何拍に同期するかを設定する。ノブの位置に応じて、設定値0(1/4拍)、設定値1(1/3拍)、設定値2(1/2拍)、設定値3(2/3拍)、設定値4(1拍)、設定値5(3/2拍)、設定値6(2拍)、設定値7(3拍)の8種類から選択できる。ディレイテンポシンクロナイズドモードがオフのときには、BEATノブの操作は無視される。
・TIMEノブ:ディレイテンポシンクロナイズドモードがオンされないときに、この操作子により、ディレイタイムが直接指定される。例えば、0〜12316(2sec)の間で調整できる。ディレイテンポシンクロナイズドモードがオンのときには、TIMEノブの操作は無視される。
・REPEATノブ:ディレイホールドモードがオンされていないときに、この操作子により、ディレイのフィードバック量が調整される。ここで指定された値により、図4(a)のフィードバック量調整用のアンプ404のゲインが決定される。ディレイホールドモードがオンのときには、上記フィードバック量は強制的に100%に設定される。
・LEVELノブ:この操作子により、ディレイ信号のレベルが調整される。ここで指定された値により、図4(a)のディレイ出力音量調整用のアンプ403のゲインが決定される。
上記BEAT、TIME、REPEAT、LEVELの4つのノブは、割り当てられたパラメータの値を、設定位置(角度)に応じて最大値と最小値の間で設定することができる。例えば中央の位置に操作すれば最大値と最小値の中央の値に設定される。
次に、本実施形態においてCPU201が実行する自動演奏制御処理を音源LSI204内のDSP206が実行するディレイ処理に同期させるための制御動作について説明する。前述したように、CPU201が実行する自動演奏制御処理のタイミングは、CPU201内のシーケンスクロックカウンタ301が、発振子209からのシステムクロックを、指定されたテンポ(BPM)の1拍を480分割した時間に対応するシーケンスクロックカウント上限値まで循環的にカウントする毎に発生するシーケンスクロック割込みに基いて、制御される。ここで、ディレイテンポシンクロナイズドモード、すなわちディレイタイムを指定されたテンポに同期させるモードが指定されたときには、CPU201が、DSP206が実現する遅延装置401(図4(a)参照)に設定されるサンプリングクロックに同期したディレイタイムと、上記シーケンスクロック割込みに同期したディレイタイムに対応する時間とのずれを逐次監視して、そのずれを補正するようにシーケンスクロック割込みの発生タイミングを調整しながら動作する。音源LSI204が発生するサンプリングクロックをそのまま自動演奏制御処理の基準クロックとして使用することも理論的には可能である。しかし、現実的には44.1KHzというサンプリングレート、すなわち22.7μsecという単位で1拍を480分の1に分割したシーケンスクロック割込みに変化をつけるには精度が荒すぎるのと、CPU201が生成した1μsec単位でされたシステムクロックとの差が広がって認識可能なレベルになるのは数10拍も演奏してからの現象であることを考えると、ディレイ処理と自動演奏制御処理とを別々のクロックで動作させて、随時補正するのが現実的であると考えられる。そこで、本実施形態では、ディレイテンポシンクロナイズドモードにおいて指定されたテンポに対して自然数倍又は自然数分の1倍の関係を有するように設定されたディレイタイムについて、DSP206上でサンプリングクロックを単位として計測した時間と、CPU201上でシーケンスクロック割込みの回数として計測した時間とを、CPU201が比較する。そして、CPU201で計測された時間のほうが、遅れている場合はシーケンスクロックカウンタ301のカウントが上限に達するシーケンスクロックカウント上限値を減少させてシーケンスクロック割込みのタイミングを少し速め、逆に進んでいる場合はシーケンスクロックカウント上限値を増加させてシーケンスクロック割込みのタイミングを遅くすることにより、徐々に近づくような調整操作を自動的に行う。
ディレイ時間と音楽の周期が一致するだけでなく、音楽とディレイ効果によって発音する1つ1つの楽音の位相が合わなければ音楽的には成立しないが、本実施形態での上記調整操作により、ディレイの周期が合うだけでなく、位相も一致させることができる。
図5(a)は、CPU ROM202が記憶するテンポ−カウントテーブル(以下「TEMPO_COUNT_TBL」とも表記する)のデータ構成例を示す図であり、また、図5(b)は、TEMPO_COUNT_TBLの説明に使用する補助情報テーブルのデータ構成例を示す図である。なお、補助情報テーブルは、本実施形態においてTEMPO_COUNT_TBLを説明する便宜上図示したものであり、実装されるものではない。図5(a)に例示されるTEMPO_COUNT_TBLは、TEMPO、DELAY_COUNT、SEQ_CLOCK_COUNTの各項目を有する。TEMPO_COUNT_TBLの各行は、30〜300(BPM:Beat Per Minute、時間1分あたりの拍数)まで1刻みで指定されるTEMPO項目値の各々について、DELAY_COUNT項目値とSEQ_CLOCK_COUNT項目値が設定されるエントリを示している。なお、以下の説明では、TEMPO項目、DELAY_COUNT項目、又はSEQ_CLOCK_COUNT項目の各値そのものを、TEMPO、DELAY_COUNT、又はSEQ_CLOCK_COUNTと表記する場合もある。
DELAY_COUNTは、DSP206(図2)内の遅延装置401(図4(a)参照)に設定されるディレイタイムを指定されたテンポ値(TEMPO)の1拍に同期させたときに、そのディレイタイムを音源LSI204に接続される図2の発振子210に基づいて生成されるサンプリングクロックでカウントしたときの、サンプリングクロック数を示している。例えばサンプリングクロックの周波数を44.1KHzとすれば、TEMPO_COUNT_TBLのTEMPO毎のエントリに設定されるDELAY_COUNTは、下記(2)式により計算される値である。
DELAY_COUNT=
(60/TEMPO)/{(1/(44.1×1000)} ・・(2)
SEQ_CLOCK_COUNTは、CPU201に接続される発振子209からのシステムクロックによりカウントアップされるCPU201内のシーケンスクロックカウンタ301(図3)が発生する、指定されたテンポ値(TEMPO)の1拍を480分割するシーケンスクロック割込みの発生に要する、システムクロック数を示している。システムクロックの1周期を例えば1μsecとすれば、SEQ_CLOCK_COUNTは、1シーケンスクロックをCPU201のシステムクロックでカウントしたときの所要時間(μsec)となる。TEMPO_COUNT_TBLのTEMPO毎のエントリに設定されるSEQ_CLOCK_COUNT(μsec)は、下記(3)式により計算される値である。
SEQ_CLOCK_COUNT=
{(60/TEMPO)/480}×1000000 ・・(3)
次に、図5(b)の補助情報1は、DELAY_COUNTが示すサンプリングクロック数分をサンプリングするのに要する所要時間、すなわちDSP206におけるサンプリングクロックを基準としたディレイタイムの時間(msec)を示す。この補助情報1は、図5(a)に例示されるTEMPO_COUNT_TBLのDELAY_COUNT値を用いて、下記(4)式により計算される。
補足情報1=
{1/(44.1×1000)×DELAY_COUNT×1000 ・・(4)
次に、図5(b)の補助情報2は、上記補助情報1として算出されるDELAY_COUNTのサンプリング所要時間と、CPU201内でのシーケンスクロック割込みで1拍分をカウントしたときの所要時間の時間差(msec)を示す。すなわち、ディレイタイムを指定されたテンポ値TEMPOの1拍に同期させた場合における、DSP206におけるサンプリングクロックを基準としたときの所要時間と、CPU201におけるシーケンスクロック割込みを基準としたときの所要時間との時間差である。この補助情報2は、上記補助情報1(msec)と、図5(a)に例示されるTEMPO_COUNT_TBLのSEQ_CLOCK_COUNT値(μsec)とを用いて、下記(5)式により計算される。
補足情報2=補足情報1−
(SEQ_CLOCK_COUNT/1000)×480 ・・(5)
更に、図5(b)の補助情報3は、指定されたテンポ値TEMPOの1拍に同期するディレイタイムについて算出された上記時間差の、4分の4拍子で32小節分の自動演奏楽曲が演奏された場合における累積値を示す。この補助情報3は、上記補助情報2を用いて、下記(6)式により計算される。
補足情報3=補足情報2×4×32 ・・・(6)
図5(b)において、補助情報2から知見されるように、指定されたテンポ値TEMPOの1拍に同期するディレイタイムの1ディレイ程度では、DSP206のサンプリングクロックに基づく制御と、CPU201でのシーケンスクロック割込みに基づく制御とでは、大きな時間差は生じない。しかし、例えばディレイホールドモードにして前述したサンプルルーパーが実施されるような場合においては、ディレイされた音響信号が何小節にもわたって繰返し使用される。このような場合には、補助情報3から知見されるように、人間の耳で認識できるほどの大きな時間差が生じることがわかる。また、これは発振子の精度は無視した理論値であり、実際には上記の誤差発振の精度(±0.1%〜±0.001%)程度の差を加えて考える必要がある。
上記(5)式及び(6)式の関係より、図5(b)の補助情報2又は3においてプラス値が発生した場合には、CPU201におけるシーケンスクロックに基づくディレイタイムのカウント値SEQ_CLOCK_COUNTのほうが、DSP206におけるサンプリングクロックに基づくディレイタイムのカウント値DELAY_COUNTよりも大きいことを示している。従って、この場合にはSEQ_CLOCK_COUNTの値を上記プラス値の分だけ減少させれば、次回のディレイ処理時に、DSP206のサンプリングクロックに基づく制御とCPU201でのシーケンスクロック割込みに基づく制御との間の時間差が0に近づくことが期待できる。
一方、補助情報2又は3において、マイナス値が発生した場合には、CPU201におけるシーケンスクロックに基づくディレイタイムのカウント値SEQ_CLOCK_COUNTのほうが、DSP206におけるサンプリングクロックに基づくディレイタイムのカウント値DELAY_COUNTよりも小さいことを示している。従って、この場合にはSEQ_CLOCK_COUNTの値を上記マイナス値だけ増加させれば、次回のディレイ処理時に、DSP206のサンプリングクロックに基づく制御とCPU201でのシーケンスクロック割込みに基づく制御との間の時間差が0に近づくことが期待できる。
以上の制御処理を実現するために、本実施形態はまず、DSP206内に、CPU201に対してディレイタイム割込みを発生する機構と、DSP206に接続されるDSP RAM208にアクセスするためのアドレスポインタを生成する機構とを備える。図6は、DSP206が備えるディレイタイム割込み発生処理を実行する機構及びディレイ処理のためのアドレスポインタを生成する機構の例を示すブロック図である。図6において、DSP206は、ディレイタイムカウンタ601と、ディレイタイムサンプリング数レジスタ602と、符号反転器603と、加算器604と、ライトポインタ生成部605と、アドレス折返し部606と、データアクセス部607とを備える。
本実施形態においては、このディレイタイムカウンタ601が第1のカウンタを構成している。
さらに、DSP206内の符号反転器603と、加算器604と、ライトポインタ生成部605と、アドレス折返し部606と、データアクセス部607と、このDSP206に接続されるDSP RAM208とにより、音響効果回路610を構成する。
ユーザが図1の機能選択操作子102のDELAYエリアのSYNCボタンを押下してLEDインジケータを点灯させると、ディレイタイムをテンポに同期させるディレイテンポシンクロナイズドモードが設定される。このモードの場合、CPU201はまず、CPU ROM202に記憶されている図5(a)に例示されているTEMPO_COUNT_TBLのユーザによって指定されたテンポ値がTEMPO項目に設定されているエントリから、DELAY_COUNT項目値、すなわち、ディレイタイムを指定されたテンポ値(TEMPO)の1拍に同期させたときのサンプリングクロック数を取得する。ただし、このDELAY_COUNTは、指定されたテンポの1拍と同期させた場合の基準値であるので、CPU201は実際には、機能選択操作子102のDELAYエリアのBEATノブで設定された同期拍数の分周比率である、1/4拍、 1/3拍、 1/2拍、 2/3拍、1拍、 3/2拍、2拍、3拍のいずれかをDELAY_COUNTに乗算することにより、指定されたテンポの指定された同期拍数のディレイタイムに対応するディレイタイムサンプリング数608を算出する。例えば、同期拍数として1/2拍が指定されれば、CPU201は、DELAY_COUNTに1/2を乗算する。
CPU201は、以上のようにして算出したディレイタイムサンプリング数608を、システムバス216、CPU I/F215、及び音源LSI204を介して、DSP206内のディレイタイムサンプリング数レジスタ602にセットする。
ディレイタイムサンプリング数レジスタ602にセットされたディレイタイムサンプリング数608は、ディレイタイムカウンタ601にカウント上限値としてセットされる。ディレイタイムカウンタ601は、サンプリングクロックをゼロからディレイタイムサンプリング数608まで循環的にカウントするカウンタであり、サンプリングクロックのカウント値がこの上限値に達する毎にCPU201に対してディレイタイム割込み609を発生させて、同期拍数の値に設定されたディレイタイムが一周期経過したことを知らせ、その後カウント値を0にリセットしてカウント動作を繰り返す。
本実施形態においては、このディレイタイムカウンタ601のカウント上限値が第1のカウンタ値に相当する。
ライトポインタ生成部605は、図4(b)及び(c)で説明したライトポインタ410を生成する部分である。ライトポインタ生成部605は、サンプリングクロックに従って図4の先頭アドレス413から最終アドレス414まで+1ずつ値が増加するアドレス値を生成し、このアドレス値が最終アドレス414に達すると次にこのアドレス値を先頭アドレス413に戻し、以後同様の動作を繰り返す。このようにして生成されたライトポインタ410のアドレス値が、DSP206に接続されるDSP RAM208(図2参照)に、書込みアドレスとして供給される。
ディレイタイムサンプリング数レジスタ602にセットされたディレイタイムサンプリング数608は、符号反転器603でマイナス値に変換された後、加算器604に入力する。加算器604は、ライトポインタ生成部605が生成したライトポインタ410の値にディレイタイムサンプリング数608のマイナス値を加算、すなわち、ライトポインタ410の値からディレイタイムサンプリング数608の値を減算することによって、図4(b)及び(c)で説明したリードポインタ411を生成する。アドレス折返し部606は、リードポインタ411の値が図4(c)の先頭アドレス413の値未満となった場合に、リードポインタ411の値に(最終アドレス414の値−先頭アドレス413の値+1)を加算することにより、最終アドレス414に近い側のアドレスに折り返す。このようにして最終的に生成されたリードポインタ411のアドレス値が、DSP206に接続されるDSP RAM208に、読出しアドレスとして供給される。
データアクセス部607は、サンプリングクロック毎に、ライトポインタ生成部605からDSP RAM208に供給される書込みアドレスに波形発生部205から供給される音響波形信号及びDSP RAM208から読み出された音響波形信号の少なくとも一方を書き込み、アドレス折返し部606からDSP RAM208に供給される読出しアドレスから音響波形信号を読み出してD/Aコンバータ217(図2参照)に出力する(図4(b)又は(c)参照)。これにより、図4(a)の遅延装置401の機能が実現される。このように、DSP206は、波形発生器205(図2参照)から入力される音響信号に対して、上述の遅延装置401の動作を含む図4(a)のブロック図で示される処理を実行し、加算器406から出力される音響信号を、出力408としてD/Aコンバータ217に出力する。
上述のDSP206の構成に加えて、本実施形態では、CPU201内に、シーケンスクロック補正処理を実行する機構を備える。前述したディレイテンポシンクロナイズドモードの場合、CPU201はまず、CPU ROM202に記憶されている図5(a)に例示されているTEMPO_COUNT_TBLのユーザによって指定されたテンポ値がTEMPO項目に設定されているエントリから、SEQ_CLOCK_COUNT項目値、すなわち、指定されたテンポ(TEMPO)の1拍を480分割するシーケンスクロック割込みの発生に要するシステムクロック数(μsec)を取得し、CPU201内のシーケンスクロックカウンタ301(図3参照)にシーケンスクロックカウント上限値としてセットする。前述したように、シーケンスクロックカウンタ301は、発振子209が発振するシステムクロックを、ゼロからシーケンスクロックカウント上限値まで循環的にカウントする。シーケンスクロックカウンタ301は、システムクロックのカウント値がシーケンスクロックカウント上限値に達する毎に、CPU201に対してシーケンスクロック割込みを発生させて、指定テンポの1拍を480分割したシーケンスクロック周期が経過したことを知らせ、その後カウント値を0にリセットしてカウント動作を繰り返す。
CPU201は、機能選択操作子102のDELAYエリアのBEATノブで設定された設定値に対応する同期拍数に応じた回数のシーケンスクロック割込みをシーケンスクロックカウンタ301から受けると、その時点の時刻をフリーランニングタイマカウンタ302(図3)のカウンタ値として読み取って記録する。CPU201は、この回数を、CPU ROM202が記憶する同期拍数テーブルから読みとる。図7(a)は、この同期拍数テーブル(以下「SYNC_BEAT_TBL」とも表記する)のデータ構成例を示す図である。また、図7(b)は、SYNC_BEAT_TBLの説明上使用する補助情報テーブルのデータ構成例を示す図である。図5(b)の補助情報テーブルと同様に、図7(b)の補助情報テーブルも、本実施形態においてSYNC_BEAT_TBLを説明する便宜上図示したものであり、実装されるものではない。ユーザが、BEATノブで、8種類の同期拍数の設定値0、1、2、3、4、5、6、7のうちのいずれか1つを設定すると、CPU201は、その設定値を設定値項目に有するSYNC_BEAT_TBLのエントリを参照し、分子(NUMERATOR)項目の値と分母(DENOMINATOR)項目の値を取得する。なお、以下の説明では、NUMERATOR項目、DENOMINATOR項目の各値そのものを、NUMERATOR、DENOMINATORと表記する場合もある。CPU201は、これらの値に基づいて、「NUMERATOR/DENOMINATOR」の値として、同期拍数を決定する。図7(b)の補助情報テーブルには、設定値毎の同期拍数の値を示してある。このようにして、設定値0、1、2、3、4、5、6、7のそれぞれに対応して、1/4拍、 1/3拍、 1/2拍、 2/3拍、1拍、 3/2拍、2拍、3拍という同期拍数が算出されることになる。また、図7(b)の補助情報テーブルには、各同期拍数に対して、シーケンスクロック割込みによってカウントされるべき回数(以下「同期シーケンスクロック数」と表記)を示してある。例えば、設定値=4の場合には、NUMERATOR=1、DENOMINATOR=1であるから、同期拍数=1/1=1である。そして、シーケンスクロック割込みは1拍を480分割したものであるから、同期拍数が1の場合の同期シーケンスクロック数は480となる。また、設定値=0の場合は、NUMERATOR=1、DENOMINATOR=4であるから、同期拍数=1/4であり、同期シーケンスクロック数は、480×1/4=120となる。具体的には、CPU201は、BEATノブで指定された設定値に対応するエントリのNUMERATOR項目値とDENOMINATOR項目値を取得し、下記(7)式に従って同期拍数bを計算し、更に、下記(8)式に従って同期シーケンスクロック数s、すなわち、フリーランニングタイマカウンタ302から時刻を読みとるべきシーケンスクロック割込みの回数を決定する。
b=NUMERATOR/DENOMINATOR ・・(7)
s=480×b ・・(8)
一方、CPU201は、DSP206内のディレイタイムカウンタ601から、ディレイタイム割込み609を受けると、その時点の時刻もフリーランニングタイマカウンタ302(図3)のカウンタ値として読み取って記録する。前述したように、ディレイタイム割込み609は、DSP206におけるディレイ処理において同期拍数に設定されたディレイタイムがサンプリングクロックによって一周期分カウントされる毎に、DSP206からCPU201に通知される。
以上のようにして、CPU201内で同期拍数に応じた回数(=s回)分のシーケンスクロック割込みが受け取られた時点の時刻(以下このCPU201側の時刻を「LAST_BEAT_TIME」と表記)と、DSP206から同期拍数に対応するディレイタイムに対するサンプリングクロックによる一周期分のカウントにより発生するディレイタイム割込み609が受け取られた時点の時刻(以下このDSP206側の時刻を「LAST_DELAY_TIME」と表記)が揃うと、CPU201は、両方の時刻の時間差dを、下記(9)式により計算する。
d=LAST_BEAT_TIME−LAST_DELAY_TIME
・・(9)
CPU201は、この時間差が小さくなるように、図3のシーケンスクロックカウンタ301にセットするシーケンスクロックカウント上限値を増加又は減少させる。具体的には、CPU201は、時間差がプラス値である、すなわち、LAST_BEAT_TIMEのほうがLAST_DELAY_TIMEよりも後の時刻の場合には、CPU201内のシーケンスクロックカウンタ301においてカウント上限値に達してシーケンスクロック割込みが発生するまでの時間がかかりすぎているため、シーケンスクロックカウント上限値から上記時間差のプラス値を1同期拍数(=1ディレイタイム)分に換算した値を減算して、シーケンスクロックカウント上限値を小さくさせる。一方、時間差がマイナス値である、すなわち、LAST_BEAT_TIMEのほうがLAST_DELAY_TIMEよりも先の時刻の場合には、CPU201内のシーケンスクロックカウンタ301においてカウント上限値に達してシーケンスクロック割込みが発生するまでの時間が早すぎるため、シーケンスクロックカウント上限値から上記時間差のマイナス値を1同期拍数(=1ディレイタイム)分に換算した値を減算して、シーケンスクロックカウント上限値を大きくする。つまり、CPU201は、上記(7)式によって計算される同期拍数bと、上記(9)式によって計算される時間差dとを用いて、下記(10)式によりシーケンスクロックカウント上限値の補正値cを計算する。
c=d/(480×b) ・・(10)
CPU201は、このようにして算出した補正値cをシーケンスクロックカウント上限値から減算して、シーケンスクロックカウンタ301にセットする。この結果、次回のディレイ処理においては、CPU201においてシーケンスクロック割込みに従ってディレイタイム分だけ進行する自動演奏の時間と、DSP206におけるディレイタイム分のディレイ処理の時間とのずれが無くなることが期待される。以上の本実施形態による一連の制御処理を、ディレイ同期処理(処理同期手段)と呼ぶ。
なお、上記(10)式で計算される補正値cは、整数値であるので、少数以下の切り捨て処理をした場合は、補正値cは時間差dが同期シーケンスクロック数に収まっている限り0となり、何の補正も行われないことになる。しかしながら、本実施形態で問題としているのは10msec、20msecといった認知可能な蓄積されたずれであり、数百μsecといった微小なずれは補正する意味がほとんど無いので、問題となることはない。例えば、同期拍数が1/2の場合、同期シーケンスクロック数は240回であるが、シーケンスクロックカウンタ301のカウンタ上限値であるこの同期シーケンスクロック数を1増やすとシーケンスクロック割込みの間隔は1μsec長くなり、次のディレイとの同期タイミングまでには、この240倍の240μsecを補正することになる。240μsec未満のズレの場合は何も行わないが、音楽的には認知不能な領域であるので問題ない。図8は、本実施形態の動作説明図である。図8(a)は、指定テンポに対して所定の同期拍数として「一拍」がディレイタイムとして設定されたサンプルルーパーのディレイ処理がDSP206で実行されることにより、同じ音響信号波形が繰返し再生される様子を示している。図8(B)は、「0」から「一拍」に対応して設定されたディレイタイムサンプリング数608を、第1のカウント値、つまり上限カウント値までのカウントを繰り返すディレイタイムカウンタ601のカウント状態を表わす。このディレイタイムカウンタ601のカウント値が上限カウント値に到達するタイミングに応答して音響信号波形が繰返し再生されるとともに、図8(C)に示すように、割り込み信号609が発生する。
これに対して、CPU201では、指定テンポに対して生成されるシーケンスクロックに従って自動演奏制御処理が実行される。より具体的には、シーケンスクロックカウンタ301が、シーケンスクロックを「0」から「一拍」に対応して設定されたシーケンスクロックのカウント上限値までカウントを繰り返すことにより、この自動演奏の拍のタイミングが得られる。しかしながら、このシーケンスクロックと上述のサンプリングクロックとは周期も異なり、かつ同期もしていないため、本実施形態のディレイ同期処理が実行されない場合には、音響信号波形が繰り返されるに従い、シーケンスクロックカウンタ301のカウントが第2のカウント値、つまりカウント上限値まで到達するタイミングが、図8(D)に示されるように、音響信号波形の繰返しタイミング(図8中の破線のタイミング)に対して徐々にずれていってしまう。
このため、このタイミングを自動演奏の拍タイミングとして自動演奏を進行させると、自動演奏の拍タイミングと音響信号波形の繰り返しタイミングとのずれが大きくなってしまう(図8(E))。
一方、本実施形態のディレイ同期処理が実行された場合、割り込み信号609の発生タイミングとシーケンスクロックカウンタ301がカウント上限値までカウントするタイミングとの差分時間を求め、この差分時間が少なくなるように、シーケンスクロックカウンタ301がカウント上限値を増加あるいは減少させている(図8(F))。
これにより、シーケンスクロックカウンタ301のカウントがカウント上限値まで到達するタイミングである自動演奏の拍タイミングは、図8(G)に示されるように、音響信号波形の繰返しタイミングに対して常に同期させることができる。このようにして、本実施形態では、CPU201の負荷が軽いにもかかわらず、DSP206でのディレイ処理に対する長期的なずれを回避することできるのである。
図2のCPU201がCPU ROM202に記憶されたディレイ同期プログラムに従って、以上の基本動作を実現するディレイ同期処理を含む電子楽器制御処理について、以下に詳細に説明する。
図9(a)は、CPU ROM202が記憶する、前述した図5(a)に例示したTEMPO_COUNT_TBL(テンポ−カウントテーブル)と、前述した図7(a)に例示したSYNC_BEAT_TBL(同期拍数テーブル)の各データ構成例(定数値)を示す図である。図9(b)は、CPU RAM203に記憶される、CPU201による主にディレイ同期処理において使用される主要変数の一覧を示す図である。図10(a)は、前述したCPU201内のフリーランニングタイマカウンタ302の値を示すレジスタCPU_FREE_TIMERと、CPU201内のシーケンスクロックカウンタ301に設定されるシーケンスクロックカウント上限値を示すレジスタCPU_TIMER_COUNTを示す図である。図10(b)は、CPU201がDSP206と通信する場合のDSP206側のレジスタの一覧を示す図である。これらのレジスタは、CPU I/F215(図2参照)により、CPU201側からはメモリとしてアクセスすることができる。以上の各データ構成の詳細については、後述する。
図11は、本実施形態において、CPU201が実行する電子楽器制御処理の全体処理例を示すフローチャートである。
電源投入後、CPU201は、まず初期化処理を実行する(ステップS1101)。この初期化処理の詳細については、図12のフローチャートの説明で後述する。
初期化処理の後、CPU201は、ステップS1102からステップS1110までの各処理を順番に繰り返す無限ループに入る。CPU201はまず、ユーザーインターフェース処理(以下「ユーザI/F処理」と表記)を実行し、図1の鍵盤101、機能選択操作子102、音色選択ボタン103、ベンダ/モジュレーション・ホイール104に対するユーザによる操作を検知する(ステップS1102)。
次にCPU201は、ステップS1102でのユーザI/F処理の結果、ユーザが図1の機能選択操作子102のTEMPOエリアのDOWNボタン又はUPボタンを操作することにより、テンポ設定イベントが発生したか否かを判定する(ステップS1103)。この判定結果が肯定的(以下「Yes」と表記)の場合には、CPU201は、テンポ設定処理を実行する(ステップS1104)。このとき、CPU201は、ユーザが機能選択操作子102のTEMPOエリアのDOWNボタン又はUPボタンを押下することにより、キー・スキャナ211を介して取得したテンポ変化量を、CPU RAM203上の変数Dにセットする。UPボタンが押下された場合にはD=+1がセットされ、DOWNボタンが押下された場合いはD=−1がセットされる。テンポ設定処理の詳細については、図13のフローチャートの説明で後述する。ステップS1103の判定結果が否定的(以下「No」と表記)の場合には、CPU201は、ステップS1104のテンポ設定処理は実行せずにスキップする。
次にCPU201は、ステップS1102でのユーザI/F処理の結果、ユーザが機能選択操作子102のDELAYエリアの各ボタン又はノブを操作することにより、ディレイ設定イベントが発生したか否かを判定する(ステップS1105)。この判定結果がYesの場合には、CPU201は、ディレイ設定処理を実行する(ステップS1106)。このとき、CPU201は、ユーザが機能選択操作子102のDELAYエリアの各ボタン又はノブを操作することにより、キー・スキャナ211を介して取得した変更されたボタン又はノブに対応する操作種別とその値をそれぞれ、CPU RAM203上の変数p及び変数vにセットする。ディレイ設定処理の詳細については、図14〜図16のフローチャートの説明で後述する。ステップS1106の判定結果がNoの場合には、CPU201は、ステップS1106のディレイ設定変更処理は実行せずにスキップする。
次にCPU201は、ステップS1102でのユーザI/F処理の結果、ユーザが鍵盤101を操作することにより演奏イベントが発生したか否か、又はMIDI I/F214を介して押鍵又は離鍵のMIDI入力が受信されたか否かを判定する(ステップS1107)。この判定結果がYesの場合には、CPU201は、押鍵/離鍵処理を実行する(ステップS1108)。CPU201は、例えばユーザが鍵盤101を操作することによりキー・スキャナ211を介して取得した音高情報及びベロシティ情報に基づいて、又はMIDI I/F214を介して取得したノートオンイベントのMIDIデータの音高情報及びベロシティ情報に基づいて、音源LSI204内の波形発生器205に対して、発音指示であるノートオンイベントや、消音指示であるノートオフイベントを発行する。この処理は、一般的な処理であるため、その詳細は省略する。ステップS1107の判定結果がNoの場合には、CPU201は、ステップS1108のディレイ設定変更処理は実行せずにスキップする。
次にCPU201は、自動演奏定常処理を実行する(ステップS1109)。自動演奏定常処理は、前述したシーケンスクロック割込みに基づいて、自動演奏を進行させる処理である。自動演奏定常処理の詳細については、図17のフローチャートの説明で後述する。
最後にCPU201は、音源定常処理を実行する(ステップS1110)。音源定常処理では、例えば図1の音色選択ボタン103が押された場合に対応する音色変更の処理や、図1のベンダ/モジュレーション・ホイール104が操作された場合に対応するベロシティ変更やピッチ変更の処理等の、音源LSI204に対して指示を行う処理が実行される。この処理は、一般的な処理であるため、その詳細は省略する。
図12は、図11のステップS1101の初期化処理の詳細例を示すフローチャートである。
図12において、CPU201はまず、CPU I/F215を介して、ディレイ処理を実行する音源LSI204内のDSP206のレジスタDSP_DELAY_INIT(図10(b)参照)に、値1を書き込む(ステップS1201)。DSP206は、レジスタDSP_DELAY_INITの値が1になると、DSP206に接続されるDSP RAM208(遅延メモリ)の内容や、ライトポインタ生成部605で生成されるポインタ値等を初期化し、レジスタDSP_DELAY_INITの値を0に戻す。
次にCPU201は、CPU RAM203の変数領域の各変数値(図9(b)の一覧を参照)を0に初期化する(ステップS1202)。この結果、自動演奏を行っている状態か否かを示す変数SEQ_RUN(図9(b)参照)の値が0に初期化されることにより、自動演奏は停止状態にされる。また、ディレイホールドモードか否かを示す変数DELAY_HOLD(図9(b)参照)の値が0に初期化されることにより、ディレイホールドモードはオフにされる。更に、ディレイテンポシンクロナイズドモードか否かを示す変数DELAY_SYNC(図9(b)参照)の値が0に初期化されることにより、ディレイテンポシンクロナイズドモードはオフにされる。また自動演奏を司るシーケンスクロック割込みの割込み回数を示すシーケンスカウンタ変数SEQ_CLOCK(図9(b)参照)の値が0に初期化される。なお、テンポを示す変数TEMPO(図9(b)参照)については、初期値として120(BPM)が設定される。
その後、CPU201は、テンポ設定処理を実行する。このとき、CPU201は、テンポ変化量=0をCPU RAM203上の変数Dにセットする。テンポ設定処理の詳細については、図13のフローチャートの説明で後述するが、この処理において、CPU201は、CPU RAM203の変数TEMPO(図9(b)参照)に設定されたテンポ初期値120(BPM)によって、CPU ROM202に記憶されるTEMPO_COUNT_TBL(図9(a))を参照することにより、SEQ_CLOCK_COUNT項目の値=1042を取得し(図5(a)参照)、その値をCPU201のレジスタCPU_TIMER_COUNT(図10(a)参照)にセットする(後述する図13のステップS1306参照)。このレジスタCPU_TIMER_COUNTの値として、CPU201内のシーケンスクロックカウンタ301にシーケンスクロックカウント上限値=1042が初期設定される。
次にCPU201は、図1の機能選択操作子102のDELAYエリアのTIMEノブの操作位置を、図2のキー・スキャナ211を介して読み込み、ディレイタイムを示すCPU RAM203上の変数DELAY_TIME(図9(b)参照)に格納する(ステップS1204)。ディレイタイムの値域は、0〜FFFFH(「H」は16進数を表す)の範囲であり、この範囲が0〜2000msecの時間範囲に対応する。従って、DELAY_TIMEをmsecで表現するためには、下記(11)式の変換を行えばよい。
ディレイタイム(msec)=
DELAY_TIME×2000/FFFFH ・・(11)
次にCPU201は、図1の機能選択操作子102のDELAYエリアのREPEATノブの操作位置を、図2のキー・スキャナ211を介して読み込み、ディレイのフィードバック量を示すCPU RAM203上の変数DELAY_FEEDBACK(図9(b)参照)に格納する(ステップS1205)。
次にCPU201は、図1の機能選択操作子102のDELAYエリアのLEVELノブの操作位置を、図2のキー・スキャナ211を介して読み込み、ディレイ音のレベルを示すCPU RAM203上の変数DELAY_LEVEL(図9(b)参照)に格納する(ステップS1206)。
次にCPU201は、CPU RAM203上のパラメータ変数pに、ディレイホールドモードを示す文字列‘DELAY_HOLD’を設定し、値変数vにディレイホールドモードでないことを示す値0を設定して、ディレイ設定処理を実行する(ステップS1207)。p=‘DELAY_HOLD’によりディレイ設定処理の詳細を示す図14のフローチャートにおいて後述するステップS1402が実行されることにより図15(a)のフローチャートで示されるディレイホールドモード設定処理(BEAT処理)が実行される。これにより、ディレイホールドモードでない状態に対応して、ディレイ入力音量調整用のアンプ402(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_INPUT(図10(b)参照)に、値FFFFH(倍率1.0)が初期設定される。また、フィードバック量調整用のアンプ404(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_FEEDBACKに、図12のステップS1205でCPU RAM203上の変数DELAY_FEEDBACKに設定されたREPEATノブの初期操作値が初期設定される(後述する図15(a)のステップS1503参照)。
次にCPU201は、CPU RAM203上のパラメータ変数pに、ディレイテンポシンクロナイズドモードを示す文字列‘DELAY_SYNC’を設定し、値変数vにディレイテンポシンクロナイズドモードでないことを示す値0を設定して、ディレイ設定処理を実行する(ステップS1208)。p=‘DELAY_SYNC’によりディレイ設定処理の詳細を示す図14のフローチャートにおいて後述するステップS1406が実行されることにより図16(a)のフローチャートで示されるディレイテンポシンクロナイズドモード設定処理(SYNC処理)が実行される。これにより、ディレイシンクロナイズドモードでない状態に対応して、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLE(図10(b)参照)に、図12のステップS1204でCPU RAM203上の変数DELAY_TIMEに設定されたTIMEノブの初期操作値に対応する時間値をDSP206の44.1KHzのサンプリングクロックでサンプリングしたときのサンプル数が初期設定される(前述した(11)式と後述する図16(a)のステップS1604参照)。
次にCPU201は、CPU RAM203上のパラメータ変数pに、ディレイタイムを示す文字列‘DELAY_TIME’を設定し、値変数vにCPU RAM203上の変数DELAY_TIMEが示す値を設定して、ディレイ設定処理を実行する(ステップS1209)。p=‘DELAY_TIME’によりディレイ設定処理の詳細を示す図14のフローチャートにおいて後述するステップS1403が実行されることにより図15(b)のフローチャートで示されるディレイタイム設定処理(TIME処理)が実行される。これにより、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLE(図10(b)参照)に、CPU RAM203上の変数DELAY_TIMEに得られているTIMEノブの操作値に対応する時間値をDSP206の44.1KHzのサンプリングクロックでサンプリングしたときのサンプル数が初期設定される(前述した(11)式と後述する図15(b)のステップS1511及びS1513参照)。
次にCPU201は、CPU RAM203上のパラメータ変数pに、ディレイフィードバックを示す文字列‘DELAY_FEEDBACK’を設定し、値変数vにCPU RAM203上の変数DELAY_FEEDBACKが示す値を設定して、ディレイ設定処理を実行する(ステップS1210)。p=‘DELAY_FEEDBACK’によりディレイ設定処理の詳細を示す図14のフローチャートにおいて後述するステップS1404が実行されることにより図15(c)のフローチャートで示されるディレイフィードバック設定処理(FEEDBACK処理)が実行される。これにより、フィードバック量調整用のアンプ404(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_FEEDBACK(図10(b)参照)に、図12のステップS1205でCPU RAM203上の変数DELAY_FEEDBACKに設定されたREPEATノブの初期操作値に対応するフィードバック量が初期設定される。
更にCPU201は、CPU RAM203上のパラメータ変数pに、ディレイレベルを示す文字列‘DELAY_LEVEL’を設定し、値変数vにCPU RAM203上の変数DELAY_LEVELが示す値を設定して、ディレイ設定処理を実行する(ステップS1211)。p=‘DELAY_LEVEL’によりディレイ設定処理の詳細を示す図14のフローチャートにおいて後述するステップS1405が実行されることにより図15(d)のフローチャートで示されるディレイレベル設定処理(LEVEL処理)が実行される。これにより、ディレイ出力音量調整用のアンプ403(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_OUTPUT(図10(b)参照)に、図12のステップS1206でCPU RAM203上の変数DELAY_LEVELに設定されたLEVELノブの初期操作値に対応するレベル量が初期設定される。
最後に、CPU201は、本実施形態のディレイ同期処理以外に関連するCPU RAM203上の変数や音源LSI204上のレジスタ等を初期化する、その他の初期化処理を実行する(ステップS1212)。その後、CPU201は、図12のフローチャートで示される図11のステップS1101の初期化処理を終了する。
図13は、図11のステップS1104又はステップS1101の初期化処理内の図12のステップS1203で実行されるテンポ設定処理の詳細例を示すフローチャートである。
図13において、CPU201は、CPU RAM203上の変数TEMPOに格納されているテンポ値を、CPU RAM203上の変数Dで引き渡されたテンポ操作量の値だけ増減()させることにより、テンポ値を変更する(ステップS1301)。ユーザが図1の機能選択操作子102のTEMPOエリアのUPキーを押下した場合には、D=+1が引き渡されることにより変数TEMPOの値が+1される。ユーザがTEMPOエリアのDOWNキーを押下した場合には、D=−1が引き渡されることにより変数TEMPOの値が−1される。
次にCPU201は、更新された変数TEMPOの値が最低値30を下回ったか否かを判定し(ステップS1302)、ステップS1302の判定がYesならば、変数TEMPOの値を最低値30に設定する(ステップS1303)。ステップS1302の判定がNoならば、CPU201は、ステップS1303は実行せずにスキップする。
次にCPU201は、更新された変数TEMPOの値が最高値300を上回ったか否かを判定し(ステップS1304)、ステップS1304の判定がYesならば、変数TEMPOの値を最高値300に設定する(ステップS1305)。ステップS1304の判定がNoならば、CPU201は、ステップS1305は実行せずにスキップする。
続いてCPU201は、ステップS1301からS1305で更新された変数TEMPOの値によって、CPU ROM202に記憶されるTEMPO_COUNT_TBL(図9(a))を参照することにより、TEMPO値に対応するエントリのSEQ_CLOCK_COUNT項目の値を取得し(図5(a)参照)、その値をCPU201のレジスタCPU_TIMER_COUNT(図10(a)参照)にセットする(ステップS1306)。このレジスタCPU_TIMER_COUNTの更新値として、CPU201内のシーケンスクロックカウンタ301にシーケンスクロックカウント上限値が更新される。
その後、CPU201は、CPU RAM203上の変数DELAY_SYNCの値が1であるか否か、すなわち、ディレイホールドモードが現在設定されているか否かを判定する(ステップS1307)。
ステップS1307の判定がYesならば、CPU201はまず、ステップS1301からS1305で更新された変数TEMPOの値によって、CPU ROM202に記憶されるTEMPO_COUNT_TBL(図9(a))を参照することにより、TEMPO値に対応するエントリのDELAY_COUNT項目値、すなわち、ディレイタイムを更新テンポ値の1拍に同期させたときのサンプリングクロック数をTEMPO_COUNT_TBL(TEMPO).DELAY_COUNTとして取得し、CPU RAM203上の変数aに格納する。次に、CPU201は、ユーザの操作によって図1の機能選択操作子102のDELAYエリアのBEATノブによって選択され、CPU RAM203上の変数DELAY_SYNC_BEATに格納されている設定値によって、CPU ROM202に記憶されているSYNC_BEAT_TBL(図9(a))を参照することにより、DELAY_SYNC_BEAT値に対応するエントリのNUMERATOR項目値とDENOMINATOR項目値をそれぞれSYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATOR及びSYNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATORとして取得し、それぞれCPU RAM203上の変数n及びdに格納する(以上、ステップS1308)。
そして、CPU201は、下記(12)式により、前述したディレイタイムカウンタ601のカウンタ上限値であるディレイタイムサンプリング数608(図6)を算出し、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLE(図10(b)参照)に格納する(ステップS1309)。
DSP_DELAY_SAMPLE=a×n/d ・・(12)
ステップS1308とS1309により、指定されたテンポの指定された同期拍数のディレイタイムに対応するディレイタイムサンプリング数608が算出されて、DSP206のレジスタDSP_DELAY_SAMPLEに格納される。その後、CPU201は、図13のフローチャートで示されるテンポ設定処理を終了する。
ステップS1307の判定がNoならば、CPU201は、ステップS1308とS1309は実行せずにスキップし、図13のフローチャートで示されるテンポ設定処理を終了する。
図14は、図11のステップS1106又はステップS1101の初期化処理内の図12のステップS1207からS1211で実行されるディレイ設定処理の詳細例を示すフローチャートである。
図14において、CPU201はまず、CPU RAM203上の変数pで引き渡された設定処理種別、すなわちユーザによる図1の機能選択操作子102のDELAYエリアでの操作種別を判別する(ステップS1401)。
CPU201は、変数p=‘DELAY_HOLD’、すなわちHOLDボタンが押下されたならばステップS1402のディレイホールドモード設定処理(HOLD処理)を実行する。このとき、HOLDボタンのLEDがオフの状態で更にHOLDボタンが押下された場合には、変数vにディレイホールドモードがオフからオンになったことを示す値1が引き渡される。逆に、HOLDボタンのLEDがオンの状態で更にHOLDボタンが押下された場合には、変数vにディレイホールドモードがオンからオフになったことを示す値1が引き渡される。
CPU201は、変数p=‘DELAY_TIME’、すなわちTIMEノブが操作されたならばステップS1403のディレイタイム設定処理(TIME処理)を実行する。このとき、変数vには、TIMEノブの操作位置に対応する0〜FFFFHの範囲の値が引き渡される。
CPU201は、変数p=‘DELAY_FEEDBACK’、すなわちREPEATノブが操作されたならばステップS1404のディレイフィードバック設定処理(FEEDBACK処理)を実行する。このとき、変数vには、REPEATノブの操作位置に対応する0〜FFFFHの範囲の値が引き渡される。
CPU201は、変数p=‘DELAY_LEVEL’、すなわちLEVELノブが操作されたならばステップS1405のディレイレベル設定処理(LEVEL処理)を実行する。このとき、変数vには、LEVELノブの操作位置に対応する0〜FFFFHの範囲の値が引き渡される。
CPU201は、p=‘DELAY_SYNC’、すなわちSYNCボタンが操作されたならばステップS1406のディレイテンポシンクロナイズドモード設定処理(SYNC処理)を実行する。このとき、SYNCボタンのLEDがオフの状態で更にSYNCボタンが押下された場合には、変数vにディレイテンポシンクロナイズドモードがオフからオンになったことを示す値1が引き渡される。逆に、SYNCボタンのLEDがオンの状態で更にSYNCボタンが押下された場合には、変数vにディレイテンポシンクロナイズドモードがオンからオフになったことを示す値1が引き渡される。
CPU201は、p=‘DELAY_BEAT’、すなわちBEATノブが操作されたならばステップS1407のディレイテンポ同期拍数設定処理(BEAT処理)を実行する。このとき、変数vには、BEATノブの操作位置に対応する0、1、2、3、4、5、6、7の何れかの設定値が引き渡される。
各設定処理が終了した後、CPU201は、図14のフローチャートで示されるディレイ設定処理を終了する。
図15(a)は、図14のステップS1402のディレイホールドモード設定処理(HOLD処理)の詳細例を示すフローチャートである。この処理は、ユーザが図1の機能選択操作子102のDELAYエリアのHOLDボタンを押下した場合に実行される。ユーザは、HOLDボタンを押下してそのLEDを点灯又は消灯させることにより、前述のディレイホールドモードのオン/オフを切り替えることができる。このとき、前述したように、HOLDボタンのLEDが消灯されている状態で更にHOLDボタンが押下された場合には、変数vにディレイホールドモードがオフからオンになったことを示す値1が引き渡される。逆に、HOLDボタンのLEDが点灯されている状態で更にHOLDボタンが押下された場合には、変数vにディレイホールドモードがオンからオフになったことを示す値1が引き渡される。
CPU201はまず、変数vで引き渡された値を、ディレイホールドモードか否かを示す変数DELAY_HOLD(図9(b)参照)にセットする(ステップS1501).
次にCPU201は、ステップS1501で変数DELAY_HOLDにセットされた値を判定する(ステップS1502)。
CPU201は、ステップS1502で、変数DELAY_HOLDにセットされた値が0である、すなわち、ディレイホールドモードがオフされたと判定した場合には、ディレイ入力音量調整用のアンプ402(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_INPUT(図10(b)参照)に、値FFFFH(倍率1.0)を設定する。これにより、ディレイ入力音量調整用のアンプ402の増幅率が1.0倍に設定され、それ以降入力された音響信号407にディレイ効果がかかる状態になる。また、CPU201は、フィードバック量調整用のアンプ404(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_FEEDBACK(図10(b)参照)に、CPU RAM203上の変数DELAY_FEEDBACKに設定されているフィードバック量を設定する(以上、ステップS1503)。これにより、図1の機能選択操作子102のDELAYエリアのREPEATノブによるフィードバック調整が有効となる。その後、CPU201は、図15(a)のフローチャートで示される図14のステップS1402のディレイホールドモード設定処理(HOLD処理)を終了する。
CPU201は、ステップS1502で、変数DELAY_HOLDにセットされた値が1である、すなわちディレイホールドモードがオンされたと判定した場合には、ディレイ入力音量調整用のアンプ402(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_INPUT(図10(b)参照)に、値0を設定する。つまり、図4(a)において、ディレイホールドモード時には、遅延装置401に新たな音響信号の入力407は流入しないように設定される。また、CPU201は、フィードバック量調整用のアンプ404(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_FEEDBACK(図10(b)参照)に、値FFFFH(倍率1.0)を設定する。すなわち、図4(a)において、ディレイホールドモード時には、遅延装置401から出力される音響信号が全て遅延装置401の入力側にフィードバックされる。これにより、前述したサンプルルーパーの機能が実現される。その後、CPU201は、図15(a)のフローチャートで示される図14のステップS1402のディレイホールドモード設定処理(HOLD処理)を終了する。
図15(b)は、図14のステップS1403のディレイタイム設定処理(TIME処理)の詳細例を示すフローチャートである。この処理は、ユーザが図1の機能選択操作子102のDELAYエリアのTIMEノブを操作した場合に実行される。ユーザは、DELAYエリアのSYNCボタンのLEDを消灯させてディレイテンポシンクロナイズドモードをオフしているときに、TIMEノブの操作により、ディレイタイムを直接、例えば、0〜2secの間で指定することができる。このとき、前述したように、変数vには、TIMEノブの操作位置に対応する0〜FFFFHの範囲の値が引き渡される。
CPU201はまず、前述した(11)式により、変数vで引き渡された変数DELAY_TIMEの値を、16進値からmsec値に変換して、新たに変数vに格納する(ステップS1511)。
次にCPU201は、CPU RAM203上の変数DELAY_SYNCの値を判別する(ステップS1512)。
CPU201は、ステップS1512で、変数DELAY_SYNCにセットされた値が0である、すなわち、ディレイテンポシンクロナイズドモードがオフであると判定した場合には、下記(13)式を実行する(ステップS1513)。
DSP_DELAY_SAMPLE=
(v/1000)×44100 ・・(13)
これにより、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLE(図10(b)参照)に、CPU RAM203上の変数DELAY_TIMEに得られているTIMEノブの操作値に対応する時間値をDSP206の44.1KHzのサンプリングクロックでサンプリングしたときのサンプル数が格納される。その後、CPU201は、図15(b)のフローチャートで示される図14のステップS1403のディレイタイム設定処理(TIME処理)を終了する。
CPU201は、ステップS1512で、変数DELAY_SYNCにセットされた値が1である、すなわち、ディレイテンポシンクロナイズドモードがオンであると判定した場合には、前述したようにディレイタイムはテンポに同期して決定されることになり、TIMEノブの操作は無視されるため、そのまま図15(b)のフローチャートで示される図14のステップS1403のディレイタイム設定処理(TIME処理)を終了する。
図15(c)は、図14のステップS1404のディレイフィードバック設定処理(FEEDBACK処理)の詳細例を示すフローチャートである。この処理は、ユーザが図1の機能選択操作子102のDELAYエリアのREPEATノブを操作した場合に実行される。ユーザは、DELAYエリアのHOLDボタンのLEDを消灯させていてディレイホールドモードをオフしているときに、REPEATノブの操作により、ディレイのフィードバック量を調整することができる。ここで指定された値により、図4(a)のフィードバック量調整用のアンプ404のゲインが決定される。このとき、前述したように、変数vには、REPEATノブの操作位置に対応する0〜FFFFHの範囲の値が引き渡される。
CPU201はまず、変数vで引き渡された値を変数DELAY_FEEDBACKに格納する(ステップS1521)。
次にCPU201は、CPU RAM203上の変数DELAY_HOLDの値を判別する(ステップS1522)。
CPU201は、ステップS1522で、変数DELAY_HOLDにセットされた値が0である、すなわち、ディレイホールドモードがオフであると判定した場合には、DSP206上のフィードバック量調整用のアンプ404(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_FEEDBACK(図10(b)参照)に、変数DELAY_FEEDBACKに設定されているフィードバック量を設定する(以上、ステップS1523)。その後、CPU201は、図15(c)のフローチャートで示される図14のステップS1404のディレイフィードバック設定処理(FEEDBACK処理)を終了する。
CPU201は、ステップS1522で、変数DELAY_HOLDにセットされた値が1である、すなわち、ディレイホールドモードがオンであると判定した場合には、DSP206のレジスタDSP_DELAY_FEEDBACKには、図15(a)のディレイホールドモード設定処理(HOLD処理)のステップS1504で最大値FFFFHが設定されるため、CPU201は、ステップS1523の処理は実行せずにスキップし、図15(c)のフローチャートで示される図14のステップS1404のディレイフィードバック設定処理(FEEDBACK処理)を終了する。
図15(d)は、図14のステップS1405のディレイレベル設定処理(LEVEL処理)の詳細例を示すフローチャートである。この処理は、ユーザが図1の機能選択操作子102のDELAYエリアのLEVELノブを操作した場合に実行される。ユーザは、LEVELノブの操作により、ディレイ信号のレベルを調整することができる。ここで指定された値により、図4(a)のディレイ出力音量調整用のアンプ403のゲインが決定される。このとき、前述したように、変数vには、LEVELノブの操作位置に対応する0〜FFFFHの範囲の値が引き渡される。
CPU201はまず、変数vで引き渡された値を変数DELAY_LEVELに格納する(ステップS1531)。
次にCPU201は、ディレイ出力音量調整用のアンプ403(図4(a)参照)のゲインを示すDSP206のレジスタDSP_DELAY_OUTPUT(図10(b)参照)に、変数DELAY_LEVELに設定されたLEVELノブの操作値に対応するレベル量を設定する(ステップS1532)。その後、CPU201は、図15(c)のフローチャートで示される図14のステップS1405のディレイレベル設定処理(LEVEL処理)を終了する。
図16(a)は、図14のステップS1406のディレイテンポシンクロナイズドモード設定処理(SYNC処理)の詳細例を示すフローチャートである。この処理は、ユーザが図1の機能選択操作子102のDELAYエリアのSYNCボタンを押下した場合に実行される。ユーザは、SYNCボタンを押下してそのLEDを点灯又は消灯させることにより、前述のディレイテンポシンクロナイズドモードのオン/オフを切り替えることができる。このとき、前述したように、SYNCボタンのLEDが消灯されている状態で更にSYNCボタンが押下された場合には、変数vにディレイテンポシンクロナイズドモードがオフからオンになったことを示す値1が引き渡される。逆に、SYNCボタンのLEDが点灯されている状態で更にSYNCボタンが押下された場合には、変数vにディレイテンポシンクロナイズドモードがオンからオフになったことを示す値1が引き渡される。
CPU201はまず、変数vで引き渡された値を、ディレイテンポシンクロナイズドモードか否かを示す変数DELAY_SYNC(図9(b)参照)にセットする(ステップS1601)。
次にCPU201は、ステップS1601で変数DELAY_SYNCにセットされた値を判定する(ステップS1602)。
CPU201は、ステップS1602で、変数DELAY_SYNCにセットされた値が1である、すなわち、ディレイテンポシンクロナイズドモードがオンされたと判定した場合には、以下の動作を実行する(ステップS1603)。CPU201はまず、変数TEMPOに設定されている現在のテンポ値によって、CPU ROM202に記憶されるTEMPO_COUNT_TBL(図9(a))を参照することにより、TEMPO値に対応するエントリのDELAY_COUNT項目値、すなわち、ディレイタイムを更新テンポ値の1拍に同期させたときのサンプリングクロック数を、TEMPO_COUNT_TBL(TEMPO).DELAY_COUNTとして取得する。また、CPU201は、ユーザの操作によって図1の機能選択操作子102のDELAYエリアのBEATノブによって選択され、CPU RAM203上の変数DELAY_SYNC_BEATに格納されている設定値によって、CPU ROM202に記憶されているSYNC_BEAT_TBL(図9(a))を参照することにより、DELAY_SYNC_BEAT値に対応するエントリのNUMERATOR項目値とDENOMINATOR項目値をそれぞれ、SYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATOR及びSYNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATORとして取得する。そして、CPU201は、下記(14)式により、前述したディレイタイムカウンタ601のカウンタ上限値であるディレイタイムサンプリング数608(図6)を算出し、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLE(図10(b)参照)に格納する。
DSP_DELAY_SAMPLE=TEMPO_COUNT_TBL(TEMPO).DELAY_COUNT×SYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATOR/SYNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATOR ・・(14)
これにより、ディレイタイムを指定されたテンポ値(TEMPO)の1拍に同期させたときのサンプリングクロック数DELAY_COUNTに、機能選択操作子102のDELAYエリアのBEATノブで設定された同期拍数の分周比率NUMERATOR/DENOMINATORを乗算して算出される、指定されたテンポの指定された同期拍数のディレイタイムに対応するディレイタイムサンプリング数が、DSP206でのディレイ処理におけるディレイタイムとして設定される。その後、CPU201は、図16(a)のフローチャートで示される図14のステップS1406のディレイテンポシンクロナイズドモード設定処理(SYNC処理)を終了する。
CPU201は、ステップS1602で、変数DELAY_SYNCにセットされた値が0である、すなわち、ディレイテンポシンクロナイズドモードがオフされたと判定した場合には、ユーザによる図1の機能選択操作子102のDELAYエリアのTIMEノブの操作が有効となるため、CPU201はまず、前述した(11)式の計算を含む下記(15)式を計算する(ステップS1604)。
DSP_DELAY_SAMPLE=
{(DELAY_TIME×2000/FFFFH)/1000}×44100
・・(15)
これにより、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLEに、CPU RAM203上の変数DELAY_TIMEに得られているTIMEノブの操作値を16進値からmsec値に変換した上でその時間値をDSP206の44.1KHzのサンプリングクロックでサンプリングしたときのサンプル数が格納される。すなわち、TIMEノブの操作量に応じて、DSP206でのディレイ処理におけるディレイタイムが直接決定されることになる。その後、CPU201は、図16(a)のフローチャートで示される図14のステップS1406のディレイテンポシンクロナイズドモード設定処理(SYNC処理)を終了する。
図16(b)は、図14のステップS1407のディレイテンポ同期拍数設定処理(BEAT処理)の詳細例を示すフローチャートである。この処理は、ユーザが図1の機能選択操作子102のDELAYエリアのBEATノブを操作した場合に実行される。ユーザは、BEATノブの操作により、ディレイテンポシンクロナイズドモードにおける同期拍数を指定することができる。このとき、前述したように、変数vには、BEATノブの操作位置に対応する0、1、2、3、4、5、6、7の何れかの設定値が引き渡される。
CPU201はまず、変数vで引き渡された値を、同期拍数を格納する変数DELAY_SYNC_BEAT(図9(b)参照)にセットする(ステップS1611)。
次にCPU201は、変数DELAY_SYNCにセットされている値を判定する(ステップS1612)。
CPU201は、ステップS1612で、変数DELAY_SYNCにセットされた値が1である、すなわち、ディレイテンポシンクロナイズドモードがオンされていると判定した場合には、ディレイテンポシンクロナイズドモード設定処理(SYNC処理)において実行される図16(a)のステップS1603と同様の処理を実行する(ステップS1613)。これにより、ディレイタイムを指定されたテンポ値(TEMPO)の1拍に同期させたときのサンプリングクロック数DELAY_COUNTに、機能選択操作子102のDELAYエリアのBEATノブで設定された同期拍数の分周比率NUMERATOR/DENOMINATORを乗算して算出される、指定されたテンポの指定された同期拍数のディレイタイムに対応するディレイタイムサンプリング数が、DSP206でのディレイ処理におけるディレイタイムとして、前述したディレイタイムサンプリング数レジスタ602(図6参照)に対応するDSP206のレジスタDSP_DELAY_SAMPLE(図10(b)参照)に格納される。その後、CPU201は、図16(b)のフローチャートで示される図14のステップS1407のディレイテンポ同期拍数設定処理(BEAT処理)を終了する。
CPU201は、ステップS1612で、変数DELAY_SYNCにセットされた値が0である、すなわち、ディレイテンポシンクロナイズドモードがオフされていると判定した場合には、BEATノブの操作は無視されるため、そのまま図16(b)のフローチャートで示される図14のステップS1407のディレイテンポ同期拍数設定処理(BEAT処理)を終了する。
図17は、図11のステップS1109の自動演奏定常処理の詳細例を示すフローチャートである。ここでは、CPU201内のシーケンスクロックカウンタ301(図3)からのシーケンスクロック割込みに基づいて、自動演奏の進行制御が実施される。
CPU201はまず、ユーザが図1の機能選択操作子102内の特には図示しない自動演奏指定スイッチを操作することにより、自動演奏が指定されているか否かを判定する。この指定の有無は、CPU RAM203上の変数SEQ_RUNの値により判定できる。変数SEQ_RUNの値が1でなければ、自動演奏制御処理は実施されないため、CPU201は、図17のフローチャートで示される図11のステップS1109の自動演奏定常処理をそのまま終了する。
変数SEQ_RUNの値が1の場合、CPU201はまず、自動演奏を司るシーケンスクロック割込みの通算の割込み回数を示す通算シーケンスクロック割込みカウント変数SEQ_CLOCK(図9(b)参照)の値を、CPU RAM203上の変数sに格納する(ステップS1702)。
次にCPU201は、下記(16)式に示されるように、ステップS1702で変数sにセットされた今回の通算シーケンスクロック割込み回数の値から、今回以前で最後に図11のステップS1109の自動演奏定常処理が実行されたときのシーケンスカウンタ値を格納する変数LAST_SEQ_CLOCKの値を減算した値を、CPU RAM203上の変数dに格納する(ステップS1703)。この結果、変数dには、今回以前で最後に図11のステップS1109の自動演奏定常処理が実行されたときから今回までの間に発生したシーケンスクロック割込みの回数が格納される。
d=s−LAST_SEQ_CLOCK ・・(16)
次にCPU201は、下記(17)式に示されるように、次回実行される図11のステップS1109の自動演奏定常処理のために、ステップS1702で変数sにセットされた今回のシーケンスクロック割込み回数の値を、変数LAST_SEQ_CLOCKに格納しておく。
LAST_SEQ_CLOCK=s ・・(17)
その後、CPU201は、下記ステップS1705からS1707の一連の処理の繰返しにより、変数dにセットされた前回から今回の自動演奏定常処理までの間に発生したシーケンスクロック割込みの回数分だけ、自動演奏を進行させる処理を実行する。
この繰返し処理において、CPU201はまず、変数dの値が0か否か、すなわち、変数dにセットされた前回から今回の自動演奏定常処理までの間にシーケンスクロック割込みが発生していないか否かを判定する(ステップS1705)。
変数dにセットされた前回から今回の自動演奏定常処理までの間にシーケンスクロック割込みが発生しておらず変数dの値が0(ステップS1705の判定がYes)である場合には、CPU201は、図17のフローチャートで示される図11のステップS1109の自動演奏定常処理をそのまま終了する。
変数dにセットされた前回から今回の自動演奏定常処理までの間にシーケンスクロック割込みが発生しており変数dの値が0でない(ステップS1705の判定がNoである)場合には、CPU201は、自動演奏処理を1シーケンスクロック割込みに対応する時間分だけ進める自動演奏制御処理を実行する(ステップS1706)。自動演奏制御処理は一般的な技術であるため、その詳細は省略する。
次にCPU201は、変数dにセットされたシーケンスクロック割込みの回数を−1する。その後、CPU201は、ステップS1705の判定処理に戻って変数dの値が0になったか否かを判定し、その判定がNoである間、上記ステップS1706とS1707の処理を繰返し実行する。やがて、ステップS1705の判定がYesになると、CPU201は、図17のフローチャートで示される図11のステップS1109の自動演奏定常処理を終了する。
以上の自動演奏定常処理により、CPU201は、前回から今回の自動演奏定常処理までの間に発生したシーケンスクロック割込みの回数分だけ、自動演奏を進行させることができる。
図18は、CPU201内のシーケンスクロックカウンタ301のカウント値がシーケンスクロックカウント上限値に達してシーケンスクロック割込みが発生したときにCPU201が実行する、シーケンスクロック割込み処理の例を示すフローチャートである。この処理は、CPU201が、図11〜図17のフローチャートで例示される電子楽器制御処理を中断し、CPU ROM202に記憶されたシーケンスクロック割込み処理プログラムを実行する動作である。
CPU201はまず、自動演奏開始後のシーケンスクロック割込みの通算の割込み回数を示す通算シーケンスクロック割込みカウント変数SEQ_CLOCK(図9(b)参照)の値を、+1インクリメントする(ステップS1801)。
次にCPU201は、ディレイタイム毎にシーケンスクロック割込みの回数をカウントするためのディレイタイム毎シーケンスクロック割込みカウント変数SYNC_SEQ_CLOCK(図9(b)参照)の値を、+1インクリメントする(ステップS1802)。なお、このカウンタ変数の値は、ディレイタイムと同期したことが検出される後述するステップS1805の判定がYesとなるタイミングで、0にリセットされる(後述するステップS1806)。
次にCPU201は、変数DELAY_SYNCにセットされている値を判定する(ステップS1803)。
CPU201は、ステップS1612で、変数DELAY_SYNCにセットされた値が1ではない、すなわち、ディレイテンポシンクロナイズドモードがオフされていると判定した場合には、そのまま図18のフローチャートで示されるシーケンスクロック割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。この場合、シーケンスクロック割込みに基づいてステップS1801で通算シーケンスクロック割込みカウント変数SEQ_CLOCKの値がインクリメントされるため、前述した自動演奏定常処理(図11のステップS1109)により自動演奏が進行させられる。
一方、CPU201は、ステップS1612で、変数DELAY_SYNCにセットされた値が1である、すなわち、ディレイテンポシンクロナイズドモードがオンされていると判定した場合には、以下の動作を実行する(ステップS1804)。CPU201は、ユーザの操作によって図1の機能選択操作子102のDELAYエリアのBEATノブによって選択され、CPU RAM203上の変数DELAY_SYNC_BEATに格納されている設定値によって、CPU ROM202に記憶されているSYNC_BEAT_TBL(図9(a))を参照することにより、DELAY_SYNC_BEAT値に対応するエントリのNUMERATOR項目値とDENOMINATOR項目値をそれぞれ、SYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATOR及びSYNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATORとして取得する。そして、CPU201は、下記(18)式により、ユーザが図1の機能選択操作子102のDELAY領域にあるエリアのBEATノブで設定した設定値に対応する同期拍数に応じたシーケンスクロック割込み回数の設定値を算出し、CPU RAM203上の変数sに格納する。
s=480×SYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATOR/SYNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATOR ・・(18)
次にCPU201は、シーケンスクロック割込みの発生毎にステップS1802でインクリメントしたディレイタイム毎シーケンスクロック割込みカウント変数SYNC_SEQ_CLOCKの値が、上記ステップS1804で算出し変数sに格納された同期拍数に応じたシーケンスクロック割込み回数の設定値に一致したか否かを判定する(ステップS1805)。
ステップS1805の判定がNoならば、シーケンスクロック割込みの回数がまだディレイタイムの設定値を経過していないため、CPU201は、そのまま図18のフローチャートで示されるシーケンスクロック割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。
ステップS1805の判定がYesになると、シーケンスクロック割込みの回数がディレイタイムの設定値を経過したことになるため、CPU201はまず、ディレイタイム毎シーケンスクロック割込みカウント変数SYNC_SEQ_CLOCKの値を次のディレイタイムの処理のために0にクリアする(ステップS1806)。
次にCPU201は、前述したCPU201内のフリーランニングタイマカウンタ302(図3参照)の値を示すCPU201無いのレジスタCPU_FREE_TIMER(図10(a)参照)の値を、CPU RAM203上の変数LAST_BEAT_TIMEに格納する(ステップS1807)。この変数により、CPU201が最後にシーケンスクロック割込みがディレイタイムと一致する回数の同期拍をカウントしたと判断した時の時刻値が記憶される。
次にCPU201は、CPU RAM203上の変数SYNC_STATの値が1であるか否かを判定する(ステップS1808)。ここで、変数SYNC_STATは、今回のシーケンスクロック割込みに対応するDSP206からのディレイタイム割込みが先に発生し終わっているか否かを示している。もし、今回のシーケンスクロック割込みよりも先にそれに対応するディレイタイム割込みが発生していれば、後述するディレイタイム割込み処理では、その発生時刻が変数LAST_DELAY_TIMEに記録される処理のみが実行された後に(後述する図19のステップS1902参照)、シーケンスクロック補正処理は実行されずに変数SYNC_STATの値が1にセットされてから、そのディレイタイム割込み処理がそのまま終了して(後述する図19のステップS1903→S1906参照)、シーケンスクロック補正処理はそれに続いて発生するシーケンスクロック割込み処理にゆだねられる。一方、もし、今回のシーケンスクロック割込みのほうがそれに対応するディレイタイム割込みよりも先に発生すれば、変数SYNC_STATの値は前回のシーケンスクロック補正処理の後に0にリセットされたままとなっている(後述する図18のステップS1810又は図19のステップS1905参照)。
従って、変数SYNC_STATの値が1(ステップS1808の判定がYes)の場合には、ディレイタイム割込みのほうが先に発生しておりその発生時刻が変数LAST_DELAY_TIMEに揃っている状態であるため、CPU201は、シーケンスクロック補正処理を実行する(ステップS1809)。この処理の詳細は、図20のフローチャートを用いて後述する。
シーケンスクロック補正処理が終了すると、CPU201は、変数SYNC_STATの値を0にリセットする(ステップS1810)。その後、CPU201は、図18のフローチャートで示される今回のシーケンスクロック割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。
一方、変数SYNC_STATの値が0(ステップS1808の判定がNo)の場合には、今回のシーケンスクロック割込み処理に対応するディレイタイム割込みがまだ発生していない。この場合には、CPU201は、変数SYNC_STATに値1を格納し(ステップS1811)、その後そのまま、図18のフローチャートで示されるシーケンスクロック割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。この場合には、続けて今回のシーケンスクロック割込みに対応するディレイタイム割込みが発生したタイミングで、変数SYNC_STAT=1が判定されて、シーケンスクロック補正処理が実行されることになる(後述する図19のステップS1901→S1902→S1903の判定がYes→S1905)。なお、この場合に、今回のシーケンスクロック割込みに対応するディレイタイム割込みの発生の前に次回のシーケンスクロック割込みが再び発生して図18のフローチャートが実行されたとしても、変数SYNC_SEQ_CLOCKの値はステップS1806で0にリセットされている。このため、ステップS1801→S1802→S1803の判定がYes→S1804と実行された後に、ステップS1805の判定がNoとなる。これにより、今回のシーケンスクロック割込みに対応するディレイタイム割込みが発生する前に、次回のシーケンスクロック割込みに基づいてステップS1809のシーケンスクロック補正処理が実行されてしまうことはない。
図19は、DSP206内のディレイタイムカウンタ601のカウント値がディレイタイムサンプリング数608(図6参照)に達してディレイタイム割込みが発生したときにCPU201が実行する、ディレイタイム割込み処理の例を示すフローチャートである。この処理は、CPU201が、図11〜図17のフローチャートで例示される電子楽器制御処理を中断し、CPU ROM202に記憶されたディレイタイム割込み処理プログラムを実行する動作である。
CPU201はまず、変数DELAY_SYNCにセットされている値を判定する(ステップS1901)。
CPU201は、ステップS1901で、変数DELAY_SYNCにセットされた値が1ではない、すなわち、ディレイテンポシンクロナイズドモードがオフされていると判定した場合には、そのまま図19のフローチャートで示されるシーケンスクロック割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。
一方、CPU201は、ステップS1901で、変数DELAY_SYNCにセットされた値が1である、すなわち、ディレイテンポシンクロナイズドモードがオンされていると判定した場合には、前述したCPU201内のフリーランニングタイマカウンタ302(図3参照)の値を示すCPU201のレジスタCPU_FREE_TIMER(図10(a)参照)の値を、CPU RAM203上の変数LAST_DELAY_TIMEに格納する(ステップS1902)。この変数により、DSP206が最後にディレイタイム割込みを掛けた時の時刻値が記憶される。
次にCPU201は、CPU RAM203上の変数SYNC_STATの値が1であるか否かを判定する(ステップS1903)。ディレイタイム割込み処理が実行される場合における変数SYNC_STATの意味は、今回のディレイタイム割込みに対応する同期拍数に応じた回数分のシーケンスクロック割込みが先に発生し終わっているか否かを示している。もし、今回のディレイタイム割込みよりも先にそれに対応する上記同期拍数に応じた回数分のシーケンスクロック割込みが発生していれば、前述したシーケンスクロック割込み処理では、その発生時刻が変数LAST_BEAT_TIMEに記録される処理のみが実行された後に(前述した図18のステップS1807参照)、シーケンスクロック補正処理は実行されずに変数SYNC_STATの値が1にセットされてから、そのシーケンスクロック割込み処理がそのまま終了して(前述した図18のステップS1808→S1811参照)、シーケンスクロック補正処理はそれに続いて発生するディレイタイム割込み処理にゆだねられる。一方、もし、今回のディレイタイム割込みのほうがそれに対応する上記同期拍数に応じた回数分のシーケンスクロック割込みよりも先に発生すれば、変数SYNC_STATの値は前回のシーケンスクロック補正処理の後に0にリセットされたままとなっている(前述した図18のステップS1810又は後述する図19のステップS1905参照)。
従って、変数SYNC_STATの値が1(ステップS1903の判定がYes)の場合には、上記同期拍数に応じた回数分のシーケンスクロック割込みのほうが先に発生しておりその発生時刻が変数LAST_BEAT_TIMEに揃っている状態であるため、CPU201は、シーケンスクロック補正処理を実行する(ステップS1904)。この処理の詳細は、図20のフローチャートを用いて後述する。
シーケンスクロック補正処理が終了すると、CPU201は、変数SYNC_STATの値を0にリセットする(ステップS1905)。その後、CPU201は、図19のフローチャートで示される今回のディレイタイム割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。
一方、変数SYNC_STATの値が0(ステップS1903の判定がNo)の場合には、今回のディレイタイム割込み処理に対応する上記同期拍数に応じた回数分のシーケンスクロック割込みがまだ発生していない。この場合には、CPU201は、変数SYNC_STATに値1を格納し(ステップS1906)、その後そのまま、図19のフローチャートで示されるディレイタイム割込み処理を終了し、図11〜図17のフローチャートで例示される電子楽器制御処理を再開する。この場合には、続けて今回のディレイタイム割込みに対応する上記同期拍数に応じた回数分のシーケンスクロック割込みが発生したタイミングで、変数SYNC_STAT=1が判定されて、シーケンスクロック補正処理が実行されることになる(前述した図18のステップS1808の判定がYes→S1809)。なお、この場合に、今回のディレイタイム割込みの発生の前にシーケンスクロック割込みが再び発生して図18のフローチャートが実行されたとしても、変数SYNC_SEQ_CLOCKの値はステップS1806で0にリセットされている。このため、ステップS1801→S1802→S1803の判定がYes→S1804と実行された後に、ステップS1805の判定がNoとなる。これにより、今回のディレイタイム割込みに対応する上記同期拍数に応じた回数分のシーケンスクロック割込みが発生する前に、次回のディレイタイム割込みが発生してシーケンスクロック補正処理(ステップS1905)が実行されてしまうことはタイミング的にあり得ない。
図20は、図18のステップS1809又は図19のステップS1904のシーケンスクロック補正処理の詳細例を示すフローチャートである。以下のシーケンスクロック補正処理は、(7)式から(10)式を用いた説明で前述した原理に基づいて実行される。
CPU201はまず、前述した(9)式に基づいて、前述した図18のステップS1807で変数LAST_BEAT_TIMEにセットされている今回の同期拍数に応じた回数分のシーケンスクロック割込みの発生時刻と、前述した図19のステップS1902で変数LAST_DELAY_TIMEにセットされている今回のディレイタイム割込みの発生時刻との時間差dを計測する(ステップS2001)。
次にCPU201は、ユーザの操作によって図1の機能選択操作子102のDELAYエリアのBEATノブによって選択され、CPU RAM203上の変数DELAY_SYNC_BEATに格納されている設定値によって、CPU ROM202に記憶されているSYNC_BEAT_TBL(図9(a))を参照することにより、DELAY_SYNC_BEAT値に対応するエントリのNUMERATOR項目値SYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATORと、同エントリのDENOMINATOR項目値YNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATORとを用いて、前述した(7)式に対応する下記(19)式によって、ユーザが上記BEATノブで設定した設定値に対応する同期拍数bを算出する(ステップS2002)。
b=SYNC_BEAT_TBL(DELAY_SYNC_BEAT).NUMERATOR/SYNC_BEAT_TBL(DELAY_SYNC_BEAT).DENOMINATOR ・・(19)
次にCPU201は、ステップS2001で算出される時間差dと、ステップS2002で算出される同期拍数bとを用いて、前述した(10)式により、シーケンスクロックカウント上限値の補正値cを計算する(ステップS2003)。
そしてCPU201は、下記(20)式で示されるように、CPU201のレジスタCPU_TIMER_COUNT(図10(a)参照)にセットされているシーケンスクロックカウンタ301(図3)に設定されるシーケンスクロックカウント上限値から、ステップS2003で算出した補正値cを減算して、再びレジスタCPU_TIMER_COUNTにセットし、シーケンスクロックカウント上限値を更新する(ステップS2004)。なお、レジスタCPU_TIMER_COUNTの値は、前述した図11のステップS1101の初期化処理におけるステップS1203又は図11のステップS1104のテンポ設定処理における図13のステップS1306で設定される。
CPU_TIMER_COUNT
=CPU_TIMER_COUNT−c ・・(20)
この結果、次回のディレイ処理においては、CPU201においてシーケンスクロック割込みに従ってディレイタイム分だけ進行する自動演奏の時間と、DSP206におけるディレイタイム分のディレイ処理の時間とのずれが無くなることが期待される。
以上のように、本実施形態においては、音響効果として、音響信号に対してエコー効果を付加するディレイ処理を実行する構成について説明したが、本発明において音響効果はこれに限られるものでない。例えば、音響信号に対してビブラート効果及びトレモロ効果の少なくとも一方を付加するためのLFOを生成する処理を実行するように構成してもよい。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
サンプリングクロックをカウントするカウントとともに、前記カウントされたカウント値が第1のカウント値となる毎に割込み信号を出力する第1のカウント処理と、前記カウントされたカウント値に基づいて、供給される音響波形信号に対して音響効果を付加する音響効果処理と、を実行する第1の処理部と、
前記サンプリングクロックとは非同期でかつ異なる周期のシーケンスクロックをカウントする第2のカウント処理と、前記第2カウント処理によりカウントを開始してからカウント値が第2のカウント値になるまでに要する時間と、前記第1の処理部からの割り込み信号の出力間隔時間との差分時間を検出する検出処理と、前記検出された差分時間を小さくするように前記第2のカウント値を変更する補正処理と、前記第2のカウント処理によりカウントされるカウント値が前記第2の値になる毎に自動演奏を進行させる自動演奏進行処理を実行する第2の処理部と、
を備えた音響処理装置。
(付記2)
前記音響処理装置はさらに、前記サンプリングクロックを発生する第1のクロック発生部と、前記シーケンスクロックを発生する第2のクロック発生部と、を有する、付記1に記載の音響処理装置。
(付記3)
前記第1の処理部は、前記サンプリングクロックをカウントすることにより、前記第1のカウント処理を実行する第1のカウンタを有し、
前記第2の処理部は、前記シーケンスクロックをカウントすることにより、前記第2のカウント処理を実行する第1のカウンタを有する、付記1又は2記載の音響処理装置。
(付記4)
前記音響処理装置さらに、前記自動演奏のテンポを指定するテンポ指定部を有し、
前記第1のカウント値及び前記第2のカウント値は、前記指定されたテンポに対応して決定される、付記1乃至3のいずれかに記載の音響処理装置。
(付記5)
前記音響処理装置はさらに、複数種の自動演奏のテンポ夫々に対応して前記第1及び第2のカウント値を記憶するテーブルを有し、
前記第2の処理部はさらに、指定された自動演奏のテンポに対応する前記第1及び第2のカウント値を前記テーブルから読み出すとともに、前記第1のカウント値を前記第1の処理部に設定するカウント値設定処理を実行する、付記1乃至4のいずれかに記載の音響処理装置。
(付記6)
前記第1の処理部は、前記音響効果処理として、前記カウントされたカウント値が前記第1のカウント値に達するまでの時間の自然数倍及び所定自然数分の1倍のいずれか一方の関係の時間に同期したタイミングで、供給される音響信号に対して音響効果を付加する処理を実行する、付記1乃至5のいずれかに記載の音響処理装置。
(付記7)
前記第1の処理部は、前記音響効果処理として、前記音響信号に対してエコー効果を付加するディレイ処理を実行する、付記1乃至6いずれかに記載の音響処理装置。
(付記8)
前記第1の処理部は、前記音響効果処理として、前記音響信号に対してビブラート効果及びトレモロ効果の少なくとも一方を付加するためのLFOを生成する処理を実行する、付記1乃至6いずれかに記載の音響処理装置。
(付記9)
第1の処理部及び第2の処理部を有する音響処理装置に用いられる音響処理方法であって、
前記第1の処理部が、
サンプリングクロックをカウントするカウントとともに、前記カウントされたカウント値が第1のカウント値となる毎に割込み信号を出力し、
前記カウントされたカウント値に基づいて、供給される音響波形信号に対して音響効果を付加し、
前記第2の処理部が、
前記サンプリングクロックとは非同期でかつ異なる周期のシーケンスクロックをカウントし、
前記カウントを開始してからカウント値が第2のカウント値になるまでに要する時間と、前記第1の処理部からの割り込み信号の出力間隔時間との差分時間を検出し、
前記検出された差分時間を小さくするように前記第2のカウント値を変更し、
前記カウントされたカウント値が前記第2のカウント値になる毎に自動演奏を進行させる、
音響処理方法。
(付記10)
音響処理装置として用いられるコンピュータに、
サンプリングクロックをカウントするカウントとともに、前記カウントされたカウント値が第1のカウント値となる毎に割込み信号を出力するステップと、
前記カウントされたカウント値に基づいて、供給される音響波形信号に対して音響効果を付加するステップと、
前記サンプリングクロックとは非同期でかつ異なる周期のシーケンスクロックをカウントするステップと、
前記シーケンスクロックのカウントを開始してからカウント値が第2のカウント値になるまでに要する時間と、前記割り込み信号の出力間隔時間との差分時間を検出するステップと、
前記検出された差分時間を小さくするように前記第2のカウント値を変更するステップと、
前記シーケンスクロックをカウントすることに得られるカウント値が前記第2のカウント値になる毎に自動演奏を進行させるステップと、
を実行させるプログラム。
(付記11)
請求項1乃至8のいずれかに記載の音響処理装置と、
発生すべき楽音の音高を指定する演奏操作子と、
前記演奏操作子で指定された音高の楽音波形を音響波形信号として生成して、前記第1の処理部に供給する波形発生器と、
を備えた電子楽器。