(57)【特許請求の範囲】
【請求項１】
曲を構成する各音を表すと共に、当該各音にはフレーズ番号をあらわすデータが付与可能な演奏データを記憶する記憶手段と、
前記記憶手段に記憶された演奏データの中で処理対象とする演奏パートの演奏データから連続する所定音数分の音列を参照フレーズとして設定する参照フレーズ設定手段と、
この設定された参照フレーズ以降の演奏データを、前記所定個数分ずつ順に区切ることにより比較フレーズを複数設定する比較フレーズ設定手段と、
この設定された各比較フレーズと前記参照フレーズとが一致するか否か順次判別する判別手段と、
前記判別手段により一致判別されなかった比較フレーズが存在する場合に、前記参照フレーズ設定手段に対して当該一致と判別されなかった比較フレーズのひとつを参照フレーズとして再設定させ、前記判別手段に対して当該再設定された参照フレーズと他の一致判別されなかった比較フレーズとが一致するか否か判別させる動作を繰り返させる制御手段と、
前記判別手段により一致判別された比較フレーズ及び前記参照フレーズに含まれる音に対して同一のフレーズ番号を付加するフレーズ番号付与手段と、
前記フレーズ番号付与手段により同一のフレーズ番号が連続して付与された音列をひとつのフレーズ区間として登録するフレーズ区間登録手段と、
このフレーズ区間登録手段にて登録された各フレーズ区間に含まれる音数から区間当りの平均構成音数を算出する算出手段と、
前記フレーズ区間登録手段により登録されたフレーズ区間に含まれる音列の音数が前記算出された平均構成音数の２倍を超えるか否か判別し、超える場合は当該フレーズ区間に含まれる演奏データを平均構成音数ずつに分割し、分割した平均構成音数の演奏データ夫々に対して運指生成する動作を同時に行わせるととともに、平均構成音数を超えない場合は当該フレーズ区間に含まれる全ての演奏データを用いて運指生成する動作を行う運指生成手段と、
を具備することを特徴とする運指情報生成装置。
【請求項２】
曲を構成する各音を表すと共に、当該各音にはフレーズ番号をあらわすデータが付与可能な演奏データを記憶する記憶手段に記憶された演奏データの中から処理対象とする演奏パートの演奏データの中から連続する所定音数分を参照フレーズとして設定する参照フレーズ設定ステップと、
この設定された参照フレーズ以降の演奏データを、前記所定個数分ずつ順に区切ることにより比較フレーズを複数設定する比較フレーズ設定ステップと、
この設定された各比較フレーズと前記参照フレーズとが一致するか否か順次判別する判別ステップと、
前記判別ステップにより一致判別されなかった比較フレーズが存在する場合に、当該一致と判別されなかった比較フレーズのひとつを参照フレーズとして再設定し、当該再設定された参照フレーズと他の一致判別されなかった比較フレーズとが一致するか否か判別させる動作を繰り返す制御ステップと、
前記判別ステップにより一致判別された比較フレーズ及び前記参照フレーズに対して同一のフレーズ番号を付加するフレーズ番号付与ステップと、
前記フレーズ番号付与ステップにより同一のフレーズ番号が連続して付与された音列をひとつのフレーズ区間として登録するフレーズ区間登録ステップと、
このフレーズ区間登録ステップにて登録された各フレーズ区間に含まれる音数から区間当りの平均構成音数を算出する算出ステップと、
前記フレーズ区間登録ステップにより登録されたフレーズ区間に含まれる音列の音数が前記算出された平均構成音数の２倍を超えるか否か判別し、超える場合は当該フレーズ区間に含まれる演奏データを平均構成音数ずつに分割し、分割した平均構成音数の演奏データ夫々に対して運指生成する動作を同時に行わせるととともに、平均構成音数を超えない場合は当該フレーズ区間に含まれる全ての演奏データを用いて運指生成する動作を行う運指生成ステップと、
をコンピュータに実行させる運指情報生成処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、鍵盤を備えた電子楽器に用いて好適な運指情報生成装置および運指情報生成処理プログラムに関する。
【背景技術】
【０００２】
鍵操作する際の指使い（運指）を演奏者に案内する運指情報を発生する装置が知られている。例えば特許文献１には、隣り合う２つの音に対して鍵盤を操作したときの指使いの容易さを表す２音運指データをそれぞれの指の組合わせに対応付けて記憶しておき、その内から演奏データ（与えられたメロディの音列）に対応する２音運指データを読み出し、読み出した２音運指データの累算値を最適にする運指を決定して運指情報を発生させる装置が開示されている。
【０００３】
【特許文献１】特許第２５２６９５４号明細書
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ところで、上記特許文献１に開示された運指生成手法の他に、所定数の演奏データについて考えられる全ての指使い（運指）を評価し、その中から最適な運指を決定する手法も知られているが、そうした手法では考えられる全ての指使いについて個々に評価することから処理負荷が大きく膨大な処理時間を要するという問題がある。
そこで本発明は、このような事情に鑑みてなされたもので、処理負荷を低減させて処理時間の短縮化を図ることができる運指情報生成装置および運指情報生成処理プログラムを提供することを目的としている。
【課題を解決するための手段】
【０００５】
上記目的を達成するため、請求項１に記載の発明では、曲を構成する各音を表すと共に、当該各音にはフレーズ番号をあらわすデータが付与可能な演奏データを記憶する記憶手段と、前記記憶手段に記憶された演奏データの中で処理対象とする演奏パートの演奏データから連続する所定音数分の音列を参照フレーズとして設定する参照フレーズ設定手段と、この設定された参照フレーズ以降の演奏データを、前記所定個数分ずつ順に区切ることにより比較フレーズを複数設定する比較フレーズ設定手段と、この設定された各比較フレーズと前記参照フレーズとが一致するか否か順次判別する判別手段と、前記判別手段により一致判別されなかった比較フレーズが存在する場合に、前記参照フレーズ設定手段に対して当該一致と判別されなかった比較フレーズのひとつを参照フレーズとして再設定させ、前記判別手段に対して当該再設定された参照フレーズと他の一致判別されなかった比較フレーズとが一致するか否か判別させる動作を繰り返させる制御手段と、前記判別手段により一致判別された比較フレーズ及び前記参照フレーズに含まれる音に対して同一のフレーズ番号を付加するフレーズ番号付与手段と、前記フレーズ番号付与手段により同一のフレーズ番号が連続して付与された音列をひとつのフレーズ区間として登録するフレーズ区間登録手段と、このフレーズ区間登録手段にて登録された各フレーズ区間に含まれる音数から区間当りの平均構成音数を算出する算出手段と、前記フレーズ区間登録手段により登録されたフレーズ区間に含まれる音列の音数が前記算出された平均構成音数の２倍を超えるか否か判別し、超える場合は当該フレーズ区間に含まれる演奏データを平均構成音数ずつに分割し、分割した平均構成音数の演奏データ夫々に対して運指生成する動作を同時に行わせるととともに、平均構成音数を超えない場合は当該フレーズ区間に含まれる全ての演奏データを用いて運指生成する動作を行う運指生成手段と、を具備することを特徴とする。
【０００９】
請求項２に記載の発明では、曲を構成する各音を表すと共に、当該各音にはフレーズ番号をあらわすデータが付与可能な演奏データを記憶する記憶手段に記憶された演奏データの中から処理対象とする演奏パートの演奏データの中から連続する所定音数分を参照フレーズとして設定する参照フレーズ設定ステップと、この設定された参照フレーズ以降の演奏データを、前記所定個数分ずつ順に区切ることにより比較フレーズを複数設定する比較フレーズ設定ステップと、この設定された各比較フレーズと前記参照フレーズとが一致するか否か順次判別する判別ステップと、前記判別ステップにより一致判別されなかった比較フレーズが存在する場合に、当該一致と判別されなかった比較フレーズのひとつを参照フレーズとして再設定し、当該再設定された参照フレーズと他の一致判別されなかった比較フレーズとが一致するか否か判別させる動作を繰り返す制御ステップと、前記判別ステップにより一致判別された比較フレーズ及び前記参照フレーズに対して同一のフレーズ番号を付加するフレーズ番号付与ステップと、前記フレーズ番号付与ステップにより同一のフレーズ番号が連続して付与された音列をひとつのフレーズ区間として登録するフレーズ区間登録ステップと、このフレーズ区間登録ステップにて登録された各フレーズ区間に含まれる音数から区間当りの平均構成音数を算出する算出ステップと、前記フレーズ区間登録ステップにより登録されたフレーズ区間に含まれる音列の音数が前記算出された平均構成音数の２倍を超えるか否か判別し、超える場合は当該フレーズ区間に含まれる演奏データを平均構成音数ずつに分割し、分割した平均構成音数の演奏データ夫々に対して運指生成する動作を同時に行わせるととともに、平均構成音数を超えない場合は当該フレーズ区間に含まれる全ての演奏データを用いて運指生成する動作を行う運指生成ステップと、をコンピュータに実行させることを特徴とする。
【発明の効果】
【００１１】
請求項１、２に記載の発明によれば、曲を構成する各音を表すと共に、各音の演奏パートを表す演奏データをフレーズ区間に分割し、分割された各フレーズ区間に含まれる音数から区間当りの平均構成音数を算出する動作を各演奏パート毎に並列的に行わせつつ、分割されたフレーズ区間が平均構成音数を超える場合は平均構成音数ずつに分割した演奏データを用いて運指生成する動作を各フレーズ区間毎に並列的に行わせ、平均構成音数を超えない場合は該当フレーズを構成する全ての演奏データを用いて運指生成する動作を各フレーズ区間毎に並列的に行わせる為、負荷分散により処理負荷を低減させて処理時間の短縮化を図ることができる。
【発明を実施するための最良の形態】
【００１２】
以下、図面を参照して本発明の実施形態について説明する。
Ａ．第１実施形態
（１）構成
図１は、本発明の第１実施形態による運指情報生成装置の全体構成を示すブロック図である。運指情報生成装置は、ＣＰＵ１、ＲＯＭ２、ＲＡＭ３、入力部４、表示部５およびＭＩＤＩインタフェース６を備える。ＣＰＵ１は、マルチスレッドに対応したＯＳ上で複数のスレッド（ソフトウェア実行単位）を時分割に実行して見かけ上、リアルタイム並列処理を実現するものであり、具体的には後述するメインルーチン（プライマリスレッド）が各トラック（演奏パート）毎に運指生成スレッドを起動させて各トラック毎の運指生成を並列処理する。
【００１３】
ＲＯＭ２は、ＣＰＵ１にロードされる各種制御プログラムやテーブル等を記憶する。ここで言う各種制御プログラムとは、メインルーチン（プライマリスレッド）、運指生成スレッドおよび運指系列選択処理を含む。ＲＡＭ３は、ＣＰＵ１において用いられる各種レジスタ・フラグデータを一時記憶するワークエリアと、ＭＩＤＩインタフェース６を介して外部の電子楽器７より取り込んだＳＭＦ形式の曲データを、後述する演奏データＭｉｄｉＥｖｅｎｔに変換して記憶する演奏データエリアと、この演奏データエリアに格納される演奏データＭｉｄｉＥｖｅｎｔをパート別に管理するトラックデータＴｒａｃｋを記憶するトラックデータエリアとを備える。これらＲＡＭ３に格納される主要なデータ構成については追って説明する。入力部４は、ユーザ操作に対応した操作イベントを発生してＣＰＵ１に供給する。表示部５は、ＣＰＵ１の制御の下に、例えば演奏データＭｉｄｉＥｖｅｎｔを楽譜表示すると共に、表示された楽譜において、演奏データＭｉｄｉＥｖｅｎｔを構成する各音毎に対応させた運指データを表示する。
【００１４】
（２）データ構成
次に、図２〜図３を参照してＲＡＭ３に設けられるトラックデータエリアおよび演奏データエリアの構成について説明する。図２は、ＲＡＭ３のトラックデータエリアに格納されるトラックデータＴｒａｃｋ［０］〜［Ｎ］の構成を示す図である。１つのトラックデータＴｒａｃｋは、演奏データエリアに格納される演奏データＭｉｄｉＥｖｅｎｔを演奏パート別に管理するデータであり、演奏パートを表すトラック番号ｉＴｒａｃｋ、パート番号ｉＰａｒｔ、ポインタｐＮｏｔｅ、ポインタｐｒｅｖおよびポインタｎｅｘｔから構成される。なお、パート番号ｉＰａｒｔは、「０」の場合に右手パートを、「１」の場合に左手パートを表す。ポインタｐＮｏｔｅは、トラック番号ｉＴｒａｃｋの先頭の演奏データＭｉｄｉＥｖｅｎｔを指定する。ポインタｐｒｅｖは１つ前の演奏データＭｉｄｉＥｖｅｎｔを指定する。ポインタｎｅｘｔは１つ後の演奏データＭｉｄｉＥｖｅｎｔを指定する。
【００１５】
図３は、ＲＡＭ３の演奏データエリアに格納される演奏データＭｉｄｉＥｖｅｎｔの構成を示す図である。演奏データＭｉｄｉＥｖｅｎｔ［０］〜［Ｎ］は、曲を構成する各音を表し、その終端にはＥＮＤデータを備える。演奏データＭｉｄｉＥｖｅｎｔは、発音開始時刻ＩＴｉｍｅ、音長ｌＧａｔｅ、フレーズ番号ｉＰｈｒａｓｅ、フレーズ内番号ｉＰｏｒｄｅｒ、音高Ｐｉｔｃｈ、運指データｃｆｉｇ、運指評価値ｉＣｏｓｔ、和音判別値ｃＩｓＨａｒｍ、和音先頭ポインタｐｈＴｏｐ、和音終端ポインタｐｈＴａｉｌ、ポインタｐｒｅｖおよびポインタｎｅｘｔから構成される。なお、和音判別値ｃＩｓＨａｒｍは、「０」の場合に和音でない旨を表し、「構成音−１」の値（「１」以上）の場合に和音の旨を表す。和音先頭ポインタｐｈＴｏｐは、和音構成音の内、最も低い音高の音を指定する。和音終端ポインタｐｈＴａｉｌは、和音構成音の内、最も高い音高の音を指定する。ポインタｐｒｅｖは、１つ前の演奏データＭｉｄｉＥｖｅｎｔを指定する。ポインタｎｅｘｔは、次の演奏データＭｉｄｉＥｖｅｎｔを指定する。
【００１６】
Ｂ．動作
次に、図４〜図６を参照して第１実施形態の動作について説明する。以下では、メインルーチン（プライマリスレッド）、運指生成スレッドおよび運指系列選択処理の各動作について述べる。
【００１７】
（１）メインルーチンの動作
入力部４からＣＰＵ１にメイルーチンの実行を指示するイベントが供給されると、ＣＰＵ１は図４に図示するメインルーチンを実行してステップＳＡ１に進み、データ読み込み・演奏データ生成を行う。すなわち、ステップＳＡ１では、ＭＩＤＩインタフェース６を介して外部の電子楽器７からＳＭＦ形式の曲データを取り込み、取り込んだ楽曲データから図３に図示したデータ形式の演奏データＭｉｄｉＥｖｅｎｔ［０］〜［Ｎ］を生成してＲＡＭ３の演奏データエリアに格納すると共に、これら演奏データＭｉｄｉＥｖｅｎｔ［０］〜［Ｎ］をそれぞれ個別に演奏パート別に管理するトラックデータＴｒａｃｋ［０］〜［Ｎ］（図２参照）を生成してＲＡＭ３のトラックデータエリアに格納する。
【００１８】
続いて、ステップＳＡ２では、トラックデータＴｒａｃｋ［０］〜［Ｎ］に基づき全てのトラック（演奏パート）を参照し終えたかどうかを判断する。参照し終えていなければ、判断結果は「ＮＯ」になり、ステップＳＡ３に進む。ステップＳＡ３では、運指生成の対象となるトラック（演奏パート）の先頭の演奏データを指定するポインタｐＮｏｔｅをレジスタｍｅＦｒｏｍにストアすると共に、レジスタｍｅＴｏに曲終端を表す値「０」をストアする。そして、ステップＳＡ４では、レジスタｍｅＦｒｏｍおよびレジスタｍｅＴｏの各値を引数として運指生成スレッドを起動させてから上記ステップＳＡ２に処理を戻す。
【００１９】
以後、トラックデータＴｒａｃｋ［０］〜［Ｎ］に基づき全てのトラック（演奏パート）を参照し終えるまで各トラック毎の運指生成スレッドを起動させる。そして、全トラックについて運指生成スレッドを起動させると、上記ステップＳＡ２の判断結果が「ＹＥＳ」になり、ステップＳＡ５に進む。ステップＳＡ５では、全トラックの運指生成スレッド完了まで待機し、全トラックの運指生成スレッド完了に応じて判断結果が「ＹＥＳ」になり、本処理を完了させる。このように、プライマリスレッドであるメインルーチンでは、トラックデータＴｒａｃｋ［０］〜［Ｎ］に基づき全てのトラック（演奏パート）を参照し終えるまで各トラック毎の運指生成スレッドを起動させ、全トラックの運指生成スレッド完了により本処理を完了させる。
【００２０】
（２）運指生成スレッドの動作
次に、図５を参照して運指生成スレッドの動作を説明する。前述したメインルーチン（図４参照）により運指生成スレッドが起動されると、ＣＰＵ１は図５に図示するステップＳＢ１に進み、メインルーチンからの引数であるレジスタｍｅＦｒｏｍの内容、すなわち運指生成の対象となるトラック（演奏パート）の先頭の演奏データＭｉｄｉＥｖｅｎｔ［ｐＮｏｔｅ］を指定するポインタｐＮｏｔｅをレジスタｍｅおよびレジスタｍｅｔにストアする。続いて、ステップＳＢ２では、先読み回数ＦＩＧＳＴＥＰＳをレジスタｉにストアする。
【００２１】
ステップＳＢ３〜ＳＢ５では、レジスタｉにストアされた先読み回数ＦＩＧＳＴＥＰＳが「０」に達するまでデクリメントさせることによって、レジスタｍｅｔのポインタ（ｍｅｔ．ｎｅｘｔ）を先読み回数ＦＩＧＳＴＥＰＳ分だけ先に進める。レジスタｍｅｔのポインタ（ｍｅｔ．ｎｅｘｔ）を先読み回数ＦＩＧＳＴＥＰＳ分だけ先に進めると、ステップＳＢ３の判断結果が「ＮＯ」になり、ステップＳＢ６に進む。
【００２２】
ステップＳＢ６では、先読み回数ＦＩＧＳＴＥＰＳ分だけ先に進めたポインタ（ｍｅｔ．ｎｅｘｔ）で指定される演奏データＭｉｄｉＥｖｅｎｔ中の和音判別値ｃＩｓＨａｒｍ（ｍｅｔ．ｃＩｓＨａｒｍ）が「０」、つまり和音でないかどうかを判断する。和音でなければ、判断結果は「ＹＥＳ」になり、後述のステップＳＢ８に進む。一方、和音であると、上記ステップＳＢ６の判断結果が「ＮＯ」になり、ステップＳＢ７に進む。ステップＳＢ７では、先読み回数ＦＩＧＳＴＥＰＳ分だけ先に進めたポインタ（ｍｅｔ．ｎｅｘｔ）で指定される演奏データＭｉｄｉＥｖｅｎｔ中の和音終端ポインタｐｈＴａｉｌ（ｍｅｔ．ｐｈＴａｉｌ）をレジスタｍｅｔにストアする。
【００２３】
次いで、ステップＳＢ８では、レジスタｍｅｔのポインタとレジスタｍｅＴｏのポインタとが一致していないか否かを判断する。すなわち、運指生成の対象となる演奏データＭｉｄｉＥｖｅｎｔを指定するポインタ（レジスタｍｅｔ）が終端ポインタ（レジスタｍｅＴｏ）に達していないかどうかを判断する。運指生成の対象となる演奏データＭｉｄｉＥｖｅｎｔを指定するポインタ（レジスタｍｅｔ）が終端ポインタ（レジスタｍｅＴｏ）に達していなければ、判断結果は「ＹＥＳ」になり、ステップＳＢ９を介して運指系列選択処理（後述する）を実行する。
【００２４】
後述するように、運指系列選択処理では、レジスタｍｅｔのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔに基づき、考えられる全ての指使い（運指系列）毎に「弾き難さ」を表す評価値を生成し、その内から最も小さい評価値の運指、すなわち一番弾き易い指使いを選択する。そして、こうした運指系列選択処理が完了すると、ステップＳＢ１０に進み、レジスタｍｅに格納されるポインタにより現在指定されている演奏データＭｉｄｉＥｖｅｎｔ中のポインタｎｅｘｔ（ｍｅ．ｎｅｘｔ）をレジスタｍｅにストアしてポインタ更新すると共に、レジスタｍｅｔに格納されるポインタにより現在指定されている演奏データＭｉｄｉＥｖｅｎｔ中のポインタｎｅｘｔ（ｍｅｔ．ｎｅｘｔ）をレジスタｍｅｔにストアしてポインタ更新する。
【００２５】
次いで、ステップＳＢ１１では、上記ステップＳＢ１０にて更新されたレジスタｍｅｔに格納されるポインタ（ｍｅｔ．ｎｅｘｔ）で指定される演奏データＭｉｄｉＥｖｅｎｔ中の和音判別値ｃＩｓＨａｒｍ（ｍｅｔ．ｃＩｓＨａｒｍ）が「０」、つまり和音でないかどうかを判断する。和音であれば、判断結果は「ＮＯ」になり、ステップＳＢ１２に進み、ポインタ（ｍｅｔ．ｎｅｘｔ）で指定される演奏データＭｉｄｉＥｖｅｎｔ中の和音終端ポインタｐｈＴａｉｌ（ｍｅｔ．ｐｈＴａｉｌ）をレジスタｍｅｔにストアした後、ステップＳＢ２に処理を戻す。一方、和音でなければ、上記ステップＳＢ１１の判断結果が「ＹＥＳ」になり、ステップＳＢ２に処理を戻す。
【００２６】
以後、レジスタｍｅｔのポインタがレジスタｍｅＴｏに格納される終端ポインタに達する迄、前述したステップＳＢ２以降の処理を繰り返す。そして、レジスタｍｅｔのポインタがレジスタｍｅＴｏに格納される終端ポインタに達すると、ステップＳＢ８の判断結果が「ＮＯ」になり、本処理を終える。このように、運指生成スレッドは、メインルーチンから与えられた引数であるレジスタｍｅＦｒｏｍの内容に基づき各トラック（演奏パート）の運指生成をそれぞれ並列的に行うようになっている。
【００２７】
（３）運指系列選択処理の動作
次に、図６を参照して運指系列選択処理の動作を説明する。上述した運指生成スレッドのステップＳＢ９（図５参照）を介して本処理が実行されると、ＣＰＵ１は図６に図示するステップＳＣ１に進む。ステップＳＣ１では、全ての運指系列について評価が完了したか否かを判断する。全ての運指系列について評価し終えていないと、判断結果は「ＮＯ」になり、次のステップＳＣ２に進む。
【００２８】
ステップＳＣ２では、運指系列の評価値を生成してレジスタｉＣｏｓｔにストアする。運指系列の評価値とは、演奏データＭｉｄｉＥｖｅｎｔに対応して運指割当てされる指の座標と弾くべき鍵の座標との関係から得られる「弾き難さ」を表す値である。また、ここで言う運指割当てとは、親指から小指の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として割り当てる処理を指す。次いで、ステップＳＣ３では、レジスタｉＣｏｓｔにストアした運指系列の評価値が、レジスタｉＣｏｓｔ１に格納される最小評価値より小さいか否かを判断する。レジスタｉＣｏｓｔの評価値がレジスタｉＣｏｓｔ１の最小評価値より大きければ、判断結果は「ＮＯ」になり、ステップＳＣ５に進む。
【００２９】
一方、レジスタｉＣｏｓｔの評価値がレジスタｉＣｏｓｔ１の最小評価値より小さいと、上記ステップＳＣ３の判断結果が「ＹＥＳ」になり、ステップＳＣ４に進む。ステップＳＣ４では、レジスタｉＣｏｓｔの評価値を、対応する演奏データＭｉｄｉＥｖｅｎｔ中の運指評価値ｉＣｏｓｔとして更新登録すると共に、運指割り当てされた指を表す運指データを、対応する演奏データＭｉｄｉＥｖｅｎｔ中の運指データｃｆｉｇとして登録する。この後、ステップＳＣ５に進み、レジスタｉＣｏｓｔの評価値をレジスタｉＣｏｓｔ１にストアして最小評価値を更新させてから次の運指系列に移行する。
【００３０】
以後、全ての運指系列について評価し終えまで上述したステップＳＣ１〜ＳＣ５を繰り返す。そして、全ての運指系列について評価し終えると、上記ステップＳＣ１の判断結果が「ＹＥＳ」になり、本処理を完了させる。このように、運指系列選択処理では、運指生成スレッドにて指定された演奏データＭｉｄｉＥｖｅｎｔに基づき、考えられる全ての指使い（運指系列）毎に「弾き難さ」を表す評価値を生成し、その内から最も小さい評価値の運指、すなわち一番弾き易い指使いを選択し、その指使いを表す運指データｃｆｉｇおよび運指評価値ｉＣｏｓｔを、対応する演奏データＭｉｄｉＥｖｅｎｔに登録する。
【００３１】
以上説明したように、第１実施形態では、各トラック（演奏パート）毎に起動した運指生成スレッドにおいて、それぞれ対応するトラックの演奏データＭｉｄｉＥｖｅｎｔに基づき考えられる全ての指使い（運指系列）毎に「弾き難さ」を表す評価値を生成し、その内から最も小さい評価値の運指、すなわち一番弾き易い指使いを選択し、その指使いを表す運指データｃｆｉｇおよび運指評価値ｉＣｏｓｔを対応する演奏データＭｉｄｉＥｖｅｎｔに登録する処理を並列的に行う結果、処理負荷を低減させて処理時間の短縮化を図ることが可能になる。
【００３２】
Ｃ．第２実施形態
次に、図７〜図９を参照して第１実施形態と相違する第２実施形態によるメインルーチン（プライマリスレッド）、トラック処理スレッドおよびフレーズ分割処理の各動作について説明する。なお、第２実施形態の構成は、第１実施形態と共通するので、その説明については省略する。
【００３３】
（１）メインルーチンの動作
入力部４からＣＰＵ１にメイルーチンの実行を指示するイベントが供給されると、ＣＰＵ１は図４に図示するメインルーチンを実行してステップＳＤ１に進み、データ読み込み・演奏データ生成を行う。すなわち、ステップＳＤ１では、ＭＩＤＩインタフェース６を介して外部の電子楽器７からＳＭＦ形式の曲データを取り込み、取り込んだ楽曲データから図３に図示したデータ形式の演奏データＭｉｄｉＥｖｅｎｔ［０］〜［Ｎ］を生成してＲＡＭ３の演奏データエリアに格納すると共に、これら演奏データＭｉｄｉＥｖｅｎｔ［０］〜［Ｎ］をそれぞれ個別に演奏パート別に管理するトラックデータＴｒａｃｋ［０］〜［Ｎ］（図２参照）を生成してＲＡＭ３のトラックデータエリアに格納する。
【００３４】
続いて、ステップＳＤ２では、トラックデータＴｒａｃｋ［０］〜［Ｎ］に基づき全てのトラック（演奏パート）を参照し終えたかどうかを判断する。参照し終えていなければ、判断結果は「ＮＯ」になり、ステップＳＤ３に進む。ステップＳＤ３では、運指生成の対象となるトラック（演奏パート）について、後述するトラック処理スレッドを起動させてから上記ステップＳＤ２に処理を戻す。以後、トラックデータＴｒａｃｋ［０］〜［Ｎ］に基づき全てのトラック（演奏パート）を参照し終えるまで各トラック毎のトラック処理スレッドを起動させる。そして、全トラックについてトラック処理スレッドを起動させると、上記ステップＳＤ２の判断結果が「ＹＥＳ」になり、ステップＳＤ４に進む。
【００３５】
ステップＳＤ４では、全てのトラック処理スレッドが完了するまで待機し、全トラック処理スレッド完了に応じて判断結果が「ＹＥＳ」になり、本処理を完了させる。このように、プライマリスレッドであるメインルーチンでは、トラックデータＴｒａｃｋ［０］〜［Ｎ］に基づき全てのトラック（演奏パート）を参照し終えるまで各トラック毎のトラック処理スレッドを起動させ、これらが全て完了した時点で処理終了するようになっている。
【００３６】
（２）トラック処理スレッドの動作
次に、図８を参照してトラック処理スレッドの動作を説明する。前述のメインルーチン（図７参照）によりトラック処理スレッドが起動されると、ＣＰＵ１は図８に図示するステップＳＥ１に進み、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔをフレーズ区間に分割するフレーズ分割処理（後述する）を実行する。次いで、ステップＳＥ２では、運指生成の対象となるトラック（演奏パート）の先頭の演奏データＭｉｄｉＥｖｅｎｔ［ｐＮｏｔｅ］を指定するポインタｐＮｏｔｅをレジスタｍｅにストアする。
【００３７】
ステップＳＥ３では、レジスタｍｅの値が「０」でないか否か、すなわち曲終端に達していないかどうかを判断する。曲終端に達していなければ、判断結果は「ＹＥＳ」になり、ステップＳＥ４に進む。ステップＳＥ４では、レジスタｍｅのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅ．ｉＰｈｒａｓｅ）をレジスタｐｈＩＤにストアする。以後、レジスタｐｈＩＤの内容をフレーズ番号ｐｈＩＤと称す。続いて、ステップＳＥ５では、レジスタｍｅのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のポインタｎｅｘｔをレジスタｍｅｔにストアする。
【００３８】
そして、ステップＳＥ６〜ＳＥ７では、レジスタｍｅｔのポインタを歩進させながら、その歩進されるポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅｔ．ｉＰｈｒａｓｅ）が、現在のフレーズ番号ｐｈＩＤに一致するか否かを判断する。換言すれば、フレーズの終わりとなる演奏データＭｉｄｉＥｖｅｎｔを探し出す。
【００３９】
フレーズ番号ｉＰｈｒａｓｅ（ｍｅｔ．ｉＰｈｒａｓｅ）が現在のフレーズ番号ｐｈＩＤに一致している間は、ステップＳＥ６の判断結果が「ＹＥＳ」になり、ステップＳＥ６〜ＳＥ７を繰り返す。そして、フレーズ番号ｉＰｈｒａｓｅ（ｍｅｔ．ｉＰｈｒａｓｅ）が現在のフレーズ番号ｐｈＩＤに一致せず、フレーズの終わりとなる演奏データＭｉｄｉＥｖｅｎｔが検出されると、ステップＳＥ６の判断結果が「ＮＯ」になり、ステップＳＥ８に進む。
【００４０】
ステップＳＥ８では、レジスタｍｅのポインタ（フレーズの先頭を指定するポインタ）をレジスタｍｅＦｒｏｍにストアすると共に、レジスタｍｅｔのポインタ（フレーズの終わりとなる演奏データＭｉｄｉＥｖｅｎｔを指定するポインタ）をレジスタｍｅＴｏにストアする。そして、ステップＳＥ９では、このレジスタｍｅ、ｍｅＴｏの各ポインタを引数としてスレッド起動を指示する。次いで、ステップＳＥ１０では、レジスタｍｅｔのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のポインタｎｅｘｔをレジスタｍｅにストアした後、上述したステップＳＥ３に処理を戻す。
【００４１】
上記ステップＳＥ９においてスレッド起動が指示されると、ステップＳＥ１１を介して運指生成スレッド（図５参照）を実行させ、レジスタｍｅ、ｍｅＴｏの各ポインタで指定されるフレーズを構成する演奏データＭｉｄｉＥｖｅｎｔに基づき運指生成を行う。そして、ステップＳＥ１２では、上記ステップＳＥ１１の運指生成スレッドにて得られたフレーズの運指データを、同じフレーズ番号ｐｈＩＤを有するフレーズを構成する演奏データＭｉｄｉＥｖｅｎｔ中の運指データｃｆｉｇとしてコピーする。
【００４２】
一方、上述したステップＳＥ３〜ＳＥ１０の、フレーズ番号ｐｈＩＤのフレーズ先頭および後端を探し出す過程で、レジスタｍｅの値が「０」となり、曲終端に達すると、上記ステップＳＥ３の判断結果が「ＮＯ」になり、ステップＳＥ１３に進み、フレーズ単位で起動された全ての運指生成スレッド（ステップＳＥ１１）が終了するまで待機し、全スレッド終了に応じて判断結果が「ＹＥＳ」になり、本処理を終える。
【００４３】
以上のように、トラック処理スレッドでは、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔをフレーズ区間に分割し、分割されたフレーズ毎に運指生成スレッドを起動させてフレーズを構成する演奏データＭｉｄｉＥｖｅｎｔに基づき運指生成を行い、これにて得られたフレーズの運指データを、同じフレーズ番号ｐｈＩＤを有するフレーズを構成する演奏データＭｉｄｉＥｖｅｎｔ中の運指データｃｆｉｇとしてコピーするようになっている。
【００４４】
（３）フレーズ分割処理の動作
次に、図９を参照してフレーズ分割処理の動作を説明する。トラック処理スレッドのステップＳＥ１（図８参照）を介して本処理が実行されると、ＣＰＵ１は図９に図示するステップＳＦ１に進み、フレーズ番号を一時記憶するレジスタｐｈＩＤをゼロリセットする。続いて、ステップＳＦ２では、処理対象とするトラック（演奏パート）の先頭の演奏データＭｉｄｉＥｖｅｎｔ［ｐＮｏｔｅ］を指定するポインタｐＮｏｔｅをレジスタｍｅＲｅｆにストアする。
【００４５】
次いで、ステップＳＦ３では、先頭の演奏データＭｉｄｉＥｖｅｎｔ［ｐＮｏｔｅ］から規定個数先の演奏データＭｉｄｉＥｖｅｎｔを指定するポインタをレジスタｍｅｔＲｅｆにストアする。そして、ステップＳＦ４に進み、レジスタｍｅｔＲｅｆの値が「０」でないか否か、すなわち曲終端に達していないかどうかを判断する。曲終端に達していなければ、判断結果は「ＹＥＳ」になり、ステップＳＦ５に進み、一致フラグＨＩＴを「０」にセットする。次に、ステップＳＦ６では、レジスタｍｅｔＲｅｆのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ以降であって、フレーズ検出されていない演奏データＭｉｄｉＥｖｅｎｔを指定するポインタをレジスタｍｅＳｒｃにストアする。
【００４６】
ステップＳＦ７では、レジスタｍｅＳｒｃのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔから規定個数先の演奏データＭｉｄｉＥｖｅｎｔを指定するポインタをレジスタｍｅｔＲｅｆにストアする。そして、ステップＳＦ８では、レジスタｍｅｔＳｒｃの値が「０」でないか否か、すなわち曲終端に達していないかどうかを判断する。曲終端に達していなければ、判断結果は「ＹＥＳ」になり、ステップＳＦ１１に進む。
【００４７】
ステップＳＦ１１〜ＳＦ１２では、レジスタｍｅＲｅｆのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔからレジスタｍｅｔＲｅｆのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔまでの各音からなる参照フレーズと、レジスタｍｅＳｒｃのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔからレジスタｍｅｔＳｒｃのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔまでの各音からなる比較フレーズとが一致しているかどうかを判断する。なお、一致・不一致の判断は、参照フレーズおよび比較フレーズをそれぞれ構成する各音の「音高」、「発音タイミング」および「音長」が一致するか否かで判定する。
【００４８】
参照フレーズと比較フレーズが一致しなければ、上記ステップＳＦ１２の判断結果は「ＮＯ」になり、ステップＳＦ１３〜ＳＦ１４において比較フレーズを更新する。すなわち、ステップＳＦ１３では、レジスタｍｅｔＳｒｃのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ以降であって、フレーズ検出されていない演奏データＭｉｄｉＥｖｅｎｔを指定するポインタをレジスタｍｅＳｒｃにストアする。続いて、ステップＳＦ１４では、レジスタｍｅＳｒｃのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔから規定個数先の演奏データＭｉｄｉＥｖｅｎｔを指定するポインタをレジスタｍｅｔＲｅｆにストアする。この後、上述したステップＳＦ８に処理を戻す。
【００４９】
こうして、ステップＳＦ８〜ＳＦ１４では、参照フレーズに一致する比較フレーズが出現するまでレジスタｍｅＳｒｃおよびレジスタｍｅｔＳｒｃの各ポインタを更新させる。そして、曲終端に達する以前に、参照フレーズに一致する比較フレーズが見つかると、ステップＳＦ１２の判断結果が「ＹＥＳ」になり、ステップＳＦ１５に進む。ステップＳＦ１５では、一致フラグＨＩＴが「１」でないか否か、つまり既に参照フレーズに一致する比較フレーズが見つかっているかどうかを判断する。初めて参照フレーズに一致する比較フレーズが見つかった場合には、判断結果が「ＹＥＳ」になり、ステップＳＦ１６に進み、フレーズ番号ｐｈＩＤをインクリメントして歩進させた後、ステップＳＦ１７にて一致フラグＨＩＴを「１」にセットする。
【００５０】
一方、既に参照フレーズに一致する比較フレーズが見つかっている場合であれば、上記ステップＳＦ１５の判断結果は「ＮＯ」となり、ステップＳＦ１７に進み、一致フラグＨＩＴを「１」にセットする。次いで、ステップＳＦ１８では、レジスタｍｅＳｒｃのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅＳｒｃ．ｉＰｈｒａｓｅ）にフレーズ番号ｐｈＩＤを登録した後、上述のステップＳＦ１３に処理を進める。したがって、参照フレーズに一致する比較フレーズが続くような場合には、それらが同一のグループとして同一のフレーズ番号ｐｈＩＤが、対応する演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅＳｒｃ．ｉＰｈｒａｓｅ）に登録される。
【００５１】
さて、参照フレーズに一致する比較フレーズが出現するまでレジスタｍｅＳｒｃおよびレジスタｍｅｔＳｒｃの各ポインタを更新させる過程で、レジスタｍｅｔＳｒｃのポインタが曲終端に達すると、上述したステップＳＦ８の判断結果が「ＮＯ」になり、ステップＳＦ９に進む。ステップＳＦ９〜ＳＦ１０では、新たな参照フレーズの位置を設定する。すなわち、ステップＳＦ９では、フレーズ検出されていない最初の演奏データＭｉｄｉＥｖｅｎｔを指定するポインタを、新たな参照フレーズの先頭としてレジスタｍｅＲｅｆにストアし、続くステップＳＦ１０では、この新たな参照フレーズの先頭から規定個数先の演奏データＭｉｄｉＥｖｅｎｔを指定するポインタをレジスタｍｅｔＲｅｆにストアする。
【００５２】
この後、前述したステップＳＦ４に進み、レジスタｍｅｔＲｅｆの値が「０」でないか否か、すなわち曲終端に達していないかどうかを判断する。そして、曲終端に達していなければ、判断結果は「ＹＥＳ」になり、前述したステップＳＦ５以降を実行して、新たに設定した参照フレーズに一致する比較フレーズを探し出す。そして、新たな参照フレーズを設定する際に、参照フレーズの後端が曲終端に達した場合に、ステップＳＦ４の判断結果が「ＮＯ」となり、本処理を終える。
【００５３】
このように、フレーズ分割処理では、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔを所定音数分に区切った参照フレーズを設定し、この参照フレーズに一致する比較フレーズを探し出す。そして、一致する比較フレーズが無ければ、参照フレーズの位置をずらしながら一致する比較フレーズを探し出し、一致した比較フレーズがあれば、その比較フレーズの先頭の演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅＳｒｃ．ｉＰｈｒａｓｅ）にフレーズ番号ｐｈＩＤを登録する。これにより、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔをフレーズ区間に分割できる。
【００５４】
以上説明したように、第２実施形態では、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔをフレーズ区間に分割し、分割されたフレーズ毎に運指生成スレッドを起動させてフレーズを構成する演奏データＭｉｄｉＥｖｅｎｔに基づき運指生成を行い、これにて得られたフレーズの運指データを、同じフレーズ番号ｐｈＩＤを有するフレーズを構成する演奏データＭｉｄｉＥｖｅｎｔ中の運指データｃｆｉｇとしてコピーする。こうした処理を各トラックについて並列的に実行する結果、処理負荷を低減させて処理時間の短縮化を図ることが可能になる。
【００５５】
Ｃ．第３実施形態
次に、図１０を参照して第３実施形態によるトラック処理スレッドの動作を説明する。前述した第２実施形態と同様に、メインルーチン（図７参照）によりトラック処理スレッドが起動されると、ＣＰＵ１は図１０に図示するステップＳＧ１に進み、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔをフレーズ区間に分割するフレーズ分割処理を実行する。次いで、ステップＳＧ２では、カウンタｉＰ、ｉＮをゼロリセットする。続いて、ステップＳＧ３では、運指生成の対象となるトラック（演奏パート）の先頭の演奏データＭｉｄｉＥｖｅｎｔ［ｐＮｏｔｅ］を指定するポインタｐＮｏｔｅをレジスタｍｅにストアする。
【００５６】
ステップＳＧ４では、レジスタｍｅの値が「０」でないか否か、すなわち曲終端に達していないかどうかを判断する。曲終端に達していなければ、判断結果は「ＹＥＳ」になり、ステップＳＧ５に進む。ステップＳＧ５では、レジスタｍｅのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅ．ｉＰｈｒａｓｅ）をレジスタｐｈＩＤにストアする。以後、レジスタｐｈＩＤの内容をフレーズ番号ｐｈＩＤと称す。続いて、ステップＳＧ６では、レジスタｍｅのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のポインタｎｅｘｔをレジスタｍｅｔにストアする。
【００５７】
そして、ステップＳＧ７〜ＳＧ９は、レジスタｍｅｔのポインタを歩進させながら、その歩進されるデータ数をカウンタｉＮにて計数する一方、歩進されるポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のフレーズ番号ｉＰｈｒａｓｅ（ｍｅｔ．ｉＰｈｒａｓｅ）が、現在のフレーズ番号ｐｈＩＤに一致するか否かを判断する。換言すれば、フレーズを構成する演奏データ数（フレーズ構成音数）をカウンタｉＮにて計数しつつ、フレーズの終わりの演奏データＭｉｄｉＥｖｅｎｔを探し出す。
【００５８】
フレーズ番号ｉＰｈｒａｓｅ（ｍｅｔ．ｉＰｈｒａｓｅ）が現在のフレーズ番号ｐｈＩＤに一致している間は、ステップＳＥ６の判断結果が「ＹＥＳ」になり、ステップＳＧ７〜ＳＧ９を繰り返す。そして、フレーズ番号ｉＰｈｒａｓｅ（ｍｅｔ．ｉＰｈｒａｓｅ）が現在のフレーズ番号ｐｈＩＤに一致せず、フレーズの終わりとなる演奏データＭｉｄｉＥｖｅｎｔが検出されると、ステップＳＧ７の判断結果が「ＮＯ」になり、ステップＳＧ１０に進む。
【００５９】
ステップＳＧ１０では、フレーズ数を計数するカウンタｉＰの値で指定されるレジスタｍｅＦ［ｉＰ］に、レジスタｍｅのポインタ（フレーズの先頭を指定するポインタ）をストアすると共に、カウンタｉＰの値で指定されるレジスタｍｅＴ［ｉＰ］に、レジスタｍｅｔのポインタ（フレーズの終わりとなる演奏データＭｉｄｉＥｖｅｎｔを指定するポインタ）をストアする。さらに、ステップＳＧ１０では、カウンタｉＰの値で指定されるレジスタｉＮ［ｉＰ］に、カウンタｉＮにて計数したフレーズ構成音数をストアする。次いで、ステップＳＧ１１では、カウンタｉＰの値をインクリメントして歩進させると共に、カウンタｉＮをゼロリセットする。そして、ステップＳＧ１２に進み、レジスタｍｅｔのポインタで指定される演奏データＭｉｄｉＥｖｅｎｔ中のポインタｎｅｘｔをレジスタｍｅにストアした後、上述したステップＳＧ４に処理を戻す。
【００６０】
以後、レジスタｍｅのポインタが曲終端に達するまで上述したステップＳＧ４〜ＳＧ１２を繰り返す。これにより、前述のステップＳＧ１において分割された各フレーズの先頭を指定するポインタがレジスタｍｅＦ［０］〜［ｉＰ］に、各フレーズの後端を指定するポインタがレジスタｍｅＴ［０］〜［ｉＰ］に、各フレーズ毎のフレーズ構成音数がレジスタｉＮ［０］〜［ｉＰ］にそれぞれストアされる。そして、レジスタｍｅのポインタが曲終端に達すると、上述したステップＳＧ４の判断結果が「ＮＯ」になり、ステップＳＧ１３に進む。
【００６１】
ステップＳＧ１３では、レジスタｉＮ［０］〜［ｉＰ］にそれぞれストアされた各フレーズ毎のフレーズ構成音数に基づきフレーズ当りの平均構成音数を算出し、算出した平均構成音数をレジスタｉＮＡｖｅにストアする。次いで、ステップＳＧ１４では、ポインタｉをゼロリセットし、続くステップＳＧ１５では、ポインタｉがカウンタｉＰの値（以下、フレーズ数ｉＰと称す）より小さいか否かを判断する。ポインタｉがフレーズ数ｉＰより小さければ、判断結果は「ＹＥＳ」になり、ステップＳＧ１６に進む。
【００６２】
ステップＳＧ１６では、ポインタｉで指定されるレジスタｉＮ［ｉ］、つまりポインタｉで指定されるフレーズのフレーズ構成音数が、レジスタｉＮＡｖｅにストアされる平均構成音数の２倍より大きいか否かを判断する。ポインタｉで指定されるフレーズのフレーズ構成音数ｉＮ［ｉ］が平均構成音数ｉＮＡｖｅの２倍より大きい場合には、判断結果が「ＹＥＳ」になり、ステップＳＧ１７に進む。ステップＳＧ１７では、平均構成音数ｉＮＡｖｅずつに分割した演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動させる。そして、ステップＳＧ１８に進み、ポインタｉをインクリメントして歩進させた後、上述のステップＳＧ１５に処理を戻す。
【００６３】
一方、ポインタｉで指定されるフレーズのフレーズ構成音数ｉＮ［ｉ］が平均構成音数ｉＮＡｖｅの２倍より小さい場合には、上記ステップＳＧ１６の判断結果が「ＮＯ」となり、ステップＳＧ１９に進み、ポインタｉで指定されるフレーズを構成する全ての演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動させた後、ステップＳＧ１８にてポインタｉを歩進させてから上述のステップＳＧ１５に処理を戻す。
【００６４】
こうして、フレーズ構成音数ｉＮ［ｉ］が平均構成音数ｉＮＡｖｅの２倍を超えるか否かに応じて、平均構成音数ｉＮＡｖｅずつに分割した演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドあるいはフレーズを構成する全ての演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドのいずれかを起動させ終え、ポインタｉがフレーズ数ｉＰより大きくなると、上記ステップＳＧ１５の判断結果が「ＮＯ」になり、ステップＳＧ２０に進む。そして、ステップＳＧ２０では、起動された全ての運指生成スレッドが終了するまで待機し、全スレッド終了に応じて判断結果が「ＹＥＳ」になり、本処理を終える。
【００６５】
以上のように、第３実施形態では、処理対象とするトラック（演奏パート）の演奏データＭｉｄｉＥｖｅｎｔをフレーズ区間に分割し、分割された全てのフレーズを参照してフレーズ当りの平均構成音数ｉＮＡｖｅを算出する。そして、分割された各フレーズ毎に平均構成音数ｉＮＡｖｅを超えているか否かを判断し、平均構成音数ｉＮＡｖｅの２倍を超えるフレーズであれば、平均構成音数ｉＮＡｖｅずつに分割した演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動し、一方、平均構成音数ｉＮＡｖｅの２倍を超えないフレーズならば、フレーズを構成する全ての演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動させるようにしたので、負荷分散により処理負荷を低減させて処理時間の短縮化を図ることが可能になる。
【００６６】
なお、本実施形態では、分割された全てのフレーズを参照してフレーズ当りの平均構成音数ｉＮＡｖｅを算出し、算出した平均構成音数ｉＮＡｖｅの２倍を超える場合に、平均構成音数ｉＮＡｖｅずつに分割した演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動し、平均構成音数ｉＮＡｖｅの２倍を超えない場合にフレーズを構成する全ての演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動させるようにしたが、これに限らず、所定音数（演奏データ数）を超えるフレーズの場合に所定音数ずつに分割した演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動し、所定音数を超えないフレーズについはフレーズを構成する全ての演奏データＭｉｄｉＥｖｅｎｔについて運指生成するスレッドを起動させる態様としても構わない。このようにすれば、平均構成音数ｉＮＡｖｅを算出する処理が不要となり、より処理負荷低減を図ることができる。
【図面の簡単な説明】
【００６７】
【図１】本発明による第１実施形態の構成を示すブロック図である。
【図２】トラックデータＴｒａｃｋの構成を示す図である。
【図３】演奏データＭｉｄｉＥｖｅｎｔの構成を示す図である。
【図４】第１実施形態によるメインルーチンの動作を示すフローチャートである。
【図５】第１実施形態による運指生成スレッドの動作を示すフローチャートである。
【図６】第１実施形態による運指系列選択処理の動作を示すフローチャートである。
【図７】第２実施形態によるメインルーチンの動作を示すフローチャートである。
【図８】第２実施形態によるトラック処理スレッドの動作を示すフローチャートである。
【図９】第２実施形態によるフレーズ分割処理の動作を示すフローチャートである。
【図１０】第３実施形態によるトラック処理スレッドの動作を示すフローチャートである。
【符号の説明】
【００６８】
１  ＣＰＵ
２  ＲＯＭ
３  ＲＡＭ
４  入力部
５  表示部
６  ＭＩＤＩインタフェース
７  電子楽器
【図１】
0004482889.tif 000002
【図２】
0004482889.tif 000003
【図３】
0004482889.tif 000004
【図４】
0004482889.tif 000005
【図５】
0004482889.tif 000006
【図６】
0004482889.tif 000007
【図７】
0004482889.tif 000008
【図８】
0004482889.tif 000009
【図９】
0004482889.tif 000010
【図１０】
0004482889.tif 000011