図1は、本発明の実施形態による電子鍵盤楽器の構成例を示すブロック図である。101は、電子鍵盤楽器全体の制御を行うプログラムを実行するためのCPUである。前記プログラムで、鍵盤102やパネルスイッチ104の操作状態を把握し、音源回路109を制御する。
102は、鍵盤或いは鍵盤の動きに連動して回動するハンマやウィペンに代表される部材の操作状態と操作速度とを得るための鍵スイッチ及び鍵盤である。鍵盤102は、複数の鍵を有する。鍵スイッチ102は、例えば鍵盤の鍵(又は、鍵盤の鍵に対応するハンマ)毎に2個スイッチを設けており、CPU101から供給された鍵スイッチスキャン信号を基に、スキャン対象として指定された鍵盤の鍵に対応した鍵スイッチの状態(オン/オフ)を検出し、検出結果を後述の鍵タッチ検出手段103に出力する。
103は、鍵スイッチ102から出力されてきた鍵スイッチの状態を基に2個のスイッチ出力が共にオンとなる時間差をカウントし、前記カウント値をCPU101に出力する鍵タッチ検出手段である。カウントの方法としては、例えば2個のスイッチのうち手前側に設けたスイッチS1(図2)の状態がオフからオンに変化したタイミングでカウント値を最大値に初期化し、その後一定間隔毎にカウント値を減算し、奥側に設けたスイッチS2(図2)がオフからオンに変化したタイミングのカウント値を鍵タッチ検出手段103からCPU101に出力するように構成しておく。このように構成することにより、カウント値の大小から2個のスイッチS1及びS2の状態変化の時間差、即ち鍵盤の操作速度に該当する操作速度情報を把握することができる。前記操作速度情報は一時的に鍵タッチ検出手段103上のバッファに蓄えられ、データバス113を介してCPU101に読み出される。CPU101は、操作速度情報を補正し、ベロシティに変換する。
104は、電子鍵盤楽器に関わる機能を設定/切り替えするために使う複数のパネルスイッチである。電子鍵盤楽器の利用者は、パネルスイッチ104を操作し、音色の変更やタッチカーブの選択、に代表される各種設定操作や、本実施形態で使用する鍵毎の音量補正値の設定、を実施する。パネルスイッチ104は、CPU101から供給されたパネルスイッチスキャン信号を基に、スキャン対象として指定されたスイッチの状態(オン/オフ)を検出し、検出結果を後述のパネルスイッチ状態検出手段105に出力する。
105は、パネルスイッチ104から出力されてきたパネルスイッチの検出結果を一時的に記憶し、データバス113を介して前記検出結果をCPU101に出力するためのパネルスイッチ状態検出手段である。
106は、CPU101上で動作するプログラムや、本実施形態で使うテーブル類等を記憶するための不揮発性メモリ(例えば第1のROM)である。
107は、CPU101上で動作するプログラムが作業領域として使うための揮発性メモリ(例えば第1のRAM)である。
108は、本実施形態で使うテーブルアドレスの補正値等を記憶するための、不揮発性メモリ(例えば第2のRAM)である。なお、不揮発性メモリ108は、電子鍵盤楽器の動作中に内容を書き換えられるよう、フラッシュメモリやEEPROM等のように、CPU101からデータの書き換えができる素子を選択する。
109は、データバス113を介してCPU101により設定された音源制御パラメータ(ベロシティを含む)の内容に従い、楽音信号を発生する音源回路である。音源回路109は、ベロシティを基に、音量を制御して楽音信号を生成する。
また、110は、音源回路109が利用する楽音信号波形を記憶するための不揮発性メモリ(例えば第2のROM)である。音源回路109で生成した楽音信号は、オーディオ回路111上のD/Aコンバータ及びアンプを介してスピーカ112に出力され、電子鍵盤楽器外部に発音される。
電子鍵盤楽器の利用者は、鍵盤102を操作して演奏を実施する。その際、CPU101は、鍵スイッチ102及び鍵タッチ検出手段103を介して得た鍵スイッチの操作状態や、パネルスイッチ104及びパネルスイッチ状態検出手段105を介して得た各種設定を基に音源制御パラメータを生成し、音源回路109に音源制御パラメータを出力することで、最終的にスピーカ112から発音される。
図2は、鍵毎の鍵スイッチ102の配置例を示す図である。鍵スイッチ102は、鍵毎に2個の鍵スイッチS1及びS2を有する。201は配線基板、202はシャッタ、203はキャッチャ、204はハンマである。鍵スイッチS1及びS2は、例えば光の透過/遮断を検出するフォトインタラプタ300(図3)なる素子を使う。図3に示すように、フォトインタラプタ300は、発光ダイオード301とフォトトランジスタ302を1つながりの筐体に収めたもので、カタカナのコの字状の形態をしている。
図2の例では、鍵盤の鍵に連動して回動するハンマ204毎に取り付けたシャッタ202の回動軌跡上に2個ずつフォトインタラプタ300を並べ、1枚のシャッタ202で2個のフォトインタラプタ300を横切るよう配置してある。シャッタ202は、着色した樹脂や金属等光を透過させず硬質な材質を使い、板状に成型する。色は、黒等濃い色が望ましい。取り付けは、ハンマシャンク及びキャッチャシャンクを挿入するバットと、キャッチャ203と、に跨って取り付ける。
図3は、鍵スイッチS1の構成例を示す回路図である。鍵スイッチS2も鍵スイッチS1と同じ構成を有する。フォトインタラプタ300は、発光ダイオード301及びフォトトランジスタ302を有する。電源電圧Vcc及びグランド電位間に、発光ダイオード301及び抵抗303の直列接続回路と、フォトトランジスタ302及び抵抗304の直列接続回路とが並列に接続される。コの字状のフォトインタラプタ300の中央部に設けられた空間をシャッタ202が横切ると、出力電圧OUTが変動する。
図4は、鍵スイッチS1及びS2の動作例を示すタイムチャートである。シャッタ202がフォトインタラプタ300内の発光ダイオード301とフォトトランジスタ302の間に無い場合、光が透過し、出力電圧OUTは電源電圧Vccに近い値を示す。この出力電圧OUTの状態をスイッチオンとして扱う。逆に、シャッタ202がフォトインタラプタ300内の発光ダイオード301とフォトトランジスタ302の間に有る場合、光は遮断され、出力電圧OUTはグランド電位に近い値を示す。この出力電圧OUTの状態をスイッチオフとして扱う。
図5は、鍵スイッチS1及びS2の出力例を示すタイムチャートである。図2のように鍵スイッチS1及びS2を配置した場合、シャッタ202と鍵スイッチ(フォトインタラプタ)S1,S2との位置関係は、次の様になる。
・非押鍵状態では、シャッタ202が2つのスイッチS1及びS2の光軸を共に遮らない。
・鍵盤の鍵を押し下げていくと、ハンマ204が回動し、シャッタ202が2つの鍵スイッチS1及びS2の光軸を、S1→S2の順で遮る。
・更に鍵盤の鍵を押し下げていくと、シャッタ202が2つの鍵スイッチS1及びS2の光軸を通り過ぎ、S1→S2の順で光透過状態になる。
・鍵盤の鍵を押し切った状態では、シャッタ202が2つの鍵スイッチS1及びS2の光軸を共に遮らない。
・鍵盤の鍵を戻すときはその逆の順に変化していく。
時刻ta〜tbの区間でシャッタ202の移動速度を検出し、時刻tbでその移動速度に応じたベロシティの音量で発音する。その後、一旦スイッチS1及びS2が共にオフされた状態を経て、時刻tcのようにスイッチS1及びS2が共にオンに戻ったら発音を停止するように消音処理する。なお、時刻ta〜tbの区間は、押鍵時の力をハンマ204に伝える部材(ジャック)がハンマ204の取り付け土台であるバットから離れた後の区間になるよう設定し、時刻ta〜tbの区間はシャッタ202が等速度で移動するようにしておく。
図6は、ハンマ204の移動速度を得るために使うカウント値の変化例を示す図である。鍵タッチ検出手段103は、図5の時刻taからtbまでの時間をカウントし、カウント値を出力する。図5上の時刻taのタイミングでカウンタを最大値c_maxにリセットし、その後一定時間毎にカウンタを減算していき、時刻tbのタイミングで値を確定させる。確定した値は、次回リセットされるまで保持しておく。カウンタが減算を実施する時間間隔とスイッチS1からS2までの距離は予め判っているので、保持されたカウント値が最大値からどれくらい減ったかを調べれば、シャッタ202がスイッチS1からS2までを横切った速度、即ちハンマ204の移動速度が判る。
電子鍵盤楽器は、鍵毎に音量を把握するため、少なくとも鍵の数以上の数のカウンタ及び前記カウンタの出力であるカウント値を記憶する領域を有する。
図7は、カウント値の変化範囲を示す図である。既に述べたように、カウント値は、図5上の時刻taのタイミングで最大値c_maxに初期化する。その後、所定時間t_maxをかけて、カウント値が0になるまで一定間隔で減算する。
後述するが、カウント値はリニア−ログ変換テーブル(図9)を参照する際のアドレスとして利用する。そのため、カウント値の最大値c_maxは、リニア−ログ変換テーブルの大きさa_maxよりも大きくなるよう設定しておく。また、得られるアドレスがリニア−ログ変換テーブルの範囲を超えることがないよう、演奏操作で得られるカウント値が図7の太線部(カウント値:(c_max−a_max)〜c_max)に収まるよう、鍵スイッチS1及びS2の間隔並びにカウント値を減算する時間間隔と、リニア−ログ変換テーブルの大きさa_maxと、の関係を設定しておく。
図8は、カウント値をリニア−ログ変換テーブル用アドレスに変換する例を示す図である。カウント値が0〜(c_max−a_max)の間はアドレスを最大値a_maxで一定にし、カウント値が(c_max−a_max)〜(c_max)の間は、0以上の範囲のアドレスに単調減少させる。この変換は、図8のような形態の変換テーブルを使っても良いし、演算で行っても良い。演算で求める場合は、a_max以上の値をa_maxに置き換え、値の範囲を制限する。
シャッタ202の移動速度が速い時はカウント値の減算があまり行われないので、得られるカウント値が大きい。図8に示すような変換を行うと小さいアドレスが得られ、図9のリニア−ログ変換テーブルの出力である中間ベロシティは大きい値となる。逆に、シャッタ202の移動速度が遅い時はカウント値の減算が多く行われるので、得られるカウント値が小さくなり、結果的に中間ベロシティは小さい値となる。
図9は、リニア−ログ変換テーブルの例を示す図である。リニア−ログ変換テーブルは、図8のアドレスから中間アドレスに変換するためのテーブルである。また、リニア−ログ変換テーブルは、時間軸に対してリニアに出力されたカウント値を、人間の聴覚にあわせてログに変換するというものである。図8で説明した方法でカウント値をアドレスに変換し、図9のリニア−ログ変換テーブルを参照する。リニア−ログ変換テーブルの出力(中間ベロシティ)は、MIDIのベロシティがとる値の範囲(0〜127)に収めておくと良い。
アドレス値a_topは、シャッタ202が最短時間でスイッチS1からS2までを横切った場合のカウント値から得た値であり、リニア−ログ変換テーブルの出力が127以下に変わる変化点となる。アドレス値a_topは、標準となる鍵、例えばキーナンバが40の鍵を最強の力で打鍵した時に得られるアドレス値、あるいは前記アドレス値より少し小さめの値に設定しておく。アドレス値a_endは、中間ベロシティが0になるアドレス値である。
図10は、タッチカーブの例を示す図である。横軸は中間ベロシティを示し、縦軸は最終ベロシティを示す。このタッチカーブは、電子鍵盤楽器の音量特性の調整で用いられる変換テーブルであり、カウント値を図9のリニア−ログ変換テーブルで変換して得た中間ベロシティを電子鍵盤楽器の発音音量として使えるよう調整するためのものである。
タッチカーブ1001を使うと、中間ベロシティはそれまでより大きな値に変更されるため、電子鍵盤楽器の発音量も大きくなる。このような場合、電子鍵盤楽器で容易に大きな音量で発音できるようになるため、演奏者は鍵盤のタッチレスポンスが軽くなったと感じる。逆に、タッチカーブ1003を使うと、中間ベロシティはそれまでより小さな値に変更されるため、電子鍵盤楽器の発音量も小さくなる。このような場合、電子鍵盤楽器で大きな音量を出すには大きな打鍵力を必要とするようになるため、演奏者は鍵盤のタッチレスポンスが重くなったと感じる。タッチカーブ1002は、中間ベロシティと最終ベロシティが同じなるようにしたものである。
図11は、3個のタッチカーブ1001〜1003による音量調整結果のイメージを示す図である。横軸はアドレスを示し、縦軸は中間ベロシティを示す。実際にはタッチの軽重を変更する処理はタッチカーブ1001〜1003によって中間ベロシティを増減させて行っているが、この調整をリニア−ログ変換テーブル上で実施した場合は、リニア−ログ変換テーブルを図11のように変化させたことと等価になる。
図12(A)、(B)及び図13(A)〜(D)に、鍵スイッチS1及びS2周辺における部品の取り付け状態の例を示す。取り付けの際、鍵スイッチ(フォトインタラプタ)S1,S2又はシャッタ202の取り付け位置や角度が誤差を持つと、下記の理由によってシャッタ202が鍵スイッチS1からS2までを横切る時間が変化する。
図12(A)及び(B)は、鍵スイッチS1及びS2でハンマ204の動きを検出し、ハンマの移動速度をベロシティとして得る例を示す図である。201は配線基板、202はシャッタ、203はキャッチャ、204はハンマである。図12(A)は正常時の鍵スイッチS1及びS2の取り付け状態を示す図であり、図12(B)は異常時の鍵スイッチS1及びS2の取り付け状態を示す図である。
配線基板201上に設けた鍵スイッチS1及びS2の取り付け方法が悪いと、図12(B)の様に鍵スイッチS1及び/又はS2が傾いたり位置がずれたりするため、結果的に鍵スイッチS1及びS2間の距離が増減する。これにより、シャッタ202が鍵スイッチS1からS2までを横切るのに要する時間も増減する。
図13(A)〜(D)は、鍵スイッチS1及びS2で鍵盤の鍵の動きを検出し、鍵の移動速度をベロシティとして得る例を示す図である。201は配線基板、202はシャッタ、1301は鍵盤の鍵である。図13(A)は正常時のシャッタ202の取り付け状態を示す図であり、図13(C)は図13(A)の状態のシャッタ202の段差d1を示す図である。図13(B)は異常時のシャッタ202の取り付け状態を示す図であり、図13(D)は図13(B)の状態のシャッタ202の段差d2を示す図である。
鍵盤の各鍵1301の下に設けたシャッタ202の取り付け方法が悪いと、図13(B)の様にシャッタ202が傾いたり位置がずれたりするため、結果的に、図13(D)の鍵スイッチS1及びS2間の距離d2が増減する。これにより、シャッタ202が鍵スイッチS1からS2までを横切るのに要する時間も増減する。
図14は、鍵スイッチS1及びS2間の距離の増加を考慮したリニア−ログ変換テーブルの例を示す図である。横軸はアドレスを示し、縦軸は中間ベロシティを示す。極端な例として、鍵スイッチS1及びS2の間隔が2倍に広がった場合を考えると、既に述べたように速度検出区間においてはシャッタ202が等速度で移動するため鍵スイッチS1及びS2間を移動する時間が2倍になり、鍵タッチ検出手段103の出力(カウント値)が取り得る範囲も2倍に増える。カウント値の変化範囲が2倍になれば、それを変換して得られるアドレス値の取り得る範囲も2倍になるので、例えば図14のリニア−ログ変換テーブル1401が適用されていた鍵スイッチS1及びS2の間隔が2倍になった場合は、リニア−ログ変換テーブル1402のように、アドレスを2倍に伸ばして対応するのが好ましい。逆に、鍵スイッチS1及びS2の間隔が半分に縮まった場合は、カウント値も半分に減る。そのため、図示しないが変換テーブルは、変換テーブル1401の半分に縮めて対応するのが好ましい。
図15は、比較例による音量補正のイメージを示す図である。横軸はアドレスを示し、縦軸は中間ベロシティを示す。実際には鍵毎の音量補正を図10のタッチカーブ上で実施しているが、図15では話を判り易くするため、リニア−ログ変換テーブルの特性を変えて同じ効果を得る場合のイメージを示している。
比較例では、鍵盤毎に−1.0〜+1.0の範囲の補正値αを設定しておき、図10のタッチカーブを通して得た最終ベロシティveloを用いて、velo+velo×αなる演算を実施し、最終ベロシティveloを(0×velo)〜(2×velo)の範囲の値に補正する。最終ベロシティ補正値は、演算結果が0未満の場合は0に、127以上の場合は127にして、出力が0〜127の範囲に収まるよう制限する。
しかし、図13(A)〜(D)で説明した理由により、この補正方法は現状を反映できていない。また、補正値αを0よりも小さい値に補正した場合、ベロシティの最大値が127よりも必ず小さくなってしまうという問題もある。
図16は、本実施形態による平行移動処理を使った音量補正のイメージを示す図である。横軸はアドレスを示し、縦軸は中間ベロシティを示す。実際にはリニア−ログ変換テーブルを参照するアドレスを、図16の真中の太線で示した基準となるリニア−ログ変換テーブルの有効範囲に入るよう修正することで鍵毎の音量補正を実施するが、話を判り易くするため、リニア−ログ変換テーブルの特性を変えて同じ効果を得る場合のイメージを示している。
この補正方法は、見かけ上リニア−ログ変換テーブルを鍵毎に持ち、夫々のリニア−ログ変換テーブルを平行移動させるようにしたことと同じになる。リニア−ログ変換テーブルのアドレス値が小さい範囲はベロシティの変化幅が大きく、数カウントの増減でもベロシティに与える影響が大きいが、アドレス値が大きい範囲ではベロシティの変化幅が小さく、かつベロシティの値自体も小さいので差が判りにくい、という特性に着目した方法である。
鍵毎に補正値βを持ち、図8のようにカウント値を変換して得たリニア−ログ変換テーブルのアドレスに対して、前記補正値βを直接加減算するという方法で補正する。補正値βの取り得る範囲は、鍵スイッチS1及びS2の間隔やカウンタの演算速度によるが、1バイト程度のデータに収まる範囲(−64〜+63)もあれば十分である。補正値βが正の場合は減算によってアドレスが小さくなるため、リニア−ログ変換テーブルの出力である中間ベロシティの値は大きくなる。逆に、補正値βが負の場合は減算によってアドレスが大きくなるため、リニア−ログ変換テーブルの出力である中間ベロシティの値は小さくなる。
この補正方法は、図14で説明した現象に厳密には対応できていないが、鍵スイッチ間隔の取り付け誤差に起因するカウント値のばらつきが比較的小さい場合に適用できる。
図17は、本実施形態による伸縮処理を使った音量補正のイメージを示す図である。横軸はアドレスを示し、縦軸は中間ベロシティを示す。図16の場合と同じように、実際にはリニア−ログ変換テーブルを参照するアドレスを、図17の真中の太線で示した基準となるリニア−ログ変換テーブルの有効範囲に入るよう修正することで鍵毎の音量補正を実施するが、話を判り易くするため、リニア−ログ変換テーブルの特性を変えて同じ効果を得る場合のイメージを示している。
この補正方法は、見かけ上リニア−ログ変換テーブルを鍵毎に持ち、夫々のリニア−ログ変換テーブルを伸縮させられるようにしたことと同じになる。
この補正方法は、鍵毎に補正値βを持ち、前記補正値βを加味した伸縮倍率でリニア−ログ変換テーブルのアドレスを乗算して補正を行うというものであり、乗算手段が必要な分平行移動による方法よりコストは高くなるものの、図14で説明した現象に比較的よく対応できる。
図18は、本実施形態による伸縮処理で用いる伸縮倍率の例を示す図である。補正値β(−val_max〜+val_max)の値から、リニア−ログ変換テーブルのアドレスに対する伸縮倍率を求める。図18の直線1801のような変換を行った場合は0〜2.0倍の伸縮倍率が得られ、直線1802のような変換を行った場合は0.5〜1.5倍の伸縮倍率が得られる。伸縮倍率の範囲は、正の値に限定しておく。図では伸縮倍率を2種類提示しているが、実際には鍵スイッチS1及びS2のばらつき具合を基に1種類だけ設定しておけば良い。補正値が正の場合は伸縮倍率が1未満になるので乗算によってアドレスが小さくなり、リニア−ログ変換テーブルの出力である中間ベロシティの値は大きくなる。逆に、補正値が負の場合は伸縮倍率が1以上になるので乗算によってアドレスが大きくなり、リニア−ログ変換テーブルの出力である中間ベロシティの値は小さくなる。
図19は、図15の比較例におけるベロシティ取得までのデータフローのイメージを示す図である。既に説明したが、この方法ではタッチカーブによるベロシティ変換を実施した後で、鍵毎の音量補正を行う。
鍵毎の鍵スイッチスキャン手段1901は、鍵スイッチS1及びS2の状態をスキャンする。次に、鍵毎の鍵スイッチの時間差カウント手段1902は、鍵スイッチS1がオンになってから鍵スイッチS2がオンになるまでの時間tb−taをカウントする。次に、カウント−アドレス変換手段1903は、図8のように、カウント値からアドレスに変換する。次に、数値の丸め手段1904は、アドレスを0〜a_maxの範囲に制限する。次に、リニア−ログ変換テーブル1905は、図9に示すように、アドレス値から中間ベロシティに変換し、出力する。
パネルスイッチスキャン手段1906は、パネルスイッチ104の状態をスキャンする。次に、パネル操作の解釈手段1907は、パネルスイッチ104の状態に応じて、パネル操作の解釈を行う。ユーザは、パネルスイッチ104を操作することにより、3個のタッチ変換テーブル1910〜1912の中の1つを選択し、ベロシティ補正値を指定することができる。タッチ変換テーブル指定種類の記憶手段1908は、パネル操作の解釈手段1907の出力に応じて、切り替え手段1909を制御する。切り替え手段1909は、リニア−ログ変換テーブル1905が出力する中間ベロシティを、3個のタッチ変換テーブル1910〜1912の中の1つに切り替えて出力する。
タッチ変換テーブル1910は、軽いタッチ用のタッチ変換テーブル1001(図10)に対応し、中間ベロシティを最終ベロシティに変換する。タッチ変換テーブル1911は、標準のタッチ用のタッチ変換テーブル1002(図10)に対応し、中間ベロシティを最終ベロシティに変換する。タッチ変換テーブル1912は、重いタッチ用のタッチ変換テーブル1003(図10)に対応し、中間ベロシティを最終ベロシティに変換する。
鍵毎のベロシティ補正値の記憶手段1913は、パネル操作の解釈手段1907の出力に応じて、鍵毎のベロシティ補正値(−1.0〜+1.0)を出力する。乗算器1914は、タッチ変換テーブル1910〜1912の中の切り替え手段1909により選択されたものが出力する最終ベロシティと記憶手段1913が出力するベロシティ補正値とを乗算し、出力する。加算器1915は、タッチ変換テーブル1910〜1912の中の切り替え手段1909により選択されたものが出力する最終ベロシティと乗算器1914の出力値とを加算し、最終ベロシティ補正値を出力する。次に、数値の丸め手段1916は、加算器1915の出力値を0〜127の範囲に制限し、鍵毎のベロシティ(音量)を出力する。
図20は、図16で説明した本実施形態による平行移動処理におけるベロシティ取得までのデータフローのイメージを示す図である。既に説明したが、この方法は図19の比較例よりも現実に近い音量補正結果を得るため、リニア−ログ変換テーブルを参照する時点で鍵毎の音量補正を行い、その後タッチカーブによるベロシティ変換を実施するものである。
図20は、図19に対して、記憶手段1913、乗算器1914及び加算器1915を削除し、記憶手段2001及び減算器2002を追加したものである。以下、図19と異なる点を説明する。記憶手段2001は、鍵毎のベロシティ補正値βを記憶し、パネル操作の解釈手段1907の出力に応じて、鍵毎のベロシティ補正値βを出力する。減算器2002は、カウント−アドレス変換手段1903が出力するアドレスに対して、記憶手段2001が出力するベロシティ補正値βを減算し、数値の丸め手段1904に出力する。タッチ変換テーブル1910〜1912の中の切り替え手段1909により選択されたものが出力する最終ベロシティが、鍵毎の最終的なベロシティ(音量)となる。
図21は、図17で説明した本実施形態による伸縮処理におけるベロシティ取得までのデータフローのイメージを示す図である。この方法も、本実施形態の平行移動処理(図20)と同じ理由で、リニア−ログ変換テーブルを参照する時点で鍵毎の音量補正を行い、その後タッチカーブによるベロシティ変換を実施する。
図21は、図20に対して、減算器2002を削除し、変換手段2101及び乗算器2102を追加したものである。以下、図20と異なる点を説明する。変換手段2101は、図18に示すように、記憶手段2001が出力する補正値βを伸縮倍率(例えば、0.5〜1.5)に変換し、出力する。乗算器2102は、カウント−アドレス変換手段1903が出力するアドレスに対して、変換手段2101が出力する伸縮倍率を乗算し、数値の丸め手段1904に出力する。タッチ変換テーブル1910〜1912の中の切り替え手段1909により選択されたものが出力する最終ベロシティが、鍵毎の最終的なベロシティ(音量)となる。
図22は、図1の電子鍵盤楽器の処理方法のメインルーチンを示すフローチャートである。この電子鍵盤楽器の処理は、CPU101がメモリ106内のプログラムを実行することにより行われる。
ステップS2201では、CPU101は、イニシャル処理により各種パラメータを初期化する。次に、ステップS2202では、発音/消音に関するイベント検出処理を行う。次に、ステップS2203では、イベント実行処理を行う。次に、ステップS2204では、パネル操作の解釈処理(パネルスイッチ検出処理を含む)を行う。次に、ステップS2205では、その他の処理を行う。その後、ステップS2202に戻り、電子鍵盤楽器の電源がオフされるまで続ける。その他の処理については詳細な説明を省略するが、例えばMIDI送受信の制御、デモ曲再生の制御、演奏内容の記録、といった処理を行う。
図23は、図22のステップS2202のイベント検出処理の詳細を示すフローチャートである。まず、ステップS2301では、CPU101は、鍵変数keyを0に設定する。次に、ステップS2302では、CPU101は、鍵タッチ検出手段103を介して、鍵毎の鍵タッチ検出処理を行う。具体的には、鍵スイッチS1及びS2の状態を検出する。次に、ステップS2303では、CPU101は、鍵変数keyをインクリメントする。次に、ステップ2304では、CPU101は、鍵変数keyが88以上であるか否かをチェックする。88以上でない場合にはステップS2302に戻り、88以上である場合には処理を終了する。
ここでは、演奏操作に伴う発音関係のイベントを検出するための処理を、メインルーチンが一周する度に88鍵分のタッチ検出処理を実施する場合の処理を示したが、メインルーチンが数周かけて回る間に88鍵分の処理を分割して実施するような構成にしても構わない。
図24は、図22でのステップS2203のイベント実行処理の詳細を示すフローチャートである。まず、ステップS2401では、CPU101は、鍵タッチ検出手段103を介して、鍵変数keyに対応した鍵スイッチS1及びS2の状態を取得する。次に、ステップS2402では、CPU101は、発音イベントが発生しているか否かをチェックする。発音イベントが発生していればステップS2403に進み、発音イベントが発生していなければステップS2404に進む。ステップS2403では、CPU101は、音源回路109に対して発音イベント処理を行い、処理を終了する。ステップS2404では、CPU101は、消音イベントが発生しているか否かをチェックする。消音イベントが発生していればステップS2405に進み、消音イベントが発生していなければステップS2406に進む。ステップS2405では、CPU101は、音源回路109に対して消音イベント処理を行い、処理を終了する。ステップS2406では、CPU101は、その他のイベント処理を行い、処理を終了する。
ここでは、図23と同様に、指定した鍵変数keyについて、図5で説明した鍵スイッチS1及びS2の状態と、図6で説明したカウント値と、をみて電子音の発音及び消音を実施する。図24では発音イベントや消音イベントの判定内容まで記載していないので、以下に更に詳細な処理内容を説明する。
通常の発音タイミングでは、鍵スイッチS1及びS2間の距離に応じて減算処理が実施されるため、必ず最大値より小さいカウント値count[key]が得られる。これに対し、発音タイミング以外の場合は、カウンタのリセット直後に演算結果が維持されることになるため、結果的にリセット値である最大カウント値(=c_max)が得られる。従って、鍵スイッチS1及びS2が共にオンであることを認識した後、カウント値count[key]が最大値か否かを調べれば、発音処理をすべきか消音処理をすべきかを判断できる。
発音指示を記録する際はカウント値も同時に記録し、後でハンマ204の移動速度即ち発音強度を算出できるよう準備しておく。消音指示も、発音指示と同じ形式で記録しておくと、後の処理が簡単になる。消音イベントが発生したときのカウント値は最大値となっているが、これを0に変えた上で発音指示として記録すれば良い。
図25は、図22のステップS2204のパネル操作の解釈処理の詳細を示すフローチャートである。まず、ステップS2501では、CPU101は、パネルスイッチ状態検出手段105を介して、パネルスイッチ104の操作状態を取得する。ユーザは、パネルスイッチ104を操作することにより、音量補正したい鍵、その補正値、又はタッチカーブの種類(図10)を指定することができる。次に、ステップS2502では、CPU101は、上記のパネルスイッチ104の操作状態に応じて、鍵毎の音量の補正対象を変更するか否かを判断する。補正対象を変更する場合にはステップS2503に進み、補正対象を変更しない場合にはステップS2504に進む。ステップS2503では、CPU101は、パネルスイッチ104の操作状態に応じて鍵毎の音量の補正対象の鍵番号vol_keyを更新し、処理を終了する。ステップS2504では、CPU101は、上記のパネルスイッチ104の操作状態に応じて、鍵毎の音量の補正値を変更するか否かを判断する。補正値を変更する場合にはステップS2505に進み、補正値を変更しない場合にはステップS2506に進む。ステップS2505では、CPU101は、パネルスイッチ104の操作状態に応じて鍵毎の音量の補正値β[vol_key]を更新し、処理を終了する。ステップS2506では、CPU101は、パネルスイッチ104の操作状態に応じて、タッチカーブの種類を変更するか否かを判断する。タッチカーブの種類を変更する場合にはステップS2507に進み、タッチカーブの種類を変更しない場合にはステップS2508に進む。ステップS2507では、CPU101は、パネルスイッチ104の操作状態に応じてタッチカーブの指定値touchを更新し、処理を終了する。ステップS2508では、CPU101は、パネルスイッチ104の操作状態に応じてその他の処理(音色番号toneの変更等)を行い、処理を終了する。
ここでは、本実施形態の処理で用いる鍵毎の音量補正値β[vol_key]と、全鍵共通のタッチカーブの種類を指定するパラメータtouchと、ピアノやオルガンといった音色を指定するパラメータtone等の更新と記録を実施する。音量補正対象となる鍵を示すvol_keyは、既に説明した鍵変数keyと同様に鍵ナンバ0〜87に一対一で対応させておき、1鍵ずつ補正値を設定できるようにする。この時、全ての鍵を対象とするような値を設定可能にしておいても良い。例えば、鍵変数keyに鍵ナンバ88以上の値を設定可能な構成にし、88以上の設定値が入力された後は、補正値β[0]〜β[87]全てに同じ補正量を加減算する。
タッチカーブは、例えば図10のタッチカーブ1001を軽いタッチカーブtch_tblL[]、タッチカーブ1002を標準のタッチカーブtch_tblM[]、タッチカーブ1003を重いタッチカーブtch_tblH[]として予め用意しておく。タッチカーブの種類を示すパラメータtouchは、軽いタッチカーブ1001を指定する場合は1、標準のタッチカーブ1002を指定する場合は2、重いタッチカーブ1003を指定する場合は3、を記録する。
詳細な説明は省略するが、音色を指定するパラメータtoneや、説明を省略するパラメータも、同様に対応する項目と設定値を一対一で対応させ、適宜記録しておけば良い。
図26は、図24のステップS2403の発音イベント処理の詳細を示すフローチャートである。まず、ステップS2601では、CPU101は、鍵タッチ検出手段103を介して、図5の時刻taから時刻tbまでの時間に対応する鍵変数keyのカウント値count[key]を取得する。次に、ステップS2602では、CPU101は、図7及び図8に示すように、上記のcount[key]がc_max−a_maxより大きいか否かを判断する。大きければステップS2603に進み、大きくなければステップS2611に進む。ステップS2603では、CPU101は、図8に示すように、上記のカウント値count[key]をアドレスaddrに変換する。次に、ステップS2604では、CPU101は、図16又は図17に示すように、リニア−ログ変換テーブルli_lg_tbl[]を用いてアドレスaddrを中間ベロシティt_velo(=li_lg_tbl[addr])に変換する。次に、ステップS2605では、CPU101は、タッチカーブの指定値touchの記録を取得する。次に、ステップS2606では、CPU101は、タッチカーブの指定値touchが標準のタッチカーブを指定しているか否かを判断する。標準のタッチカーブを指定している場合にはステップS2608に進み、標準のタッチカーブを指定していない場合にはステップS2607に進む。ステップS2608では、CPU101は、図10に示すように、標準のタッチカーブtch_tblM[]を用いて中間ベロシティt_veloを最終ベロシティvelo(=tch_tblM[t_velo])に変換し、ステップS2611に進む。ステップS2607では、CPU101は、タッチカーブの指定値touchが軽いタッチカーブを指定しているか否かを判断する。軽いタッチカーブを指定している場合にはステップS2609に進み、軽いタッチカーブを指定していない場合にはステップS2610に進む。ステップS2609では、CPU101は、図10に示すように、軽いタッチカーブtch_tblL[]を用いて中間ベロシティt_veloを最終ベロシティvelo(=tch_tblL[t_velo])に変換し、ステップS2611に進む。ステップS2610では、CPU101は、図10に示すように、重いタッチカーブtch_tblH[]を用いて中間ベロシティt_veloを最終ベロシティvelo(=tch_tblH[t_velo])に変換し、ステップS2611に進む。ステップS2611では、CPU101は、音源回路109に対して、鍵番号key、音量(最終ベロシティ)velo及び音色toneを基に楽音信号を生成させ、スピーカ112から発音させる。
ここでは、まず図23と同様に、指定した鍵変数keyについて、鍵変数keyに対応した2つの鍵スイッチS1及びS2をシャッタ202が横切る時間に該当するカウント値count[key]を取得する。次に、図8で説明したカウント値−アドレス値の変換を行い、アドレスaddrを得る。この変換は単純なので、プログラムで実施しても良いし、カウント値−アドレス値変換テーブルct_addr_tbl[]を用意しておき、これをカウント値count[key]で参照することで実施しても良い。更に、図9で説明したリニア−ログ変換テーブルln_lg_tbl[]をアドレスaddrで参照すれば中間ベロシティt_veloが得られる。
その後、図25の処理で記録しておいたタッチカーブの種類の指定値touchを取得し、予め記録しておいた軽いタッチカーブtch_tblL[]、標準のタッチカーブtch_tblM[]、重いタッチカーブtch_tblH[]のどれを参照したら良いかを把握する。タッチカーブの種類が決まれば、その種類のタッチカーブで、先程求めた中間ベロシティt_veloを変換すれば、音源制御で使える発音量としての最終ベロシティveloが求められる。
最後に、CPU101は、鍵番号keyと、音量(最終ベロシティ)veloと、図25の処理で記録しておいた音色指定toneと、の値を参考にしながら、必要なパラメータを生成して音源回路109に出力する。ここで音源回路109に出力するパラメータは、使用する音源回路109によって異なるので、ここでは説明を省略する。
図27は、図26のステップS2603のアドレス変換処理の詳細を示すフローチャートであり、図16で説明した方法を使い、見かけ上リニア−ログ変換テーブルが平行移動したかのように処理する場合の処理例である。まず、ステップS2701では、CPU101は、鍵変数keyの音量補正値β[key]の記録を取得する。次に、ステップS2702では、CPU101は、カウント値count[key]から補正値β[key]を減算したアドレスaddr(=count[key]−β[key])を演算する。次に、ステップS2703では、CPU101は、アドレスaddrが0より小さいか否かを判断する。0より小さい場合にはステップS2704に進み、0より小さくない場合にはステップS2705に進む。ステップS2704では、CPU101は、アドレスaddrに0を設定し、処理を終了する。ステップS2705では、CPU101は、アドレスaddrが最大値a_max以上であるか否かを判断する。最大値a_max以上である場合にはステップS2706に進み、最大値a_max以上でない場合には処理を終了する。ステップS2706では、CPU101は、アドレスaddrに(a_max−1)の値を設定し、処理を終了する。
以上のように、まず、処理対象となる鍵変数keyについて図25の処理で記録した鍵毎の音量の補正値β[key]を求め、それをカウント値count[key]から減じ、リニア−ログ変換テーブルを参照するアドレスaddrを得る。最後に、アドレスaddrがリニア−ログ変換テーブルの範囲を超えないよう、0〜127の範囲で制限する処理を行う。
図28は、図26のステップS2603の他のアドレス変換処理の詳細を示すフローチャートであり、図17で説明した方法を使い、見かけ上リニア−ログ変換テーブルが伸縮したかのように処理する場合の処理例である。まず、ステップS2801では、CPU101は、鍵変数keyの音量補正値β[key]の記録を取得する。次に、ステップS2802では、CPU101は、図18に示すように、変換テーブルx_tbl[]を用いて補正値β[key]から伸縮倍率X(=x_tbl[β[key]])に変換する。次に、ステップS2803では、CPU101は、カウント値count[key]に伸縮倍率Xを乗算したアドレスaddr(=count[key]×X)を演算する。次に、ステップS2804では、CPU101は、アドレスaddrが最大値a_max以上であるか否かを判断する。最大値a_max以上である場合にはステップS2805に進み、最大値a_max以上でない場合には処理を終了する。ステップS2805では、CPU101は、アドレスaddrに(a_max−1)の値を設定し、処理を終了する。
以上のように、まず、処理対象となる鍵変数keyについて図25の処理で記録した鍵毎の音量の補正値β[key]を求め、更に図18で説明した音量補正値−伸縮倍率変換テーブルx_tbl[]を前記補正値β[key]で参照し、伸縮倍率Xを求める。更に、求めた伸縮倍率Xをカウント値count[key]に対して乗算し、リニア−ログ変換テーブルを参照するアドレスaddrを得る。最後に、アドレスaddrがリニア−ログ変換テーブルの範囲を超えないよう、0〜127の範囲で制限する処理を行う。変換倍率Xは正の範囲に設定してあるので、演算結果が0以下になった場合の制限処理は不要である。
以上のように、本実施形態の電子鍵盤楽器は、複数の鍵を有する鍵盤102と、前記鍵盤102の各鍵に対応して設けられ、前記鍵盤102の押鍵速度に対応する時間間隔で順次オンする第1のスイッチS1及び第2のスイッチS2とを有する。カウント手段1902(鍵タッチ検出手段103)は、カウントステップにおいて、第1のスイッチS1及び第2のスイッチS2が順次オンする時間間隔に対応するカウント値をカウントする。補正手段は、補正ステップにおいて、前記時間間隔のばらつきに応じて前記カウント値又はそれに応じた値を補正する。具体的には、前記補正手段は、前記カウント値をアドレスに変換し、前記アドレスを補正する。ベロシティ変換手段は、リニア−ログ変換テーブル1905及びタッチ変換テーブル1910〜1912を含み、ベロシティ変換ステップにおいて、前記補正された値をベロシティに変換する。
前記補正手段は、図16及び図17に示すように、前記ベロシティの最小値(例えば0)に対応する補正対象の値a_end及び前記ベロシティの最大値(例えば127)に対応する補正対象の値a_topがシフトするように補正する。
図16、図20及び図27の場合、前記補正手段は、前記カウント値又はそれに応じた値に補正値βを加算又は減算することにより補正を行う。具体的には、前記補正手段は、前記鍵盤102の押鍵された鍵毎の補正値を加算又は減算する。また、記憶手段2001は、前記鍵盤102の鍵毎の前記補正値を記憶する。
図17、図21及び図28の場合、前記補正手段は、前記カウント値又はそれに応じた値に補正倍率Xを乗算することにより補正を行う。具体的には、前記補正手段は、前記鍵盤102の押鍵された鍵毎の補正倍率Xを乗算する。また、前記補正手段は、前記鍵盤102の鍵毎の補正値βを補正倍率Xに変換し、前記補正倍率Xを乗算する。また、記憶手段2001は、前記鍵盤102の鍵毎の前記補正値βを記憶する。
図2及び図12(A)、(B)の場合、第1のスイッチS1及び第2のスイッチS2は、前記鍵盤102の押鍵に伴うハンマ204の移動速度に対応する時間間隔で順次オンする。また、図13(A)〜(D)の場合、第1のスイッチS1及び第2のスイッチS2は、前記鍵盤102の押鍵に伴う鍵1301の移動速度に対応する時間間隔で順次オンする。
本実施形態によれば、第1のスイッチS1及び第2のスイッチS2の取り付けの不具合又はシャッタ202の取り付けの不具合により、第1のスイッチS1及び第2のスイッチS2が順次オンする時間間隔がばらついた場合にも、正確なベロシティに変換し、音量制御を行うことができる。
本実施形態は、コンピュータ(電子鍵盤楽器)がプログラムを実行することによって実現することができる。また、プログラムをコンピュータに供給するための手段、例えばかかるプログラムを記録したCD−ROM等のコンピュータ読み取り可能な記録媒体又はかかるプログラムを伝送するインターネット等の伝送媒体も本発明の実施形態として適用することができる。また、上記のプログラムを記録したコンピュータ読み取り可能な記録媒体等のコンピュータプログラムプロダクトも本発明の実施形態として適用することができる。上記のプログラム、記録媒体、伝送媒体及びコンピュータプログラムプロダクトは、本発明の範疇に含まれる。記録媒体としては、例えばフレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、磁気テープ、不揮発性のメモリカード、ROM等を用いることができる。
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。