(57)【要約】【課題】  曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成する運指情報生成装置を実現する。【解決手段】  曲を構成する各音を表す楽曲データＭｉｄｉＥｖｅｎｔから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータＰｈｒａｓｅを生成し、生成されたフレーズデータＰｈｒａｓｅが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に応じて手の位置を設定する。設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する。【選択図】  図１３
2006154121.tif 000002
【特許請求の範囲】
【請求項１】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、鍵操作するのに最適な手の位置を設定する設定手段と、
前記設定手段により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段と
を具備することを特徴とする運指情報生成装置。
【請求項２】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定手段と、
前記設定手段により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段と
を具備することを特徴とする運指情報生成装置。
【請求項３】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定手段と、
前記設定手段により設定された手の位置に対応して鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段と
を具備することを特徴とする運指情報生成装置。
【請求項４】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段と
を具備することを特徴とする運指情報生成装置。
【請求項５】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段と
を具備することを特徴とする運指情報生成装置。
【請求項６】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段と、
前記運指データ生成手段により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、
前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化手段と
を具備することを特徴とする運指情報生成装置。
【請求項７】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段と、
前記運指データ生成手段により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、
前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化手段と
を具備することを特徴とする運指情報生成装置。
【請求項８】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、鍵操作するのに最適な手の位置を設定する設定処理と、
前記設定処理により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
【請求項９】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定処理と、
前記設定処理により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
【請求項１０】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定処理と、
前記設定処理により設定された手の位置に対応して鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
【請求項１１】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
【請求項１２】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
【請求項１３】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理と、
前記運指データ生成処理により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価処理と、
前記運指評価処理により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。  
【請求項１４】
曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理と、
前記運指データ生成処理により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、
前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、鍵盤を備えた電子楽器に用いて好適な運指情報生成装置および運指情報生成処理プログラムに関する。
【背景技術】
【０００２】
鍵操作する際の指使い（運指）を演奏者に案内する運指情報を発生する装置が知られている。例えば特許文献１には、隣り合う２つの音に対して鍵盤を操作したときの指使いの容易さを表す２音運指データをそれぞれの指の組合わせに対応付けて記憶しておき、その内から曲データ（与えられたメロディの音列）に対応する２音運指データを読み出し、読み出した２音運指データの累算値を最適にする運指を決定して運指情報を発生させる装置が開示されている。
【０００３】
【特許文献１】特許第２５２６９５４号明細書
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ところで、上記特許文献１に開示の装置では、曲データから一義的に決る代表的な運指を発生させる為、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができない、という問題がある。
そこで本発明は、このような事情に鑑みてなされたもので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる運指情報生成装置および運指情報生成処理プログラムを提供することを目的としている。
【課題を解決するための手段】
【０００５】
上記目的を達成するため、請求項１に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、鍵操作するのに最適な手の位置を設定する設定手段と、前記設定手段により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段とを具備することを特徴とする。
【０００６】
請求項２に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定手段と、前記設定手段により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段とを具備することを特徴とする。
【０００７】
請求項３に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定手段と、前記設定手段により設定された手の位置に対応して鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段とを具備することを特徴とする。
【０００８】
請求項４に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段とを具備することを特徴とする。
【０００９】
請求項５に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段とを具備することを特徴とする。
【００１０】
請求項６に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段と、前記運指データ生成手段により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化手段とを具備することを特徴とする。
【００１１】
請求項７に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段と、前記運指データ生成手段により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化手段とを具備することを特徴としている。
【００１２】
請求項８に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、鍵操作するのに最適な手の位置を設定する設定処理と、前記設定処理により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理とをコンピュータで実行させることを特徴とする。
【００１３】
請求項９に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定処理と、前記設定処理により設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理とをコンピュータで実行させることを特徴とする。
【００１４】
請求項１０に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する設定処理と、前記設定処理により設定された手の位置に対応して鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理とをコンピュータで実行させることを特徴とする。
【００１５】
請求項１１に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理とをコンピュータで実行させることを特徴とする。
【００１６】
請求項１２に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理とをコンピュータで実行させることを特徴とする。
【００１７】
請求項１３に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理と、前記運指データ生成処理により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価処理と、前記運指評価処理により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化処理とをコンピュータで実行させることを特徴とする。
【００１８】
請求項１４に記載の発明では、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理と、前記運指データ生成処理により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化処理とをコンピュータで実行させることを特徴とする。
【発明の効果】
【００１９】
請求項１、８に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成し、フレーズデータが指定する各区間毎に、鍵操作するのに最適な手の位置を設定する。そして、設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【００２０】
請求項２、９に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成し、フレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する。そして、設定された手の位置に対応して鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【００２１】
請求項３、１０に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成し、フレーズデータが指定する各区間毎に、その区間において鍵操作される最も高い音高の鍵位置と最も低い音高の鍵位置とで定まる操作範囲に対応した手の位置を設定する。そして、設定された手の位置に対応して鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【００２２】
請求項４、１１に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成すると共に、楽曲データから曲演奏する手の位置を表す動作データを生成する。そして、フレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【００２３】
請求項５、１２に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成すると共に、楽曲データから曲演奏する手の位置を表す動作データを生成する。そして、フレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【００２４】
請求項６、１３に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成すると共に、楽曲データから曲演奏する手の位置を表す動作データを生成する。そして、フレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成すると、この運指データにて指定される指と弾くべき鍵との離間距離に応じて運指の弾き難さを評価し、評価された運指の弾き難さが予め設定される許容範囲に収まるように動作データを最適化するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【００２５】
請求項７、１４に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成すると共に、楽曲データから曲演奏する手の位置を表す動作データを生成する。そして、フレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成すると、この運指データにて指定される指と弾くべき鍵との離間距離に応じて運指の弾き難さを評価し、評価された運指の弾き難さが予め設定される許容範囲に収まるように動作データを最適化するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【発明を実施するための最良の形態】
【００２６】
以下、図面を参照して本発明の実施形態について説明する。
［第１実施形態］
Ａ．構成  
図１は、第１実施形態による運指情報生成装置の全体構成を示すブロック図である。運指情報生成装置は、ＣＰＵ１、ＲＯＭ２、ＲＡＭ３、入力部４、表示部５およびＭＩＤＩインタフェース６を備える。ＣＰＵ１は、後述する入力部４からの指示に従い、例えばＭＩＤＩインタフェース６を介して電子楽器７よりＳＭＦ形式の「楽曲データ」を取込んでＲＡＭ３に記憶させた後、時系列データ生成処理および音列解析処理を実行し、「楽曲データ」から「時系列データ」および「フレーズデータ」を派生させる。また、ＣＰＵ１は運指データ生成処理を実行して「時系列データ」および「フレーズデータ」を参照して、曲進行に応じて移動する手の位置を考慮した、弾き易い指使いの「運指データ」を生成する。これら一連のデータの構成およびそれらが意図するところについては追って詳述する。
【００２７】
ＲＯＭ２は、ＣＰＵ１にロードされる各種制御プログラムやテーブル等を記憶する。ここで言う各種制御プログラムとは、上述の時系列データ生成処理、音列解析処理および運指データ生成処理からなるメインルーチンを含む。ＲＡＭ３は、ＣＰＵ１が実行するメインルーチン（時系列データ生成処理、音列解析処理および運指データ生成処理）において用いられる各種レジスタ・フラグデータの他、手の状態などを表すバッファデータを一時記憶するワーエリアと、上述した一連のデータ（楽曲データ、時系列データ、フレーズデータ、手の状態データ）を記憶するデータエリアとを備える。これらＲＡＭ３に格納される主要なデータ構成については追って説明する。
【００２８】
入力部４は、ユーザ操作に対応した操作イベントを発生してＣＰＵ１に供給する。具体的には、例えばＭＩＤＩインタフェース６を介して電子楽器７よりＳＭＦ形式の「楽曲データ」をＲＡＭ３に取込むよう指示するイベントをＣＰＵ１に供給したり、ＲＡＭ３に格納した「楽曲データ」に基づき「運指データ」を生成させるメイルーチンの実行を指示するイベントをＣＰＵ１に供給する。表示部５は、ＣＰＵ１の制御の下に、例えば楽曲データを楽譜表示すると共に、表示された楽譜において、楽曲データを構成する各音毎に対応させた運指データを表示する。
【００２９】
Ｂ．データ構成
次に、ＲＡＭ３に格納される各種データ（オンバッファデータ、楽曲データ、時系列データ、ノートデータ、フレーズデータおよび手の状態データ）の構成について図２〜図７を参照して説明する。
【００３０】
（１）オンバッファデータの構成
図２は、ＲＡＭ３のワークエリアに設けられるオンバッファデータＯｎＢｕｆ［０］〜［Ｎ］の構成を示す図である。１つのオンバッファデータＯｎＢｕｆは、楽曲データを再生（自動演奏）する際に、曲進行に応じて読み出される各音を表すデータであり、発音開始時間ｌＴｉｍｅ、消音時間ｌＯｆｆＴｉｍｅ、音高Ｐｉｔｃｈ（ノート番号）、および対応する楽曲データを指定するポインタｐＮｏｔｅから構成される。
【００３１】
（２）楽曲データＭｉｄｉＥｖｅｎｔの構成
図３は、ＲＡＭ３のデータエリアに設けられる楽曲データの構成を示す図である。楽曲データＭｉｄｉＥｖｅｎｔは曲を構成する各音を表し、曲終端にはＥＮＤデータを備える。楽曲データＭｉｄｉＥｖｅｎｔは、発音開始時刻ＩＴｉｍｅ、音長ｌＧａｔｅ、音高Ｐｉｔｃｈおよび次の楽曲データＭｉｄｉＥｖｅｎｔを指定するポインタｐＮｅｘｔから構成される。
【００３２】
（３）時系列データＮｏｔｅＧｒｏｕｐの構成
図４は、ＲＡＭ３のデータエリアに設けられる時系列データの構成を示す図である。時系列データＮｏｔｅＧｒｏｕｐとは、楽曲データＭｉｄｉＥｖｅｎｔの内から同時発音する音（和音あるいは非和声音）を検索し、該当する音を一まとめにしたデータである。
時系列データＮｏｔｅＧｒｏｕｐでは、同時発音する音の発音／消音タイミングおよび音高関係を表す属性として、発音開始時刻ｌＴｉｍｅ、消音時刻ｌＴｅｒｍ、鍵盤座標最大値ｉＰｏｓＭａｘ、鍵盤座標最小値ｉＰｏｓｍｉｎ、座標差分ｉＴｅｎｄ、差分変化継続値ｉＴｅｎｄＣｏｎｔ、差分変化継続ステップｉＴｅｎｄＳｔｅｐ、近傍データ最大値ｉＮＰｏｓＭａｘ、近傍データ最小値ｉＮＰｏｓｍｉｎ、ポインタＮｏｔｅＥｖ、ポインタｎｅｘｔおよびポインタｐｒｅｖを有する。
なお、ポインタＮｏｔｅＥｖは、本時系列データＮｏｔｅＧｒｏｕｐに対応するノートデータＮｏｔｅを指定するポインタである。ポインタｎｅｘｔおよびポインタｐｒｅｖは、それぞれ次の時系列データおよび前の時系列データを指定するポインタである。
【００３３】
（４）ノートデータＮｏｔｅの構成
図５は、ＲＡＭ３のデータエリアに設けられるノートデータの構成を示す図である。ノートデータＮｏｔｅは、時系列データＮｏｔｅＧｒｏｕｐとして一まとめにされた、同時発音する各音のそれぞれに対応する楽曲データＭｉｄｉＥｖｅｎｔを表すデータであり、ポインタｐＥｖｅｎｔ、鍵盤座標ｉＰｏｓ、運指番号ｃｆｉｇ（運指データに相当）、ポインタｎｅｘｔおよびポインタｐｒｅｖから構成される。
なお、ポインタｐＥｖｅｎｔは、対応する楽曲データＭｉｄｉＥｖｅｎｔを指定するポインタである。ポインタｎｅｘｔは、次のノートデータを指定するポインタである。ポインタｐｒｅｖは、１つ前のノートデータを指定するポインタである。
【００３４】
（５）フレーズデータＰｈａｓｅの構成
図６は、ＲＡＭ３のデータエリアに設けられるフレーズデータの構成を示す図である。フレーズデータＰｈａｓｅは、鍵操作する動作の切れ目として、楽曲データＭｉｄｉＥｖｅｎｔの内から休符で区切られる区間を検出し、その区間の開始／終了時刻などを表すデータであり、開始時刻ｌＴｉｍｅ、終了時刻ｌＴｅｒｍ、フレーズ中の鍵盤座標最大値ｉＰｏｓＭａｘ、フレーズ中の鍵盤座標最小値ｉＰｏｓｍｉｎ、ポインタＮｏｔｅＥｖ、ポインタｎｅｘｔおよびポインタｐｒｅｖを有する。
なお、ポインタＮｏｔｅＥｖは、本フレーズデータに対応するノートデータＮｏｔｅを指定するポインタである。ポインタｎｅｘｔおよびポインタｐｒｅｖは、それぞれ次のフレーズデータおよび前のフレーズデータを指定するポインタである。
【００３５】
（６）手の状態データＨａｎｄの構成
図７は、ＲＡＭ３のワークエリアに設けられる手の状態データの構成を示す図である。手の状態データＨａｎｄは、鍵操作する手を識別する識別フラグｉＲＬ（「０」の場合に右手を表し、「１」の場合に左手を表す）、手の位置座標ｉＰｏｓ、鍵盤座標最大値ｉＰｏｓＭａｘ、鍵盤座標最小値ｉＰｏｓｍｉｎ、親指データｆｉｇ［０］、人差し指データｆｉｇ［１］、中指データｆｉｇ［２］、薬指データｆｉｇ［３］および小指データｆｉｇ［４］から構成される。
また、各指データｆｉｇ［０］〜［４］は、状態フラグｓｔａｔｕｓ、前状態フラグｓｔａｔｐｒｅｖ、ポインタｅｖｅｎｔおよび指の座標ｉＰｏｓを備える。
なお、状態フラグｓｔａｔｕｓは、「０」の場合に消音状態を表し、「１」の場合に押鍵中を表す。前状態フラグｓｔａｔｐｒｅｖは、「０」の場合に消音状態を表し、「１」の場合に押鍵中を表す。ポインタｅｖｅｎｔは、押鍵中のノートデータを指定する。
【００３６】
Ｃ．動作
次に、図８〜図１７を参照して第１実施形態の動作について説明する。以下では、図３に図示した楽曲データがＭＩＤＩインタフェース６を介してＲＡＭ３のデータエリアに格納されていることを前提として、メインルーチンの動作を説明する。
【００３７】
（１）メインルーチンの動作
入力部４からＣＰＵ１にメイルーチンの実行を指示するイベントが供給されると、ＣＰＵ１は図８に図示するメインルーチンを実行してステップＳＡ１に進み、時系列データ生成処理を実行する。後述するように、時系列データ生成処理では、楽曲データＭｉｄｉＥｖｅｎｔから同時発音する音を検索し、該当する各音を一まとめにして、その発音／消音タイミングや音高関係を表す属性を備える時系列データＮｏｔｅＧｒｏｕｐを生成する一方、時系列データＮｏｔｅＧｒｏｕｐに対応する楽曲データＭｉｄｉＥｖｅｎｔを表すノートデータＮｏｔｅを生成する他、楽曲データＭｉｄｉＥｖｅｎｔの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始／終了時刻などを表すフレーズデータＰｈａｓｅを生成する。
【００３８】
次に、ステップＳＡ２では、音列解析処理を実行する。後述するように、音列解析処理では、隣り合う時系列データＮｏｔｅＧｒｏｕｐ間の音高差（最大値差分ｉＤＨ／最小値差分ｉＤＬ）およびフラグｉｆｉｇに応じて、音高変化の極大および極小を検出したり、近傍データの最大値／最小値を検出する処理操作を行い、これにて各時系列データＮｏｔｅＧｒｏｕｐの近傍データ最大値ｉＮＰｏｓＭａｘ、近傍データ最小値ｉＮＰｏｓｍｉｎ、差分変化継続値ｉＴｅｎｄＣｏｎｔおよび差分変化継続ステップｉＴｅｎｄを得る他、対応するフレーズデータＰｈａｓｅの鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを生成する。
【００３９】
続いて、ステップＳＡ３では、運指データ生成処理を実行する。後述するように、運指データ生成処理では、最初に現フレーズ区間で手の移動が必要かどうかを判断し、手の移動が必要な場合には、現時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎに基づき、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを更新させてから、最初の手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。
【００４０】
最初の手の位置が決ったら、鍵操作する手の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行い、この割当後は、再び次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断し、手の移動が必要になる場合には、次の時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎに基づき、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを更新させてから、次の手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。以後、こうした処理操作を全ての時系列データＮｏｔｅＧｒｏｕｐについて繰り返して本処理を完了させる。
【００４１】
（２）時系列データ生成処理の動作
次に、図９を参照して時系列データ生成処理の動作を詳述する。上述したメインルーチンのステップＳＡ１（図８参照）を介して本処理が実行されると、ＣＰＵ１は図９に図示するステップＳＢ１に進み、ポインタｍｅ、ｎｇｒ、ｎＴｍｐおよびｐｈＴｍｐをゼロリセットする。ここで、ポインタｍｅは、図３に図示した楽曲データＭｉｄｉＥｖｅｎｔを指定するポインタである。ポインタｎｇｒは、図４に図示した時系列データＮｏｔｅＧｒｏｕｐを指定するポインタである。ポインタｎＴｍｐは、図５に図示したノートデータＮｏｔｅを指定するポインタである。ポインタｐｈＴｍｐは、図６に図示したフレーズデータＰｈａｓｅを指定するポインタである。
【００４２】
そして、ステップＳＢ２以降では、ポインタｍｅの歩進に応じて指定される楽曲データＭｉｄｉＥｖｅｎｔの属性に基づき時系列データＮｏｔｅＧｒｏｕｐ、フレーズデータＰｈａｓｅおよびノートデータＮｏｔｅを派生させる。
前述したように、時系列データＮｏｔｅＧｒｏｕｐは、楽曲データＭｉｄｉＥｖｅｎｔの内から同時発音する音（和音又は非和声音）を検索し、該当する各音を一まとめにし、その発音／消音タイミングや音高関係を表す属性を備えるデータである。ノートデータＮｏｔｅは、時系列データＮｏｔｅＧｒｏｕｐとして一まとめにされた同時発音する各音のそれぞれに対応する楽曲データＭｉｄｉＥｖｅｎｔを表すデータである。フレーズデータＰｈａｓｅは、鍵操作する動作の切れ目として、楽曲データＭｉｄｉＥｖｅｎｔの内から休符で区切られる区間を検出し、その区間の開始／終了時刻などを表すデータである。
【００４３】
先ず、ステップＳＢ２では、ステップＳＢ１４にて歩進されるポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔが終端ＥＮＤに達したか、すなわち楽曲データＭｉｄｉＥｖｅｎｔを全て読み出し終えたかどうかを判断する。読み出し終えると、判断結果は「ＹＥＳ」になり、本処理を完了させるが、読み出し終えていなければ、判断結果が「ＮＯ」になり、ステップＳＢ３に進む。ステップＳＢ３では、ポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔ中の発音開始時刻ＩＴｉｍｅ（ｍｅ．ＩＴｉｍｅ）を、レジスタｌＴｐｒｏｇにストアする。
【００４４】
続いて、ステップＳＢ４では、ポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔの各属性に基づき時系列データＮｏｔｅＧｒｏｕｐを形成する。すなわち、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ中のノートデータポインタＮｏｔｅＥｖ（ｎｇｒ．ＮｏｔｅＥｖ）に、ポインタｎＴｍｐをストアする。また、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ｌＴｉｍｅ（ｎｇｒ．ｌＴｉｍｅ）に、レジスタｌＴｐｒｏｇの値（ポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔ中の発音開始時刻ＩＴｉｍｅ）をストアする。さらに、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ中の消音時刻ｌＴｅｒｍに、ポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔ中の発音開始時刻ＩＴｉｍｅ（ｍｅ．ＩＴｉｍｅ）とポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔ中の音長ｌＧａｔｅ（ｍｅ．ｌＧａｔｅ）とを加算した時刻をストアする。
【００４５】
また、このステップＳＢ４では、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）に最大値を、鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）に最小値をそれぞれストアする。さらに、このステップＳＢ４では、ポインタｎＴｍｐが指定するノートデータＮｏｔｅ中のポインタｐＥｖｅｎｔ（ｎＴｍｐ．ｐＥｖｅｎｔ）に、楽曲データＭｉｄｉＥｖｅｎｔを指定するポインタｍｅをストアする。
【００４６】
なお、ここで言う最大値／最小値とは、同時発音する音が複数存在する場合に、その複数音の内、最も高い音高に対応した鍵盤の座標（最大値）と、最も低い音高に対応した鍵盤の座標（最小値）とを指す。したがって、最初の楽曲データＭｉｄｉＥｖｅｎｔが読み出された場合には、ｎｇｒ．ｉＰｏｓＭａｘおよびｎｇｒ．ｉＰｏｓｍｉｎには、その楽曲データＭｉｄｉＥｖｅｎｔの音高Ｐｉｔｃｈに対応した鍵盤の座標が仮設定される。また、鍵盤座標とは、鍵盤上のＣ４音の白鍵を原点にして白鍵単位で鍵位置を表す座標である。
【００４７】
続いて、ステップＳＢ５〜ＳＢ９では、フレーズデータＰｈａｓｅを作成する。先ず最初のステップＳＢ５では、レジスタｌＯｆｆＰｒｏｇにストアされる消音時刻と現音の発音開始時刻ＩＴｉｍｅ（ｍｅ．ＩＴｉｍｅ）との差分時刻が所定値より大きいか、つまり鍵操作する動作の切れ目となる休符の有無を判断する。
１つ目の楽曲データＭｉｄｉＥｖｅｎｔを読み出した時点では、レジスタｌＯｆｆＰｒｏｇには消音時刻がストアされていないので、このステップＳＢ５の判断結果は「ＮＯ」になり、ステップＳＢ１０に進む。ステップＳＢ１０〜ＳＢ１４では、後述するように、同時発音する音を一つの時系列データＮｏｔｅＧｒｏｕｐにまとめる処理なので、１つ目の楽曲データＭｉｄｉＥｖｅｎｔを読み出した時点では、ステップＳＢ１０の判断結果は「ＮＯ」になり、ステップＳＢ１３に進む。
【００４８】
ステップＳＢ１３では、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ｌＴｉｍｅ（ｎｇｒ．ｌＴｉｍｅ）を、レジスタｌＯｆｆＰｒｏｇにストアする。続いて、ステップＳＢ１４では、次の楽曲データＭｉｄｉＥｖｅｎｔから時系列データＮｏｔｅＧｒｏｕｐを生成するため、現在のポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔ中のポインタｐＮｅｘｔ（ｍｅ．ｐＮｅｘｔ）を、次のポインタｍｅに更新させた後、上述のステップＳＢ２に処理を戻す。
【００４９】
以後、２つの目の楽曲データＭｉｄｉＥｖｅｎｔから楽曲データの終端ＥＮＤに至るまで上述したステップＳＢ２〜ＳＢ１６を繰り返す。そして、その過程で鍵操作する動作の切れ目となる休符が見つかると、上述したステップＳＢ５の判断結果が「ＹＥＳ」となり、ステップＳＢ６に進む。ステップＳＢ６では、レジスタｌＯｆｆＰｒｏｇを、ポインタｐｈＴｍｐが指定するフレーズデータＰｈａｓｅ中の開始時刻ｌＴｉｍｅ（ｐｈＴｍｐ．ｌＴｉｍｅ）としてストアすると共に、現在のポインタｍｅで指定される楽曲データＭｉｄｉＥｖｅｎｔ中の発音開始時刻ＩＴｉｍｅを、ポインタｐｈＴｍｐが指定するフレーズデータＰｈａｓｅ中の終了時刻ｌＴｅｒｍ（ｐｈＴｍｐ．ｌＴｅｒｍ）としてストアする。
【００５０】
続いて、ステップＳＢ７では、フレーズデータ空き位置を表すポインタ値をポインタｐｈＮｅｗにセットする。次いで、ステップＳＢ８では、このポインタｐｈＮｅｗを、ポインタｐｈＴｍｐが指定するフレーズデータＰｈａｓｅ中のポインタｎｅｘｔ（ｐｈＴｍｐ．ｎｅｘｔ）としてストアすると共に、ポインタｐｈＴｍｐを、ポインタｐｈＮｅｗで指定されるフレーズデータＰｈａｓｅ中のポインタｐｒｅｖとしてストアする。このように、鍵操作する動作の切れ目となる休符が検出される毎に、その検出された休符で区切られる区間の開始／終了時刻を表すフレーズデータＰｈａｓｅが生成されるようになっている。
【００５１】
こうして、フレーズデータＰｈａｓｅを生成し終えると、ＣＰＵ１はステップＳＢ１０に処理を進める。上述したように、ステップＳＢ１０〜ＳＢ１４では、同時発音する音を一つの時系列データＮｏｔｅＧｒｏｕｐにまとめる処理を実行する。
すなわち、ステップＳＢ１０では、現在指定されている楽曲データＭｉｄｉＥｖｅｎｔ中の発音開始時刻ＩＴｉｍｅ（レジスタｌＴＰｒｏｇの内容）と次の楽曲データＭｉｄｉＥｖｅｎｔ中の発音開始時刻ＩＴｉｍｅ（ｍｅ．ｎｅｘｔ．ｌＴｉｍｅ）との差分絶対値が所定値より小さいか否か、つまり同時発音する音（和音又は非和声音）であるかどうかを判断する。同時発音する音でなければ、判断結果は「ＮＯ」になり、前述のステップＳＢ１５に処理を進めるが、同時発音する音であると、判断結果が「ＹＥＳ」になり、ステップＳＢ１１に進む。
【００５２】
ステップＳＢ１１では、ポインタｍｅが指定する楽曲データＭｉｄｉＥｖｅｎｔ中のポインタｐＮｅｘｔ（ｍｅ．ｐＮｅｘｔ）を、ポインタｍｅＨａｒｍにセットし、ノートデータＮｏｔｅの空き位置を表すポインタ値をポインタｎＨａｒｍにセットする。次いで、ステップＳＢ１２では、同時発音する音を検出したのに伴い、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ中の消音時刻ｌＴｅｒｍ（ｎｇｒ．ｌＴｅｒｍ）、鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）、鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）を更新する。また、ステップＳＢ１２では、ポインタｎＨａｒｍを、ポインタｎＴｍｐが指定するノートデータＮｏｔｅ中のポインタｎｅｘｔとしてストアすると共に、ポインタｎＴｍｐを、ポインタｎＨａｒｍが指定するノートデータＮｏｔｅ中のポインタｐｒｅｖとしてストアする。
【００５３】
このように、時系列データ生成処理では、ポインタｍｅの歩進に応じて順次読み出される楽曲データＭｉｄｉＥｖｅｎｔの内から同時発音する複数音（和音および非和声音）を検索し、該当する複数音を一まとめにし、その発音／消音タイミングや音高関係を表す属性を備える時系列データＮｏｔｅＧｒｏｕｐと、この時系列データＮｏｔｅＧｒｏｕｐに対応する楽曲データＭｉｄｉＥｖｅｎｔを表すノートデータＮｏｔｅとを生成すると共に、楽曲データＭｉｄｉＥｖｅｎｔの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始／終了時刻などを表すフレーズデータＰｈａｓｅを生成する。
【００５４】
（３）音列解析処理の動作
次に、図１０を参照して音列解析処理の動作について説明する。上述したメインルーチンのステップＳＡ２（図８参照）を介して本処理が実行されると、ＣＰＵ１は図１０に図示するステップＳＣ１に進み、時系列データＮｏｔｅＧｒｏｕｐを指定するポインタｎｇｒ、ノートデータＮｏｔｅを指定するポインタｎＴｍｐ、フレーズデータＰｈａｓｅを指定するポインタｐｈＴｍｐおよび検索データ数ｉＴｅｎｄＣｎｔをゼロリセットする。次いで、ステップＳＣ２では、先頭の時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）を、それぞれレジスタｉＭａｘ，ｉｍｉｎにストアする。
【００５５】
続いて、ステップＳＣ３では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐが「ＮＵＬＬ」であるか否か、つまり音列解析が完了したかどうかを判断する。音列解析が完了すると、判断結果は「ＮＯ」になり、本処理を完了させるが、そうでなければ、判断結果が「ＹＥＳ」となり、ステップＳＣ４に進む。
ステップＳＣ４では、１つ前の時系列データＮｏｔｅＧｒｏｕｐの有無を判断する。ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐが先頭の場合には、１つ前の時系列データＮｏｔｅＧｒｏｕｐは存在しないから、判断結果は「ＮＯ」になり、後述のステップＳＣ６に進む。一方、１つ前の時系列データＮｏｔｅＧｒｏｕｐが存在する場合には、判断結果が「ＹＥＳ」になり、ステップＳＣ５に進む。
【００５６】
ステップＳＣ５では、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）と、１つ前の時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｐｒｅｖ．ｉＰｏｓＭａｘ）との差分をレジスタｉＤＨにストアする。以下、レジスタｉＤＨを最大値差分ｉＤＨと称す。また、ステップＳＣ５では、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）と、１つ前の時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｐｒｅｖ．ｉＰｏｓｍｉｎ）との差分をレジスタｉＤＬにストアする。以下、レジスタｉＤＬを最小値差分ｉＤＬと称す。さらに、ステップＳＣ５では、レジスタｉＤＨおよびレジスタｉＤＬの値に応じて、鍵盤座標値が現在上昇しているか下降しているかを表すフラグｉｆｉｇを設定する。なお、フラグｉｆｉｇは、「１」の場合に上昇を表し、「０」の場合に下降を表す。
【００５７】
そして、ステップＳＣ６〜ＳＣ９では、レジスタｉＭａｘ，ｉｍｉｎの内容を更新する。最初のパスでは、先頭の時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）がレジスタｉＭａｘに、先頭の時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）がレジスタｉｍｉｎにそれぞれストアされているので、更新されることはないが、次回以降のパスでは、レジスタｉＭａｘの値がｎｇｒ．ｉＰｏｓＭａｘより小さければ、ｎｇｒ．ｉＰｏｓＭａｘをレジスタｉＭａｘに更新登録する（ステップＳＣ６〜ＳＣ７）。また、レジスタｉｍｉｎの値がｎｇｒ．ｉＰｏｓｍｉｎより小さければ、ｎｇｒ．ｉＰｏｓｍｉｎをレジスタｉｍｉｎに更新登録する（ステップＳＣ８〜ＳＣ９）。
【００５８】
次いで、ステップＳＣ１０では、検索データ数ｉＴｅｎｄＣｎｔをインクリメントして歩進させる。続いて、ステップＳＣ１１では、最大値差分ｉＤＨが０以上であって、かつ最小値差分ｉＤＬが０以下であるかどうかを判断する。
最初のパスでは、上記ステップＳＣ５にて最大値差分ｉＤＨおよび最小値差分ｉＤＬは算出されず「０」なので、判断結果は「ＹＥＳ」になり、ステップＳＣ１２に進み、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中の座標差分ｉＴｅｎｄ（ｎｇｒ．ｉＴｅｎｄ）に「０」をストアした後、ステップＳＣ１８に進む。
【００５９】
ステップＳＣ１８では、近傍データ処理を実行する。近傍データ処理では、後述するように、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中に、近傍の時系列データＮｏｔｅＧｒｏｕｐの鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを、近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎとしてストアする。
続いて、ステップＳＣ１９では、ポインタｐｈＴｍｐで指定されるフレーズデータＰｈａｓｅ中の開始時刻ｌＴｉｍｅ（ｐｈＴｍｐ．ｌＴｉｍｅ）が、次の時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ｌＴｉｍｅ（ｎｇｒ．ｎｅｘｔ．ｌＴｉｍｅ）より前であるか否かを判断する。つまり、次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前か後かを判断する。
【００６０】
次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前であると、上記ステップＳＣ１９の判断結果は「ＮＯ」となり、ステップＳＣ２１（後述する）に進む。
これに対し、次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の後であると、上記ステップＳＣ１９の判断結果が「ＹＥＳ」になり、ステップＳＣ２０に進む。
【００６１】
ステップＳＣ２０では、レジスタｉＭａｘに格納される鍵盤座標最大値ｉＰｏｓＭａｘ、すなわち、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）を、ポインタｐｈＴｍｐで指定されるフレーズデータＰｈａｓｅ中の鍵盤座標最大値ｉＰｏｓＭａｘにストアする。
また、ステップＳＣ２０では、レジスタｉｍｉｎに格納される盤座標最小値ｉＰｏｓｍｉｎ、すなわち、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）を、ポインタｐｈＴｍｐで指定されるフレーズデータＰｈａｓｅ中の鍵盤座標最長値ｉＰｏｓｍｉｎにストアする。
さらに、ステップＳＣ２０では、次のフレーズデータＰｈａｓｅを指定するようポインタｐｈＴｍｐを歩進させる。そして、ステップＳＣ２１に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようポインタｎｇｒを歩進させた後、上述のステップＳＣ３に処理を戻す。
【００６２】
さて、ポインタｎｇｒの歩進に応じて、前後の時系列データＮｏｔｅＧｒｏｕｐに基づき音高差（最大値差分ｉＤＨおよび最小値差分ｉＤＬ）が得られ、しかも得られた最大値差分ｉＤＨが０以上であって、かつ最小値差分ｉＤＬが０以下でない場合には、上記ステップＳＣ１１の判断結果は「ＮＯ」となり、ステップＳＣ１３に進む。
ステップＳＣ１３〜ＳＣ１６では、上記ステップＳＣ５にて得られる最大値差分ｉＤＨ、最小値差分ｉＤＬおよびフラグｉｆｉｇに基づき鍵盤座標値変化の極大／極小を判断し、極大の場合には、後述する極大／極小値処理にて鍵盤座標の極大値を検出し、一方、極小の場合には、後述する極大／極小値処理にて鍵盤座標の極小値を検出する。
【００６３】
すなわち、ステップＳＣ１３では、フラグｉｆｉｇが「０」より大きく、しかも最大値差分ｉＤＨが「０」より小さいか、つまり極大であるかどうかを判断する。極大であると、判断結果は「ＹＥＳ」になり、ステップＳＣ１４を介して極大／極小値処理（後述する）を実行して極大値を検出した後、ステップＳＣ１７に進む。
一方、極大でない場合には、上記ステップＳＣ１３の判断結果が「ＮＯ」になり、ステップＳＣ１５に進む。ステップＳＣ１５では、フラグｉｆｉｇが「０」より小さく、しかも最小値差分ｉＤＬが「０」より大きいか、つまり極小であるかどうかを判断する。極小であると、判断結果は「ＹＥＳ」になり、ステップＳＣ１５を介して極大／極小値処理（後述する）を実行して極大値を検出した後、ステップＳＣ１７に進む。極小でない場合には、判断結果が「ＮＯ」になり、ステップＳＣ１７に進む。ステップＳＣ１７では、最大値差分ｉＤＨを、現在指定されている時系列データＮｏｔｅＧｒｏｕｐ中の座標差分ｉＴｅｎｄとしてストアする。この後、上述のステップＳＣ１８以降を実行する。
【００６４】
このように、音列解析処理では、隣り合う時系列データＮｏｔｅＧｒｏｕｐ同士で互いの鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを大小比較し、より大きい方の鍵盤座標最大値ｉＰｏｓＭａｘをレジスタｉＭａｘに、より小さい方の鍵盤座標最小値ｉＰｏｓｍｉｎをレジスタｉｍｉｎに保存する一方、隣り合う時系列データＮｏｔｅＧｒｏｕｐ間の音高差（最大値差分ｉＤＨ／最小値差分ｉＤＬ）およびフラグｉｆｉｇに応じて、音高変化の極大および極小を検出したり、近傍データの最大値／最小値を検出する。
こうした処理操作によって、各時系列データＮｏｔｅＧｒｏｕｐの近傍データ最大値ｉＮＰｏｓＭａｘ、近傍データ最小値ｉＮＰｏｓｍｉｎ、差分変化継続値ｉＴｅｎｄＣｏｎｔおよび差分変化継続ステップｉＴｅｎｄを得る。
また、レジスタｉＭａｘに格納される鍵盤座標最大値ｉＰｏｓＭａｘと、レジスタｉｍｉｎに格納される鍵盤座標最小値ｉＰｏｓｍｉｎとが、対応するフレーズデータＰｈａｓｅ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎとして登録されるようになっている。
【００６５】
（４）極大／極小値処理の動作
次に、図１１を参照して極大／極小値処理の動作について説明する。上述した音列解析処理のステップＳＣ１４又はステップＳＣ１６（図１０参照）を介して本処理が実行されると、ＣＰＵ１は図１１に図示するステップＳＤ１に進み、検索ポインタｉおよび検出ステップｉＳｔｅｐｓを共にゼロリセットする。次いで、ステップＳＤ２では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中のポインタｐｒｅｖ（ｎｇｒ．ｐｒｅｖ）を、ポインタｎｇにセットする。これにより、ポインタｎｇは、音列解析処理にて指定された時系列データＮｏｔｅＧｒｏｕｐの１つ前の時系列データＮｏｔｅＧｒｏｕｐを指定することになる。
【００６６】
続いて、ステップＳＤ３では、検索ポインタｉが検索データ数ｉＴｅｎｄＣｎｔを超えるまで判断結果は「ＹＥＳ」となり、ステップＳＤ４以降を実行させる。ステップＳＤ４では、ポインタｎｇが指定する時系列データＮｏｔｅＧｒｏｕｐの次の時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇ．ｎｅｘｔ．ｉＰｏｓＭａｘ）と、ポインタｎｇが指定する時系列データＮｏｔｅＧｒｏｕ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇ．ｉＰｏｓＭａｘ）とが不一致であるかどうかを判断する。
【００６７】
双方の鍵盤座標最大値ｉＰｏｓＭａｘが一致する場合には、判断結果は「ＮＯ」となり、後述のステップＳＤ６に処理を進める。一方、不一致の場合には、判断結果が「ＹＥＳ」になり、ステップＳＤ５に進み、検出ステップｉＳｔｅｐｓをインクリメントして歩進させた後、ステップＳＤ６に進む。ステップＳＤ６では、極大検出の場合には、ポインタｎｇで指定される時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔ（ｎｇ．ｉＴｅｎｄＣｏｎｔ）に、検索ポインタｉ＋１をストアすると共に、差分変化継続ステップｉＴｅｎｄＳｔｅｐｓ（ｎｇ．ｉＴｅｎｄＳｔｅｐｓ）に、検出ステップｉＳｔｅｐｓをストアする。  
一方、極小検出の場合には、ポインタｎｇで指定される時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔ（ｎｇ．ｉＴｅｎｄＣｏｎｔ）に、検索ポインタ−ｉ−１をストアすると共に、差分変化継続ステップｉＴｅｎｄＳｔｅｐｓ（ｎｇ．ｉＴｅｎｄＳｔｅｐｓ）に、検出ステップｉＳｔｅｐｓをストアする。
【００６８】
次に、ステップＳＤ７では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中のポインタｐｒｅｖ（ｎｇｒ．ｐｒｅｖ）を、ポインタｎｇにセットする。そして、ステップＳＤ８では、検索ポインタｉをインクリメントして歩進させた後、上述のステップＳＤ３に処理を戻す。以後、歩進された検索ポインタｉが検索データ数ｉＴｅｎｄＣｎｔを超えるまでステップＳＤ３〜ＳＤ８を繰り返す。そして、検索ポインタｉが検索データ数ｉＴｅｎｄＣｎｔを超えると、ステップＳＤ３の判断結果が「ＮＯ」となり、ステップＳＤ９に進み、検索データ数ｉＴｅｎｄＣｎｔをゼロリセットして本処理を完了させる。
【００６９】
このように、上述の音列解析処理において鍵盤座標の極大値が検出された場合に実行される極大／極小値処理では、その極大値を有する時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔに「１」を、差分変化継続ステップｉＴｅｎｄＳｔｅｐｓに検出ステップｉＳｔｅｐｓをストアし、以後、検索データ数ｉＴｅｎｄＣｎｔ分後続する各時系列データＮｏｔｅＧｒｏｕｐのそれぞれには、検索ポインタｉが加算された値の差分変化継続値ｉＴｅｎｄＣｏｎｔと、検出ステップｉＳｔｅｐｓに対応する値の差分変化継続ステップｉＴｅｎｄとをストアするようになっている。
一方、上述の音列解析処理において鍵盤座標の極小値が検出された場合に実行される極大／極小値処理では、その極小値を有する時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔに「−１」を、差分変化継続ステップｉＴｅｎｄＳｔｅｐｓに検出ステップｉＳｔｅｐｓをストアし、以後、検索データ数ｉＴｅｎｄＣｎｔ分後続する各時系列データＮｏｔｅＧｒｏｕｐのそれぞれには、検索ポインタｉが減算された値の差分変化継続値ｉＴｅｎｄＣｏｎｔと、検出ステップｉＳｔｅｐｓに対応する値の差分変化継続ステップｉＴｅｎｄとをストアするようになっている。
【００７０】
（５）近傍データ処理の動作
次に、図１２を参照して近傍データ処理の動作について説明する。上述した音列解析処理のステップＳＣ１８（図１０参照）を介して本処理が実行されると、ＣＰＵ１は図１２に図示するステップＳＥ１に進み、検索ポインタｉをゼロリセットする。次いで、ステップＳＥ２では、検索回数ＭＡＸＮＢＲを超えず、かつ近傍データが存在するかどうかを判断する。
なお、ここで言う近傍データとは、音列解析処理にてポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ以降の時系列データＮｏｔｅＧｒｏｕｐを指す。したがって、ステップＳＥ２では、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ以降で、所定数分の時系列データＮｏｔｅＧｒｏｕｐについて後述の最大値／最小値更新処理を行ったかどうかを判断する。
【００７１】
所定数分の時系列データＮｏｔｅＧｒｏｕｐについて最大値／最小値更新処理をし終えてなければ、判断結果は「ＹＥＳ」となり、ステップＳＥ３〜ＳＥ７の最大値／最小値更新処理を所定数分の時系列データＮｏｔｅＧｒｏｕｐについて行う。
すなわち、ステップＳＥ３では、近傍データポインタｎＬａｓｔ［ｉ］にて指定される時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎＬａｓｔ［ｉ］．ｉＰｏｓＭａｘ）が、音列解析処理にて指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）より小さいか否かを判断する。
なお、近傍データポインタｎＬａｓｔ［ｉ］とは、検索ポインタｉに対応して歩進されるポインタであり、ポインタｎｇｒが指定する時系列データＮｏｔｅＧｒｏｕｐ以降の、時系列データＮｏｔｅＧｒｏｕｐを指定する。
【００７２】
ｎＬａｓｔ［ｉ］．ｉＰｏｓＭａｘがｎｇｒ．ｉＰｏｓＭａｘより大きいと、判断結果は「ＮＯ」になり、ステップＳＥ５に処理を進める。一方、ｎＬａｓｔ［ｉ］．ｉＰｏｓＭａｘがｎｇｒ．ｉＰｏｓＭａｘより小さければ、判断結果が「ＹＥＳ」になり、ステップＳＥ４に進み、近傍データポインタｎＬａｓｔ［ｉ］にて指定される時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘ（ｎＬａｓｔ［ｉ］．ｉＮＰｏｓＭａｘ）に、音列解析処理にて指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）をストアしてステップＳＥ５に処理を進める。
【００７３】
次いで、ステップＳＥ５では、近傍データポインタｎＬａｓｔ［ｉ］にて指定される時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎＬａｓｔ［ｉ］．ｉＰｏｓｍｉｎ）が、音列解析処理にて指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）より大きいか否かを判断する。
ｎＬａｓｔ［ｉ］．ｉＰｏｓｍｉｎがｎｇｒ．ｉＰｏｓｍｉｎより小さいと、判断結果は「ＮＯ」になり、ステップＳＥ７に処理を進める。一方、ｎＬａｓｔ［ｉ］．ｉＰｏｓＭａｘがｎｇｒ．ｉＰｏｓＭａｘより大きければ、判断結果が「ＹＥＳ」になり、ステップＳＥ６に進み、近傍データポインタｎＬａｓｔ［ｉ］にて指定される時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最小値ｉＮＰｏｓｍｉｎ（ｎＬａｓｔ［ｉ］．ｉＮＰｏｓｍｉｎ）に、音列解析処理にて指定されている時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）をストアする。
【００７４】
そして、ステップＳＥ７では、検索ポインタｉをインクリメントして歩進させた後、上述のステップＳＥ２に処理を戻す。以後、所定数分の時系列データＮｏｔｅＧｒｏｕｐについて最大値／最小値更新処理をし終える迄、上記ステップＳＥ３〜ＳＥ７を繰り返す。これにより、時系列データＮｏｔｅＧｒｏｕｐに、自己以降の近傍の時系列データＮｏｔｅＧｒｏｕｐの鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎが、近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎとして登録される。
【００７５】
（６）運指データ生成処理の動作
次に、図１３を参照して運指データ生成処理の動作について説明する。前述したメインルーチンのステップＳＡ３（図８参照）を介して本処理が実行されると、ＣＰＵ１は図１３に図示するステップＳＦ１に進み、時系列データＮｏｔｅＧｒｏｕｐを指定するポインタｎｇｒ、ノートデータＮｏｔｅを指定するポインタｎＴｍｐおよびフレーズデータＰｈａｓｅを指定するポインタｐｈＴｍｐをゼロリセットする。
続いて、ステップＳＦ２では、ポインタｐｈＴｍｐにて指定されるフレーズデータＰｈａｓｅ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｐｈＴｍｐ．ｉＰｏｓＭａｘ）から鍵盤座標最小値ｉＰｏｓｍｉｎ（ｐｈＴｍｐ．ｉＰｏｓｍｉｎ）を減算し、現フレーズ区間における鍵盤座標の最大／最小幅を算出してレジスタｐＲａｎｇｅにストアする。以下、レジスタｐＲａｎｇｅの内容を最大／最小幅ｐＲａｎｇｅと称す。
【００７６】
次いで、ステップＳＦ３では、最大／最小幅ｐＲａｎｇｅが所定値ＮＯＭＯＶＥより小さいか否かを判断する。所定値ＮＯＭＯＶＥとは、手を移動させずに鍵操作できる幅を表す。したがって、このステップＳＦ３では、現フレーズ区間において手の移動が必要かどうかを判断している。
最大／最小幅ｐＲａｎｇｅが所定値ＮＯＭＯＶＥより大きく、手の移動が必要になる場合には、上記ステップＳＦ３の判断結果が「ＮＯ」になり、ステップＳＦ４に進む。ステップＳＦ４では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘ（ｎｇｒ．ｉＮＰｏｓＭａｘ）および近傍データ最小値ｉＮＰｏｓｍｉｎ（ｎｇｒ．ｉＮＰｏｓｍｉｎ）を、それぞれ手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）として登録した後、ステップＳＦ６に進む。
【００７７】
一方、最大／最小幅ｐＲａｎｇｅが所定値ＮＯＭＯＶＥより小さく、手の移動が不必要の場合には、上記ステップＳＦ３の判断結果が「ＹＥＳ」になり、ステップＳＦ５に進む。ステップＳＦ５では、ポインタｐｈＴｍｐで指定されるフレーズデータＰｈａｓｅ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｐｈＴｍｐ．ｉＰｏｓＭａｘ）および鍵盤座標最大値ｉＰｏｓｍｉｎ（ｐｈＴｍｐ．ｉＰｏｓｍｉｎ）を、それぞれ手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）として登録した後、ステップＳＦ６に進む。
ステップＳＦ６では、手の移動処理を実行する。手の移動処理では、後述するように、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。こうして、最初の手の位置が定まると、ＣＰＵ１は、ポインタｎｇｒの歩進に応じて時系列データＮｏｔｅＧｒｏｕｐを全て読み出し終えるまでステップＳＦ７〜ＳＦ２２を繰り返す。
【００７８】
すなわち、先ずステップＳＦ８では、指の状態確認処理を実行する。指の状態確認処理では、後述するように、押鍵中の指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する。次いで、ステップＳＦ９では、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）が、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒ．ｉＰｏｓＭａｘ）より小さいか、もしくは手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）が、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒ．ｉＰｏｓｍｉｎ）より大きいか否か、すなわち手の移動が必要かどうかを判断する。
【００７９】
手の移動が必要無い場合には、判断結果は「ＮＯ」となり、後述のステップＳＦ１２に処理を進めるが、手の移動が必要な場合には、判断結果が「ＹＥＳ」になり、ステップＳＦ１０に進む。ステップＳＦ１０では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘ（ｎｇｒ．ｉＮＰｏｓＭａｘ）および近傍データ最小値ｉＮＰｏｓｍｉｎ（ｎｇｒ．ｉＮＰｏｓｍｉｎ）を、それぞれ手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）にストアする。
この後、ステップＳＦ１１を介して手の移動処理を実行し、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）の更新に対応して新たな手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）となる中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。
【００８０】
次に、ステップＳＦ１２では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中のノートデータポインタＮｏｔｅＥｖを、ポインタｎＴｍｐにセットする。次いで、ステップＳＦ１３〜ＳＦ１５では、ポインタｎＴｍｐで指定されるノートデータＮｏｔｅが無くなる迄、ポインタｎＴｍｐを歩進させながらステップＳＦ１４を介して指の割当て処理を実行する。指の割当て処理では、後述するように、割当てポインタｉｄｘで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てする。
【００８１】
こうして運指割当てがなされると、ステップＳＨ１６に進み、ポインタｐｈＴｍｐで指定されるフレーズデータＰｈａｓｅ中の開始時刻ｌＴｉｍｅ（ｐｈＴｍｐ．ｌＴｉｍｅ）が、次の時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ｌＴｉｍｅ（ｎｇｒ．ｎｅｘｔ．ｌＴｉｍｅ）より前であるか否かを判断する。つまり、次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前か後かを判断する。
ここで、次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前であると、判断結果は「ＮＯ」となり、ステップＳＦ２２に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようにポインタｎｇｒを歩進させた後、前述のステップＳＦ７に処理を戻す。
【００８２】
一方、次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の後であれば、上記ステップＳＦ１６の判断結果は「ＹＥＳ」となり、ステップＳＦ１７に進む。ステップＳＦ１７では、ポインタｐｈＴｍｐにて指定されるフレーズデータＰｈａｓｅ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｐｈＴｍｐ．ｉＰｏｓＭａｘ）から鍵盤座標最小値ｉＰｏｓｍｉｎ（ｐｈＴｍｐ．ｉＰｏｓｍｉｎ）を減算し、現フレーズ区間における鍵盤座標の最大／最小幅ｐＲａｎｇｅを算出する。続いて、ステップＳＦ１８では、最大／最小幅ｐＲａｎｇｅが所定値ＮＯＭＯＶＥより小さいか否かを判断する。所定値ＮＯＭＯＶＥとは、手を移動させずに鍵操作できる幅を表す。したがって、このステップＳＦ１８では、現フレーズ区間において手の移動が必要かどうかを判断している。
【００８３】
最大／最小幅ｐＲａｎｇｅが所定値ＮＯＭＯＶＥより大きく、手の移動が必要になる場合には、上記ステップＳＦ１８の判断結果が「ＮＯ」になり、ステップＳＦ１９に進む。ステップＳＦ１９では、次の時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘ（ｎｇｒ．ｎｅｘｔ．ｉＮＰｏｓＭａｘ）および近傍データ最小値ｉＮＰｏｓｍｉｎ（ｎｇｒ．ｎｅｘｔ．ｉＮＰｏｓｍｉｎ）を、それぞれ手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）として登録した後、ステップＳＦ２１に進む。
【００８４】
一方、最大／最小幅ｐＲａｎｇｅが所定値ＮＯＭＯＶＥより小さく、手の移動が不必要の場合には、上記ステップＳＦ１８の判断結果が「ＹＥＳ」になり、ステップＳＦ２０に進む。ステップＳＦ２０では、ポインタｐｈＴｍｐで指定されるフレーズデータＰｈａｓｅ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｐｈＴｍｐ．ｉＰｏｓＭａｘ）および鍵盤座標最大値ｉＰｏｓｍｉｎ（ｐｈＴｍｐ．ｉＰｏｓｍｉｎ）を、それぞれ手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）として登録した後、ステップＳＦ２１に進む。
【００８５】
ステップＳＦ２１では、前述のステップＳＦ６と同様、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する手の移動処理（図１４参照）を実行する。この後、ステップＳＦ２２に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようにポインタｎｇｒを歩進させた後、前述のステップＳＦ７に処理を戻す。以後、ポインタｎｇｒの歩進に応じて時系列データＮｏｔｅＧｒｏｕｐを全て読み出し終えるまでステップＳＦ７〜ＳＦ２２を繰り返し、全て読み出し終えた時点でステップＳＦ７の判断結果が「ＮＯ」となり、本処理を終える。
【００８６】
このように、運指データ生成処理では、最初に現フレーズ区間における鍵盤座標の最大／最小幅ｐＲａｎｇｅを算出し、これに基づき現フレーズ区間で手の移動が必要かどうかを判断し、手の移動が必要な場合には、現時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎに基づき、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを更新させてから、最初の手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。
【００８７】
最初の手の位置が決ったら、押鍵中の指の有無を判断し、該当する指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する指の状態確認処理を実行し、その後に、鍵操作する手の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てする。
運指割当を行った後は、再び次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断する。そして、手の移動が必要になる場合には、次の時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎに基づき、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを更新させてから、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。以後、こうした処理操作を全ての時系列データＮｏｔｅＧｒｏｕｐについて繰り返す。
【００８８】
（７）手の移動処理の動作
次に、図１４を参照して手の移動処理の動作について説明する。上述した運指データ生成処理のステップＳＦ６、ステップＳＦ１１およびステップＳＦ２１を介して本処理が実行されると、ＣＰＵ１は図１４に図示するステップＳＧ１に進み、検索ポインタｉｆｉｇをゼロリセットすると共に、手の状態データＨａｎｄ中の親指座標Ｈａｎｄ．ｆｉｇ［０］．ｉＰｏｓに、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎをストアする。
続いて、ステップＳＧ２では、手の状態データＨａｎｄ中の識別フラグｉＲＬ（Ｈａｎｄ．ｉＲＬ）が「１」、つまり左手の鍵操作であるかどうかを判断する。左手の鍵操作であると、判断結果は「ＹＥＳ」となり、ステップＳＧ３に進み、一方、右手の鍵操作ならば、判断結果が「ＮＯ」になり、ステップＳＧ４に進む。
【００８９】
ステップＳＧ３では、手の状態データＨａｎｄ中の親指座標Ｈａｎｄ．ｆｉｇ［０］．ｉＰｏｓに、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓＭａｘをストアする。このように、右手で鍵操作する場合には、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎを親指の位置に割当て、一方、左手で鍵操作する場合には、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘを親指の位置に割当てる。
そして、ステップＳＧ４では、指の位置指定処理を実行する。後述するように、指の位置指定処理では、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）から得られる手の幅ｉＲａｎｇｅと、親指から小指までの各指の離れ具合を表す定数ｆｉｇｔｍｐ［０］〜ｆｉｇｔｍｐ［４］とを勘案して人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを設定する。
【００９０】
こうして、ステップＳＧ４にて人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓが設定されると、ステップＳＧ５に進み、設定された各指の座標の内、中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを、手の状態データＨａｎｄ中の手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）としてストアする。
【００９１】
このように、手の移動処理では、右手で鍵操作する場合には、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎを親指の位置に割当て、一方、左手で鍵操作する場合には、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘを親指の位置に割当てておき、さらに手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）から得られる手の幅ｉＲａｎｇｅと、親指から小指までの各指の離れ具合を表す定数ｆｉｇｔｍｐ［０］〜ｆｉｇｔｍｐ［４］とを勘案して人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを設定し、その内の中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）に設定するようになっている。
【００９２】
（８）指の状態確認処理の動作
次に、図１５を参照して指の状態確認処理の動作について説明する。前述した運指データ生成処理のステップＳＦ８（図１３参照）を介して本処理が実行されると、ＣＰＵ１は図１５に図示するステップＳＨ１に進み、検索ポインタｉをゼロリセットする。続いて、ステップＳＨ２では、検索ポインタｉが「５」より小さいか否か、つまり全ての指について状態確認し終えたかどうかを判断する。状態確認し終えていなければ、判断結果は「ＹＥＳ」になり、ステップＳＨ３に進む。ステップＳＨ３では、手の状態データＨａｎｄ中において検索ポインタｉで指定される指の前状態フラグｓｔａｔｐｒｅｖ（Ｈａｎｄ．ｆｉｇ［ｉ］．ｓｔａｔｐｒｅｖ）をゼロリセットする。
【００９３】
そして、ステップＳＨ４では、手の状態データＨａｎｄ中において検索ポインタｉで指定される指が押鍵中のノートデータｅｖｅｎｔ（Ｈａｎｄ．ｆｉｇ［ｉ］．ｅｖｅｎｔ）が「ＮＵＬＬ」であるか否か、すなわち、検索ポインタｉで指定される指が押鍵中であるかどうかを判断する。押鍵中であると、判断結果は「ＮＯ」になり、ステップＳＨ７に進み、検索ポインタｉをインクリメントして歩進させた後、上述のステップＳＨ２に処理を戻す。
一方、押鍵中でなければ、判断結果は「ＹＥＳ」となり、次のステップＳＨ５に進む。ステップＳＨ５では、検索ポインタｉで指定される指が押鍵中の音の消音時間（Ｈａｎｄ．ｆｉｇ［ｉ］．ｅｖｅｎｔ．ｌＴｅｒｍ）が、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中の開始時刻ｌＴｉｍｅ（ｎｇｒ．ｌＴｉｍｅ）より小さいか否か、つまり消音時間を超えているかどうかを判断する。
【００９４】
消音時間を超えていなければ、判断結果は「ＮＯ」となり、ステップＳＨ７を介して検索ポインタｉを歩進させてからステップＳＨ２に処理を戻す。これに対し、消音時間を超えていると、判断結果が「ＹＥＳ」になり、ステップＳＨ６に進む。ステップＳＨ６では、手の状態データＨａｎｄ中において検索ポインタｉで指定される指の状態フラグ（Ｈａｎｄ．ｆｉｇ［ｉ］．ｓｔａｔｕｓ）に、消音状態を表す「０」をセットすると共に、検索ポインタｉで指定される指の前状態フラグｓｔａｔｐｒｅｖ（Ｈａｎｄ．ｆｉｇ［ｉ］．ｓｔａｔｐｒｅｖ）に「１」をセットする。さらに、検索ポインタｉで指定される指が押鍵中のノートデータｅｖｅｎｔ（Ｈａｎｄ．ｆｉｇ［ｉ］．ｅｖｅｎｔ）に「ＮＵＬＬ」をセットする。
【００９５】
そして、この後、ステップＳＨ７にて検索ポインタｉをインクリメントして歩進させた後、上述のステップＳＨ２に処理を戻す。以後、全ての指について状態確認し終えるまで上記ステップＳＨ２〜ＳＨ７を繰り返し、全ての指について状態確認し終えと、ステップＳＨ２の判断結果が「ＮＯ」となり、本処理を完了させる。
このように、指の状態確認処理では、押鍵中の指があると、その指で押鍵されている音（ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐの音）の消音時刻を超えているか否かを確認し、消音時刻を超えていた時にはその指を消音状態に設定するようになっている。
【００９６】
（９）指の割当処理の動作
次に、図１６を参照して指の割当処理の動作について説明する。前述した運指データ生成処理のステップＳＦ１４（図１３参照）を介して本処理が実行されると、ＣＰＵ１は図１６に図示するステップＳＪ１に進み、検索ポインタｉをゼロリセットする。続いて、ステップＳＨ２では、検索ポインタｉが「５」より小さいか否か、つまり全ての指について割り振りし終えたかどうかを判断する。割り振りし終えていなければ、判断結果は「ＹＥＳ」になり、ステップＳＪ３に進む。
【００９７】
ステップＳＪ３〜ＳＪ５では、鍵操作する手と割当て方向とに応じて割当てポインタｉｄｘを初期設定する。すなわち、鍵操作する手が右手でその小指から親指へ順番に割当てて行く場合あるいは鍵操作する手が左手でその小指から親指へ順番に割当てて行く場合のいずれかであると、ステップＳＪ４の判断結果が「ＹＥＳ」となり、割当てポインタｉｄｘに「４−ｉ」がセットされ（ステップＳＪ５）、それ以外の場合には割当てポインタｉｄｘに「ｉ」がセットされる（ステップＳＪ３）。
次に、ステップＳＪ６では、手の状態データＨａｎｄ中において割当てポインタｉｄｘで指定される指の座標ｉＰｏｓ（Ｈａｎｄ．ｆｉｇ［ｉｄｘ］．ｉＰｏｓ）が、ポインタｎＴｍｐで指定されるノートデータＮｏｔｅ中の鍵盤座標ｉＰｏｓ（ｎＴｍｐ．ｉＰｏｓ）以下であって、かつ手の状態データＨａｎｄ中において割当てポインタｉｄｘで指定される指の状態フラグｓｔａｔｕｓ（Ｈａｎｄ．ｆｉｇ［ｉｄｘ］．ｓｔａｔｕｓ）が「０」、すなわち消音状態であるかどうかを判断する。
【００９８】
こうした判定条件に合致しなければ、判断結果は「ＮＯ」となり、ステップＳＪ７に進み、検索ポインタｉを歩進させた後、上述のステップＳＪ２に処理を戻す。
一方、割当てポインタｉｄｘで指定される指の位置が弾くべき鍵の座標以下であって、しかもその指が押鍵されていなければ、上記ステップＳＪ６の判断結果は「ＹＥＳ」になり、ステップＳＪ８に進み、ポインタｎＴｍｐを、手の状態データＨａｎｄ中において割当てポインタｉｄｘで指定される指のノートデータｅｖｅｎｔ（Ｈａｎｄ．ｆｉｇ［ｉｄｘ］．ｅｖｅｎｔ）としてストアする。
【００９９】
次いで、ステップＳＪ９では、ポインタｎＴｍｐで指定されるノートデータＮｏｔｅ中の運指番号ｃｆｉｇ（ｎＴｍｐ．ｉＰｏｓ）に、割当てポインタｉｄｘをストアする。これにより、弾くべき指を表す運指番号ｃｆｉｇが決定される。そして、ステップＳＪ１０では、割当てポインタｉｄｘをレジスタｉｆｉｇに格納した後、ステップＳＪ１１を介して指の位置指定処理（図１７参照）を実行した後、本処理を終える。
このように、指の割当処理では、割当てポインタｉｄｘで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てするようになっている。
【０１００】
なお、ステップＳＪ１１を介して実行される指の位置指定処理では、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）から得られる手の幅ｉＲａｎｇｅと、親指から小指までの各指の離れ具合を表す定数ｆｉｇｔｍｐ［０］〜ｆｉｇｔｍｐ［４］とを勘案し、指の割当処理において「運指割当てした指」を基準にして人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを再設定するようになっている。
【０１０１】
（１０）指の位置指定処理の動作
次に、図１７を参照して指の位置指定処理の動作について説明する。前述した手の移動処理のステップＳＧ４（図１４参照）を介して本処理が実行されると、ＣＰＵ１は図１７に図示するステップＳＫ１に進み、レジスタｉＣｏｅｆに「１」をストアする。次いで、ステップＳＫ２では、手の状態データＨａｎｄ中の識別フラグｉＲＬ（Ｈａｎｄ．ｉＲＬ）が「１」、つまり左手の鍵操作であるかどうかを判断する。左手の鍵操作であると、判断結果は「ＹＥＳ」となり、ステップＳＫ３に進み、レジスタｉＣｏｅｆに「−１」をストアする。これに対し、右手の鍵操作であれば、判断結果が「ＮＯ」になり、ステップＳＫ４に進む。このように、右手の鍵操作時にはレジスタｉＣｏｅｆに「１」が、左手の鍵操作時にはレジスタｉＣｏｅｆに「−１」がストアされる。
【０１０２】
ステップＳＫ４では、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）から鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）を減算して手の幅を算出し、これをレジスタｉＲａｎｇｅにストアする。以下、レジスタｉＲａｎｇｅの内容を手の幅ｉＲａｎｇｅと称す。続いて、ステップＳＫ５〜ＳＫ８では、親指から小指までの各指の離れ具合を表す定数ｆｉｇｔｍｐ［０］〜ｆｉｇｔｍｐ［４］で表現される各指間の離間比率に、手の幅ｉＲａｎｇｅを乗算して、親指を除く人差し指から小指までの各指の仮の座標位置ｆｉｇｔｍｐ［１］〜［４］を生成する。
【０１０３】
この後、ステップＳＫ９〜ＳＫ１３では、前述した手の移動処理（図１４参照）にて検索ポインタｉｆｉｇに「０」をセットしている為、この検索ポインタｉｆｉｇが指定する親指を除いた人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを、上述のステップＳＫ５〜ＳＫ８にて生成された、親指を除く人差し指から小指までの各指の仮の座標位置ｆｉｇｔｍｐ［１］〜［４］を用いて算出する。
【０１０４】
例えば、人差し指座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓを求めるには、既に設定済みの親指座標Ｈａｎｄ．ｆｉｇ［０］．ｉＰｏｓに、人差し指の仮の座標位置ｆｉｇｔｍｐ［１］を加算し、その加算値にレジスタｉＣｏｅｆの値を乗算する。また、中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを求めるには、先に得た人差し指座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓに、中指の仮の座標位置ｆｉｇｔｍｐ［２］を加算し、その加算値にレジスタｉＣｏｅｆの値を乗算する。
こうして、親指を除く人差し指から小指までの各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを生成し終えると、ステップＳＫ１０の判断結果が「ＮＯ」となり、本処理を終える。
【０１０５】
このように、指の位置指定処理では、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）から得られる手の幅ｉＲａｎｇｅを、親指から小指までの各指の離れ具合を表す定数ｆｉｇｔｍｐ［０］〜ｆｉｇｔｍｐ［４］で表現される各指間の離間比率に乗算して、親指を除く人差し指から小指までの各指の仮の座標位置ｆｉｇｔｍｐ［１］〜［４］を生成し、これら仮の座標位置ｆｉｇｔｍｐ［１］〜［４］を既に設定済みの親指座標Ｈａｎｄ．ｆｉｇ［０］．ｉＰｏｓに順次加算して人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを設定するようになっている。
【０１０６】
以上説明したように、第１実施形態では、楽曲データＭｉｄｉＥｖｅｎｔから同時発音する音を検索し、該当する各音を一まとめにして、その発音／消音タイミングや音高関係を表す属性を備える時系列データＮｏｔｅＧｒｏｕｐを生成する一方、時系列データＮｏｔｅＧｒｏｕｐに対応する楽曲データＭｉｄｉＥｖｅｎｔを表すノートデータＮｏｔｅを生成する他、楽曲データＭｉｄｉＥｖｅｎｔの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始／終了時刻などを表すフレーズデータＰｈａｓｅを生成した後、隣り合う時系列データＮｏｔｅＧｒｏｕｐ間の音高差（最大値差分ｉＤＨ／最小値差分ｉＤＬ）およびフラグｉｆｉｇに応じて、音高変化の極大および極小を検出したり、近傍データの最大値／最小値を検出する処理操作を行い、これにて各時系列データＮｏｔｅＧｒｏｕｐの近傍データ最大値ｉＮＰｏｓＭａｘ、近傍データ最小値ｉＮＰｏｓｍｉｎ、差分変化継続値ｉＴｅｎｄＣｏｎｔおよび差分変化継続ステップｉＴｅｎｄを得る他、対応するフレーズデータＰｈａｓｅの鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを生成する。
【０１０７】
この後、先ず最初に現フレーズ区間で手の移動が必要かどうかを判断し、手の移動が必要な場合には、現時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎに基づき、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを更新させてから、最初の手の位置（中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓ）を設定する。そして、最初の手の位置が決ったら、鍵操作する手の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行う。
【０１０８】
運指割当て後は、再び次の時系列データＮｏｔｅＧｒｏｕｐが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断し、手の移動が必要になる場合には、次の時系列データＮｏｔｅＧｒｏｕｐ中の近傍データ最大値ｉＮＰｏｓＭａｘおよび近傍データ最小値ｉＮＰｏｓｍｉｎに基づき、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを更新させてから、次の手の位置（中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓ）を設定する。この結果、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することが可能になる訳である。
【０１０９】
Ｄ．第１実施形態の変形例
次に、図１８を参照して第１実施形態の変形例による「指の割当処理」の動作を説明する。前述した第１実施形態と同様、運指データ生成処理のステップＳＦ１４（図１３参照）を介して本処理が実行されると、ＣＰＵ１は図１８に図示するステップＳＬ１に進み、検索ポインタｉおよびレジスタｉｆｉｇをゼロリセットすると共に、レジスタｉＩｎｔに最大値をストアする。ここで言う最大値とは、鍵操作可能な指と鍵の離間距離を表す。
【０１１０】
次いで、ステップＳＬ２〜ＳＬ４では、鍵操作する手が右手か左手かに応じて運指割り付け指の順番を決める。すなわち、最初にフラグｉＤｅｓｔに「０」をセットしておき（ステップＳＬ２）、次に手の状態データＨａｎｄ中の識別フラグｉＲＬが「０」、つまり右手の鍵操作であるかどうかを判断する（ステップＳＬ３）。そして、左手の鍵操作であれば、ステップＳＬ３の判断結果は「ＮＯ」になり、フラグｉＤｅｓｔは「０」のままになる。これに対し、右手の鍵操作であると、ステップＳＬ３の判断結果が「ＹＥＳ」になり、ステップＳＬ４に進み、フラグｉＤｅｓｔは「１」となる。
フラグｉＤｅｓｔは運指割り付けの方向を表すフラグであり、「０」の場合に右側からの運指割り付けを表し、「１」の場合に左側からの運指割り付けを表す。したがって、鍵操作する手が右手であると、その親指から小指へ順番に運指割り付けする。一方、鍵操作する手が左手であると、その親指から小指へ順番に運指割り付けする。
【０１１１】
そして、ステップＳＬ５では、検索ポインタｉが「５」より小さいか否か、つまり全ての指について割り振りし終えたかどうかを判断する。割り振りし終えていなければ、判断結果は「ＹＥＳ」になり、ステップＳＬ６に進む。ステップＳＬ６〜ＳＬ８では、鍵操作する手と割当ての方向とに応じて割当てポインタｉｄｘを初期設定する。
すなわち、鍵操作する手が右手でその小指から親指へ順番に割当てる場合あるいは鍵操作する手が左手でその小指から親指へ順番に割当てる場合のいずれかであると、ステップＳＬ７の判断結果が「ＹＥＳ」となり、割当てポインタｉｄｘに「４−ｉ」がセットされ（ステップＳＬ８）、それ以外の場合には割当てポインタｉｄｘに「ｉ」がセットされる（ステップＳＬ６）。
【０１１２】
次に、ステップＳＬ９では、手の状態データＨａｎｄ中において割当てポインタｉｄｘで指定される指の座標ｉＰｏｓ（Ｈａｎｄ．ｆｉｇ［ｉｄｘ］．ｉＰｏｓ）とポインタｎＴｍｐで指定されるノートデータＮｏｔｅ中の鍵盤座標ｉＰｏｓ（ｎＴｍｐ．ｉＰｏｓ）との差分絶対値（指と鍵の離間距離）を、レジスタｉＩｎｔＴｍｐにストアする。続いて、ステップＳＬ１０では、レジスタｉＩｎｔＴｍｐに格納された指と鍵の離間距離が、レジスタｉＩｎｔに格納される最大値（鍵操作可能な指と鍵の離間距離）より小さいか否か、つまり現在指定されている指で鍵操作可能かどうかを判断する。
【０１１３】
現在指定されている指で鍵操作可能であると、判断結果は「ＹＥＳ」になり、ステップＳＬ１１に進み、現在指定されている指を表す割当てポインタｉｄｘを、レジスタｉｆｉｇにストアすると共に、レジスタｉＩｎｔＴｍｐに格納された指と鍵の離間距離を新たな最大値としてレジスタｉＩｎｔに更新登録した後、ステップＳＬ１２に進む。
一方、現在指定されている指で鍵操作不可能な場合には、上記ステップＳＬ１０の判断結果が「ＹＥＳ」になり、ステップＳＬ１２に進み、検索ポインタｉをインクリメントして歩進させた後、上述のステップＳＬ５に処理を戻す。以後、全ての指について割り振りし終える迄、上述のステップＳＬ５〜ＳＬ１２を繰り返す。これにより、鍵との離間距離が最短となる指を表す割当てポインタｉｄｘがレジスタｉｆｉｇに格納される一方、ステップＳＬ５の判断結果が「ＮＯ」になり、ステップＳＬ１３に進む。
【０１１４】
ステップＳＬ１３では、ポインタｎＴｍｐを、手の状態データＨａｎｄ中において割当てポインタｉｄｘで指定される指のノートデータｅｖｅｎｔ（Ｈａｎｄ．ｆｉｇ［ｉｄｘ］．ｅｖｅｎｔ）としてストアする。次いで、ステップＳＪ９では、ポインタｎＴｍｐで指定されるノートデータＮｏｔｅ中の運指番号ｃｆｉｇ（ｎＴｍｐ．ｉＰｏｓ）に、割当てポインタｉｄｘをストアする。これにより、弾くべき指を表す運指番号ｃｆｉｇが決定される。
【０１１５】
そして、ステップＳＬ１５では、割当てポインタｉｄｘをレジスタｉｆｉｇに格納した後、ステップＳＬ１６を介して指の位置指定処理（図１７参照）を実行する。指の位置指定処理では、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）から得られる手の幅ｉＲａｎｇｅと、親指から小指までの各指の離れ具合を表す定数ｆｉｇｔｍｐ［０］〜ｆｉｇｔｍｐ［４］とを勘案し、指の割当処理において「運指割当てした指」を基準にして人差し指から小指の各指の座標Ｈａｎｄ．ｆｉｇ［１］．ｉＰｏｓ〜Ｈａｎｄ．ｆｉｇ［４］．ｉＰｏｓを再設定した後、本処理を終える。
このように、変形例による指の割当処理では、割当てポインタｉｄｘで指定される各指の内、押鍵すべき鍵との離間距離が最短となる指を、弾くべき指として運指割当てするようになっている。
【０１１６】
［第２実施形態］
次に、図１９〜図２５を参照して第２実施形態について説明する。第２実施形態の構成は、上述の第１実施形態と共通するので、その説明については省略する。第２実施形態が上述の第１実施形態と相違する点は、曲演奏に必要な手の移動位置を表す動作データ（後述する）を発生し、この動作データで定義される手の位置とそれに応じた指の位置とを勘案して生成された運指データから「弾き難さ」を評価し、その評価された「弾き難さ」が一定以下の指標値となるよう運指データを調整して弾き易い運指データを得る点にある。以下では、こうした第２実施形態に用いられる動作データの構成と、第２実施形態の動作とを説明する。
【０１１７】
（１）動作データの構成
図１９は、ＲＡＭ３のデータエリアに設けられる動作データの構成を示す図である。動作データＨａｎｄＰｏｓは、曲演奏に必要な手の移動位置を表すものであり、開始時刻ＩＴｉｍｅ、終了時刻ｌＴｅｒｍ、鍵盤座標最大値ｉＰｏｓＭａｘ、鍵盤座標最小値ｉＰｏｓｍｉｎ、ポインタｎｅｘｔおよびポインタｐｒｅｖから構成される。なお、ポインタｎｅｘｔおよびポインタｐｒｅｖは、それぞれ次の動作データおよび前の動作データを指定するポインタである。
【０１１８】
（２）メインルーチンの動作
次に、図２０を参照して第２実施形態によるメインルーチンの動作について説明する。
入力部４からＣＰＵ１にメイルーチンの実行を指示するイベントが供給されると、ＣＰＵ１は図２０に図示するメインルーチンを実行してステップＳＭ１に進み、時系列データ生成処理を実行する。時系列データ生成処理は、前述の第１実施形態と同一であり、楽曲データＭｉｄｉＥｖｅｎｔから同時発音する音を検索し、該当する各音を一まとめにして、その発音／消音タイミングや音高関係を表す属性を備える時系列データＮｏｔｅＧｒｏｕｐを生成する一方、時系列データＮｏｔｅＧｒｏｕｐに対応する楽曲データＭｉｄｉＥｖｅｎｔを表すノートデータＮｏｔｅを生成する他、楽曲データＭｉｄｉＥｖｅｎｔの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始／終了時刻などを表すフレーズデータＰｈａｓｅを生成する。
【０１１９】
次に、ステップＳＭ２では、音列解析処理を実行する。音列解析処理は、前述の第１実施形態と同一であり、隣り合う時系列データＮｏｔｅＧｒｏｕｐ間の音高差（最大値差分ｉＤＨ／最小値差分ｉＤＬ）およびフラグｉｆｉｇに応じて、音高変化の極大および極小を検出したり、近傍データの最大値／最小値を検出する処理操作を行い、これにて各時系列データＮｏｔｅＧｒｏｕｐの近傍データ最大値ｉＮＰｏｓＭａｘ、近傍データ最小値ｉＮＰｏｓｍｉｎ、差分変化継続値ｉＴｅｎｄＣｏｎｔおよび差分変化継続ステップｉＴｅｎｄを得る他、対応するフレーズデータＰｈａｓｅの鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎを生成する。
【０１２０】
続いて、ステップＳＭ３では、後述する運指データ評価を行う回数を計数するカウンタｉＲｅｔｒｙをゼロリセットしておく。次に、ステップＳＭ４では、動作データ生成処理を実行する。動作データ生成処理では、後述するように、時系列データＮｏｔｅＧｒｏｕｐを参照して曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間を検索し、該当する区間において、時系列データＮｏｔｅＧｒｏｕｐで定義される鍵盤座標最大値ｉＰｏｓＭａｘと鍵盤座標最小値ｉＰｏｓｍｉｎとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
【０１２１】
次いで、ステップＳＭ５では、運指データ生成処理を実行する。運指データ生成処理では、後述するように、最初に動作データＨａｎｄＰｏｓを参照して手の位置を定め、その手の位置における各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行い、以後、鍵操作する動作の切れ目になる毎に、動作データＨａｎｄＰｏｓを参照して手の位置を定めて運指割当てする。
そして、ステップＳＭ６では、運指データ評価処理を実行する。運指データ評価処理では、後述するように、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算し、「弾き難さ」を表す値をカウンタｉＣｏｓｔにストアする。
【０１２２】
次に、ステップＳＭ７では、上記ステップＳＭ６にて運指データ評価を行ったノート数でカウンタｉＣｏｓｔの値を除算して得る「弾き難さ」の平均値ａｖｅｒａｇｅ（ｉＣｏｓｔ）が、許容範囲値ＡＲＲＯＷＥＤＣＯＳＴより小さいか、あるいはカウンタｉＲｅｔｒｙにて計数される評価回数が、再評価回数最大値ＭＡＸＲＥＴＲＹより小さいかを判断する。ここで、いずれかの条件に合致すると、判断結果が「ＹＥＳ」となるが、そうでない場合には、判断結果が「ＮＯ」となり、ステップＳＭ８に進む。そして、ステップＳＭ８では、カウンタｉＲｅｔｒｙにて計数される評価回数をインクリメントして歩進させ、続くステップＳＭ９では、手の幅の半値ｉＨａｎｄＨａｌｆを乱数変化させてから前述のステップＳＭ４に処理を戻し、乱数変化させた手の幅の半値ｉＨａｎｄＨａｌｆに基づき、曲演奏に必要な手の移動位置を表す動作データＨａｎｄＰｏｓを再生成させる。
【０１２３】
以後、再生成された動作データＨａｎｄＰｏｓで定義される手の位置とそれに応じた指の位置とを勘案して運指データを生成し、さらに生成された運指データの「弾き難さ」を評価する。そして、評価回数が再評価回数最大値ＭＡＸＲＥＴＲＹが超えるまで、あるいは評価された「弾き難さ」（平均値ａｖｅｒａｇｅ（ｉＣｏｓｔ））が許容範囲値ＡＲＲＯＷＥＤＣＯＳＴに収まるまで運指データを調整して弾き易い運指データを得る。
【０１２４】
（３）動作データ生成処理の動作
次に、図２１を参照して動作データ生成処理の動作について説明する。上述したメインルーチンのステップＳＭ４（図２０参照）を介して本処理が実行されると、ＣＰＵ１は図２１に図示するステップＳＮ１に進み、時系列データＮｏｔｅＧｒｏｕｐを指定するポインタｎｇｒをゼロリセットする。次いで、ステップＳＮ２では、ポインタｎｇｒをレジスタｎｇｒＳｔにストアする。続いて、ステップＳＮ３では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐが「ＮＵＬＬ」であるか否か、つまり動作データの生成が完了したかどうかを判断する。動作データの生成が完了すると、判断結果は「ＮＯ」になり、本処理を完了させるが、そうでなければ、判断結果が「ＹＥＳ」となり、ステップＳＮ４に進む。
【０１２５】
ステップＳＮ４では、ポインタｎｇｒで指定される現時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔ（ｎｇｒ．ｉＴｅｎｄＣｏｎｔ）と、次の時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔ（ｎｇｒ．ｎｅｘｔ．ｉＴｅｎｄＣｏｎｔ）との積が「０」以下であるか否か、つまり極値であるかどうかを判断する。現時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔおよび次の時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔの双方が共に同じ極性であれば、極値ではないから、判断結果は「ＮＯ」になり、ステップＳＮ８に進み、ポインタｎｇｒを歩進させた後、ステップＳＮ３に処理を戻し、再び極値検出を行う。
【０１２６】
こうして、現時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔと次の時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔとの積に基づき極値判定を進めている時に、一方と他方の極性が異なる極値を検出すると、ステップＳＮ４の判断結果が「ＹＥＳ」になり、ステップＳＮ５に進む。
ステップＳＮ５では、現時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔ（ｎｇｒ．ｉＴｅｎｄＣｏｎｔ）を、次の時系列データＮｏｔｅＧｒｏｕｐ中の差分変化継続値ｉＴｅｎｄＣｏｎｔの絶対値（ａｂｓ（ｎｇｒ．ｎｅｘｔ．ｉＴｅｎｄＣｏｎｔ）で除した値をレジスタｉＴｅｎｄにストアする。ここで、レジスタｉＴｅｎｄの値が正ならば「極大」を表し、負ならば「極小」を表す。
【０１２７】
次に、ステップＳＮ６を介して移動位置の特定処理を実行する。移動位置の特定処理では、後述するように、曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間において、時系列データＮｏｔｅＧｒｏｕｐで定義される鍵盤座標最大値ｉＰｏｓＭａｘと鍵盤座標最小値ｉＰｏｓｍｉｎとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
次いで、ステップＳＮ７では、極点から極点までの区間における最適な手の位置を設定し終えたのに対応して、ポインタｎｇｒをレジスタｎｇｒＳｔにストアし直し、続くステップＳＮ８では、ポインタｎｇｒを歩進させた後、上述のステップＳＮ３に処理を戻す。以後、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐが「ＮＵＬＬ」に達するまでステップＳＮ３〜ＳＮ８を繰り返して動作データの生成を行う。
【０１２８】
このように、動作データ生成処理では、時系列データＮｏｔｅＧｒｏｕｐを参照して曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間を検索し、該当する区間において、時系列データＮｏｔｅＧｒｏｕｐで定義される鍵盤座標最大値ｉＰｏｓＭａｘと鍵盤座標最小値ｉＰｏｓｍｉｎとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
【０１２９】
（４）移動位置の特定処理の動作
次に、図２２を参照して移動位置の特定処理の動作について説明する。上述した動作データ生成処理のステップＳＮ６（図２１参照）を介して本処理が実行されると、ＣＰＵ１は図２２に図示するステップＳＯ１に進む。ステップＳＯ１では、手の状態データＨａｎｄ中の識別フラグｉＲＬ（Ｈａｎｄ．ｉＲＬ）が「０」であって、かつレジスタｉＴｅｎｄの値が正であるか、あるいは手の状態データＨａｎｄ中の識別フラグｉＲＬ（Ｈａｎｄ．ｉＲＬ）が「１」であって、かつレジスタｉＴｅｎｄの値が負であるかを判断する。つまり、「右手の鍵操作による極大位置」もしくは「左手の鍵操作による極小位置」であるかどうかを判断する。
【０１３０】
「右手の鍵操作による極大位置」もしくは「左手の鍵操作による極小位置」であると、判断結果は「ＹＥＳ」になり、ステップＳＯ２に進み、検索フラグｉｄｅｓｔに「０」をセットする。なお、検索フラグｉｄｅｓｔは、検索方向を表すフラグであり、「０」の場合に前方検索を表し、「１」の場合に後方検索を表す。また、ステップＳＯ２では、レジスタｎｇｒＳｔの値を検索ポインタｎｇｒｐｒｏｇにセットすると共に、ポインタｎｇｒをレジスタｎｇｒｔｅｒｍにストアする。
一方、「右手の鍵操作による極小位置」もしくは「左手の鍵操作による極大位置」の場合には、上記ステップＳＯ１の判断結果が「ＮＯ」になり、ステップＳＯ３に進み、後方検索を表すフラグ値「１」を検索フラグｉｄｅｓにセットすると共に、ポインタｎｇｒを検索ポインタｎｇｒｐｒｏｇにセットし、さらにレジスタｎｇｒＳｔの値をレジスタｎｇｒｔｅｒｍにストアする。
【０１３１】
次いで、ステップＳＯ４では、検索ポインタｎｇｒｐｒｏｇを、レジスタｎｇｒｓｌｓにストアする。次に、ステップＳＯ５では、検索ポインタｎｇｒｐｒｏｇで指定される時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒｐｒｏｇ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒｐｒｏｇ．ｉＰｏｓｍｉｎ）を、レジスタｉＰｏｓＭａｘ、ｉＰｏｓｍｉｎにそれぞれストアする。また、ステップＳＯ５では、鍵盤座標平均値（（ｎｇｒｐｒｏｇ．ｉＰｏｓＭａｘ＋ｎｇｒｐｒｏｇ．ｉＰｏｓｍｉｎ）／２）と演奏者の手の幅の半値ｉＨａｎｄＨａｌｆとを加算した初期許容最大幅ｉＲｎｇＭａｘおよび鍵盤座標平均値（（ｎｇｒｐｒｏｇ．ｉＰｏｓＭａｘ＋ｎｇｒｐｒｏｇ．ｉＰｏｓｍｉｎ）／２）から演奏者の手の幅の半値ｉＨａｎｄＨａｌｆを減算した初期許容最小幅ｉＲｎｇｍｉｎを算出する。
【０１３２】
次に、ステップＳＯ６では、検索ポインタｎｇｒｐｒｏｇの値がレジスタｎｇｒｔｅｒｍに一致していないか否か、つまり極点から極点までの区間内で移動位置を特定し終えたかどうかを判断する。移動位置を特定し終えた場合には、判断結果が「ＮＯ」となり、本処理を終えるが、そうでなければ、判断結果は「ＹＥＳ」になり、ステップＳＯ７に進む。
【０１３３】
ステップＳＯ７〜ＳＯ９では、検索フラグｉｄｅｓｔの値に応じて、検索ポインタｎｇｒｐｒｏｇをインクリメント（前方検索時）あるいはデクリメント（後方検索時）する。次いで、ステップＳＯ１０では、前方検索（あるいは後方検索）すべく更新された検索ポインタｎｇｒｐｒｏｇで指定される時系列データＮｏｔｅＧｒｏｕｐ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｎｇｒｐｒｏｇ．ｉＰｏｓＭａｘ）および鍵盤座標最小値ｉＰｏｓｍｉｎ（ｎｇｒｐｒｏｇ．ｉＰｏｓｍｉｎ）を、レジスタｉｔｍｐＰｏｓＭａｘ、ｉｔｍｐＰｏｓｍｉｎにそれぞれストアする一方、鍵盤座標平均値（（ｎｇｒｐｒｏｇ．ｉＰｏｓＭａｘ＋ｎｇｒｐｒｏｇ．ｉＰｏｓｍｉｎ）／２）に、演奏者の手の幅の半値ｉＨａｎｄＨａｌｆを加算した許容最大幅ｉｔｍｐＲｎｇＭａｘと、鍵盤座標平均値（（ｎｇｒｐｒｏｇ．ｉＰｏｓＭａｘ＋ｎｇｒｐｒｏｇ．ｉＰｏｓｍｉｎ）／２）から演奏者の手の幅の半値ｉＨａｎｄＨａｌｆを減算した許容最小幅ｉｔｍｐＲｎｇｍｉｎとを算出する。
【０１３４】
次に、ステップＳＯ１１では、初期許容最大幅ｉＲｎｇＭａｘおよび許容最大幅ｉｔｍｐＲｎｇＭａｘの内で小さい方の値が、レジスタｉＰｏｓＭａｘに格納される鍵盤座標最大値ｉＰｏｓＭａｘより大きいか、あるいは初期許容最小幅ｉＲｎｇｍｉｎおよび許容最小幅ｉｔｍｐＲｎｇｍｉｎの内で大きい方の値が、レジスタｉＰｏｓｍｉｎに格納される鍵盤座標最小値ｉＰｏｓｍｉｎより小さいかを判断する。つまり、手の移動が必要かどうかを判断する。手の移動が不必要ならば、判断結果は「ＮＯ」になり、ステップＳＯ１５に進み、レジスタｉＰｏｓＭａｘ、ｉＰｏｓｍｉｎ、初期許容最大幅ｉＲｎｇＭａｘおよび初期許容最小幅ｉＲｎｇｍｉｎを更新する。
【０１３５】
すなわち、ステップＳＯ１５では、レジスタｉＰｏｓＭａｘおよび許容最大幅ｉｔｍｐＲｎｇＭａｘの内で値が大きい方を、レジスタｉＰｏｓＭａｘにストアする。また、レジスタｉＰｏｓｍｉｎおよび許容最小幅ｉｔｍｐＲｎｇｍｉｎの内で値が小さい方を、レジスタｉＰｏｓｍｉｎにストアする。さらに、初期許容最大幅ｉＲｎｇＭａｘおよび許容最大幅ｉｔｍｐＲｎｇＭａｘの内で値が小さい方を、初期許容最大幅ｉＲｎｇＭａｘとして登録すると共に、初期許容最小幅ｉＲｎｇｍｉｎおよび許容最小幅ｉｔｍｐＲｎｇｍｉｎの内で値が大きい方を初期許容最小幅ｉＲｎｇｍｉｎとして登録する。この後、上述のステップＳＯ６に処理を戻し、極点から極点までの区間内で移動位置を特定し終えたかどうかを再び判断する。
【０１３６】
一方、手の移動が必要の場合には、上記ステップＳＯ１１の判断結果が「ＹＥＳ」になり、ステップＳＯ１２に進み、現在特定されている手の位置を表す動作データＨａｎｄＰｏｓを登録する動作データ挿入処理を実行する。次いで、ステップＳＯ１３では、検索ポインタｎｇｒｐｒｏｇを、レジスタｎｇｒｓｌｓにストアする。そして、ステップＳＯ１４では、レジスタｉｔｍｐＰｏｓＭａｘの値をレジスタｉＰｏｓＭａｘに、レジスタｉｔｍｐＰｏｓｍｉｎの値をレジスタｉＰｏｓｍｉｎに、許容最大幅ｉｔｍｐＲｎｇＭａｘを初期許容最大幅ｉＲｎｇＭａｘに、許容最小幅ｉｔｍｐＲｎｇｍｉｎを初期許容最小幅ｉＲｎｇｍｉｎに、それぞれ更新登録する。この後、上述のステップＳＯ６に処理を戻し、極点から極点までの区間内で移動位置を特定し終えたかどうかを再び判断する。
【０１３７】
このように、移動位置の特定処理では、曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間において、時系列データＮｏｔｅＧｒｏｕｐで定義される鍵盤座標最大値ｉＰｏｓＭａｘと鍵盤座標最小値ｉＰｏｓｍｉｎとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
【０１３８】
（５）動作データ挿入処理の動作
次に、図２３を参照して動作データ挿入処理の動作について説明する。上述した移動位置の特定処理におけるステップＳＯ１２（図２２参照）を介して本処理が実行されると、ＣＰＵ１は図２３に図示するステップＳＰ１に進み、動作データＨａｎｄＰｏｓ（図１９参照）の空き位置をポインタｈｐＩｎｓに設定する。続いて、ステップＳＰ２では、ポインタｈｐＩｎｓで指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最大値ｉＰｏｓＭａｘおよび鍵盤座標最小値ｉＰｏｓｍｉｎとして、レジスタｉＰｏｓＭａｘ、ｉＰｏｓｍｉｎの各値をストアする。そして、ステップＳＰ３では、検索フラグｉｄｅｓｔが「０」、つまり前方検索中であるか否かを判断する。
【０１３９】
前方検索中であると、判断結果は「ＹＥＳ」になり、ステップＳＰ４に進み、レジスタｎｇｒｓｌｓに格納されるポインタ（極点の始りを指定するポインタｎｇｒ）が指定する時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ＩＴｉｍｅ（ｎｇｒｓｌｓ．ｌＴｉｍｅ）を、ポインタｈｐＩｎｓで指定される動作データＨａｎｄＰｏｓ中の開始時刻ＩＴｉｍｅとして登録し、さらに、検索ポインタｎｇｒｐｒｏｇが指定する時系列データの１つ前の時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ＩＴｉｍｅ（ｎｇｒｐｒｏｇ．ｐｒｅｖ．ｌＴｉｍｅ）を、ポインタｈｐＩｎｓで指定される動作データＨａｎｄＰｏｓ中の終了時刻ＩＴｅｒｍとして登録する。
【０１４０】
一方、後方検索中であれば、上記ステップＳＰ３の判断結果が「ＮＯ」になり、ステップＳＰ５に進み、検索ポインタｎｇｒｐｒｏｇが指定する時系列データの次の時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ＩＴｉｍｅ（ｎｇｒｐｒｏｇ．ｎｅｘｔ．ｌＴｉｍｅ）を、ポインタｈｐＩｎｓで指定される動作データＨａｎｄＰｏｓ中の開始時刻ＩＴｉｍｅとして登録し、さらにレジスタｎｇｒｓｌｓに格納されるポインタ（極点の始りを指定するポインタｎｇｒ）が指定する時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ＩＴｉｍｅ（ｎｇｒｓｌｓ．ｌＴｉｍｅ）を、ポインタｈｐＩｎｓで指定される動作データＨａｎｄＰｏｓ中の終了時刻ＩＴｅｒｍとして登録する。
【０１４１】
次いで、ステップＳＰ６〜ＳＰ９では、検索ポインタｈｐＴｍｐに、最初の動作データＨａｎｄＰｏｓを指定するポインタ値をセットした後、ポインタｈｐＩｎｓ−１に達するまで検索ポインタｈｐＴｍｐを歩進させる。そして、検索ポインタｈｐＴｍｐがポインタｈｐＩｎｓの１つ前に達すると、ステップＳＰ８の判断結果が「ＹＥＳ」になり、ステップＳＰ９に進み、検索ポインタｈｐＴｍｐで指定される動作データＨａｎｄＰｏｓ中のポインタｎｅｘｔ（ｈｐＴｍｐ．ｎｅｘｔ）に、新たに挿入した動作データを指定するポインタｈｐＩｎｓをストアする一方、ポインタｈｐＩｎｓで指定される動作データＨａｎｄＰｏｓ中のポインタｐｒｅｖ（ｈｐＩｎｓ．ｐｒｅｖ）に、検索ポインタｈｐＴｍｐをストアして本処理を終える。
【０１４２】
（６）運指データ生成処理の動作
次に、図２４を参照して運指データ生成処理の動作について説明する。上述したメインルーチンのステップＳＭ５（図２０参照）を介して本処理が実行されると、ＣＰＵ１は図２４に図示するステップＳＱ１に進み、時系列データＮｏｔｅＧｒｏｕｐを指定するポインタｎｇｒ、ノートデータＮｏｔｅを指定するポインタｎＴｍｐおよび動作データＨａｎｄＰｏｓを指定するポインタｈｐＴｍｐをゼロリセットする。
続いて、ステップＳＱ２では、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｈｐＴｍｐ．ｉＰｏｓＭａｘ）を、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）にストアすると共に、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｈｐＴｍｐ．ｉＰｏｓｍｉｎ）を、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）にストアする
【０１４３】
次いで、ステップＳＱ３を介して図１４に図示する手の移動処理を実行する。前述したように、手の移動処理では、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。こうして、最初の手の位置が定まると、ステップＳＱ４に進み、ポインタｈｐＴｍｐを歩進させる。そして、ステップＳＱ５〜ＳＱ１５では、ポインタｎｇｒの歩進に応じて指の状態確認処理を行う一方、動作データＨａｎｄＰｏｓを参照して手の位置を移動させつつ、ノートデータＮｏｔｅに基づき運指割当てを行う。
【０１４４】
すなわち、先ずステップＳＱ５では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐが「ＮＵＬＬ」、すなわち運指データを生成し終えたかどうかを判断する。運指データを生成し終える迄、ここでの判断結果は「ＹＥＳ」となり、ステップＳＱ５〜ＳＱ１５を繰り返す。
次に、ステップＳＱ６では、図１５に図示する指の状態確認処理を実行する。前述したように、指の状態確認処理では、押鍵中の指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する。そして、ステップＳＱ７に進み、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中のノートデータポインタＮｏｔｅＥｖを、ポインタｎＴｍｐにセットする。
【０１４５】
次いで、ステップＳＱ８〜ＳＱ１０では、ポインタｎＴｍｐで指定されるノートデータＮｏｔｅが無くなる迄、ポインタｎＴｍｐを歩進させながらステップＳＱ９を介して図１６に図示する「指の割当処理」を実行する。前述したように、指の割当処理では、割当てポインタｉｄｘで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てする。
こうして、運指割当てがなされると、ステップＳＱ１１に進み、ポインタｈｐＴｍｐで指定される動作データＨａｎｄＰｏｓ中の開始時刻ｌＴｉｍｅ（ｈｐＴｍｐ．ｌＴｉｍｅ）が、次の時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ｌＴｉｍｅ（ｎｇｒ．ｎｅｘｔ．ｌＴｉｍｅ）より前であるか否かを判断する。つまり、次の時系列データＮｏｔｅＧｒｏｕｐが、鍵操作する動作の切れ目の前か後かを判断する。
【０１４６】
ここで、次の時系列データＮｏｔｅＧｒｏｕｐが、鍵操作する動作の切れ目の前であると、判断結果は「ＮＯ」となり、ステップＳＱ１５に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようにポインタｎｇｒを歩進させた後、前述のステップＳＱ５に処理を戻す。
一方、次の時系列データＮｏｔｅＧｒｏｕｐが、鍵操作する動作の切れ目の後であれば、上記ステップＳＱ１１の判断結果は「ＹＥＳ」となり、ステップＳＱ１２に進む。ステップＳＱ１２では、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｈｐＴｍｐ．ｉＰｏｓＭａｘ）を、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）にストアすると共に、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｈｐＴｍｐ．ｉＰｏｓｍｉｎ）を、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）にストアする。
【０１４７】
この後、ステップＳＱ１３に進み、ポインタｈｐＴｍｐを歩進させ、続くステップＳＱ１４では、前述のステップＳＱ３と同様、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する手の移動処理（図１４参照）を実行する。そして、ステップＳＱ１５に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようにポインタｎｇｒを歩進させてから前述のステップＳＱ５に処理を戻す。
【０１４８】
このように、運指データ生成処理では、最初に動作データＨａｎｄＰｏｓを参照して手の位置を定めてから、割当てポインタｉｄｘで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行い、以後、鍵操作する動作の切れ目になる毎に、動作データＨａｎｄＰｏｓを参照して手の位置を定めて運指割当てして行くようになっている。
【０１４９】
（７）運指データ評価処理の動作
次に、図２５を参照して運指データ評価処理の動作について説明する。上述したメインルーチンのステップＳＭ６（図２０参照）を介して本処理が実行されると、ＣＰＵ１は図２５に図示するステップＳＲ１に進み、時系列データＮｏｔｅＧｒｏｕｐを指定するポインタｎｇｒ、ノートデータＮｏｔｅを指定するポインタｎＴｍｐおよび動作データＨａｎｄＰｏｓを指定するポインタｈｐＴｍｐをゼロリセットする。
続いて、ステップＳＲ２では、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算するカウンタｉＣｏｓｔをゼロリセットする。なお、カウンタｉＣｏｓｔの値は、後述するように、運指データに対する「弾き難さ」を表す。つまり、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算した値（差分累算値）が小さければ、指の移動量が少なく弾き易い運指となり、一方、差分累算値が大きいと、指の移動量が多く弾き難い運指となる。
【０１５０】
次いで、ステップＳＲ３では、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｈｐＴｍｐ．ｉＰｏｓＭａｘ）を、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）にストアすると共に、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｈｐＴｍｐ．ｉＰｏｓｍｉｎ）を、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）にストアする。この後、ステップＳＲ４を介して図１４に図示する手の移動処理を実行し、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する。こうして、最初の手の位置が定まると、ステップＳＲ５に進み、ポインタｈｐＴｍｐを歩進させる。
【０１５１】
そして、ステップＳＲ６では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐが「ＮＵＬＬ」、すなわち運指データを評価し終えたかどうかを判断する。運指データを評価し終える迄、ここでの判断結果は「ＹＥＳ」となり、後述するステップＳＲ７〜ＳＲ１６を繰り返す。
ステップＳＲ７では、ポインタｎｇｒで指定される時系列データＮｏｔｅＧｒｏｕｐ中のノートデータポインタＮｏｔｅＥｖを、ポインタｎＴｍｐにセットする。続いて、ステップＳＲ８〜ＳＲ１１では、ポインタｎＴｍｐが「ＮＵＬＬ」に達するまで歩進させ、歩進されるポインタｎＴｍｐで指定されるノートデータＮｏｔｅ中の運指番号ｃｆｉｇ（運指データ）をレジスタｉｆｉｇにストアし、レジスタｉｆｉｇにストアされた運指番号ｃｆｉｇに対応した手の状態データＨａｎｄ中の指座標ｉＰｏｓ（Ｈａｎｄ．ｆｉｇ［ｉｆｉｇ］．ｉＰｏｓ）とポインタｎＴｍｐで指定されるノートデータＮｏｔｅ中の鍵盤座標ｉＰｏｓ（ｎＴｍｐ．ｉＰｏｓ）との絶対差分を累算してカウンタｉＣｏｓｔにストアする。
【０１５２】
こうして、全ての運指データに基づき「弾き難さ」を表す値（差分累算値）がカウンタｉＣｏｓｔにストアされると、ステップＳＲ８の判断結果が「ＮＯ」になり、ステップＳＲ１２に進む。ステップＳＲ１２では、ポインタｈｐＴｍｐで指定される動作データＨａｎｄＰｏｓ中の開始時刻ｌＴｉｍｅ（ｈｐＴｍｐ．ｌＴｉｍｅ）が、次の時系列データＮｏｔｅＧｒｏｕｐ中の発音開始時刻ｌＴｉｍｅ（ｎｇｒ．ｎｅｘｔ．ｌＴｉｍｅ）より前であるか否かを判断する。つまり、次の時系列データＮｏｔｅＧｒｏｕｐが、鍵操作する動作の切れ目の前か後かを判断する。
【０１５３】
ここで、次の時系列データＮｏｔｅＧｒｏｕｐが、鍵操作する動作の切れ目の前であると、判断結果は「ＮＯ」となり、ステップＳＲ１６に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようにポインタｎｇｒを歩進させた後、前述のステップＳＲ６に処理を戻す。
一方、次の時系列データＮｏｔｅＧｒｏｕｐが、鍵操作する動作の切れ目の後であれば、上記ステップＳＲ１２の判断結果は「ＹＥＳ」となり、ステップＳＲ１３に進む。ステップＳＲ１３では、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最大値ｉＰｏｓＭａｘ（ｈｐＴｍｐ．ｉＰｏｓＭａｘ）を、手の状態データＨａｎｄ中の鍵盤座標最大値ｉＰｏｓＭａｘ（Ｈａｎｄ．ｉＰｏｓＭａｘ）にストアすると共に、ポインタｈｐＴｍｐにて指定される動作データＨａｎｄＰｏｓ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（ｈｐＴｍｐ．ｉＰｏｓｍｉｎ）を、手の状態データＨａｎｄ中の鍵盤座標最小値ｉＰｏｓｍｉｎ（Ｈａｎｄ．ｉＰｏｓｍｉｎ）にストアする。
【０１５４】
この後、ステップＳＲ１４に進み、ポインタｈｐＴｍｐを歩進させ、続くステップＳＲ１５では、前述のステップＳＲ４と同様、手の位置座標ｉＰｏｓ（Ｈａｎｄ．ｉＰｏｓ）として中指座標Ｈａｎｄ．ｆｉｇ［２］．ｉＰｏｓを設定する手の移動処理（図１４参照）を実行する。そして、ステップＳＲ１６に進み、次の時系列データＮｏｔｅＧｒｏｕｐを指定するようにポインタｎｇｒを歩進させてから前述のステップＳＲ６に処理を戻す。
このように、運指データ評価処理では、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算し、「弾き難さ」を表す値をカウンタｉＣｏｓｔにストアするようになっている。
【０１５５】
以上説明したように、第２実施形態では、曲演奏に必要な手の移動位置を表す動作データを生成した後、生成された動作データＨａｎｄＰｏｓで定義される手の位置とそれに応じた指の位置とを勘案して運指データを生成し、さらに生成された運指データの「弾き難さ」を評価する。そして、評価回数が再評価回数最大値ＭＡＸＲＥＴＲＹが超えるまで、あるいは評価された「弾き難さ」（平均値ａｖｅｒａｇｅ（ｉＣｏｓｔ））が許容範囲値ＡＲＲＯＷＥＤＣＯＳＴに収まるまで乱数変化させた手の幅の半値ｉＨａｎｄＨａｌｆに基づき動作データＨａｎｄＰｏｓを再生成し、それに応じた運指データ生成および評価を繰り返して弾き易い運指データを得るようにしたので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
【０１５６】
なお、第２実施形態では、動作データＨａｎｄＰｏｓを参照して手の位置を定め、その手の位置における各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てするようにしたが、これに替えて、前述した第１実施形態の変形例を適用し、動作データＨａｎｄＰｏｓを参照して手の位置を定め、その手の位置における各指の内、押鍵すべき鍵との離間距離が最短となる指を、弾くべき指として運指割当てする態様としても構わない。
【図面の簡単な説明】
【０１５７】
【図１】本発明による第１実施形態の構成を示すブロック図である。
【図２】ＲＡＭ３のワークエリアに設けられるオンバッファデータの構成を示す図である。
【図３】ＲＡＭ３のデータエリアに設けられる楽曲データの構成を示す図である。
【図４】ＲＡＭ３のデータエリアに設けられる時系列データの構成を示す図である。
【図５】ＲＡＭ３のデータエリアに設けられるノートデータの構成を示す図である。
【図６】ＲＡＭ３のデータエリアに設けられるフレーズデータの構成を示す図である。
【図７】ＲＡＭ３のワークエリアに設けられる手の状態データの構成を示す図である。
【図８】第１実施形態によるメインルーチンの動作を示すフローチャートである。
【図９】第１実施形態による時系列データ生成処理の動作を説明するためのフローチャートである。
【図１０】第１実施形態による音列解析処理の動作を説明するためのフローチャートである。
【図１１】第１実施形態による極大／極小値処理の動作を説明するためのフローチャートである。
【図１２】第１実施形態による近傍データ処理の動作を説明するためのフローチャートである。
【図１３】第１実施形態による運指データ生成処理の動作を説明するためのフローチャートである。
【図１４】第１実施形態による手の移動処理の動作を説明するためのフローチャートである。
【図１５】第１実施形態による指の状態確認処理の動作を説明するためのフローチャートである。
【図１６】第１実施形態による指の割当処理の動作を説明するためのフローチャートである。
【図１７】第１実施形態による指の位置指定処理の動作を説明するためのフローチャートである。
【図１８】第１実施形態の変形例による指の割当処理の動作を説明するためのフローチャートである。
【図１９】ＲＡＭ３のワークエリアに設けられる動作データの構成を示す図である。
【図２０】第２実施形態によるメインルーチンの動作を説明するためのフローチャートである。
【図２１】第２実施形態による動作データ生成処理の動作を説明するためのフローチャートである。
【図２２】第２実施形態による移動位置の特定処理の動作を説明するためのフローチャートである。
【図２３】第２実施形態による動作データ挿入処理の動作を説明するためのフローチャートである。
【図２４】第２実施形態による運指データ生成処理の動作を説明するためのフローチャートである。
【図２５】第２実施形態による運指データ評価処理の動作を説明するためのフローチャートである。
【符号の説明】
【０１５８】
１  ＣＰＵ
２  ＲＯＭ
３  ＲＡＭ
４  入力部
５  表示部
６  ＭＩＤＩインタフェース
７  電子楽器
【図１】
2006154121.tif 000003
【図２】
2006154121.tif 000004
【図３】
2006154121.tif 000005
【図４】
2006154121.tif 000006
【図５】
2006154121.tif 000007
【図６】
2006154121.tif 000008
【図７】
2006154121.tif 000009
【図８】
2006154121.tif 000010
【図９】
2006154121.tif 000011
【図１０】
2006154121.tif 000012
【図１１】
2006154121.tif 000013
【図１２】
2006154121.tif 000014
【図１３】
2006154121.tif 000015
【図１４】
2006154121.tif 000016
【図１５】
2006154121.tif 000017
【図１６】
2006154121.tif 000018
【図１７】
2006154121.tif 000019
【図１８】
2006154121.tif 000020
【図１９】
2006154121.tif 000021
【図２０】
2006154121.tif 000022
【図２１】
2006154121.tif 000023
【図２２】
2006154121.tif 000024
【図２３】
2006154121.tif 000025
【図２４】
2006154121.tif 000026
【図２５】
2006154121.tif 000027