(57)【要約】【課題】処理負荷を制御可能な電子楽器、電子楽器の制御方法、及びプログラムに関し、ＣＰＵパワーの不足で大きな遅延が発生して演奏に支障を来したり、不要な制限でＣＰＵ能力を持て余したりすることなく、ＣＰＵの能力を常に１００％に近い形で引き出す。【解決手段】音源コマンドバッファに、現在時刻を記録したレスポンス計測用コマンドを定期的に書き込み、音源コマンドバッファからレスポンス計測用コマンドが読み出されるときに、現在時刻ｔと読み出されたレスポンス計測用コマンドに記録されている現在時刻ｍ２、ｍ３との差分時間ｄとしてレスポンスタイムが計測される（Ｓ１９０２）。このレスポンスタイムに応じて、音源ＬＳＩにおける最大同時発音数ＭＡＸ＿ＰＯＬＹが増減される（Ｓ１９０６）。【選択図】図１９
2018054857.tif 000002
【特許請求の範囲】
【請求項１】
複数音を同時発音する音源と、
音源コマンドバッファから、前記音源の制御に関する複数の音源コマンドを読み出して実行する処理部と、
を備え、
前記処理部は、
前記音源コマンドが前記音源コマンドバッファに書き込まれてから、前記音源コマンドが前記音源コマンドバッファから読み出されるまでの差分時間に応じて、前記音源における同時発音数を制御する、電子楽器。
【請求項２】
前記処理部は、
前記音源コマンドバッファに、現在時刻を記録したレスポンス計測用コマンドを定期的に書き込み、
前記音源コマンドバッファから前記レスポンス計測用コマンドを読み出すときの現在時刻と前記読み出したレスポンス計測用コマンドに記録されている現在時刻との差分時間として前記差分時間を計測する、
請求項１に記載の電子楽器。
【請求項３】
前記処理部は、前記差分時間に応じて前記音源における最大同時発音数を変更した場合に、前記変更後の最大同時発音数が現在の同時発音数を下回った場合に、過剰に発音されている分の発音ボイスをスローダンプ処理により消音させる、請求項１又は２に記載の電子楽器。
【請求項４】
複数音を同時発音する音源と、音源コマンドバッファから、前記音源の制御に関する複数の音源コマンドを読み出して実行する処理部と、を備えた電子楽器における制御方法であって、前記処理部は、
前記音源コマンドが前記音源コマンドバッファに書き込まれてから、前記音源コマンドが前記音源コマンドバッファから読み出されるまでの差分時間に応じて、前記音源における同時発音数を制御する、電子楽器の制御方法。
【請求項５】
複数音を同時発音する音源と、音源コマンドバッファから、前記音源の制御に関する複数の音源コマンドを読み出して実行するコンピュータと、を備えた電子楽器において、前記コンピュータに、
前記音源コマンドが前記音源コマンドバッファに書き込まれてから、前記音源コマンドが前記音源コマンドバッファから読み出されるまでの差分時間に応じて、前記音源における同時発音数を制御するステップを、実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、処理負荷を制御可能な電子楽器、電子楽器の制御方法、及びプログラムに関する。
【背景技術】
【０００２】
昨今の音源チップ、あるいはソフト音源には最大同時発音数が２００を超えるようなものもあるが、実際には音源の種類に依って１オシレータあたりのＣＰＵ（中央演算処理装置）の処理負荷が異なったり、あるいは音源以外の処理量などの影響から必ずしも最大発音数を音楽的に問題なく発音処理できるとは限らない。例えば、押鍵から実際の発音に数十ミリ秒も要してしまったら音楽的に聞くに堪えない演奏と成ってしまう。
【０００３】
音源としては可能な限り同時発音数を大きくしたいところではあるが、前記のようなケースでは、同時発音数を減らしても演奏から発音までの時間を短縮し、音色変化のインターバルを短くしたほうが失うものが遥かに少ないと言える。逆に、ＣＰＵの処理能力に十分な余裕を持って最大発音数を定めている電子楽器やソフトウェア音源もあるが、実際にはそれ以上の能力があるにもかかわらず、同時発音数を制限してしまっているケースもある。
【０００４】
電子楽器における処理負荷を軽減するための従来技術として、ケーブルが繋がっていないときにＭＩＤＩ出力信号を生成しないようにして、ＣＰＵの処理負荷を軽減する技術が知られている（例えば特許文献１）。
【０００５】
また、ステレオ音色の楽音生成において、エンベロープのパラメータをステレオの楽音を生成する手段に対して共通に発生することにより、発音時の処理速度の低下とＣＰＵの負荷増大を抑制した技術が知られている（例えば特許文献２）。
【０００６】
また、次のような従来技術が知られている（例えば特許文献３）。負荷状況に応じてリングバッファを巡回歩進する速度が変化する書き込みアドレスＷＡＤおよび警告アドレスＫＡＤと、サンプリング周期毎にリングバッファを巡回歩進する読み出しアドレスＲＡＤとの関係をモニタし、読み出しアドレスＲＡＤが書き込みアドレスＷＡＤと警告アドレスＫＡＤとの間に入り込む毎に警告回数を計数し、一定期間中に計数された警告回数を表示部に表示したり、その警告回数に応じて発音チャンネル数を減らしたり、実行指定されているエフェクトの種類を減らす他、実行中のノーマルエフェクトを、ＣＰＵの負荷を軽減するライトエフェクトに変更する。これにより、どの程度エラーが発生し易い状態になっているかをユーザに報知でき、ＣＰＵ負荷率を適正に保つよう自律的に制御する電子楽器が実現される。
【０００７】
更に、次のような従来技術が知られている（例えば特許文献４）。共有メモリから読み出したデータに基づいて装置各部を制御するＣＰＵと、ＣＰＵの制御の下に共有メモリから読み出したデータに基づいて楽音を発生する音源と、共有メモリにアクセスするＣＰＵおよび音源の各バスの負荷状態をモニタするトラフィックモニタとを備える。トラフィックモニタによりモニタされる各バスの負荷状態に応じて、ＣＰＵが音源にバス負荷を下げる制御を指示及び又は共有メモリにアクセスする音源の優先順位を変更する。システム全体（楽器全体）を制御する処理能力の低下を回避する楽音発生装置を提供する。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平０６−２５０６５６号公報
【特許文献２】特開２０００−３３８９６８号公報
【特許文献３】特開２００２−１３２２６２号公報
【特許文献４】特開２０１６−０９０８６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、特許文献１又は２に記載の従来技術は、処理負荷を軽減するために事前に対策を行う方法であり、電子楽器の演奏途中での処理負荷の増大には対処できなかった。
【００１０】
また、特許文献３に記載の従来技術は、負荷の変動を吸収するためにリングバッファが必要であり、ハードウェアコストが高くなるという課題があった。
【００１１】
更に、特許文献４に記載の従来技術は、共有メモリの使用が前提であり、共有メモリが使用されない場合の電子楽器における処理負荷の変動には対応できないという課題があった。
【００１２】
そこで本発明は、ＣＰＵパワーの不足で大きな遅延が発生して演奏に支障を来したり、不要な制限でＣＰＵ能力を持て余したりすることなく、ＣＰＵの能力を常に１００％に近い形で引き出すことを目的とする。
【課題を解決するための手段】
【００１３】
態様の一例では、複数音の同時発音が可能な音源と、音源の制御に関する音源コマンドを順次記憶する音源コマンドバッファと、音源コマンドバッファに順次記憶された音源コマンドを順次読み出して実行する処理部とを備えた電子楽器において、処理部は、音源コマンドが音源コマンドバッファに記憶されてから音源コマンド実行手段によって読み出されて実行されるまでのレスポンスタイムを計測し、レスポンスタイムに応じて音源における最大同時発音数を制御する。
【発明の効果】
【００１４】
本発明によれば、ＣＰＵパワーの不足で大きな遅延が発生して演奏に支障を来したり、不要な制限でＣＰＵ能力を持て余したりすることなく、ＣＰＵの能力を常に１００％に近い形で引き出すことが可能となる。
【図面の簡単な説明】
【００１５】
【図１】電子鍵盤楽器の一実施形態の外観例を示す図である。
【図２】電子鍵盤楽器の制御システムの一実施形態のハードウェア構成例を示すブロック図である。
【図３】本実施形態で使用される代表的な定数及び変数のデータフォーマットを示す図である。
【図４】音源制御バッファと演奏情報のデータフォーマット、及びレスポンスタイム−同時発音数増減値対応表を示す図である。
【図５】本実施形態における電子楽器の制御処理例を示すメインフローチャートである。
【図６】ユーザインターフェース処理の詳細例を示すフローチャートである。
【図７】コントローラ処理の詳細例を示すフローチャートである。
【図８】音源コマンド処理の詳細例を示すフローチャートである。
【図９】音源定常サービス処理の詳細例を示すフローチャートである。
【図１０】キースキャナインタラプトルーチン及びタイマインタラプトルーチンの各詳細例を示すフローチャートである。
【図１１】音源コマンドバッファ書込みサブルーチンの詳細例を示すフローチャートである。
【図１２】音源コマンド実行サブルーチンの詳細例を示すフローチャートである。
【図１３】演奏コマンド処理ルーチンの詳細例を示すフローチャートである。
【図１４】押鍵コマンド処理サブルーチンの詳細例を示すフローチャートである。
【図１５】ボイス検索サブルーチンの詳細例を示すフローチャートである。
【図１６】最古ボイス検索サブルーチンの詳細例を示すフローチャートである。
【図１７】離鍵コマンド処理サブルーチンの詳細例を示すフローチャートである。
【図１８】サスティーンペダル処理サブルーチンの詳細例を示すフローチャートである。
【図１９】レスポンス計測用コマンド処理サブルーチンの詳細例を示すフローチャートである。
【図２０】発音ボイス削除処理サブルーチンの詳細例を示すフローチャートである。
【発明を実施するための形態】
【００１６】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。以下に説明する実施形態では、複数音を同時発音する音源と、音源コマンドバッファから、音源の制御に関する複数の音源コマンドを読み出して実行する処理部とを備えた電子鍵盤楽器等において、音源コマンドが音源コマンドバッファに書き込まれてから、音源コマンドが音源コマンドバッファから読み出されるまでの差分時間に応じて、音源における同時発音数が制御される。ＣＰＵの負荷をほぼリアルタイムで計測した結果に基づいて同時発音数が制御されるため、ＣＰＵパワーの不足で大きな遅延が発生して演奏に支障を来したり、不要な制限でＣＰＵ能力を持て余したりすることなく、ＣＰＵの能力を常に１００％に近い形で引き出すことが可能となる技術である。
【００１７】
図１は、本発明による電子鍵盤楽器１００の一実施形態の外観例を示す図である。電子鍵盤楽器１００は、演奏操作子としての複数の鍵からなる鍵盤１０１と、音色選択や音色以外の各種機能選択を行うスイッチ・パネル１０２と、ピッチベンダーホイール１０３と、ピッチモジュレーションホイール１０４、特には図示しないサスティーンペダル、各種設定情報を表示するＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ：液晶ディスプレイ）１０５等を備える。また、電子鍵盤楽器１００は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、又は背面部等に備える。
【００１８】
図２は、図１の電子鍵盤楽器１００の制御システム２００の一実施形態のハードウェア構成例を示す図である。図２において、電子鍵盤楽器１００は、ＣＰＵ（中央演算処理装置）２０１、ＲＯＭ（リードオンリーメモリ）２０２、ＲＡＭ（ランダムアクセスメモリ）２０３、タイマ２０４、波形ＲＯＭ２０６が接続される音源ＬＳＩ（大規模集積回路）２０５、図１の鍵盤１０１と図１のスイッチ・パネル１０２とが接続されるキースキャナ２０７、図１のピッチベンダーホイール１０３とピッチモジュレーションホイール１０４がそれぞれ接続される個別のＡ／Ｄコンバータ２０８、及び図１のＬＣＤ１０５が接続されるＬＣＤコントローラ２０９が、それぞれシステムバス２１２に接続される構成を備える。また、音源ＬＳＩ２０５から出力されるデジタル楽音波形データは、Ｄ／Ａコンバータ２１０によりアナログ楽音波形信号に変換され、アンプ２１１で増幅された後に、特には図示しないスピーカ又は出力端子から出力される。
【００１９】
ＣＰＵ２０１は、ＲＡＭ２０３をワークメモリとして使用しながらＲＯＭ２０２に記憶された制御プログラムを実行することにより、図１の電子鍵盤楽器１００の制御動作を実行する。また、ＲＯＭ２０２は、上記制御プログラム及び各種固定データを記憶する。
【００２０】
ＣＰＵ２０１には、本実施形態で使用するタイマが２系統接続タイマ１  ２０４ａ及びタイマ２  ２０４ｂとして実装されており、これによって、レスポンスタイムコマンドの発行、及びレスポンスタイムの計測をする。タイマ１  ２０４ａ及びタイマ２  ２０４ｂはいずれも１６ビットのカウンタであり、１μ（マイクロ）秒ごとにインクリメントする。
【００２１】
タイマ１  ２０４ａは、レスポンスタイムの計測用でありそのカウンタ値がＦＦＦＦＨ（「Ｈ」は１６進数を示す）の次は００００Ｈに戻るという動作を繰り返すフリーランニングタイマである。従って、約６６ミリ秒までしか計測できないが、本実施形態ではそれ以上の長時間をレスポンスタイムとして想定していないので、問題はない。
【００２２】
タイマ２  ２０４ｂは、定期的にレスポンス計測用コマンドを発行するための割込み処理を起動するために使われる。本実施形態では、例えば２５ミリ秒に１回タイマ割込みを発生するように設定される。
【００２３】
音源ＬＳＩ２０５は、波形ＲＯＭ２０６から波形を読み出し、Ｄ／Ａコンバータ２１０に出力する。音源ＬＳＩ２０５は、同時に最大２５６ボイスを発振させる能力を有する。
【００２４】
キースキャナ２０７は、鍵盤１０１（図１）とスイッチ・パネル１０２の操作ボタン状態を定常的に走査し、ＣＰＵ２０１に割り込みを掛けて状態変化を伝える。
【００２５】
３つのＡ／ＤコンバータからなるＡ／Ｄコンバータ２０８には、本体の演奏操作子であるピッチベンダーホイール１０３、モジュレーションホイール１０４、及び特には図示しないサスティーンペダルが接続され、変化をＣＰＵ２０１に知らせる。ＣＰＵ２０１は、Ａ／Ｄコンバータ２０８の現在値を読みに行くことで、その時点の操作子の状態を知る。
【００２６】
ＬＣＤコントローラ２０９は、ＬＣＤ１０５を制御するＩＣ（集積回路）である。
【００２７】
図１及び図２の構成例を有する本実施形態の動作について、以下に詳細に説明する。本実施形態では、音源ＬＳＩ２０５を制御する信号源として鍵盤１０１の演奏、音色変更のためのスイッチ・パネル１０２の操作、ピッチベンダーホイール１０３、モジュレーションホイール１０４、サスティーンペダルといったコントローラの操作がある。これらの手段によって発生した演奏信号は音源ＬＳＩ２０５に送られる。
【００２８】
発生した演奏情報を音源ＬＳＩ２０５に伝える手段としては、共通の音源コマンドバッファで情報を仲介し、ここに積まれた情報を音源処理プログラムが解釈して発音、消音、ピッチ変更、モジュレーション変更、音色変更が実行される。この音源コマンドバッファは、いわゆるリングバッファの形態をとり、音源制御情報を発生する各プログラムが同じ音源コマンドバッファにデータを積んでいき、音源処理プログラムによってのみ読み出される。なお、前述した従来技術でいうリングバッファとは異なるものである。
【００２９】
例えば、鍵盤１０１の演奏操作がキースキャナ２０７によって検知されると、キースキャナーインタラプトルーチンの割込みによって、鍵盤１０１の演奏に基づいて発生するキースキャナイベントに対応するＭＩＤＩメッセージが、音源コマンドバッファに書き込まれる。
【００３０】
本実施形態では、上記の信号源に加え、レスポンス計測用のタイマインタラプトルーチンが、タイマ２  ２０４ｂからの２５ミリ秒間隔の割込みによって、定期的に起動している。これは、上述の音源コマンドバッファにレスポンス計測用コマンドを書き込むためのルーチンである。このレスポンス計測用コマンドには、それが音源コマンドバッファに書き込まれるときに、タイマ１  ２０４ａのタイマ値がタイマ時刻として記録される。そして、このレスポンス計測用コマンドが音源コマンド処理によって読み出されるときに、その時点のタイマ１  ２０４ａが示すタイマ時刻（タイマ値）と、レスポンス計測用コマンドに記録されているタイマ時刻との差分時間がレスポンスタイムとして算出される。
【００３１】
このレスポンスタイムは状況によって毎回変動するが、単発的な処理の増減で急激な最大発音数の変化を発生させないように現在の同時最大発音数を徐々に増減させる処理が行われる。この背景としては、音色に依存して１音の処理のＣＰＵ負荷が異なったり、その他の機能の処理内容によっても最大発音数としての適正値が異なるため判断基準が一定にならないためである。つまり音色の種類によっては同時発音数１５０としても、もっと制限しないと改善が見込めないケース２００としても、まだ演奏に支障がないというケースもありうる。そこで、現在のレスポンスタイムと基準になるレスポンスタイムとを比較し、その差異に応じて同時発音数を増減させる実測方式が、より効率的、現実的であると考えられる。勿論、その可変範囲は０になることはなく、最大同時発音数を超えることもない。
【００３２】
本実施形態では、レスポンスタイムに対応する同時発音数増減値が、ＲＯＭ２０３に記憶されている図４（ａ）で後述するレスポンスタイム−同時発音数増減値対応テーブルを参照して取得され、同時発音数が制御される。これらの具体的な時間や数に関しては、後述する。
【００３３】
酢このような処理によって同時発音数が変化した結果、現在の実際の発音数を下回った場合は、優先度の低いオシレータから消音処理が実行される。この消音処理は、聴感上目立たないように、比較的緩やかなレートで消音するスローダンプ処理として実行される。また、その後レスポンスタイムが改善し、同時発音数が増えたとしても、消音したものを復帰させることは行わない。
【００３４】
以上の同時発音数の制御方式に基づく、本実施形態の具体的な処理について、以下に説明する。図３は本実施形態で使用される代表的な定数及び変数の一覧表を示す図である。図３（ａ）は、ＲＯＭ２０３に記憶される代表的な定数として、レスポンスタイム−同時発音数増減値対応テーブルのデータＲＥＳ＿ＴＩＭＥ＿ＴＢＬのデータフォーマットを示す図である。このテーブルでは、図４（ａ）に示されるように、１１種類のレスポンスタイムレンジ最大値（μ秒）ＲＥＳ＿ＴＩＭＥ＿ＴＢＬ［０］．ＲＡＮＧＥ＿ＴＯＰ〜ＲＥＳ＿ＴＩＭＥ＿ＴＢＬ［１０］．ＲＡＮＧＥ＿ＴＯＰ毎に、同時発音数増減値ＲＥＳ＿ＴＩＭＥ＿ＴＢＬ［０］．ＤＩＦＦ〜ＲＥＳ＿ＴＩＭＥ＿ＴＢＬ［１０］．ＤＩＦＦが定義されている。
【００３５】
図３（ｂ）は、ＲＡＭ２０２に一時的に記憶される各種変数のデータフォーマットが示されている。これらについては、フローチャートの説明において後述する。
【００３６】
図４（ｂ）は、音源コマンドバッファに記憶される各種コマンドのデータフォーマットを示す。音源コマンドバッファには、１つのコマンドが常に４バイトで記憶される。コマンドの種類は、最下位バイト側の第１バイト（ｂｉｔ０−７：第０〜第７ビット）で判断される。
【００３７】
鍵盤１０１の演奏、スイッチ・パネル１０２の操作、各種コントローラ（ピッチベンダーホイール１０３、モジュレーションホイール１０４、サスティーンペダル等）の操作に対応するＭＩＤＩメッセージコマンドは、第１バイトに値０１Ｈが格納され、第２バイト（ｂｉｔ８−１５：第８〜第１５ビット）、第３バイト（ｂｉｔ１６−２３：第１６〜第２３ビット）、第４バイト（ｂｉｔ２４−３１：第２４〜第３１ビット）にＭＩＤＩメッセージコマンドＭＩＤＩ［０］、ＭＩＤＩ［１］、ＭＩＤＩ［２］が格納される。
【００３８】
レスポンス計測用コマンドでは、第１バイトに値０２Ｈ、第２バイトに値００Ｈが格納され、第３バイトにタイマ時刻値下位バイトＴｉｍｅＬＳＢ、第４バイトにタイマ時刻値上位バイトＴｉｍｅＭＳＢが格納される。
【００３９】
音源リセットコマンドでは、第１バイトに値０３Ｈ、第２〜第４バイトに値００Ｈが格納される。また、無効データは、第１バイトの値が００Ｈ、若しくは０４Ｈ〜ＦＦＨの値の場合である。
【００４０】
図４（ｃ）は、演奏情報のデータフォーマットを示す図である。Ｎｏｔｅ  ｏｎ（ノートオン：押鍵）、Ｎｏｔｅ  ｏｆｆ（ノートオフ：離鍵）、Ｍｏｄｕｌａｔｉｏｎ（モジュレーションホイール１０４の操作）、Ｈｏｌｄ  ｐｅｄａｌ（サスティーンペダルの操作）、Ｐｒｏｇｒａｍ  ｃｈａｎｇｅ（プログラムチェンジ）、Ｐｉｔｃｈ  ｂｅｎｄｅｒ  ｃｈａｎｇｅ（ピッチベンダーホイール１０３の操作）毎に、ＭＩＤＩメッセージコマンド値ＭＩＤＩ［０］、ＭＩＤＩ［１］、ＭＩＤＩ［２］の値がそれぞれ定義される。
【００４１】
図５は、本実施形態における電子楽器の制御処理例を示すメインフローチャートである。この処理は、図２のＣＰＵ２０１が、ＲＯＭ２０３に記憶された制御プログラムを実行する処理として実現される。ここでの処理は、大きく分けて以下の５つから構成される。
初期化処理（ステップＳ５０１）：電源投入時のみ実行される。
ユーザインターフェース処理（ステップＳ５０２）：操作監視、設定変更、表示の処理である。音色切替えの処理を含む。
コントローラＡ／Ｄ処理（ステップＳ５０３）：ピッチベンダーホイール１０３、ピッチモジュレーションホイール１０４、サスティーンペダルの状態監視とＭＩＤＩメッセージコマンドの発行（音源コマンドバッファへの書込み）の処理である。
音源コマンド処理（ステップＳ５０４）：音源のコマンドバッファに積まれた音源コマンドを解析して順番に処理する。
音源定常サービス処理（ステップＳ５０５）：ボイスの発音状態の制御処理等である。本実施形態では、ダンプ処理を説明する。
【００４２】
まず、ＣＰＵ２０１は、初期化処理を実行する（ステップＳ５０１）。ここでは、ＣＰＵ２０１は、図２のタイマ１  ２０４ａ、タイマ２  ２０４ｂの初期化、図２の音源ＬＳＩ２０５の初期化、図１及び図２のＬＣＤ１０５の初期化、図２のＡ／Ｄコンバータ２０８の初期化、図２のキースキャナ２０７の初期化、その他、図３（ｂ）に示したＲＡＭ２０２上の変数の初期化を実行する。変数の初期化では、まず全変数領域が０で埋められ、０以外の初期値を持つ以下の変数が個別に初期化される。
ＭＡＸ＿ＰＯＬＹ＝２５６：初期段階では発音制限は行わない。
ＣＴＲＬ＿ＢＥＮＤＥＲ＝４０４０Ｈ：これはピッチベンダの値をＭＩＤＩフォーマットで保持しているためであり、４０４０Ｈは中央値であることを意味する。
【００４３】
ステップＳ５０１の初期化処理の後、ＣＰＵ２０１は、ステップＳ５０２からＳ５０５の一連の処理を繰り返し実行する。これらの一連の処理において、まずＣＰＵ２０１は、ユーザインターフェース処理を実行する（ステップＳ５０２）。図６は、図５のステップＳ５０２のユーザインターフェース処理の詳細例を示すフローチャートである。この処理では、図１のスイッチ・パネル１０２のボタンの状態をキースキャナ２０７を介して読み込み（ステップＳ６０１）、その変化に応じて機器の状態を変化させたり、その他の操作処理を行ったり（ステップＳ６０４）、状態を表示するＬＣＤを更新したりする（ステップＳ６０５）。スイッチ・パネル１０２の音色選択ボタンが操作された場合には（ステップＳ６０２の判定がＹＥＳ）、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、音色変更のＭＩＤＩメッセージコマンドを音源コマンドバッファに書き込む（ステップＳ６０３）。この場合、配列レジスタｄ［０］、ｄ［１］、ｄ［２］、及びｄ［３］はそれぞれ、図４（ｂ）の第１バイト、第２バイト、第３バイト、及び第４バイトを指定するＣＰＵ２０１内のレジスタである。これらはＲＡＭ２０２に記憶される変数であってもよい。ＣＰＵ２０１は、ステップＳ６０３で音源コマンドバッファ書込みサブルーチンをコールするときには、ｄ［０］に値０１Ｈ（図４（ｂ）参照）、ｄ［１］にＣｎＨ（ｎは電子鍵盤楽器１００に割り当てられているＭＩＤＩチャネルの番号）、ｄ［２］に音色番号（Ｐｒｏｇｒａｍ  ｎｕｍｂｅｒ）、ｄ［３］に００Ｈ（共に、図４（ｃ）のＰｒｏｇｒａｍ  ｃｈａｎｇｅのデータフォーマットを参照）を、それぞれ設定する。
【００４４】
次に、ＣＰＵ２０１は、コントローラＡ／Ｄ処理を実行する（ステップＳ５０３）。この処理では、演奏者が図１のピッチベンダーホイール１０３、ピッチモジュレーションホイール１０４、及び特には図示しないサスティーンペダルを操作したときの操作位置情報が、Ａ／Ｄコンバータ２０８を介して取得され、それぞれ音源コマンドバッファへの書込みが行われる。
【００４５】
図７は、図５のステップＳ５０３のコントローラＡ／Ｄ処理の詳細例を示すフローチャートである。図７の処理において、ＣＰＵ２０１はまず、図２のＡ／Ｄコンバータ２０８から出力されるピッチベンダーホイール１０３のＡ／Ｄ（アナログ／デジタル変換）値を読み込む（ステップＳ７０１）。次に、ＣＰＵ２０１は、ステップＳ７０１で読み込んだＡ／Ｄ値を、ＭＩＤＩフォーマットに変換し、一時的なレジスタａに格納する（ステップＳ７０２）。そして、ＣＰＵ２０１は、レジスタａの内容が、ＲＡＭ２０２に記憶されピッチベンダーホイール１０３の操作位置を示す変数ＣＴＲＬ＿ＢＥＮＤ＿ＷＨＥＥＬ（図３（ｂ）参照）の値と同じであるか否かを判定する（ステップＳ７０３）。ピッチベンダーホイール１０３について新たな操作が行われステップＳ７０３の判定がＮＯとなった場合には、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、ピッチベンダーホイール１０３のコントロール値変更のＭＩＤＩメッセージコマンドを音源コマンドバッファに書き込む（ステップＳ７０４）。この場合、ＣＰＵ２０１は、ｄ［０］に値０１Ｈ（図４（ｂ）参照）、ｄ［１］にＥｎＨ、ｄ［２］にレジスタａのＬＳＢ（下位バイト）、ｄ［３］にレジスタａのＭＳＢ（上位バイト）（共に、図４（ｃ）のＰｉｔｃｈ  ｂｅｎｄｅｒ  ｃｈａｎｇｅのデータフォーマットを参照）を、それぞれ設定する。
【００４６】
次に、ＣＰＵ２０１は、図２のＡ／Ｄコンバータ２０８から出力されるモジュレーションホイール１０４のＡ／Ｄ値を読み込む（ステップＳ７０５）。次に、ＣＰＵ２０１は、ステップＳ７０５で読み込んだＡ／Ｄ値を、ＭＩＤＩフォーマットに変換し、レジスタａに格納する（ステップＳ７０６）。そして、ＣＰＵ２０１は、レジスタａの内容が、ＲＡＭ２０２に記憶されモジュレーションホイール１０４の操作位置を示す変数ＣＴＲＬ＿ＭＯＤ（図３（ｂ）参照）の値と同じであるか否かを判定する（ステップＳ７０７）。モジュレーションホイール１０４について新たな操作が行われステップＳ７０７の判定がＮＯとなった場合には、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、モジュレーションホイール１０４のコントロール値変更のＭＩＤＩメッセージコマンドを音源コマンドバッファに書き込む（ステップＳ７０８）。この場合、ＣＰＵ２０１は、ｄ［０］に値０１Ｈ（図４（ｂ）参照）、ｄ［１］にＢｎＨ、ｄ［２］に０１Ｈ、ｄ［３］にレジスタａの内容（共に、図４（ｃ）のＭｏｄｕｌａｔｉｏｎのデータフォーマットを参照）を、それぞれ設定する。
【００４７】
更に、ＣＰＵ２０１は、図２のＡ／Ｄコンバータ２０８から出力されるサスティーンペダルのＡ／Ｄ値を読み込む（ステップＳ７０９）。次に、ＣＰＵ２０１は、ステップＳ７０９で読み込んだＡ／Ｄ値を、ＭＩＤＩフォーマットに変換し、レジスタａに格納する（ステップＳ７１０）。そして、ＣＰＵ２０１は、レジスタａの内容が、ＲＡＭ２０２に記憶されサスティーンペダルの操作位置を示す変数ＣＴＲＬ＿ＰＥＤＡＬ（図３（ｂ）参照）の値と同じであるか否かを判定する（ステップＳ７１１）。サスティーンペダルについて新たな操作が行われステップＳ７１１の判定がＮＯとなった場合には、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、サスティーンペダルのコントロール値変更のＭＩＤＩメッセージコマンドを音源コマンドバッファに書き込む（ステップＳ７１２）。この場合、ＣＰＵ２０１は、ｄ［０］に値０１Ｈ（図４（ｂ）参照）、ｄ［１］にＢｎＨ、ｄ［２］に４０Ｈ、ｄ［３］にレジスタａの内容（共に、図４（ｃ）のＨｏｌｄ  ｐｅｄａｌのデータフォーマットを参照）を、それぞれ設定する。
【００４８】
図８は、図５のステップＳ５０４の音源コマンド処理の詳細例を示すフローチャートである。ここでは、音源コマンドバッファ上で、リードポインタＲＰの値を１つずつ進めながら、押鍵、離鍵、モジュレーション、ベンダー、サスティンペダルの各コマンドの種類に応じたコマンド実行処理、又は後述するレスポンス計測用コマンドに対応した制御処理を実行する。
【００４９】
ＣＰＵ２０１はまず、他の処理（後述する図１０の各インタラプトルーチン）からの割込みを禁止する（ステップＳ８０１）。
【００５０】
次に、ＣＰＵ２０１は、音源コマンドバッファの読込みポインタであるリードポインタＲＰのアドレス（共に図３（ｂ）参照）が、ＲＡＭ２０２に記憶されている音源コマンドバッファの書込みポインタであるライトポインタＷＰのアドレスに追いついたか否かを判定する（ステップＳ８０２）。
【００５１】
ステップＳ８０２の判定がＮＯならば、ＣＰＵ２０１は、ＲＡＭ２０２に記憶されている音源コマンドバッファのリードポインタＲＰが示すエントリＴＧ＿ＣＭＤ［ＲＰ］（図３（ｂ）参照）から４バイトのコマンド値（図４（ｂ）参照）を読み込み、４バイトのレジスタｄに格納する（ステップＳ８０３）。
【００５２】
ＣＰＵ２０１は、次回の処理のために、リードポインタＲＰのアドレス値を１進める。ここで、１進めた記憶アドレス（ＲＰ＋１）が２５５を超えたときに先頭アドレス側に折り返せるようにするために、（ＲＰ＋１）とＦＦＨとの論理積を取った値を、新たなリードポインタＲＰのアドレス値としている。
【００５３】
その後、ＣＰＵ２０１は、音源コマンドバッファを開放するために、ステップＳ８０１で設定した割込みの禁止状態を解除する（ステップＳ８０５）。
【００５４】
そして、ＣＰＵ２０１は、音源コマンド実行サブルーチンをコールしてレジスタｄに読み出したコマンドを実行する（ステップＳ８０６）。このとき、ＣＰＵ２０１は、レジスタｄと００００００ＦＦＨとの論理積をとることにより、レジスタｄの下位側からみた第１バイトを取り出して、配列レジスタｄ［０］に格納する。また、ＣＰＵ２０１は、レジスタｄと００００ＦＦ００Ｈとの論理積をとりその結果を１００Ｈで除算することにより、レジスタｄの下位側からみた第２バイトを取り出して、配列レジスタｄ［１］に格納する。また、ＣＰＵ２０１は、レジスタｄと００ＦＦ００００Ｈとの論理積をとりその結果を１００００Ｈで除算することにより、レジスタｄの下位側からみた第３バイトを取り出して、配列レジスタｄ［２］に格納する。更に、ＣＰＵ２０１は、レジスタｄとＦＦ００００００Ｈとの論理積をとりその結果を１００００００Ｈで除算することにより、レジスタｄの最上位バイト（第４バイト）を取り出して、配列レジスタｄ［３］に格納する。ＣＰＵ２０１は、以上のようにして設定した配列レジスタｄ［０］、ｄ［１］、ｄ［２］、及びｄ［３］を、音源コマンド実行サブルーチンに引数として渡す。音源コマンド実行サブルーチンの詳細については、図１２以降のフローチャートの説明で後述する。
【００５５】
その後、ＣＰＵ２０１は、ステップＳ８０１の処理に戻り、ステップＳ８０４でインクリメントされた次のリードポインタＲＰが示す音源コマンドバッファからの音源コマンドの読込み処理に移行する。
【００５６】
以上の処理が繰り返し実行された結果、リードポインタＲＰのアドレスがライトポインタＷＰのアドレスに追いつくと、ＣＰＵ２０１は、ステップＳ８０１で設定した割込み禁止を解除する（ステップＳ８０７）。その後、ＣＰＵ２０１は、図８のフローチャートで示される図５のステップＳ５０４の音源コマンド処理を終了する。
【００５７】
図９は、図５のステップＳ５０５の音源定常サービス処理の詳細例を示すフローチャートである。ここでは、ＣＰＵ２０１は、発音中のボイスに対してピッチや音量などの時間的な変化の監視と制御を行う。特に、本実施形態に関連するのは、リリースダンプ及びスローダンプ中のボイス制御である。
【００５８】
ＣＰＵ２０１はまず、ピッチ制御や音量制御等の各種音源定常サービス処理を実行する（ステップＳ９０１）。
【００５９】
その後、ＣＰＵ２０１は、ステップＳ９０２でボイス番号を示すレジスタｖの値を０にリセットした後、ステップＳ９０８でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ９０９でレジスタｖの値が２５６に達したと判定するまで、ステップＳ９０３からＳ９０７の一連の処理を、各ボイス番号ｖのボイスについて繰り返し実行する。
【００６０】
上記繰返しにおいて、ＣＰＵ２０１はまず、ボイス番号ｖのボイスの発音状態ＶＯＩＣＥ［ｖ］．ＳＴＡＴがリリースダンプ中を示す値３又はスローダンプ中を示す値４（図３（ｂ）参照）になっているか否かを判定する（ステップＳ９０３）。
【００６１】
ステップＳ９０３の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ９０８の処理に移って、次のボイス番号ｖに対する処理に移行する。
【００６２】
ステップＳ９０３の判定がＹＥＳならば、ＣＰＵ２０１は、ボイス番号ｖのボイスのレベルをレジスタａに格納した後（ステップＳ９０４）、レジスタａの値が目標値である０に達したかどうかを調べ（ステップＳ９０５）、０に達したものが発見された場合（ステップＳ９０５の判定がＹＥＳの場合）には、次の処理を実行する。
【００６３】
ＣＰＵ２０１は、ボイス番号ｖのボイスに対応する発音状態ＶＯＩＣＥ［ｖ］．ＳＴＡＴを停止中を示す値０（図３（ｂ）参照）にセットする（ステップＳ９０６）。
【００６４】
そして、ＣＰＵ２０１は、ＲＡＭ２０２に記憶されている現在の発音数を示す変数値ＣＵＲ＿ＰＯＬＹの値を１減算してセットし直すことにより、現在の発音数を１減らす（ステップＳ９０７）。
【００６５】
以上のようにして、現在のボイス番号ｖに対するステップＳ９０３からＳ９０７の一連の処理が終了すると、ＣＰＵ２０１は、ステップＳ９０８でレジスタｖの値を＋１インクリメントして、ステップＳ９０９の判定からステップＳ９０３の処理に戻り、次のボイス番号ｖに対する処理を繰り返し実行する。
【００６６】
全てのボイスｖに対する処理が完了してステップＳ９０９の判定がＹＥＳになると、ＣＰＵ２０１は、図９のフローチャートで示される図５のステップＳ５０５の音源定常サービス処理を終了する。
【００６７】
次に、インタラプトルーチンについて説明する。まず、図２のキースキャナ２０７は、図１の鍵盤１０１やスイッチ・パネル１０２の操作を検知すると、ＣＰＵ２０１に割込みを発生させる。ＣＰＵ２０１は、この割込みを検知すると、図５のメインルーチンの処理を中断して、図１０（ａ）のキースキャナーインタラプトルーチンを実行する。
【００６８】
ＣＰＵ２０１はまず、キースキャナ２０７がレジスタｓ、ｋ、及びｖにそれぞれセットしたステータス（値０ならノートオフ、値１ならノートオン）、キーナンバ、及びベロシティの各値を読み込む（ステップＳ１００１）。
【００６９】
ＣＰＵ２０１は、レジスタｓの値が１（ノートオン）であるか否かを判定する（ステップＳ１００２）。
【００７０】
ステップＳ１００２の判定がＹＥＳならば、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、ノートオンのＭＩＤＩメッセージコマンドを音源コマンドバッファに書き込む（ステップＳ１００３）。この場合、ＣＰＵ２０１は、配列レジスタｄ［０］に値０１Ｈ（図４（ｂ）参照）、ｄ［１］に９ｎＨ、ｄ［２］にレジスタｋのキーナンバ値、ｄ［３］にレジスタｖのベロシティ値（共に、図４（ｃ）のＮｏｔｅ  ｏｎのデータフォーマットを参照）を、それぞれ設定する。
【００７１】
一方、キースキャナイベントがノートオフイベントでステップＳ１００２の判定がＮＯならば、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、ノートオフのＭＩＤＩメッセージコマンドを音源コマンドバッファに書き込む（ステップＳ１００４）。この場合、ＣＰＵ２０１は、配列レジスタｄ［０］に値０１Ｈ（図４（ｂ）参照）、ｄ［１］に８ｎＨ、ｄ［２］にレジスタｋのキーナンバ値、ｄ［３］にレジスタｖのベロシティ値（共に、図４（ｃ）のＮｏｔｅ  ｏｆｆのデータフォーマットを参照）を、それぞれ設定する。
【００７２】
ステップＳ１００３又はＳ１００４の処理の後、ＣＰＵ２０１は、図１０のフローチャートで示されるキースキャナーインタラプトルーチンの処理を終了し、図５のメインルーチンの処理に戻る。
【００７３】
次に、タイマインタラプトルーチンについて説明する。図２のタイマ２  ２０４ｂは、２５ミリ秒をカウントすると、ＣＰＵ２０１に割込みを発生させる。この結果、ＣＰＵ２０１は、図５のメインルーチンの処理を中断して、図１０（ｂ）のタイマインタラプトルーチンを実行する。
【００７４】
ＣＰＵ２０１はまず、タイマ１  ２０４ａの現在値であるタイマ時刻をレジスタｔに格納する（ステップＳ１０１１）。
【００７５】
次に、ＣＰＵ２０１は、音源コマンドバッファ書込みサブルーチンをコールして、レスポンス計測用コマンドを音源コマンドバッファに書き込む（ステップＳ１０１２）。この場合、ＣＰＵ２０１は、配列レジスタｄ［０］に値０２Ｈ、ｄ［１］に００Ｈ、ｄ［２］にレジスタｔに格納されたタイマ時刻の下位バイト、ｄ［３］にレジスタｔに格納されたタイマ時刻の上位バイトを、それぞれ設定する（共に図４（ｂ）参照）。
【００７６】
続いて、ＣＰＵ２０１は、タイマ２  ２０４ｂを再スタートさせる（ステップＳ１０１３）。その後、ＣＰＵ２０１は、図１１のフローチャートで示されるタイマインタラプトルーチンを終了し、図５のメインルーチンの処理に戻る。
【００７７】
図１１は、図６のステップＳ６０３、図７のステップＳ７０４、Ｓ７０８、Ｓ７１２、図１０のステップＳ１００３、又はＳ１００４からぞれぞれコールされる、音源コマンドバッファ書込みサブルーチンの詳細例を示すフローチャートである。このとき、引数として、配列レジスタｄ［０］、ｄ［１］、ｄ［２］、及びｄ［３］が引き渡される。ｄ［０］、ｄ［１］、ｄ［２］、及びｄ［３］はそれぞれ、図４（ｂ）の音源コマンドバッファのデータフォーマットの第１バイト（ｂｉｔ０−７：第０〜第７ビット）、第２バイト（ｂｉｔ８−１５：第８〜第１５ビット）、第３バイト（ｂｉｔ１６−２３：第１６〜第２３ビット）、及び第４バイト（ｂｉｔ２４−３１：第２４〜第３１ビット）に書き込まれるデータである。
【００７８】
ＣＰＵ２０１はまず、他の処理（図１０の各インタラプトルーチン）からの割込みを禁止する（ステップＳ１１０１）。
【００７９】
次に、ＣＰＵ２０１は、次式で示される演算により、音源コマンドバッファの連続する４バイトの書込みデータを作成し、結果をレジスタｍに格納する（ステップＳ１１０２）。
ｍ＝ｄ［０］＋１００Ｈ×ｄ［１］＋１００００Ｈ×ｄ［２］
＋１００００００Ｈ×ｄ［３］
【００８０】
次に、ＣＰＵ２０１は、リードポインタＲＰとライトポインタＷＰを比較し、書き込むスペースがあるか否かを調査する。具体的には、ライトポインタＷＰをプラス２インクリメントした値とＦＦＨとで論理積を演算した結果が、リードポインタＲＰの値に等しいか否かを判定する（ステップＳ１１０３）。ＦＦＨを論理演算する意味は、前述した通りである。
【００８１】
ステップＳ１１０３の判定がＮＯならば、書き込むスペースがあるため、ライトポインタＷＰが示す音源コマンドバッファＴＣ＿ＣＭＤ［ＷＰ］に、ステップＳ１１０２でレジスタｍに得られている４バイトの書込みデータを格納する（ステップＳ１１０４）。その後、ＣＰＵ２０１は、ライトポインタＷＰの値を＋１インクリメントし、その結果をＦＦＨと論理演算し、その演算結果を新たにライトポインタＷＰの値とする（ステップＳ１１０５）。
【００８２】
一方、ステップＳ１１０３の判定がＹＥＳならば、音源コマンドバッファに空きスペースがなかったら、処理すべき仕事量がＣＰＵ能力の限界を超えているので、演奏に耐えうる状態にいち早く戻すべきと判断し、音源ＬＳＩ２０５にリセットコマンド送る。この場合、音源コマンドの読出し処理側ですぐにリセット処理がされるように、ＣＰＵ２０１は、リードポインタＲＰが示す音源コマンドバッファＴＧ＿ＣＭＤ［ＲＰ］の位置に音源リセットデータ０００００００３Ｈ（図４（ｂ）参照）を書き込み（ステップＳ１１０６）、ライトポインタＷＰも「ＷＰ＝（ＲＰ＋１）＆ＦＦＨ」として合わせておく（ステップＳ１１０７）。
【００８３】
ステップＳ１１０５又はＳ１１０７の処理の後、ＣＰＵ２０１は、ステップＳ１１０１で設定した割込み禁止を解除して（ステップＳ１１０８）、図１１のフローチャートで例示される音源コマンドバッファ書込みサブルーチンを終了して、呼出し元の処理に戻る。
【００８４】
図１２は、図５のステップＳ５０４の音源コマンド処理内で実行される図８のステップＳ８０６の音源コマンド実行サブルーチンの詳細例を示すフローチャートである。ここでは、図８のフローチャートの処理で音源コマンドバッファから読み出され実行が指示された音源コマンドが解析され、実行される。
【００８５】
ＣＰＵ２０１はまず、第１バイト配列レジスタｄ［０］の値が０１Ｈであるか否かを判定する（ステップＳ１２０１）。図４（ｂ）に示したように、ｄ［０］＝０１Ｈであれば演奏コマンド（鍵盤演奏（ノートオン、ノートオフ）、スイッチ・パネル１０２の操作、又はコントローラの操作）であり、この判定がＹＥＳならば、ＣＰＵ２０１は、演奏コマンド処理サブルーチンを実行する（ステップＳ１２０２）。このとき、レジスタｍ１、ｍ２、ｍ３にそれぞれ配列レジスタｄ［１］、ｄ［２］、ｄ［３］の値が引数として格納されて、演奏コマンド処理サブルーチンがコールされる。このサブルーチンの実行が終了すると、ＣＰＵ２０１は、図１２のフローチャートで例示される図８のステップＳ８０６の音源コマンド実行サブルーチンを終了する。演奏コマンド処理サブルーチンの詳細は、図１２から図１８のフローチャートの説明で後述する。
【００８６】
ステップＳ１２０１の判定がＮＯならば、ＣＰＵ２０１は次に、第１バイト配列レジスタｄ［０］の値が０２Ｈであるか否かを判定する（ステップＳ１２０３）。図４（ｂ）に示したように、ｄ［０］＝０２Ｈであればレスポンス計測用コマンドであり、この判定がＹＥＳならば、ＣＰＵ２０１は、レスポンス計測用コマンド処理サブルーチンを実行する（ステップＳ１２０４）。このとき、レジスタｍ２、ｍ３にそれぞれ配列レジスタｄ［２］、ｄ［３］の値が引数として格納されて、レスポンス計測用コマンド処理サブルーチンがコールされる。このサブルーチンの実行が終了すると、ＣＰＵ２０１は、図１２のフローチャートで例示される図８のステップＳ８０６の音源コマンド実行サブルーチンを終了する。レスポンス計測用コマンド処理サブルーチンの詳細は、図１９及び図２０のフローチャートの説明で後述する。
【００８７】
ステップＳ１２０３の判定もＮＯならば、ＣＰＵ２０１は、第１バイト配列レジスタｄ［０］の値が０３Ｈであるか否かを判定する（ステップＳ１２０５）。図４（ｂ）に示したように、ｄ［０］＝０３Ｈであれば音源リセットコマンドであり、この判定がＹＥＳならば、ＣＰＵ２０１は、音源リセットコマンド処理サブルーチンを実行する（ステップＳ１２０６）。音源リセットコマンド処理サブルーチンの詳細は省略するが、ＣＰＵ２０１は、音源ＬＳＩ２０５に対して、全発音の停止を指示し、ピッチベンダーホイール１０３、モジュレーションホイール１０４、及びサスティーンペダルの各コントローラの状態をリセットする。このサブルーチンの実行が終了すると、ＣＰＵ２０１は、図１２のフローチャートで例示される図８のステップＳ８０６の音源コマンド実行サブルーチンを終了する。
【００８８】
ステップＳ１２０５の判定もＮＯならば、現在のコマンドは無効であるため（図４（ｂ）参照）、ＣＰＵ２０１は、図１２のフローチャートで例示される図８のステップＳ８０６の音源コマンド実行サブルーチンを終了する。
【００８９】
図１３は、図１２のステップＳ１２０２の演奏コマンド処理ルーチンの詳細例を示すフローチャートである。ＣＰＵ２０１はまず、レジスタｍ１で引き渡されたＭＩＤＩ［０］の値が９ｎＨ（ｎは電子鍵盤楽器１００に割り当てられているＭＩＤＩチャネル）であるか否かを判定する（ステップＳ１３０１）。図４（ｃ）に示したように、ＭＩＤＩ［０］＝９ｎＨであればノートオン（Ｎｏｔｅ  ｏｎ）コマンドであり、この判定がＹＥＳならば、ＣＰＵ２０１は、押鍵コマンド処理サブルーチンを実行する（ステップＳ１３０２）。このとき、レジスタｍ０、ｍ１にそれぞれ元のレジスタｍ２（キーナンバ）とｍ３（ベロシティ）の値が引数として格納されて、押鍵コマンド処理サブルーチンがコールされる。このサブルーチンの実行が終了すると、ＣＰＵ２０１は、図１３のフローチャートで例示される図１２のステップＳ１２０２の演奏コマンド処理サブルーチンを終了する。押鍵コマンド処理サブルーチンの詳細は、図１４から図１６のフローチャートの説明で後述する。
【００９０】
ステップＳ１３０１の判定がＮＯならば、ＣＰＵ２０１は、レジスタｍ１で引き渡されたＭＩＤＩ［０］の値が８ｎＨであるか否かを判定する（ステップＳ１３０３）。図４（ｃ）に示したように、ＭＩＤＩ［０］＝８ｎＨであればノートオフ（Ｎｏｔｅ  ｏｆｆ）コマンドであり、この判定がＹＥＳならば、ＣＰＵ２０１は、離鍵コマンド処理サブルーチンを実行する（ステップＳ１３０４）。このとき、レジスタｍ０、ｍ１にそれぞれ元のレジスタｍ２（キーナンバ）とｍ３（ベロシティ）の値が引数として格納されて、離鍵コマンド処理サブルーチンがコールされる。このサブルーチンの実行が終了すると、ＣＰＵ２０１は、図１３のフローチャートで例示される図１２のステップＳ１２０２の演奏コマンド処理サブルーチンを終了する。離鍵コマンド処理サブルーチンの詳細は、図１７のフローチャートの説明で後述する。
【００９１】
ステップＳ１３０３の判定がＮＯならば、ＣＰＵ２０１は、レジスタｍ１で引き渡されたＭＩＤＩ［０］の値がＢｎＨで、かつレジスタｍ２で引き渡されたＭＩＤＩ［１］の値が０１Ｈであるか否かを判定する（ステップＳ１３０５）。図４（ｃ）に示したように、ＭＩＤＩ［０］＝ＢｎＨかつＭＩＤＩ［１］＝０１Ｈであればモジュレーションホイール１０４による変調（Ｍｏｄｕｌａｔｉｏｎ）コマンドであり、この判定がＹＥＳならば、ＣＰＵ２０１は、次の処理を実行する。ＣＰＵ２０１はまず、ＲＡＭ２０２に記憶されているモジュレーションホイール最深値を格納する変数ＣＴＲＬ＿ＭＯＤに、レジスタｍ３で引き渡されたモジュレーションデプス値（Ｄｅｐｔｈ）を格納する（ステップＳ１３０６）。そして、ＣＰＵ２０１は、レジスタｍ３の値に応じたモジュレーション処理を実行する（ステップＳ１３０７）。この処理の詳細については、省略する。この処理が終了すると、ＣＰＵ２０１は、図１３のフローチャートで例示される図１２のステップＳ１２０２の演奏コマンド処理サブルーチンを終了する。
【００９２】
ステップＳ１３０５の判定がＮＯならば、ＣＰＵ２０１は、レジスタｍ１で引き渡されたＭＩＤＩ［０］の値がＢｎＨで、かつレジスタｍ２で引き渡されたＭＩＤＩ［１］の値が４０Ｈであるか否かを判定する（ステップＳ１３０８）。図４（ｃ）に示したように、ＭＩＤＩ［０］＝ＢｎＨかつＭＩＤＩ［１］＝４０Ｈであればサスティーンペダルによるサスティーン処理（Ｈｏｌｄ  ｐｅｄａｌ）コマンドであり、この判定がＹＥＳならば、ＣＰＵ２０１は、サスティーンペダル処理サブルーチンを実行する（ステップＳ１３０９）。このとき、レジスタｍ１に元のレジスタｍ３（ペダル値）の値が引数として格納されて、サスティーンペダル処理サブルーチンがコールされる。このサブルーチンの実行が終了すると、ＣＰＵ２０１は、図１３のフローチャートで例示される図１２のステップＳ１２０２の演奏コマンド処理サブルーチンを終了する。サスティーンペダル処理サブルーチンの詳細は、図１８のフローチャートの説明で後述する。
【００９３】
ステップＳ１３０８の判定もＮＯならば、ＣＰＵ２０１は、図１３のフローチャートで例示される図１２のステップＳ１２０２の演奏コマンド処理サブルーチンを終了する。
【００９４】
図１４は、図１３のステップＳ１３０２の押鍵コマンド処理サブルーチンの詳細例を示すフローチャートである。ＣＰＵ２０１は、引数ｓ＝０（停止中）としてボイス検索サブルーチンをコールすることにより、まずどのボイスに割り当てるかを検索する（ステップＳ１４０１）。
【００９５】
未使用ボイスがあれば（ステップＳ１４０２の判定がＮＯ）、ＣＰＵ２０１は、最初に発見されたボイスを割り当てる（後述するステップＳ１４１２）。
【００９６】
未使用ボイスがない場合（ステップＳ１４０２の判定がＹＥＳ）、以下の順序で割り当てるボイスを決定する。まず、ＣＰＵ２０１は、引数ｓ＝４（スローダンプ中）として最古ボイス検索サブルーチンをコールすることにより、ボイス数制限によりスローダンプをさせられているボイスの中で最も古いものを検索する（ステップＳ１４０３）。
【００９７】
該当するボイスがあれば（ステップＳ１４０４の判定がＮＯ）、ＣＰＵ２０１は、ステップＳ１４１０に移行して、該当するボイスに対して、ボイスファーストダンプサブルーチンを実行する。
【００９８】
該当するボイスがなければ（ステップＳ１４０４の判定がＹＥＳ）、ＣＰＵ２０１は、引数ｓ＝３（リリースダンプ中）として最古ボイス検索サブルーチンをコールすることにより、離鍵によりリリースされ、減衰中のボイスの中で最も古いものを検索する（ステップＳ１４０５）。
【００９９】
該当するボイスがあれば（ステップＳ１４０５の判定がＮＯ）、ＣＰＵ２０１は、ステップＳ１４１０に移行して、該当するボイスに対して、ボイスファーストダンプサブルーチンを実行する。
【０１００】
該当するボイスがなければ（ステップＳ１４０６の判定がＹＥＳ）、ＣＰＵ２０１は、引数ｓ＝２（ホールド中）として最古ボイス検索サブルーチンをコールすることにより、サスティーンペダルによりホールドしているボイスの中で最も古いものを検索する（ステップＳ１４０７）。
【０１０１】
該当するボイスがあれば（ステップＳ１４０８の判定がＮＯ）、ＣＰＵ２０１は、ステップＳ１４１０に移行して、該当するボイスに対して、ボイスファーストダンプサブルーチンを実行する。
【０１０２】
該当するボイスがなければ（ステップＳ１４０８の判定がＹＥＳ）、ＣＰＵ２０１は、引数ｓ＝１（ホールド中）として最古ボイス検索サブルーチンをコールすることにより、
押鍵中のボイスの中で最も古いものを検索する（ステップＳ１４０９）。この処理の後、ＣＰＵ２０１は、ステップＳ１４１０に移行して、検索されたボイスに対して、ボイスファーストダンプサブルーチンを実行する。
【０１０３】
上述のように、未使用ボイス以外のボイスに割り当てる場合は、一旦消音するために、ＣＰＵ２０１は、ボイスファーストダンプサブルーチンを実行する（ステップＳ１４１０）。ＣＰＵ２０１は、このサブルーチンの中でボイスを高速にダンプさせ、発音を停止させる。ＶＯＩＣＥ［ｖ］.ＳＴＡＴ変数にファストダンプ中が存在しない理由は、このサブルーチンの中でしか起こらない状態であるからである。
【０１０４】
ステップＳ１４１０のボイスファーストダンプサブルーチンの実行の後、ＣＰＵ２０１は、ＲＡＭ２０２に記憶されている現在の発音数を示す変数値ＣＵＲ＿ＰＯＬＹの値を１減算してセットし直すことにより、現在の発音数を１減らす（ステップＳ１４１１）。
【０１０５】
ステップＳ１４０２の判定がＮＯとなることにより、又はステップＳ１４１１の処理の後、必要な未使用ボイスが割り当てられると、ＣＰＵ２０１は、レジスタｖに格納されている検索により見つかったボイスｖに対応してＲＡＭ２０２に記憶されているＶＯＩＣＥ［ｖ］変数の各情報を設定する。即ち、ＣＰＵ２０１は、ＶＯＩＣＥ［ｖ］．ＳＴＡＴ＝１（押鍵中）、ＶＯＩＣＥ［ｖ］．ＣＯＵＮＴ＝ＮＯＴＥ＿ＯＮ＿ＣＯＵＮＴ、ＶＯＩＣＥ［ｖ］．ＫＥＹ＝ｍ０（キーナンバ）、ＶＯＩＣＥ［ｖ］．ＶＯＬＥ＝ｍ１（ベロシティ）をそれぞれ設定する。その後、ＣＰＵ２０１は、ＲＡＭ２０２に記憶されている初期化以後の発音回数を示す変数ＮＯＴＥ＿ＯＮ＿ＣＯＵＮＴの値を＋１インクリメントする（以上、ステップＳ１４１２）。
【０１０６】
続いて、ＣＰＵ２０１は、ＲＡＭ２０２に記憶されている現在の発音数を示す変数値ＣＵＲ＿ＰＯＬＹの値を＋１インクリメントすることにより、現在の発音数を１増やす（ステップＳ１４１３）。
【０１０７】
最後に、ＣＰＵ２０１は、レジスタｖにボイス番号、レジスタｋにキーナンバ、レジスタｖにベロシティをそれぞれセットし、これらを引数として、音源ＬＳＩ２０５を発音制御するための音源発音開始サブルーチンをコールする。この処理の詳細は省略する。
【０１０８】
図１５は、図１４のステップＳ１４０１のボイス検索サブルーチンの詳細例を示すフローチャートである。ＣＰＵ２０１は、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ１５０１）、ステップＳ１５０３でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ１５０４でレジスタｖの値が２５６に達したと判定するまで、レジスタｖの示すボイスｖのＲＡＭ２０２に記憶されている状態ＶＯＩＣＥ［ｖ］．ＳＴＡＴ（図３（ｂ）参照）の値が、図１４のステップＳ１４０１で引数ｓとして指定されている値、即ちこの場合は停止中を示す値０であるか否かを判定する（ステップＳ１５０２）。
【０１０９】
レジスタｖが示す何れかのボイスｖについて、ステップＳ１５０２の判定がＹＥＳになれば、ＣＰＵ２０１は、このサブルーチンの戻り値をレジスタｖのボイス番号にセットして、図１５のフローチャートで例示される図１４のステップＳ１４０１のボイス検索サブルーチンを終了する。
【０１１０】
どのレジスタｖの値についてもステップＳ１５０２の判定がＮＯとなり、最終的にステップＳ１５０４の判定がＹＥＳになると、ＣＰＵ２０１は、このサブルーチンの戻り値をこの時点におけるレジスタｖのボイス番号＝２５６にセットして、図１５のフローチャートで例示される図１４のステップＳ１４０１のボイス検索サブルーチンを終了する。
【０１１１】
図１６は、図１４のステップＳ１４０３、Ｓ１４０５、Ｓ１４０７、又はＳ１４０９の最古ボイス検索サブルーチンの詳細例を示すフローチャートである。ＣＰＵ２０１は、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ１６０１）、このサブルーチンの戻り値を示すレジスタｐの値を該当ボイスがない場合の値２５６に初期設定し（ステップＳ１６０２）、更に、押鍵の古さ（押鍵履歴）を示すレジスタｃの初期値をＦＦＦＦＦＦＦＦＨに初期設定した後、ステップＳ１６０８でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ１６０９でレジスタｖの値が２５６に達したと判定するまで、ステップＳ１６０４からＳ１６０７までの一連の処理を、ボイス番号ｖ毎に繰り返し実行する。
【０１１２】
上記繰返し処理において、ＣＰＵ２０１はまず、レジスタｖの示すボイスｖのＲＡＭ２０２に記憶されている状態ＶＯＩＣＥ［ｖ］．ＳＴＡＴ（図３（ｂ）参照）の値が、図１４のステップＳ１４０３、Ｓ１４０５、Ｓ１４０７、又はＳ１４０９で引数ｓとして指定されている値に等しいか否か、即ち、引数ｓとして指定された状態に合致するボイスが見つかったか否かを判定する（ステップＳ１６０４）。
【０１１３】
ステップＳ１６０４の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１６０８に移って、次のボイスｖに対する検索処理に移行する。
【０１１４】
ステップＳ１６０４の判定がＹＥＳになると、ＣＰＵ２０１は、見つかったボイスに対応してＲＡＭ２０２に記憶されている押鍵履歴カウントＶＯＩＣＥ［ｖ］．ＣＯＵＮＴ（図３（ｂ）参照）の値が、レジスタｃにセットされている現在までに見つかっている押鍵履歴カウントの値よりも小さいな否か、即ち、今回見つかったボイスが最も古く押鍵されているか否かを判定する（ステップＳ１６０５）。
【０１１５】
ステップＳ１６０５の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１６０８に移って、次のボイスｖに対する検索処理に移行する。
【０１１６】
ステップＳ１６０５の判定がＹＥＳになると、ＣＰＵ２０１はまず、現在までの押鍵履歴カウントを示すレジスタｃに、見つかったボイスに対応する押鍵履歴カウントＶＯＩＣＥ［ｖ］．ＣＯＵＮＴの値を格納する（ステップＳ１６０６）。
【０１１７】
更に、ＣＰＵ２０１は、戻り値を示すレジスタｐに、今回見つかったボイス番号に対応するレジスタｖの値を格納する（ステップＳ１６０７）。
【０１１８】
以上のステップＳ１６０４からＳ１６０７までの一連の処理が全てのボイス番号ｖについて繰り返された後、ステップＳ１６０９の判定がＹＥＳとなると、ＣＰＵ２０１は、レジスタｐの値を戻り値として、図１６のフローチャートで例示される最古ボイス検索サブルーチンを終了する。
【０１１９】
図１７は、図１３のステップＳ１３０４の離鍵コマンド処理サブルーチンの詳細例を示すフローチャートである。ＣＰＵ２０１は、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ１７０１）、ステップＳ１７０８でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ１７０９でレジスタｖの値が２５６に達したと判定するまで、ステップＳ１７０２からＳ１７０７の一連の処理をボイス番号ｖ毎に繰り返し実行する。
【０１２０】
上記繰返し処理において、ＣＰＵ２０１はまず、レジスタｖに対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴの値が、押鍵中を示す値１であるか否かを判定する（ステップＳ１７０２）。
【０１２１】
ステップＳ１７０２の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１７０８に移って、次のボイス番号ｖに対応する処理に移行する。
【０１２２】
ステップＳ１７０２の判定がＹＥＳならば、ＣＰＵ２０１は、レジスタｖに対応するボイス番号ｖのＲＡＭ２０２に記憶されているキーナンバを示す変数ＶＯＩＣＥ［ｖ］．ＫＥＹの値が、レジスタｍ０を介して引き渡された離鍵を指定するキーナンバｋに一致するか否かを判定する（ステップＳ１７０３）。
【０１２３】
ステップＳ１７０３の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１７０８に移って、次のボイス番号ｖに対応する処理に移行する。
【０１２４】
ステップＳ１７０３の判定もＹＥＳならば、ＣＰＵ２０１は、ＲＡＭ２０２内の変数ＣＴＲＬ＿ＰＥＤＡＬに記憶されているサスティーンペダルの最新値（図３（ｂ）参照）が、４０Ｈ以上であるか否かを判定する（ステップＳ１７０４）。
【０１２５】
ステップＳ１７０４の判定がＹＥＳであれば、ＣＰＵ２０１は、レジスタｖに対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴに、サスティーンペダルでホールド中であることを示す値２（図３（ｂ）参照）をセットし（ステップＳ１７０５）、離鍵のためのエンベロープに関しては操作しない。
【０１２６】
ステップＳ１７０４の判定がＮＯであれば、ＣＰＵ２０１は、上記変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴに、リリース中であることを示す値３（図３（ｂ）参照）をセットする（ステップＳ１７０６）。
【０１２７】
ステップＳ１７０６の処理の後、ＣＰＵ２０１は、ボイス番号ｖのボイスについて、音源エンベロープリリース制御開始処理を実行する（ステップＳ１７０７）。これにより、音源ＬＳＩ２０５は、ボイス番号ｖのボイスについて、離鍵のためのエンベロープ制御に移行する。この処理の詳細は省略する。
【０１２８】
ステップＳ１７０６又はＳ１７０７の処理の後、ＣＰＵ２０１は、ボイス番号ｖの値を＋１インクリメントして次のボイス番号ｖに対応する処理に移行する（ステップＳ１７０８）。
【０１２９】
以上のステップＳ１７０２からＳ１７０７の一連の処理が繰り返されて、やがてステップＳ１７０８の判定がＹＥＳになると、ＣＰＵ２０１は、図１７のフローチャートで例示される図１３のステップＳ１３０４の離鍵コマンド処理サブルーチンを終了する。
【０１３０】
図１８は、図１３のステップＳ１３０９のサスティーンペダル処理サブルーチンの詳細例を示すフローチャートである。本実施形態のサスティーンペダルの操作の値はＭＩＤＩフォーマットに準拠しているので、その位置情報を０から７ＦＨの範囲の値で扱うが、動作としては４０Ｈ以上で押下、４０Ｈ未満で開放状態とみなす。
【０１３１】
ＣＰＵ２０１はまず、レジスタｍ１を介して引き渡されたペダル値が４０Ｈよりも小さいか否かを判定する（ステップＳ１８０１）。
【０１３２】
ステップＳ１８０１の判定がＮＯならば、ＣＰＵ２０１は、そのまま図１８のフローチャートで示される図１３のステップＳ１３０９のサスティーンペダル処理サブルーチンを終了する。
【０１３３】
サスティーンペダルが開放状態となってステップＳ１８０１の判定がＹＥＳになると、ＣＰＵ２０１は、ＲＡＭ２０２内の変数ＣＴＲＬ＿ＰＥＤＡＬ（図３（ｂ）参照）に記憶されているサスティーンペダルの最深値（いままでの値）が４０Ｈ以上であるか否かを判定する（ステップＳ１８０２）。
【０１３４】
ステップＳ１８０２の判定がＮＯならば、ＣＰＵ２０１は、そのまま図１８のフローチャートで示される図１３のステップＳ１３０９のサスティーンペダル処理サブルーチンを終了する。
【０１３５】
ステップＳ１８０２の判定がＹＥＳ、即ち、サスティーンペダルの値が今まで４０Ｈ以上の押下状態で、今回開放状態に変化した場合には、ＣＰＵ２０１は、以下の処理を実行する。ＣＰＵ２０１は、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ１８０３）、ステップＳ１８０７でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ１８０８でレジスタｖの値が２５６に達したと判定するまで、ステップＳ１８０４からＳ１８０６の一連の処理をボイス番号ｖ毎に繰り返し実行する。
【０１３６】
上記繰返し処理において、ＣＰＵ２０１はまず、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴの値がサスティーンペダルホールド中を示す値２（図３（ｂ）参照）であるか否かを判定する（ステップＳ１８０４）。
【０１３７】
ステップＳ１８０４の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１８０７に移って次のボイス番号ｖに対応する処理に移行する。
【０１３８】
ステップＳ１８０４の判定がＹＥＳならば、ＣＰＵ２０１は、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴにリリース中を示す値３（図３（ｂ）参照）をセットする（ステップＳ１８０５）。
【０１３９】
その後、ＣＰＵ２０１は、ボイス番号ｖについて、図１７のステップＳ１７０７と同様の音源エンベロープリリース制御開始処理を実行する（ステップＳ１８０６）。これにより、音源ＬＳＩ２０５は、ボイス番号ｖのボイスについて、離鍵のためのエンベロープ制御に移行する。
【０１４０】
以上のステップＳ１８０４からＳ１８０６の一連の処理が繰り返されて、やがてステップＳ１８０８の判定がＹＥＳになると、ＣＰＵ２０１は、図１８のフローチャートで例示される図１３のステップＳ１３０９のサスティーンペダル処理サブルーチンを終了する。
【０１４１】
図１９は、図１２のステップＳ１２０４のレスポンス計測用コマンド処理サブルーチンの詳細例を示すフローチャートである。ＣＰＵ２０１はまず、タイマ１  ２０４ａの現在値であるタイマ時刻を、レジスタｔに格納する（ステップＳ１９０１）。
【０１４２】
次に、ＣＰＵ２０１は、レジスタｍ２及びｍ３によって引き渡された今回音源コマンドバッファから読み込まれたレスポンス計測用コマンドに記録されているタイマ時刻下位バイト値とタイマ時刻上位バイト値とを用いて、レジスタｔに格納された現在のタイマ時刻と上記記録されているタイマ時刻との差分値であるレスポンスタイムを次式で示される符号無し演算により算出し、レジスタｄに格納する（ステップＳ１９０２）。
ｄ＝ｔ−（ｍ２＋１００Ｈ×ｍ３）
【０１４３】
その後、ＣＰＵ２０１は、レジスタｉの値を初期値０にリセットした後（ステップＳ１９０３）、ステップＳ１９０５でレジスタｉの値を＋１ずつインクリメントしながら、レジスタｉの値に対応するレスポンスタイム−同時発音数増減値対応テーブルのエントリのレスポンスタイムレンジ最大値ＲＥＳ＿ＴＩＭＥ＿ＴＢＬ［ｉ］．ＲＡＮＧＥ＿ＴＯＰにアクセスし、レジスタｄに得られたレスポンスタイムがどのレンジに存在するかを判定する（ステップＳ１９０４）。
【０１４４】
ステップＳ１９０４の判定がＹＥＳとなった時点で、ＣＰＵ２０１は、その時点の同時発音数増減値ＲＥＳ＿ＴＩＭＥ＿ＴＢＬ［ｉ］．ＤＩＦＦを、ＲＡＭ２０２に記憶されている現在の基準最大発音数を示す変数ＭＡＸ＿ＰＯＬＹに加算する（ステップＳ１９０６）。
【０１４５】
ＣＰＵ２０１は、ステップＳ１９０６の処理の結果、変数ＭＡＸ＿ＰＯＬＹの値が同時発音数の最大値２５６を超えたか否かを判定する（ステップＳ１９０７）。ステップＳ１９０７の判定がＹＥＳならば、ＣＰＵ２０１は、変数ＭＡＸ＿ＰＯＬＹに最大値２５６をセットする（ステップＳ１９１１）。その後、ＣＰＵ２０１は、図１９のフローチャートで示される図１２のステップＳ１２０４のレスポンス計測用コマンド処理サブルーチンを終了する。
【０１４６】
ステップＳ１９０７の判定がＮＯならば、ＣＰＵ２０１は、変数ＭＡＸ＿ＰＯＬＹの値が同時発音数の最小値１を下回ったか否かを判定する（ステップＳ１９０８）。ステップＳ１９０８の判定がＹＥＳならば、ＣＰＵ２０１は、変数ＭＡＸ＿ＰＯＬＹに最小値１をセットする（ステップＳ１９１２）。ステップＳ１９０７の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１９１２の処理はスキップする。
【０１４７】
その後、ＣＰＵ２０１は、ＲＡＭ２０２の変数ＣＵＲ＿ＰＯＬＹに記憶されている現在の発音数が、ＭＡＸ＿ＰＯＬＹの値よりも大きくなっているか否かを判定する（ステップＳ１９０９）。
【０１４８】
ステップＳ１９０９の判定がＮＯならば、ＣＰＵ２０１は、図１９のフローチャートで示される図１２のステップＳ１２０４のレスポンス計測用コマンド処理サブルーチンを終了する。
【０１４９】
ステップＳ１９０９の判定がＹＥＳならば、ＣＰＵ２０１は、発音ボイス削減処理サブルーチンを実行する（ステップＳ１９１０）。このとき、ＣＰＵ２０１は、変数ＣＵＲ＿ＰＯＬＹの現在の発音数からＭＡＸ＿ＰＯＬＹの値を減算して得られる値をレジスタｍにセットし、これを発音ボイス削減処理サブルーチンに引き渡す。このサブルーチンの処理が終了すると、ＣＰＵ２０１は、図１９のフローチャートで示される図１２のステップＳ１２０４のレスポンス計測用コマンド処理サブルーチンを終了する。
【０１５０】
図２０は、図１９のステップＳ１９１０の発音ボイス削除処理サブルーチンの詳細例を示すフローチャートである。ここでは、ＣＰＵ２０１は、変数ＣＵＲ＿ＰＯＬＹの現在の発音数よりもＭＡＸ＿ＰＯＬＹが下回った場合に、過剰となった分（レジスタｍの値）のボイスをスローダンプ処理によって開放する処理を実行する。スローダンプとは、突然ボイスをミュートするのではなく、音楽的に影響が少ないように徐々にフェイドアウトをするエンベロープを与える処理である。
【０１５１】
まずＣＰＵ２０１は、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ２００１）、ステップＳ２００４でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ２００５でレジスタｖの値が２５６に達したと判定するまで、ステップＳ２００２とＳ２００３の処理をボイス番号ｖ毎に繰り返し実行する。ここでは、ＣＰＵ２０１は、現時点ですでにスローダンプ中のボイスと、リリースダンプ中のボイスの数を調べて、その数を過剰ボイス数から控除する処理を実行する。
【０１５２】
まず、ＣＰＵ２０１は、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴの値が、リリースダンプ中を示す値３であるか又はスローダンプ中を示す値４であるか否かを判定する（ステップＳ２００２）。ＣＰＵ２０１は、ステップＳ２００２の判定がＹＥＳである場合には、過剰ボイス数を示すレジスタｍの値を−１減算する（ステップＳ２００３）。ＣＰＵ２０１は、ステップＳ２００２の判定がＮＯである場合には、ステップＳ２００３の減算処理はスキップする。
【０１５３】
以上の処理が繰り返されてやがてステップＳ２００６の判定がＹＥＳになると、ＣＰＵ２０１は、レジスタｍの値が０以下になったか否かを判定する（ステップＳ２００６）。ステップＳ２００６の判定がＹＥＳになれば、発音ボイス削減処理は不要となったため、図２０のフローチャートで示される図１９のステップＳ１９１０の発音ボイス削除処理サブルーチンを終了する。
【０１５４】
ステップＳ２００６の判定がＮＯならば、ＣＰＵ２０１は、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ２００７）、ステップＳ２０１３でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ２０１４でレジスタｖの値が２５６に達したと判定するまで、ステップＳ２００８からＳ２０１３の一連の処理をボイス番号ｖ毎に繰り返し実行する。
【０１５５】
上記繰返し処理において、ＣＰＵ２０１はまず、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴの値がサスティーンペダルホールド中を示す値２（図３（ｂ）参照）であるか否かを判定する（ステップＳ２００８）。
【０１５６】
ステップＳ２００８の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ２０１３に移って次のボイス番号ｖに対応する処理に移行する。
【０１５７】
ステップＳ２００８の判定がＹＥＳならば、ＣＰＵ２０１は、ボイス番号ｖについて、音源エンベロープスローダンプ制御開始処理を実行する（ステップＳ２００９）。これにより、音源ＬＳＩ２０５は、ボイス番号ｖのボイスについて、離鍵のためのエンベロープ制御に移行する。この処理の詳細は省略する。
【０１５８】
その後、ＣＰＵ２０１は、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴにスローダンプ中を示す値４（図３（ｂ）参照）をセットする（ステップＳ２０１０）。
【０１５９】
更に、ＣＰＵ２０１は、過剰ボイス数を示すレジスタｍの値を−１減算する（ステップＳ２０１１）。
【０１６０】
ＣＰＵ２０１は、レジスタｍの値が０以下になったか否かを判定する（ステップＳ２０１２）。ステップＳ２０１２の判定がＹＥＳになれば、発音ボイス削減処理は不要となったため、図２０のフローチャートで示される図１９のステップＳ１９１０の発音ボイス削除処理サブルーチンを終了する。
【０１６１】
以上のステップＳ２００８からＳ２０１２の一連の処理がボイス番号ｖ毎に繰り返し実行され、やがてステップＳ２０１４の判定がＹＥＳになると、ＣＰＵ２０１は再度、ボイス番号を示すレジスタｖの値を０にリセットした後（ステップＳ２０１５）、ステップＳ２０２１でレジスタｖの値を＋１ずつインクリメントしながら、ステップＳ２０２２でレジスタｖの値が２５６に達したと判定するまで、ステップＳ２０１６からＳ２０２０の一連の処理をボイス番号ｖ毎に繰り返し実行する。
【０１６２】
上記繰返し処理において、ＣＰＵ２０１はまず、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴの値が押鍵中を示す値１（図３（ｂ）参照）であるか否かを判定する（ステップＳ２０１６）。
【０１６３】
ステップＳ２０１６の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ２０２１に移って次のボイス番号ｖに対応する処理に移行する。
【０１６４】
ステップＳ２０１６の判定がＹＥＳならば、ＣＰＵ２０１は、ボイス番号ｖについて、ステップＳ２００９と同様の音源エンベロープスローダンプ制御開始処理を実行する（ステップＳ２０１７）。これにより、音源ＬＳＩ２０５は、ボイス番号ｖのボイスについて、離鍵のためのエンベロープ制御に移行する。
【０１６５】
その後、ＣＰＵ２０１は、レジスタｖの値に対応するボイス番号ｖのＲＡＭ２０２に記憶されている発音状態を示す変数ＶＯＩＣＥ［ｖ］．ＳＴＡＴにスローダンプ中を示す値４（図３（ｂ）参照）をセットする（ステップＳ２０１８）。
【０１６６】
更に、ＣＰＵ２０１は、過剰ボイス数を示すレジスタｍの値を−１減算する（ステップＳ２０１９）。
【０１６７】
ＣＰＵ２０１は、レジスタｍの値が０以下になったか否かを判定する（ステップＳ２０２０）。ステップＳ２０２０の判定がＹＥＳになれば、発音ボイス削減処理は不要となったため、図２０のフローチャートで示される図１９のステップＳ１９１０の発音ボイス削除処理サブルーチンを終了する。
【０１６８】
以上のステップＳ２０１６からＳ２０２０の一連の処理がボイス番号ｖ毎に繰り返し実行され、やがてステップＳ２０１４の判定がＹＥＳになると、ＣＰＵ２０１は、図２０のフローチャートで示される図１９のステップＳ１９１０の発音ボイス削除処理サブルーチンを終了する。
【０１６９】
以上説明した実施形態では、レスポンス計測用コマンドを定期的に音源コマンドバッファに書き込んでレスポンスタイムを計測していた。このほか、音源コマンドバッファに書き込まれる演奏コマンド自体にタイマ時刻情報を格納してレスポンスタイムを計測するようにしてもよい。或いは、レスポンス計測用コマンドや特定の演奏コマンドが音源コマンドバッファに書き込まれるときのタイマ時刻がＲＡＭ２０２に記録されるようにし、そのコマンドが音源コマンドバッファから読み出されるときの現在時刻との差分時間を計測するようにしてもよい。その他、音源コマンドが音源コマンドバッファに書き込まれてから読み出されるまでの差分時間を計測できる手法であれば、どのような手法を用いてもよい。
【０１７０】
以上説明した実施形態により、電子楽器において、音色の種類や、その他の機能の稼働状態に応じて変化するＣＰＵの負荷を、レスポンス計測用コマンドを介して実測することで、その時点における最適な同時発音数を定常的に適用できるようになるので、ＣＰＵパワーの不足で大きな遅延が発生して演奏に支障を来したり、不要な制限でＣＰＵ能力を持て余したりすることなく、ＣＰＵの能力を常に１００%に近い形で引き出すことが可能な電子楽器を実現できる。
【０１７１】
以上の実施形態に関して、更に以下の付記を開示する。
（付記１）
複数音を同時発音する音源と、
音源コマンドバッファから、前記音源の制御に関する複数の音源コマンドを読み出して実行する処理部と、
を備え、
前記処理部は、
前記音源コマンドが前記音源コマンドバッファに書き込まれてから、前記音源コマンドが前記音源コマンドバッファから読み出されるまでの差分時間に応じて、前記音源における同時発音数を制御する、電子楽器。
（付記２）
前記処理部は、
前記音源コマンドバッファに、現在時刻を記録したレスポンス計測用コマンドを定期的に書き込み、
前記音源コマンドバッファから前記レスポンス計測用コマンドを読み出すときの現在時刻と前記読み出したレスポンス計測用コマンドに記録されている現在時刻との差分時間として前記差分時間を計測する、
付記１に記載の電子楽器。
（付記３）
前記処理部は、前記差分時間に応じて前記音源における最大同時発音数を変更した場合に、前記変更後の最大同時発音数が現在の同時発音数を下回った場合に、過剰に発音されている分の発音ボイスをスローダンプ処理により消音させる、付記１又は２に記載の電子楽器。
（付記４）
複数音を同時発音する音源と、音源コマンドバッファから、前記音源の制御に関する複数の音源コマンドを読み出して実行する処理部と、を備えた電子楽器における制御方法であって、前記処理部は、
前記音源コマンドが前記音源コマンドバッファに書き込まれてから、前記音源コマンドが前記音源コマンドバッファから読み出されるまでの差分時間に応じて、前記音源における同時発音数を制御する、電子楽器の制御方法。
（付記５）
複数音を同時発音する音源と、音源コマンドバッファから、前記音源の制御に関する複数の音源コマンドを読み出して実行するコンピュータと、を備えた電子楽器において、前記コンピュータに、
前記音源コマンドが前記音源コマンドバッファに書き込まれてから、前記音源コマンドが前記音源コマンドバッファから読み出されるまでの差分時間に応じて、前記音源における同時発音数を制御するステップを、実行させるためのプログラム。
【符号の説明】
【０１７２】
１００  電子鍵盤楽器
１０１  鍵盤
１０２  各種スイッチ
１０３  ピッチベンダーホイール
１０４  ピッチモジュレーションホイール
１０５  ＬＣＤ
２０１  ＣＰＵ
２０２  ＲＯＭ
２０３  ＲＡＭ
２０４ａ  タイマ１
２０４ｂ  タイマ２
２０５  音源ＬＳＩ
２０６  波形メモリ
２０７  キースキャナ
２０８  Ａ／Ｄコンバータ
２０９  ＬＣＤコントローラ
２１０  Ｄ／Ａコンバータ
２１１  アンプ
２１２  システムバス
【図１】
2018054857.tif 000003
【図２】
2018054857.tif 000004
【図３】
2018054857.tif 000005
【図４】
2018054857.tif 000006
【図５】
2018054857.tif 000007
【図６】
2018054857.tif 000008
【図７】
2018054857.tif 000009
【図８】
2018054857.tif 000010
【図９】
2018054857.tif 000011
【図１０】
2018054857.tif 000012
【図１１】
2018054857.tif 000013
【図１２】
2018054857.tif 000014
【図１３】
2018054857.tif 000015
【図１４】
2018054857.tif 000016
【図１５】
2018054857.tif 000017
【図１６】
2018054857.tif 000018
【図１７】
2018054857.tif 000019
【図１８】
2018054857.tif 000020
【図１９】
2018054857.tif 000021
【図２０】
2018054857.tif 000022