Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
JP4182637B2 - 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体 - Google Patents
[go: Go Back, main page]

JP4182637B2 - 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体 - Google Patents

運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体 Download PDF

Info

Publication number
JP4182637B2
JP4182637B2 JP2000338743A JP2000338743A JP4182637B2 JP 4182637 B2 JP4182637 B2 JP 4182637B2 JP 2000338743 A JP2000338743 A JP 2000338743A JP 2000338743 A JP2000338743 A JP 2000338743A JP 4182637 B2 JP4182637 B2 JP 4182637B2
Authority
JP
Japan
Prior art keywords
finger
fingering
variable
value
information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2000338743A
Other languages
English (en)
Other versions
JP2001331173A (ja
Inventor
直幸 小股
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Casio Computer Co Ltd
Original Assignee
Casio Computer Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Casio Computer Co Ltd filed Critical Casio Computer Co Ltd
Priority to JP2000338743A priority Critical patent/JP4182637B2/ja
Publication of JP2001331173A publication Critical patent/JP2001331173A/ja
Application granted granted Critical
Publication of JP4182637B2 publication Critical patent/JP4182637B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Auxiliary Devices For Music (AREA)
  • Electrophonic Musical Instruments (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は、音楽の教習において用いられる技術に関し、特に、楽器で楽曲を演奏するための運指を該楽曲の演奏情報から生成する技術に関する。
【0002】
【従来の技術及び発明が解決しようとする課題】
ピアノなどの楽器の演奏操作においては、発音のために操作される同一の操作子が常に同一の指により操作されるとは限らない。楽器を用いての演奏が行なわれるとき、その運指(演奏を行なうときの楽器を操作する指の動き)は演奏者によって案出される。
【0003】
演奏者は、楽譜などの楽曲の演奏情報に基づいて、演奏する楽器の特性、手の大きさや指の開きの程度などといった自分の身体の特性、自己の演奏の技量、手癖などを考慮して適切な運指を案出する。一般的には、なるべく指の移動に無理がないような運指が選択されるが、演奏者の有する演奏技量を視覚的に誇示するために、指の運びの難しい運指を敢えて採用することもある。
【0004】
いずれにしても、楽曲の演奏情報からその運指を案出するには演奏楽器及び演奏技法についてのある程度の知識と技量とが必要であり、運指の案出は初心者である演奏者にとっては極めて困難な作業である。
以上の問題を鑑み、楽曲の演奏情報から楽器で該楽曲を演奏するための運指を演奏者に代わって生成することが本発明が解決しようとする課題である。
【0005】
【課題を解決するための手段】
本発明は、楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する装置または方法を前提とする。
図1は、本発明の第一の態様の原理構成を示す図である。
【0006】
演奏情報取得手段1は、演奏に関する情報である演奏情報を取得する。
運指可能性判定手段2は、演奏情報で示されている演奏の指示のうち、該指示に応じた運指が可能であるか否かの判定を行なう。
演奏情報修正手段3は、運指可能性判定手段2による判定の結果に基づいて演奏情報の修正を行なう。
【0007】
運指情報生成手段4は、演奏情報修正手段3により修正がなされた演奏情報に応じて運指を生成する。
ここで、運指可能性判定手段2は、演奏の指示のうち、楽器を操作する指の本数を超える数の異なる音高の楽音が同時に発音中となる状態を生じさせた指示に応じた運指を不可能であると判定するようにしてもよい。そして、この場合に、演奏情報修正手段3が、同時発音中となる楽音のうち、最も早くに消音させる指示が演奏情報に示されているものについて、その同時発音中となる楽音のうちで最も遅くに発音開始される楽音の発音開始時刻よりも早くにその楽音を消音させる指示となるように演奏情報の修正を行なうようにしてもよい。
【0008】
あるいは、運指可能性判定手段2は、演奏の指示のうち、異なる音高の複数の楽音が同時に発音中となるときの楽器への複数の操作が所定距離よりも離れた位置での操作となる指示に応じた運指を不可能であると判定するようにしてもよい。そして、この場合に、演奏情報修正手段3が、同時発音中となる楽音であって、その楽音を発音させるための楽器への操作の位置が最も離れている2つの楽音のうち、先に消音させる指示がその演奏情報に示されているものについて、後に発音開始される楽音の発音開始時刻よりも早くにその楽音を消音させる指示となるように演奏情報の修正を行なうようにしてもよい。
【0010】
あるいは、運指可能性判定手段2は、演奏の指示のうち、その指示が楽音の発音開始の指示であって、その指示に従って発音を開始するときにその楽音を消音させるための操作の途中の状態であるときには、その指示に応じた運指を不可能であると判定するようにしてもよい。そして、この場合に、演奏情報修正手段3が、楽音の発音の開始の指示における発音開始の時よりも所定時間以上早くに、消音操作を完了させる指示となるように演奏情報の修正を行なうようにしてもよい。
【0011】
この図1に示した本発明の第一の態様の構成によれば、運指可能性判定手段2によって演奏情報で示されている演奏の指示のうち、該指示に応じた運指が不可能であるものが抽出され、演奏情報修正手段3によって演奏情報におけるその抽出された指示が示されている箇所が修正される。従って、指による演奏操作をそのまま忠実に行なうことが不可能な演奏情報でも、運指情報生成手段4で運指を生成することができる。
【0012】
図2は、本発明の第二の態様の原理構成を示す図である。
演奏情報取得手段1は、前述した本発明の第の態様におけるものと同様に、演奏に関する情報である演奏情報を取得する。
指割当判断手段5は、各指について、演奏情報で示されている楽音の発音指示に応じた楽器の操作を指で行なうことが可能であり、その操作にその指を割り当てることができるか否かの判断を行なう。
【0013】
優先値付与手段6は、操作に割り当てることができると判断された指の中からその操作に割り当てる1つの指を選択するときの優先度を、各指に対して与える。
指割当確定手段7は、指割当判断手段5による判断の結果及び優先値付与手段6より各指に与えられた優先度に基づいて、操作に割り当てる1つの指を、楽曲の先頭から順次1楽音ごとに確定していく
【0014】
ここで、指割当判断手段5は、演奏情報で示されている楽音の発音指示に応じた操作のための指の割り当てが、その発音の開始のときに既に楽器の操作を行なっている指の位置関係に基づいて行なえるか否かの判定の結果に従って、その判断を行なうようにしてもよい。
【0015】
あるいは、指割当判断手段5は、各指から演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合に、その楽音の発音の継続が指示されている期間内における別の楽音の発音の指示に応じた操作のための指の割り当てが、その別の楽音の発音のときに既に楽器の操作を行なっている指の位置関係に基づいて行なえるか否かの判定の結果に従って、その判断を行なうようにしてもよい。
【0016】
また、指割当判断手段5は、各指から演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合に、その楽音の発音の継続が指示されている期間内における別の楽音の発音指示に応じた操作のために割り当てを要する指の割当必要本数であって、その仮に割り当てた指の左側若しくは右側の各々の指についてのその割当必要本数が、その仮に割り当てた指の左側若しくは右側の各々の指の本数に基づいて足りるか否かを判定した判定結果に従って、前記判断を行なうようにしてもよい。
【0017】
あるいは、指割当判断手段5は、各指から演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合であって、その楽音の発音の開始が指示されているときには既に別の楽音の発音指示に応じた操作に他の指が割り当てられている場合に、これら両者の楽音を同時発音させる指示がなされている期間内における更なる別の楽音の発音指示に応じた操作のために割り当てを要する指の割当必要本数であって、その両者の楽音の発音指示に応じた操作に割り当てられている2本の指の間の指についてのその割当必要本数が、その2本の指の間の指の本数に基づいて足りるか否かを判定した判定結果に従って、前記判断を行なうようにしてもよい。
【0018】
また、指割当判断手段5は、各指から演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合に、演奏情報で示されているその楽音の発音指示に続く次の楽音の発音指示に対応する操作に割り当てることのできる指が存在するか否かの判定の結果に従って、前記判断を行なうようにしてもよい。
【0019】
また、優先値付与手段6は、その操作を行なうために要する指の移動の距離が長い指ほど低い優先度を与えるようにしてもよい。
【0020】
また、前記優先値付与手段6は、その操作を行なうために要する手の移動の距離が短い指ほど高い優先度を与えるようにしてもよい。
あるいは、前記優先値付与手段6は、演奏情報で示されている楽音の発音指示に対応する操作を行なう指が、その楽音の直前の楽音の発音指示に対応する操作に割り当てられており、且つ、この両者の楽音の音高が異なる場合には、その指の優先度を低下させるようにしてもよい。
【0021】
この図2に示した本発明の第二の態様の構成によれば、指割当判断手段5により判断される、演奏情報で示されている楽音の発音指示に応じた楽器の操作に割り当てることができる指の中から、その操作に割り当てる1つの指の選択を、優先値付与手段6により与えられる優先度に基づいて楽曲の先頭から順次1楽音ごとに行なうことができるので、より適切な運指を生成することができる。
【0022】
また、図2に示す本発明の第二の態様の原理構成において、所定の音高差を有する楽音列からなるフレーズを示すフレーズデータと、そのフレーズの演奏を楽器で行なうとき運指を示す情報であるフレーズ運指情報とが対応付けられて格納されているフレーズデータ格納手段を更に有し、優先値付与手段6が、フレーズデータで示されているフレーズが楽曲を構成する楽音列に含まれているときには、そのフレーズデータに対応付けられてフレーズデータ格納手段に格納されているフレーズ運指情報に示されている指が操作に割り当てる指として選択され易くなるように優先度を与えるように構成してもよい。
【0025】
これらの構成によれば、標準的な運指が広く知られている所定の音高差の楽音列(フレーズ)について、出力結果である運指情報にその標準的な運指が含まれ易くすることができるようになる。
【0027】
また、図2に示す本発明の第二の態様の原理構成において、優先値付与手段6が、優先度を与える対象の指を操作に割り当てるとその操作のために指を開く動作が発生するときには、その動作における指の開きの大きさに基づいて優先度を与えるように構成してもよい。
【0028】
一般的に、運指の難度は手の指の開きの大きさが大きくなるほど高くなるので、この構成によれば、難度の低い運指である、手の指の開きの小さい運指を示す情報が生成され易くなる。
また、図2に示す本発明の第二の態様の原理構成において、前記楽器は、鍵盤楽器であり、前記優先値付与手段6は、前記鍵盤楽器の黒鍵の操作の割り当ての選択において親指及び小指に対して与える前記優先度を低くするように構成してもよい。
【0029】
この構成によれば、親指及び小指では操作し難い黒鍵については、なるべく親指及び小指で操作しないような運指情報を生成できるようになる。
また、図2に示す本発明の第二の態様の原理構成において、優先値付与手段6が、優先度を与える対象の指を割り当てた楽器の直前の操作を終えてから所定時間が経過していない場合には優先度を低くするように構成してもよい。
【0031】
この構成によれば、運指の難度が上昇してしまう、同一の指による短時間の時間間隔で連続する演奏操作が運指情報として生成され難くなる。
また、図2に示す本発明の第二の態様の原理構成において、優先値付与手段6が、優先度を与える対象の指を操作に割り当てるとその操作のために指潜り若しくは指跨ぎの運指が発生するときには優先度を低くするように構成してもよ
【0036】
この構成によれば、運指の難度の高い、指潜り若しくは指跨ぎの運指を伴う演奏操作が運指情報として生成され難くなる。
また、図2に示す本発明の第二の態様の原理構成において、操作に割り当て可能な指がないときに、演奏情報の修正を行なう演奏情報修正手段を更に有し、指割当確定手段7は、演奏情報修正手段により修正された演奏情報について指割当判断手段5によって行なわれる判断の結果、及びその判断の結果に応じて優先値付与手段6が与える優先度に基づいて、操作に割り当てる指を確定するように構成してもよい。
【0037】
この構成によれば、どの指割り当てできないときには演奏情報が修正され、その修正された演奏情報に基づいて改めて運指情報の生成が行なわれるので、運指情報が生成不能となることを防止することができるようになる。
【0038】
このように、本発明のいずれの態様によっても、楽曲の演奏情報から楽器で該楽曲を演奏するための運指を生成することができる。
なお、上述した本発明のそれぞれの態様における各構成要素によって行なわれる一連の処理を行なう方法によっても前述した課題を解決することができる。
【0039】
また、上述した本発明の各構成により行なわれる機能と同様の制御をコンピュータに行なわせる運指情報生成プログラムを記憶したコンピュータ読み取り可能な記憶媒体から、そのプログラムをコンピュータに読み出させて実行させることによっても、前述した課題を解決することができる。
【0040】
【発明の実施の形態】
以下、本発明の実施の形態を図面に基づいて説明する。
図3は、本発明を実施する運指情報生成装置の全体構成を示す図である。同図に示す運指情報生成装置 (以下、「本装置」という)は、MIDI(Musical Instrument Digital Interface)規格に準拠した楽曲の演奏情報(MIDIデータ)を分析し、鍵盤楽器で左手若しくは右手の片手のみによってその楽曲を演奏するための運指を示す情報(運指データ)をその分析結果から生成し、その運指データに応じた運指を視覚的に表示させるものである。
【0041】
本装置は、表示部11、操作部12、音源13、サウンドシステム14、CPU15、ROM16、RAM17、データ入力部18によって構成されており、サウンドシステム14を除く各構成要素はバス19を介して相互に接続されている。
【0042】
表示部11は、CRTディスプレイや液晶ディスプレイを備えて構成され、CPU15の指示に応じた画像を表示する。
操作部12は、スイッチを備えて構成され、本装置の使用者に操作されることによって使用者からの指示を取得する。
【0043】
音源13はCPU15から渡される楽音情報に応じた音色・音高・音量の楽音信号を発生させてサウンドシステム14に渡す。
サウンドシステム14は音源13から渡された楽音信号に応じた楽音を放音する。
【0044】
CPU15は中央演算装置であり、ROM16に格納されている制御プログラムを読み出して実行することによって本装置全体の動作を制御する。
ROM16はリード・オンリ・メモリであり、CPU15によって実行される制御プログラムや各種のデータが予め格納されている。
【0045】
RAM17はランダム・アクセス・メモリであり、CPUが制御プログラムを実行する際にワークエリアとして使用したり、本装置への入出力情報である楽曲の演奏情報や運指情報を示すデータを一時的に蓄積するためにも用いられる。
データ入力部18は、フロッピーディスクドライブ装置や、本装置をネットワークに接続するためのインタフェース装置などを備えて構成され、本装置で運指の生成を行なう対象であるMIDIデータのファイルを、フロッピーディスクあるいはネットワークなどから読み込んで取得する。
【0046】
次に、CPU15が行なう制御について説明する。図4は、本装置に電源を投入した直後よりROM16に記憶されている制御プログラムを読み出して実行することによりCPU15が行なう本装置全体の制御処理の処理内容を示すフローチャートである。CPU15による制御動作を同図に従って説明する。
【0047】
まず、S101において、CPU15は本装置へ電源が投入された直後に初期化処理を実行し、CPU15の有する内部レジスタやRAM17のイニシャライズ、後述する各種処理において用いられる各種の変数への初期値の代入、などといった処理が行なわれる。
【0048】
続いて、S102において、CPU15は、操作部12に設けられている各種スイッチに対しての本装置の使用者による操作状況の取り込み処理を行ない、使用者からの本装置への指示を取得する。
S103では、CPU15は他の処理により生成されたデータに応じた表示を表示部11に行なわせる。表示させるデータの内容は、本装置における各種の設定内容や、演奏情報及び運指情報を有する後述の曲データの内容などである。また、この曲データの内容の表示に同期させて、音源13で曲データに応じた楽音信号を発生させ、サウンドシステム14により放音させる。
【0049】
S104では、S102において取得した使用者からの本装置への指示が、本装置に対する動作モードや定数の設定要求であるか否かが判定され、判定結果がYesならばS105に進んでその指示内容に応じた設定処理が実行され、その後はS102へ戻って上述した処理が繰り返される。一方、S104の判定結果がNoならばS106に進む。
【0050】
S106では、S102において取得した使用者からの本装置への指示が、MIDIデータファイルの読み込みの要求であるか否かが判定され、判定結果がYesならばS107に進み、NoならばS102へ戻って上述した処理が繰り返される。
【0051】
S107ではMIDIファイル読込処理が実行される。この処理は、1曲分のMIDIデータの集まりであるMIDIファイルをデータ入力部18に読み込ませて取得し、取得したMIDIデータを本装置の内部処理に便利なデータ形式に変換し(以下、この変換された形式のデータを「曲データ」と呼ぶこととする)、得られた曲データをRAM17に格納させる処理である。
【0052】
曲データのデータ構造を図5に示す。曲データは複数のトラックデータにより構成されており、各トラックデータは複数のイベントデータがそのイベントの発生順に並べられて構成されている。本装置においては運指情報の生成はトラックデータごとに行なわれる。運指情報を生成するトラックデータは本装置の使用者が操作部12に設けられている各種スイッチを操作することによって選択される。
【0053】
イベントデータは、MIDIイベント、デルタタイム、指番号の3種類のデータによって構成されている。
MIDIイベントは、鍵盤の押鍵(ノートオン)・離鍵(ノートオフ)のイベント、そのイベントを行なわせる鍵の鍵盤番号、押鍵イベントにおける音量などを示すデータで構成される。
【0054】
デルタタイムは、直前のMIDIイベントの発生時からこのイベントデータのMIDIイベントを発生させるまでの時間間隔を示すデータである。このデルタタイムは、後述する説明においては、このデルタタイムの値が変数(pe->tktime)に代入される。
【0055】
指番号は、このイベントデータのMIDIイベントにおいて押鍵が示されている場合に、押鍵すべき鍵をどの指を用いて押鍵するかを示す運指データが示される。
この指番号は、各指について、
0:親指 1:示指(人差し指) 2:中指 3:薬指 4:小指
の番号が割り当てられている。
【0056】
なお、図4のS107の処理においては、曲データにおける指番号は何も設定されず、空値(ヌル)とされる。
図4の説明に戻る。S108では曲データ修正処理が実行される。曲データ修正処理は、前ステップでの処理により取得した曲データを分析し、例えば、同時に複数の発音が指示されている箇所などといった、そのデータに従った演奏操作を行なうことが明らかに不可能な部分となる部分の曲データを修正する処理である。この曲データ修正処理の詳細は次に説明する。
【0057】
S109では運指情報生成処理が実行される。運指情報生成処理は、曲データを分析して適切な運指を生成し、生成された運指を前述した指番号で曲データの各イベントデータに設定する処理である。運指情報生成処理の詳細は後述する。
このS109の処理を終えた後にはS102へ戻って上述した処理を繰り返す。
【0058】
CPU15が上述した処理を実行することによって、本装置で運指情報が生成される。
次に、図4のS108において実行される曲データ修正処理について説明する。図6は曲データ修正処理の処理内容を示すフローチャートである。
【0059】
まず、S201では、この曲データ修正処理において使用される各種のパラメータにその初期値を代入する処理が実行される。具体的には、まず、運指生成の対象として選択されているトラックデータの有するイベントデータに設定されているデルタタイムを累積加算して、演奏開始後の経過時間を算出するために用いられる変数である変数tktimeには「0」が代入される。また、peにはRAM17に格納されている曲データであって、使用者によりその曲データから選択されたトラックデータの先頭のイベントデータが格納されているRAM17における格納位置を指すポインタが代入される。更に、変数fnote[0]〜fnote[4]の5つの変数には「NODATA」なる値が代入される。ここで、変数fnote[i](=0,1,2,3,4)は、指番号の指によって押鍵中である鍵の鍵盤番号が設定される変数であり、「NODATA」が設定されているときには、その指は鍵を押鍵していない状態にあることを示している。なお、鍵盤番号は、鍵盤における鍵の音高の低いものから順に付すものとする。
【0060】
S202では、変数peの指すイベントデータが、データの終了を示すものであるか否かが判定され、判定結果がYesならばS209に、NoならばS203に、それぞれ進む。
S203では、変数tktimeの値に、ポインタpeの指すイベントデータに設定されているデルタタイムの値(pe->tktime)を加算し、その加算結果が改めて変数tktimeに代入される。
【0061】
S204ではポインタpeの指すイベントデータに設定されているMIDIイベントが「ノートオン」であるか否かが判定され、判定結果がYesならばS205に進んで第一ノートオン処理が実行され、その後はS208に進む。一方、S204の判定結果がNoならばS206に進む。第一ノートオン処理は、変数fnote[i]に押鍵する鍵を仮に割り当てると共に、片手の5本の指の現在の押鍵の状態を考慮して新たにノートオンが指示された鍵を押鍵することが可能であるか否かを判断し、押鍵が不能であると判断した場合には既に押鍵中であるいずれかの鍵の離鍵のタイミングを早めるように曲データの修正を行なう処理であり、その詳細は後述する。
【0062】
S206ではポインタpeの指すイベントデータに設定されているMIDIイベントが「ノートオフ」であるか否かが判定され、判定結果がYesならばS207に進んで第一ノートオフ処理が実行され、その後はS208に進む。一方、S206の判定結果がNoならばそのままS208に進む。第一ノートオフ処理は、前述した第一ノートオン処理において仮に割り当てられている変数fnote[i]の押鍵の状態を離鍵の状態に変化させる処理であり、その詳細は後述する。
【0063】
S208では、選択されているトラックデータにおける次のイベントデータが格納されているRAM17上の格納位置を指すようにポインタpeの値が進められ、その後はS202へ戻って上述した処理が繰り返される。
以降のS209からS216の処理は、S209において、変数tkofftime[]の全てに「NODATA」が代入されること、及び、S213において第二ノートオン処理が実行され、S215において第二ノートオフ処理が実行されることを除けば、上述したS201からS208にかけての処理と同様である。そして、S210の判定処理の結果がYesである場合には、今回の曲データ修正処理が終了し、図4の処理へ戻る。
【0064】
ここで、第二ノートオン処理は、新たにノートオンが指示された鍵が離鍵操作の途中の状態にあり、ノートオンの指示のタイミングでの押鍵が間に合わない場合に、その鍵の直前の離鍵操作のタイミングを早めて、指示通りのタイミングでの押鍵が行なえるように曲データの修正を行なう処理である。また、第二ノートオフ処理は、押鍵中の鍵が離鍵される時間を取得する処理である。これらの両処理の詳細は後述する。また、変数tkofftime[] についても後述する。
【0065】
以上までの処理が曲データ修正処理であり、この処理がCPU15で実行されることによって、取得された曲データの修正が行なわれる。
次に、図6のS205において実行される第一ノートオン処理について、その処理内容をフローチャートで示す図7に沿って説明する。
【0066】
まず、S301において、図6のS204で「ノートオン」が設定されていると判定されたMIDIイベントに更に設定されている、押鍵する鍵の鍵盤番号が変数kに代入され、更に変数iに「0」が代入される。変数iは指番号を示す変数である。
【0067】
S302では、変数iの値が「5」よりも小さいか否かが判定され、判定結果がYesならばS303に進み、NoならばS305に進む。
S303では変数fnote[i]の値が「NODATA」であるか否か、すなわち、指番号iの指が押鍵の状態にはなく、今回のノートオン指示に対応する押鍵を行なえる状態にあるか否かが判定され、判定結果がYesならばS306に進み、NoならばS304に進む。
【0068】
S304では変数iの値を1だけ増加させ、その後はS302へ戻って上述した処理を繰り返す。
以上のS302からS304にかけての処理の作用により、S302の判定結果がNoとなるのは、片手の5本の指の現在の状態が全ていずれかの鍵を押鍵中の状態であるときに新たに六番目のノートオンが指示されたため、片手による押鍵が不能であると判定された場合となる。
【0069】
この場合に実行されるS305では、変数fnote[0]からfnote[4]までの5つの変数に各々設定されている鍵盤番号で示される押鍵中の5つの鍵について、対応するノートオフのイベントが示されているイベントデータが曲データからそれぞれ探し出される。そして、このノートオフのイベントデータが最も早く出現するものが選択され、選択されたイベントデータに対応する鍵を押鍵中である指の指番号が変数iに代入される。更に、幾つかのイベントデータに設定されているデルタタイムの値が変更され、選択されたノートオフのイベントデータを、現在の位置から(tktime−tkoncosttime)の時間の位置に移動させるようにする。
【0070】
ここで、定数tkoncosttimeとは、鍵を押鍵中の状態にある指が離鍵時の定常状態へと遷移するまでに要する時間を示している。つまり、S305において行なわれるノートオフのイベントデータの移動は、元のMIDIデータに従えば最も早くに離鍵されることとなる鍵の離鍵開始のタイミングを更に早めるように曲データを修正し、六番目のノートオンに対応する押鍵操作のタイミングの正確さを優先させるようにするものであり、特に、鍵の離鍵開始のタイミングを、指による押鍵・離鍵操作に要する時間まで考慮した時間まで早めるように修正するものである。
【0071】
定数tkoncosttimeは、5本の指について計測されるこの時間のうち、例えば、最も長いものが設定されている。本実施の形態においてはこの定数はROM16に予め設定されているが、使用者によりその設定が行なえるようにすることも可能である。
【0072】
S306では、変数kの値が変数fnote[i]に代入され、鍵盤番号kの押鍵を行なう指が仮に割り当てられる。
S307では、変数fnote[0]からfnote[4]までの5つの変数に各々設定されている鍵盤番号のうち、最も番号の小さいものが変数minkeyに代入され、最も番号の大きいものが変数maxkeyに代入される。
【0073】
S308では、(keypos[maxkey]−keypos[minkey])なる計算が実行される。そして、この計算結果が定数fullrange よりも大きいか否かが判定され、この判定結果がYesならばS309に進み、Noならば今回の第一ノートオン処理が終了し、図6の処理へ戻る。ここで、定数keypos[]は、鍵盤の横方向(鍵が並べられている方向)における各鍵の位置の相対距離を示す値が格納されているテーブルである。また、定数fullrange は、手の親指と小指とを広げたときに同時に鍵を押鍵することの可能な両指間の最大の距離を示す値が設定されている。つまり、このS308の判定処理は、変数fnote[0]からfnote[4]に割り当てられている同時に押鍵すべき鍵の位置が、片手で同時に押鍵することができないほど遠く離れてしまっているか否かを判定するものである。
【0074】
なお、本実施の形態においては定数keypos[]及び定数fullrange の値はROM16に予め設定されているが、使用者によりその設定が行なえるようにすることも可能である。
S309では、変数minkey及び変数maxkeyに各々設定されている鍵盤番号で示される押鍵中の鍵について、対応するノートオフのイベントが示されているイベントデータが曲データからそれぞれ探し出される。そして、このノートオフのイベントデータが先に出現する方が選択される。そして、幾つかのイベントデータに設定されているデルタタイムの値が変更され、選択されたノートオフのイベントデータを、現在の位置から(tktime−tkoncosttime)の時間の位置に移動させる。更に、選択されたイベントデータに対応する鍵を押鍵中である指の指番号が変数iに代入され、そして、変数fnote[i]に「NODATA」が代入される。この処理の後には今回の第一ノートオン処理が終了し、図6の処理へ戻る。
【0075】
このS309において行なわれるノートオフのイベントデータの移動は、鍵の配置が離れすぎているために片手では同時に押鍵することができない2つの鍵のうち、元のMIDIデータに従えば先に離鍵されることとなる鍵の離鍵のタイミングを更に早めるように曲データを修正し、新たなノートオンイベントに対応する押鍵操作のタイミングの正確さを優先させるようにするものであり、特に、鍵の離鍵開始のタイミングを、指による押鍵・離鍵操作に要する時間まで考慮した時間まで早めるように修正するものである。
【0076】
以上までの処理が第一ノートオン処理である。
次に、図6のS207において実行される第一ノートオフ処理について、その処理内容をフローチャートで示す図8に沿って説明する。
まず、S321において、図6のS206で「ノートオフ」が設定されていると判定されたMIDIイベントに更に設定されている、押鍵する鍵の鍵盤番号が変数kに代入され、更に変数iに「0」が代入される。
【0077】
S322では、変数iの値が「5」よりも小さいか否かが判定され、判定結果がYesならばS323に進み、NoならばS326に進む。
S323では変数fnote[i]の値が変数kであるか否か、すなわち、検出されたノートオフのイベントデータは、指番号iの指が押鍵している鍵についての離鍵指示であるか否かが判定され、判定結果がYesならばS324に進み、変数fnote[i]に「NODATA」が代入されて指番号iの指が押鍵している鍵の離鍵が示される。S324の処理の後には今回の第一ノートオフ処理が終了し、図6の処理へ戻る。
【0078】
一方、S323の判定処理の結果がNoならばS325に進み、変数iの値を1だけ増加させ、その後はS322へ戻って上述した処理を繰り返す。
これらのS322、S323、S325の処理の作用により、S32の判定結果がNoとなるのは、鍵盤番号がkである鍵について、押鍵中の状態とされていないのにもかかわらずこの鍵を離鍵する指示を受けた場合であり、何らかの原因により曲データのノートオンとノートオフとの対応関係に誤りがある場合である。そこで、S326ではエラー処理を実行し、このノートオフのイベントデータを曲データから削除する。この処理の後には今回の第一ノートオフ処理が終了し、図6の処理へ戻る。
【0079】
以上までの処理が第一ノートオフ処理である。
次に、図6のS213において実行される第二ノートオン処理について、その処理内容をフローチャートで示す図9に沿って説明する。
まず、S351において、図6のS212で「ノートオン」が設定されていると判定されたMIDIイベントに更に設定されている、押鍵する鍵の鍵盤番号が変数kに代入される。
【0080】
S352では、変数tkofftime[k]に「NODATA」が設定されているか否かが判定され、判定結果がYesならば何もせずにこのまま今回の第二ノートオン処理が終了し、図6の処理へ戻る。一方、この判定結果がNoならばS353に進む。ここで、変数tkofftime[k]は、鍵盤番号kの鍵が直前にノートオフされたときの時間tktimeの値が、後述する第二ノートオフ処理で設定される。
【0081】
S353では、(tktime−tkofftime[k])なる計算が実行される。そして、この計算結果が前述した定数tkoncosttimeよりも小さいか否かが判定され、判定結果がYesならばS354に進み、Noならばこのまま今回の第二ノートオン処理が終了し、図6の処理へ戻る。
【0082】
S354では、鍵盤番号kの鍵についての直前のノートオフのイベントデータを、現在の格納位置から (tktime−tkoncosttime)の時間の位置に移動させる。その後は今回の第二ノートオン処理が終了し、図6の処理へ戻る。
以上までの処理が第二ノートオン処理であり、この処理におけるS353及びS354の処理の作用により、ノートオンが指示された鍵kが離鍵操作の途中の状態にあってその指示に対応した押鍵操作が間に合わない場合に、鍵kについての直前のノートオフのタイミングを早めるような曲データの修正が施され、ノートオンの指示通りのタイミングでの押鍵が行なえるようになる。
【0083】
次に、図6のS215において実行される第二ノートオフ処理について、その処理内容をフローチャートで示す図10に沿って説明する。
まず、S371において、図6のS214で「ノートオフ」が設定されていると判定されたMIDIイベントに更に設定されている、押鍵する鍵の鍵盤番号が変数kに代入される。
【0084】
続いてS372において、前述した変数tkofftime[k]に変数tktimeの現在の値が代入され、その後は今回の第二ノートオフ処理が終了し、図6の処理へ戻る。
次に、図4のS109において実行される運指情報生成処理について説明する。図11は運指情報生成処理の処理内容を示すフローチャートである。
【0085】
まず、S401では、この運指情報生成処理において使用される各種の変数の初期値を代入する処理が実行される。
具体的には、前述したものと同様の用途である変数tktimeには、「0」が代入される。また、ポインタpeも前述したものと同様の用途であり、RAM17に格納されている曲データであって、使用者によりその曲データから選択されたトラックデータの先頭のイベントデータが格納されているRAM17における格納位置を指すポインタが代入される。また、変数fnote[0]〜fnote[4]の5つの変数の用途も前述したものと同様であり、「NODATA」が代入される。
【0086】
変数fofftime[0] 〜fofftime[4] には「NODATA」が代入される。変数fofftime[ifig] (ifig=0,1,2,3,4)には、指番号ifigの指によって押鍵中である鍵を離鍵する時間が設定される。
変数fofftimeold[0]〜fofftimeold[4]には「NODATA」が代入される。変数fofftimeold[ifig](ifig=0,1,2,3,4)には、指番号ifigの指が直前に離鍵操作を行なった時間が設定される。
【0087】
変数fnoteold[0] 〜fnoteold[4] には「NODATA」が代入される。変数fnoteold[ifig] (ifig=0,1,2,3,4)には、指番号ifigの指が直前に押鍵していた鍵の鍵盤番号が設定される。
変数fpos[ifig] (ifig=0,1,2,3,4)は、指番号ifigの指の位置を、その指を有する手の位置を基準としたときの相対位置として示す値が代入される変数であり、ここでは、離鍵の状態において定常的な各指の位置を示す値が初期値として変数fpos[0] 〜fpos[4] に代入される。
【0088】
S402では、変数peの指すイベントデータが、データの終了を示すものであるか否かが判定され、判定結果がYesならば今回の運指情報生成処理を終了する。一方、判定結果がNoならばS403に進む。
S403では、変数tktimeの値に、ポインタpeの指すイベントデータに設定されているデルタタイムの値(pe->tktime)を加算した結果が改めて変数tktimeに代入される。
【0089】
S404ではポインタpeの指すイベントデータに設定されているMIDIイベントが「ノートオン」であるか否かが判定され、判定結果がYesならばS405に進み、NoならばS419に進む。
S405では変数benable[0]〜benable[4]に値「FALSE」が代入され、更にS404で「ノートオン」が設定されていると判定されたMIDIイベントに更に設定されている、押鍵する鍵の鍵盤番号が変数kに代入される。
【0090】
ここで、変数benable[ifig](ifig=0,1,2,3,4)は、指番号ifigの指を押鍵すべき鍵の押鍵操作に割り当てることが可能であるか否かを示すフラグであり、可能である場合には値「TRUE」が設定され、不可能である場合には値「FALSE」が設定される。
【0091】
S406からS410にかけては指割当判断処理が実行される。ここでは第一から第五までの5種類の異なる指割当判断処理が実行される。これらの処理は、いすれも、各指について、イベントデータによってノートオンの指示がされている鍵の押鍵操作が行なうことが可能であり、その押鍵操作にその指を割り当てることができるか否かを判断する処理である。各々の指割当判断処理の詳細は後述する。
【0092】
S411からS414にかけては優先値付加処理が実行される。この処理は第一から第四までの4種類の優先値付加処理が実行される。これらの処理は、いずれも、イベントデータによってノートオンの指示がされている鍵を押鍵する指を割り当てる場合において、その割り当てる指を選択するための優先度を各指に与えることによってより適切な運指の選択を行なえるようにするものである。この処理によって、指番号ifigの指の割り当て優先度が変数priority[ifig] (ifig=0,1,2,3,4)に数値として与えられ、この値が大きいほど割り当て優先度が高いことを意味する。各々の優先値付加処理の詳細は後述する。
【0093】
S415では、優先付加処理の結果、変数priority[ifig] (ifig=0,1,2,3,4)に設定されている割り当て優先度を示す数値が一致してしまった場合に、どの指の割り当てを優先させるかを調整する。ここでは、割り当て優先度が一致している指のうち、鍵盤楽器の演奏操作において使用される頻度の高さに応じ、示指>中指>薬指>親指>小指の順に押鍵する指の割り当てを優先させるように変数priority[ifig] の値を増加させる。
【0094】
S416では、変数priority[ifig] (ifig=0,1,2,3,4)のうち、最も数値の大きいものの指番号を変数ifigに代入する。
S417では、ポインタpeの指すRAM17上のイベントデータにおける指番号の格納領域(pe->ifig)に、変数ifigの値が格納され、変数fnote[ifig] には変数kの値が代入され、今回のノートオンのイベントデータに対応する押鍵操作のための指の割り当てを確定させる。更に、ここで曲データの先読みが行なわれ、鍵盤番号kの鍵についての今回の押鍵操作に対応する離鍵操作が示されているノートオフのイベントデータをRAM17から探し出し、この鍵に対する離鍵操作の時間がデルタタイムの累積加算より算出されて変数fofftime[ifig]に代入される。更に、変数hposL 及びhposR の設定が行なわれる。変数hposL 及びhposRは鍵盤の横方向(鍵が並べられている方向)における手の存在可能な位置の範囲を示すものであり、各指が現在押鍵を行なっている鍵の位置に基づき、手における各指の配置位置の違い、各指の長さ、各指の関節の可動角度が考慮されて設定される。変数hposL には存在可能な最も左の位置が、変数hposR には存在可能な最も右の位置がそれぞれ設定される。なお、本実施の形態においては、手は鍵盤の横方向に平行移動するものとしている。
【0095】
S418では、選択されているトラックデータにおける次のイベントデータが格納されているRAM17上の格納位置を指すようにポインタpeの値が進められ、その後はS402へ戻って上述した処理が繰り返される。
S419ではポインタpeの指すイベントデータに設定されているMIDIイベントが「ノートオフ」であるか否かが判定され、判定結果がYesならばS420に進み、NoならばS418へ戻って上述した処理が行なわれる。
【0096】
S420では、このイベントデータで離鍵が示されている鍵を押鍵中である指の指番号が変数ifigに代入される。
S421では、変数tktimeの現在の値が変数fofftimeold[ifig] に代入され、変数fnote[ifig] の現在の値が変数fnoteold[ifig]に代入される。
【0097】
S422では、変数fnote[ifig] 及び変数fofftime[ifig]に値「NODATA」がそれぞれ代入される。
S423では、変数fpos[ifig]について、その値を初期値へ戻す設定が行なわれ、その後はS418へ戻って上述した処理が行なわれる。
【0098】
以上までの処理が運指情報生成処理であり、この処理をCPU15が実行することによって、曲データから運指情報が生成される。
次に、図11のS406において実行される第一指割当判断処理について説明する。第一指割当判断処理では、押鍵操作を行なっていない各指について、ノートオンが指示された鍵の押鍵のために割り当てることができるか否かの判定を、押鍵中である他の指の鍵盤上の位置との関係を考慮して行なう処理である。
【0099】
図12は第一指割当判断処理の処理内容を示すフローチャートである。
S501では変数fに0が代入される。変数fは指番号を示している。
S502では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS503に進み、NoならばS505に進む。
【0100】
S503では変数fnote[f]に「NODATA」が設定されているか否かが判定され、判定結果がYesならばS504に進み、NoならばS506に進む。
S504では変数fの値を1だけ増加させ、その後はS502へ戻って上述した処理を繰り返す。
【0101】
以上のS502からS504にかけての処理の作用により、S502の判定結果がNoとなるのは、片手の5本の指の現在の状態が全て押鍵操作を行なっていない場合となる。この場合は、今回のノートオンのための鍵盤操作をどの指も行なうことが可能であるので、S505において変数benable[0]〜benable[4]の各々に値「TRUE」が設定される。この処理の後には今回の第一指割当処理が終了し、図11に示す処理へ戻る。
【0102】
S506では、まず、現在押鍵中である全ての指を求め、これらの押鍵中の指の鍵盤上の位置と各指の関節の可動範囲とを考慮したときの、配置可能な手の位置の範囲(鍵盤の横方向についての位置の範囲)が算出される。そして、配置可能な最も左寄りの手の位置を示す値(最小位置)が変数hleft に代入され、配置可能な最も右寄りの手の位置を示す値(最大位置)が変数hrightに代入される。なお、これらの位置を算出する代わりに、これらの押鍵中の指及びその指が押鍵している鍵とこれらの位置との関係を示すテーブルをROM16に予め用意しておき、このテーブルを参照することによってこれらの数値が得られるようにしてもよい。
【0103】
S507では変数fに改めて「0」が代入される。
S508では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS509に進み、Noならばこのまま今回の第一指割当処理が終了し、図11に示す処理へ戻る。
【0104】
S509では変数fnote[f]に「NODATA」が設定されているか否かが判定され、判定結果がYesならばS510に進み、NoならばS513に進む。
S510では、定数frangeL[f]の値と変数hleft の値とが加算される。そして、その加算結果が前述した定数keypos[k] の値よりも小さいか否かが判定され、この判定結果がYesならばS511に、NoならばS513に、それぞれ進む。ここで、定数frangeL[f]は、指番号fの指について、その指の配置、長さ、及び関節の可動作用によって押鍵することの可能な最も左側の位置(鍵盤の横方向についての位置)と、手の位置を特定している特定点との間の鍵盤の横方向の距離を示す値である。
【0105】
S511では、定数frangeR[f]の値と変数hrightの値とが加算される。そして、その加算結果が前述した定数keypos[k] の値よりも大きいか否かが判定され、この判定結果がYesならばS512に、NoならばS513に、それぞれ進む。ここで、定数frangeR[f]は、指番号fの指について、その指の配置、長さ、及び関節の可動作用によって押鍵することの可能な最も右の位置(鍵盤の横方向についての位置)と、手の位置を特定している特定点との間の鍵盤の横方向の距離を示す値である。
【0106】
以上のS510及びS511の処理の作用により、指番号fの指を、ノートオンが指示された鍵盤番号kの押鍵のために割り当てることができるか否かが判定される。
S512では変数benable[f]に値「TRUE」が設定され、指番号fの指に対する押鍵操作の割り当てが可能であることが示される。
【0107】
S513では変数fの値を1だけ増加させ、その後はS508へ戻って上述した処理を繰り返す。
以上までの処理が第一指割当判断処理である。
次に、図11のS407において実行される第二指割当判断処理について説明する。第二指割当判断処理では、まず、今回のノートオンのイベントデータに対応する押鍵操作を、押鍵可能であるいずれかの指に割り当てた場合を想定する。そして、その押鍵操作の継続中に更なる押鍵操作が必要となる他の鍵についてのノートオンのイベントデータを曲データから探索し、既に割り当てた指による押鍵操作を維持したままで、他の指によってそのイベントデータに対応した押鍵操作が可能であるか否かの判定を行なう。
【0108】
図13は第二指割当判断処理の処理内容を示すフローチャートである。
S521では、図11のS404においてノートオンの指示を検出したイベントデータによって押鍵操作が指示されている鍵盤番号kの鍵について、その離鍵操作が指示されているノートオフのイベントデータが曲データから探索され、この鍵kについてのノートオンとノートオフとのイベントデータの間に存在するノートオンイベントデータ抽出される。そして、抽出されたイベントデータにおいて、鍵kよりも大きい(高音側の)鍵のうち、鍵盤番号が最大である(最も音高の高い)鍵の鍵盤番号が変数maxnote に代入され、鍵kよりも小さい(低音側の)鍵のうち、鍵盤番号が最小である(最も音高の低い)鍵の鍵盤番号が変数minnote に代入される。なお、前述した区間内にノートオンのイベントデータが存在しなかった場合にはこれらの変数にはいずれも「NODATA」が代入される。
【0109】
更に、変数maxnote 及び変数minnote で示される各々の鍵の押鍵開始時間がデルタタイムの累積加算により算出され、得られた値がそれぞれ変数tkmax 、tkmin に代入される。
S522では、変数maxnote 及び変数minnote に共に「NODATA」が設定されているか否かが判定され、判定結果がYesならばこのまま今回の第二指割当判断処理を終了して図11の処理へ戻る。一方、判定結果がNoならばS523に進む。
【0110】
S523では変数fに0が代入される。
S524では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS525に進み、Noならばこのまま今回の第二指割当判断処理を終了して図11の処理へ戻る。
【0111】
S525では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した第一指割当判断処理において指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS526に進み、Noならば指番号fの指についてのS526からS537の処理による指割当判断を省略してS538に進む。
【0112】
以降のS526からS535にかけての処理は、図11のS404においてノートオンの指示を検出したイベントデータによって押鍵操作が指示されている鍵盤番号kの鍵の押鍵操作を指番号fの指に仮に割り当てた場合に、他の指で変数maxnote 及び変数minnote の鍵の押鍵が可能であるか否かを判定するものである。
【0113】
S526では変数f0に0が初期値として代入され、変数bmax及びbminには値「FALSE」が初期値として代入される。ここで、変数f0は指番号が示され、変数bmax及びbminは、変数maxnote 及び変数minnote の鍵盤番号で示される鍵についての所定の押鍵操作のための指の割り当てが可能であるか否かが示される。
【0114】
S527では変数f0の値が5よりも小さいか否かが判別され、判定結果がYesならばS528に進み、Noならば片手の5本の指の全てについてS528からS534についての処理による判定が終了したものとみなし、S536に進む。
【0115】
S528では、変数fと変数f0との値が一致しているか否かが判定され、判定結果がYesならばS535に進み、NoならばS529に進む。
S529では、前述した変数fofftime[f0]に「NODATA」が設定されているか否か、すなわち、指番号f0の指が現在離鍵状態にあるか否かが判定され、判定結果がYesならばS531に進み、NoならばS530に進む。
【0116】
S530では、前述した変数fofftime[f0]の値が変数tkmax の値よりも小さいか否か、すなわち、押鍵中である指番号f0の指の押鍵終了時間が、変数maxnote で示される鍵の押鍵開始時間よりも前であるか否かが判定され、判定結果がYesならばS531に進み、判定結果がNoならばS532に進む。ここで、この判定結果がNoとなることにより、変数maxnote で示される鍵の押鍵操作には指番号f0の指を割り当てることが不可能であると判定されたこととなる。
【0117】
S531では、指f0が、指fで鍵kを押鍵しながら鍵maxnote を押鍵可能な位置にあるか否かを判定する処理が実行される。この処理の詳細は後述する。
S532では、前述した変数fofftime[f0]に「NODATA」が設定されているか否か、すなわち、指番号f0の指が現在離鍵状態にあるか否かが判定され、判定結果がYesならばS534に進み、NoならばS533に進む。
【0118】
S533では、前述した変数fofftime[f0]の値が変数tkmin の値よりも小さいか否か、すなわち、押鍵中である指番号f0の指の押鍵終了時間が、変数minnote で示される鍵の押鍵開始時間よりも前であるか否かが判定され、判定結果がYesならばS534に進み、判定結果がNoならばS535に進む。ここで、この判定結果がNoとなることにより、変数minnote で示される鍵の押鍵操作に指番号f0の指を割り当てることが不可能であると判定されたこととなる。
【0119】
S534では、指f0が、指fで鍵kを押鍵しながら鍵minnote を押鍵可能な位置にあるか否かを判定する処理が実行される。この処理の詳細も後述する。
S535では、変数f0の値を1だけ増加させ、その後はS527へ戻って上述した処理を繰り返す。
【0120】
S536では、変数bmax及びbminのいずれかが「FALSE」に設定されているか否かが判定され、判定結果がYesならばS537に進み、NoならばS538に進む。
S537では、変数benable[f]に「FALSE」を設定し、今回のノートイベントに対応する押鍵操作の指番号fへの割り当てが不可能であることを示す。
【0121】
S538では、変数fの値を1だけ増加させ、その後はS524へ戻って上述した処理を繰り返す。
以上までの処理が第二指割当判断処理である。
次に、図13に示す、上述した第二指割当判断処理のフローチャートにおけるS531の処理ステップで実行される、指fで鍵kを押鍵しながら鍵maxnote を押鍵可能な位置にあるか否かを判定する処理について、その処理内容を示す図14を参照しながら説明する。
【0122】
S601では、まず、指fで鍵kを押鍵し、且つ、他の指のうち、変数tkmax でも押鍵中である指によるその押鍵操作を維持した状態で、これらの押鍵中の指の鍵盤上の位置と各指の関節の可動範囲とを考慮したときの、配置可能な手の位置の範囲(鍵盤の横方向についての位置の範囲)が算出される。そして、配置可能な最も左寄りの手の位置を示す値(最小位置)が変数hleft に代入され、配置可能な最も右寄りの手の位置を示す値(最大位置)が変数hrightに代入される。なお、これらの位置を算出する代わりに、これらの押鍵中の指及びその指が押鍵している鍵とこれらの位置との関係を示すテーブルをROM16に予め用意しておき、このテーブルを参照することによってこれらの数値が得られるようにしてもよい。
【0123】
S602では、本装置の使用者から操作部12を介して指示される運指データの生成指示が右手についてのものか、左手についてのものかが判定され、判定結果がYes(右手の運指データの生成指示)であればS603に進み、No(左手の運指データの生成指示)であればS605に進む。
【0124】
S603では、変数f0の値が変数fの値よりも大きいか否か、すなわち、手の甲から見て指f0が指fよりも右の指であるか否かが判され、判定結果がYesならばS607に進み、NoならばS604に進む。
S604では、変数f0に0が設定されており、且つ、変数fに1、2、3のいずれかが設定されているか否かが判定され、判定結果がYesならばS607に進み、Noならば今回の図14に示されている処理を終了して図13に示す処理へ戻る。ここで、この判定処理の結果がYesとなるのは、指f0が親指を示し、且つ、指fが示指、中指、薬指のいずれかを示す場合である。これは、右手の親指については、押鍵中の指fを潜る(これを、「指潜り」と呼んでいる)ことによって手の甲から見て指fの右側の位置の鍵を押鍵することが可能であることを考慮したものである。
【0125】
S605では、変数f0の値が変数fの値よりも大きいか否か、すなわち、手の甲から見て指f0が指fよりもの指であるか否かが判され、判定結果がYesならばS606に進み、NoならばS607に進む。
S606では、変数f0に1、2、3のいずれかが設定されており、且つ、変数fに0が設定されているか否かが判定され、判定結果がYesならばS607に進み、Noならば今回の図14に示されている処理を終了して図13に示す処理へ戻る。ここで、この判定処理の結果がYesとなるのは、指f0が示指、中指、薬指のいずれかを示し、且つ、指fが親指を示す場合である。これは、左手の指fは、押鍵中の親指を跨ぐ(親指の上を越すこと、これを「指跨ぎ」と呼んでいる)ことによって手の甲から見て親指の右側の位置の鍵を押鍵することが可能であることを考慮したものである。
【0126】
S607では、変数hrightの値と前述した定数frangeR[f0] の値とが加算される。そして、前述した定数keypos[maxnote] の値がその加算結果よりも小さいか否か、すなわち、鍵maxnote に指f0が届くか否かが判定され、この判定結果がYesの場合にのみ、S608において変数bmaxに「TRUE」が設定され、鍵maxnote の押鍵が可能であることが示される。
【0127】
この処理の後には今回の図14に示されている処理を終了して図13に示す処理へ戻る。
次に、図13に示す第二指割当判断処理のフローチャートにおけるS534の処理ステップで実行される、指fで鍵kを押鍵しながら鍵minnote を押鍵可能な位置にあるか否かを判定する処理について、その処理内容を示す図15を参照しながら説明する。
【0128】
S651では、まず、指fで鍵kを押鍵し、且つ、他の指のうち、変数tkmin でも押鍵中である指によるその押鍵操作を維持した状態で、これらの押鍵中の指の鍵盤上の位置と各指の関節の可動範囲とを考慮したときの、配置可能な手の位置の範囲(鍵盤の横方向についての位置の範囲)が算出される。そして、配置可能な最も左寄りの手の位置を示す値(最小位置)が変数hleft に代入され、配置可能な最も右寄りの手の位置を示す値(最大位置)が変数hrightに代入される。なお、これらの位置を算出する代わりに、これらの押鍵中の指及びその指が押鍵している鍵とこれらの位置との関係を示すテーブルをROM16に予め用意しておき、このテーブルを参照することによってこれらの数値が得られるようにしてもよい。
【0129】
S652では、本装置の使用者から操作部12を介して指示される運指データの生成指示が右手についてのものか、左手についてのものかが判定され、判定結果がYes(右手の運指データの生成指示)であればS653に進み、No(左手の運指データの生成指示)であればS655に進む。
【0130】
S653では、変数f0の値が変数fの値よりも大きいか否か、すなわち、手の甲から見て指f0が指fよりも右の指であるか否かが判され、判定結果がYesならばS654に進み、NoならばS657に進む。
S654では、変数fに0が設定されており、且つ、変数f0に1、2、3のいずれかが設定されているか否かが判定され、判定結果がYesならばS657に進み、Noならば今回の図15に示されている処理を終了して図13に示す処理へ戻る。ここで、この判定処理の結果がYesとなるのは、指fが親指を示し、且つ、指f0が示指、中指、薬指のいずれかを示す場合である。これは、右手の指fは、押鍵中の親指を跨ぐことによって手の甲から見て親指の左側の位置の鍵を押鍵することが可能であることを考慮したものである。
【0131】
S655では、変数f0の値が変数fの値よりも大きいか否か、すなわち、手の甲から見て指f0が指fよりもの指であるか否かが判され、判定結果がYesならばS657に進み、NoならばS656に進む。
S656では、変数fに1、2、3のいずれかが設定されており、且つ、変数f0に0が設定されているか否かが判定され、判定結果がYesならばS657に進み、Noならば今回の図15に示されている処理を終了して図13に示す処理へ戻る。ここで、この判定処理の結果がYesとなるのは、指fが示指、中指、薬指のいずれかを示し、且つ、指fが親指を示す場合である。これは、左手の親指については、押鍵中の指fを潜ることによって手の甲から見て指fの左側の位置の鍵を押鍵することが可能であることを考慮したものである。
【0132】
S657では、変数hleft の値と前述した定数frangeL[f0] の値とが加算される。そして、前述した定数keypos[minnote] の値がその加算結果よりも大きいか否か、すなわち、鍵minnote に指f0が届くか否かが判定され、この判定結果がYesの場合にのみ、S658において変数bminに「TRUE」が設定され、鍵minnote の押鍵が可能であることが示される。
【0133】
この処理の後には今回の図15に示されている処理を終了して図13に示す処理へ戻る。
次に、図11のS408において実行される第三指割当判断処理について説明する。第三指割当判断処理では、まず、今回のノートオンのイベントデータに対応する押鍵操作を、押鍵可能であるいずれかの指に割り当てた場合を想定する。そして、その押鍵操作の継続中における他の鍵の押鍵操作のためには、割り当てた指の左右に何本の指が必要であるかを調べ、この必要となる指の本数(割当必要本数)に応じて押鍵操作が可能であるか否かの判定を行なう。
【0134】
図16は第三指割当判断処理の処理内容を示すフローチャートである。
まず、S541では、変数fに「0」を代入する。更に、図11のS404においてノートオンの指示を検出したイベントデータによって押鍵操作が指示されている鍵盤番号kの鍵について、その離鍵操作が指示されているノートオフのイベントデータが曲データから探索され、この鍵kについての押鍵開始から押鍵終了(離鍵)までの期間(発音期間)における他の鍵の押鍵の状況が調査される。そして、鍵kを軸として鍵盤を左右に分割して考えたとき、右側の鍵盤においてこの発音期間内の同一時刻で同時に押鍵状態となる鍵の個数の最大値が変数rightuseに代入され、左側の鍵盤においてこの発音期間内の同一時刻で同時に押鍵状態となる鍵の個数の最大値が変数leftuse に代入される。これらの個数が上述した割当必要本数である。
【0135】
S542では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS543に進み、Noならばこのまま今回の第三指割当判断処理を終了して図11の処理へ戻る。
S543では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した第一及び第二の指割当判断処理の両者において指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS544に進み、Noならば指番号fの指についてのS544からS549の処理による指割当判断を省略してS550に進む。
【0136】
S544では、本装置の使用者から操作部12を介して指示される運指データの生成指示が右手についてのものか、左手についてのものかが判定され、判定結果がYes(右手の運指データの生成指示)であればS545に進み、No(左手の運指データの生成指示)であればS547に進む。
【0137】
S545では、変数fの値が変数leftuse よりも小さいか否かが判定され、判定結果がYesならばS549に進み、NoならばS546に進む。ここで、変数fは指番号を示すものであるが、右手については、変数fの値は、右手の甲の側から見たときの指番号fの指の左側に有する指の本数を示していると見ることもできる。従って、このS545の判断処理は、右手の甲の側から見たときの指fの左側に有する指の本数fが変数leftuse の値に足りず、上述した同時の押鍵状態を得ることが不可能であるか否かを判定しているのである。
【0138】
S546では、4から変数fの値を減じた減算結果が変数rightuseよりも小さいか否かが判定され、判定結果がYesならばS549に進み、NoならばS550に進む。この処理は、右手の甲の側から見たときの指fの右側に有する指の本数(4−f)が変数rightuseの値に足りず、上述した同時の押鍵状態を得ることが不可能であるか否かを判定している。
【0139】
S547では、4から変数fの値を減じた減算結果が変数leftuse よりも小さいか否かが判定され、判定結果がYesならばS549に進み、NoならばS548に進む。この処理は、左手の甲の側から見たときの指fの左側に有する指の本数(4−f)が変数leftuse の値に足りず、上述した同時の押鍵状態を得ることが不可能であるか否かを判定している。
【0140】
S548では、変数fの値が変数rightuseよりも小さいか否かが判定され、判定結果がYesならばS549に進み、NoならばS550に進む。この処理は、左手の甲の側から見たときの指fの右側に有する指の本数fが変数rightuseの値に足りず、上述した同時の押鍵状態を得ることが不可能であるか否かを判定している。
【0141】
S549では、変数benable[f]に「FALSE」を設定し、今回のノートイベントに対応する押鍵操作の指番号fへの割り当てが不可能であることを示す。
S550では、変数fの値を1だけ増加させ、その後はS542へ戻って上述した処理を繰り返す。
【0142】
以上までの処理が第三指割当判断処理である。
次に、図11のS409において実行される第四指割当判断処理について説明する。第四指割当判断処理では、まず、今回のノートオンのイベントデータに対応する押鍵操作を押鍵可能ないずれかの指に割り当てた場合を想定する。そして、その押鍵操作の際に既に押鍵操作状態にある他の指を探索する。ここで、これらの両指が共に押鍵操作状態にある期間内において、鍵盤上でこれらの両指が押鍵している両鍵の間に位置する鍵を押鍵操作するには両指間に何本の指が必要であるかを調べ、この必要となる指の本数(割当必要本数)に応じて押鍵操作が可能であるか否かの判定を行なう。
【0143】
図17は第四指割当判断処理の処理内容を示すフローチャートである。
まず、S561では、変数fに「0」が代入される。
S562では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS563に進み、Noならばこのまま今回の第四指割当判断処理を終了して図11の処理へ戻る。
【0144】
S563では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した第一、第二、第三の指割当判断処理の全てにおいて指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS564に進み、Noならば指番号fの指についてのS564からS571の処理による指割当判断を省略してS572に進む。
【0145】
S564では、変数f0に「0」を代入する。
S565では変数f0の値が5よりも小さいか否かが判別され、判定結果がYesならばS566に進み、Noならば片手の5本の指の全てについてS566からS570についての処理による判定が終了したものとみなし、S572に進む。
【0146】
S566では、変数fと変数f0との値が一致しているか否かが判定され、判定結果がYesならばS571に進み、NoならばS567に進む。
S567では変数fnote[f0] に「NODATA」が設定されているか否かが判定され、判定結果がYesならばS571に進み、NoならばS568に進む。
【0147】
S568では、今回のノートオンのイベントデータに応じて指fで鍵kを押鍵し、且つ、指f0で既に鍵fnote[f0] を押鍵している場合を想定する。ここで、曲データが調べられ、鍵盤上で鍵kと鍵fnote[f0] との間に位置する鍵であって、指f及び指f0が共に押鍵操作状態にある期間内の同一時刻で同時に押鍵状態となる鍵の個数の最大値が変数use に代入される。この個数が上述した割当必要本数である。
【0148】
S569では、変数fと変数f0との値の差の絶対値が計算される。この計算結果は指fと指f0との間に有する指の本数+1を示している。そして、この指の本数+1が変数use の値以下か否かが判定され、この判定結果がYesの場合にのみ、S570において変数benable[f]に「FALSE」を設定し、今回のノートイベントに対応する押鍵操作の指番号fへの割り当てが不可能であることを示す。
【0149】
S571では、変数fの値を1だけ増加させ、その後はS565へ戻って上述した処理を繰り返す。
以上までの処理が第四指割当判断処理である。
次に、図11のS410において実行される第五指割当判断処理について説明する。図18は第五指割当判断処理の処理内容を示すフローチャートである。
【0150】
第五指割当判断処理では、まず、今回のノートオンのイベントデータに対応する押鍵操作を押鍵可能ないずれかの指に割り当てた場合を想定し、この場合に、今回のノートオンのイベントデータの後に続く後のノートオンのイベントデータに対応する押鍵操作のためにいずれかの指を割り当てることができるか否かを、前述した第一から第四までの各割当判断処理を適用して判断する。そして、この判断結果に応じて今回の想定の妥当性を判断するというものである。ここで、この想定の妥当性の判断を、今回のノートオンのイベントデータからいくつ先のノートオンのイベントデータまでを対象にして行なうものとするかは任意であり、本装置の処理速度に対する要請などに応じて設定する。なお、図18に示す本実施の形態においては、今回のノートオンのイベントデータから3つ先のノートオンのイベントデータまでを判断の対象としている。
【0151】
まず、図18のS581において、変数fに「0」が代入される。
S582では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS583に進み、Noならばこのまま今回の第五指割当判断処理を終了して図11の処理へ戻る。
【0152】
S583では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した第一、第二、第三、第四の指割当判断処理の全てにおいて指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS584に進み、Noならば指番号fの指についてのS584からS588の処理による指割当判断を省略してS589に進む。
【0153】
S584では、図11のS404においてノートオンの指示を検出したイベントデータに続く直後のノートオンのイベントデータが格納されているRAM17における格納位置を指すポインタが変数pe0 に代入され、更に、それ以降に続くノートオンのイベントデータの格納位置を指すポインタが、順に変数pe1 、pe2 にそれぞれ代入される。
【0154】
S585では、ポインタpe0 の指すノートオンのイベントデータに対し、図12から図17にかけて示した第一、第二、第三、第四の各指割当判断処理を実行し、その実行結果として、ポインタpe0 の指すノートオンのイベントデータに対応する押鍵操作のために割り当てることのできる指が存在するか否か(4種類の指割当判断処理を全て実行したときに、変数benable[f]が「TRUE」に設定されている指fが存在するか否か)が判定され、判定結果がYesならばS586に進み、NoならばS588に進む。
【0155】
S586では、ポインタpe0 の指すノートオンのイベントデータに対応する押鍵操作をS585の判定処理によって仮に割り当てた場合において、ポインタpe1 の指すノートオンのイベントデータに対してS585と同様の判定処理が実行され、判定結果がYesならばS587に進み、NoならばS588に進む。
【0156】
S587では、ポインタpe0 及びpe1 の指すノートオンのイベントデータに対応する押鍵操作をS585及びS586の判定処理によって仮に割り当てた場合において、ポインタpe2 の指すノートオンのイベントデータに対してS585と同様の判定処理が実行され、判定結果がYesならばS589に進み、NoならばS588に進む。
【0157】
S588では、変数benable[f]に「FALSE」を設定し、今回のノートイベントに対応する押鍵操作の指番号fへの割り当てが不可能であることを示す。
S589では、変数fの値を1だけ増加させ、その後はS582へ戻って上述した処理を繰り返す。
【0158】
以上までの処理が第五指割当判断処理である。
以上までに説明した第一から第五までの指割当判断処理が全て実行された後において変数benable[f]が 「TRUE」に設定されている指fが、図11のS404においてノートオンの指示を検出したイベントデータに対応する押鍵操作のために割当可能な指であると判断される。
【0159】
次に、図11のS411において実行される第一優先値割当処理について説明する。第一優先値付加処理は、図11のS404においてノートオンの指示を検出したイベントデータに対応する押鍵操作のために割当可能な指について、その指の現在の存在範囲がそのイベントデータで指示されている押鍵すべき鍵の位置に近い順に高い優先度が与えられるようにする、言い換えれば、その指の現在の存在範囲からそのイベントデータで指示されている押鍵すべき鍵の位置までの距離が長く、押鍵操作のための指の移動距離の長い順に低い優先度が与えられるようにする処理である。
【0160】
図19は第一優先値付加処理の処理内容を示すフローチャートである。
まず、S701において、変数fに「0」が代入される。
S702では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS703に進み、Noならばこのまま今回の第一優先値付加処理を終了して図11の処理へ戻る。
【0161】
S703では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した各指割当判断処理の全てを実行した結果、指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS704に進み、Noならば指番号fの指についてのS704及びS705の処理による優先値付加は不要であるので、このままS706に進む。
【0162】
S704では、変数benable[] に「TRUE」が設定されている指について、現在のその指の存在範囲 (hposR +fpos[]の加算結果の値とhposL +fpos[]の加算結果の値との間の範囲)と前述した鍵kの位置 (定数keypos[k] の値)との間の距離の近い順の順番を求め、指fについてのその順番を変数posorderに代入する。ここで、鍵kの位置が指fの存在範囲内にある場合には、変数posorderに「1」を代入する。
【0163】
S705では、4から変数posorderを減じた値に定数weight[1] の値を乗じた乗算結果を変数priority[f] に代入する。ここで、定数weight[1] は、本実施例において行なわれる第一から第四までの4種類の優先値付加処理における、この第一優先値付加処理の重要性に応じて予め設定される重み付けの値である。
【0164】
S706では、変数fの値を1だけ増加させ、その後はS702へ戻って上述した処理が繰り返される。
以上までの処理が第一優先値付加処理である。
次に、図11のS412において実行される第二優先値割当処理について説明する。第二優先値付加処理は、図11のS404においてノートオンの指示を検出したイベントデータに対応する押鍵操作のために割当可能な指について、本装置の使用者の嗜好などにより、各指の使用優先度が使用者によって設定されている場合の処理である。
【0165】
図20は第二優先値付加処理の処理内容を示すフローチャートである。
まず、S721において、変数fに「0」が代入される。
S722では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS723に進み、Noならばこのまま今回の第二優先値付加処理を終了して図11の処理へ戻る。
【0166】
S723では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した各指割当判断処理の全てを実行した結果、指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS724に進み、Noならば指番号fの指についてのS724の処理による優先値付加は不要であるので、このままS725に進む。
【0167】
S724では、変数priority[f] の値に、定数userpri[f]と定数weight[2] との乗算結果を加算し、この加算結果を改めて変数priority[f] に代入する。ここで、定数userpri[f]は、本装置の使用者の嗜好による指fの使用優先度が予め設定されている。ここで、本装置の使用者による定数userpri[f]への設定が行なわれない場合には、初期値として、例えば鍵盤楽器の演奏操作において使用される頻度の高さに応じ、示指>中指>薬指>親指>小指の順に押鍵する指の割り当てを優先させるように変数userpri[] の値が予め設定されるようにしてもよい。また、定数weight[2] は、本実施例において行なわれる第一から第四までの4種類の優先値付加処理における、この第二優先値付加処理の重要性に応じて予め設定される重み付けの値である。
【0168】
S725では、変数fの値を1だけ増加させ、その後はS722へ戻って上述した処理が繰り返される。
以上までの処理が第二優先値付加処理である。
次に、図11のS413において実行される第三優先値割当処理について説明する。第三優先値付加処理は、図11のS404においてノートオンの指示を検出したイベントデータに対応する押鍵操作のために割当可能な指について、その指が押鍵操作を行なったときに必要となる手の移動距離の短い順に、高い優先度を与えるようにする処理である。
【0169】
図21は第三優先値付加処理の処理内容を示すフローチャートである。
まず、S741において、変数fに「0」が代入される。
S742では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS743に進み、Noならばこのまま今回の第三優先値付加処理を終了して図11の処理へ戻る。
【0170】
S743では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した各指割当判断処理の全てを実行した結果、指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS744に進み、Noならば指番号fの指についてのS744からS746にかけての処理による優先値付加は不要であるので、このままS747に進む。
【0171】
S744では、指fが鍵kを押鍵操作するために必要最小限の手の移動距離を算出する。この値は、前述した変数hposL 及びhposR の値、指f以外の各指が現在押鍵を行なっている鍵の位置、手における各指の配置位置の違い、各指の長さ、各指の関節の可動角度により算出される。
【0172】
S745では、変数benable[] に「TRUE」が設定されている指について、それらの指が鍵kを押鍵操作するために必要最小限の手の移動距離の短い順の順番を求め、指fについてのその順番を変数order に代入する。
S746では、4から変数order を減じた値に定数weight[3] の値を乗じた値と、変数priority[f] の値との加算結果を改めて変数priority[f] に代入する。ここで、定数weight[3] は、本実施例において行なわれる第一から第四までの4種類の優先値付加処理における、この第三優先値付加処理の重要性に応じて予め設定される重み付けの値である。
【0173】
S747では、変数fの値を1だけ増加させ、その後はS742へ戻って上述した処理が繰り返される。
以上までの処理が第三優先値付加処理である。
次に、図11のS414において実行される第四優先値割当処理について説明する。第四優先値付加処理は、図11のS404においてノートオンの指示を検出したイベントデータに対応する押鍵操作のために割当可能な指が、そのイベントデータの直前のノートオンのイベンドデータに対応する押鍵操作のために他の鍵を押鍵しており、異なる鍵を連続して押鍵することとなる場合には、その指についての割当優先度を低下させる処理である。
【0174】
図22は第四優先値付加処理の処理内容を示すフローチャートである。
まず、S761において、変数fに「0」が代入される。
S762では変数fの値が5よりも小さいか否かが判別され、判定結果がYesならばS763に進み、Noならばこのまま今回の第四優先値付加処理を終了して図11の処理へ戻る。
【0175】
S763では変数benable[f]に「TRUE」が設定されているか否か、すなわち、前述した各指割当判断処理の全てを実行した結果、指番号fの指を押鍵操作に割り当てることが可能であると判定されているか否かが判定され、判定結果がYesならばS764に進み、Noならば指番号fの指についてのS764及びS765の処理による優先値付加は不要であるので、このままS766に進む。
【0176】
S764では、図11のS404においてノートオンの指示を検出したイベントデータの直前のノートオンのイベントデータに対応する押鍵操作が割り当てられたのはどの指であるかを調べ、その押鍵操作に割り当てられた指が指fであり、且つ、この押鍵操作の対象が鍵kとは異なる鍵であるか否かを判定し、判定結果がYesならばS765に進み、NoならばS766に進む。
【0177】
S765では、変数priority[f] の値から定数weight[4] の値を減じた減算結果を改めて変数priority[f] に代入する。ここで、定数weight[4] は、本実施例において行なわれる第一から第四までの4種類の優先値付加処理における、この第四優先値付加処理の重要性に応じて予め設定される重み付けの値であり、このステップの処理では、指fについての割当優先度を低下させる処理が実行される。
【0178】
S766では、変数fの値を1だけ増加させ、その後はS762へ戻って上述した処理が繰り返される。
以上までの処理が第四優先値付加処理である。
以上までに説明した第一から第四までの優先値付加処理が実行されることによって、押鍵操作に割当可能な指のうち、より適切な指が選択されて割り当てられるようになる。
【0179】
次に、運指情報生成処理の別の実施例について説明する。なお、これより説明する実施例を「第二実施例」と称し、今までに説明した実施例を「第一実施例」と称することとする。
第一実施例は、先行する複数の音符について全ての指使いのパターンの評価結果に基づいて運指を生成するため、CPU15の処理負担が大きい。これに対して第二実施例はCPU15の処理負担の軽減を目指すものである。
【0180】
第二実施例で行なわれる運指情報生成の概要を図23に示す。
図23について説明すると、SMF(スタンダードMIDIファイル)51で提供される曲データに対し前述した第一実施例と同様の曲データ修正処理52を施した後、その曲データで示される音の発音に使用可能な指の導出処理53が行なわれ、更に、これらの指でその音を発音させるために要する手や指の移動量を、演奏者の手のサイズのデータ及び鍵盤のサイズのデータ54に基づいて各指ごとに導き出し、その各指の移動量の大小を動作負担の大きさを示す値である動作コスト55として算定し、この動作コスト55に基づいてコストの算出処理56が行なわれる。この結果、動作コストの合計が最小となる指をその音の発音を行なわせる指として割り当てるようにする。但し、このとき、曲データで示される発音する音の列が、フレーズデータベース57に蓄積されている、標準的な(言わば定石の)運指が広く知られている所定の音高差の楽音列(フレーズ)に合致する場合には、出力結果にその標準的な運指が含まれる可能性を高くするために、その標準的な運指については各指の動作コストを低下させるようにする。第二実施例ではこのようにして運指情報の生成を行なう。
【0181】
第二実施例を行なわせる運指情報生成装置の構成は図3に示した本装置の構成と同様のものでよい。また、第二実施例において本装置の内部処理で用いられる曲データのデータ構造も図5に示したものと同様のものを用いることとする。
図24は、第二実施例において、本装置に電源を投入した直後よりROM16に記憶されている制御プログラムを読み出して実行することによりCPU15が行なう本装置全体の制御処理の処理内容を示すフローチャートである。なお、第二実施例では、右手若しくは左手の片手による運指の生成を行なうものとする。
【0182】
図24を図4と比較すると分かるように、図24におけるS1001からS1008にかけて行なわれる各処理は、図4に示したS101からS108にかけて行なわれる各処理と同様のものであり、図24のS1008に続く、S1009のフレーズチェック処理及びS1010の第二運指情報生成処理が図4に示されているものと異なる処理である。
【0183】
S1009のフレーズチェック処理の詳細を図25に示す。この処理は、図24のS1008の曲データ修正処理によって修正された曲データで示される楽曲中のスケールが、フレーズデータベースに定義されているいずれかのフレーズに合致するか否かを判定し、合致するときには予め設定されているそのフレーズについての標準的な運指を提供する処理であり、後述する割当指評価処理においてこの標準的な運指である指の評価を高めることで、割り当ての可能性を高める処理が実行される。
【0184】
フレーズデータベースに蓄積されているデータの例を図26及び図27に示す。フレーズデータベースを構成するこれらのデータは図3のROM16に予め格納されている。
図26(a)には、標準運指データが示されている。このデータは、各コードスケールの演奏のために標準的に用いられる運指データが示されている。同図についてその一部を具体的に説明すると、例えばスケール名が『Cmaj』でそのスケール内の7つのノートの音階が階段状に上昇(『UP』)していくときの運指は、同図には『0、3、2、1、0、2、1』と示されており、左手で『0(親指)、3(薬指)、2 (中指)、1(示指)、0(親指)、2(中指)、1(示指)』という順序の運指とすることが示されている。
【0185】
図27(a)には、黒鍵・白鍵データが示されている。このデータは、フレーズチェックの対象とする連続した第0音から第6音までの7つのノート中における黒鍵指示のノートの位置を示すものであり、フレーズのコード判定のために用いられる。同図によれば、例えば、フレーズ中に黒鍵指示のノートが存在しなければ(すなわち全て白鍵の指示であるならば)そのフレーズは『Cmaj』であるとされ、また、第3音のみに黒鍵指示のノートが存在していればそのフレーズは『Fmaj』であるとされる。
【0186】
なお、図27(a)に示す表は、フレーズ内のノートが上昇(『UP』)のときの順序で示されており、フレーズ内のノートが下降(『DOWN』)のときの順序は、各スケール毎に、同図に示されているものとちょうど逆の順序となる。例えば、同図に示されている『Bbmaj』には、『1,0,0,1,0,0,0』と示されているので、上昇のフレーズのときは第0音と第3音のみが黒鍵であることがフレーズの判定条件となり、下降のフレーズのときは第3音と第6音のみが黒鍵であることがフレーズの判定条件となる。
【0187】
図27(b)は音階差(半音単位の音高差)データが示されている。このデータは、フレーズチェックの対象とする連続した第0音から第6音までの7つのノートのうちの隣接したノート間の音階差を、半音を基準(1)として示したものであり、同図によれば、スケール(長音階)内の7つのノートの音階が階段状に上昇(『UP』)していくときには、各ノート間の音階差が『2(全音)、2(全音)、1(半音)、2(全音)、2(全音)、2(全音)』になることが示されている。
【0188】
以下、図25に示すフローチャートを説明する。
まず、S1101では、このフレーズチェック処理において使用される各種の変数の初期値を代入する処理が実行される。
具体的に説明すると、前述したものと同様の用途であるポインタpeには、RAM17に格納されている曲データであって、使用者によりその曲データから選択されたトラックデータの先頭のイベントデータが格納されているRAM17における格納位置を指すポインタが代入される。
【0189】
変数noteold には「NODATA」が代入される。変数noteold には、今回のイベントデータの直前でノートオンが指示されていたイベントのデータにおいて押鍵の指示がなされていた鍵の鍵盤番号(ノート番号)が代入される。
変数prevpe[0] 〜prevpe[6] にも「NODATA」が代入される。変数prevpe[m] (m=0,1,2,3,4,5,6)には、ノートオンであったイベントデータの格納場所を示すポインタpeの値の過去7つ分の履歴が順々に格納される。
【0190】
変数wbにも「NODATA」、すなわち「0000000」が代入される。変数wbは7ビットのデータであり、今回のノートオンのイベントデータ及び過去6つ分のノートオンであったイベントデータにおいて各ノートオンが鍵盤の黒鍵・白鍵のいずれであったかが各ビットのオンオフ(1、0)で示される。
【0191】
変数diff[0] 〜diff[5] にも「NODATA」が代入される。変数diff[m] (m=0,1,2,3,4,5)には、今回のノートオンのイベント及びその前にノートオンであった各イベントにおける隣接したイベント間の音階差が順々に格納される。
【0192】
S1102では、ポインタpeの指すイベントデータが、データの終了を示すものであるか否かが判定され、判定結果がYesならば今回のフレーズチェック処理を終了し、図24の処理へ戻る。一方、判定結果がNoならばS1103に進む。
【0193】
S1103ではポインタpeの指すイベントデータに設定されているイベントが「ノートオン」であるか否かが判定され、判定結果がYesならばS1104に進み、NoならばS1118に進む。
S1104では、ポインタpeの指すイベントデータに設定されているノートオンイベントの対象である鍵の鍵盤番号(ノート番号)が変数noteに代入される。
【0194】
S1105では、ポインタ pe の値が prevpe[6] に代入されるとともに、変数noteの値から変数noteold の値を減じる計算が行なわれ、その計算結果が変数diff[5] に代入される。この計算により、今回のノートオンのイベントとその直前のノートオンイベントとにおけるノート番号の差、すなわち隣接したノートオンイベント間における音階差を示す値が得られる。
【0195】
S1106では、変数noteの値で示される今回のノートオンイベントにおけるノート番号が鍵盤の黒鍵を示しているか否かが判定され、判定結果がYesの場合にのみ、S1107において、変数wbの第7ビット(第1ビットから第7ビットまでの計7ビットのデータのうちの左端のビット)に「1」がセットされる。
【0196】
S1108では、変数diff[0] 〜diff[5] のそれぞれが、定数scale _spandown[0] 〜Scale _spandown[5]、すなわち、図27(b)の音階差データのうち、「DOWN」の行に示されている各値と全て一致するか否かが判定される。この判定結果がYesならば、このフレーズは「下降」のフレーズと判定され、S1109でフラグdowmに「1」がセットされ、その後はS1112に進む。一方、S1108の判定結果がNoならばS1110に進む。
【0197】
S1110では、変数diff[0] 〜diff[5] のそれぞれが、定数scale _spanup[0] 〜Scale _spanup[5]、すなわち、図27(b)の音階差データのうち、「UP」の行に示されている各値と全て一致するか否かが判定される。この判定結果がYesならば、このフレーズは「上昇」のフレーズと判定され、S1111でフラグdowmに「0」がセットされ、その後はS1112に進む。一方、S1110の判定結果がNoならば、このフレーズは「上昇」、「下降」いずれのフレーズでもないと判定され、S1117に進む。
【0198】
S1112では、変数scaleID に「0」が代入される。変数scaleID は、図2(a)の「スケール」の欄に示した12種のスケールの各々を示すためのものであり、例えば、同図の上から順にscaleID =0ならCmajを、scaleID =1ならFmajを、各々示す。
【0199】
S1113では変数scaleID が定数MAX _SCALEID よりも小さいか否かが判定され、判定結果がYesならばS1114に進み、NoならばS1117に進む。定数MAX _SCALEID は、図2(a)の「スケール」の欄に示したスケールの種類の数であり、ここでは「12」が設定されている。
【0200】
S1114では、定数scale _wb[scaleID][dowm] の値、すなわち、図27(a)の黒鍵・白鍵データによって示される、変数scaleID で示されるスケールであって且つフラグdownで示されるフレーズ内のノート変化(上昇・下降)であるときの黒鍵・白鍵のノートオン指示の並びと、変数wbで示される、今回のノートオン及び過去6つ分のノートオンのイベントデータにおける黒鍵・白鍵のノートオン指示の並びとが一致するか否かが判定され、判定結果がYesならばS1116に進み、NoならばS1115に進む。
【0201】
S1115では変数scaleID の値が1だけ進められ(増やされ)、その後はS1113へ戻って上述した処理が繰り返される。
S1116では、7個の変数prevpe[0]->fig〜prevpe[6]->figのそれぞれに、定数scale _fig[scaleID][down][0] 〜scale _fig[scaleID][down][6] の各値、すなわち、図26(a)の標準運指データに示されている、変数scaleID で示されるスケールであって且つフラグdownで示されるフレーズ内のノート変化であるときの音符番号0から6の各ノートについてノートオン指示されている鍵を押鍵する指を示す番号が代入される。この処理により、ポインタpeの指すイベントデータに設定されているノートオンイベントの対象である鍵を押鍵する指を含む7音分の運指割り当てが行なわれる。この指の割り当ての情報は、後述するフレーズデータ比較評価処理(図49)では変数fig[pe] で参照できるものとする。
【0202】
S1117では、変数diff[m] の値が変数diff[m-1] に代入されてノートオンのイベント間の音階差を示すデータの履歴が残され、続いて変数wbの値を右が1ビットシフトされた後にビットマスクされて7ビットのデータとされ、更に変数noteの値が変数noteold に代入され、そして、変数prev[m] の値が変数prev[m-1] に代入されてポインタpeの値の過去の履歴が残される。
【0203】
S1118では、選択されているトラックデータにおける次のイベントデータが格納されているRAM17上の格納位置を指すようにポインタpeの値が進められ、その後はS1102へ戻って上述した処理が繰り返される。
以上までの処理がフレーズチェック処理である。
【0204】
次に、図24のS1010に示されている第二運指情報生成処理について説明する。この処理は、曲データで示される音の発音に使用可能な指を求め、これらの指でその音を発音させるために要する手や指の移動量を、演奏者の手のサイズのデータ及び鍵盤のサイズのデータに基づいて各指ごとに導き出し、その各指の移動量の大小を動作の負担(動作コスト)として算出し、この結果から、動作コストが最小となる指をその音の発音を行なわせる指として割り当てる処理である。
【0205】
第二運指情報生成処理の処理内容を示すフローチャートを図28に示す。
まず、S2001ではこの第二運指情報生成処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、例えば、演奏開始後の経過時間を算出するために用いられる変数tktimeには、「0」が代入される。また、ポインタpeには、RAM17に格納されている曲データであって、使用者によりその曲データから選択されたトラックデータの先頭のイベントデータが格納されているRAM17における格納位置を指すポインタが代入される。
【0206】
S2002では、ポインタpeの指すイベントデータがデータの終了を示すものであるか否かが判定され、判定結果がYesならば今回の第二運指情報生成処理を終了して図24の処理へ戻る。一方、判定結果がNoならばS2003に進む。
【0207】
S2003では、変数tktimeの値に、ポインタpeの指すイベントデータに設定されているデルタタイムの値(pe->tktime)を加算した結果が改めて変数tktimeに代入される。
S2004ではポインタpeの指すイベントデータに設定されているイベントが「ノートオン」であるか否かが判定され、判定結果がYesならばS2007に進み、NoならばS2005に進む。
【0208】
S2005ではポインタpeの指すイベントデータに設定されているイベントが「ノートオフ」であるか否かが判定され、判定結果がYesならばS2006に進み、NoならばS2016に進む。
S2006では、指オフ処理が実行され、対応する鍵についての押鍵状態から離鍵状態への状態設定の変更、及び、全ての鍵が離鍵となったのであれば、変数tktimeのそのときの値が変数tkalloffに代入され、無発音の状態の開始時刻が保持される。この指オフ処理を終えた後にはS2016に進む。
【0209】
S2007では、変数tkalloffに「NODATA」が設定され、更に変数pass_count の値が1だけ進められる。変数pass_count については後述する。
S2008では音符情報取得処理が実行される。この処理の処理内容を図29を用いて説明する。
【0210】
音符情報取得処理は、評価対象となる音符と、その音符の前後に発音される音符との発音の重なりの状態を示す音符情報を取得する処理である。
図29は、各音符の発音の継続状態を音高−時間軸上に示したものであり、いわゆるピアノロールの形式で各音符を示したものである。同図に示すように、音符情報NoteTypeは0〜3の4種類が定義されている。
【0211】
図29において、(1)、(2)はNoteType=0の場合を示しており、評価対象の音符とその前後の音符との発音の重なりが全く存在しない場合(1)、あるいはその重なりが所定の時間以内である場合(2)、をそれぞれ示している。また、(3)はNoteType=1の場合、すなわち評価対象の音符とその直前の音符との発音の重なりのみが所定時間以上である場合を、(4)はNoteType=2の場合、すなわち評価対象の音符とその直後の音符との発音の重なりのみが所定時間以上である場合を、(5)はNoteType=3の場合、すなわち評価対象の音符とその直前及び直後の両方の音符との発音の重なりが所定時間以上である場合を、それぞれ示している。
【0212】
S2008の音符情報取得処理では、ポインタpeの指すイベントデータに示されているノートと、その前後でノートオンされるノートとによる発音の重なりの状態を調べ、この状態が図29に示した4種類のNoteTypeのいずれに該当するかを判定する。
【0213】
S2009ではフレーズ判定処理が実行される。フレーズ判定処理は、音符列からなるフレーズを曲データから抽出し、そのフレーズが和音フレーズ若しくは指潜りフレーズに該当するか否かを判定する処理である。フレーズ判定処理、和音フレーズ、指潜りフレーズの詳細については後述する。
【0214】
S2010では評価イベント数設定処理が実行される。この処理は、次に実行される割当指評価処理において、評価の対象とするイベントの数を設定する処理であり、例えば、ポインタpeの指すイベントデータに続く6つ先のイベントデータまでを評価の対象とするのであれば、変数sakiyomiに値「6」が代入される。
【0215】
S2011では指割当判断処理が実行される。指割当判断処理は、前述した第一実施例と同様の、第一から第五までの指割当判断処理(図12〜図18)が実行され、各指について、イベントデータによってノートオンの指示がされている鍵の押鍵操作を行なうことが可能であり、その押鍵操作にその指を割り当てることができるか否かが判定される。更に、ここでは、前述したフレーズ判定処理によって指潜りフレーズであると判定されたフレーズを演奏するために割り当てることのできる指の候補が存在するか否かを判定する処理も実行される。この処理の詳細については後述する。
【0216】
指割当判断処理の判定結果は変数enable[0] 〜enable[4] に示され、割り当て可能な指に対応するものには「TRUE」が、割り当て不能の指に対応するものには「FALSE」が、それぞれ設定される。
S2012では割当指評価処理が実行される。割当指評価処理は、指割当判断処理によって割当可能と判定された各指について、実際にこれらの指でその音を発音させるために要する手や指の移動量を、演奏者の手のサイズのデータ及び鍵盤のサイズのデータに基づいて各指ごとに導き出し、その各指の移動量の大小を動作の負担(動作コスト)として算出する処理である。割当指評価処理の詳細も後述する。
【0217】
S2013では、割当指評価処理の結果、所定値以下の動作コストである指、すなわち運指の割当の可能な指が有るか否かが判定され、判定結果がYesならばS2015に進み、NoならばS2014に進む。
S2014では条件変更処理が実行される。条件変更処理は、例えば、割当指評価処理で用いられている評価点の変更や、指の可動範囲の変更、評価イベント数設定処理において設定された変数sakiyomi の値の変更、あるいは、後述する曲データのクオンタイズなどを行なって、S2013の判定処理の結果がYesとなるように各種条件の微調整を行なう処理である。この処理を終えた後にはS2008へ戻って上述した処理が繰り返される。
【0218】
S2015では指割当処理が行なわれ、割当指評価処理の結果、動作コストが最小であった指が、ポインタpeの指すノートオンイベントに対応する押鍵操作を行なう指に割り当てられる。
S2016ではフレーズ終端判定処理が実行され、ポインタpeの指すイベントが、フレーズ判定処理によって和音フレーズ若しくは指潜りフレーズに該当すると判定されたフレーズの終端であるか否かが判定され、フレーズの終端であった場合にフレーズ判定処理によって設定されたフラグをクリアさせる処理が行なわれる。
【0219】
S2017では、選択されているトラックデータにおける次のイベントデータが格納されているRAM17上の格納位置を指すようにポインタpeの値が進められ、その後はS2002へ戻って上述した処理が繰り返される。
以上までの処理が第二運指情報生成処理である。
【0220】
次に、図28のS2009において実行されるフレーズ判定処理について説明する。フレーズ判定処理の処理内容を図30にフローチャートで示す。
まず、S2101において、前述した第二運指情報生成処理のS2006(図28)の説明で触れた変数tkalloffの値が「NODATA」であるか否か、すなわちいずれかの鍵が押鍵の状態にあるか否かが判定され、この判定結果がYesならばS2104に、NoならばS2102に、それぞれ進む。
【0221】
S2102では、変数tktimeの値から変数tkalloffの値を減じた結果の値が定数PhraseTimeの値よりも大きいか否かが判定され、この判定結果がYesの場合にのみ、S2103において、変数phrase_onに「TRUE」が設定される。
以上のS2101からS2103までの処理はフレーズの区切りを検出する処理であり、全ての鍵の離鍵状態が定数PhraseTimeの値で示される時間よりも長く継続しているときには、曲データにおけるポインタpeの現在の値に対応する部分をひとつのフレーズの区切れ部分とみなし、フレーズの区切りが検出されたことを変数phrase_onに示す処理である。なお、これらの処理によって検出されるフレーズは、後述する和音フレーズや指潜りフレーズを包含する、それらよりも大きな概念の音符列である。
【0222】
S2104では、変数chord _onに「TRUE」が設定されているか否かが判定され、この判定結果がYesならば今回のフレーズ判定処理を終了して図28の処理へ戻る。一方、この判定処理の結果がNoならばS2105に進む。変数chord _onは現在検出されているフレーズが和音フレーズであるか否かを示すフラグである。
【0223】
S2105では和音フレーズ判定処理が実行される。この処理は、ポインタpeの現在の値で示されるRAM17上のイベントデータに続く次以降のイベントデータを調べ、現在の時刻から定数TkChord で示される時間以内に「ノートオン」のイベントが3個以上含まれているときには、このフレーズを「和音フレーズ」とみなす処理である。そして、この和音フレーズが検出されたときには、前述した変数chord _onに「TRUE」を設定する。
【0224】
S2106では、変数chord _onに「TRUE」が設定されているか否かが再度判定され、この判定結果がYesならばS2107に進み、NoならばS2108に進む。
S2107では、この和音フレーズを構成する最後の「ノートオン」のイベントデータが格納されているRAM17のアドレスが変数chord _end に代入され、更に、変数pass_onに「FALSE」が設定される。ここで、変数pass_onは、後述する指潜りフレーズ判定処理において指潜りフレーズが検出されたことを示すフラグであるが、ここでは、和音フレーズは指りフレーズに優先し、和音フレーズであるとみなされたフレーズは指潜りフレーズとはみなされないようにしている。
【0225】
このS2107の処理を終えた後には今回のフレーズ判定処理を終了して図28の処理へ戻る。
S2108では指潜りフレーズ判定処理が実行される。指潜りフレーズ判定処理は、ポインタpeの現在の値で示されるRAM17上のイベントデータに続く次以降のイベントデータを調べ、これらがポインタpeの現在の値で示されるイベントデータに続いて連続して発音されることが示されている(すなわち、所定時間以上の無発音の時間を含まない)「ノートオン」のイベントを示しているときには、これらのイベントデータの音高の変化の単調性及びその変化の大きさ、更に手・指の現在の押鍵状態に基づいて、これらのイベントデータの演奏で指潜りが発生するか否かを判定する処理である。なお、第二実施例においては、指潜りと指跨ぎとは区別せず、どちらも「指潜り」と称することとする。
【0226】
この指潜りフレーズ判定の原理を図31を用いて説明する。
指潜りフレーズの判定においては、判定対象のフレーズが次の3つの点について調べられる。
(1) 運指が確定している直前のノートオンイベントで示されている音高とポインタpeの現在の値で示されるイベントデータに示されている音高との関係は上昇であるか下降であるか。
(2) ポインタpeの現在の値に続く連続発音であるノートオンイベントのうち、上記(1)に継続して単調に上昇若しくは下降しているイベントが存在するか。
(3) 運指が確定している直前のノートオンイベントについての手・指の押鍵状態を考慮すると、指潜りを行なわずに(2)のイベントを押鍵することが可能であるか。
【0227】
ピアノロールの形式で各音符を示した図31の具体例で、以上の点の検討を行なってみる。なお、説明を簡単にするために、同図の具体例に運指を施す指は右手の指のみに限定する。図31において、音符Aは既に運指が決定されているものとし、ポインタpeの現在の値は音符[1]を指しているものとする。また、音符A及び音符[1][5]は全て連続発音であると判定されているものとする。
【0228】
図31(a)において音符Aから音符[1]にかけては音高が上昇している((1)の判定結果)。従って、指潜りフレーズの判定候補は音高が単調に上昇している音符[3]までの音符列である((2)の判定結果)。ここで、音符Aの運指として親指若しくは示指が割り当てられていれば、右手にはその割り当てられた指の右側に3つ以上の指があるので、音符[3][4][5]は指潜りを行なわずに押鍵することが可能である((3)の判定結果)。よって、図31(a)の音符A及び音符[1][2][3]は、親指若しくは示指が音符Aの運指に割り当てられていれば指潜りフレーズではないと判定され、そうでない場合には指潜りフレーズであると判定される。
【0229】
図31(b)では音符Aから音符[1]にかけては音高が上昇している((1)の判定結果)。従って、指潜りフレーズの判定候補は音高が単調に上昇している音符[5]までの音符列である((2)の判定結果)。この場合には音符Aの運指としてどの指が割り当てられていようとも、指潜りを行なわずに音符[1][5]の全てを右手で押鍵することは不可能である((3)の判定結果)。よって、図31(b)の音符列は指潜りフレーズであると判定される。
【0230】
図31(c)では音符Aから音符[1]にかけては音高が下降している((1)の判定結果)。従って、指潜りフレーズの判定候補は、音高が単調に下降している音符[2]までの音符列である((2)の判定結果)。ここで、音符Aの運指として親指若しくは示指が割り当てられていると、右手にはその割り当てられた指の左側には1つ以下しか指がないので、音符[1][2]は指潜りを行なわずに押鍵することができない((3)の判定結果)。よって、図31(c)の音符A及び音符[1][2]は、親指若しくは示指が音符Aの運指に割り当てられていれば指潜りフレーズであると判定され、そうでない場合には指潜りフレーズでないと判定される。
【0231】
指潜りフレーズの判定は以上のようにして行なわれる。
図30の説明に戻る。S2108の指潜りフレーズ判定処理によって指潜りフレーズであると判定されたときには、変数pass_onに「TRUE」が設定され、判定対象のフレーズが指潜りフレーズであったことが示される。
【0232】
S2109では、直前の指潜りフレーズ判定処理によって変数pass_onに「TRUE」が設定されたか否かが判定され、判定結果がYesの場合にのみ、S2110において変数pass_count に「0」が代入され、変数pass_timeに変数tktimeの現在の値、すなわち今回の指潜りフレーズの開始時刻が代入され、変数pass_end にこの指潜りフレーズを構成する最後の「ノートオン」のイベントデータが格納されているRAM17のアドレスが代入される。なお、変数pass_count は、ある指潜りフレーズにおいて後述する処理が施されたノートオンイベントの個数を数えるものであり、前述した第二運指情報生成処理のS2007(図28)において、その値を更新させる処理が行なわれる。
【0233】
S2110の処理を終えた後、あるいはS2109の判定処理の結果がNoであったときには、今回のフレーズ判定処理を終了して図28の処理へ戻る。
以上までの処理がフレーズ判定処理である。
次に、図28のS2011の指割当判定処理の一部として行なわれる、指潜りフレーズであると判定されたフレーズ中の楽音について実際に押鍵可能である指の候補を見つけ出す処理について説明する。
【0234】
この処理は、図32に示す使用可能指の検索テーブルを参照し、既に運指が決定されている楽音に続く楽音についての押鍵の可能な指をこのテーブルから割り出す処理である。例えば、単調に上昇するフレーを右手で押鍵する場合、先行する楽音の押鍵に2(中指)が既に割り当てられているときには、後に続く楽音についての押鍵の可能な指は0(指潜りによる親指)、3(薬指)、4(小指)のいずれかであることが図32の検索テーブルの※印を付した行より直ちに判明する。従って、これらの指のうち、他の鍵の押鍵のために現在使用中でないものを割り当て可能な指とする。
【0235】
次に、図28のS2012の割当指評価処理について説明する。割当指評価処理の処理内容を図33にフローチャートで示す。
まず、S3001において、この割当指評価処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、例えば、各指についての動作コストの算出結果のうちの最良である動作コストの値が最終的に設定される変数bestscにはここでは「NODATA」が代入され、また、各指の動作コストの計算結果が設定される変数sc[0] 〜sc[4] にはここでは「0」が代入される。
【0236】
S3002では、前述した変数phrase_onに「TRUE」が設定されているか否か、すなわち現在の割当評価の対象となる楽音が、フレーズ判定処理のS2101からS2103までの処理で検出されたフレーズの先頭とみなされているかが判定され、この判定結果がYesのときにのみS3003においてフレーズ先頭評価処理が実行される。
【0237】
このフレーズ先頭評価処理について、図34を参照しながら説明する。
フレーズ先頭評価処理は、フレーズ内の各楽音の音高の変化の傾向を把握し、その傾向に基づいて、このフレーズの先頭の楽音についての押鍵に割り当てる指を決定するための動作コストに重み付けを行なう処理である。
【0238】
説明を簡単にするために右手のみに注目して説明すると、例えば、このフレーズに属する各楽音の音高の変化がフレーズの先頭の楽音の音高から上昇していく傾向にあるのならば、フレーズの先頭の楽音のための押鍵には、親指寄りの指を割り当てる方がその後のそのフレーズについての運指が容易になることが期待できる。また、逆に、フレーズの音高が下降傾向であるならば、フレーズの先頭の楽音のための押鍵は指寄りの指を割り当てる方が有利であると考えられる。フレーズ先頭評価処理は、この考えに基づいて各指の動作コストに対して重み付けを行なう処理である。
【0239】
図34(a)は、フレーズ内の音符列を示したものである。同図において、音符(A)がフレーズ内の先頭の音符(すなわち、現在の指評価の対象となっている音符)であり、同図の縦軸で音符(B)〜(K)と音符(A)との音高差を示している。
【0240】
フレーズ先頭評価処理は、本実施の形態では原則として6音先までの音符を評価の対象とし、そこまでの音符と先頭との音符との音階差に大きな差がないときには、フレーズの音高の傾向が十分に把握できないとみなし、更に4音先までの音符を評価の対象とするものとする。
【0241】
図34(a)の例では、原則としては音符(G)までが評価の対象であるが、そこまでの音符(B)〜 (G)と先頭との音符(A)との音階差に大きな差(例えば同図における音高差が3以上)がないので、更に音符(H)〜(K)までが評価の対象に加えられる。
【0242】
フレーズの音高の傾向に基づく動作コストの算出は図34(b)に示すような評価テーブルを参照して行なわれる。なお、図34(b)の評価テーブルは右手用のものである。図34(a)の例で説明すると、例えば音符(B)は音符(A)と1の音階差があり、この音階差は、図34(b)の評価テーブルの列[1]を参照すると、小指のみが動作コストが1であり、他の指については動作コストが0である。これらの動作コストは、音符(D)及び(F)についても同様である。
【0243】
音符(C)、(E)、及び(G)については、いずれも音符(A)との音階差は0であるから、これらの音符についての各指の動作コストはいずれも0であることが評価テーブルの列[2]から判明する。以下同様に、音符(H)については、評価テーブルの列[3]より、親指、示指、及び中指が動作コスト0で薬指及び小指が動作コスト1と判明し、音符(I)については、評価テーブルの列[4]より、親指が動作コスト1で他の指が動作コスト0と、音符(J)については、評価テーブルの列[5]より、親指及び示指が動作コスト0で中指、薬指、及び小指が動作コスト1と、音符(K)については、評価テーブルの列[6]より、小指が動作コスト1で他の指が動作コスト0と、それぞれ判明する。
【0244】
これらの判明した動作コスト全てを各指毎に合計すると、
親指:1 示指:0 中指:1 薬指:2 小指:6
となり、図33のS3003の処理においてはこれらの値が変数sc[0] 〜sc[4] の各々にまず代入される。このようにして各指に与えられた動作コストのみを比較すれば、このフレーズの先頭の音符に対応する押鍵を行なうのは示指が最適であることが判明する。
【0245】
図33の説明に戻る。S3004では変数fig に0がまず代入される。変数fig は処理の対象とする指を特定するためのものである。
S3005では、変数fig の値が、手の指の本数(すなわち5)を示す定数MAX _FINGERよりも小さいか否かが判定され、判定結果がYesならばS3006に進み、NoならばS3011に進む。
【0246】
S3006では変数enable[fig] が「TRUE」に設定されているか否かが判定され、判定結果がYesならばS3007に進み、NoならばS3010に進む。前述した指割当判断処理(図28のS2011)で説明したように、変数enable[fig] は、変数fig に対応する指が割り当て可能であるか否かが示されるフラグである。
【0247】
S3007ではコスト取得処理が実行され、その実行結果として得られる指fig についての動作コストと変数sc[fig] の現在の値との加算結果が改めて変数sc[fig] に代入される。動作コスト取得処理の詳細は後述する。
S3008では、変数sc[fig] の現在の値が、押鍵のための指として割り当て可能な動作コストの上限が示されている定数cutsc よりも大きいか否かが判定され、判定結果がYesの場合にのみ、S3009において変数enable[fig] に「FALSE」が設定されて変数fig に対応する指は押鍵のための指としての割り当てに供することができないことが示される。
【0248】
S3010では、変数fig の値を1だけ増加させ、その後はS3005へ戻って上述した処理が繰り返される。
S3011では、変数fig に改めて0が代入される。
S3012では、変数fig の値が、手の指の本数(すなわち5)を示す前述しいた定数MAX _FINGERよりも小さいか否かが判定され、判定結果がYesならばS3013に進み、Noならば今回の割当指評価処理を終了して図28の処理へ戻る。
【0249】
S3013では変数enable[fig] が「TRUE」に設定されているか否かが判定され、判定結果がYesならばS3014に進み、NoならばS3019に進む。
S3014では、変数sc[fig] の現在の値が変数bestscの現在の値よりも大きいか否かが判定され、判定結果がYesならばS3015に進んで変数enable[fig] に「FALSE」が設定されて変数fig に対応する指は押鍵のための指としての割り当てに供することができないことが示され、その後はS3019に進む。一方、S3014の判定結果がNoならばS3016に進む。
【0250】
S3016では先行音符評価処理が実行され、その実行結果として得られる変数fig に対応する指についての動作コストと変数sc[fig] の現在の値との加算結果が改めて変数sc[fig] に代入される。先行音符評価処理は、現在の評価対象となっているイベントデータよりも後のイベントデータの内容に基づいて変数fig に対応する指の動作コストを算出する処理であり、その詳細は後述する。
【0251】
S3017では、変数sc[fig] の現在の値が変数bestscの現在の値よりも小さいか否かが判定され、判定結果がYesの場合にのみ、すなわち、先行音評価処理に基づく動作コストを見込んでも変数sc[fig] の現在の値が変数bestscの現在の値よりも小さい場合にのみ、S3018で変数sc[fig] の現在の値が変数bestscに代入される。
【0252】
S3019では、変数fig の値を1だけ増加させ、その後はS3012へ戻って上述した処理が繰り返される。
以上までの処理が割当指評価処理である。
次に、図33のS3007において実行されるコスト取得処理について説明する。コスト取得処理の処理内容を図35にフローチャートで示す。
【0253】
まず、S3101において、このコスト取得処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、例えば、動作コストの算出結果の総計が最終的に設定される変数sc(前述した変数 sc[fig] とは別のものである)には初期値0が代入され、現在の評価対象の指を特定するために用いられる変数fig には、割当指評価処理でこのコスト取得処理の実行が呼び出されたときの変数fig の値が渡されて代入される。
【0254】
続くS3102からS3108にかけての処理は、変数fig で示される指について、指の開き評価処理 (S3102)、黒鍵評価処理(S3103)、手の移動評価処理(S3104)、押鍵時間評価処理(S3105)、連続打鍵評価処理(S3106)、指潜り評価処理(S3107)、及びフレーズデータ比較評価処理(S3108)がそれぞれ実行され、これらの各処理の実行結果として得られる、変数fig で示される指についての動作コストが変数scを用いて順次加算される。その結果として変数scに格納されている動作コストの合計値が割当指評価処理に返される。
【0255】
以上までの処理がコスト取得処理である。
以下、コスト取得処理のS3102からS3108にかけて実行される各種処理の詳細を説明する。
図36は、図35のS3102において実行される指の開き評価処理の処理内容を示すフローチャートである。この処理は、他の指による押鍵が継続している状態において変数newfigで示される評価対象の指での押鍵を割り当てた場合に、その割当に基づく押鍵のために要する指の開きの大きさを動作コストとして算出する処理である。
【0256】
まず、S3201において、この指の開き取得処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、例えば、上述した変数newfigには、割当指評価処理でこのコスト取得処理の実行が呼び出されたときの変数fig の値が渡されて代入され、指の開きの評価の対象となるもう一方の指を示す変数fig には0が代入され、動作コストの累計のために用いられる変数score には0が代入される。また、今回の指割り当ての対象となっているノートオンイベントのノート番号(押鍵指示されている鍵の番号)が変数noteに代入される。更に、各指の現在の押鍵・離鍵の状態が変数fnote[0]〜fnote[4]に代入される。この変数には、押鍵状態を示すときにはその押鍵されている鍵の番号が代入され、離鍵状態を示すときには「NODATA」が代入される。
【0257】
S3202では、変数fig の値が、手の指の本数を示す前述した定数MAX _FINGERよりも小さいか否かが判定され、判定結果がYesならばS3203に進み、Noならば今回の指の開き評価処理を終了して変数score の値を図35の処理へ返す。
【0258】
S3203では、変数fig の値と変数newfigの値とが一致するか否かが判定され、判定結果がYesならばS3217に進み、NoならばS3204に進む。S3204では、変数fnote[fig]の値が「NODATA」であるか否か、すなわち変数fig で示される指が離鍵状態にあるか否かが判定され、判定結果がYesならばS3217に進み、NoならばS3205に進む。
【0259】
S3205では、変数fig の値が変数newfigの値よりも大きいか否かが判定される。そして、この判定結果がYesならばS3206で変数bfに変数fig の値が代入され、更に、変数sfに変数newfigの値が代入された後にS3208に進む。一方、S3205の判定結果がNoならばS3207で変数bfに変数newfigの値が代入され、更に、変数sfに変数fig の値が代入される。
【0260】
S3208では、定数HandTypeに「RIGHTHAND」が設定されているか否かが判定される。そして、この判定結果がYesならばS3209でkpos[fnote[sf]] の値から定数kpos[fnote[bf]] の値を減じた結果の値が変数spanに代入され、その後はS3211に進む。一方、この判定結果がNoならばS3210でkpos[fnote[bf]] の値から定数kpos[fnote[sf]] の値を減じた結果の値が変数spanに代入される。ここで、定数HandTypeには、第二実施例において運指生成を行なわせる手が右手(RIGHTHAND)であるか左手(LEFTHAND)であるかが示されている。また、定数kpos[]は、鍵盤の横方向(鍵が並べられている方向)における各鍵の位置の距離を示す値が格納されているテーブルであり、第一実施例におけるkeypos[]と同様のものである。
【0261】
以上のS3205からS3210にかけての処理によって、評価対象の2つの指の開きの距離が変数spanに与えられる。なお、変数spanの値が負となる場合は、二つの指の押鍵のための割り当ての配置がその手におけるこれらの指の配置と逆になってしまっていることを示している。
【0262】
S3211では、spantableno[sf][bf] の値が変数table に代入される。定数spantableno[][] は、評価対象である指の組み合わせを特定の数字に対応させるテーブルである。
spantableno[][] のテーブルの例を図37(a)に示す。同図のテーブルより、評価対象である指の組み合わせが例えば示指(指番号1)と中指(指番号2)とであるならば、このテーブルから得られる数字は4であり、この数が変数table に代入される。
【0263】
S3212では、変数spanの値が定数STBL_MINSPAN の値よりも小さいか否かが判定され、判定結果がYesならばS3216に進み、NoならばS3213に進む。定数STBL_MINSPAN については後述する。
S3213では、変数spanの値が定数STBL_MAXSPAN の値よりも大きいか否かが判定され、判定結果がYesならばS3215に進み、NoならばS3214に進む。定数STBL_MAXSPAN については後述する。
【0264】
S3214では、変数score の現在の値にspantable[table][span]の値を加算した結果が改めて変数score に代入され、その後はS3217に進む。定数spantable[][] は、評価対象である指の組み合わせ(前述した変数table の値)及びこれらの指で所定の押鍵が行なわれるときの指の開き(前述した変数spanの値)と、このときの動作コストとを対応付けているテーブルである。
【0265】
spantable[][] のテーブルの例を図37(b)に示す。同図のテーブルより、例えば評価対象である指の組み合わせを示す変数table の値が4(すなわち、指の組み合わせが例えば示指(指番号1)と中指(指番号2))であって、これらの指で所定の押鍵が行なわれるときの指の開きを示す変数spanの値が半鍵盤単位(隣接する白鍵−黒鍵の間隔の距離を基準とした単位)で+3であったときには、このテーブルから得られる動作コストが3であり、この値が変数score で累計される。
【0266】
なお、これ以降の説明において、本実施例における鍵盤上の位置や2点間の距離を示す各種の数値の単位は、いずれも上述した半鍵盤単位を1としたものを使用する。
なお、前述した定数STBL_MINSPAN 及びSTBL_MAXSPAN は、spantable[][] のテーブルでカバーされている指の開きの下限及び上限の値が設定されており、図37(b)の例では、定数STBL_MINSPAN には−5が、定数STBL_MAXSPAN には+15がそれぞれ設定されていることになる。つまり、S3212及びS3213の判定処理によって、変数spanの値がspantable[][] のテーブルのカバーしている範囲に含まれているか否かの判定が行なわれているのである。
【0267】
S3215は、変数spanの値がspantable[][] のテーブルのカバーしている上限を超えてしまっていた場合に行なわれる処理であり、
spantable[table][ STBL_MAXSPAN]+ (span - STBL_MAXSPAN)×STBL_OVERSCORE
なる計算の計算結果と変数score の値との加算結果が改めて変数score に代入され、その後はS3217に進む。上述した計算式は、テーブルの範囲外の動作コストは単純に直線的に増加するとみなすものであり、定数STBL_OVERSCORE はそのときの傾きである。
【0268】
S3216は、変数spanの値がspantable[][] のテーブルのカバーしている下限を下回ってしまっていた場合に行なわれる処理であり、
spantable[table][ STBL_MINSPAN] + abs(span - STBL_MINSPAN)×STBL_OVERSCORE
なる計算の計算結果と変数score の値との加算結果が改めて変数score に代入される。上述した計算式は、S3215と同様の考え方によるものである。
【0269】
S3217では、変数fig の値を1だけ増加させ、その後はS3202へ戻って上述した処理が繰り返される。
以上までの処理が指の開き評価処理である。
次に、図35のS3103において実行される黒鍵評価処理について説明する。黒鍵評価処理は、割り当ての対象であるノートオンイベントが黒鍵の押鍵指示であるときに、黒鍵の押鍵のためには多大な移動が必要となる親指及び小指に対して動作コストを課す処理である。
【0270】
黒鍵評価処理の処理内容を図38にフローチャートで示す。
まず、S3301において、動作コストの累計のために用いられる変数score には0が代入され、更に、変数newfigに、割当指評価処理でこの黒鍵評価処理の実行が呼び出されたときの変数fig の値が渡されて代入される。
【0271】
S3302では、変数newfigの値が0若しくは4であるか否か、すなわち、評価対象である指が親指若しくは小指であるか否かが判定され、判定結果がYesならばS3303に進み、Noならば今回の黒鍵評価処理を終了して変数score の現在の値を図35の処理へ返す。
【0272】
S3303では、現在の指割り当ての対象であるノートオンイベントが黒鍵の押鍵指示であるか否かが判定され、判定結果がYesならばS3304に進み、Noならば今回の黒鍵評価処理を終了して変数score の現在の値を図35の処理へ返す。
【0273】
S3304では、変数score の現在の値に定数sc_blk の値が加算された結果の値が変数score に改めて代入される。この定数sc_blk の値は、親指若しくは小指による黒鍵の押鍵について設定されている動作コストである。
S3305では、割り当ての対象であるノートオンイベントが属しているブロックが、和音であり、且つそのブロックを構成する楽音の音高差が所定の音高差よりも大きいか否かが判定され、判定結果がNoの場合にのみ、S3306において変数score の現在の値に定数sc_blk2の値が加算された結果の値が変数score に改めて代入される。
【0274】
ここで、ブロックの概念について説明する。以降の説明において、ブロックとは音符列に存在する単音若しくは複数の音からなる塊を示すものとする。ここで、ブロックの区切り(連続する2つのブロックの境)は、前述した第二運指情報生成処理において行なわれる音符情報取得処理(図28のS2008)の結果として取得される音符情報NoteTypeによって特定され、その値が0又は1である音符がひとつのブロックに属する音符のうちの最後の音符となる。なお、音符情報Notetypeが0である音符は単音のブロックを構成する。
【0275】
ブロックについて、図39の例で更に説明する。
図39において、単音である音符1でブロックaが構成され、和音である音符2、3、及び4でブロックbが構成される。以下同様に、音符5でブロックcが、音符6でブロックdが、音符7、8、及び9でブロックeが、音符10、11、及び12でブロックfが、それぞれ構成される。
【0276】
S3305の判定処理は、音高差の大きい和音ならば、例え割り当ての対象である鍵が黒鍵であっても親指若しくは小指を用いて押鍵を行なうほうが運指が容易であることを考慮し、それ以外の場合にS3306の処理で動作コストを加算させるようにしたものである。なお、この定数sc_blk2の値は、この場合について設定されている動作コストである。
【0277】
S3305の判定結果がYesのとき、若しくはS3306の処理を終えた後には今回の黒鍵評価処理を終了して変数score の現在の値を図35の処理へ返す。
以上までの処理が黒鍵評価処理である。
【0278】
次に、図35のS3104において実行される手の移動評価処理について説明する。手の移動評価処理は、まず、割り当ての対象であるノートオンイベントが属しているものの直前のブロックについて割り当てた運指における手の位置を基準とし、割り当ての対象であるノートオンイベントに対応する鍵を評価対象である指によって押鍵するときに発生する手の移動距離の長短に基づいて動作コストを課す処理である。
【0279】
手の移動評価処理の処理内容を図40にフローチャートで示す。
なお、これ以降の説明及び図面では、変数 sc と変数 score とが混在しているが、すべてを変数 score と読み替えるものとする。
まず、S3401において、この手の移動評価処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、前述した音符情報取得処理の結果として得られている、今回の割り当ての対象であるノートオンイベントの音符情報が変数notetypeに代入され、割り当ての対象であるノートオンイベントが属しているものの直前のブロックについて割り当てられた運指における手の位置を示す値が変数posoldに代入され、動作コストの累計のために用いられる変数scには0が代入される。
【0280】
S3402では、変数notetypeの値が、単音符若しくはその割り当ての対象であるノートオンイベントが属しているブロックの最後の音符であることを示しているか否か、すなわち、0若しくは1であるか否かが判定され、判定結果がYesならばS3403に進み、Noならば今回の手の移動評価処理を終了して変数scの値を図35の処理へ返す。
【0281】
S3403では、手の位置の取得処理が実行され、その実行結果として得られる手の位置を示す値が変数pos に代入される。手の位置の取得処理は、評価対象の指で押鍵を行なうためには最適である手の位置を推定する処理であり、その処理の詳細は後述する。
【0282】
S3404では、変数pos の値と変数posoldの値とが一致するか否か、すなわち、手の移動が発生しないか否かが判定され、判定結果がYesならば今回の手の移動評価処理を終了して変数scの値を図35の処理へ返す。一方、この判定結果がNoならばS3405に進む。
【0283】
S3405では、変数pos の値と変数posoldの値との差の絶対値が計算され、その計算結果が3よりも小さいか否かが判定される。そして、この判定結果がYesならば、S3406において、変数scの値に定数sc_move0 の値が加算された結果の値が改めて変数scに代入され、その後、処理がS3408へと進む。一方、S3405の判定処理の結果がNoならば、S3407において、変数scの値に定数sc_move1 の値が加算された結果の値が改めて変数scに代入される。ここで、定数sc_move0 及びsc_move1 はいずれも動作コストであり、sc_move1 にはsc_move0 よりも大きな動作コストが設定される。
【0284】
S3408では、変数pos の値と変数posoldの値との差の絶対値に定数sc_dis を乗じた値が変数scの値に加算され、その結果の値が改めて変数scに代入される。この処理は手の移動距離に比例する動作コストを更に課す処理であり、定数sc_dis はこのときの比例定数である。
【0285】
S3408の処理を終えた後には今回の手の移動評価処理が終了し、変数scの値を図35の処理へ返す。
以上までの処理が手の移動評価処理である。
次に、上述した手の移動評価処理のS3403において実行される、手の位置の取得処理について説明する。手の位置の取得処理の処理内容を図41にフローチャートで示す。
【0286】
まず、S3431において、手の範囲取得処理が実行され、その実行結果として得られる、各指による現在の押鍵状態に基づく手の存在し得る範囲について、その左端の位置を示す値が変数leftlimlt に代入され、その右端の位置を示す値が変数rightlimitに代入される。この範囲取得処理の詳細は後述する。なお、本実施の形態において、鍵盤上における手の位置とは、その手の中指の位置で代表するものとする。
【0287】
続いてS3432では、この手の位置の取得処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、上述した変数leftlimit の値が変数pos に代入され、定数MAX _SCORE の値が変数min に代入され、変数bestpos 及びbestpos2には「NODATA」が代入される。ここで、定数MAX _SCORE には、後述する手位置評価点算出処理の実行結果として得られる評価点の最大値よりも大きな値を予め設定しておく。更に、変数fignote[0]〜fignote[4]には各指の現在の押鍵・離鍵の状態が代入される。なお、この変数には、押鍵状態を示すときにはその押鍵されている鍵の番号が代入され、離鍵状態を示すときには「NODATA」が代入される。
【0288】
S3433では、変数pos の値が変数rightlimitの値以下であるか否かが判定され、判定結果がYesならばS3435に進み、NoならばS3434に進む。この変数pos は手の位置を示すものであり、後述するS3441の処理によって1ずつ増加することによってleftlimit からrightlimitまで変化する。以下の処理では、この変数pos の値で示される位置における手の位置の適切さの評価が後述する処理によってなされる。
【0289】
S3434では、変数bestpos の値と変数bestpos2の値との加算平均が計算され、この計算結果が改めて変数bestpos に代入される。この処理を終えた後には今回の手の位置の取得処理が終了し、変数bestpos の値を図40の処理へ返す。
S3435では、変数fig に0が代入される。
【0290】
S3436では、変数fig の値が手の指の本数(すなわち5)を示す前述した定数MAX _FINGERよりも小さいか否かが判定され、判定結果がYesならばS3442に、NoならばS3437に、それぞれ進む。
S3437では、変数min の値が変数score の値よりも大きいか否かが判定される。この判定結果がYesならばS3438に進み、変数score の値が変数min に代入されると共に、変数pos の値が変数bestpos 及びbestpos2の両者に代入され、その後は処理がS3440に進む。一方、S3437の判定結果がNoならばS3439に進む。
【0291】
S3439では、変数min の値と変数score の値とが一致するか否かが判定され、判定結果がYesのときにのみ、S3440において変数pos の値が変数bestpos2のみに代入される。
以上のS3434、及びS3437からS3440にかけての処理は、手の位置の適切さの評価点が最も良好であった位置が複数存在した場合に、それらの中間の位置を最も適切な位置として得られるようにすりためのものである。
【0292】
S3441では、変数pos の値に1を加算した結果の値が改めて変数pos に代入され、その後はS3433へ処理が戻り、上述した処理が繰り返される。
S3442では、変数fignote[fig]の値が「NODATA」であるか否かが判定され、判定結果がYesならばS3449に、NoならばS3443に、それぞれ進む。
【0293】
S3443では、変数fig の値が2よりも小さいか否か、すなわち、評価対象の指が親指若しくは示指であるか否かが判定され、判定結果がYesならば、S3444において変数pos の値から前述した定数kpos[fignote[fig]]の値を減じた結果の値が変数spanに代入された後にS3446へと処理を進め、判定結果がNoならば、S3445において定数kpos[fignote[fig]]の値から変数pos の値を減じた結果の値が変数spanに代入される。この変数spanの値は、押鍵している指と手の位置との間の距離を示している。
【0294】
S3446では、前述した変数HandTypeが「LEFTHAND」であるか否か、すなわち運指の生成を行なう手が左手であるか否かが判定され、この判定結果がYesのときにのみ、S3447において、変数spanの値の符号が反転(−1が乗算)され、得られた値が改めて変数spanに代入される。この処理によって、左手についての運指の生成であっても変数spanの値が負でなくなる。
【0295】
S3448では、手位置評価点算出処理が実行され、その実行結果として得られる値が変数score に代入される。手位置評価点算出処理は、現在の手の位置を固定したときに、割り当てられた指による押鍵の難度を評価する処理であり、その処理の詳細は後述する。
【0296】
S3449では、変数fig の値を1だけ増加させ、その後はS3436へ戻って上述した処理が繰り返される。
以上までの処理が手の位置の取得処理である。
次に、上述した手の位置の取得処理のS3431において実行される、手の範囲取得処理について説明する。手の範囲取得処理の処理内容を図42にフローチャートで示す。
【0297】
まず、S3461において、この手の位置の取得処理において使用される各種の変数の初期値を代入する処理が実行される。具体的には、前述した変数leftlimit には、鍵盤の左端の位置を示す数値0が代入され、変数rightlimitには、鍵盤の右端の位置を示す定数MAX _RANGE の値が代入される。また、変数fig には0が代入され、変数fignote[0]〜fignote[4]には各指の現在の押鍵・離鍵の状態が前述した他の処理におけるものと同様に代入される。
【0298】
S3462では、変数fig の値が手の指の本数を示す前述した定数MAX _FINGERの値(5)よりも小さいか否かが判定され、判定結果がYesならばS3463に進み、Noならば今回の手の範囲の取得処理が終了し、変数leftlimit 及びrifhtlimitの値を図41の処理へ返す。
【0299】
S3463では、変数fignote[fig]の値が「NODATA」であるか否か、すなわち、変数fig で示される指の現在の状態が離鍵状態にあるか否かが判定され、この判定結果がYesならばS3472に進み、NoならばS3464に進む。
【0300】
S3464では、変数fig の値が2よりも小さいか否か、すなわち、評価対象の指が親指若しくは示指であるか否かが判定され、判定結果がYesならばS3465において変数table に1が代入された後にS3467に進み、判定結果がNoならばS3466において変数table に0が代入される。
【0301】
S3467では、前述した定数kpos[fignote[fig]]の値に定数handrange[HandType][table][spantableno2[fig]][min]の値を加算した結果の値が変数leftに代入され、定数kpos[fignote[fig]]の値に定数handrange[HandType][table][spantableno2[fig]][max]の値を加算した結果の値が変数right に代入される。
【0302】
ここで図43について説明する。同図は、手の範囲の取得処理において参照されるテーブルの例を示している。同図において、(b)はhandrange[][][][] のテーブル例であり、このテーブルの値は、元々は、 「指の組み合わせ」欄に番号で示されている2本の指で押鍵することの可能な鍵の範囲を、手の位置(すなわち、中指の位置)を基準としたときの相対位置で示したものである。具体的に説明すると、例えば、右手の親指(指番号0)と示指(指番号1)との2本の指で押鍵することの可能な鍵の範囲は、同図の右手のfig>=2の行を参照すると、右手の位置(中指の位置)を基準として、半鍵盤単位で−4から+8の範囲の鍵の押鍵が可能であることを示している。
【0303】
手の範囲の取得処理においては、このようにして得られた押鍵可能範囲のテーブルを流用し、ある指が押鍵状態にあるときにおける手の存在可能範囲をこの表に基づいて得るようにしている。この流用を可能とするために設けられたテーブルが図43(a)のspantableno2[]である。
【0304】
例を挙げて説明する。例えば、押鍵中の指が右手薬指(指番号3)であるときには、同図(a)のspantableno2[]の値は7となる。この値に対応するhandrange[][][][] の値を同図(b)から求めるには、指の組み合わせが「2−3」の列を参照することとなり、[min] の値が1、[max] の値が5となる。
【0305】
なお、図43(b)のhandrange[][][][] のテーブルは、本来は別の用途で作成したものをここでは流用するようにしたために、この手の範囲の取得処理で実際に使用されるデータは、同図で網掛けが施されていないセルのデータのみである。
【0306】
図42の説明へ戻る。
S3468では、変数leftの値が変数leftlimit の値よりも大きいか否かが判定され、判定結果がYesのときにのみ、S3469において変数leftの値が変数leftlimit に代入される。
【0307】
S3470では、変数right の値が変数rightlimitの値よりも大きいか否かが判定され、判定結果がYesのときにのみ、S3471において変数right の値が変数rightlimitに代入される。
S3472では、変数fig の値を1だけ増加させ、その後はS3462へ戻って上述した処理が繰り返される。
【0308】
以上までの処理が手の範囲の取得処理である。
次に、上述した手の位置の取得処理のS3448(図41)において実行される、手位置評価点算出処理について説明する。手位置評価点算出処理の処理内容を図44にフローチャートで示す。
【0309】
まず、S3481において、図41のS3447までの処理によって設定されている変数fig 及び変数spanの値がそのまま引き継がれ、更に変数score に初期値0が代入される。
S3482では、図43(a)に示したテーブルがここでも再び参照され、定数spantableno2[fig] の値が変数table に代入される。
【0310】
以降のS3483からS3487にかけての処理は、前述した指の開き評価処理(図36)のS3212からS3216にかけての処理と同様であり、その説明は省略する。つまり、S3482の処理に基づいて変数table の値が設定されることによって、押鍵する指の割り当てによって発生する現在の位置からの手の移動距離に基づく動作コストを算出する処理が、指の開きの大きさを動作コストとして算出する処理を流用して行なえるようになるのである。
【0311】
以上までの処理が手位置評価点算出処理である。
次に、図35のS3105において実行される押鍵時間評価処理について説明する。押鍵時間評価処理は、押鍵の割り当て対象の指について、その指が直前に離鍵状態に移行してからの経過時間を調べ、この経過時間が所定のものよりも短い場合には押鍵操作が困難であるとみなして動作コストを課すが、その指による直前の押鍵時の押鍵時間が十分短い(短い発音時間の音符についての発音である)場合には、所定の動作コストを課す条件を緩和するものである。
【0312】
押鍵時間評価処理の処理内容を図45にフローチャートで示す。
まず、S3501では、図35のS3104までの処理によって設定されている変数fig の値がそのまま引き継がれる。そして、変数scに初期値0が代入され、また、変数costtimeには、上述した所定の経過時間を示す定数OnCostTimeが代入される。更に、変数fig の値で示される指が押鍵操作を割り当てられていた直前のノートオンイベントの押鍵時間の長さが変数lengthに代入され、そのノートオンイベントに対応するノートオフイベントの発生時刻(演奏開始後の経過時間)が変数foff[fig] に代入される。
【0313】
S3502では、変数costtimeの値が変数lengthの値よりも大きいか否かが判定され、判定結果がYesのときにのみ、S3503において変数lengthの値が変数costtimeに代入される。
S3504では、前述した変数tktimeから変数foff[fig] の値を減じた結果の値(すなわち上述した離鍵後の経過時間)が変数costtimeの値よりも小さいか否かが判定され、判定結果がYesのときにのみ、S3505において前述した所定の動作コストが設定されている定数sc_oncostの値が変数scに代入される。
【0314】
以上の処理を終えた後には今回の押鍵時間評価処理が終了し、変数scの値を図35の処理へ返す。
以上までの処理が押鍵時間評価処理である。
次に、図35のS3106において実行される連続打鍵評価処理について説明する。連続打鍵評価処理は、割り当ての対象であるノートオンイベントが属するブロックのひとつ前のブロックにおける押鍵操作に割り当てられている指に対し、その指を続けて使用する(可能性が高い)場合には動作コストを課す処理である。
【0315】
連続打鍵評価処理の処理内容を図46にフローチャートで示す。
まず、S3601では、図35のS3105までの処理によって設定されている変数fig の値がそのまま引き継がれ、変数scには初期値0が代入される。また、変数fnoteold[fig] には、割り当ての対象であるノートオンイベントが属するブロックのひとつ前のブロックにおいて、変数fig の値で示される指が押鍵操作を行っていたか否かを示す値が代入される。ここで、変数fig の値で示される指が押鍵操作を行っていなかったときには、変数fnoteold[fig] には「NODATA」が代入される。
【0316】
S3602では、変数fnotedata[fig]の値が「NODATA」以外の値であるか否かが判定され、この判定結果がYesのときにのみS3603において前述した所定の動作コストが設定されている定数sc_renzoku の値が変数scに代入される。
【0317】
以上の処理を終えた後には今回の連続打鍵評価処理が終了し、変数scの値を図35の処理へ返す。
以上までの処理が連続打鍵評価処理である。
次に、図35のS3107において実行される指潜り評価処理について説明する。指潜り評価処理は、指潜りの運指に対して動作コストを課す処理である。
【0318】
指潜り評価処理の処理内容を図47にフローチャートで示す。
まず、S3701では、図35のS3106までの処理によって設定されている変数fig の値がそのまま引き継がれ、変数scには初期値0が代入される。
また、変数fnote[0]〜fnote[4]には、変数fig で示される指で評価対象のノートオンイベントについての押鍵操作を行なったときの各指の押鍵状態が代入される fnote[fig] は押鍵状態とみなす)。なお、この変数には、押鍵状態を示すときにはその押鍵されている鍵の番号が代入され、離鍵状態を示すときには「NODATA」が代入される。但し、この指潜り評価処理においては、ノートオフのイベントに対応して離鍵操作を行なってから所定の時間は押鍵状態が継続しているものとして取り扱うようにする。これは、ある指で離鍵操作を行なったとしても、その後のある程度の時間以内に指示されるノートオンイベントについては指潜りを伴う押鍵操作が避けられない場合があるからである。
【0319】
更に、変数blk0及びblk1には初期値0が代入され、変数f には初期値1が代入される。
S3702では、変数fnote[0]の値が「NODATA」であるか否か、すなわち、親指が離鍵状態にあるか否かが判定され、この判定結果がYes、すなわち親指が離鍵状態にあるならば、指潜りの発生はないので、このまま今回の指潜り評価処理が終了し、変数scの値を図35の処理へ返す。
【0320】
S3703では変数f の値が手の指の本数(すなわち5)を示す前述した定数MAX _FINGERよりも小さいか否かが判定され、判定結果がYesならば処理をS3703に進める。一方、この判定結果がNoならば今回の指潜り評価処理が終了し、変数scの値を図35の処理へ返す。
【0321】
S3704では変数fnote[f]の値が「NODATA」であるか否かが判定され、判定結果がYesならばS3712に進み、NoならばS3705に進む。
以上のS3702及びS3704の処理によって、変数fnote[0]及びfnote[f]の値がいずれも「NODATA」ではない状態、すなわち親指と変数f で示される指との両者が共に押鍵状態にあるときにS3705以降の処理が実行される。
【0322】
S3705では変数fig の値が0又は変数f の値であるか否かが判定され、判定結果がYesならばS3706に進み、NoならばS3712に進む。
S3706では、前述した変数HandTypeが「RIGHTHAND」であって且つ変数fnote[0]の値が変数fnote[f]の値よりも大きい、若しくは、前述した変数HandTypeが「LEFTHAND」であって且つ変数fnote[0]の値が変数fnote[f]の値よりも小さいか否か、すなわち、親指と変数f で示される指とによる押鍵で指潜りが発生するか否か判定され、判定結果がYesならばS3707に進み、NoならばS3712に進む。
【0323】
S3707では、変数fnote[0]で示される、親指によって押鍵されている鍵が黒鍵であるか否かが判定され、この判定結果がYesのときにのみS3708において変数blk0に1が代入される。
S3709では、変数fnote[f]で示される、変数f で示される指によって押鍵されている鍵が黒鍵であるか否かが判定され、この判定結果がYesのときにのみS3710において変数blk1に1が代入される。
【0324】
S3711では、変数scの値に定数sc_passtype[blk0][blk1]の値と定数sc_passの値とが加算され、その加算結果が改めて変数scに代入される。なお、定数sc_passは、指潜りの運指に対して課される動作コストであり、指潜りの運指を生じさせ難くするためのものである。
【0325】
ここで図48について説明する。同図は、この指潜り評価処理において参照される上述した定数sc_passtype[][]のテーブル例を示している。指潜りの運指では、押鍵に使用する指と押鍵される鍵の配置(黒鍵・白鍵の配置の違い)との関係によって指潜りの難度が異なってくる。このテーブルは、この難度に対応した動作コストを提供するものである。
【0326】
図47の説明へ戻る。S3712では変数f の値を1だけ増加させ、その後はS3703へ戻って上述した処理が繰り返される。
以上までの処理が指潜り評価処理である。
次に、図35のS3108において実行されるフレーズデータ比較評価処理について説明する。フレーズデータ比較評価処理は、前述したフレーズチェック処理(図25)においてフレーズに基づく運指の割り当てが提供されているときには、その割り当てられたものを除く他の指に所定の動作コストを課す処理である。
【0327】
フレーズデータ比較評価処理の処理内容を図49にフローチャートで示す。
まず、S3801では、図35のS3107までの処理によって設定されている変数fig の値がそのまま引き継がれ、変数scには初期値0が代入される。また、変数peには、評価対象のノートオンイベントが格納されているRAM17の格納アドレスが代入される。
【0328】
S3802では、変数fig[pe] の値と変数fig の値とが一致するか否か、すなわち、ポインタpeの指すイベントデータに設定されているノートオンイベントの対象である鍵を押鍵する、フレーズに基づいて割り当てられた指(図25のS1116の処理参照)が、変数fig の値で示される指と一致しているか否かが判定され、この判定結果がNoのときにのみ、S3803において、上述した所定の動作コストが値として設定されている定数sc_phraseの値が変数scの値に加算され、その結果の値が改めて変数scに代入される。
【0329】
以上の処理を終えた後には、今回のフレーズデータ評価処理が終了し、変数scの値を図35の処理へ返す。
以上までの処理がフレーズデータ比較評価処理である。
次に、図33のS3016において実行される先行音符評価処理について説明する。先行音符評価処理は、現在の評価対象となっているノートオンのイベントデータに変数fig で示される指を割り当てた場合に、それに続くイベントデータに対して同様の手法により指の割り当てを行なったときにおけるその指の評価点(動作コスト)を求める処理である。
【0330】
先行音符評価処理の処理内容を図50にフローチャートで示す。同図に示すフローチャートを図28のフローチャートと比較すると分かるように、この先行音符評価処理は第二運指情報生成処理と基本的には同様の動作コストを算出する処理を、評価対象のイベントデータに続く次のノートオンのイベントデータについて行ない、得られた動作コストを図33の処理へ返すものである。
【0331】
図50において、まず、S4001では、図28のS2001と同様の初期設定処理が行なわれる。なお、先行音符評価処理においてその値が操作される各種の変数は、いずれも、第二運指情報生成処理における同一名称の変数の値には影響を及ぼさないものとする。
【0332】
S4002では、図28のS2001と同様のフレーズ終端判定処理が実行される。
S4003では、後述するS4015の処理によってポインタpeの値を進めた回数が、図28のS2010の処理において設定される変数sakiyomiの値を超えたか否かが判定され、判定結果がYesのときにみ今回の先行音符評価処理が終了し、値0を図33の処理へ返す。
【0333】
S4004では、ポインタpeの指すイベントデータがデータの終了を示すものであるか否かが判定され、判定結果がYesのときにのみ今回の先行音符評価処理が終了し、値0を図33の処理へ返す。
以降、S4005からS4011にかけての処理は、図28のS2003からS2004及びS2007からS2011にかけてと全く同様の処理であり、各指についての評価結果の中で最良(すなわち最小)の動作コストの値が今回の先行音符評価処理の結果として図33の処理に返される。
【0334】
また、S4012からS4015にかけての処理も図28のS2005、S2006、S2016、S2017の各処理と全く同様のものであり、S4015の処理の後にはS4003へと処理が戻り、上述した処理が繰り返される。
以上までの処理が先行音符評価処理である。
【0335】
次に図51について説明する。同図は、前述した第二運指情報生成処理(図28)のS2014において実行される条件変更処理で行なわれる各種条件の微調整の手法のひとつである、曲データのクオンタイズの例を説明する図である。同図において、クオンタイズ前の元の曲データの例を(1−a)や(2−a)に示し、これらに対してクオンタイズを施した後の曲データを(1−b)及び(2−b)に示す。
【0336】
(1−a)から(1−b)へのクオンタイズ例では、所定時間よりも短い発音時間の重なりについては、ノートオフの時刻を前倒しにして発音時間の重なりを減らすことによって運指の難度を低下させるようにしている。
(2−a)から(2−b)へのクオンタイズ例では、上述したものと同様の手法ではあるが、発音時間の重なりがある程度以上に長い場合には、ノートオフの時刻の変更を行なわないようにするものである。
【0337】
前述した条件変更処理においては、このような曲データのクオンタイズを行なうことによって、曲データにより運指情報が生成不能となる問題を回避する。
運指情報生成処理の第二実施例では以上のように構成することによって運指情報の生成が行なわれる。
【0338】
なお、図4、図6から図22まで、図24、図25、図28、図30、図33、図35、図36、図38、図40から図42まで、図44から図47まで、図49、及び図50に示したCPU15が実行するこれらの処理をコンピュータに行なわせる運指情報生成プログラムを作成してコンピュータで読み取り可能な記憶媒体に記憶させ、そのプログラムを記憶媒体からコンピュータに読み出させて実行させることにより、運指情報を生成する制御をコンピュータに行なわせることも可能である。
【0339】
図52に運指情報生成プログラムを記憶するコンピュータ読み取り可能な記憶媒体の例を示す。同図に示すように、記憶媒体としては、例えば、コンピュータ21に内蔵若しくは外付けの付属装置として備えられるROMやハードディスク装置などの記憶装置22、フロッピーディスク、MO(光磁気ディスク)、CD−ROM、DVD−ROMなどといった携帯可能な記憶媒体23、等が利用できる。
【0340】
また、記憶媒体はネットワーク24を介してコンピュータ21と接続されるコンピュータであるプログラムサーバ25が備える記憶装置26であってもよい。この場合には、制御プログラムを表現するデータ信号で搬送波を変調して得られる伝送信号を、プログラムサーバ25から伝送媒体であるネットワーク24を通じて伝送し、コンピュータ21では受信した伝送信号を復調して制御プログラムを再生することで当該制御プログラムの実行が可能となる。
【0341】
【発明の効果】
以上詳細に説明したように、本発明は、楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成するときに、その演奏に関する情報である演奏情報を取得し、その演奏情報で示されている演奏の指示のうち、その指示に応じた運指が可能であるか否かの判定を行ない、その判定の結果に基づいて演奏情報の修正を行ない、そして、その運指を、その修正がなされた演奏情報に応じて生成するようにすることにより、指による演奏操作をそのまま忠実に行なうことが不可能な演奏情報でも、運指を生成することができるようになる。
【0342】
あるいは、本発明は、楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成するときに、その演奏に関する情報である演奏情報を取得し、各指について、その演奏情報で示されている楽音の発音指示に応じた楽器の操作をその指で行なうことが可能であり、その操作にその指を割り当てることができるか否かの判断を行ない、その操作に割り当てることができると判断された指の中からその操作に割り当てる1つの指を選択するときの選択の優先度を、各指に対して与え、その判断の結果及びその優先度に基づいて、その操作に割り当てる1つの指を、楽曲の先頭から順次1楽音ごとに確定していくようにすることにより、より適切な運指を生成することができる。
【0343】
以上のように、本発明のいずれの構成によっても、楽曲の演奏情報から楽器で該楽曲を演奏するための運指を生成することができるという効果を奏する。
【図面の簡単な説明】
【図1】本発明の第一の態様の原理構成を示す図である。
【図2】本発明の第二の態様の原理構成を示す図である。
【図3】本発明を実施する運指情報生成装置の全体構成を示す図である。
【図4】図3に示す運指情報生成装置全体の制御処理の処理内容を示すフローチャートである。
【図5】曲データのデータ構造を示す図である。
【図6】曲データ修正処理の処理内容を示すフローチャートである。
【図7】第一ノートオン処理の処理内容を示すフローチャートである。
【図8】第一ノートオフ処理の処理内容を示すフローチャートである。
【図9】第二ノートオン処理の処理内容を示すフローチャートである。
【図10】第二ノートオフ処理の処理内容を示すフローチャートである。
【図11】運指情報生成処理の処理内容を示すフローチャートである。
【図12】第一指割当判断処理の処理内容を示すフローチャートである。
【図13】第二指割当判断処理の処理内容を示すフローチャートである。
【図14】指f0がmaxnote に届くか否かの判定処理の処理内容を示すフローチャートである。
【図15】指f0がminnote に届くか否かの判定処理の処理内容を示すフローチャートである。
【図16】第三指割当判断処理の処理内容を示すフローチャートである。
【図17】第四指割当判断処理の処理内容を示すフローチャートである。
【図18】第五指割当判断処理の処理内容を示すフローチャートである。
【図19】第一優先値付加処理の処理内容を示すフローチャートである。
【図20】第二優先値付加処理の処理内容を示すフローチャートである。
【図21】第三優先値付加処理の処理内容を示すフローチャートである。
【図22】第四優先値付加処理の処理内容を示すフローチャートである。
【図23】第二実施例で行なわれる処理の概要を示す図である。
【図24】第二実施例における、図3に示す運指情報生成装置全体の制御処理の処理内容を示すフローチャートである。
【図25】フレーズチェック処理の処理内容を示すフローチャートである。
【図26】フレーズデータベースのデータ例を示す図(その1)である
【図27】フレーズデータベースのデータ例を示す図(その2)である
【図28】第二運指情報生成処理の処理内容を示すフローチャートである。
【図29】音符情報取得処理の処理内容を説明する図である。
【図30】フレーズ判定処理の処理内容を示すフローチャートである。
【図31】指潜りフレーズ判定の原理を説明する図である。
【図32】使用可能指の検索テーブルを示す図である。
【図33】割当指評価処理の処理内容を示すフローチャートである。
【図34】フレーズ先頭評価処理の処理内容を説明する図である。
【図35】コスト取得処理の処理内容を示すフローチャートである。
【図36】指の開き評価処理の処理内容を示すフローチャートである。
【図37】指の開き評価処理において参照されるテーブルの例を示す図である。
【図38】黒鍵評価処理の処理内容を示すフローチャートである。
【図39】ブロックの概念を説明する図である。
【図40】手の移動評価処理の処理内容を示すフローチャートである。
【図41】手の位置の取得処理の処理内容を示すフローチャートである。
【図42】手の範囲の取得処理の処理内容を示すフローチャートである。
【図43】手の範囲の取得処理において参照されるテーブルの例を示す図である。
【図44】手位置評価点算出処理の処理内容を示すフローチャートである。
【図45】押鍵時間評価処理の処理内容を示すフローチャートである。
【図46】連続打鍵評価処理の処理内容を示すフローチャートである。
【図47】指潜り評価処理の処理内容を示すフローチャートである。
【図48】指潜り評価処理において参照されるテーブルの例を示す図である。
【図49】フレーズデータ比較評価処理の処理内容を示すフローチャートである。
【図50】先行音符評価処理の処理内容を示すフローチャートである。
【図51】曲データのクオンタイズの例を示す図である。
【図52】運指情報生成プログラムを記憶するコンピュータで読み取り可能な記憶媒体の例を示す図である。
【符号の説明】
1 演奏情報取得手段
2 運指可能性判定手段
3 演奏情報修正手段
4 運指情報生成手段
5 指割当判断手段
6 優先値付与手段
7 指割当確定手段
11 表示部
12 操作部
13 音源
14 サウンドシステム
15 CPU
16 ROM
17 RAM
18 データ入力部
19 バス
21 コンピュータ
22 記憶装置
23 携帯可能記憶媒体
24 ネットワーク
25 プログラムサーバ
26 記憶装置
51 SMF(スタンダードMIDIファイル)
52 曲データ修正処理
53 使用可能な指の導出処理
54 手サイズデータ・鍵盤サイズデータ
55 手・指の動作コスト
56 コストの算出処理
57 フレーズデータベース

Claims (26)

  1. 楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する運指情報生成装置であって、
    前記演奏に関する情報である演奏情報を取得する演奏情報取得手段と、
    前記演奏情報で示されている前記演奏の指示のうち、該指示に応じた運指が可能であるか否かの判定を行なう運指可能性判定手段と、
    前記判定の結果に基づいて前記演奏情報の修正を行なう演奏情報修正手段と、
    前記運指を、前記修正がなされた演奏情報に応じて生成する運指情報生成手段と、
    を有することを特徴とする運指情報生成装置。
  2. 前記運指可能性判定手段は、前記演奏の指示のうち、前記楽器を操作する指の本数を超える数の異なる音高の楽音が同時に発音中となる状態を生じさせた指示に応じた運指を不可能であると判定することを特徴とする請求項1に記載の運指情報生成装置。
  3. 前記演奏情報修正手段は、前記同時発音中となる楽音のうち、最も早くに消音させる指示が前記演奏情報に示されているものについて、前記同時発音中となる楽音のうちで最も遅くに発音開始される楽音の発音開始時刻よりも早くにその楽音を消音させる指示となるように該演奏情報の修正を行なうことを特徴とする請求項2に記載の運指情報生成装置。
  4. 前記運指可能性判定手段は、前記演奏の指示のうち、異なる音高の複数の楽音が同時に発音中となるときの前記楽器への複数の操作が所定距離よりも離れた位置での操作となる指示に応じた運指を不可能であると判定することを特徴とする請求項1に記載の運指情報生成装置。
  5. 前記演奏情報修正手段は、前記同時発音中となる楽音であって、該楽音を発音させるための前記楽器への操作の位置が最も離れている2つの楽音のうち、先に消音させる指示が前記演奏情報に示されているものについて、後に発音開始される楽音の発音開始時刻よりも早くにその楽音を消音させる指示となるように該演奏情報の修正を行なうことを特徴とする請求項4に記載の運指情報生成装置。
  6. 前記運指可能性判定手段は、前記演奏の指示のうち、該指示が楽音の発音開始の指示であって、該指示に従って発音を開始するときに該楽音を消音させるための操作の途中の状態であるときには、該指示に応じた運指を不可能であると判定することを特徴とする請求項1に記載の運指情報生成装置。
  7. 前記演奏情報修正手段は、前記楽音の発音の開始の指示における発音開始の時よりも所定時間以上早くに、前記消音操作を完了させる指示となるように前記演奏情報の修正を行なうことを特徴とする請求項に記載の運指情報生成装置。
  8. 楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する運指情報生成装置であって、
    前記演奏に関する情報である演奏情報を取得する演奏情報取得手段と、
    各指について、前記演奏情報で示されている楽音の発音指示に応じた前記楽器の操作を該指で行なうことが可能であり、該操作に該指を割り当てることができるか否かの判断を行なう指割当判断手段と、
    前記操作に割り当てることができると判断された指の中から該操作に割り当てる1つの指を選択するときの優先度を、各指に対して与える優先値付与手段と、
    前記判断の結果及び前記優先度に基づいて、前記操作に割り当てる1つの指を、楽曲の先頭から順次1楽音ごとに確定していく指割当確定手段と、
    を有することを特徴とする運指情報生成装置。
  9. 前記指割当判断手段は、前記演奏情報で示されている楽音の発音指示に応じた操作のための指の割り当てが、該発音の開始のときに既に前記楽器の操作を行なっている指の位置関係に基づいて行なえるか否かの判定の結果に従って、前記判断を行なうことを特徴とする請求項に記載の運指情報生成装置。
  10. 前記指割当判断手段は、前記各指の中から前記演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合に、該楽音の発音の継続が指示されている期間内における別の楽音の発音の指示に応じた操作のための指の割り当てが、該別の楽音の発音のときに既に前記楽器の操作を行なっている指の位置関係に基づいて行なえるか否かの判定の結果に従って、前記判断を行なうことを特徴とする請求項に記載の運指情報生成装置。
  11. 前記指割当判断手段は、前記各指の中から前記演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合に、該楽音の発音の継続が指示されている期間内における別の楽音の発音指示に応じた操作のために割り当てを要する指の割当必要本数であって、該仮に割り当てた指の左側若しくは右側の各々の指についての該割当必要本数が、該仮に割り当てた指の左側若しくは右側の各々の指の本数に基づいて足りるか否かを判定した判定結果に従って、前記判断を行なうことを特徴とする請求項に記載の運指情報生成装置。
  12. 前記指割当判断手段は、前記各指の中から前記演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合であって、該楽音の発音の開始が指示されているときには既に別の楽音の発音指示に応じた操作に他の指が割り当てられている場合に、これら両者の楽音を同時発音させる指示がなされている期間内における更なる別の楽音の発音指示に応じた操作のために割り当てを要する指の割当必要本数であって、前記両者の楽音の発音指示に応じた操作に割り当てられている2本の指の間の指についての該割当必要本数が、該2本の指の間の指の本数に基づいて足りるか否かを判定した判定結果に従って、前記判断を行なうことを特徴とする請求項に記載の運指情報生成装置。
  13. 前記指割当判断手段は、前記各指の中から前記演奏情報で示されている楽音の発音指示に対応する操作を行なう指を仮に割り当てた場合に、該演奏情報で示されている該楽音の発音指示に続く次の楽音の発音指示に対応する操作に割り当てることのできる指が存在するか否かの判定の結果に従って、前記判断を行なうことを特徴とする請求項に記載の運指情報生成装置。
  14. 前記優先値付与手段は、前記操作を行なうために要する指の移動の距離が長い指ほど低い優先度を与えることを特徴とする請求項に記載の運指情報生成装置。
  15. 前記優先値付与手段は、前記操作を行なうために要する手の移動の距離が短い指ほど高い優先度を与えることを特徴とする請求項に記載の運指情報生成装置。
  16. 前記優先値付与手段は、前記演奏情報で示されている楽音の発音指示に対応する操作を行なう指が、該楽音の直前の楽音の発音指示に対応する操作に割り当てられており、且つ、この両者の楽音の音高が異なる場合には、該指の優先度を低下させることを特徴とする請求項に記載の運指情報生成装置。
  17. 所定の音高差を有する楽音列からなるフレーズを示すフレーズデータと、該フレーズの演奏を前記楽器で行なうとき運指を示す情報であるフレーズ運指情報とが対応付けられて格納されているフレーズデータ格納手段を更に有し、
    前記優先値付与手段は、前記フレーズデータで示されているフレーズが前記楽曲を構成する楽音列に含まれているときには、該フレーズデータに対応付けられて前記フレーズデータ格納手段に格納されているフレーズ運指情報に示されている指が前記操作に割り当てる指として選択され易くなるように前記優先度を与える、
    ことを特徴とする請求項に記載の運指情報生成装置。
  18. 前記優先値付与手段は、前記優先度を与える対象の指を前記操作に割り当てると該操作のために指を開く動作が発生するときには、該動作における指の開きの大きさに基づいて優先度を与えることを特徴とする請求項に記載の運指情報生成装置。
  19. 前記楽器は、鍵盤楽器であり、
    前記優先値付与手段は、前記鍵盤楽器の黒鍵の操作の割り当ての選択において親指及び小指に対して与える前記優先度を低くする、
    ことを特徴とする請求項に記載の運指情報生成装置。
  20. 前記優先値付与手段は、前記優先度を与える対象の指割り当てた前記楽器の直前の操作を終えてから所定時間が経過していない場合には優先度を低くすることを特徴とする請求項に記載の運指情報生成装置。
  21. 前記優先値付与手段は、前記優先度を与える対象の指を前記操作に割り当てると該操作のために指潜り若しくは指跨ぎの運指が発生するときには優先度を低くすることを特徴とする請求項に記載の運指情報生成装置。
  22. 前記操作に割り当て可能な指がないときに、前記演奏情報の修正を行なう演奏情報修正手段を更に有し、
    前記指割当確定手段は、前記演奏情報修正手段により修正された演奏情報について前記指割当判断手段によって行なわれる前記判断の結果、及び該判断の結果に応じて前記優先値付与手段が与える前記優先度に基づいて、前記操作に割り当てる指を確定する、
    ことを特徴とする請求項に記載の運指情報生成装置。
  23. 楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する運指情報生成方法であって、
    前記演奏に関する情報である演奏情報を取得し、
    前記演奏情報で示されている前記演奏の指示のうち、該指示に応じた運指が可能であるか否かの判定を行ない、
    前記判定の結果に基づいて前記演奏情報の修正を行ない、
    前記運指を、前記修正がなされた演奏情報に応じて生成する、
    ことを特徴とする運指情報生成方法。
  24. 楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する運指情報生成方法であって、
    前記演奏に関する情報である演奏情報を取得し、
    各指について、前記演奏情報で示されている楽音の発音指示に応じた前記楽器の操作を該指で行なうことが可能であり、該操作に該指を割り当てることができるか否かの判断を行ない、
    前記操作に割り当てることができると判断された指の中から該操作に割り当てる1つの指を選択するときの該選択の優先度を、各指に対して与え、
    前記判断の結果及び前記優先度に基づいて、前記操作に割り当てる1つの指を、楽曲の先頭から順次1楽音ごとに確定していく
    ことを特徴とする運指情報生成方法。
  25. 楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する制御をコンピュータに行なわせる運指情報生成プログラムを記憶した該コンピュータが読み取り可能な記憶媒体であって、
    前記演奏に関する情報である演奏情報を取得する制御と、
    前記演奏情報で示されている前記演奏の指示のうち、該指示に応じた運指が可能であるか否かの判定を行なう制御と、
    前記判定の結果に基づいて前記演奏情報の修正を行なう制御と、
    前記運指を、前記修正がなされた演奏情報に応じて生成する制御と、
    をコンピュータに行なわせる運指情報生成プログラムを記憶した記憶媒体。
  26. 楽曲の演奏を楽器で行なうときの該楽器を操作する指の動きである運指を示す情報を生成する制御をコンピュータに行なわせる運指情報生成プログラムを記憶した該コンピュータが読み取り可能な記憶媒体であって、
    前記演奏に関する情報である演奏情報を取得する制御と、
    各指について、前記演奏情報で示されている楽音の発音指示に応じた前記楽器の操作を該指で行なうことが可能であり、該操作に該指を割り当てることができるか否かの判断を行なう制御と、
    前記操作に割り当てることができると判断された指の中から該操作に割り当てる1つの指を選択するときの該選択の優先度を、各指に対して与える制御と、
    前記判断の結果及び前記優先度に基づいて、前記操作に割り当てる1つの指を、楽曲の先頭から順次1楽音ごとに確定していく制御と、
    をコンピュータに行なわせる運指情報生成プログラムを記憶した記憶媒体。
JP2000338743A 2000-03-14 2000-11-07 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体 Expired - Fee Related JP4182637B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2000338743A JP4182637B2 (ja) 2000-03-14 2000-11-07 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP2000-70791 2000-03-14
JP2000070791 2000-03-14
JP2000338743A JP4182637B2 (ja) 2000-03-14 2000-11-07 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体

Publications (2)

Publication Number Publication Date
JP2001331173A JP2001331173A (ja) 2001-11-30
JP4182637B2 true JP4182637B2 (ja) 2008-11-19

Family

ID=26587462

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000338743A Expired - Fee Related JP4182637B2 (ja) 2000-03-14 2000-11-07 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体

Country Status (1)

Country Link
JP (1) JP4182637B2 (ja)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4543832B2 (ja) * 2004-08-31 2010-09-15 カシオ計算機株式会社 運指情報修正装置および運指情報修正処理プログラム
JP4529175B2 (ja) * 2004-08-31 2010-08-25 カシオ計算機株式会社 運指候補表示装置および運指候補表示処理プログラム
JP4591326B2 (ja) * 2005-11-17 2010-12-01 ヤマハ株式会社 楽譜情報検索装置、楽譜情報出力装置、楽譜情報検索システムおよびプログラム
JP4525591B2 (ja) * 2005-12-27 2010-08-18 カシオ計算機株式会社 演奏評価装置、及びプログラム
JP2007178696A (ja) * 2005-12-27 2007-07-12 Casio Comput Co Ltd 運指情報生成装置、及びプログラム
JP2007241034A (ja) * 2006-03-10 2007-09-20 Univ Of Tokyo 楽器演奏における運指決定方法及びシステム
JP4000335B1 (ja) 2006-05-19 2007-10-31 株式会社コナミデジタルエンタテインメント 音楽ゲーム用データ演算装置、音楽ゲーム用データ演算プログラム及び音楽ゲーム用データ演算方法
JP4508218B2 (ja) * 2007-07-06 2010-07-21 カシオ計算機株式会社 運指情報生成装置および運指情報生成処理プログラム
JP5071441B2 (ja) * 2009-05-29 2012-11-14 カシオ計算機株式会社 楽曲難易度評価装置および楽曲難易度評価プログラム
US8106281B2 (en) 2009-05-29 2012-01-31 Casio Computer Co., Ltd. Music difficulty level calculating apparatus and music difficulty level calculating method

Also Published As

Publication number Publication date
JP2001331173A (ja) 2001-11-30

Similar Documents

Publication Publication Date Title
JP4182637B2 (ja) 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体
US4930390A (en) Automatic musical performance apparatus having separate level data storage
JP7160068B2 (ja) 電子楽器、電子楽器の発音方法、及びプログラム
US6100462A (en) Apparatus and method for generating melody
JPH0944150A (ja) 電子鍵盤楽器
US4179972A (en) Tone wave generator in electronic musical instrument
JP3906997B2 (ja) 演奏補助装置、入力音変換装置及びそれらのプログラム
JPH0683347A (ja) 電子楽器
Kessous et al. Bimanuality in alternate musical instruments
GB2209425A (en) Music sequencer
JPH0210439B2 (ja)
JP2681570B2 (ja) 電子楽器の説明装置
JP2590725B2 (ja) 楽音データ入力装置
JP7425558B2 (ja) コード検出装置及びコード検出プログラム
JP4506147B2 (ja) 演奏再生装置及び演奏再生制御プログラム
JP2746063B2 (ja) ピッチシフト操作子を備えた電子楽器
JP3427698B2 (ja) 電子管楽器
US5412153A (en) Electronic musical instrument having independent pitch control for each key
JPH0527762A (ja) 電子楽器
US11935509B1 (en) Pitch-bending electronic musical instrument
JP4695781B2 (ja) 音響信号の符号化方法
JP2008076708A (ja) 音色指定方法、音色指定装置及び音色指定のためのコンピュータプログラム
JP2003162281A (ja) 電子管楽器
JP4221791B2 (ja) 楽音発生装置
JP3800947B2 (ja) 演奏データ処理装置及び方法並びに記憶媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20060724

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20080318

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080403

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20080812

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20080825

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110912

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120912

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130912

Year of fee payment: 5

LAPS Cancellation because of no payment of annual fees