(57)【要約】【課題】  演奏情報が示す演奏内容に応じて、より適切な運指情報の生成をより迅速に行えるようにするための技術を提供する。【解決手段】  ステップＳＢ１では逐次生成処理を実行し、運指情報を生成する。生成した運指情報で示す運指は、ステップＳＢ３〜ＳＢ９で形成される処理ループをステップＳＢ３の判定がＹＥＳとなるまで繰り返し実行することにより、注目する音符を順次、変更しながら、何れの禁止事項にも該当せず、かつステップＳＢ６の指定音コスト算出処理の実行で算出し、ステップＳＢ７のコスト補正処理の実行で補正したコストが閾値である定数ＴＨＲＣＯＳＴより大きいものを対象に修正を行う。それにより、生成した運指情報は必要に応じて、より適切なものとなるように修正（補正）を行う。【選択図】      図４
2006078656.tif 000002
【特許請求の範囲】
【請求項１】
楽器に備えられた演奏操作子群を操作して楽曲を演奏していく際の指の運びである運指を示す運指情報を生成する装置であって、
前記楽曲の演奏内容を示す演奏情報を取得する演奏情報取得手段と、
前記演奏情報取得手段が取得した演奏情報を参照して、該演奏情報が演奏内容を示す楽曲の運指情報を生成する運指情報生成手段と、
前記運指情報生成手段が生成した運指情報を参照して、該運指情報が示す運指を行ううえでの難易度を算出する難易度算出手段と、
前記難易度算出手段が算出した難易度を基に、前記運指情報生成手段が生成した運指情報の修正を行う運指情報修正手段と、
を具備することを特徴とする運指情報生成装置。
【請求項２】
前記難易度算出手段は、前記演奏情報を参照して該演奏情報を１つ以上の部分演奏情報に仮想的に分割し、該部分演奏情報が表す演奏内容、及び該部分演奏情報のつながりのうちの少なくとも一方に着目して前記難易度を算出する、
ことを特徴とする請求項１記載の運指情報生成装置。
【請求項３】
前記部分演奏情報が表す演奏内容としては、発音される楽音間の発音開始タイミングの差、同時に発音させる楽音数、該楽音間で発音期間が重なる割合、及び跳躍進行の有無のうちの少なくとも一つに着目する、
ことを特徴とする請求項２記載の運指情報生成装置。
【請求項４】
前記難易度算出手段は、前記運指情報が示す運指のなかで予め定めた条件を満たす運指を対象外として前記難易度を算出し、
前記運指情報修正手段は、前記難易度算出手段が前記難易度を算出する運指を対象にして修正を行う、
ことを特徴とする請求項１、２、または３記載の運指情報生成装置。
【請求項５】
楽器に備えられた演奏操作子群を操作して楽曲を演奏していく際の指の運びである運指を示す運指情報を生成する装置であって、
前記楽曲の演奏内容を示す演奏情報を取得する演奏情報取得手段と、
前記演奏情報取得手段が取得した演奏情報を参照して、該演奏情報が演奏内容を示す楽曲の運指情報を生成する運指情報生成手段と、
前記運指情報生成手段が生成した運指情報を参照して、該運指情報が示す運指のなかで修正対象とすべき運指を抽出する運指抽出手段と、
前記運指抽出手段が抽出した運指を対象に修正を行う運指情報修正手段と、
を具備することを特徴とする運指情報生成装置。
【請求項６】
楽器に備えられた演奏操作子群を操作して楽曲を演奏していく際の指の運びである運指を示す運指情報を生成する運指情報生成装置に実行させるプログラムであって、
前記楽曲の演奏内容を示す演奏情報を取得する機能と、
前記取得する機能により取得した演奏情報を参照して、該演奏情報が演奏内容を示す楽曲の運指情報を生成する機能と、
前記生成する機能により生成した運指情報を参照して、該運指情報が示す運指を行ううえでの難易度を算出する機能と、
前記算出する機能により算出した難易度を基に、前記生成する機能により生成した運指情報の修正を行う機能と、
を実現させるためのプログラム。
【請求項７】
楽器に備えられた演奏操作子群を操作して楽曲を演奏していく際の指の運びである運指を示す運指情報を生成する運指情報生成装置に実行させるプログラムであって、
前記楽曲の演奏内容を示す演奏情報を取得する機能と、
前記取得する機能により取得した演奏情報を参照して、該演奏情報が演奏内容を示す楽曲の運指情報を生成する機能と、
前記生成する機能により生成した運指情報を参照して、該運指情報が示す運指のなかで修正対象とすべき運指を抽出する機能と、
前記抽出する機能により抽出した運指を対象に修正を行う機能と、
を実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、楽器に備えられた演奏操作子群を操作して楽曲を演奏していく際の指の運びである運指を示す運指情報を生成するための技術に関する。
【背景技術】
【０００２】
現在では、多くの鍵盤楽器に、演奏の進行に応じて押鍵（操作）すべき鍵を順次、ユーザ（演奏者）に通知していくナビゲーション機能が搭載されている。しかし、ナビゲーション機能を利用するユーザの多くは技術的に未熟であり、そのナビゲーション機能によって次に押鍵すべき鍵を知ることができても、その鍵をどの指で押鍵すべきかが判らないのが実状である。このことから、鍵の押鍵に使うべき指を表示する演奏動作表示装置を搭載した鍵盤楽器も製品化されている。その演奏動作表示装置を利用することにより、指の運び方を意識した演奏を行えるため、ユーザにとってはより効率的な練習（学習）を行うことができる。
【０００３】
運指情報生成装置は、楽曲の演奏内容を示す演奏情報を参照して、楽器に備えられた鍵盤（演奏操作子群）を操作してその楽曲を演奏していく際の指の運びである運指を示す運指情報を自動的に生成するものである。通常、上記演奏動作表示装置では、運指情報を参照して、演奏の進行に応じて順次、押鍵すべき鍵の押鍵に使うべき指、その指を離鍵させるべきタイミング、等を教示するようになっている。従来の運指情報生成装置としては、例えば特許文献１に記載されたものがある。
【０００４】
特許文献１に記載された従来の運指情報生成装置では、押鍵すべき鍵の押鍵に使うべき指として、その鍵の押鍵を行う難易度を示すコストを指別に算出することにより、その押鍵が比較的に容易に行える指を割り当てている。その鍵以降に押鍵すべき鍵も考慮することにより、滑らかに演奏できるようにさせている。また、和音等の楽曲上の構造（演奏内容の種類）や、指潜り等の運指（演奏）方法に着目してフレーズを判定することにより、フレーズ別に適切な方法で指の割り当てを行うようにさせている。
【０００５】
上記コストや楽曲の構造（演奏内容の種類）、及び運指方法に着目することにより、ユーザにとってより容易な（適切な）運指情報を生成することができる。上記従来の運指情報生成装置では、それらを全て考慮しつつ、運指情報を生成していくようになっていた。このため、演奏情報が示す演奏内容に係わらず、運指情報の生成に常に長い時間がかかるという問題点があった。
【０００６】
楽曲のなかには、その構造等を考慮しなくとも最適、或いはそれに近い運指情報を生成できるものも存在する。ユーザのより快適な利用を可能とさせるために、そのような楽曲の運指情報はより迅速に生成できるようにすることが望ましいと考えられる。
【特許文献１】特開２００１−３３１１７３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明の課題は、演奏情報が示す演奏内容に応じて、より適切な運指情報の生成をより迅速に行えるようにするための技術を提供することにある。
【課題を解決するための手段】
【０００８】
本発明の第１、及び第２の態様の運指情報生成装置は共に、楽器に備えられた演奏操作子群を操作して楽曲を演奏していく際の指の運びである運指を示す運指情報を生成することを前提とし、それぞれ以下の手段を具備する。
【０００９】
第１の態様の運指情報生成装置は、楽曲の演奏内容を示す演奏情報を取得する演奏情報取得手段と、演奏情報取得手段が取得した演奏情報を参照して、該演奏情報が演奏内容を示す楽曲の運指情報を生成する運指情報生成手段と、運指情報生成手段が生成した運指情報を参照して、該運指情報が示す運指を行ううえでの難易度を算出する難易度算出手段と、難易度算出手段が算出した難易度を基に、運指情報生成手段が生成した運指情報の修正を行う運指情報修正手段と、を具備する。
【００１０】
なお、上記難易度算出手段は、演奏情報を参照して該演奏情報を１つ以上の部分演奏情報に仮想的に分割し、該部分演奏情報が表す演奏内容、及び該部分演奏情報のつながりのうちの少なくとも一方に着目して難易度を算出する、ことが望ましい。部分演奏情報が表す演奏内容としては、発音される楽音間の発音開始タイミングの差、同時に発音させる楽音数、該楽音間で発音期間が重なる割合、及び跳躍進行の有無のうちの少なくとも一つに着目する、ことが望ましい。また、難易度算出手段は、運指情報が示す運指のなかで予め定めた条件を満たす運指を対象外として難易度を算出し、運指情報修正手段は、難易度算出手段が難易度を算出する運指を対象にして修正を行う、ことが望ましい。
【００１１】
第２の態様の運指情報生成装置は、楽曲の演奏内容を示す演奏情報を取得する演奏情報取得手段と、演奏情報取得手段が取得した演奏情報を参照して、該演奏情報が演奏内容を示す楽曲の運指情報を生成する運指情報生成手段と、運指情報生成手段が生成した運指情報を参照して、該運指情報が示す運指のなかで修正対象とすべき運指を抽出する運指抽出手段と、運指抽出手段が抽出した運指を対象に修正を行う運指情報修正手段と、を具備する。
【００１２】
本発明の第１、及び第２の態様のプログラムはそれぞれ、上記第１、及び第２の態様の運指情報生成装置が具備する手段を実現させるための機能を搭載している。
【発明の効果】
【００１３】
本発明は、演奏情報を参照して、その演奏情報が演奏内容を示す楽曲の運指情報を生成し、生成した運指情報を参照して、その運指情報が示す運指を行ううえでの難易度を算出し、算出した難易度を基に、生成した運指情報の修正を行う。
【００１４】
生成した運指情報が示す運指のなかで修正すべき運指を難易度を基に抽出して修正するようにしたことから、運指情報の生成には比較的に簡単なアルゴリズムを採用することができる。そのため、簡単なアルゴリズムで最適、或いはそれに近い運指情報の生成が可能な楽曲（演奏情報）では、その生成を迅速に行えるようになる。そうでない楽曲でも、生成後の修正により、最適、或いはそれに近い運指情報を得ることができる。このようなことから、結果として、最適、或いはそれに近い運指情報は必要最小限の時間で確実に得られることとなる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
図１は、本実施の形態による運指情報生成装置を搭載した電子楽器の構成を説明する図である。
【００１６】
その電子楽器は、図１に示すように、楽器全体の制御を行うＣＰＵ１と、そのＣＰＵ１が実行するプログラムや各種制御用データを格納したＲＯＭ２と、ＣＰＵ１がワークに用いるＲＡＭ３と、各種スイッチ等の操作子を有する入力部４と、例えば液晶表示装置である表示部５と、各種データの格納に用いることができる外部記憶装置６と、演奏操作の対象となる演奏操作子群である鍵盤７と、ＣＰＵ１の指示に従って楽音を発音させるサウンドシステム８と、を備えている。
【００１７】
なお、上記外部記憶装置６は、例えば着脱自在な記録媒体にアクセスするものである。入力部４に備えられた運指情報の生成に係わる操作子としては、運指情報生成の対象となる曲（演奏情報）を指定するための曲指定スイッチ、及び運指情報の生成を指示するための運指生成スイッチ、などが設けられている。
【００１８】
運指情報生成の対象となる演奏データ（情報）は、例えば曲指定スイッチを操作して、外部記憶装置６がアクセス可能なもののなかから選択するようになっている。ＣＰＵ１は、ユーザが選択した演奏データを外部記憶装置６に読み出させ、それをＲＡＭ３に格納する。
【００１９】
図２は運指情報生成のためにＲＡＭ３に格納される演奏データの構成を説明する図である。その演奏データは、曲の演奏内容を音符単位で示すデータ（以降「演奏音符データ」と呼ぶ）の他に、音符単位で運指（押鍵すべき鍵の押鍵に割り当てた指）を示すデータ（以降「運指音符データ」と呼ぶ）、及び運指音符データ生成用のデータ、を有するデータ（以降「音符データ」と呼ぶ）が音符の演奏（発音）順に並べられた形で構成されている。その音符データは、図２中に括弧を付して表記の「ＭＥ」に相当する。括弧内の数値は、音符データを指定するインデックス（値）である。以降、インデックスが判明している音符データには「ＭＥ」、及びそれに続けて括弧内にインデックスを示す数値、或いは変数のシンボルを表記したものを付して例えば「音符データＭＥ［０］」といったように記載し、そのインデックスが判明していない音符データには単に「ＭＥ」を付して記載することとする。これは他でも同様である。
【００２０】
その音符データＭＥは、「ｔｉｍｅ」と表記の発音開始時刻、「ｇａｔｅ」と表記の発音継続時間、「ｐｉｔｃｈ」と表記の発音ピッチ（ノート番号）、「ｐｏｓｘ」と表記の発音ピッチに対応する鍵の鍵盤座標、「ｔｅｎｄ」と表記のピッチ増減傾向、「ｔｅｎｄｓｔｅｐ」と表記の次の極点に達するまでのピッチ変化数、「ｆｉｇ」と表記の運指番号（その鍵の押鍵に使うべき指を示す番号）、「ｃｏｓｔ」と表記の運指コスト（その鍵を押鍵するうえでの難易度）、「ｎｐ」と表記の禁止事項フラグ、「ｓｏ」と表記の発音数、「ｈｍｎｙ」と表記の和音フラグ、「ａｒｐ」と表記の分散和音フラグ、「ｎｈｔｏｐ」と表記の次の音符群の先頭音インデックス、「ｎｈｔａｉｌ」と表記の次の音符群の末端音インデックス、「ｐｈｔｏｐ」と表記の前の音符群の先頭音インデックス、及び「ｐｈｔａｉｌ」と表記の前の音符群の先頭音インデックス、の各データを備えた構成となっている。
【００２１】
図示していないデータとしては、鍵の押鍵に使うべき指が右手か否かを示すパートや、その押鍵時の強さを示すベロシティなども存在する。しかし、ここでは説明上、便宜的に省略している。なお以後の説明で用いられる演奏データは、右手パート用に作成されたものであるとする。
【００２２】
データｐｏｓｘは、ＭＩＤＩフォーマットで６０のノート番号が割り当てられた鍵を基準（０）として、白鍵毎に２つずつ変化させる値で鍵盤座標を表現したものである。そのように変化させることにより、白鍵は偶数、黒鍵は奇数とさせている。これは、白鍵と黒鍵とでは鍵盤７の長手方向の交差方向上の位置に違いがあるからである。
【００２３】
上記ピッチ増減傾向は、その増減の切り替わる点に当たる音符では０、前の音符と同じピッチ（音高）の音符では±１、前の音符のピッチと異なる音符では±２、で表現するようにしている。その符号は＋はピッチが増加中であることを示し、「−」はピッチが減少中であることを示している。次の極点に達するまでのピッチ変化数は、対応する音符から次の極点とする音符の間に存在する、次の音符とピッチが異なる音符数である。
【００２４】
上記運指番号としては、親指は０、人指し指は１，中指は２、薬指は３、小指は４をそれぞれ割り当てている。上記禁止事項フラグは、設定した運指が禁止事項として定めた条件を満たしているか否かを示すフラグである。その条件を満たしていれば１、そうでなければ０が設定される。
【００２５】
データｓｏとして設定される発音数は、対応する音符の発音開始時刻に発音中の他の音符数、或いはその発音終了時刻（＝ｔｉｍｅ＋ｇａｔｅ）前に発音を開始する他の音符数、である。それらの数を区別するために、後者は負の値で表している。
【００２６】
上記和音フラグは、対応する音符が和音の構成音か否かを示すものである。構成音でなければ０、構成音であれば正の値で先頭音からの位置を示す値が設定される。その位置を示す値の初期値は１である。これは、上記分散構成音フラグも同様である。
【００２７】
本実施の形態では、演奏データが示す演奏全体を、和音、或いは分散和音を構成する音符群、それらの音符群の間に存在する単音の音符に仮想的に分割するようにしている。データｎｈｔｏｐ、ｎｈｔａｉｌ、ｐｈｔｏｐ、ｐｈｔａｉｌとして設定される各種インデックスは、そのように分割した場合のものである。データｎｈｔｏｐでは、次の音符群が存在しない場合、−１を設定するようになっている。
【００２８】
上記データｔｉｍｅ、ｇａｔｅ、及びｐｉｔｃｈは、外部記憶装置６から読み出された演奏データを構成するデータか、或いはそのデータから生成されるものであり、演奏音符データに相当する。その演奏音符データをＲＡＭ３に格納する際に、その数をカウントして得られる総数が変数ｅｖ＿ｍａｘに代入される。上記データｐｏｓｘ、及びｆｉｇは、運指音符データに相当する。それら以外は、運指音符データ生成用のデータである。
【００２９】
以降は、図３〜図８、及び図１０〜図２１に示す各種処理のフローチャート、並びに図９に示す説明図を参照しつつ、電子楽器の動作について詳細に説明する。なお、それらの図に示す各処理は、ＣＰＵ１がＲＯＭ２に格納されたプログラムを実行することで実現される。
【００３０】
図３は、全体処理のフローチャートである。始めに図３を参照して、全体処理について詳細に説明する。
電源がオンされると、先ず、ステップＳＡ１で初期処理を実行し、電子楽器を所定の状態に設定する。続くステップＳＡ２では、曲指定スイッチがオンしたか否か判定する。そのスイッチをユーザが操作したことで入力部４からその旨を示す信号を受け取った場合、判定はＹＥＳとなり、次にステップＳＡ３において、ユーザの入力部４への操作により指定される曲（演奏データ）を外部記憶装置６から取り込むための処理を実行してからステップＳＡ４に移行する。一方、そうでない場合には、判定はＮＯとなり、次にそのステップＳＡ４の処理を実行する。
【００３１】
ステップＳＡ３での演奏データの取り込みにより、ＲＡＭ３には図２に示す構成で演奏データが格納される。そのために、音符データＭＥの個数をカウントして、そのカウント値から１を引いた値を変数ｅｖ＿ｍａｘに代入する。また、曲の構造解析を行い、その解析結果に従って、各音符データＭＥを構成するデータｔｉｍｅ、ｇａｔｅ、ｐｉｔｃｈ、ｐｏｓｘ、ｔｅｎｄ、ｔｅｎｄｓｔｅｐ、ｓｏ、ｈｍｎｙ、ａｒｐ、ｎｈｔｏｐ、ｎｈｔａｉｌ、ｐｈｔｏｐ、及びｐｈｔａｉｌの設定を行う。データｆｉｇ、ｃｏｓｔ、及びｎｐには予め定めた値を初期値として設定する。それら各種データの設定を行える構造解析は周知技術であることから、ここでは詳細な説明は省略する。
【００３２】
ステップＳＡ４では、運指生成スイッチがオンしたか否か判定する。そのスイッチをユーザが操作した場合、判定はＹＥＳとなり、次にステップＳＡ５で運指情報の生成を行うための運指生成処理を実行した後、ステップＳＡ６に移行する。そうでない場合には、次にそのステップＳＡ６に移行する。
【００３３】
ステップＳＡ６では、入力部４に設けられたその他のスイッチへの操作に対応するためのその他スイッチ処理を実行する。続くステップＳＡ７では、鍵盤７へのユーザの操作に応じて楽音を発音させるための鍵盤処理を実行する。その次のステップＳＡ８では、ユーザに曲を指定させ、指定された曲の自動演奏を実現させるための自動演奏処理を実行する。それ以降は、ステップＳＡ９で表示部５に表示させるべき情報を表示させる表示処理、ステップＳＡ１０でその他処理を実行してから、上記ステップＳＡ２に戻る。
【００３４】
図４は、上記ステップＳＡ５として実行される運指生成処理のフローチャートである。次に図４を参照して、その生成処理について詳細に説明する。
先ず、ステップＳＢ１では、１音符毎に運指情報（運指音符データ）を生成する逐次生成処理を実行する。次のステップＳＢ２では、変数ｍｅに１を代入する。その次に移行するステップＳＢ３では、変数ｍｅの値が変数ｅｖ＿ｍａｘの値と等しいか否か判定する。それらの値が一致していた場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップＳＢ４に移行する。
【００３５】
ステップＳＢ４では、変数ｍｅの値で指定される音符データＭＥ（演奏上は発音させる音符に相当することから単に「音符」とも表記する）に着目して、禁止事項とする条件が満たされているか否か検索（確認）するための禁止事項検索処理を実行する。その実行後はステップＳＢ５に移行して、変数ｍｅの値で指定される音符データＭＥ中のデータｎｐ（図中「ＭＥ［ｍｅ］．ｎｐ」と表記。以降、その表記法も併用する）として０が設定されているか否か判定する。禁止事項に該当しないと判定された場合、データｎｐとして０が設定されることから、判定はＹＥＳとなってステップＳＢ６に移行し、そうでない場合には、判定はＮＯとなり、ステップＳＢ１０で変数ｍｅの値をインクリメントしてから上記ステップＳＢ３に戻る。
【００３６】
ステップＳＢ６〜ＳＢ９では、禁止事項に該当しないと判定された運指を対象に、その運指のコストに応じてそのコストをより低減させるための処理が行われる。
先ず、ステップＳＢ６では、変数ｍｅの値で指定する音符（指定音）のコストを算出する指定音コスト算出処理を実行する。続くステップＳＢ７では、その算出処理の実行により算出されたコストの補正を行うコスト補正処理を実行する。次に実行するステップＳＢ８では、指定音のコスト（図中「ＭＥ［ｍｅ］．ｃｏｓｔ」と表記）が、閾値として定めた定数ＴＨＲＣＯＳＴより大きいか否か判定する。その値が定数ＴＨＲＣＯＳＴより大きい場合、判定はＹＥＳとなり、ステップＳＢ９で運指を修正するための運指修正処理を実行した後、上記ステップＳＢ１０に移行する。そうでない場合には、判定はＮＯとなり、次にそのステップＳＢ１０の処理を実行する。
【００３７】
運指修正処理での運指の修正は、特に詳細な説明は省略するが、例えば指定音の前後の部分を考慮して処理対象とする区間を決定し、決定した区間内の演奏を行ううえで可能性のある全ての運指の組み合わせのなかからコストが最小となる組み合わせを抽出することで行っている。それにより、指定音に対して最適な運指を修正時には確実に設定させている。
【００３８】
このようにして本実施の形態では、補正後のコストが定数ＴＨＲＣＯＳＴとして設定した許容範囲内となっていない運指のみを修正の対象として、より適切なものとなるように修正を行うようにしている。それにより、ステップＳＢ１で生成した運指情報は、運指（音符）単位で必要に応じて修正するようにしている。
【００３９】
必要に応じた修正を行うようにしたことにより、逐次生成処理での運指情報の生成には比較的に簡単なアルゴリズムを採用することができる。このため、簡単なアルゴリズムで最適、或いはそれに近い運指情報の生成が可能な曲（演奏データ）では、その生成を迅速に行うことができる。そうでない楽曲でも、生成後の必要に応じた修正により、最適、或いはそれに近い運指情報を得ることができる。
【００４０】
以降は、上記運指生成処理内で直接的、或いは間接的に呼び出されるサブルーチン処理について詳細に説明する。
図５、及び図６は、上記ステップＳＢ４として実行される禁止事項検索処理のフローチャートである。そのサブルーチン処理としては、始めに図５、及び図６を参照して、その検索処理について詳細に説明する。
【００４１】
例えば親指や小指はその長さ、手の位置などの理由により、鍵盤７上の黒鍵の押鍵はそれ以外の指よりも困難である。同じ指を使った連続する押鍵は、離鍵から押鍵までの時間間隔、押鍵する鍵間の距離（音高（ピッチ）差）などに応じて難易度（コスト）が変化する。時間間隔が短く、且つ鍵間の距離が大きいような場合、その押鍵は不可能か、或いは極めて困難となる。他にも不可能、或いは極めて困難な運指は存在する。このようなことから、禁止事項検索処理では、指定音に割り当てられた運指が不可能、或いは極めて困難と考えられる条件（禁止事項）の何れにも相当していないか否か検索により確認するようになっている。
【００４２】
先ず、ステップＳＤ１では、データの設定、及び変数への値の代入を行う。具体的には、データではＭＥ［ｍｅ］．ｎｐとして０を設定し、変数では、変数ｆにＭＥ［ｍｅ］．ｆｉｇ、変数ｐにＭＥ［ｍｅ］．ｐｏｓｘ、変数ｂｗに変数ｐの値を２で割った余り（＝ｐ％２）、変数ｎｆにＭＥ［ｍｅ＋１］．ｆｉｇ、変数ｎｐにＭＥ［ｍｅ＋１］．ｐｏｓｘ、変数ｐｆにＭＥ［ｍｅ−１］．ｆｉｇ、及び変数ｐｐにＭＥ［ｍｅ−１］．ｐｏｓｘ、をそれぞれ代入する。ステップＳＤ２にはその後に移行する。
【００４３】
ステップＳＤ２では、変数ｐの値が０、或いは４で、かつ変数ｂｗの値が１か否か判定する。変数ｐの値としての０、４は親指、小指を表し、変数ｂｗの値としての１は押鍵すべき鍵が黒鍵であることを表している。このことから、指定音を発音させるための鍵が黒鍵でないか、或いは黒鍵であっても押鍵に親指、及び小指の何れも設定されていない場合、判定はＮＯとなってステップＳＤ５に移行する。そうでない場合には、つまり、その鍵が黒鍵であり、かつその押鍵に親指、或いは小指が設定されていた場合、判定はＹＥＳとなってステップＳＤ３に移行する。
【００４４】
ステップＳＤ３では、変数ｐの値から変数ｎｐの値を引いた値の絶対値が２未満か、或いは変数ｐの値から変数ｐｐの値を引いた値の絶対値が２未満か否か判定する。指定音とその前音符の間、及び指定音とその次音符の間のピッチ差のいずれかが絶対値で２未満であった場合、判定はＹＥＳとなり、禁止事項を満たしているとして、ステップＳＤ４でＭＥ［ｍｅ］．ｎｐとして１を設定した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップＳＤ５に移行する。
【００４５】
ステップＳＤ５では、ＭＥ［ｍｅ］．ｈｍｎｙが０でなく、かつＭＥ［ｍｅ−１］．ｈｍｎｙが０でないか否か判定する。変数ｍｅ、及びその値から１を引いた値で指定される、隣り合う２つの音符が共に和音の構成音であった場合、それらのデータｈｍｎｙとして０ではない値が設定されていることから、判定はＹＥＳとなってステップＳＤ６に移行し、そうでない場合には、つまりそれら２つの音符の内の少なくとも一方が和音の構成音でない場合には、判定はＮＯとなってステップＳＤ７に移行する。
【００４６】
ステップＳＤ７では、変数ｆの値から変数ｎｆの値を引いた値の絶対値が２以下であり、かつ変数ｐの値から変数ｎｐの値を引いた値の絶対値が６より大きいか否か判定する。隣り合う２つの音符の押鍵にそれぞれ割り当てられた２つの指は隣り合うか、或いはその間に１本の指が位置する関係にあり、かつその２つの音符のピッチ差が鍵６個分より大きい場合、判定はＹＥＳとなってステップＳＤ４に移行する。それにより、不可能と考える程、指を開かなければならないような運指は禁止事項に該当していると見なす。そうでない場合には、つまり指の開き具合によって２つの音符を発音させるための押鍵が行えるような運指であった場合には、判定はＮＯとなって図６のステップＳＤ８に移行する。
【００４７】
図６のステップＳＤ８では、変数ｓｏｃｎｔにＭＥ［ｍｅ］．ｓｏの絶対値、変数ｍｅｐｏｌｙに変数ｍｅの値を代入する。次のステップＳＤ９では、ＭＥ［ｍｅ］．ｓｏが０より大きいか否か判定する。変数ｍｅの値で指定される音符の発音開始時刻に発音中の他の音符が存在する場合、ＭＥ［ｍｅ］．ｓｏの値として０より大きい値が設定されることから、判定はＹＥＳとなってステップＳＤ１０に移行し、そうでない場合には、つまり、そのような音符が存在しないような場合には、判定はＮＯとなってステップＳＤ１７に移行する。
【００４８】
ステップＳＤ１０〜ＳＤ１６では、変数ｍｅの値で指定される音符の発音開始時刻に発音中の他の音符が存在する場合を想定して決定した禁止事項に該当するものを抽出するための処理が行われる。
【００４９】
先ず、ステップＳＤ１０では、変数ｓｏｃｎｔの値が０より大きいか否か判定する。その値が０以下であった場合、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなり、ステップＳＤ１１で変数ｍｅｐｏｌｙの値をデクリメントし、更にＭＥ［ｍｅｐｏｌｙ］．ｔｉｍｅの値にＭＥ［ｍｅｐｏｌｙ］．ｇａｔｅの値を加算し、その加算結果からＭＥ［ｍｅ］．ｔｉｍｅの値を引いた値をＭＥ［ｍｅ］．ｇａｔｅの値で割って得られる値（＝（ＭＥ［ｍｅｐｏｌｙ］．ｔｉｍｅ＋ＭＥ［ｍｅｐｏｌｙ］．ｇａｔｅ−ＭＥ［ｍｅ］．ｔｉｍｅ）／ＭＥ［ｍｅ］．ｇａｔｅ）を変数ｏｖｅｒに代入してからステップＳＤ１２に移行する。変数ｏｖｅｒに代入される値は、変数ｍｅｐｏｌｙの値で指定される音符の発音終了時刻と、変数ｍｅの値で指定される音符の発音開始時刻との間の時間間隔を後者の発音時間で割って得られる値、つまり後者の発音開始時刻となって以降に前者が発音終了される時間を後者の発音時間で割って得られる値である。
【００５０】
ステップＳＤ１２では、変数ｏｖｅｒの値が定数ＰＯＬＹＲＡＴＩＯより大きく、且つＭＥ［ｍｅｐｏｌｙ］．ｔｉｍｅの値がＭＥ［ｍｅ］．ｔｉｍｅの値未満か否か判定する。定数ＰＯＬＹＲＡＴＩＯは、２つの音符の間で発音時間の重なっている期間の割合が一定以上の音符を抽出するために用意した閾値である。このことから、その割合が一定以上の２つの音符を異なるタイミングで押鍵しなければならないような場合、判定はＹＥＳとなってステップＳＤ１３に移行し、そうでない場合には、判定はＮＯとなり、ステップＳＤ１２Ａで、変数ｏｖｅｒが０より大きい場合に変数ｓｏｃｎｔの値をデクリメントしてから上記ステップＳＤ１０に戻る。
【００５１】
ステップＳＤ１３では、変数ｆ１にＭＥ［ｍｅ］．ｆｉｇの値、変数ｆ２にＭＥ［ｍｅｐｏｌｙ］．ｆｉｇの値、変数ｐ１にＭＥ［ｍｅ］．ｐｏｓｘの値、変数ｐ２にＭＥ［ｍｅｐｏｌｙ］．ｐｏｓｘの値をそれぞれ代入する。それに続くステップＳＤ１４〜ＳＤ１６では、変数ｍｅ、ｍｅｐｏｌｙの各値で指定される２つの音符が、同じ指を用いて押鍵すべきピッチの異なる音符である、親指、或いは親指に近いほうの指をピッチの大きいほうの音符の押鍵に使わなければならない、或いはその逆に、小指、或いは小指に近いほうの指をピッチの小さいほうの音符の押鍵に使わなければならない、の何れかの禁止事項に該当しているか否か判定するための処理を行う。それら禁止事項の何れにも該当していない場合、最終的にステップＳＤ１６の判定がＮＯとなって上記ステップＳＤ１２Ａに移行する。そうでない場合には、ステップＳＤ１４〜ＳＤ１６の何れかの判定がＹＥＳとなって図５のステップＳＤ４に移行する。後者の２つの禁止事項の何れかに該当している場合、２つの音符に対応する鍵の押鍵時に指は交差させることになる。
【００５２】
上記ステップＳＤ９の判定がＮＯとなって移行するステップＳＤ１７では、ＭＥ［ｍｅ］．ｓｏが０未満か否か判定する。変数ｍｅの値で指定される音符の発音終了時刻前に発音を開始する他の音符が存在する場合、ＭＥ［ｍｅ］．ｓｏの値として０未満の値が設定されることから、判定はＹＥＳとなってステップＳＤ１８に移行し、そうでない場合には、つまり、そのような音符が存在しないような場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００５３】
ステップＳＤ１８〜ＳＤ２４では、変数ｍｅの値で指定される音符の発音終了時刻前に発音が開始される他の音符が存在する場合を想定して決定した禁止事項に該当するものを抽出するための処理が行われる。その禁止事項は、変数ｍｅの値で指定される音符の発音開始時刻に発音中の他の音符が存在する場合を想定して決定したものと基本的に同じである。また、ステップＳＤ１８〜ＳＤ２４の処理内容、及びその流れも上述のステップＳＤ１０〜ＳＤ１６のそれと同様である。これらのことから、詳細な説明は省略する。
【００５４】
このようにして、指定音（変数ｍｅの値で指定される音符）の前後に位置する音符を含めて考慮し、その指定音を発音させるために設定した運指が禁止事項の何れかに該当しているか否か確認し、何れかの禁止事項に該当している場合に、データｎｐ（ＭＥ［ｍｅ］．ｎｐ）として１を設定するようになっている。
【００５５】
図７は、図４に示す運指生成処理内でステップＳＢ６として実行される指定音コスト算出処理のフローチャートである。次にその算出処理について、図７に示すそのフローチャートを参照して詳細に説明する。
【００５６】
先ず、ステップＳＧ１では、変数ｅｖ１、及びｅｖ２にそれぞれ、変数ｍｅの値、その値に１を加算した値を代入する。次のステップＳＧ２では、指定音とその次音符間のコストを算出する２音間コスト算出処理を実行する。その次に移行するステップＳＧ３では、その算出処理の実行によりコストの値として変数ｃｏｓｔ２ｅｖに代入された値を、指定音のコストとして設定（ＭＥ［ｍｅ］．ｃｏｓｔ←ｃｏｓｔ２ｅｖ）する。その後はステップＳＧ４に移行して、設定したコストの値が定数ＭＡＸＣＯＳＴと等しいか否か判定する。その定数ＭＡＸＣＯＳＴは、コストの最大値として設定したものである。その定数ＭＡＸＣＯＳＴが変数ｃｏｓｔ２ｅｖに代入されていた場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップＳＧ５に移行する。
【００５７】
ステップＳＧ５では、各種変数への値の代入を行う。具体的には、変数ｎには０、変数ｃｏｅｆには１、変数ｔｄにはＭＥ［ｅｖ２］．ｔｉｍｅの値からＭＥ［ｅｖ１］．ｔｉｍｅの値を引いた値（変数ｅｖ１、及びｅｖ２の値で指定される２つの音符間の発音開始時刻の時間間隔）をそれぞれ代入する。その後に移行するステップＳＧ６では、変数ｎの値が定数ＭＡＸＯＳ未満か否か判定する。その値が定数ＭＡＸＯＳ以上であった場合、判定はＮＯとなってステップＳＧ１０に移行し、そうでない場合には、判定はＹＥＳとなってステップＳＧ７に移行する。
【００５８】
ステップＳＧ７では、変数ｔｄの値が、コスト補正テーブルＴＭＣＦの変数ｎの値で指定されるレコードに格納されたデータｄｉｆｆ（図中「ＴＭＣＦ［ｎ］．ｄｉｆｆ」と表記。以降、この表記法も併せて用いる）の値以下か否か判定する。変数ｔｄの値がデータｄｉｆｆの値以下であった場合、判定はＹＥＳとなり、ステップＳＧ９で変数ｃｏｅｆに、コスト補正テーブルＴＭＣＦの変数ｎの値で指定されるレコードに格納されたデータｃｏｅｆ（図中「ＴＭＣＦ［ｎ］．ｃｏｅｆ」と表記）の値を代入し、その代入後、変数ｃｏｓｔ２ｅｖに、それまでの値に変数ｃｏｅｆの値を掛けた値を代入してからステップＳＧ１０に移行する。そうでない場合には、判定はＮＯとなり、ステップＳＧ８で変数ｎの値をインクリメントしてから上記ステップＳＧ６に戻る。
【００５９】
ここで、上記ステップＳＧ６〜ＳＧ９によって行われるコスト補正方法、及び上記２音間コスト算出処理で行われるコスト算出方法について図９を参照して具体的に説明する。その図９は、ＲＯＭ２に格納されたテーブルのデータ構成を説明する図であり、図９（ａ）は運指コストテーブル、図９（ｂ）はコスト補正テーブルのそれを示している。
【００６０】
始めに、２音間コスト算出処理でのコスト算出方法について図９（ａ）を参照して具体的に説明する。
図９（ａ）中、「ｂｗ」は鍵盤種類（０は白鍵、１は黒鍵）、「ｐｍ」はピッチ変化方向（０は増加方向、１は減少方向）、「ｆｉｇ１」は変数ｅｖ１の値で指定される音符の指番号、「ｆｉｇ２」は変数ｅｖ２の値で指定される音符の指番号、「ｉｎｔｖ」はそれら２つの音符間のピッチ差、をそれぞれ表している。それにより、テーブルＣＴは、それらのデータの各値の組み合わせで示される状況別に、その状況下での運指のコストを格納したものとなっている。このことから、２音間コスト算出処理では、それらのデータを求め、定数ＭＡＸＣＯＳＴを代入すべき条件が満たされていない場合に、各値の組み合わせで指定される欄に格納されたコスト（値）を抽出して変数ｃｏｓｔ２ｅｖに代入するようになっている。運指コストテーブルＣＴは、５個の値によって示される状況別にコストの値を格納したものであることから、５次元の配列変数ＣＴの形での表記も併用することとする。
【００６１】
上述したような構成の運指コストテーブルＣＴでは、２音間の発音開始時刻の時間間隔が考慮されていない。その時間間隔が短くなるほど、運指は困難となるのが普通である。上記ステップＳＧ６〜ＳＧ９でのコスト補正は、図９（ｂ）に示すコスト補正テーブルを参照して、その時間間隔をコストに反映させるために行われる。
【００６２】
図９（ｂ）中の「ｄｉｆｆ」は時間間隔、「ｃｏｅｆ」はその時間間隔に対して設定した係数、をそれぞれ表している。それにより、コスト補正テーブルＴＭＣＦは、総数ＭＡＸＯＳの各レコードに、時間間隔、及び係数を格納した構成となっている。
【００６３】
レコードに格納する時間間隔は、それを指定する値（レコード番号）が小さくなるほど、より短いものとさせている。それにより、ステップＳＧ６〜ＳＧ９では、変数ｎの値を順次、インクリメントしながら、格納した時間間隔が変数ｔｄの値以上のレコードを特定し、特定したレコードのデータｃｏｅｆの値を変数ｃｏｅｆに代入して変数ｃｏｓｔ２ｅｖの値を補正（更新）するようになっている。
【００６４】
図７のステップＳＧ１０以降の説明に戻る。
そのステップＳＧ１０では、ＭＥ［ｅｖ１］．ｔｉｍｅの値にＭＥ［ｅｖ１］．ｇａｔｅの値を加算し、その加算結果からＭＥ［ｅｖ２］．ｔｉｍｅの値を引いて得られる値（変数ｅｖ１の値で指定される音符の発音終了時刻と変数ｅｖ２の値で指定される音符の発音開始時刻との間の時間間隔）を変数ｏｖｅｒに代入する。続くステップＳＧ１１では、変数ｏｖｅｒが０より大きく、かつ変数ｔｄの値も０より大きいか否か判定する。それらの値が共に０より大きい場合、つまり指定音の次音符は指定音の発音終了時刻前に異なるタイミングで発音を開始させなければならない場合、判定はＹＥＳとなってステップＳＧ１２に移行する。そうでない場合には、判定はＮＯとなってステップＳＧ１６に移行し、変数ｃｏｓｔ２ｅｖの値が定数ＭＡＸＣＯＳＴより大きければその定数ＭＡＸＣＯＳＴを変数ｃｏｓｔ２ｅｖに代入してからその値をＭＥ［ｍｅ］．ｃｏｓｔとして設定する。一連の処理はその後に終了する。
【００６５】
ステップＳＧ１２では、変数ｔｄの値をＭＥ［ｅｖ１］．ｇａｔｅの値で割った値に１００を掛けて得られる値を変数ｂｌａｎｋに代入する。すなわち変数ｂｌａｎｋは、指定音の発音継続時間に対する、次音符との発音時間が重ならない時間の割合を示す値である。その代入後に移行するステップＳＧ１３では、変数ｂｌａｎｋの値が８０より大きいか否か判定する。その値が８０より大きい場合、判定はＹＥＳとなり、ステップＳＧ１４で変数ｃｏｓｔ２ｅｖに変数ｃｏｅｆの値を３倍した値を代入する。そうでない場合には、判定はＮＯとなり、ステップＳＧ１５で変数ｃｏｓｔ２ｅｖに、それまでの値に変数ｃｏｅｆの値を３倍した値を加算して得られる値を代入する。ステップＳＧ１４、或いはＳＧ１５の処理の実行後は上記ステップＳＧ１６に移行する。
【００６６】
このようにして、指定音コスト算出処理は、上記ステップＳＧ２として２音間コスト算出処理を実行することで変数ｃｏｓｔ２ｅｖに代入された値を、２音間の発音開始時刻の時間間隔、発音時間が重なっている割合に着目して補正するようになっている。
【００６７】
次にその２音間コスト算出処理について、図８に示すそのフローチャートを参照して詳細に説明する。その算出処理では、上述したように、必要に応じて、図９（ａ）に示す運指コストテーブルＣＴに格納されたコストを抽出して変数ｃｏｓｔ２ｅｖに代入するようになっている。
【００６８】
先ず、ステップＳＳ１では、変数ｆ１にＭＥ［ｅｖ１］．ｆｉｇの値、変数ｐ１にＭＥ［ｅｖ１］．ｐｏｓｘの値、変数ｂｗに変数ｐ１の値を２で割った余り（図中「ｐ１％２」と表記）、変数ｆ２にＭＥ［ｅｖ２］．ｆｉｇの値、変数ｐ２にＭＥ［ｅｖ２］．ｐｏｓｘの値、をそれぞれ代入する。続くステップＳＳ２では、変数ｐ１の値が変数ｐ２の値未満か否か判定する。後者が前者より大きい場合、判定はＹＥＳとなり、ステップＳＳ３で０を変数ｐｍに、変数ｐ２の値から変数ｐ１の値を引いた値を変数ｉｎｔｖにそれぞれ代入してからステップＳＳ５に移行する。そうでない場合には、判定はＮＯとなり、ステップＳＳ４で１を変数ｐｍに、変数ｐ１の値から変数ｐ２の値を引いた値を変数ｉｎｔｖにそれぞれ代入してからステップＳＳ５に移行する。
【００６９】
ステップＳＳ５では、変数ｉｎｔｖの値が定数ＭＡＸＩＮＴＶより小さいか否か判定する。その定数ＭＡＸＩＮＴＶは、運指により押鍵を行う難易度が極めて高いと考えられる鍵間（ピッチ差）を判定するために用意したものである。このことから、着目する２つの音符の間にそのようなピッチ差が存在していない場合、判定はＹＥＳとなり、ステップＳＳ６で変数ｃｏｓｔ２ｅｖに、変数ｂｗ、ｐｍ、ｆ１、ｆ２、及びｉｎｔｖの各値によって運指コストテーブルＣＴから抽出される値（図中「ＣＴ［ｂｗ］［ｐｍ］［ｆ１］［ｆ２］［ｉｎｔｖ］」と表記）を代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ステップＳＳ７で変数ｃｏｓｔ２ｅｖに定数ＭＡＸＣＯＳＴを代入した後、一連の処理を終了する。
【００７０】
図４に示す運指生成処理では、図７に示す指定音コスト算出処理をステップＳＢ６で実行した後、続くステップＳＢ７でコスト補正処理を実行することにより、指定音（変数ｍｅの値で指定される音符）のコストとして変数ＭＥ［ｍｅ］．ｃｏｓｔに代入されている値を必要に応じて更に補正するようになっている。次にそのコスト補正処理について、図１０に示すそのフローチャートを参照して詳細に説明する。
【００７１】
先ず、ステップＳＣ１では、変数ｆにＭＥ［ｍｅ］．ｆｉｇの値、変数ｐにＭＥ［ｍｅ］．ｐｏｓｘの値、変数ｎｆにＭＥ［ｍｅ＋１］．ｆｉｇの値、変数ｎｐにＭＥ［ｍｅ＋１］．ｐｏｓｘの値、変数ｓａｍｅｆ、ｐａｓｓｆ、及びｅｘｃｆに０をそれぞれ代入する。続くステップＳＣ２では、変数ｆの値が変数ｎｆの値と等しく、かつ変数ｐの値が変数ｎｐの値と等しくないか否か判定する。指定音とその次音符が、同じ指を用いて押鍵すべきピッチの異なる音符であった場合、判定はＹＥＳとなり、ステップＳＣ３で変数ｓａｍｅｆに１を代入してからステップＳＣ４に移行する。そうでない場合には、判定はＮＯとなり、次にそのステップＳＣ４の処理を実行する。
【００７２】
ステップＳＣ４では、変数ｆの値が０であり、変数ｎｆの値は０より大きく、かつ変数ｐの値は変数ｎｐの値より大きいか否か判定する。指定音の押鍵に使うべき指が親指であり、その次音符の押鍵に使うべき指は親指以外の指であり、かつ指定音は次音符よりピッチが大きい場合、判定はＹＥＳとなり、ステップＳＣ５で変数ｐａｓｓｆに１を代入してからステップＳＣ６に移行する。そうでない場合には、つまり指定音の押鍵に使うべき指が親指でない、その次音符の押鍵に使うべき指は親指である、或いは指定音のピッチは次音符のピッチ以下である場合には、判定はＮＯとなり、次にそのステップＳＣ６に移行する。
【００７３】
ステップＳＣ６では、変数ｆの値が０より大きく、変数ｎｆの値は０と等しく、かつ変数ｐの値は変数ｎｐの値より小さいか否か判定する。指定音の押鍵に使うべき指が親指以外の指であり、その次音符の押鍵に使うべき指は親指であり、かつ指定音のピッチは次音符のピッチより小さい場合、判定はＹＥＳとなり、ステップＳＣ７で変数ｐａｓｓｆに２を代入してからステップＳＣ８に移行する。そうでない場合には、つまり指定音の押鍵に使うべき指が親指である、その次音符の押鍵に使うべき指は親指以外の指である、或いは指定音は次音符のピッチ以上である場合には、判定はＮＯとなり、次にそのステップＳＣ８に移行する。
【００７４】
ステップＳＣ８では、変数ｎｆの値から変数ｆの値を引いた値に、変数ｎｐの値から変数ｐの値を引いた値を掛けて得られる乗算結果が０より小さく、変数ｆの値は０より大きく、かつ変数ｎｐの値は０より大きいか否か判定する。その乗算結果が０より小さく、指定音の押鍵に使うべき指が親指以外の指であり、その次音符の押鍵に使うべき指も親指以外の指であった場合、判定はＹＥＳとなり、ステップＳＣ９で変数ｅｘｃｆに１を代入してからステップＳＣ１０に移行する。そうでない場合には、つまり乗算結果は０以上である、指定音の押鍵に使うべき指は親指である、或いはその次音符の押鍵に使うべき指は親指である場合には、判定はＮＯとなり、次にステップＳＣ１０に移行する。
【００７５】
変数ｎｆの値から変数ｆの値を引いた値、及び変数ｎｐの値から変数ｐの値を引いた値の符号が同じとなるのは、次音符の押鍵に使う指は指定音のその指より小指側に位置しており、かつ次音符は指定音よりピッチが大きいという条件、或いは次音符の押鍵に使う指は指定音のその指より親指側に位置しており、かつ次音符は指定音よりピッチが小さいという条件、を満たしている場合である。上記乗算結果は、それらの条件の何れも満たされていない場合に０より小さくなる。
【００７６】
ステップＳＣ１０〜ＳＣ１８では、ステップタイム補正処理、多声補正処理、指越え指くぐり補正処理、和音対分散和音補正処理、分散和音対分散和音補正処理、単音対和音補正処理、和音対単音補正処理、和音対和音補正処理、及び前方和音補正処理、を順次、実行する。ステップＳＣ１８として前方和音補正処理を実行した後、一連の処理を終了する。
【００７７】
上記ステップＳＣ１０〜ＳＣ１８の各補正処理は、互いに異なる内容に着目してコストを補正する処理である。本実施の形態では、それら各補正処理を順次、実行することにより、指定音コスト算出処理で算出されたコストはより適切なものとなるように補正を行っている。
【００７８】
以降は、上記コスト補正処理内で実行される各種サブルーチン処理について詳細に説明する。
図１１は、上記ステップＳＣ１０として実行されるステップタイム補正処理のフローチャートである。コスト補正処理内で実行されるサブルーチン処理としては、始めに図１１を参照して、ステップタイム補正処理について詳細に説明する。そのステップタイム補正処理は、指定音と次音符間の発音開始時刻の時間間隔に着目して、指定音のコスト（ＭＥ［ｍｅ］．ｃｏｓｔ）の補正を行う処理である。
【００７９】
先ず、ステップＳＥ１では、変数ｔｉｍｅｉｎｔに、ＭＥ［ｍｅ＋１］．ｔｉｍｅの値からＭＥ［ｍｅ］．ｔｉｍｅの値を引いた値（指定音とその次音符間の発音開始時刻の時間間隔）を代入し、変数ｃｏｅｆには定数ＢＡＳＥを代入する。ここでは便宜的に、変数ｔｉｍｅｉｎｔに代入する値はｍｓ単位で時間間隔を表す値を想定する。定数ＢＡＳＥは、その時間間隔に着目する場合の基準として設定した値である。
【００８０】
ステップＳＥ１に続くステップＳＥ２では、変数ｔｉｍｅｉｎｔの値が示す時間間隔の判定を行う。ここでは、その時間間隔が２０００ｍｓより大きいか、１０ｍｓ以下か、或いはその間であるか否かの判定を行う。その時間間隔が２０００ｍｓより大きいと判定するとステップＳＥ３に、１０ｍｓ以下と判定するとステップＳＥ４に、その間、つまり１１〜２０００ｍｓの間と判定するとステップＳＥ６に、それぞれ移行する。
【００８１】
ステップＳＥ３では、変数ｓａｍｅｆの値が０より大きい、変数ｐａｓｓｆの値が０より大きい、或いは変数ｅｘｃｆの値が０より大きければ３、それらの値の全てが０より大きくなければ０、をＭＥ［ｍｅ］．ｃｏｓｔとして設定する。続くステップＳＥ４では、ＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に対し、変数ｃｏｅｆの値を定数ＢＡＳＥで割った値を乗算して得られる値を設定する。その次に移行するステップＳＥ５では、ＭＥ［ｍｅ］．ｃｏｓｔの値が定数ＭＡＸＣＯＳＴより大きければその定数ＭＡＸＣＯＳＴをＭＥ［ｍｅ］．ｃｏｓｔとして設定する。一連の処理はその後に終了する。
【００８２】
上記ステップＳＥ６では、変数ｓａｍｅｆの値が０より大きい、変数ｐａｓｓｆの値が０より大きい、或いは変数ｅｘｃｆの値が０より大きいか否か判定する。それらの値のうち一つでも０より大きい場合、判定はＹＥＳとなってステップＳＥ４に移行し、そうでない場合には、つまりそれらの値の全てが０より大きくない場合には、判定はＮＯとなってステップＳＥ７に移行する。
【００８３】
ステップＳＥ７では、変数ｔｉｍｅｉｎｔの値が示す時間間隔の判定を行う。その後は、判定結果に応じたステップの処理を実行する。
その時間間隔が５０１〜２０００の間と判定した場合、次にステップＳＥ４の処理に移行する。その時間間隔が２４１〜５００の間と判定した場合には、次にステップＳＥ８で変数ｃｏｅｆにそれまでの値に１を加算した値を代入した後、そのステップＳＥ４に移行する。以降、同様にして、その時間間隔が１８１〜２４０の間と判定した場合には、次にステップＳＥ９で変数ｃｏｅｆにそれまでの値に２を加算した値を代入した後、その時間間隔が１２１〜１８０の間と判定した場合には、次にステップＳＥ１０で変数ｃｏｅｆにそれまでの値に３を加算した値を代入した後、その時間間隔が５１〜１２０の間と判定した場合には、次にステップＳＥ１１で変数ｃｏｅｆにそれまでの値に４を加算した値を代入し、更にステップＳＥ１３において、変数ｆ、及びｎｆの値が共に３以上ならばＭＥ［ｍｅ］．ｃｏｓｔにそれまでの値に変数ｃｏｅｆの値を加算して得られる値を設定した後、その時間間隔が１１〜５０の間と判定した場合には、次にステップＳＥ１２で変数ｃｏｅｆにそれまでの値に５を加算した値を代入し、更にステップＳＥ１３の処理を実行した後、そのステップＳＥ４に移行する。それにより、変数ｔｉｍｅｉｎｔの値が示す時間間隔に応じてコストを補正する。
【００８４】
図１２は、図１０に示すコスト補正処理内でステップＳＣ１１として実行される多声補正処理のフローチャートである。次に図１２を参照して、その多声補正処理について詳細に説明する。その補正処理は、指定音の発音開始時刻に発音中の他の音符、或いはその発音終了時刻前に発音を開始する他の音符に着目して、指定音のコスト（ＭＥ［ｍｅ］．ｃｏｓｔ）の補正を行う処理である。
【００８５】
先ず、ステップＳＮ１では、変数ｓｏｃｎｔに、ＭＥ［ｍｅ］．ｓｏの値の絶対値を代入し、変数ｍｅｐｏｌｙに変数ｍｅの値を代入する。続くステップＳＮ２では、ＭＥ［ｍｅ］．ｓｏの値が０より大きいか否か判定する。その値が０以下であった場合、判定はＮＯとなってステップＳＮ１０に移行し、そうでない場合には、判定はＹＥＳとなってステップＳＮ３に移行する。
【００８６】
ステップＳＮ３では、変数ｓｏｃｎｔの値が０より大きいか否か判定する。その値が０以下の場合、判定はＮＯとなり、ステップＳＮ９でＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に対し、ＭＥ［ｍｅ］．ｓｏの値に１を加算した値の絶対値で割って得られる値を設定した後、一連の処理を終了する。そうでない場合には、判定はＹＥＳとなってステップＳＮ４に移行する。
【００８７】
ステップＳＮ４では、変数ｍｅｐｏｌｙにそれまでの値から１を引いた値を代入し、変数ｏｖｅｒには、ＭＥ［ｍｅｐｏｌｙ］．ｔｉｍｅの値にＭＥ［ｍｅｐｏｌｙ］．ｇａｔｅの値を加算した値からＭＥ［ｍｅ］．ｔｉｍｅの値を減算し、その減算結果（指定音の発音開始後に、変数ｍｅｐｏｌｙの値で指定される音符が発音している時間）をＭＥ［ｍｅ］．ｇａｔｅの値で割って得られる値を代入する。その後に移行するステップＳＮ５では、変数ｏｖｅｒの値が定数ＰＯＬＹＲＡＴＩＯより大きく、かつＭＥ［ｍｅｐｏｌｙ］．ｔｉｍｅの値がＭＥ［ｍｅ］．ｔｉｍｅの値未満か否か判定する。その定数ＰＯＬＹＲＡＴＩＯは、上述したように、２つの音符の間で発音時間の重なっている期間の割合が一定以上の音符を抽出するために用意した閾値である。変数ｍｅｐｏｌｙの値で指定される音符は指定音の発音開始時刻、或いはその前に発音が開始される音符である。これらのことから、その割合が一定以上の２つの音符を異なるタイミングで押鍵しなければならないような場合、判定はＹＥＳとなってステップＳＮ６に移行し、そうでない場合には、判定はＮＯとなり、ステップＳＮ５Ａで、変数ｏｖｅｒが０より大きい場合に変数ｓｏｃｎｔの値をデクリメントしてから上記ステップＳＮ３に戻る。
【００８８】
ステップＳＮ６では、変数ｅｖ１に変数ｍｅの値、変数ｅｖ２に変数ｍｅｐｏｌｙの値をそれぞれ代入する。続くステップＳＮ７では、それらの値で指定される２つの音符に着目させた２音間コスト算出処理を実行する。その実行後は、ステップＳＮ８でＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に変数ｃｏｓｔ２ｅｖの値を加算した値を設定してから上記ステップＳＮ５Ａに移行する。
【００８９】
このようにして、本実施の形態では、発音時間の重なっている期間の割合が一定以上の２つの音符を異なるタイミングで押鍵しなければならないような場合、ＭＥ［ｍｅ］．ｃｏｓｔを、それまでの値よりも大きい値に更新する形で補正を行うようにしている。その更新は、発音時間の重なっている音符の数分、行うことから、その数が多くなるほど、より大きい値に更新されることになる。
【００９０】
上記ステップＳＮ２の判定がＮＯとなって移行するステップＳＮ１０では、ＭＥ［ｍｅ］．ｓｏの値が０未満か否か判定する。その値が０未満であった場合、判定はＹＥＳとなってステップＳＮ１１に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００９１】
上記ステップＳＮ３〜ＳＮ８では、指定音（変数ｍｅの値で指定される音符）の発音開始時刻に発音中の他の音符を考慮して指定音のコストを補正するための処理を行うようになっている。ステップＳＮ１１〜ＳＮ１６では、指定音の発音終了時刻前に発音が開始される他の音符を考慮して指定音のコストを補正するための処理が行われる。そのコストの補正を行う条件、及びその補正を行う方法等は基本的に同じであるため、詳細な説明は省略することとする。
【００９２】
図１３は、図１０に示すコスト補正処理内でステップＳＣ１２として実行される指越え指くぐり補正処理のフローチャートである。次に図１３を参照して、その補正処理について詳細に説明する。その補正処理は、指定音の押鍵に必要な、指越え、或いは指くぐりという比較的に高度な演奏方法に着目して、そのコスト（ＭＥ［ｍｅ］．ｃｏｓｔ）の補正を行う処理である。
【００９３】
先ず、ステップＳＬ１では、変数ｐａｓｓｆの値が１か否か判定する。その１は、次音符の押鍵は親指の上に越えさせた親指以外の指により行わせる状況であることを意味する。このことから、指越えを行う状況である場合、判定はＹＥＳとなり、ステップＳＬ２で変数ｍｅｐａｓｓに変数ｍｅの値に１を加算した値、変数ｍｅｎｐａｓｓに変数ｍｅの値をそれぞれ代入してからステップＳＬ５に移行する。そうでない場合には、判定はＮＯとなってステップＳＬ３に移行する。
【００９４】
ステップＳＬ３では、変数ｐａｓｓｆの値が２か否か判定する。その２は、次音符の押鍵は親指を他の指の下にくぐらせて行わせる状況であることを意味する。このことから、指くぐりを行う状況である場合、判定はＹＥＳとなり、ステップＳＬ４で変数ｍｅｐａｓｓに変数ｍｅの値、変数ｍｅｎｐａｓｓに変数ｍｅの値に１を加算した値をそれぞれ代入してからステップＳＬ５に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００９５】
ステップＳＬ５では、指定音に至る前の演奏区間の音符の並びを考慮してコストの補正を行うための指越え指くぐり基本補正処理を実行する。次のステップＳＬ６では、発音開始時刻の時間間隔（ステップタイム）を考慮してコストの補正を行うための、ステップタイム・跳躍進行補正処理を実行する。その後はステップＳＬ７に移行して、ＭＥ［ｍｅ］．ｃｏｓｔの値が定数ＭＡＸＣＯＳＴより大きければ定数ＭＡＸＣＯＳＴ、その値が０未満であれば０をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定することにより更新する。一連の処理はその後に終了する。
【００９６】
ここで、上記ステップＳＬ５、及びＳＬ６として実行される各サブルーチン処理について、図１４、及び図１５に示す各フローチャートを参照して詳細に説明する。
図１４は、上記ステップＳＬ５として実行される指越え指くぐり基本補正処理のフローチャートである。始めに図１４を参照して、その補正処理について詳細に説明する。
【００９７】
先ず、ステップＳＰ１では、変数ｆにＭＥ［ｍｅｐａｓｓ］．ｆｉｇの値、変数ｐｉｎｔに、ＭＥ［ｍｅ］．ｐｏｓｘの値からＭＥ［ｍｅ＋１］．ｐｏｓｘの値を引いた値の絶対値をそれぞれ代入する。続くステップＳＰ２では、変数ｆの値が１であり、かつ変数ｐｉｎｔの値が５より大きいか、変数ｆの値が２であり、かつ変数ｐｉｎｔの値が４より大きいか、或いは変数ｆの値が３であり、かつ変数ｐｉｎｔの値が３より大きいか否か判定する。変数ｆの値は１であり、かつ変数ｐｉｎｔの値は５より大きい、変数ｆの値は２であり、かつ変数ｐｉｎｔの値は４より大きい、或いは変数ｆの値は３であり、かつ変数ｐｉｎｔの値は３より大きい場合、判定はＹＥＳとなり、ステップＳＰ３でＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に変数ｐｉｎｔの値を加算した値を設定してからステップＳＰ４に移行する。そうでない場合には、判定はＮＯとなってそのステップＳＰ４に移行する。ステップＳＰ２でのＹＥＳの判定は、指定音の押鍵に使うべき指、及び指定音とその次音符間のピッチ差に着目して決定した、コストをより大きく補正すべき条件を満たしていることを意味している。
【００９８】
ステップＳＰ４では、変数ｍｅｔｍｐに変数ｍｅの値を代入する。続くステップＳＰ５では、変数ｍｅｔｍｐの値が０、またはＭＥ［ｍｅｔｍｐ］．ｔｅｎｄの値が０か否か判定する。変数ｍｅｔｍｐの値が０、またはＭＥ［ｍｅｔｍｐ］．ｔｅｎｄの値が０である（変数ｍｅｔｍｐの値で指定される音符が極点に位置している）場合、判定はＹＥＳとなってステップＳＰ７に移行する。そうでない場合には、判定はＮＯとなり、ステップＳＰ６で変数ｍｅｔｍｐの値をデクリメントしてから再度ステップＳＰ５に戻る。それにより、先頭に位置する音符、或いは指定音の直前に位置する極点に相当する音符を探す。
【００９９】
ステップＳＰ７では、ＭＥ［ｍｅｔｍｐ］．ｔｅｎｄｓｔｅｐの値が５より大きいか否か判定する。その値が５より大きい場合、判定はＹＥＳとなってステップＳＰ９に移行する。そうでない場合には、判定はＮＯとなり、ステップＳＰ８でＭＥ［ｍｅ］．ｃｏｓｔとして、ＭＥ［ｍｅｐａｓｓ］．ｔｅｎｄｓｔｅｐの値とＭＥ［ｍｅｔｍｐ］．ｔｅｎｄｓｔｅｐの値からＭＥ［ｍｅｐａｓｓ］．ｔｅｎｄｓｔｅｐの値を引いた減算値の小さい方をそれまでの値に加算して得られる値を設定した後、一連の処理を終了する。それにより、指定音の前後に位置する極点間のピッチ変化数が比較的に短い場合には、変数ｍｅｐａｓｓの値で指定される音符を基準にして、その音符の前後に位置する極点までのピッチ変化数のなかで小さい方をコストの補正分として扱っている。
【０１００】
ステップＳＰ９では、ＭＥ［ｍｅｎｐａｓｓ］．ｐｏｓｘの値を２で割った余りが１か否か判定する。変数ｍｅｎｐａｓｓの値で指定される音符のピッチが黒鍵に割り当てられるピッチであった場合、判定はＹＥＳとなり、ステップＳＰ１０でＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に８を加算した値を設定した後、一連の処理を終了する。それにより、上を越させる指、或いはくぐらせる指で押鍵させるのが黒鍵であればコストの補正分として８を追加させる。そうでない場合には、判定はＮＯとなってステップＳＰ１１に移行する。
【０１０１】
ステップＳＰ１１では、変数ｆの値を判定する。その値は１と判定すると、ステップＳＰ１２に移行して、それまでの値に４を加算した値をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定した後、一連の処理を終了する。同様に、その値は２と判定すると、ステップＳＰ１３に移行して、それまでの値に３を加算した値をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定した後、その値は３と判定すると、ステップＳＰ１４に移行して、それまでの値に５を加算した値をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定した後、一連の処理を終了する。その値は４と判定したときには、コストの補正を行うことなく、ここで一連の処理を終了する。このようにして、上を越させる指、或いは下をくぐらせる指の種類に応じた加算分をそれまでのコストに加算させる。
【０１０２】
次に、図１３に示す指越え指くぐり補正処理内でステップＳＬ６として実行されるステップタイム・跳躍進行補正処理について、図１５に示すそのフローチャートを参照して詳細に説明する。その補正処理では、発音開始時刻の時間間隔（ステップタイム）の他に、ピッチ変化（跳躍進行）を考慮してコストの補正を行うようになっている。
【０１０３】
先ず、ステップＳＱ１では、変数ｓｔにＭＥ［ｍｅ＋１］．ｔｉｍｅの値からＭＥ［ｍｅ］．ｔｉｍｅの値を引いた値、変数ｓｔａｖｅ、ｓａｍｅ、及びｃｎｔに０、変数ｍｅｐｃ、及びｍｅｎｃに変数ｍｅの値をそれぞれ代入する。続くステップＳＱ２では、変数ｍｅｐｃの値が０、またはＭＥ［ｍｅｐｃ］．ｔｅｎｄの値が０か否か判定する。変数ｍｅｐｃの値で指定される音符が曲の先頭に位置する音符、または極点に位置する音符であった場合、判定はＹＥＳとなってステップＳＱ４に移行する。そうでない場合には、判定はＮＯとなってステップＳＱ３に移行し、変数ｔｍｐｓｔにはＭＥ［ｍｅｐｃ］．ｔｉｍｅの値からＭＥ［ｍｅｐｃ−１］．ｔｉｍｅの値を引いた値、変数ｓｔａｖｅにはそれまでの値に変数ｔｍｐｓｔの値を加算した値、変数ｓａｍｅには変数ｔｍｐｓｔの値が変数ｓｔの値と等しければそれまでの値をインクリメントした値、変数ｃｎｔにはそれまでの値をインクリメントした値、変数ｍｅｐｃにはそれまでの値をデクリメントした値、をそれぞれ代入してからそのステップＳＱ２に戻る。それにより、指定音の前に存在する、曲の先頭に位置する音符、または直前の極点に位置する音符までの区間内に存在する音符間の発音開始時刻の時間間隔を累算した累算時間は変数ｓｔａｖｅにより、その時間間隔が指定音とその次音符間のそれと等しい音符数は変数ｓａｍｅにより、総音符数は変数ｃｎｔによりカウントされる。
【０１０４】
ステップＳＱ４では、変数ｍｅｎｃの値が変数ｅｖ＿ｍａｘの値と等しいか、またはＭＥ［ｍｅｎｃ］．ｔｅｎｄの値が０か否か判定する。変数ｍｅｎｃの値で指定される音符が曲の末端に位置する音符、または極点に位置する音符であった場合、判定はＹＥＳとなってステップＳＱ６に移行する。そうでない場合には、判定はＮＯとなってステップＳＱ５に移行し、変数ｔｍｐｓｔにはＭＥ［ｍｅｎｃ＋１］．ｔｉｍｅの値からＭＥ［ｍｅｎｃ］．ｔｉｍｅの値を引いた値、変数ｓｔａｖｅにはそれまでの値に変数ｔｍｐｓｔの値を加算した値、変数ｓａｍｅには変数ｔｍｐｓｔの値が変数ｓｔの値と等しければそれまでの値をインクリメントした値、変数ｃｎｔにはそれまでの値をインクリメントした値、変数ｍｅｎｃにはそれまでの値をインクリメントした値、をそれぞれ代入してからそのステップＳＱ４に戻る。それにより、そのステップＳＱ４の判定がＹＥＳとなった時点では、変数ｍｅｐｃ、及びｍｅｎｃの各値で指定される音符の間を対象区間として、その対象区間内に存在する音符間の発音開始時刻の時間間隔を累算した累算時間は変数ｓｔａｖｅに、その時間間隔が指定音とその次音符間のそれと等しい音符数は変数ｓａｍｅに、総音符数は変数ｃｎｔにそれぞれ代入されることになる。
【０１０５】
ステップＳＱ６では、変数ｃｎｔの値が０でなければそれまでの値を変数ｃｎｔの値で割った値（音符間の発音開始時刻の時間間隔を平均した時間間隔）を変数ｓｔａｖｅに新たに代入する。次のステップＳＱ７では、変数ｓｔの値が変数ｓｔａｖｅの値未満であり、かつ変数ｓａｍｅの値が５未満か否か判定する。指定音とその次音符間の発音開始時刻の時間間隔が平均の時間間隔より短く、かつその次音符との時間間隔と一致する音符が比較的に少ないような場合、判定はＹＥＳとなり、ステップＳＱ８でそれまでの値に５を加算した値をＭＥ［ｍｅ］．ｃｏｓｔとして設定した値、ステップＳＱ９に移行する。そうでない場合には、つまり指定音とその次音符間の発音開始時刻の時間間隔が平均の時間間隔以上か、或いはその次音符との時間間隔と一致する音符が比較的に多いような場合には、判定はＮＯとなり、コストの補正は行う必要がないとして、そのステップＳＱ９に移行する。以降、隣り合う音符間の発音開始時刻の時間間隔は、前に位置する音符に着目して、例えば「指定音の時間間隔」といったように表現することとする。
【０１０６】
ステップＳＱ９では、ＭＥ［ｍｅｎｃ］．ｐｏｓｘの値からＭＥ［ｍｅｐｃ］．ｐｏｓｘの値を引いた値の絶対値が２０以上であり、かつＭＥ［ｍｅｐｃ］．ｔｅｎｄｓｔｅｐの値が８未満か否か判定する。変数ｍｅｐｃ、及びｍｅｎｃの各値で指定される音符の間の区間内で１オクターブ以上、進行し、かつピッチ変化数が少ない（跳躍進行）場合、判定はＹＥＳとなってステップＳＱ１０に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１０７】
ステップＳＱ１０では、ＭＥ［ｍｅ］．ｐｏｓｘの値からＭＥ［ｍｅｐｃ］．ｐｏｓｘの値を引いた値の絶対値の判定を行う。その値が１４未満と判定すると、ステップＳＱ１１に移行して、それまでの値に５を加算した値をＭＥ［ｍｅ］．ｃｏｓｔとして設定した後、一連の処理を終了する。その値が１４と判定すると、ステップＳＱ１２に移行して、それまでの値から５を引いた値をＭＥ［ｍｅ］．ｃｏｓｔとして設定した後、一連の処理を終了する。その値が１４より大きいと判定したときには、ここで一連の処理を終了する。ステップＳＱ１２でコストをそれまでより減少させるようにしているのは、１オクターブのピッチ変化がフレーズの境界となる場合が多いからである。
【０１０８】
図１０に示すコスト補正処理内で実行されるサブルーチン処理の説明に戻る。
図１６は、ステップＳＣ１３として実行される和音対分散和音補正処理のフローチャートである。次にその補正処理について、図１６を参照して詳細に説明する。その補正処理は、和音とそれに続く分散和音間の相互関係に着目して、コストの補正を行うための処理である。
【０１０９】
先ず、ステップＳＪ１では、ＭＥ［ｍｅ］．ｈｍｎｙの値が１より大きいか否か判定する。変数ｍｅの値で指定される音符が和音の先頭に位置しない構成音であった場合、その値は１より大きい値であることから、判定はＹＥＳとなってステップＳＪ２に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１１０】
ステップＳＪ２では、変数ｅｖ１に変数ｍｅの値、変数ｅｖ２にＭＥ［ｍｅ］．ｎｈｔｏｐの値（次の音符群の先頭に位置する音符を指定するインデックス値）をそれぞれ代入する。続くステップＳＪ３では、変数ｅｖ２の値が−１でないか否か判定する。指定音が属する音符群に続く音符群が存在しない場合、ＭＥ［ｍｅ］．ｎｈｔｏｐの値として−１が設定されていることから、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなってステップＳＪ４に移行する。
【０１１１】
ステップＳＪ４では、それまでの値にＭＥ［ｅｖ１］．ｈｍｎｙの値を加算した値から１を引いた値を変数ｅｖ２に代入する。そのようにして、分散和音が続くという想定の下で、変数ｍｅの値で指定される音符の和音の先頭からの順番と同じ順番となっているその分散和音の構成音を指定する値を変数ｅｖ２に代入した後、ステップＳＪ５に移行して、変数ｅｖ２の値が変数ｅｖ＿ｍａｘの値以下であり、かつＭＥ［ｅｖ２］．ａｒｐの値が０でないか否か判定する。変数ｅｖ２の値で指定される音符が分散和音の構成音であった場合、判定はＹＥＳとなり、ステップＳＪ６で図８に示す２音間コスト算出処理を実行し、更にステップＳＪ７でそれまでの値に変数ｃｏｓｔ２ｅｖの値を加算した値を２で割って得られる値（＝（ＭＥ［ｍｅ］．ｃｏｓｔ＋ｃｏｓｔ２ｅｖ）／２）をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１１２】
図１７は、図１０に示すコスト補正処理内でステップＳＣ１４として実行される分散和音対分散和音補正処理のフローチャートである。次にその補正処理について、図１７を参照して詳細に説明する。その補正処理は、分散和音とそれに続く分散和音間の相互関係に着目して、コストの補正を行うための処理である。
【０１１３】
先ず、ステップＳＫ１では、ＭＥ［ｍｅ］．ａｒｐの値が０でないか否か判定する。変数ｍｅの値で指定される音符が分散和音の構成音であった場合、その値は０でない値であることから、判定はＹＥＳとなってステップＳＫ２に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１１４】
ステップＳＫ２では、変数ｅｖ１に変数ｍｅの値、変数ｅｖ２にＭＥ［ｍｅ］．ｎｈｔｏｐの値をそれぞれ代入する。続くステップＳＫ３では、変数ｅｖ２の値が−１でないか否か判定する。指定音が属する音符群に続く音符群が存在しない場合、ＭＥ［ｍｅ］．ｎｈｔｏｐの値として−１が設定されていることから、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなってステップＳＫ４に移行する。
【０１１５】
ステップＳＫ４では、それまでの値にＭＥ［ｅｖ１］．ａｒｐの値を加算した値から１を引いた値を変数ｅｖ２に代入する。そのようにして、分散和音が続くという想定の下で、変数ｍｅの値で指定される音符の分散和音の先頭からの順番と同じ順番となっているその分散和音の構成音を指定する値を変数ｅｖ２に代入した後、ステップＳＫ５に移行して、変数ｅｖ２の値が変数ｅｖ＿ｍａｘの値以下であり、かつＭＥ［ｅｖ２］．ａｒｐの値が０でないか否か判定する。変数ｅｖ２の値で指定される音符が分散和音の構成音であった場合、判定はＹＥＳとなり、ステップＳＫ６で図８に示す２音間コスト算出処理を実行し、更にステップＳＫ７でそれまでの値に変数ｃｏｓｔ２ｅｖの値を加算した値を２で割って得られる値（＝（ＭＥ［ｍｅ］．ｃｏｓｔ＋ｃｏｓｔ２ｅｖ）／２）をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１１６】
図１８は、図１０に示すコスト補正処理内でステップＳＣ１５として実行される単音対和音補正処理のフローチャートである。次に図１８を参照して、その補正処理について詳細に説明する。その補正処理は、単音とそれに続く和音間の相互関係に着目して、コストの補正を行うための処理である。
【０１１７】
先ず、ステップＳＭ１では、ＭＥ［ｍｅ］．ｈｍｎｙの値が０であり、かつＭＥ［ｍｅ］．ａｒｐの値が０か否か判定する。変数ｍｅの値で指定される音符（指定音）が和音や分散和音の音符群に属さない単音である場合、判定はＹＥＳとなってステップＳＭ２に移行する。そうでない場合には、つまり指定音が単音でない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１１８】
ステップＳＭ２では、変数ｅｖ１に変数ｍｅの値、変数ｅｖ２にＭＥ［ｍｅ］．ｎｈｔｏｐの値をそれぞれ代入する。続くステップＳＭ３では、変数ｅｖ２の値が−１でなく、かつＭＥ［ｅｖ２］．ｈｍｎｙの値が０でないか否か判定する。指定音に続く音符群が存在し、かつ続く音符群が和音の音符群であった場合、判定はＹＥＳとなってステップＳＭ４に移行する。そうでない場合には、つまり指定音に続く音符群が存在しないか、または続く音符群が和音の音符群でない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１１９】
ステップＳＭ４では、図８に示す２音間コスト算出処理を実行する。続くステップＳＭ５では、ＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に変数ｃｏｓｔ２ｅｖの値を加算した値を設定し、変数ｅｖ２の値をインクリメントする。その後に移行するステップＳＭ６では、変数ｅｖ２の値が、ＭＥ［ｍｅ］．ｎｈｔａｉｌの値より大きいか否か判定する。指定音と続く和音の音符群を構成する全ての音符間との間でコストの算出が終了した場合、その関係が満たされることから、判定はＹＥＳとなってステップＳＭ７に移行し、ＭＥ［ｍｅ］．ｃｏｓｔとして、ＭＥ［ｍｅ］．ｎｈｔａｉｌの値からＭＥ［ｍｅ］．ｎｈｔｏｐの値を引いた値に２を加算した値でそれまでの値を割って得られる値（＝ＭＥ［ｍｅ］．ｃｏｓｔ／（ＭＥ［ｍｅ］．ｎｈｔａｉｌ−ＭＥ［ｍｅ］．ｎｈｔｏｐ＋２））を新たに設定した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなって上記ステップＳＭ４に戻る。それにより、和音の音符群を構成する全ての音符間との間でコストの算出が終了するまで、ステップＳＭ４〜ＳＭ６で形成される処理ループを繰り返し実行する。
【０１２０】
次に、図１０に示すコスト補正処理内でステップＳＣ１６として実行される和音対単音補正処理について、図１９に示すそのフローチャートを参照して詳細に説明する。その補正処理は、和音とそれに続く単音の音符群間の相互関係に着目して、コストの補正を行うための処理である。
【０１２１】
先ず、ステップＳＨ１では、ＭＥ［ｍｅ］．ｈｍｎｙの値が１か否か判定する。変数ｍｅの値で指定される音符が和音の先頭に位置する構成音であった場合、その値は１であることから、判定はＹＥＳとなってステップＳＨ２に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１２２】
ステップＳＨ２では、変数ｅｖ１に変数ｍｅの値、変数ｅｖ２にＭＥ［ｍｅ］．ｎｈｔｏｐの値をそれぞれ代入する。続くステップＳＨ３では、変数ｅｖ２の値が−１でなく、ＭＥ［ｅｖ２］．ｈｍｎｙの値が０であり、かつＭＥ［ｅｖ２］．ａｒｐの値が０か否か判定する。指定音が属する音符群に続く単音が存在する場合、判定はＹＥＳとなってステップＳＨ４に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１２３】
ステップＳＨ４では、ＭＥ［ｅｖ１］．ｐｏｓｘの値はＭＥ［ｅｖ２］．ｐｏｓｘの値より大きいか否か判定する。和音に続く単音のピッチが和音の先頭に位置する構成音のピッチ（最小ピッチ）より低い場合、判定はＹＥＳとなり、ステップＳＨ５で図８に示す２音間コスト算出処理を実行し、更にステップＳＨ６でそれまでの値に変数ｃｏｓｔ２ｅｖの値を加算した値を２で割って得られる値（＝（ＭＥ［ｍｅ］．ｃｏｓｔ＋ｃｏｓｔ２ｅｖ）／２）をＭＥ［ｍｅ］．ｃｏｓｔとして新たに設定した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１２４】
図２０は、図１０に示すコスト補正処理内でステップＳＣ１７として実行される和音対和音補正処理のフローチャートである。次に図２０に示すフローチャートを参照して、その補正処理について詳細に説明する。その補正処理は、和音とそれに続く和音間の相互関係に着目して、コストの補正を行うための処理である。
【０１２５】
先ず、ステップＳＦ１では、ＭＥ［ｍｅ］．ｈｍｎｙの値が０でないか否か判定する。変数ｍｅの値で指定される音符が和音の構成音であった場合、その値は０でないことから、判定はＹＥＳとなってステップＳＦ２に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１２６】
ステップＳＦ２では、変数ｍｅｎｅａｒに、ＭＥ［ｍｅ］．ｎｈｔｏｐの値を代入する。続くステップＳＦ３では、変数ｍｅｎｅａｒの値が−１でなく、かつＭＥ［ｍｅｎｅａｒ］．ｈｍｎｙの値が０でないか否か判定する。和音以外の音符群が続く場合、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなり、ステップＳＦ４でＭＥ［ｍｅｎｅａｒ］．ｐｏｓｘの値からＭＥ［ｍｅ］．ｐｏｓｘの値を引いた値の絶対値を変数ｐｉに代入し、変数ｍｅｎｅａｒの値に１を加算した値を変数ｍｅｔｍｐに代入した後、ステップＳＦ５に移行する。
【０１２７】
本実施の形態では、続く和音の構成音のなかでピッチが指定音と最も近い構成音とその指定音の間でコストの算出を行うようにしている。ステップＳＦ５〜ＳＦ９では、指定音とピッチが最も近い構成音を特定するための処理が行われる。
【０１２８】
先ず、ステップＳＦ５では、変数ｐｉｔｍｐに、ＭＥ［ｍｅｔｍｐ］．ｐｏｓｘの値からＭＥ［ｍｅ］．ｐｏｓｘの値を引いた値の絶対値を代入する。次のステップＳＦ６では、変数ｐｉの値が変数ｐｉｔｍｐの値より大きいか否か判定する。変数ｐｉの値が変数ｐｉｔｍｐの値より大きい場合、判定はＹＥＳとなり、ステップＳＦ７で変数ｐｉに変数ｐｉｔｍｐの値、変数ｍｅｎｅａｒに変数ｍｅｔｍｐの値をそれぞれ代入し、更にステップＳＦ８で変数ｍｅｔｍｐの値をインクリメントした後、ステップＳＦ９に移行する。そうでない場合には、判定はＮＯとなり、次にステップＳＦ８の処理を実行する。
【０１２９】
ステップＳＦ９では、変数ｍｅｔｍｐの値がＭＥ［ｍｅ］．ｎｈｔａｉｌの値より大きいか否か判定する。変数ｍｅｔｍｐの値がＭＥ［ｍｅ］．ｎｈｔａｉｌの値より大きい場合、判定はＹＥＳとなってステップＳＦ１０に移行する。そうでない場合には、判定はＮＯとなって上記ステップＳＦ５に戻る。
【０１３０】
ステップＳＦ１０では、変数ｅｖ１に変数ｍｅの値、変数ｅｖ２に変数ｍｅｎｅａｒの値をそれぞれ代入する。続くステップＳＦ１１では、図８に示す２音間コスト算出処理を実行する。その次に移行するステップＳＦ１２では、ＭＥ［ｍｅ］．ｃｏｓｔとして、それまでの値に変数ｃｏｓｔ２ｅｖの値を加算した値を２で割って得られる値（＝（ＭＥ［ｍｅ］．ｃｏｓｔ＋ｃｏｓｔ２ｅｖ）／２）を新たに設定する。一連の処理はその後に終了する。
【０１３１】
図２１は、図１０に示すコスト補正処理内でステップＳＣ１８として実行される前方和音補正処理のフローチャートである。最後に図２１に示すフローチャートを参照して、その補正処理について詳細に説明する。その補正処理は、和音とその直前に位置する和音間の相互関係に着目して、コストの補正を行うための処理である。
【０１３２】
先ず、ステップＳＲ１では、ＭＥ［ｍｅ］．ｈｍｎｙの値が０でないか否か判定する。変数ｍｅの値で指定される音符が和音の構成音であった場合、その値は０でないことから、判定はＹＥＳとなり、ステップＳＨ２で変数ｍｅｎｅａｒに、ＭＥ［ｍｅ］．ｐｈｔｏｐの値を代入した後、ステップＳＲ３に移行する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１３３】
ステップＳＲ３〜ＳＲ１２で実行される処理、及びその流れは、上記和音対和音補正処理におけるステップＳＦ３〜ＳＦ１２のそれらと基本的に同じである。このことから、ステップＳＲ３〜ＳＲ１２の処理の説明は省略する。
【０１３４】
なお、本実施の形態では、図４に示すステップＳＢ１（逐次生成処理）で生成した運指情報を参照した最終的なコストの算出は、ステップＳＢ６（指定音コスト算出処理）でのコストの算出、続くステップＳＢ７（コスト補正処理）でのコストの補正により２段階で行うようにしているが、１段階でその算出を行うようにしても良い。コストの補正を行ううえで着目する内容については本実施の形態に限定されるものではない。
【０１３５】
生成した運指情報が示す運指のなかで修正の対象とする運指は、禁止事項に該当しておらず、かつ最終的に算出したコストが定数ＴＨＲＣＯＳＴより大きいものとしているが、禁止事項に該当しているか否かに係わらずに修正を行うようにしても良い。或いは、禁止事項に該当していない運指を全て修正の対象とさせても良い。このようなことを含め、様々な変形を行うことができる。
【０１３６】
上述したような運指情報生成装置を実現させるようなプログラムは、ＣＤ−ＲＯＭ、ＤＶＤ、或いは着脱自在なフラッシュメモリ等の記録媒体に記録させて配布しても良い。公衆網等の通信ネットワークを介して、そのプログラムの一部、若しくは全部を配信するようにしても良い。そのようにした場合には、ユーザーはプログラムを取得してデータ処理装置にロードすることにより、その装置に本発明を適用させることができる。このことから、記録媒体は、プログラムを配信する装置がアクセスできるものであっても良い。
【図面の簡単な説明】
【０１３７】
【図１】本実施の形態による運指情報生成装置を搭載した電子楽器の構成を説明する図である。
【図２】電子楽器のＲＡＭに格納される演奏データの構成を説明する図である。
【図３】全体処理のフローチャートである。
【図４】運指生成処理のフローチャートである。
【図５】禁止事項検索処理のフローチャートである。
【図６】禁止事項検索処理のフローチャートである（続き）。
【図７】指定音コスト算出処理のフローチャートである。
【図８】２音間コスト算出処理のフローチャートである。
【図９】電子楽器のＲＯＭに格納されたデータを説明する図である。
【図１０】コスト補正処理のフローチャートである。
【図１１】ステップタイム補正処理のフローチャートである。
【図１２】多声補正処理のフローチャートである。
【図１３】指越え指くぐり補正処理のフローチャートである。
【図１４】指越え指くぐり基本補正処理のフローチャートである。
【図１５】ステップタイム・跳躍進行補正処理のフローチャートである。
【図１６】和音対分散和音補正処理のフローチャートである。
【図１７】分散和音対分散和音補正処理のフローチャートである。
【図１８】単音対和音補正処理のフローチャートである。
【図１９】和音対単音補正処理のフローチャートである。
【図２０】和音対和音補正処理のフローチャートである。
【図２１】前方和音補正処理のフローチャートである。
【符号の説明】
【０１３８】
１    ＣＰＵ
２    ＲＯＭ
３    ＲＡＭ
４    入力部
５    表示部
６    外部記憶装置
【図１】
2006078656.tif 000003
【図２】
2006078656.tif 000004
【図３】
2006078656.tif 000005
【図４】
2006078656.tif 000006
【図５】
2006078656.tif 000007
【図６】
2006078656.tif 000008
【図７】
2006078656.tif 000009
【図８】
2006078656.tif 000010
【図９】
2006078656.tif 000011
【図１０】
2006078656.tif 000012
【図１１】
2006078656.tif 000013
【図１２】
2006078656.tif 000014
【図１３】
2006078656.tif 000015
【図１４】
2006078656.tif 000016
【図１５】
2006078656.tif 000017
【図１６】
2006078656.tif 000018
【図１７】
2006078656.tif 000019
【図１８】
2006078656.tif 000020
【図１９】
2006078656.tif 000021
【図２０】
2006078656.tif 000022
【図２１】
2006078656.tif 000023