米国特許情報 | 欧州特許情報 | 国際公開(PCT)情報 | Google の米国特許検索
 
     特許分類
A 農業
B 衣類
C 家具
D 医学
E スポ−ツ;娯楽
F 加工処理操作
G 机上付属具
H 装飾
I 車両
J 包装;運搬
L 化学;冶金
M 繊維;紙;印刷
N 固定構造物
O 機械工学
P 武器
Q 照明
R 測定; 光学
S 写真;映画
T 計算機;電気通信
U 核技術
V 電気素子
W 発電
X 楽器;音響


  ホーム -> 楽器;音響 -> カシオ計算機株式会社

発明の名称 波形発生装置および波形発生プログラム
発行国 日本国特許庁(JP)
公報種別 公開特許公報(A)
公開番号 特開2007−79104(P2007−79104A)
公開日 平成19年3月29日(2007.3.29)
出願番号 特願2005−266594(P2005−266594)
出願日 平成17年9月14日(2005.9.14)
代理人 【識別番号】100096699
【弁理士】
【氏名又は名称】鹿嶋 英實
発明者 佐藤 博毅
要約 課題
発音チャンネルを無駄に浪費せずに波形発生できる波形発生装置を実現する。

解決手段
楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータと、これら論理オシレータに対応付けられ、実際に波形を発生する複数の物理オシレータとの対応関係を記憶しておく。そして、楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータに割り当てる物理オシレータを、記憶しておいた対応関係を参照して動的に確保又は解放する。これにより、従来のように、発音するかどうかに関わらず、加算合成に用いる可能性のある全ての波形を同期再生しておく必要が無くなる結果、発音チャンネルを無駄に浪費せずに波形発生できる。
特許請求の範囲
【請求項1】
楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータ手段と、
これら論理オシレータ手段に対応付けられ、実際に波形を発生する複数の物理オシレータ手段と、
前記論理オシレータ手段と前記物理オシレータ手段との対応関係を記憶する記憶手段と、
楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータ手段に割り当てる物理オシレータ手段を、前記記憶手段に記憶される対応関係を参照して動的に確保又は解放する動的割り当て手段と
を具備することを特徴とする波形発生装置。
【請求項2】
前記動的割り当て手段は、ノートオンに応じて「不使用の物理オシレータ手段」、「スレーブオシレータとして使用中の物理オシレータ手段」、「マスタオシレータとして使用中の物理オシレータ手段」の優先順位でいずれかを選択して前記論理オシレータ手段のマスタオシレータに割り当てることを特徴とする請求項1記載の波形発生装置。
【請求項3】
前記動的割り当て手段は、「スレーブオシレータとして使用中の物理オシレータ手段」を選択して前記論理オシレータ手段のマスタオシレータに割り当てた場合、その選択した物理オシレータ手段を停止させて解放することを特徴とする請求項2記載の波形発生装置。
【請求項4】
前記動的割り当て手段は、「マスタオシレータとして使用中の物理オシレータ手段」を選択して前記論理オシレータ手段のマスタオシレータに割り当てた場合、その選択した物理オシレータ手段を確保していた発音チャンネル全体の発音を停止させ、当該発音チャンネルのマスタオシレータおよびスレーブオシレータとして対応付けられた全ての物理オシレータ手段を解放することを特徴とする請求項2記載の波形発生装置。
【請求項5】
前記動的割り当て手段は、ノートオンに応じて「不使用の物理オシレータ」、「スレーブオシレータとして使用中の物理オシレータ」の優先順位で選択して前記論理オシレータ手段のスレーブオシレータに割り当てることを特徴とする請求項1記載の波形発生装置。
【請求項6】
前記動的割り当て手段は、「スレーブオシレータとして使用中の物理オシレータ手段」を選択して前記論理オシレータ手段のスレーブオシレータに割り当てた場合、その選択した物理オシレータ手段の発音を停止させて解放することを特徴とする請求項5記載の波形発生装置。
【請求項7】
前記動的割り当て手段は、全ての物理オシレータ手段がマスタオシレータとして使用中の場合は選択しないことを特徴とする請求項5記載の波形発生装置。
【請求項8】
前記動的割り当て手段は、発音中にスレーブオシレータを再割り当てする場合、「不使用の物理オシレータ手段」のみ選択し、全ての物理オシレータ手段が論理オシレータ手段として使用されている場合は選択しないことを特徴とする請求項1記載の波形発生装置。
【請求項9】
楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータと、これら論理オシレータに対応付けられ、実際に波形を発生する複数の物理オシレータとの対応関係を記憶する記憶処理と、
楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータに割り当てる物理オシレータを、前記記憶処理にて記憶しておいた対応関係を参照して動的に確保又は解放する動的割り当て処理と
をコンピュータで実行させることを特徴とする波形発生プログラム。
発明の詳細な説明
【技術分野】
【0001】
本発明は、電子楽器に用いて好適な波形発生装置および波形発生プログラムに関する。
【背景技術】
【0002】
従来より、基本波およびその高調波成分を重ね合わせて任意の倍音構造を持つ波形を合成する倍音合成方式や、様々な波形周期や波形形状からなる複数の要素波形を重ね合わせて所望の波形を合成する加算合成方法が知られている。後者の加算合成方法に基づき構成される波形発生装置の一態様として、例えば特許文献1には、様々な波形周期や波形形状からなる複数の要素波形を予めメモリに記憶しておき、所望の波形を合成するのに必要な要素波形をメモリから読み出し、読み出した各要素波形について、所定の重み付け乗算を行ってからそれらを加算して1つの波形を形成する装置が開示されている。
【0003】
【特許文献1】特開2000−181459号公報
【発明の開示】
【発明が解決しようとする課題】
【0004】
ところで、加算合成方法による波形発生には、次のような問題がある。例えばピッチ(音高)が同じで相関性のある2つの波形を重ね合わせると、それら波形間の位相差に応じて周波数成分の打消しが生じてコムフィルタを通したような音色になることが知られている。そうした音色変化を常に同じように引き起こすには、重ね合わせる波形同士の位相差を常に一定に保つことが要求される。重ね合わせる波形同士の位相差を常に一定に保つには、波形開始点を一致させるだけでなく、例えばLFOやピッチベンド等によるピッチモジュレーションが、常に複数の発音チャンネルに対して同期し、かつ同じ変調幅を与え続けることも必要になる。
【0005】
加えて、合成波形の種類によっては加算合成に用いる波形を合成波形全体の発音の途中から合成開始したり、合成波形全体の発音の途中で合成終了したりすることも起こり得るが、既に発音中の合成波形の位相に合せて新たな加算波形を同期させることは極めて困難である為、発音するかどうかに関わらず、加算合成に用いる可能性のある全ての波形を合成波形全体の発音の最初から最後まで同期再生しておく必要がある。この結果、発音チャンネル(オシレータ)が無駄に浪費されてしまう、という問題がある。
【0006】
本発明は、このような事情に鑑みてなされたもので、発音チャンネルを無駄に浪費することなく波形発生することができる波形発生装置および波形発生プログラムを提供することを目的としている。
【課題を解決するための手段】
【0007】
上記目的を達成するため、請求項1に記載の発明では、楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータ手段と、これら論理オシレータ手段に対応付けられ、実際に波形を発生する複数の物理オシレータ手段と、前記論理オシレータ手段と前記物理オシレータ手段との対応関係を記憶する記憶手段と、楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータ手段に割り当てる物理オシレータ手段を、前記記憶手段に記憶される対応関係を参照して動的に確保又は解放する動的割り当て手段とを具備することを特徴とする。
【0008】
請求項2に記載の発明では、前記動的割り当て手段は、ノートオンに応じて「不使用の物理オシレータ手段」、「スレーブオシレータとして使用中の物理オシレータ手段」、「マスタオシレータとして使用中の物理オシレータ手段」の優先順位でいずれかを選択して前記論理オシレータ手段のマスタオシレータに割り当てることを特徴とする。
【0009】
請求項3に記載の発明では、前記動的割り当て手段は、「スレーブオシレータとして使用中の物理オシレータ手段」を選択して前記論理オシレータ手段のマスタオシレータに割り当てた場合、その選択した物理オシレータ手段を停止させて解放することを特徴とする。
【0010】
請求項4に記載の発明では、前記動的割り当て手段は、「マスタオシレータとして使用中の物理オシレータ手段」を選択して前記論理オシレータ手段のマスタオシレータに割り当てた場合、その選択した物理オシレータ手段を確保していた発音チャンネル全体の発音を停止させ、当該発音チャンネルのマスタオシレータおよびスレーブオシレータとして対応付けられた全ての物理オシレータ手段を解放することを特徴とする。
【0011】
請求項5に記載の発明では、前記動的割り当て手段は、ノートオンに応じて「不使用の物理オシレータ」、「スレーブオシレータとして使用中の物理オシレータ」の優先順位で選択して前記論理オシレータ手段のスレーブオシレータに割り当てることを特徴とする。
【0012】
請求項6に記載の発明では、前記動的割り当て手段は、「スレーブオシレータとして使用中の物理オシレータ手段」を選択して前記論理オシレータ手段のスレーブオシレータに割り当てた場合、その選択した物理オシレータ手段の発音を停止させて解放することを特徴とする。
【0013】
請求項7に記載の発明では、前記動的割り当て手段は、全ての物理オシレータ手段がマスタオシレータとして使用中の場合は選択しないことを特徴とする。
【0014】
請求項8に記載の発明では、前記動的割り当て手段は、発音中にスレーブオシレータを再割り当てする場合、「不使用の物理オシレータ手段」のみ選択し、全ての物理オシレータ手段が論理オシレータ手段として使用されている場合は選択しないことを特徴とする。
【0015】
請求項9に記載の発明では、楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータと、これら論理オシレータに対応付けられ、実際に波形を発生する複数の物理オシレータとの対応関係を記憶する記憶処理と、楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータに割り当てる物理オシレータを、前記記憶処理にて記憶しておいた対応関係を参照して動的に確保又は解放する動的割り当て処理とをコンピュータで実行させることを特徴とする。
【発明の効果】
【0016】
請求項1、9に記載の発明によれば、楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータ手段と、これら論理オシレータ手段に対応付けられ、実際に波形を発生する複数の物理オシレータ手段との対応関係を記憶しておき、楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータに割り当てる物理オシレータを、記憶しておいた対応関係を参照して動的に確保又は解放するので、従来のように、発音するかどうかに関わらず、加算合成に用いる可能性のある全ての波形を同期再生しておく必要が無くなる結果、発音チャンネルを無駄に浪費することなく波形発生することができる。
【発明を実施するための最良の形態】
【0017】
以下、図面を参照して本発明の実施の形態について説明する。
A.構成
(1)全体構成
図1は、本発明の実施の一形態による波形発生装置を備えた電子楽器100の構成を示すブロック図である。電子楽器100は、鍵盤1、スイッチ部2、ホイール操作子3、CPU4、表示部5、ROM6、RAM7、音源8、サウンドシステム9およびMIDIインタフェース10を備える。
【0018】
鍵盤1は、押離鍵操作(演奏操作)に応じたキーオン/キーオフ信号、鍵番号、ベロシティ等からなる演奏情報を発生する。スイッチ部2は、楽器パネルに配設される各種スイッチから構成され、操作されるスイッチ種に応じたスイッチイベントを発生する。スイッチ部2に配設される主要なスイッチとして、例えば音色選択スイッチ、ベンド幅設定スイッチ、ビブラート深さ設定スイッチおよびLFOレート設定スイッチ等が有り、これらスイッチ操作に対応した処理動作については追って詳述する。
【0019】
ホイール操作子3は、図示されていないベンダホイール3aおよびモジュレーションホイール3bを備える。ベンダホイール3aは、ユーザ操作に応じたベンダホイール変位値BVを発生してCPU4に供給する。モジュレーションホイール3bは、ユーザ操作に応じたモジュレーションホイール変位値MDを発生してCPU4に供給する。これら変位値BV,MDは、後述するように、鍵盤1の押鍵に応じて発音されるピッチ(音高)を可変制御するために用いられる。
【0020】
CPU4は、スイッチ部2のスイッチ操作に応じて発生するスイッチイベントに基づき楽器各部の動作状態を設定したり、鍵盤1から供給される演奏情報に応じたノートオン・ノートオフ指示を発生し、これを後述するRAM7に記憶される各種パラメータと共に音源8に送出して楽音形成させる。また、CPU4は上記ホイール操作子3から供給されるベンダ変位値BV,MDに応じたピッチ制御(ピッチベンド、ビブラート)を音源8に指示する。本発明の要旨に係わるCPU4の処理動作については追って詳述する。
【0021】
表示部5は、液晶表示パネルおよび駆動回路から構成され、CPU4から供給される表示制御信号に応じて、例えばパラメータ設定状態や動作状態などを表示する。ROM6は、プログラムエリアおよびデータエリアを備える。ROM6のプログラムエリアには、上記CPU4にロードされる各種制御プログラムが記憶される。
【0022】
ここで言う各種制御プログラムとは、後述するメインルーチン、スイッチ・ホイール処理、鍵盤処理、ノートオン処理、ノートレジスタ解放処理、物理OSC取得処理、OSCパラメータ設定処理、物理OSC解放処理、ノートオフ処理、発音タイマ処理、オシレータ処理、エンベロープ処理、ピッチエンベロープ処理および累算処理を含む。これら各処理の動作については後述する。ROM6のデータエリアには、音色パラメータや各種のアフタタッチテーブルATTBLが記憶される。ROM6のデータエリアに記憶される音色パラメータの構成については後述する。
【0023】
RAM7は、CPU4のワークエリアとして用いられ、各種レジスタ・フラグデータを一時記憶する。RAM7のワークエリアに格納される主要レジスタの構成については後述する。音源8は、CPU4から供給されるコマンドおよびパラメータに応じた楽音波形を発生する。音源8の構成については追って詳述する。サウンドシステム9は、音源8から出力される楽音波形から不要ノイズを除去する等のフィルタリングを施した後、レベル増幅してスピーカから発音させる。MIDIインタフェース10は、CPU4の制御の下で、外部のMIDI楽器とMIDIデータを授受する。
【0024】
(2)RAM7の構成
次に、図2〜図6を参照してRAM7に設けられる主要レジスタの構成を説明する。主要レジスタとは、オシレータパラメータレジスタ、スケジュールパラメータレジスタ、ノートパラメータレジスタ、物理・論理オシレータ対応パラメータレジスタおよび演奏パラメータレジスタからなる。
【0025】
<オシレータパラメータレジスタの構成>
図2(a)は、オシレータパラメータレジスタPROSC[0]〜PROSC[63]の構成を示す図である。オシレータパラメータレジスタPROSC[0]〜PROSC[63]は、それぞれ音源8が備える64個の各オシレータ毎のパラメータを一時記憶する。オシレータパラメータは、フラグRUN、フラグSlave、レジスタLnkOSC、レジスタAdrOfs、レジスタCurAdr、レジスタEndAdr、レジスタLoopAdr、レジスタPitchおよびレジスタValueから構成される。
【0026】
フラグRUNは、オシレータを動作させる場合に「1」、非動作の場合に「0」となるフラグである。フラグSlaveは、「1」の場合に別のオシレータのスレーブとして使用されることを表し、「0」の場合に不使用を表すフラグである。レジスタLnkOSCは、上記フラグSlaveが「1」の場合、つまりスレーブとして動作する際に、マスタ側オシレータ番号を一時記憶する。レジスタAdrOfsには、スレーブとして動作する際の、マスタ側オシレータの波形読出しアドレスとの差分を表すオフセットアドレスが格納される。
【0027】
レジスタCurAdrには、現在の波形読出しアドレスが格納される。レジスタEndAdrには、読出しエンドアドレスが格納される。レジスタLoopAdrには、波形をループ再生する際のスタートアドレスが格納される。レジスタPitchには、オシレータをマスタとして動作させる場合に、1サンプリング周期毎にレジスタCurAdrに加算する波形読出し位相(読出しピッチ)が格納される。レジスタValueには、対応するオシレータの波形出力値が格納される。
【0028】
<スケジュールパラメータレジスタの構成>
図2(b)は、スケジュールパラメータレジスタの構成を示す図である。スケジュールパラメータレジスタは、レジスタSSA[0]〜SSA[63]と、レジスタSSB[0]〜SSB[63]とに大別される。レジスタSSB[0]〜SSB[63]には、1サンプリング周期内に時分割に波形発生するオシレータの処理順序がCPU4により書き込まれる。
【0029】
フラグWDFは、CPU4がレジスタSSB[0]〜SSB[63]にオシレータの処理順序を書き込み終えた時点で「1」にセットされる。フラグWDFが「1」となった時点で、レジスタSSB[0]〜SSB[63]の内容がレジスタSSA[0]〜SSA[63]に転送される。後述する音源8は、このレジスタSSA[0]〜SSA[63]に転送される処理順序に従って1サンプリング周期内に各オシレータに対して時分割に波形発生させる。
【0030】
<ノートパラメータレジスタの構成>
図3は、ノートパラメータレジスタNR[0]〜NR[63]の構成を示す図である。ノートパラメータレジスタNR[0]〜[63]は、各発音チャンネル毎の楽音形成パラメータを一時記憶する。1つの発音チャンネルが備えるノートパラメータは、レジスタLOSC[0]〜[7]、レジスタOK、レジスタFT、レジスタPK、レジスタPP、レジスタPIL、レジスタPAR、レジスタPAL、レジスタPDR、レジスタPSL、レジスタPRR、レジスタPRL、レジスタPESおよびレジスタPECLから構成される。
【0031】
1つの楽音を形成する発音チャンネルには、マスタオシレータと、これに従属する最大7つのスレーブオシレータとからなる都合8つの仮想的な論理オシレータがアサイン可能になっている。つまり、1つの発音チャンネルは、最大8つの論理オシレータを有する。レジスタLOSC[0]〜[7]には、それぞれ論理オシレータパラメータが格納される。なお、論理オシレータの内、レジスタLOSC[0]はマスタオシレータであり、レジスタLOSC[1]〜[7]はスレーブオシレータである。論理オシレータパラメータは、フラグUse、レジスタAON、レジスタTCL、レジスタAIL、レジスタAAR、レジスタAAL、レジスタADR、レジスタASL、レジスタARR、フラグAES、レジスタAECLおよびレジスタATTNから構成される。
【0032】
レジスタLOSC[0]のマスタオシレータにおいて、フラグUseは「0」の場合に不使用を、「1」の場合に使用中を表す。一方、レジスタLOSC[1]〜[7]のスレーブオシレータでは、フラグUseは「−1」、「0」、「1」、「2」の4つの状態のいずれかを取る。スレーブオシレータでは、フラグUseが「−1」の場合には、常に不使用状態であることを表す。フラグUseが「0」の場合には、物理オシレータとして割り当てられておらず発音処理に関与しないが、エンベロープ形成を進行させる状態を表す。なお、物理オシレータとは、音源8が備える64個のオシレータの内から物理オシレータ番号で指定されるオシレータを指す。フラグUseが「1」の場合には、物理オシレータとして割り当てられて発音中にあり、エンベロープ形成する状態を表す。フラグUseが「2」の場合には、ノートオン直後の物理オシレータ割り当て待ち状態を表す。
【0033】
レジスタAONには、割り当てられている物理オシレータの番号が格納される。なお、物理オシレータが割り当てられていない場合、レジスタAONには「−1」が格納される。レジスタTCLには、音源8の増幅器84(後述する)に供給する音量レベルが格納される。レジスタAIL〜レジスタARRには、図4に図示する周知のADSL型の音量制御用エンベロープ波形を発生させるエンベロープパラメータが格納される。
【0034】
すなわち、図4に図示する通り、レジスタAILにはキーオン時点のイニシャルレベルAILが、レジスタAARにはアタックレートAARが、レジスタAALにはアタックレベルAALが、レジスタADRにはディケイレートADRが、レジスタASLにはサステインレベルASLが、レジスタARRにはキーオフ時点のリリースレートARRがそれぞれ格納される。
【0035】
フラグAESは、音量制御用エンベロープ波形の進行に応じた状態変化を表すフラグであり、つまり停止状態では「0」、アタック領域では「1」、ディケイ領域では「2」、サステイン領域では「3」、リリース領域では「4」となる。レジスタAECLには、上述したレジスタAIL〜レジスタARRに格納される各エンベロープパラメータに従って現在生成されている音量制御用エンベロープ波形の出力値が格納される。レジスタATTNには、ROM6に格納される各種のアフタタッチテーブルの内、参照するアフタタッチテーブルを指定するテーブル番号が格納される。
【0036】
次に、レジスタLOSC[0]〜[7]以降のノートパラメータについて説明する。レジスタOKには、音源8の波形メモリ82から読み出す波形データの原ピッチを表すオリジナルキー(ノートナンバ)が格納される。レジスタFTには、発音ピッチを微調整する調整値が格納される。レジスタPKには、演奏キー(鍵盤1において押鍵された鍵の鍵番号)が格納される。レジスタPPには、発音時の読出し速度を表すピッチ変位が格納される。なお、レジスタPPに格納されるピッチ変位は、演奏キーPK−オリジナルキーOK+調整値FT/100の関係から算出され、その単位は「半音」である。
【0037】
レジスタPIL〜レジスタPRLには、図5に図示する形状のピッチ制御用エンベロープ波形を発生させるエンベロープパラメータが格納される。すなわち、図5に図示する通り、レジスタPILにはキーオン時点のイニシャルレベルPILが、レジスタPARにはアタックレートPARが、レジスタPALにはアタックレベルPALが、レジスタPDRにはディケイレートPDRが、レジスタPSLにはサステインレベルPSLが、レジスタPRRにはキーオフ時点のリリースレートPRRが、レジスタPRLにはリリースレベルPRLがそれぞれ格納される。フラグPESは、ピッチ制御用エンベロープ波形の進行に応じた状態変化を表すフラグであり、つまり停止状態では「0」、アタック領域では「1」、ディケイ領域では「2」、サステイン領域では「3」、リリース領域では「4」となる。レジスタPECLには、上述したレジスタPIL〜レジスタPRLに格納される各エンベロープパラメータに従って現在生成されているピッチ制御用エンベロープ波形の出力値が格納される。
【0038】
<物理・論理オシレータ対応パラメータレジスタの構成>
図6(a)は、物理・論理オシレータ対応パラメータレジスタの構成を示す図である。物理・論理オシレータ対応パラメータレジスタは、レジスタPhOSC[0]〜PhOSC[63]、レジスタNRACおよびレジスタOACから構成される。レジスタPhOSC[0]〜PhOSC[63]には、物理オシレータ毎のアサイナパラメータが格納される。アサイナパラメータは、フラグUse、レジスタNRNおよびレジスタLONから構成される。
【0039】
フラグUseは、物理オシレータが使用中であるか否かを表すフラグであり、「0」の場合に不使用を表し、「1」の場合に使用中を表す。レジスタNRNには、物理オシレータを使用しているノートパラメータレジスタNR[n]の番号が格納される。レジスタLONには、論理オシレータ番号が格納される。論理オシレータ番号とは、上記ノートパラメータレジスタ番号NRNに対応するノートパラメータレジスタNR[NRN](図3参照)にアサインされる論理オシレータ(LOSC[0]〜[7])を指定する番号である。レジスタNRACおよびレジスタOACはアサインカウンタであり、これが意図するところについては追って述べる。
【0040】
<演奏パラメータレジスタの構成>
図6(b)は、演奏パラメータレジスタの構成を示す図である。演奏パラメータレジスタは、レジスタBV、レジスタBR、レジスタLP、レジスタMD、レジスタVD、レジスタLR、レジスタCAT[0]〜CAT[127]およびレジスタTNから構成される。レジスタBVには、ベンダホイール3aの操作に応じたベンダホイール変位量が格納される。レジスタBRには、スイッチ操作により設定されるベンドレンジ設定値が格納される。レジスタLPには、LFOの位相角が格納される。レジスタMDには、モジュレーションホイール3bの操作に応じたモジュレーションホイール変位量が格納される。レジスタVDには、スイッチ操作により設定されるビブラート深さ設定値が格納される。レジスタLRには、LFOレートが格納される。レジスタCAT[0]〜CAT[127]には、鍵番号(あるいはノートナンバ)毎のアフタタッチレベルが格納される。レジスタTNには、音色選択スイッチの操作で選択される音色番号が格納される。
【0041】
(3)音色パラメータの構成
次に、図7を参照してROM6のデータエリアに記憶される音色パラメータの構成を説明する。本実施形態では、ROM6のデータエリアに128種の音色パラメータTP[0]〜TP[127]を備える。1つの音色パラメータTPは、StartAdr、EndAdr、LoopAdr、Pitch、LOSC[0]〜[7]、OK、FT、PIL、PAR、PAL、PDR、PSL、PRRおよびPRLから構成される。
【0042】
StartAdrは、対応する音色の波形データのスタートアドレスである。EndAdrは、対応する音色の波形データのエンドアドレスである。LoopAdrは、波形データをループ再生する際のスタートアドレスを表すループアドレスである。Pitchは、対応する音色の波形データのオリジナルピッチである。なお、対応する音色の波形データそのものは、音源8が備える波形メモリ82(後述する)に記憶される。したがって、上記スタートアドレスStartAdr、エンドアドレスEndAdrおよびループアドレスLoopAdrは、波形メモリ82のアドレス空間を指定する。
【0043】
LOSC[0]〜[7]は、対応する音色に割り当てられた論理オシレータパラメータであり、LOSC[0]はマスタオシレータのパラメータ、LOSC[1]〜[7]はスレーブオシレータのパラメータを表す。論理オシレータパラメータは、Use、AdrOfs、AIL、AAR、AAL、ADR、ASL、ARRおよびATTNから構成される。
【0044】
Useは「−1」の場合に不使用を、「1」の場合に使用中を表す。AdrOfsは、スレーブとして動作する際の、マスタ側オシレータの波形読出しアドレスとの差分を表すオフセットアドレスである。AIL〜ARRは、図4に図示した音量制御用エンベロープ波形のエンベロープパラメータである。すなわち、図4に図示する通り、AILはイニシャルレベル、AARはアタックレート、AALはアタックレベル、ADRはディケイレート、ASLはサステインレベル、ARRはリリースレートである。ATTNは、ROM6に格納される各種のアフタタッチテーブルの内、参照するアフタタッチテーブルを指定するテーブル番号である。
【0045】
次に、論理オシレータパラメータLOSC[0]〜[7]以降の音色パラメータについて説明する。OKは、音源8の波形メモリ82から読み出す波形データの原ピッチを表すオリジナルキー(ノートナンバ)である。FTは、発音ピッチを微調整する調整値である。PIL〜PRLは、図5に図示する形状のピッチ制御用エンベロープ波形のエンベロープパラメータである。すなわち、図5に図示する通り、PILはイニシャルレベル、PARはアタックレート、PALはアタックレベル、PDRはディケイレート、PSLはサステインレベル、PRRはリリースレート、PRLはリリースレベルである。
【0046】
(4)音源8の構成
次に、図8を参照して音源8の構成について説明する。音源8は周知のDSPから構成される。したがって、図8はそのDSPにおいて実行されるマイクロプログラムの各機能をハードウェアイメージとして捉らえた機能ブロックを図示している。音源8は、アドレス発生器81、波形メモリ82、補間器83、増幅器84、累算器85およびD/A変換器86から構成される。
【0047】
パラメータレジスタ80は、CPU4から供給される、64個の各オシレータ毎のパラメータを一時記憶する。ここで言うパラメータとは、図2(a)に図示したオシレータパラメータレジスタPROSC[0]〜PROSC[63]、図2(b)に図示したスケジュールパラメータレジスタおよび図7に図示した音色パラメータを含む。アドレス発生器81は、パラメータレジスタ80から読み出す各パラメータを参照して64個の各オシレータ毎の波形読出しアドレスを発生する。波形メモリ82は、各種音色の波形データを記憶しており、アドレス発生器81から与えられる各オシレータ毎の波形読出しアドレスに応じて、各オシレータ毎の波形データを出力する。
【0048】
補間器83は、各オシレータ毎の波形データを補間出力する。補間出力とは、波形読出しアドレスの整数部に対応して読み出された波形データ(波形値)を、波形読出しアドレスの小数部で内挿補間する処理を指す。増幅器84は、CPU4から供給される音量制御用エンベロープ波形を、補間器83から補間出力される各オシレータ毎の波形データに乗算してレベル制御する。累算器85は、増幅器84にてレベル制御された各オシレータ毎の波形データを加算合成して楽音波形データを形成する。D/A変換器86は、累算器85から出力される楽音波形データを楽音波形信号にD/A変換して出力する。
【0049】
B.動作
次に、実施形態の動作を説明する。なお、上述した構成は、音源8がCPU4の指示に従って楽音形成するハードウェアイメージとして捉えたものであるが、実際には音源8のDSPプログラム処理とCPU4のプログラム処理とが互いに連携して楽音形成する。その為、本動作説明では、説明の簡略化を図る観点からCPU4を動作主体とし、CPU4が音源8のDSPプログラム処理をも兼ねるものとして表現する。
【0050】
以下では、図9〜図26を参照してCPU4が実行するメインルーチン、スイッチ・ホイール処理、鍵盤処理、ノートオン処理、ノートレジスタ解放処理、物理OSC取得処理、物理OSC解放処理、OSCパラメータ設定処理、ノートオフ処理、発音タイマ処理、オシレータ処理、エンベロープ処理、ピッチエンベロープ処理および累算処理の各動作について述べる。
【0051】
(1)メインルーチンの動作
上記構成による電子楽器100をパワーオンすると、CPU4は図9に示すメインルーチンを実行してステップSA1に処理を進め、RAM7に格納される各種レジスタ/フラグ類をリセットしたり初期値セットする初期化を実行する。次いで、ステップSA2では、スイッチ部2のスイッチ操作や、ホイール操作子3の操作に対応したスイッチ・ホイール処理を行う。
【0052】
続いて、ステップSA3では、鍵盤1の押離鍵操作に応じて音源8に発音/消音を指示する鍵盤処理を実行する。そして、ステップSA4では、上記鍵盤処理と同様、MIDIインタフェース10を介して外部MIDI機器から入力されるノートオン・ノートオフイベントに応じて音源8に発音/消音を指示するMIDI処理を実行する。次に、ステップSA5では、例えばユーザ設定された動作状態を表示部5に表示する等の、その他の処理を実行した後、上記ステップSA2に処理を戻す。以後、電子楽器100がパワーオフされる迄、ステップSA2〜SA5を繰り返す。
【0053】
(2)スイッチ・ホイール処理の動作
図10を参照してスイッチ・ホイール処理の動作について説明する。上述したメインルーチンのステップSA2(図9参照)を介して本処理が実行されると、CPU4はスイッチ部2やホイール操作子3の操作に応じたパラメータを設定する。すなわち、ステップSB1では、スイッチ部2に配設される音色選択スイッチの操作により選択される音色番号をレジスタTNにストアする。レジスタTNは、前述した演奏パラメータレジスタ(図6(b)参照)に設けられる。
【0054】
次に、ステップSB2では、ホイール操作子3のベンダホイール3aから出力されるベンダホイール変位値をレジスタBVにストアする。レジスタBVは、前述した演奏パラメータレジスタ(図6(b)参照)に設けられる。ステップSB3では、スイッチ部2に配設されるベンド幅設定スイッチの操作により設定されるベンドレンジ設定値をレジスタBRにストアする。レジスタBRは、前述した演奏パラメータレジスタ(図6(b)参照)に設けられる。続くステップSB4では、ホイール操作子3のモジュレーションホイール3bから出力されるモジュレーションホイール設定値をレジスタMDにストアする。レジスタMDは、前述した演奏パラメータレジスタ(図6(b)参照)に設けられる。
【0055】
ステップSB5では、スイッチ部2に配設されるビブラート深さ設定スイッチの操作により設定されるビブラート深さ設定値をレジスタVDにストアする。レジスタVDは、前述した演奏パラメータレジスタ(図6(b)参照)に設けられる。次いで、ステップSB6では、スイッチ部2に配設されるLFOレート設定スイッチの操作により設定されるLFOレート設定値をレジスタLRにストアする。レジスタLRは、前述した演奏パラメータレジスタ(図6(b)参照)に設けられる。そして、ステップSB7では、その他のスイッチ操作に対応した処理を実行して本処理を終える。
【0056】
(3)鍵盤処理の動作
次に、図11を参照して鍵盤処理の動作を説明する。上述したメインルーチンのステップSA3(図9参照)を介して本処理が実行されると、CPU4は図11に図示するステップSC1に進み、鍵盤1が発生する演奏情報に基づき、当該鍵盤1の押離鍵状態を判定する。押鍵された場合には、ステップSC2に進み、押鍵された鍵の鍵番号をレジスタKeyにストアしてから、ステップSC3を介してノートオン処理(後述する)を実行した後、ステップSC6に進む。離鍵された場合には、ステップSC4に進み、離鍵された鍵の鍵番号をレジスタKeyにストアしてから、ステップSC5を介してノートオフ処理(後述する)を実行した後、ステップSC6に進む。押離鍵操作が行われず、鍵変化が生じ無ければ、ステップSC6に進む。
【0057】
ステップSC6では、一旦、レジスタKeyをゼロリセットする。そして、ステップSC7〜SC8では、フォーマット上許される鍵盤1の全鍵(128鍵)を走査するまでレジスタKeyをインクリメントして歩進させながら、そのレジスタKeyの値で指定される鍵番号のアフタタッチ値を、前述した演奏パラメータレジスタ(図6参照)中のレジスタCAT[Key]にストアして本処理を完了させる。なお、鍵盤1において実際に対応する物理的な鍵が存在しない鍵番号Keyについては、対応するレジスタCAT[Key]に「0」をストアする。
【0058】
(4)ノートオン処理の動作
次に、図12〜図13を参照してノートオン処理の動作について説明する。上述した鍵盤処理のステップSC3(図11参照)を介して本処理が実行されると、CPU4はステップSD1に進み、レジスタNRACの値をレジスタTheNRにセットする。レジスタNRACは、64チャンネル分の発音チャンネルに発音割り当てを行う毎に、その次のチャンネル番号が設定されるカウンタであり、その値は「0」〜「63」の範囲で巡回する。したがって、ステップSD1では、次に発音割り当てを行う発音チャンネル(ノートパラメータレジスタNRに相当)の初期値として、レジスタNRACの値がレジスタTheNRにセットされる。以後、レジスタTheNRに格納される値をノートパラメータレジスタ番号TheNRと称す。
【0059】
ステップSD2では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータのフラグUse(NR[TheNR].LOSC[0].Use)が使用されていないかどうかを判断する。使用中(NR[TheNR].LOSC[0].Use=1)であると、判断結果が「NO」となり、ステップSD3に進む。ステップSD3では、ノートパラメータレジスタ番号TheNRをインクリメントして歩進させる。なお、歩進されたノートパラメータレジスタ番号TheNRが「63」を超えたならば、ノートパラメータレジスタ番号TheNRを「0」に戻す。次いで、ステップSD4では、歩進されたノートパラメータレジスタ番号TheNRがレジスタNRACの値に一致するか否か、つまり一巡したかどうかを判断する。一巡していなければ、判断結果は「NO」になり、上記ステップSD2に処理を戻す。
【0060】
このように、ステップSD2〜SD4では、一巡してレジスタNRACの値に戻るまでノートパラメータレジスタ番号TheNRを歩進させながら、ノートパラメータレジスタNR[TheNR]から不使用のマスタオシレータ(NR[TheNR].LOSC[0].Use=0)を探し出す。その過程で不使用のマスタオシレータが見つかると、上記ステップSD2の判断結果が「YES」になり、後述のステップSD6に進む。これに対し、不使用のマスタオシレータが見つからず、ノートパラメータレジスタ番号TheNRが一巡してレジスタNRACの値に戻ると、上記ステップSD4の判断結果が「YES」になり、ステップSD5に進む。
【0061】
ステップSD5では、後述するように、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられている論理オシレータ(マスタオシレータおよびスレーブオシレータ)に対応付けられた全ての物理オシレータの発音を停止させた後、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータ(NR[TheNR].LOSC[0].Use)を不使用にするノートレジスタ解放処理を実行する。次いで、ステップSD6では、インクリメントして歩進させたノートパラメータレジスタ番号TheNRをレジスタNRACにストアする。但し、歩進させたノートパラメータレジスタ番号TheNRが「63」を超えた場合には、レジスタNRACをゼロリセットする。
【0062】
続いて、ステップSD7では、音色選択スイッチ操作に応じてレジスタTNに格納された音色番号(以下、音色番号TNと記す)により指定される音色パラメータTP[TN](図7参照)の内、音源8の波形メモリ82から読み出す波形データの原ピッチを表すオリジナルキーOK、発音ピッチを微調整する調整値FTおよびピッチ制御用エンベロープ波形のエンベロープパラメータ(イニシャルレベルPIL、アタックレートPAR、アタックレベルPAL、ディケイレートPDR、サステインレベルPSL、リリースレートPRR、リリースレベルPRL)をROM6のデータエリアから読み出し、これらをノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタOK、レジスタFT、レジスタPIL、レジスタPAR、レジスタPAL、レジスタPDR、レジスタPSL、レジスタPRRおよびレジスタPRLにそれぞれストアする。
【0063】
また、ステップSD7では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、ピッチ制御用エンベロープ波形の進行に応じた状態変化を表すフラグPESに停止状態を表す値「0」をセットする。さらに、ステップSD7では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、鍵盤1において押鍵された鍵の鍵番号Keyを演奏キーとしてレジスタPKにストアする。
【0064】
また、ステップSD7では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、発音時の読出し速度を表すピッチ変位をレジスタPPにストアする。レジスタPPにストアされるピッチ変位は、(Key−NR[TheNR].OK)+(NR[TheNR].FT/100)にて算出する。すなわち、押鍵された鍵の鍵番号Keyから選択音色に対応してROM6からコピーしたオリジナルキーOKを減算した値に、選択音色に対応してROM6からコピーした調整値FT/100を加算して半音単位で表されるピッチ変位PPを算出する。次に、ステップSD8では、論理オシレータを指定する論理オシレータ番号TheLOSCに「0」をストアすると共に、物理オシレータ取得フラグAsnFlgに「0」をセットする。
【0065】
続いて、図13に図示するステップSD9に進み、物理OSC取得処理を実行する。後述するように、ノートオン処理下(物理オシレータ取得フラグAsnFlgが「0」)で実行される物理OSC取得処理では、先ず不使用の物理オシレータがあれば、それを発音割り当て対象の物理オシレータとして取得する。一方、不使用の物理オシレータが無い場合には、使用中のスレーブオシレータを見つけて選択し、そのスレーブオシレータに対応付けられた物理オシレータの発音を停止させて一旦、不使用に設定した後、発音割り当て対象の物理オシレータとして取得する。さらに使用中のスレーブオシレータが存在しない場合には、使用中のマスタオシレータを選択し、そのマスタオシレータに対応付けられた物理オシレータの発音を停止させて一旦、不使用に設定した後、発音割り当て対象の物理オシレータとして取得する。つまり、マスタオシレータ(論理オシレータ番号TheLOSC=0)の発音割り当ての対象となる物理オシレータが、必ず取得される。
【0066】
次いで、ステップSD10では、上記ステップSD9の発音割り当てによって物理オシレータと論理オシレータとの対応付けが変更されるのに伴い、1サンプリング周期内に時分割に波形発生するオシレータの処理順序を保持するレジスタSSB[0]〜SSB[63](図2(b)参照)の内容を更新すると共に、フラグWDFに「1」をセットして更新終了を表す。なお、フラグWDFが「1」となった時点で、レジスタSSB[0]〜SSB[63]の内容がAバッファのレジスタSSA[0]〜SSA[63]に転送される。これにより、後述する発音タイマ処理(図20参照)によって、レジスタSSA[0]〜SSA[63]にストアされる処理順序に従って1サンプリング周期内に各オシレータに対して時分割に波形発生させる。
【0067】
次に、ステップSD11では、OSCパラメータ設定処理を実行する。ノートオン処理中に起動されるOSCパラメータ設定処理では、後述するように、マスタオシレータとして動作する物理オシレータの波形発生態様を設定する。次いで、ステップSD12では、音色番号TNにて指定される音色パラメータTP[TN]において、論理オシレータ番号TheLOSCで指定される論理オシレータパラメータLOSC[TheLOSC]中のイニシャルレベルAIL、アタックレートAAR、アタックレベルAAL、ディケイレートADR、サステインレベルASLおよびリリースレートARRをROM6から読み出し、これら音量制御用エンベロープ波形(図4参照)のエンベロープパラメータを、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタAIL〜レジスタARRにストアする。
【0068】
また、ステップSD12では、音色番号TNにて指定される音色パラメータTP[TN]において、論理オシレータ番号TheLOSCで指定される論理オシレータパラメータLOSC[TheLOSC]中のアフタタッチテーブル番号ATTNを、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタATTNにストアする。
【0069】
さらに、ステップSD12では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグAESに「0」をセットし、音量制御用エンベロープ波形が停止状態であることを表す。
【0070】
そして、ステップSD13では、論理オシレータ番号TheLOSCをインクリメントして歩進させ、続くステップSD14では、歩進された論理オシレータ番号TheLOSCが「7」を超えたか否か判断する。論理オシレータ番号TheLOSCが「7」を超えていなければ、判断結果は「NO」になり、ステップSD15に進む。ステップSD15では、音色番号TNにて指定される音色パラメータTP[TN]において、論理オシレータ番号TheLOSCで指定される論理オシレータパラメータLOSC[TheLOSC]中のフラグUse(TP[TN].LOSC[TheLOSC].Use)が「−1」、つまり論理オシレータ番号TheLOSCで指定される論理オシレータが不使用であるかどうかを判断する。
【0071】
論理オシレータ番号TheLOSCで指定される論理オシレータが不使用であれば、判断結果は「YES」になり、ステップSD16に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグUse(NR[TheNR].LOSC[TheLOSC].Use)に不使用を表す「−1」をセットする。この後、上述のステップSD13に処理を戻して論理オシレータ番号TheLOSCを歩進させる。
【0072】
一方、論理オシレータ番号TheLOSCで指定される論理オシレータが使用中であると、上記ステップSD15の判断結果は「NO」となり、ステップSD17に進む。ステップSD17では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグUse(NR[TheNR].LOSC[TheLOSC].Use)に「2」をセットしてノートオン直後の物理オシレータ割り当て待ち状態を表す。
【0073】
この後、上述したステップSD12に処理を戻し、歩進された論理オシレータ番号TheLOSCの論理オシレータに音量制御用エンベロープ波形(図4参照)のエンベロープパラメータを設定する。以後、論理オシレータ番号TheLOSCが「7」を超えるまで、上述したステップSD12〜SD17を繰り返す。そして、歩進された論理オシレータ番号TheLOSCが「7」を超えると、ステップSD14の判断結果が「YES」になり、本処理を終える。
【0074】
(5)ノートレジスタ解放処理の動作
次に、図14を参照してノートレジスタ解放処理の動作を説明する。前述したノートオン処理のステップSD5(図12参照)、後述する物理OSC取得処理のステップSF9(図16参照)あるいは後述するノートオフ処理のステップSJ5(図19参照)を介して本処理が実行されると、CPU4は図14に図示するステップSE1に進む。ステップSE1では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータのフラグUse(NR[TheNR].LOSC[0].Use)が使用されていないかどうかを判断する。不使用(フラグUseが「0」)であれば、判断結果は「YES」となり、この場合、ノートレジスタ解放の必要がない為、何も行わずに本処理を完了させる。
【0075】
一方、使用中(フラグUseが「1」)の場合には、上記ステップSE1の判断結果は「NO」になり、ステップSE2に進み、ポインタnをゼロリセットする。次いで、ステップSE3では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているオシレータの内、ポインタnで指定されるオシレータのフラグUse(NR[TheNR].LOSC[n].Use)が使用されていないかどうかを判断する。
【0076】
ここで、ポインタnが「0」の場合、つまりポインタnがマスタオシレータを指定する場合には、上記ステップSE1においてマスタオシレータのフラグUse(NR[TheNR].LOSC[0].Use)は使用中(フラグUseが「1」)と判断されているので、このステップSE3の判断結果は「YES」になり、ステップSE4に進む。ステップSE4では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているオシレータの内、ポインタnで指定されるオシレータに対応付けられた物理オシレータ番号(NR[TheNR].LOSC[n].AON)をレジスタkにストアする。以下、レジスタkの値を物理オシレータ番号kと記す。
【0077】
ステップSE5では、物理オシレータ番号k(NR[TheNR].LOSC[n].AON)が「−1」、つまり物理オシレータが割り当てられていない状態であるかどうかを判断する。物理オシレータが割り当てられていない場合には、判断結果が「YES」になり、後述するステップSE7に処理を進める。これに対し、物理オシレータが割り当てられていれば、上記ステップSE5の判断結果は「NO」になり、ステップSE6に進む。
【0078】
ステップSE6では、物理オシレータ番号kで指定される物理オシレータ(k)の発音を停止させるとともに、図6(a)に図示する物理・論理オシレータ対応パラメータレジスタにおいて、物理オシレータ番号kで指定されるレジスタPhOSC[k]中のフラグUseに「0」をセットして不使用状態に設定すると共に、図2(a)に図示するオシレータパラメータレジスタにおいて、物理オシレータ番号kで指定されるオシレータパラメータレジスタPROSC[k]中のフラグRUNに「0」をセットして非動作の状態に設定する。
【0079】
次いで、ステップSE7では、ポインタnを歩進させ、続くステップSE8では、歩進させたポインタnが「7」を超えたかどうかを判断する。ポインタnが「7」を超えていなければ、判断結果は「NO」になり、上述したステップSE3に処理を戻す。以後、ポインタnが「7」を超えるまで上記ステップSE3〜SE8を繰り返すことによって、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられている使用中のマスタオシレータおよびスレーブオシレータに対応付けられた物理オシレータの発音を停止させる。
【0080】
こうして、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられている論理オシレータ(マスタオシレータおよびスレーブオシレータ)に対応付けられた全ての物理オシレータの発音を停止させ終えると、上記ステップSE8の判断結果が「YES」になり、ステップSE9に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータのフラグUse(NR[TheNR].LOSC[0].Use)を不使用に設定して本処理を終える。
【0081】
(6)物理OSC取得処理の動作
次に、図15〜図16を参照して物理OSC取得処理の動作を説明する。前述したノートオン処理のステップSD9(図13参照)あるいは後述するエンベロープ処理のステップSM16(図24参照)を介して本処理が実行されると、CPU4は図15に図示するステップSF1に進む。ステップSF1では、レジスタsに初期値「−1」をストアすると共に、レジスタOACの値をレジスタTheOSCにセットする。
【0082】
レジスタOACは、64チャンネル分の物理オシレータに発音割り当てを行う毎に、その次のチャンネル番号が設定されるカウンタであり、その値は「0」〜「63」の範囲で巡回する。したがって、ステップSF1では、発音割り当てを行う物理オシレータの初期値として、レジスタOACの値がレジスタTheOSCにセットされる。以後、レジスタTheOSCの内容を物理オシレータ番号TheOSCと称す。
【0083】
次いで、ステップSF2では、図6(a)に図示した物理・論理オシレータ対応パラメータレジスタにおいて、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のフラグUse(PhOSC[TheOSC].Use)が「0」、つまり物理オシレータ番号TheOSCで指定される物理オシレータが不使用であるかどうかを判断する。使用中であると、判断結果は「NO」となり、ステップSF3に進む。
【0084】
ステップSF3では、レジスタsの値が初期値「−1」であって、しかも物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]中のレジスタLONの値が「0」でない場合、つまり物理オシレータ番号TheOSCで指定される物理オシレータに対応付けられた論理オシレータがスレーブオシレータであれば、レジスタsに現在の物理オシレータ番号TheOSCをストアする。すなわち、スレーブオシレータとして使用されている物理オシレータが少なくとも1つ存在する場合には、その物理オシレータ番号がレジスタsにストアされる。
【0085】
続いて、ステップSF4では、物理オシレータ番号TheOSCを歩進させる。なお、歩進させた物理オシレータ番号TheOSCが「63」を超えた場合には、物理オシレータ番号TheOSCを「0」に戻す。そして、ステップSF5では、歩進させた物理オシレータ番号TheOSCがレジスタOACの値に一致するか否か、つまり一巡したかどうかを判断する。一巡していなければ、判断結果は「NO」になり、上記ステップSF2に処理を戻す。
【0086】
このように、ステップSF2〜SF5では、一巡してレジスタOACの値に戻るまで物理オシレータ番号TheOSCを歩進させながら、レジスタPhOSC[TheOSC]の内から不使用の物理オシレータ(PhOSC[TheOSC].Use=0)を探し出す。この過程で不使用の物理オシレータ(PhOSC[TheOSC].Use=0)が見つかると、上記ステップSF2の判断結果が「YES」になり、図16に図示するステップSF10に処理を進める。
【0087】
ステップSF10では、インクリメントして歩進させた物理オシレータ番号TheOSCを、次回発音割り当て対象の物理オシレータ番号としてレジスタOACにストアして本処理を終える。すなわち、後述する物理オシレータ取得フラグAsnFlgの値にかかわらず、不使用の物理オシレータが見つかった場合は、その物理オシレータ番号がTheOSCに設定された状態で本処理を終える。なお、歩進させた物理オシレータ番号TheOSCが「63」を超えた場合には、レジスタOACを「0」に戻す。
【0088】
一方、一巡してレジスタOACの値に戻るまで物理オシレータ番号TheOSCを歩進させても、不使用の物理オシレータ(PhOSC[TheOSC].Use=0)が見つからない場合、つまり全ての物理オシレータが使用中であると、上記ステップSF5の判断結果が「YES」になり、図16に図示するステップSF6に進む。
【0089】
ステップSF6以降では、物理オシレータ取得フラグAsnFlgの値に応じて、発音割り当ての対象となる物理オシレータ番号を取得する。なお、物理オシレータ取得フラグAsnFlgは、前述したノートオン処理により「0」がセットされ、さらに後述のエンベロープ処理(図24参照)において「1」又は「2」がセットされる。以下では、物理オシレータ取得フラグAsnFlgが「0」の場合、「1」の場合および「2」の場合に分けて動作を説明する。
【0090】
<物理オシレータ取得フラグAsnFlgが「0」の場合>
物理オシレータ取得フラグAsnFlgが「0」であると、ステップSF6からステップSF7に進み、レジスタsの値が初期値「−1」であるか否か、すなわち全ての物理オシレータがマスタオシレータとして使用されているかどうかを判断する。全ての物理オシレータがマスタオシレータとして使用されていると、判断結果は「YES」になり、ステップSF8に進む。ステップSF8では、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のノートパラメータレジスタ番号NRN(PhOSC[TheOSC].NRN)を、ノートパラメータレジスタ番号TheNRに設定する。
【0091】
そして、ステップSF9に進み、ノートレジスタ解放処理を実行する。前述したように、ノートレジスタ解放処理では、上記ステップSF8にて設定されたノートパラメータレジスタ番号TheNRにより指定されるノートパラメータレジスタNR[TheNR]に割り当てられている論理オシレータ(マスタオシレータおよびスレーブオシレータ)に対応付けられた全ての物理オシレータの発音を停止させた後、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータのフラグUse(NR[TheNR].LOSC[0].Use)を不使用にする。
【0092】
ノートレジスタ解放処理が完了すると、ステップSF10に進み、インクリメントして歩進させた物理オシレータ番号TheOSCを、次回発音割り当て対象の物理オシレータ番号としてレジスタOACにストアして本処理を終える。なお、歩進させた物理オシレータ番号TheOSCが「63」を超えた場合には、レジスタOACを「0」に戻す。
【0093】
これに対し、少なくとも1つの物理オシレータがスレーブオシレータとして使用されていると、上述したステップSF7の判断結果が「NO」になり、ステップSF12に進む。ステップSF12では、レジスタsの物理オシレータ番号を、物理オシレータ番号TheOSCに設定する。
【0094】
次いで、ステップSF13では、物理OSC解放処理を実行する。後述するように、物理OSC解放処理では、上記ステップSF12において設定された物理オシレータ番号TheOSCの物理オシレータの発音を停止させる一方、この発音停止に伴いノートパラメータレジスタNRの論理オシレータパラメータの内容(フラグUseおよびレジスタAON)を更新し、この更新に対応して物理・論理オシレータ対応パラメータレジスタPhOSCの内容(PhOSC[TheOSC].Use)およびオシレータパラメータレジスタPROSCの内容(PROSC[TheOSC].RUN)を変更する。
【0095】
そしてこの後、ステップSF10に進み、インクリメントして歩進させた物理オシレータ番号TheOSCを、次回発音割り当て対象の物理オシレータ番号としてレジスタOACにストアして本処理を終える。なお、歩進させた物理オシレータ番号TheOSCが「63」を超えた場合には、レジスタOACを「0」に戻す。すなわち、物理オシレータ取得フラグAsnFlgが「0」の場合、スレーブオシレータとして使用されている物理オシレータが存在すれば、その物理オシレータ番号がTheOSCに設定される一方、スレーブオシレータとして使用されている物理オシレータが存在しなければ、マスタオシレータとして使用されている物理オシレータの物理オシレータ番号がTheOSCに設定される。つまり、発音割り当ての対象となる物理オシレータが必ず取得されることになる。
【0096】
<物理オシレータ取得フラグAsnFlgが「1」の場合>
物理オシレータ取得フラグAsnFlgが「1」であると、ステップSF6からステップSF11に進み、レジスタsの値が初期値「−1」であるか否か、すなわち全ての物理オシレータがマスタオシレータとして使用されているかどうかを判断する。全ての物理オシレータがマスタオシレータとして使用されていると、判断結果は「YES」になり、ステップSF14に進み、物理オシレータ番号TheOSCを「−1」に設定して本処理を終える。すなわち、全ての物理オシレータがマスタオシレータとして使用されていれば、発音割り当ての対象となる物理オシレータ番号を取得せずに本処理を完了させる。
【0097】
一方、上記ステップSF11の判断結果が「NO」の場合、すなわち少なくとも1つの物理オシレータがスレーブオシレータとして使用されていると、ステップSF12に進み、レジスタsの物理オシレータ番号を、物理オシレータ番号TheOSCに設定する。次いで、ステップSF13では、上記ステップSF12において設定された物理オシレータ番号TheOSCの物理オシレータの発音停止を音源8に指示する一方、この発音停止に伴いノートパラメータレジスタNRの論理オシレータパラメータの内容(フラグUseおよびレジスタAON)を更新し、この更新に対応して物理・論理オシレータ対応パラメータレジスタPhOSCの内容(PhOSC[TheOSC].Use)およびオシレータパラメータレジスタPROSCの内容(PROSC[TheOSC].RUN)を変更する物理OSC解放処理を実行する。
【0098】
そしてこの後、ステップSF10に進み、インクリメントして歩進させた物理オシレータ番号TheOSCを、次回発音割り当て対象の物理オシレータ番号としてレジスタOACにストアして本処理を終える。なお、歩進させた物理オシレータ番号TheOSCが「63」を超えた場合には、レジスタOACを「0」に戻す。すなわち、物理オシレータ取得フラグAsnFlgが「1」の場合、スレーブオシレータとして使用されている物理オシレータが存在すれば、その物理オシレータ番号がTheOSCに設定される一方、スレーブオシレータとして使用されている物理オシレータが存在しなければ、TheOSCには「−1」が設定される。つまり、スレーブオシレータとして使用されている物理オシレータが存在する場合にのみ、発音割り当ての対象となる物理オシレータが取得されることになる。
【0099】
<物理オシレータ取得フラグAsnFlgが「2」の場合>
物理オシレータ取得フラグAsnFlgが「2」であると、ステップSF6からステップSF14に進み、物理オシレータ番号TheOSCを「−1」に設定して本処理を終える。すなわち、全ての物理オシレータが使用されていると、発音割り当ての対象となる物理オシレータ番号を取得せずに本処理を完了させる。
【0100】
(7)物理OSC解放処理の動作
次に、図17を参照して物理OSC解放処理の動作を説明する。前述した物理OSC取得処理のステップSF13(図16参照)あるいは後述するエンベロープ処理のステップSM12(図24参照)を介して本処理が実行されると、CPU4は図17に図示するステップSG1に進む。ステップSG1では、物理オシレータ番号TheOSCが「−1」、つまり前述した物理OSC取得処理(図15〜図16参照)において物理オシレータ番号TheOSCを取得しない状態であるかどうかを判断する。物理オシレータ番号TheOSCを取得しない状態であると、判断結果は「YES」になり、何も行わずに本処理を終える。
【0101】
一方、物理オシレータ番号TheOSCが取得されていると、上記ステップSG1の判断結果は「NO」になり、ステップSG2に進む。ステップSG2では、物理オシレータ番号TheOSCで指定される物理オシレータの発音を停止させる。また、ステップSG2では、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のノートパラメータレジスタ番号NRN(PhOSC[TheOSC].NRN)をレジスタk1にストアすると共に、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]の論理オシレータ番号LON(PhOSC[TheOSC].LON)をレジスタk2にストアする。
【0102】
さらに、ステップSG2では、レジスタk1のノートパラメータレジスタ番号NRNで指定されるノートパラメータレジスタNR[k1]において、レジスタk2の論理オシレータ番号LONにて指定されるレジスタLOSC[k2]中のフラグUse(NR[k1].LOSC[k2].Use)に不使用を表す「0」をセットすると共に、レジスタAON(NR[k1].LOSC[k2].AON)に「−1」をストアする。
【0103】
加えて、ステップSG2では、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のフラグUse(PhOSC[TheOSC].Use)に不使用を表す「0」をセットする一方、物理オシレータ番号TheOSCで指定されるオシレータパラメータレジスタPROSC[TheOSC]のフラグRUN(PROSC[TheOSC].RUN)に「0」をセットして物理オシレータ番号TheOSCの物理オシレータを非動作に設定する。
【0104】
このように、物理OSC解放処理では、前述の物理OSC取得処理により取得された物理オシレータ番号TheOSCの物理オシレータの発音を停止させると共に、この発音停止に応じてノートパラメータレジスタNRの論理オシレータパラメータの内容(フラグUseおよびレジスタAON)を更新する一方、この更新に対応して物理・論理オシレータ対応パラメータレジスタPhOSCの内容(PhOSC[TheOSC].Use)およびオシレータパラメータレジスタPROSCの内容(PROSC[TheOSC].RUN)を変更する。
【0105】
(8)OSCパラメータ設定処理の動作
次に、図18を参照してOSCパラメータ設定処理の動作を説明する。前述したノートオン処理のステップSD11(図13参照)あるいは後述するエンベロープ処理のステップSM17(図24参照)を介して本処理が実行されると、CPU4は図18に図示するステップSH1に進む。ステップSH1では、物理オシレータ番号TheOSCが「−1」、つまり前述した物理OSC取得処理(図15〜図16参照)により物理オシレータ番号TheOSCを取得しない状態に設定されているかどうかを判断する。物理オシレータ番号TheOSCを取得しない状態に設定されていると、判断結果は「YES」になり、何も行わずに本処理を終える。
【0106】
一方、物理オシレータ番号TheOSCが取得されていると、上記ステップSH1の判断結果は「NO」になり、ステップSH2に進む。ステップSH2では、図6(a)に図示した物理・論理オシレータ対応パラメータレジスタにおいて、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のフラグUse(PhOSC[TheOSC].Use)に使用中を表す「1」をセットすると共に、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のレジスタNRN(PhOSC[TheOSC].NRN)にノートパラメータレジスタ番号TheNRをストアする。
【0107】
また、ステップSH2では、物理オシレータ番号TheOSCで指定されるレジスタPhOSC[TheOSC]のレジスタLON(PhOSC[TheOSC].LON)に論理オシレータ番号TheLOSCをストアする。さらに、ステップSH2では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグUse(NR[TheNR].LOSC[TheLOSC].Use)に使用中を表す「1」をセットする。
【0108】
加えて、ステップSH2では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタAON(NR[TheNR].LOSC[TheLOSC].AON)に物理オシレータ番号TheOSCをストアする。
【0109】
こうして、物理OSC取得処理にて取得された物理オシレータ番号TheOSCの物理オシレータを発音させるためのパラメータ設定が完了すると、ステップSH3に進み、物理オシレータ番号TheOSCの物理オシレータに対応する論理オシレータ番号TheLOSCが「0」、つまりマスタオシレータであるか否かを判断する。マスタオシレータである場合には、判断結果が「YES」になり、ステップSH4に進む。
【0110】
ステップSH4では、図2(a)に図示したオシレータパラメータレジスタPROSCにおいて、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のフラグSlave(PROSC[TheOSC].Slave)に「0」をセットし、物理オシレータ番号TheOSCの物理オシレータがスレーブオシレータとして使われない旨を表す。
【0111】
また、ステップSH4では、音色選択スイッチ操作に応じて選択された音色番号TNにて指定される音色パラメータTP[TN]中のスタートアドレスStartAdrを、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタCurAdrにストアする。
【0112】
さらに、ステップSH4では、音色番号TNにて指定される音色パラメータTP[TN]中のエンドアドレスEndAdrを、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタEndAdrにストアする。
【0113】
また、ステップSH4では、音色番号TNにて指定される音色パラメータTP[TN]中のループアドレスLoopAdrを、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタLoopAdrにストアする。
【0114】
加えて、ステップSH4では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタPPに格納されるピッチ変位(発音時の読出し速度)を、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタPitchにストアする。
【0115】
以上のようにして、マスタオシレータとして動作する物理オシレータの波形発生態様(選択された音色の波形データのスタートアドレスStartAdr、エンドアドレスEndAdr、ループアドレスLoopAdrおよび読出し速度)が設定されると、ステップSH6に進み、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のフラグRUNに「1」をセットして本処理を終える。これにより、物理オシレータ番号TheOSCの物理オシレータがマスタオシレータとして、設定された波形発生態様に従って波形出力する。
【0116】
さて一方、物理オシレータ番号TheOSCの物理オシレータがスレーブオシレータとして動作する場合には、上記ステップSH3の判断結果が「NO」になり、ステップSH5に進む。ステップSH5では、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のフラグSlave(PROSC[TheOSC].Slave)に「1」をセットし、物理オシレータ番号TheOSCの物理オシレータがスレーブオシレータとして使用される旨を表す。
【0117】
また、ステップSH5では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、マスタオシレータのレジスタLOSC[0]中のレジスタAON(NR[TheNR].LOSC[0].AON)に格納される物理オシレータ番号をマスタ側オシレータ番号として、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタLnkOSC(PROSC[TheOSC].LnkOSC)にストアする。
【0118】
さらに、ステップSH5では、音色番号TNにて指定される音色パラメータTP[TN]において、論理オシレータ番号TheLOSCで指定される論理オシレータパラメータLOSC[TheLOSC]中のオフセットアドレスAdrOfs(マスタ側オシレータの波形読出しアドレスとの差分)を、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタAdrOfsにストアする。
【0119】
また、ステップSH5では、音色番号TNにて指定される音色パラメータTP[TN]中のエンドアドレスEndAdrを、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタEndAdrにストアすると共に、音色番号TNにて指定される音色パラメータTP[TN]中のループアドレスLoopAdrを、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のレジスタLoopAdrにストアする。
【0120】
こうして、スレーブオシレータとして動作する物理オシレータの波形発生態様(マスタ側オシレータの波形読出しアドレスとの差分を表すオフセットアドレスAdrOfs、エンドアドレスEndAdr、ループアドレスLoopAdr)が設定されると、ステップSH6に進み、物理オシレータ番号TheOSCで指定されるレジスタPROSC[TheOSC]のフラグRUNに「1」をセットして本処理を終える。これにより、物理オシレータ番号TheOSCの物理オシレータがスレーブオシレータとして、設定された波形発生態様に従って波形出力する。
【0121】
(9)ノートオフ処理の動作
次に、図19を参照してノートオフ処理の動作を説明する。前述した鍵盤処理のステップSC5(図11参照)を介して本処理が実行されると、CPU4は図19に図示するステップSJ1に進み、ノートパラメータレジスタ番号TheNRをゼロリセットする。次いで、ステップSJ2では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータが使用中(NR[TheNR].LOSC[0].Use=1)であって、しかもノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中の演奏キーPKが離鍵された鍵の鍵番号Keyに一致するか否か、つまり消音すべき音であるかどうを判断する。
【0122】
消音すべき音でなければ、判断結果は「NO」になり、ステップSJ3に進み、ノートパラメータレジスタ番号TheNRをインクリメントして歩進させる。そして、ステップSJ4では、歩進されたノートパラメータレジスタ番号TheNRが「63」を超えたか否か、すなわち検索し終えたかどうかを判断する。検索し終えていなければ、判断結果は「NO」になり、上記ステップSJ2に戻る。
【0123】
以後、消音すべき音を検索し終えるまでノートパラメータレジスタ番号TheNRを歩進させながら、上記ステップSJ2〜SJ4を繰り返す。そして、消音すべき音が見つからずに検索し終えると、上記ステップSJ4の判断結果が「YES」となり、本処理を終える。これに対し、消音すべき音が見つかると、上記ステップSJ2の判断結果が「YES」になり、ステップSJ5に進む。
【0124】
ステップSJ5では、前述したように、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられている論理オシレータ(マスタオシレータおよびスレーブオシレータ)に対応付けられた全ての物理オシレータの発音を停止させた後、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータのフラグUse(NR[TheNR].LOSC[0].Use)を不使用にするノートレジスタ解放処理(図14参照)を実行して本処理を終える。
【0125】
(10)発音タイマ処理の動作
発音タイマ処理(図20参照)は、1サンプリング周期毎に割込み実行される処理であり、ステップSK1のオシレータ処理、ステップSK2のエンベロープ処理、ステップSK3のピッチエンベロープ処理およびステップSK4の累算処理から構成される。
【0126】
(11)オシレータ処理の動作
次に、図21〜図22を参照してオシレータ処理の動作を説明する。上述した発音タイマ処理のステップSK1(図20参照)を介して本処理が実行されると、CPU4は、図21に図示するステップSL1に進む。ステップSL1では、図2(b)に図示したスケジュールパラメータレジスタ中のフラグWDFが「1」であるか否か、つまりレジスタSSB[0]〜SSB[63]に格納されるオシレータの処理順序が更新されたか否かを判断する。レジスタSSB[0]〜SSB[63]に格納されるオシレータの処理順序が更新されていなければ、判断結果は「NO」になり、後述するステップSL3に進む。
【0127】
一方、レジスタSSB[0]〜SSB[63]に格納されるオシレータの処理順序が更新されていると、上記ステップSL1の判断結果は「YES」になり、ステップSL2に進む。ステップSL2では、レジスタSSB[0]〜SSB[63]に格納される、1サンプリング周期内に時分割に波形発生するオシレータの処理順序を、レジスタSSA[0]〜SSA[63]にコピーすると共に、フラグWDFをゼロリセットして次のステップSL3に進む。
【0128】
ステップSL3では、ポインタnをゼロリセットする。次いで、ステップSL4では、ポインタnで指定されるレジスタSSA[n]の値をレジスタkにストアする。続いて、ステップSL5では、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のフラグRUN(PROSC[k].RUN)が「1」であるか否か、つまりレジスタSSA[n]の値で指定される物理オシレータが動作中であるかどうかを判断する。動作中でなければ、判断結果は「NO」になり、図22に図示するステップSL11に進み、ポインタnをインクリメントして歩進させる。次いで、ステップSL12では、歩進されたポインタnの値が「63」を超えたかどうか、すなわち64個の全てのオシレータについて波形生成し終えたかどうかを判断する。
【0129】
全てのオシレータについて波形生成し終えていないと、ここでの判断結果は「NO」になり、前述したステップSL4に処理を戻し、歩進されたポインタnで指定されるレジスタSSA[n]の値をレジスタkにストアする。そして、このレジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のフラグRUN(PROSC[k].RUN)が「1」、つまりレジスタSSA[n]の値で指定される物理オシレータが動作中であると、上記ステップSL5の判断結果が「YES」になり、ステップSL6に進む。
【0130】
ステップSL6では、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のフラグSlave(PROSC[k].Slave)が「1」であるか否か、つまりレジスタSSA[n]の値で指定される物理オシレータがスレーブオシレータとして使用されているかどうかを判断する。PROSC[k].Slaveの値が「0」、つまりマスタオシレータとして使用されている場合には、ここでの判断結果は「NO」になり、図22に図示するステップSL7に進む。
【0131】
ステップSL7では、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタCurAdr(PROSC[k].CurAdr)に格納される波形読出しアドレスに、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタPitch(PROSC[k].Pitch)に格納される波形読出し位相を加算してPROSC[k].CurAdrの波形読出しアドレスを更新させた後、ステップSL9に進む。
【0132】
一方、PROSC[k].Slaveの値が「1」、つまりスレーブオシレータとして使用されている場合には、上記ステップSL6の判断結果が「YES」になり、図22に図示するステップSL8に進む。ステップSL8では、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のLnkOSCに格納されるマスタ側オシレータ番号をレジスタrにストアする。
【0133】
また、ステップSL8では、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタCurAdr(PROSC[k].CurAdr)に格納される波形読出しアドレスに、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタAdrOfs(PROSC[k].AdrOfs)に格納されるオフセットアドレス(マスタ側オシレータの波形読出しアドレスとの差分)を加算してPROSC[k].CurAdrの波形読出しアドレスを更新させた後、ステップSL9に進む。
【0134】
ステップSL9では、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタCurAdr(PROSC[k].CurAdr)に格納される波形読出しアドレスが、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタEndAdr(PROSC[k].EndAdr)に格納されるエンドアドレスを超えた場合には、エンドアドレスを超えた分(PROSC[k].CurAdr−PROSC[k].EndAdr)を、ループアドレスPROSC[k].LoopAdrに加算し、それをPROSC[k].CurAdrの波形読出しアドレスに設定する。
【0135】
次いで、ステップSL10では、波形読出しアドレスPROSC[k].CurAdrのアドレス整数部をレジスタa1に、そのアドレス整数部の次アドレスをレジスタa2にそれぞれストアする。また、ステップSL10では、波形読出しアドレスPROSC[k].CurAdrのアドレス小数部をレジスタfにストアする。
【0136】
さらに、ステップSL10では、レジスタa1のアドレスで読み出される波形値WaveData[a1]と、レジスタa2のアドレスで読み出される波形値WaveData[a2]とをレジスタfのアドレス小数部を用いて内挿補間(WaveData[a1]×(1−f)+WaveData[a2]×f)を行い、これにて得られる波形値を、レジスタkで指定されるオシレータパラメータレジスタPROSC[k]中のレジスタValueにストアする。このようにして、全てのオシレータについて波形生成し終えると、上記ステップSL12の判断結果が「YES」になり、本処理を終える。
【0137】
(12)エンベロープ処理の動作
次に、図23〜図24を参照してエンベロープ処理の動作を説明する。前述した発音タイマ処理のステップSK2(図20参照)を介して本処理が実行されると、CPU4は、図23に図示するステップSM1に進み、ノートパラメータレジスタ番号TheNRをゼロリセットする。次いで、ステップSM2では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータが使用中(NR[TheNR].LOSC[0].Use=1)であるか否かを判断する。
【0138】
ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータが不使用(NR[TheNR].LOSC[0].Use=0)であると、判断結果は「NO」になり、ステップSM6に進み、ノートパラメータレジスタ番号TheNRをインクリメントして歩進させる。そして、ステップSM7では、歩進されたノートパラメータレジスタ番号TheNRが「63」を超えたか否か、つまりノートパラメータレジスタNR[0]〜[63]の内から使用中のマスタオシレータを検索し終えたかどうかを判断する。
【0139】
検索し終えていなければ、ステップSM7の判断結果は「NO」になり、上述のステップSM2に処理を戻して検索を継続する。そして、この検索により使用中のマスタオシレータが見つかると、上記ステップSM2の判断結果が「YES」になり、ステップSM3に進み、論理オシレータ番号TheLOSCをゼロリセットする。
【0140】
次いで、ステップSM4、ステップSM8およびステップSM9では、使用中のマスタオシレータが割り当てられたノートパラメータレジスタNR[TheNR]において、常に不使用と設定されていないスレーブオシレータを探し出す。常に不使用と設定されていないスレーブオシレータでは、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグUse(NR[TheNR].LOSC[TheLOSC].Use)が「0」、「1」または「2」のいずれかに設定されるので、ステップSM4の判断結果が「NO」になり、ステップSM5に進む。
【0141】
ステップSM5では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、常に不使用と設定されていないスレーブオシレータの論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタAECL(NR[TheNR].LOSC[TheLOSC].AECL)に、現在生成されている音量制御用エンベロープ波形の出力値をストアする。
【0142】
また、ステップSM5では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、常に不使用と設定されていないスレーブオシレータの論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグAES(NR[TheNR].LOSC[TheLOSC].AES)に、現在生成されている音量制御用エンベロープ波形の進行状態を表す値(停止状態では「0」、アタック領域では「1」、ディケイ領域では「2」、サステイン領域では「3」、リリース領域では「4」)をセットする。
【0143】
さらに、ステップSM5では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタPKに格納される演奏キー(鍵操作された鍵の鍵番号)をレジスタr1にストアすると共に、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタATTNに格納されるアフタタッチテーブル番号をレジスタr2にストアする。
【0144】
また、ステップSM5では、ROM6のデータエリアに記憶されるアフタタッチテーブルATTBLの内、上記レジスタr2のアフタタッチテーブル番号で指定されるアフタタッチテーブルATTBL[r2]を参照してレジスタr1の演奏キーに対応したアフタタッチ値ATTBL[r2][r1]を発生する。
【0145】
加えて、ステップSM5では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、常に不使用と設定されていないスレーブオシレータの論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタAECL(NR[TheNR].LOSC[TheLOSC].AECL)に格納される、現在の音量制御用エンベロープ波形出力値にアフタタッチ値ATTBL[r2][r1]を加算してレジスタLにストアする。なお、レジスタLの値が「127」を超えた場合には最大値「127」に設定し、一方、レジスタLの値が「0」より小さい場合には、最小値「0」に設定する。
【0146】
そしてこの後、図24に図示するステップSM10に進み、レジスタLの値が最小値「0」であるか否かを判断する。以下、レジスタLの値が最小値「0」でない場合と、最小値「0」の場合とに分けて動作説明を進める。
【0147】
<レジスタLの値が最小値「0」でない場合>
この場合、ステップSM10の判断結果は「NO」になり、ステップSM13に進む。ステップSM13では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグUse(NR[TheNR].LOSC[TheLOSC].Use)が「0」、「1」、「2」のいずれであるか判断する。以下、フラグUseが「0」、「1」、「2」の各場合に分けて動作を説明する。
【0148】
a.フラグUseが「0」の場合
フラグUseが「0」とは、論理オシレータ番号TheLOSCのスレーブオシレータが、新たな発音により物理オシレータの地位を奪われ、物理オシレータとして割り当てられず発音処理に関与しない状態を表す。このような物理オシレータ再割り当て待ち状態の場合には、ステップSM14に進み、物理オシレータ取得フラグAsnFlgに「2」をセットした後、ステップSM16を介して前述した物理OSC取得処理(図15〜図16参照)を実行する。物理OSC取得処理では、前述したように、物理オシレータ取得フラグAsnFlgが「2」であると、不使用の物理オシレータが存在する場合はその物理オシレータ番号を、そうでない場合は「−1」を、TheOSCに設定する。
【0149】
この後、ステップSM17を介してOSCパラメータ設定処理(図18参照)を実行するが、前述したように、OSCパラメータ設定処理では、物理オシレータ番号TheOSCが「−1」、つまり物理オシレータ番号TheOSCを取得しない状態に設定されていると、何も行わずに処理を終える。すなわち、物理オシレータの再割り当ては行われない。
一方、物理オシレータ番号TheOSCが「−1」でない場合は、取得された物理オシレータ番号TheOSCの物理オシレータを発音させるためのパラメータ設定を行うと共に、スレーブオシレータとして動作する物理オシレータの波形発生態様(マスタ側オシレータの波形読み出しアドレスとの差分を表すオフセットアドレスAdrOfs、エンドアドレスEndAdr、ループアドレスLoopAdr)を設定する。これにより不使用の物理オシレータに対して再割り当てが行われ、発音が再開されることになる。そして、ステップSM18に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタTCL(NR[TheNR].LOSC[TheLOSC].TCL)に、レジスタLに格納される音量制御用エンベロープ波形出力値をストアした後、前述のステップSM8(図23参照)に処理を戻す。
【0150】
b.フラグUseが「1」の場合
フラグUseが「1」とは、物理オシレータとして割り当てられて発音中にあり、エンベロープ形成する状態を表す。この場合には、ステップSM18に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタTCL(NR[TheNR].LOSC[TheLOSC].TCL)に、レジスタLに格納される音量制御用エンベロープ波形出力値をストアした後、前述のステップSM8(図23参照)に処理を戻す。
【0151】
c.フラグUseが「2」の場合
フラグUseが「2」とは、ノートオン直後の物理オシレータ割り当て待ち状態を表す。この場合には、ステップSM15に進み、物理オシレータ取得フラグAsnFlgに「1」をセットした後、ステップSM16を介して前述した物理OSC取得処理(図15〜図16参照)を実行する。
【0152】
物理OSC取得処理では、前述したように、物理オシレータ取得フラグAsnFlgが「1」であると、不使用の物理オシレータが存在するならば、その物理オシレータ番号が優先的にTheOSCに設定される。また、全ての物理オシレータがマスタオシレータとして使用されているならば、「−1」がTheOSCに設定される。さらに、全ての物理オシレータが使用中であり、かつ、スレーブオシレータとして使用されている物理オシレータが存在するならば、そのスレーブオシレータの物理オシレータ番号がTheOSCに設定される。その場合、物理OSC解放処理(図17参照)において、発音割り当て対象の物理オシレータ番号TheOSCにて指定される物理オシレータの発音を停止させ、この発音停止に伴いノートパラメータレジスタNRの論理オシレータパラメータの内容(フラグUseおよびレジスタAON)を更新し、この更新に対応して物理・論理オシレータ対応パラメータレジスタPhOSCの内容(PhOSC[TheOSC].Use)およびオシレータパラメータレジスタPROSCの内容(PROSC[TheOSC].RUN)を変更する。
【0153】
そして、ステップSM17を介してOSCパラメータ設定処理(図18参照)を実行する。前述したように、OSCパラメータ設定処理では、上記ステップSM16の物理OSC取得処理にて取得された物理オシレータ番号TheOSCが「−1」である場合には、物理オシレータの割り当てを行わない一方、TheOSCが「−1」でない場合には、物理オシレータを発音させるためのパラメータ設定を行うと共に、スレーブオシレータとして動作する物理オシレータの波形発生態様(マスタ側オシレータの波形読出しアドレスとの差分を表すオフセットアドレスAdrOfs、エンドアドレスEndAdr、ループアドレスLoopAdr)を設定する。
【0154】
この後、ステップSM18に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタTCL(NR[TheNR].LOSC[TheLOSC].TCL)に、レジスタLに格納される音量制御用エンベロープ波形出力値をストアした後、前述のステップSM8(図23参照)に処理を戻す。
【0155】
<レジスタLの値が最小値「0」の場合>
レジスタLの値が最小値「0」であると、上述したステップSM10の判断結果は「YES」になり、ステップSM11に進む。ステップSM11では、論理オシレータ番号TheLOSCが「0」ではなく、かつノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のフラグUse(NR[TheNR].LOSC[TheLOSC].Use)が「1」であるか否か、つまり物理オシレータが割り当てられている使用中のスレーブオシレータであるかどうかを判断する。
【0156】
マスタオシレータまたは物理オシレータが割り当てられていないスレーブオシレータであると、判断結果は「NO」になり、ステップSM18に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタTCL(NR[TheNR].LOSC[TheLOSC].TCL)に、レジスタLに格納される音量制御用エンベロープ波形出力値をストアした後、前述のステップSM8(図23参照)に処理を戻す。
【0157】
一方、物理オシレータが割り当てられている使用中のスレーブオシレータであれば、上記ステップSM11の判断結果が「YES」となり、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタAON(NR[TheNR].LOSC[TheLOSC].AON)を物理オシレータ番号TheOSCに設定した後、ステップSM12を介して物理OSC解放処理(図17参照)を実行し、使用中のスレーブオシレータとなる物理オシレータ番号TheOSCの物理オシレータの発音を停止させると共に、この発音停止に応じてノートパラメータレジスタNRの論理オシレータパラメータの内容(フラグUseおよびレジスタAON)を更新する一方、この更新に対応して物理・論理オシレータ対応パラメータレジスタPhOSCの内容(PhOSC[TheOSC].Use)およびオシレータパラメータレジスタPROSCの内容(PROSC[TheOSC].RUN)を変更する。
すなわち、音量制御用エンベロープ波形出力値Lが0に達したことによる発音停止に伴い、対応するスレーブオシレータのノートパラメータレジスタNRのフラグUseに0がセットされることにより、それまでスレーブオシレータに対応付けて割り当てられていた物理オシレータが解放され、再割り当て待ちの状態となる。
【0158】
そして、ステップSM18に進み、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、論理オシレータ番号TheLOSCで指定されるレジスタLOSC[TheLOSC]中のレジスタTCL(NR[TheNR].LOSC[TheLOSC].TCL)に、レジスタLに格納される音量制御用エンベロープ波形出力値をストアした後、前述のステップSM8(図23参照)に処理を戻す。
【0159】
(13)ピッチエンベロープ処理の動作
次に、図25を参照してピッチエンベロープ処理の動作を説明する。前述した発音タイマ処理のステップSK3(図20参照)を介して本処理が実行されると、CPU4は、図25に図示するステップSN1に進む。ステップSN1では、図6(b)に図示した演奏パラメータレジスタ中のレジスタLPに格納されるLFO位相角と、レジスタLRに格納されるLFOレートとに基づき、LP+(LR/127)×2πの算出式にて現在のLFO位相角を算出してレジスタLPにストアする。
【0160】
また、ステップSN1では、図6(b)に図示した演奏パラメータレジスタ中のレジスタBVに格納されるベンダホイール変位量、レジスタBRに格納されるベンドレンジ設定値、レジスタMDに格納されるモジュレーションホイール変位量、レジスタVDに格納されるビブラート深さ設定値およびレジスタLPにストアした現在のLFO位相角に基づき、((BV/127)×BR)+((MD/127)×VD×sin(LP))の算出式によってピッチ制御値PCVを算出し、ノートパラメータレジスタ番号TheNRをゼロリセットする。
【0161】
次いで、ステップSN2では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータが使用中(NR[TheNR].LOSC[0].Use=1)であるか否かを判断する。ここで、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]に割り当てられているマスタオシレータが使用中であると、判断結果が「YES」になり、ステップSN3に進む。
【0162】
ステップSN3では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタPECL(NR[TheNR].PECL)に、現在生成されているピッチ制御用エンベロープ波形の出力値をストアすると共に、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のフラグPES(NR[TheNR].PES)に、現在生成されているピッチ制御用エンベロープ波形の進行状態を表す値(停止状態では「0」、アタック領域では「1」、ディケイ領域では「2」、サステイン領域では「3」、リリース領域では「4」)をセットする。
【0163】
また、ステップSN3では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタPK(NR[TheNR].PK)に格納される演奏キー(鍵操作された鍵の鍵番号)をレジスタr1にストアすると共に、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、レジスタLOSC[0]中のレジスタATTNに格納されるアフタタッチテーブル番号をレジスタr2にストアする。
【0164】
さらに、ステップSN3では、ROM6のデータエリアに記憶されるアフタタッチテーブルATTBLの内、上記レジスタr2のアフタタッチテーブル番号で指定されるアフタタッチテーブルATTBL[r2]を参照してレジスタr1の演奏キーに対応したアフタタッチ値ATTBL[r2][r1]を発生する。
【0165】
加えて、ステップSN3では、上記ステップSN1にて算出したピッチ制御値PCVと、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタPP(NR[TheNR].PP)に格納されるピッチ変位(読み出し速度)と、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]中のレジスタPECL(NR[TheNR].PECL)に格納されるピッチ制御用エンベロープ波形出力値と、上記アフタタッチ値ATTBL[r2][r1]とを加算してレジスタLにストアする。なお、レジスタLの値が「127」を超えた場合には最大値「127」に設定し、一方、レジスタLの値が「−128」より小さい場合には、最小値「−128」に設定する。
【0166】
また、ステップSN3では、ノートパラメータレジスタ番号TheNRで指定されるノートパラメータレジスタNR[TheNR]において、レジスタLOSC[0]中のレジスタAONに格納される物理オシレータ番号、つまりノートパラメータレジスタNR[TheNR]のマスタオシレータとして使用される物理オシレータの番号をレジスタr1にストアする。
【0167】
さらに、ステップSN3では、音色選択スイッチ操作に応じて選択された音色番号TNで指定される音色パラメータTP[TN]中のオリジナルピッチPitch(TP[TN].Pitch)に、「2」の(L/12)乗値を乗算して波形読出し位相(読出しピッチ)を発生し、これをレジスタr1に格納される物理オシレータ番号で指定されるオシレータパラメータレジスタPROSC[r1]のレジスタPitch(PROSC[r1].Pitch)にストアする。
【0168】
この後、ステップSN4に進み、ノートパラメータレジスタ番号TheNRをインクリメントして歩進させる。そして、ステップSN5では、歩進されたノートパラメータレジスタ番号TheNRが「63」を超えたか否か、すなわちノートパラメータレジスタNR[0]〜[63]の内から使用中のマスタオシレータを検索し終えたかどうかを判断する。検索の途中であると、判断結果は「NO」になり、上記ステップSN2に処理を戻す。一方、ノートパラメータレジスタNR[0]〜[63]の内から使用中のマスタオシレータを検索し終えると、上記ステップSN5の判断結果が「YES」となり、本処理を終える。
【0169】
(14)累算処理の動作
次に、図26を参照して累算処理の動作を説明する。前述した発音タイマ処理のステップSK4(図20参照)を介して本処理が実行されると、CPU4は、図26に図示するステップSO1に進み、ポインタnおよびレジスタSUMをゼロリセットする。次いで、ステップSO2では、図6(a)に図示した物理・論理オシレータ対応パラメータレジスタにおいて、ポインタnで指定されるレジスタPhOSC[n]中のフラグUse(PhOSC[n].Use)が「1」、つまりポインタnで指定される物理オシレータが使用中であるかどうかを判断する。不使用であると、判断結果は「NO」となり、後述のステップSO4に進む。
【0170】
一方、ポインタnで指定される物理オシレータが使用中であると、上記ステップSO2の判断結果は「YES」になり、ステップSO3に進む。ステップSO3では、ポインタnで指定されるレジスタPhOSC[n]中のノートパラメータレジスタ番号NRNをレジスタr1に、ポインタnで指定されるレジスタPhOSC[n]中の論理オシレータ番号LONをレジスタr2にそれぞれストアする。
【0171】
また、ステップSO3では、レジスタr1のノートパラメータレジスタ番号NRNで指定されるノートパラメータレジスタNR[r1]において、レジスタr2の論理オシレータ番号LONにて指定されるレジスタLOSC[r2]中のレジスタTCL(NR[r1].LOSC[r2].TCL)に格納される音量レベルを、ポインタnで指定されるオシレータパラメータレジスタPROSC[n]中のレジスタValueに格納されるオシレータ波形出力値に乗算して得た出力波形値をレジスタSumに累算する。
【0172】
次いで、ステップSO4では、ポインタnをインクリメントして歩進させ、続くステップSO5では、歩進されたポインタnの値が「63」を超えたか否かを判断する。ポインタnの値が「63」を超えていなければ、判断結果は「NO」となり、上記ステップSO2に処理を戻す。以後、ポインタnの値が「63」を超えるまで上記ステップSO2〜SO5を繰り返すことによって、全ての出力波形値の累算により楽音波形が形成される。そして、ポインタnの値が「63」を超えると、ステップSO5の判断結果が「YES」になり、ステップSO6においてレジスタSumの累算波形値の出力処理を行った後、本処理を終える。
【0173】
以上説明したように、本実施の形態では、楽音波形を発生する発音チャンネル毎に設けられ、マスタオシレータおよび少なくとも1つ以上のスレーブオシレータから構成される仮想的な論理オシレータと、これら論理オシレータに対応付けられ、実際に波形を発生する複数の物理オシレータとの対応関係を記憶しておく。そして、楽音波形を形成する過程に応じて、当該楽音波形を発生する発音チャンネルの論理オシレータに割り当てる物理オシレータを、記憶しておいた対応関係を参照して動的に確保又は解放する。
【0174】
論理オシレータに割り当てる物理オシレータを動的に確保又は解放するとは、具体的には次の通りである。
<ノートオン時にマスタオシレータを割り当てる場合>
「不使用の物理オシレータ」、「スレーブオシレータとして使用中の物理オシレータ」、「マスタオシレータで使用中の物理オシレータ」の優先順位でいずれかを選択する。「スレーブオシレータとして使用中の物理オシレータ」を選択した場合には、その選択した物理オシレータの発音を停止させて解放する。「マスタオシレータで使用中の物理オシレータ」を選択した場合には、その選択した物理オシレータを確保していた発音チャンネル全体の発音を停止させ、当該発音チャンネルの論理オシレータ(マスタオシレータおよびスレーブオシレータ)として対応付けられた全ての物理オシレータを解放する。
【0175】
<ノートオン時にスレーブオシレータを割り当てる場合>
「不使用の物理オシレータ」、「スレーブオシレータとして使用中の物理オシレータ」の優先順位で選択する。「スレーブオシレータとして使用中の物理オシレータ」を選択した場合には、その選択した物理オシレータの発音を停止させて解放する。全ての物理オシレータがマスタオシレータとして使用中の場合は、選択しない。
【0176】
<発音中にスレーブオシレータを再割り当てする場合>
「不使用の物理オシレータ」のみ選択する。全ての物理オシレータが論理オシレータとして使用されている場合は、選択しない。
【0177】
こうして、論理オシレータに割り当てる物理オシレータを動的に確保又は解放することにより、従来のように、発音するかどうかに関わらず、加算合成に用いる可能性のある全ての波形を同期再生しておく必要が無くなる結果、発音チャンネル(オシレータ)を無駄に浪費することなく波形発生することができるようになっている。
【0178】
また、本実施形態では、発生させる楽音の音色に応じて、マスタオシレータの波形読み出しアドレスと、スレーブオシレータの波形読み出しアドレスとを予めオフセットさせておく為、マスタオシレータが波形読み出しを行っている段階でスレーブオシレータを動作させても、マスタオシレータの波形読み出しアドレスに対し、オフセットに対応して修正された波形読み出しアドレスによりスレーブオシレータが波形再生するので、重ね合わせる波形同士の位相差を常に一定に保つことが出来、しかもLFOやピッチベンド等によるピッチモジュレーションが常に同期し、かつ同じ変調幅を与え続けるができるようになっている。
【図面の簡単な説明】
【0179】
【図1】本発明による実施の一形態の構成を示すブロック図である。
【図2】オシレータパラメータレジスタPROSC[0]〜PROSC[63]およびスケジュールパラメータレジスタの構成を示す図である。
【図3】ノートパラメータレジスタNR[0]〜NR[63]の構成を示す図である。
【図4】音量制御用エンベロープ波形を説明するための波形図である。
【図5】ピッチ制御用エンベロープ波形を説明するための波形図である。
【図6】物理・論理オシレータ対応パラメータレジスタおよび演奏パラメータレジスタの構成を示す図である。
【図7】ROM6に記憶される音色パラメータの構成を示す図である。
【図8】音源8の構成を示すブロック図である。
【図9】メインルーチンの動作を示すフローチャートである。
【図10】スイッチ・ホイール処理の動作を示すフローチャートである。
【図11】鍵盤処理の動作を示すフローチャートである。
【図12】ノートオン処理の動作を示すフローチャートである。
【図13】ノートオン処理の動作を示すフローチャートである。
【図14】ノートレジスタ解放処理の動作を示すフローチャートである。
【図15】物理OSC取得処理の動作を示すフローチャートである。
【図16】物理OSC取得処理の動作を示すフローチャートである。
【図17】物理OSC解放処理の動作を示すフローチャートである。
【図18】OSCパラメータ設定処理の動作を示すフローチャートである。
【図19】ノートオフ処理の動作を示すフローチャートである。
【図20】発音タイマ処理の動作を示すフローチャートである。
【図21】オシレータ処理の動作を示すフローチャートである。
【図22】オシレータ処理の動作を示すフローチャートである。
【図23】エンベロープ処理の動作を示すフローチャートである。
【図24】エンベロープ処理の動作を示すフローチャートである。
【図25】ピッチエンベロープ処理の動作を示すフローチャートである。
【図26】累算処理の動作を示すフローチャートである。
【符号の説明】
【0180】
1 鍵盤
2 スイッチ部
3 ホイール操作子
4 CPU
5 表示部
6 ROM
7 RAM
8 音源
9 サウンドシステム
10 MIDIインタフェース




 

 


     NEWS
会社検索順位 特許の出願数の順位が発表

URL変更
平成6年
平成7年
平成8年
平成9年
平成10年
平成11年
平成12年
平成13年


 
   お問い合わせ info@patentjp.com patentjp.com   Copyright 2007-2013