以下、添付図面を参照して、本発明の実施の形態について説明する。図1は、本発明の実施の形態にかかる電子楽器の構成を示すブロックダイヤグラムである。図1に示すように、本実施の形態にかかる電子楽器10は、CPU11、ROM12、RAM13、サウンドシステム14、表示部15、鍵盤16および操作部18を備える。
CPU11は、電子楽器10全体の制御、操作部18を構成するスイッチ(図示せず)の操作の検出、鍵盤16の鍵のオン・オフ(押鍵・離鍵)および押鍵時の押鍵速度(ベロシティ)の検出、並びに、押鍵・離鍵に応じた発音・消音のための配列へのデータ設定など種々の処理を実行する。
ROM12は、電子楽器10全体の制御、操作部18を構成するスイッチ(図示せず)の操作の検出、鍵盤16の鍵のオン・オフ(押鍵・離鍵)およびベロシティの検出、押鍵・離鍵に応じた発音・消音のための配列へのデータ設定など種々の処理を実行するためのプログラムを格納する。また、ROM12は、ピアノ、ギター、ドラムなどの楽音波形データを生成するための元となる波形データを格納する波形データエリアを有している。RAM13は、ROM12から読み出されたプログラムや、処理の過程で生じたデータを記憶する。
サウンドシステム14は、音源部21、オーディオ回路22およびスピーカ23を備える。音源部21は、たとえば、CPU11からの発音指示を受信すると、ROM12の波形データエリアから所定の波形データを読み出して、所定の音高の楽音波形データを生成して出力する。また、音源部21は、スネアドラム、バスドラム、シンバルなど打楽器の音色の波形データを、そのまま楽音波形データとして出力することもできる。オーディオ回路22は、楽音波形データをD/A変換して増幅する。これによりスピーカ23から音響信号が出力される。
本実施の形態において、音源部21は、複数個(たとえば128個)のジェネレータを有し、それぞれが楽音波形データを生成して出力することができる。したがって、1つの押鍵について1つのジェネレータにより楽音波形データを生成するのであれば、最大で128鍵の押鍵に対応することができる。また、後述するように、1つの押鍵に対して最大限の数のジェネレータを割り当てることができ、この場合には、1つの押鍵に対して、複数のジェネレータが同時に楽音波形データを生成する。
また、本実施の形態にかかる鍵盤16を構成する複数の鍵のそれぞれは、鍵の長手方向(すなわち、複数の鍵が並べられて配置される方向と垂直方向)に複数(たとえば2つ)のスイッチを有し、押鍵にしたがって2つのスイッチが順次オンされる。2つのスイッチがオンされる時間差に基づいて押鍵速度(ベロシティ)を検出することができる。ベロシティは、鍵盤16に設けられたサブCPU(図示せず)により検出されても良いし、CPU11により検出されても良い。
図2は、本実施の形態にかかる電子楽器にて実行される処理を示すフローチャートである。電子楽器10のCPU11は、たとえば、RAM13に一時的に記憶されたデータなどのクリアを含むイニシャライズ処理を実行する(ステップ201)。イニシャライズ処理が終了すると、CPU11は、操作部18のスイッチの操作を検出し、検出された操作にしたがった処理を実行するスイッチ処理を実行する(ステップ202)。
スイッチ処理においては、CPU11は、たとえば、音色指定スイッチの操作にしたがって、ROM12の波形データエリアに格納された波形データの種別(音色)を指定する情報をRAM13に格納する。また、本実施の形態において、電子楽器10は、1つの押鍵について予め定められた数(たとえば、1或いは2)のジェネレータによって楽音波形データを生成する通常モードと、1つの押鍵に対して最大数のジェネレータを割り当てて、割り当てられたジェネレータにより楽音波形データを生成する最大発音モードと、の何れかの演奏モードの下で動作する。したがって、スイッチ処理においては、演奏モード指定スイッチの操作も検出され、CPU11は、演奏モード指定スイッチの操作にしたがって、動作モードを切り替え、現在の電子楽器の動作モードを示す情報をRAM13に格納する。
スイッチ処理(ステップ202)の後、CPU11は、表示処理を実行する(ステップ203)。表示処理においては、スイッチ処理において設定された音色名、動作モードなどを、表示部15の画面上に表示する。また、操作されたスイッチがオンであることを示すLED(図示せず)の点灯もスイッチ処理において実行される。表示処理(ステップ203)の後、CPU11は、鍵盤処理を実行する(ステップ204)。図3、図4および図7は、本実施の形態にかかる鍵盤処理を示すフローチャートである。
図3に示すように、CPU11は、RAM13に格納された動作モードを示す情報を参照する(ステップ301)。ステップ301において、最大発音モードと判断された場合には、CPU11は、鍵状態配列Key[]を、旧鍵状態配列OldKey[]にコピーする。これら配列Key[]、OldKey[]は、RAM13に格納される。他の配列についても、鍵状態配列Key[]と同様に、RAM13中に生成される。
図5(a)は、鍵状態配列Key[]のデータ構造の例を説明する図である。なお、旧鍵状態配列OldKey[]も、鍵状態配列Key[]と同一のデータ構造を有する。図5(a)に示すように、鍵状態配列Key[](符号501参照)には、鍵盤16の鍵の番号(ノート番号)ごとに、鍵のオン状態、オフ状態、および、オン状態であるときには押鍵時のベロシティを示す値が格納される。たとえば、鍵数が61鍵の場合には、鍵状態配列Key[]には、ノート番号0〜ノート番号60までの、合計61個の値が格納される。各鍵状態を示す値は、「0」〜「127」をとり得る。値「0」は、その鍵がオフ状態であることを示す。値「1」〜「127」は、その鍵がオン状態であること、および、押鍵時のベロシティを示している。なお、以下、Key[j]と表記したときは、鍵状態配列Key[]の第j番(0≦j≦(N−1):Nは鍵数)の要素を示す。
ステップ302では、鍵の状態を走査するのに先立って、現在の鍵状態を、前回の鍵状態として保持する。次いで、CPU11は、鍵盤16の鍵を走査して、鍵のオン状態、オフ状態、および、オン状態となった鍵のベロシティに基づいて、鍵状態配列Key[]を生成する(ステップ303)。
また、CPU11は、1鍵あたりに幾つのジェネレータが割り当てられているかを示すジェネレータ数配列GenNum[]を、旧ジェネレータ数配列OldGenNum[]にコピーする(ステップ304)。ジェネレータ数配列GenNum[]および旧ジェネレータ数配列OldGenNum[]も、RAM13に格納される。図5(b)は、ジェネレータ数配列GenNum[]のデータ構造の例を示す図である。図5(b)に示すように、ジェネレータ数配列GenNum[](符号502参照)は、鍵盤16の鍵の番号(ノート番号)ごとに、割り当てられたジェネレータ数が格納される。たとえば、鍵数が61鍵の場合には、ジェネレータ数配列GenNum[]には、61個の値が格納される。現在、消音中でありジェネレータが割り当てられていない鍵については、値は「0」となる。また、値の最大値はジェネレータ総数MaxGen(たとえば「128」)である。なお、以下の説明において、GenNum[j]と表記したときは、鍵状態配列Key[]の第j番(0≦j≦(N−1):Nは鍵数)の鍵に割り当てられるジェネレータ数を表す。
CPU11は、鍵状態配列Key[]を参照して、配列中の値の総和Velsumを算出する(ステップ305)。鍵状態配列Key[]の値の総和Velsumは発音中の鍵のベロシティの総和に相当する。次いで、CPU11は、ベロシティ総和および各鍵のベロシティに基づいて、鍵ごとのジェネレータ数を算出する(ステップ306)。
第i番の鍵のジェネレータ数配列GenNum[i]は、以下のように算出することができる。
GenNum[i]=Key[i]/Velsum×MaxGen
つまり、第i番の鍵に割り当てられるジェネレータ数は、押鍵中の鍵のベロシティの総和に対する、当該鍵のベロシティの割合に、ジェネレータ総数を乗じたものとなる。
次いで、CPU11は、新規の離鍵があったかを判断する(ステップ307)。ステップ307においては、CPU11は、旧鍵状態配列OldKey[]と、鍵状態配列Key[]を比較して、OldKey[]において「0」以外の値で、Key[]で「0」となるようなノート番号が存在するかを判断すれば良い。ステップ306でYesと判断された場合には、CPU11は、離鍵された鍵のノート番号を含むジェネレータ配列Gen[]の消音待ちフラグをセットする(ステップ308)。
以下、ジェネレータ配列Genj[](j=0〜MaxGen(=127))について説明する。図5(c)に示すように、第j番のジェネレータに関するジェネレータ配列Genj[](符号503参照)は、発音している楽音のノート番号、および、各種フラグを含む。したがって、ジェネレータ配列Genj[]は、第j番のジェネレータが、どのノート番号の楽音について、どの状態となっているかを示している。フラグには、消音待ちフラグ、ファストダンプ待ちフラグ、発音待ちフラグ、および、発音中フラグが含まれる。これらフラグは、鍵盤処理においてセット或いはリセットされ、また、後述する音源処理において、音源部21により参照され、また、セット或いはリセットされる。
消音待ちフラグが「1」であることは、現在発音中であるノート番号に示す音高の楽音について、通常の消音(つまり、いわゆるリリースエンベロープを用いた消音)をすべきことを示している。ファストダンプ待ちフラグが「1」であることは、現在発音中であるノート番号に示す音高の楽音について、高速に消音すべきことを示している。発音待ちフラグが「1」であることは、ノート番号に示す音高の楽音を、発音すべきであることを示している。また、発音中フラグが「1」であることは、ノート番号に示す楽音が現在発音中であることを示している。
次いで、CPU11は、ジェネレータ数配列GenNum[]と旧ジェネレータ数配列OldGenNum[]とを比較して、GenNum[i]<OldGenNum[i]となる要素(鍵のノート番号)があるかを判断する(ステップ401)。ステップ401でYesと判断されることは、第i番の鍵について、割り当てられたジェネレータ数が減ったことを意味している。ステップ401でYesと判断された場合には、CPU11は、GenNum[i]<OldGenNum[i]となった鍵について、ジェネレータ数を、GenNum[i]に減らす。より具体的には、CPU11は、まず、GenNum[i]<OldGenNum[i]となった第i番の鍵のノート番号iを格納した1以上のジェネレータ配列Genj[]を特定する(ステップ402)。
次いで、CPU11は、ノート番号iを格納したジェネレータ配列Genj[]のうち、(OldGenNum[i]−GenNum[i])個のジェネレータ配列について、ファストダンプ待ちフラグを「1」にセットする(ステップ403)。ステップ402およびステップ403は、GenNum[i]<OldGenNum[i]となった全ての鍵について実行される。
図6は、本実施の形態にかかるジェネレータの割り当ての一例を説明するための図である。符号601は、鍵状態配列OldKey[]を示す。鍵状態配列OldKey[]601では、第p番の鍵についてのベロシティが「64」であり(OldKey[p]=64)、第q番の鍵についてのベロシティが「64」である(OldKey[q]=64)。また、符号602は、ジェネレータ数配列OldGenNum[]の例を示す図である。上記鍵状態配列OldKey[]601が示す押鍵状態に基づいて、第p番の鍵および第q番の鍵に、64個のジェネレータが割り当てられている(OldGenNum[p]=64、OldGenNum[q]=64)。
図6に示す例において、符号611は、新たに第r番の鍵がベロシティ「127」で押鍵されたときの鍵状態配列Key[]である。したがって、鍵状態配列Key[]611では、新たにKey[r]=127となっている。符号612は、第r番の鍵がベロシティ「127」で押鍵されたことに基づいて、算出された新たなジェネレータ数配列GenNum[]である。新たなジェネレータ数配列GenNum[]では、GenNum[p]=32、GenNum[q]=32となる一方、GenNum[r]=63となる。したがって、GenNum[p]<OldGenNum[p]となり、かつ、GenNum[q]<OldGenNum[q]となる。CPU11は、第p番の鍵に関して、OldGenNum[p]−GenNum「p」=32個のジェネレータについて、そのジェネレータ配列Gen[]にファストダンプフラグをセットするとともに、第q番の鍵に関しても、OldGenNum[q]−GenNum「q」=32個のジェネレータについて、そのジェネレータ配列Gen[]にファストダンプフラグをセットする。
なお、(OldGenNum[i]−GenNum[i])個のジェネレータ配列Genj[]を選択する際には、以下のようなロジックを採用することができる。図7は、ジェネレータの選択処理の例を示すフローチャートである。
図7に示すように、まず、CPU11は、同一のノート番号iを格納したジェネレータ配列Gen[]のうち、消音待ちフラグが「1」であるジェネレータ配列を特定する(ステップ701)。CPU11は、特定されたジェネレータ配列の数が、(OldGenNum[i]−GenNum[i])以上であるかを判断する(ステップ702)。すなわち、離鍵により消音すべきジェネレータの数が、(OldGenNum[i]−GenNum[i])以上あるかを判断する。ステップ702でYesと判断された場合には、CPU11は、ステップ701で特定された配列中、(OldGenNum[i]−GenNum[i])個の配列の消音待ちフラグを「0」にリセットし、かつ、そのファストダンプ待ちフラグを「1」にセットする(ステップ703)。
ステップ702でNoと判断された場合には、CPU11は、まず、ステップ701において特定されたジェネレータ配列の消音待ちフラグを「0」にリセットし、かつ、そのファストダンプ待ちフラグを「1」にセットする(ステップ704)。また、CPU11は、残りのジェネレータ配列、つまり、消音待ちフラグが「1」でないようなジェネレータ配列中、(OldGenNum[i]−GenNum[i])−ステップ701で特定された配列数)個のジェネレータ配列において、ファストダンプ待ち配列を「1」にセットする(ステップ705)。このように、本実施の形態においては、既に消音すべきジェネレータについて優先的に高速消音して、次の押鍵による発音を可能としている。
次に、CPU11は、ジェネレータ数配列GenNum[i]と旧ジェネレータ数配列OldGenNum[i]とを比較して、GenNum[i]>OldGenNum[i]となる要素(鍵)があるかを判断する(ステップ404)。ステップ404でYesと判断されることは、第i番の鍵について割り当てられたジェネレータ数が増えたことを意味している。ステップ404でYesと判断された場合には、CPU11は、GenNum[i]>OldGenNum[i]となった鍵について、ジェネレータ数を、GenNum[i]に増大させる。
まず、CPU11は、離鍵された鍵についてのジェネレータ配列Gen[]を特定して、ファストダンプ待ちフラグを「1」にセットする(ステップ405)。このステップは、離鍵された鍵についてのジェネレータをファストダンプにより高速消音させるために実行される。より具体的には、CPU11は、旧鍵状態配列OldKey[]において「0」以外の値を有し、かつ、鍵状態配列Key[]において「0」であるようなノート番号を特定し、そのようなノート番号を格納したジェネレータ配列Gen[]を特定し、特定されたジェネレータ配列Gen[]のファストダンプ待ちフラグを「1」にセットすれば良い。なお、ジェネレータ配列Gen[]において既に消音フラグがセットされていたら、CPU11は、当該消音フラグをリセットする。
次いで、CPU11は、ステップ405において、ジェネレータ配列Gen[]にファストダンプ待ちフラグがセットされたジェネレータ配列から、ジェネレータ数(GenNum[i]−OldGenNum[i])個のジェネレータを、ノート番号iの鍵(第i番の鍵)に割り当てる。より具体的には、CPU11は、(GenNum[i]−OldGenNum[i])個のジェネレータ配列Gen[]に、ノート番号iを格納するとともに、発音待ちフラグを「1」にセットする(ステップ406)。これにより、ジェネレータ配列Gen[]にファストダンプ待ちフラグがセットされたジェネレータにおいて、(GenNum[i]−OldGenNum[i])個のジェネレータ配列に、現在押鍵されている鍵のノート番号iが割り当てられ、高速消音の後、新たにノート番号iが示す音高の楽音を発音することができる。なお、ノート番号iが複数ある場合には、それぞれのノート番号について、ステップ406が実行される。
図8は、本実施の形態にかかるジェネレータの割り当ての他の例を説明するための図である。符号801は、鍵状態配列OldKey[]を示す。鍵状態配列OldKey[]801では、第p番、第q番の鍵のベロシティが「64」であり(OldKey[p]=64、OldKey[q]=64)、第r番の鍵のベロシティが「127」である(OldKey[r]=127)。また、符号802は、ジェネレータ数配列OldGenNum[]の例を示す図である。上記鍵状態配列OldKey[]801が示す押鍵状態に基づいて、第p番の鍵および第q番の鍵に、それぞれ32個のジェネレータが割り当てられている(OldGenNum[p]=32、OldGenNum[q]=32)とともに、第r番の鍵に63個のジェネレータが割り当てられている(OldGenNum[r]=63)。
図8において、符号811は、第p番の鍵が離鍵されたときの鍵状態配列Key[]である。したがって、鍵状態配列Key[]811では、Key[p]=0となっている。符号812は、第p番の鍵が離鍵されたことに基づいて、算出された新たなジェネレータ数配列GenNum[]である。新たなジェネレータ数配列GenNum[]では、GenNum[p]=0、GenNum[q]=42、GenNum[r]=85となる。GenNum[q]>OldGenNum[q]となり、かつ、GenNum[r]>OldGenNum[r]となる。
CPU11は、まず、第p番の鍵に関して、ノート番号pを有するジェネレータ配列Gen[]にファストダンプフラグをセットする。次いで、CPU11は、第q番の鍵に関して、ファストダンプフラグがセットされたジェネレータ配列Gen[]中、GenNum[q]−OldGenNum[q]=10個のジェネレータ配列Gen[]にノート番号qおよび発音待ちフラグをセットする。また、CPU11は、第r番の鍵に関して、ファストダンプフラグがセットされたジェネレータ配列Gen[]中、GenNum[r]−OldGenNum「r」=22個のジェネレータ配列Gen[]にノート番号rおよび発音待ちフラグをセットする。
次に、CPU11は、新規の押鍵があったかを判断する(ステップ407)。ステップ407においては、CPU11は、旧鍵状態配列OldKey[]と、鍵状態配列Key[]を比較して、OldKey[]において「0」で、Key[]で「0」以外の値となるようなノート番号が存在するかを判断すれば良い。ステップ407でYesと判断された場合には、CPU11は、新規押鍵フラグセット処理を実行する(ステップ408)。図9は、本実施の形態にかかる新規押鍵フラグセット処理の例を示すフローチャートである。
新規押鍵フラグセット処理において、CPU11は、発音中フラグが「0」のジェネレータ配列Gen[]を特定し(ステップ901)、ステップ901において特定されたジェネレータ配列Gen[]中、(GenNum[i])個のジェネレータ配列Gen[]に、ステップ407で特定されたノート番号iをセットするとともに、発音待ちフラグを「1」にセットする(ステップ902)。CPU11は、ステップ902において(GenNum[i])個のジェネレータ配列Gen[]への割り当てができたかを判断する(ステップ903)。ステップ903でNoと判断された場合には、CPU11は、ステップ901で特定されたジェネレータ配列以外の他のジェネレータ配列Gen[]を参照して、ファストダンプ待ちフラグが「1」のジェネレータ配列Gen[]を特定する(ステップ904)。
CPU11は、ステップ904において特定されたジェネレータ配列Gen[]中、(GenNum[i]−発音中フラグが「0」であったジェネレータ配列の配列数)個のジェネレータ配列Gen[]に、ステップ407で特定されたノート番号iをセットするとともに、発音待ちフラグを「1」にセットする(ステップ905)。次いで、CPU11は、ステップ905により、(GenNum[i])個のジェネレータ配列Gen[]への割り当てができたかを判断する(ステップ906)。
ステップ906でNoと判断された場合には、さらに、CPU11は、他のジェネレータ配列Gen[]を参照して、消音待ちフラグが「1」のジェネレータ配列を特定する(ステップ907)。CPU11は、ステップ907で特定されたジェネレータ配列Gen[]中、(GenNum[i]−発音中フラグが「0」であったジェネレータ配列の配列数−ファストダンプ待ちフラグが「1」であったジェネレータ配列の配列数)個のジェネレータ配列Gen[]に、ステップ407で特定されたノート番号iをセットするとともに、発音待ちフラグを「1」にセットする(ステップ908)。なお、新規押鍵ありと判断された鍵が複数ある場合には、それぞれの鍵のノート番号について、図9に示す処理が実行される。
このように、本実施の形態にかかる新規押鍵フラグセット処理においては、停止しているジェネレータ(つまり、ジェネレータ配列の発音中フラグが「0」であるようなジェネレータ、高速消音待ちのジェネレータ、消音待ちのジェネレータの順に、優先して、押鍵された鍵のノート番号iを割り当てるようにしている。
次に、ステップ301で、動作モードが通常モードであると判断された場合について説明する。この場合には、図10に示すように、CPU11は、新規離鍵があったかを判断する(ステップ1001)。ステップ1001においては、旧鍵状態配列OldKey[]と、鍵状態配列Key[]を比較して、OldKey[]において「0」以外の値で、Key[]で「0」となるようなノート番号が存在するかを判断すれば良い。ステップ1001でYesと判断された場合には、CPU11は、離鍵された鍵のノート番号を含むジェネレータ配列Gen[]の消音待ちフラグを「1」にセットする(ステップ1002)。
また、CPU11は、新規押鍵があったかを判断する(ステップ1003)。ステップ1003においては、旧鍵状態配列OldKey[]と、鍵状態配列Key[]を比較して、OldKey[]において「0」で、Key[]で「0」以外の値となるようなノート番号が存在するかを判断すれば良い。ステップ1003でYesと判断された場合には、CPU11は、発音中フラグが「0」のジェネレータ配列Gen[]を特定し(ステップ1004)、特定されたジェネレータ配列中、1つの鍵の押鍵に対して発音すべきジェネレータ数に応じた個数のジェネレータ配列に、ノート番号をセットするとともに、発音待ちフラグを「1」にセットする(ステップ1005)。このジェネレータ数は、予め定められ、RAM13に格納された「1」以上の数である。このように、通常モードにおいては、離鍵された鍵について楽音を生成しているジェネレータを消音させるべく、そのジェネレータ配列に消音待ちフラグをセットし、押鍵された鍵について、所定のジェネレータ数のジェネレータを用いて楽音を生成すべく、発音中フラグが「0」である所定数のジェネレータ配列の発音待ちフラグを「1」にセットする。
鍵盤処理(図2のステップ204)が終了すると、音源部21およびCPU11は、音源処理を実行する(ステップ205)。図11は、本実施の形態にかかる音源処理の例を示すフローチャートである。CPU11は、鍵盤処理においてフラグがセット或いはリセットされたジェネレータ配列を走査して(ステップ1101)、以下のようにジェネレータ配列の内容にしたがった所定の処理を音源部21に指示する。
消音待ちフラグが「1」にセットされたジェネレータ配列Gen[]が存在する場合には(ステップ1102でYes)、CPU11は、消音待ちフラグが「1」であるジェネレータ配列Gen[]により特定されるジェネレータに対する消音処理を、音源部21に指示する(ステップ1103)。また、ステップ1103において、CPU11は、上記消音待ちフラグが「1」であったジェネレータ配列Gen[]について、当該消音待ちフラグを「0」にリセットする。
音源部21は、消音処理の指示に応答して、当該ジェネレータについて、ROM12の波形データエリアからノート番号にしたがった音高に基づき読み出された波形データに、リリースエンベロープを乗じて楽音波形データを生成して出力する。このようにして、消音待ちフラグが「1」であったジェネレータ配列Gen[]に対応するジェネレータにおいては、通常のリリースエンベロープを用いて楽音が消音される。なお、音源部21による消音が完了すると、音源部21は、ジェネレータ配列Gen[]の発音フラグを「0」にリセットする。
また、ファストダンプ待ちフラグが「1」にセットされたジェネレータ配列Gen[]が存在する場合には(ステップ1104でYes)、CPU11は、ファストダンプ待ちフラグが「1」であるジェネレータ配列Gen[]により特定されるジェネレータについての高速消音処理を、音源部21に指示する(ステップ1105)。ステップ1105において、CPU11は、上記ファストダンプ待ちフラグが「1」であったジェネレータ配列Gen[]について、当該ファストダンプ待ちフラグを「0」にリセットする。
音源部21は、高速消音処理の指示に応答して、当該ジェネレータについて、ROM12の波形データエリアからノート番号にしたがった音高に基づき読み出された波形データに、高速リリースエンベロープを乗じて楽音波形データを生成して出力する。このようにして、ファストダンプ待ちフラグが「1」であったジェネレータ配列Gen[]に対応するジェネレータにおいては、高速消音のためのリリースエンベロープを用いて楽音が消音される。なお、音源部21による高速消音が完了すると、音源部21は、ジェネレータ配列Gen[]の発音フラグを「0」にリセットする。
発音待ちフラグが「1」にセットされたジェネレータ配列Gen[]が存在する場合には(ステップ1106でYes)、CPU11は、当該ジェネレータ配列Gen[]において、発音中フラグが「0」であるかを判断する(ステップ1107)。ステップ1107は、既に発音中のジェネレータを除外するために実行される。ステップ1107でYesと判断された場合には、CPU11は、当該ジェネレータ配列Gen[]のノート番号に示す音高の楽音波形データの生成を、音源部21に指示する(ステップ1108)。また、ステップ1108において、CPU11は、当該ジェネレータ配列Gen[]の発音待ちフラグを「0」にリセットする。
音源部21は、楽音波形データ生成の指示、つまり、発音の指示に応答して、ROM12の波形データエリアからノート番号にしたがった音高に基づき波形データを読み出し、読み出された波形データに、所定のエンベロープ(アタックのエンベロープなど)を乗算して楽音波形データを生成する。また、音源部21は、楽音波形データが生成されると発音中フラグを「1」にセットする。
以下、最大発音モードの下でのジェネレータへの割り当ての具体例を説明する。まず、押鍵数が増大した場合について説明する。図12(a)は、2つの鍵(ノート番号p、q)がベロシティ「64」で押鍵されたときのジェネレータへの割り当ての例を示す図である。図12(a)に示す割り当て例1200は、図6の鍵状態配列OldKey[]601およびジェネレータ数配列OldGenNum[]602に示す押鍵および割り当て状態に基づくものである。以下の例では、Gen0〜Gen127までの128個のジェネレータが存在すると考えている。鍵状態配列OldKey[]601に示すように2つの鍵(ノート番号:p、q)が押鍵中であり、かつ、ジェネレータ数配列OldGenNum[]602に示すように、それぞれに割り当てられたジェネレータ数は「64」である。図12(a)に示す例では、上記鍵状態配列およびジェネレータ数配列に基づいて、ジェネレータGen0〜Gen63にノート番号p、ジェネレータGen64〜Gen237にノート番号qが割り当てられ、それぞれが発音中である。
ノート番号rの鍵がベロシティ「127」にて押鍵された場合を考える。このときの鍵状態配列およびジェネレータ数配列は、図6のKey[]611およびGenNum[]612である。ジェネレータ数配列OldGenNum[]602およびGenNum[]612に基づいて、たとえば、図12(b)に示すようなジェネレータの割り当て例1210が得られる。
もともとノート番号pに割り当てられていたジェネレータGen0〜Gen63のうち、32個のジェネレータGen32〜Gen63がノート番号rに割り当てられ、また、もともと、ノート番号qに割り当てられていたジェネレータGen64〜Gen127のうち、31個のジェネレータGen86〜Gen126が、ノート番号rに割り当てられる。なお、ジェネレータGen127にはノート番号が割り当てられない。本実施の形態では、
GenNum[i]=Key[i]/Velsum×MaxGen
の演算において、ジェネレータ数の総和がMaxGenを超えないようにするために、1より小さい数(小数)を切捨てている。
鍵盤処理においては、ジェネレータGen32〜Gen63、Gen86〜127のジェネレータ配列Gen32[]〜Gen63[]、Gen86[]〜Gen127[]のファストダンプ待ちフラグがセットされ(図4のステップ403)、ジェネレータ配列Gen32[]〜Gen63[]、Gen86[]〜Gen126[]に、対応するノート番号rおよび発音待ちフラグ「1」がセットされる(図4のステップ408、図9)。このようにして、押鍵されたノート番号rの鍵に対して、63個のジェネレータが割り当てられる。
次に、押鍵数が減少した場合について説明する。図13(a)は、3つの鍵(ノート番号p、q、r)が所定のベロシティ(ノート番号p、qでは「64」、ノート番号rでは「127」)で押鍵されていた場合のジェネレータ割り当ての例を示す図である。図13に示すジェネレータ割り当て例1300は、図12(b)に示す割り当て例1210と同一である。この場合の鍵状態配列およびジェネレータ数配列は、図8に示す鍵状態配列OldGen[]801、ジェネレータ数配列OldGenNum[]802に示すものとなる。
ノート番号pの鍵が離鍵された場合を考える。このときの鍵状態配列およびジェネレータ数配列は、図8のKey[]811およびGenNum[]812である。ジェネレータ数配列OldGenNum[]802およびGenNum[]812に基づいて、たとえば、図13(b)に示すようなジェネレータの割り当て例1310が得られる。
この例では、もともとノート番号pに割り当てられていたジェネレータGen0〜Gen31のうち、10個のジェネレータGen0〜Gen9がノート番号qに割り当てられ、22個のジェネレータGen10〜Gen31がノート番号rに割り当てられる。
鍵盤処理においては、ジェネレータGen0〜Gen31のジェネレータ配列Gen0[]〜Gen31[]のファストダンプ待ちフラグがセットされ(図4のステップ405)、ジェネレータ配列Gen0[]〜Gen9[]にノート番号qおよび発音待ちフラグ「1」がセットされるとともに、ジェネレータ配列Gen10[]〜Gen31[]にノート番号rおよび発音待ちフラグ「1」がセットされる(図4のステップ406)。
本実施の形態によれば、CPU11は、オン状態の鍵のそれぞれに対して、オン状態の鍵のベロシティの総和に対する、各鍵のベロシティの割合に基づき、かつ、音源部21のジェネレータ数が最大になるように、各ジェネレータに、オン状態の鍵に応じた音高を割り当てる。したがって、たとえば、押鍵数が減少するのにしたがって、各鍵に割り当てられるジェネレータ数は増大する。これにより、一定の人数の楽団員が、アンサンブルを行なっているような音量および重厚感の楽音を発することが可能となる。また、鍵のベロシティの総和に対する、各鍵のベロシティの割合に基づいて各鍵に割り当てられるジェネレータ数が算出されるため、演奏者の押鍵操作を反映した割り当ても実現される。
本実施の形態においては、CPU11は、オン状態の鍵の何れかが新たにオフ状態となり、オン状態の鍵の数が減少した場合に、オフ状態となった鍵に割り当てられていたジェネレータ群について、発音中の楽音の消音を指示するとともに、オン状態を継続している残りの鍵のそれぞれついて、ベロシティの総和に対する、各鍵のベロシティの割合にしたがったジェネレータ数を算出し、当該算出されたジェネレータ数に基づいて、鍵の各々に対して、ジェネレータ群からジェネレータを割り当て、消音の後に、割り当てられた鍵に応じた音高の楽音を発生させる。
これにより、実際の演奏中に、ある鍵が離鍵されると、それに応じて、離鍵された鍵に割り当てられていたジェネレータが、各鍵のベロシティの割合にしたがって押鍵中の残りの鍵に割り当てられる。したがって、アンサンブルで、あるパートを演奏していた楽団員が、そのパートの終了とともに、残りのパートに分散して、演奏を続行するような演奏形態を、押鍵時のベロシティを考慮しつつ再現することができる。
また、本実施の形態においては、CPU11は、オン状態の鍵に対して割り当てられているジェネレータ数を示すジェネレータ数配列OldGenNum[]と、新たにオフ状態となった鍵を除いた、残りの鍵のそれぞれに対して割り当てるべき新たなジェネレータ数を示すジェネレータ数配列GenNum[]に基づき、残りの鍵のそれぞれについて、新たにオフ状態となった鍵に割り当てられていたジェネレータ群から、(GenNum[i]−OldGenNum[i])個のジェネレータを割り当てている。このようにして、複雑な演算を経ることなく、押鍵時のベロシティを考慮した割り当てが実現される。
さらに、本実施の形態においては、CPU11は、オフ状態であった鍵の何れかが新たにオン状態となり、オン状態の鍵が増大した場合に、新たにオン状態となった鍵を含まない、既にオン状態の鍵にそれぞれ割り当てられていたジェネレータ群において、新たにオン状態となった鍵を含むオン状態の鍵のそれぞれについて、演奏操作子のベロシティの総和に対する、各演奏操作子のベロシティの割合に基づき、新たにオン状態となった鍵に対して、ベロシティに基づいて、ジェネレータ群中の所定のジェネレータを割り当て、発音中の楽音の消音の後に、新たにオン状態となった鍵に応じた音高の楽音を発生させる。
これにより、実際の演奏中に、ある鍵が追加して押鍵されると、それに応じて、既に押鍵されていた鍵に割り当てられていたジェネレータ中、所定数のジェネレータが、新たに押鍵された鍵に割り当てられる。したがって、アンサンブルで、パートが追加された場合に、追加されたパートを含めて楽団員が分散するように、所定数の楽団員が追加されたパートを演奏するような演奏形態を再現することができる。また、この楽団員が分散を模したジェネレータの割り当てに際して、演奏者の押鍵操作を反映させることが可能となる。
また、本実施の形態においては、CPU11は、既にオン状態の鍵のそれぞれに対して割り当てられているジェネレータ数を示すジェネレータ数配列OldGenNum[]と、新たにオン状態となった鍵を含む、オン状態の鍵のそれぞれに対して割り当てるべき新たなジェネレータ数を示すジェネレータ数配列GenNum[]とに基づいて、既にオン状態の鍵のそれぞれについて、当該鍵のそれぞれに割り当てられていたジェネレータ群から、(OldGenNum[i]−GenNum[i])個のジェネレータを、新たにオン状態になった鍵に対して割り当てる。これにより、複雑な演算を経ることなく、押鍵時のベロシティを考慮したジェネレータの割り当てが実現される。
さらに、本実施の形態においては、ジェネレータ配列GENの内容を参照し、発音状態が、無音状態であるもの、消音中であるものの順に、前記演奏操作子のそれぞれに割り当てられていたジェネレータ群から、(OldGenNum[i]−GenNum[i])個のジェネレータを選択する。これにより、新たな鍵の割り当ての際に、不自然な消音をできるだけ排除することができる。
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
たとえば、前記実施の形態において、たとえば、128個の全てのジェネレータについて、本発明にかかる割り当てを適用しているが、これに限定されるものではなく、そのうちの所定数(たとえば、96個)のみについて、本発明にかかる割り当てを行なっても良い。
また、本実施の形態においては、ジェネレータ数の算出において生じた小数を切り捨て、ジェネレータの割り当てから除外している。しかしながら、これに限定されず、剰余となったジェネレータを、たとえば、ノート番号が小さい順(或いは大きい順)に、鍵に割り当てても良い。
さらに、前記実施の形態においては、鍵のベロシティの総和に対する各鍵のベロシティの割合を算出し、その割合に基づいて、各鍵に割り当てるジェネレータ数を決定している。すなわち、ベロシティは、鍵に割り当てるべきジェネレータ数を算出するために利用されている。しかしながら、これに限定されるものではなく、音源処理における新規押鍵に応答した発音の際に、ベロシティを反映させても良いことはいうまでもない。この場合には、ステップ1108に示す発音の指示を受け入れた音源部21は、ROM12の波形データエリアからノート番号にしたがった音高に基づき波形データを読み出し、読み出された波形データに、当該ノート番号のベロシティに従ったレベルのエンベロープ(アタックのエンベロープなど)を乗算して楽音波形データを生成する。なお、当該ノート番号のベロシティは、鍵状態配列Key[]におけるノート番号に対応する値を参照すれば良い。