JP4508218B2 - 運指情報生成装置および運指情報生成処理プログラム - Google Patents

運指情報生成装置および運指情報生成処理プログラム Download PDF

Info

Publication number
JP4508218B2
JP4508218B2 JP2007177851A JP2007177851A JP4508218B2 JP 4508218 B2 JP4508218 B2 JP 4508218B2 JP 2007177851 A JP2007177851 A JP 2007177851A JP 2007177851 A JP2007177851 A JP 2007177851A JP 4508218 B2 JP4508218 B2 JP 4508218B2
Authority
JP
Japan
Prior art keywords
data
hand
pointer
finger
fingering
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
JP2007177851A
Other languages
English (en)
Other versions
JP2007304617A (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 JP2007177851A priority Critical patent/JP4508218B2/ja
Publication of JP2007304617A publication Critical patent/JP2007304617A/ja
Application granted granted Critical
Publication of JP4508218B2 publication Critical patent/JP4508218B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

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

Description

本発明は、鍵盤を備えた電子楽器に用いて好適な運指情報生成装置および運指情報生成処理プログラムに関する。
鍵操作する際の指使い(運指)を演奏者に案内する運指情報を発生する装置が知られている。例えば特許文献1には、隣り合う2つの音に対して鍵盤を操作したときの指使いの容易さを表す2音運指データをそれぞれの指の組合わせに対応付けて記憶しておき、その内から曲データ(与えられたメロディの音列)に対応する2音運指データを読み出し、読み出した2音運指データの累算値を最適にする運指を決定して運指情報を発生させる装置が開示されている。
特許第2526954号明細書
ところで、上記特許文献1に開示の装置では、曲データから一義的に決る代表的な運指を発生させる為、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができない、という問題がある。
そこで本発明は、このような事情に鑑みてなされたもので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる運指情報生成装置および運指情報生成処理プログラムを提供することを目的としている。
上記目的を達成するため、請求項に記載の発明では、音高及び当該音高の鍵位置を有する音データを複数有する楽曲データから当該楽曲を演奏する際の鍵操作の切れ目を検出して、検出した切れ目で前記楽曲データを区切ることにより複数のフレーズデータに分割する楽曲分割手段と、前記楽曲分割手段により分割されたフレーズデータで指定される区間毎に、その区間に含まれる音データが有する音高の鍵位置のうち最も高い音高の鍵位置と最も低い音高の鍵位置を設定する操作範囲設定手段と、この操作範囲設定手段にて前記区間毎に設定された最も高い音高の鍵位置と最も低い音高の鍵位置と所定の手の幅の半値とに基づき、演奏すべき手の位置を鍵位置で前記区間順に設定することにより、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、前記楽曲分割手段により分割されたフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てるとともに当該割り当てられた指の位置を決める運指データを生成する運指データ生成手段と、この運指データ生成手段により前記楽曲データに含まれる音高全てに対応する運指データが生成された後、当該楽曲データに含まれる音高毎に、当該音高の鍵位置と、前記運指データにより当該各音高に割り当てられた指の位置との差分を求めるとともに、当該差分を累算する運指評価手段と、この運指評価手段により得られた累算差分値が予め設定された値以上の場合に前記手の幅の半値を変更して前記動作データ生成手段に供給して、再度累算差分値を求めるように、前記動作データ生成手段、運指データ生成手段及び運指評価手段を制御する制御手段と、を具備することを特徴とする。
請求項に記載の発明では、音高及び当該音高の鍵位置を有する音データを複数有する楽曲データから当該楽曲を演奏する際の鍵操作の切れ目を検出して、検出した切れ目で前記楽曲データを区切ることにより複数のフレーズデータに分割する楽曲分割処理と、前記分割されたフレーズデータで指定される区間毎に、その区間に含まれる音データが有する音高の鍵位置のうち最も高い音高の鍵位置と最も低い音高の鍵位置を設定する操作範囲設定処理と、この区間毎に設定された最も高い音高の鍵位置と最も低い音高の鍵位置と所定の手の幅の半値とに基づき、演奏すべき手の位置を鍵位置で前記区間順に設定することにより、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、前記分割されたフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てるとともに当該割り当てられた指の位置を決める運指データを生成する運指データ生成処理と、前記楽曲データに含まれる音高全てに対応する運指データが生成された後、当該楽曲データに含まれる音高毎に、当該音高の鍵位置と前記運指データにより当該各音高に割り当てられた指の位置との差分を求めるとともに、当該差分を累算する運指評価処理と、この累算差分値が予め設定された値以上の場合に前記手の幅の半値を変更して再度累算差分値を求めるように、前記動作データ生成処理、運指データ生成処理及び運指評価処理を制御する制御処理と、をコンピュータで実行させることを特徴とする。
請求項1、2に記載の発明によれば、曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成すると共に、楽曲データから曲演奏する手の位置を表す動作データを生成する。そして、フレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成するので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
以下、図面を参照して本発明の実施形態について説明する。
[第1実施形態]
A.構成
図1は、第1実施形態による運指情報生成装置の全体構成を示すブロック図である。運指情報生成装置は、CPU1、ROM2、RAM3、入力部4、表示部5およびMIDIインタフェース6を備える。CPU1は、後述する入力部4からの指示に従い、例えばMIDIインタフェース6を介して電子楽器7よりSMF形式の「楽曲データ」を取込んでRAM3に記憶させた後、時系列データ生成処理および音列解析処理を実行し、「楽曲データ」から「時系列データ」および「フレーズデータ」を派生させる。また、CPU1は運指データ生成処理を実行して「時系列データ」および「フレーズデータ」を参照して、曲進行に応じて移動する手の位置を考慮した、弾き易い指使いの「運指データ」を生成する。これら一連のデータの構成およびそれらが意図するところについては追って詳述する。
ROM2は、CPU1にロードされる各種制御プログラムやテーブル等を記憶する。ここで言う各種制御プログラムとは、上述の時系列データ生成処理、音列解析処理および運指データ生成処理からなるメインルーチンを含む。RAM3は、CPU1が実行するメインルーチン(時系列データ生成処理、音列解析処理および運指データ生成処理)において用いられる各種レジスタ・フラグデータの他、手の状態などを表すバッファデータを一時記憶するワーエリアと、上述した一連のデータ(楽曲データ、時系列データ、フレーズデータ、手の状態データ)を記憶するデータエリアとを備える。これらRAM3に格納される主要なデータ構成については追って説明する。
入力部4は、ユーザ操作に対応した操作イベントを発生してCPU1に供給する。具体的には、例えばMIDIインタフェース6を介して電子楽器7よりSMF形式の「楽曲データ」をRAM3に取込むよう指示するイベントをCPU1に供給したり、RAM3に格納した「楽曲データ」に基づき「運指データ」を生成させるメイルーチンの実行を指示するイベントをCPU1に供給する。表示部5は、CPU1の制御の下に、例えば楽曲データを楽譜表示すると共に、表示された楽譜において、楽曲データを構成する各音毎に対応させた運指データを表示する。
B.データ構成
次に、RAM3に格納される各種データ(オンバッファデータ、楽曲データ、時系列データ、ノートデータ、フレーズデータおよび手の状態データ)の構成について図2〜図7を参照して説明する。
(1)オンバッファデータの構成
図2は、RAM3のワークエリアに設けられるオンバッファデータOnBuf[0]〜[N]の構成を示す図である。1つのオンバッファデータOnBufは、楽曲データを再生(自動演奏)する際に、曲進行に応じて読み出される各音を表すデータであり、発音開始時間lTime、消音時間lOffTime、音高Pitch(ノート番号)、および対応する楽曲データを指定するポインタpNoteから構成される。
(2)楽曲データMidiEventの構成
図3は、RAM3のデータエリアに設けられる楽曲データの構成を示す図である。楽曲データMidiEventは曲を構成する各音を表し、曲終端にはENDデータを備える。楽曲データMidiEventは、発音開始時刻ITime、音長lGate、音高Pitchおよび次の楽曲データMidiEventを指定するポインタpNextから構成される。
(3)時系列データNoteGroupの構成
図4は、RAM3のデータエリアに設けられる時系列データの構成を示す図である。時系列データNoteGroupとは、楽曲データMidiEventの内から同時発音する音(和音あるいは非和声音)を検索し、該当する音を一まとめにしたデータである。
時系列データNoteGroupでは、同時発音する音の発音/消音タイミングおよび音高関係を表す属性として、発音開始時刻lTime、消音時刻lTerm、鍵盤座標最大値iPosMax、鍵盤座標最小値iPosmin、座標差分iTend、差分変化継続値iTendCont、差分変化継続ステップiTendStep、近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、ポインタNoteEv、ポインタnextおよびポインタprevを有する。
なお、ポインタNoteEvは、本時系列データNoteGroupに対応するノートデータNoteを指定するポインタである。ポインタnextおよびポインタprevは、それぞれ次の時系列データおよび前の時系列データを指定するポインタである。
(4)ノートデータNoteの構成
図5は、RAM3のデータエリアに設けられるノートデータの構成を示す図である。ノートデータNoteは、時系列データNoteGroupとして一まとめにされた、同時発音する各音のそれぞれに対応する楽曲データMidiEventを表すデータであり、ポインタpEvent、鍵盤座標iPos、運指番号cfig(運指データに相当)、ポインタnextおよびポインタprevから構成される。
なお、ポインタpEventは、対応する楽曲データMidiEventを指定するポインタである。ポインタnextは、次のノートデータを指定するポインタである。ポインタprevは、1つ前のノートデータを指定するポインタである。
(5)フレーズデータPhaseの構成
図6は、RAM3のデータエリアに設けられるフレーズデータの構成を示す図である。フレーズデータPhaseは、鍵操作する動作の切れ目として、楽曲データMidiEventの内から休符で区切られる区間を検出し、その区間の開始/終了時刻などを表すデータであり、開始時刻lTime、終了時刻lTerm、フレーズ中の鍵盤座標最大値iPosMax、フレーズ中の鍵盤座標最小値iPosmin、ポインタNoteEv、ポインタnextおよびポインタprevを有する。
なお、ポインタNoteEvは、本フレーズデータに対応するノートデータNoteを指定するポインタである。ポインタnextおよびポインタprevは、それぞれ次のフレーズデータおよび前のフレーズデータを指定するポインタである。
(6)手の状態データHandの構成
図7は、RAM3のワークエリアに設けられる手の状態データの構成を示す図である。手の状態データHandは、鍵操作する手を識別する識別フラグiRL(「0」の場合に右手を表し、「1」の場合に左手を表す)、手の位置座標iPos、鍵盤座標最大値iPosMax、鍵盤座標最小値iPosmin、親指データfig[0]、人差し指データfig[1]、中指データfig[2]、薬指データfig[3]および小指データfig[4]から構成される。
また、各指データfig[0]〜[4]は、状態フラグstatus、前状態フラグstatprev、ポインタeventおよび指の座標iPosを備える。
なお、状態フラグstatusは、「0」の場合に消音状態を表し、「1」の場合に押鍵中を表す。前状態フラグstatprevは、「0」の場合に消音状態を表し、「1」の場合に押鍵中を表す。ポインタeventは、押鍵中のノートデータを指定する。
C.動作
次に、図8〜図17を参照して第1実施形態の動作について説明する。以下では、図3に図示した楽曲データがMIDIインタフェース6を介してRAM3のデータエリアに格納されていることを前提として、メインルーチンの動作を説明する。
(1)メインルーチンの動作
入力部4からCPU1にメイルーチンの実行を指示するイベントが供給されると、CPU1は図8に図示するメインルーチンを実行してステップSA1に進み、時系列データ生成処理を実行する。後述するように、時系列データ生成処理では、楽曲データMidiEventから同時発音する音を検索し、該当する各音を一まとめにして、その発音/消音タイミングや音高関係を表す属性を備える時系列データNoteGroupを生成する一方、時系列データNoteGroupに対応する楽曲データMidiEventを表すノートデータNoteを生成する他、楽曲データMidiEventの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始/終了時刻などを表すフレーズデータPhaseを生成する。
次に、ステップSA2では、音列解析処理を実行する。後述するように、音列解析処理では、隣り合う時系列データNoteGroup間の音高差(最大値差分iDH/最小値差分iDL)およびフラグifigに応じて、音高変化の極大および極小を検出したり、近傍データの最大値/最小値を検出する処理操作を行い、これにて各時系列データNoteGroupの近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、差分変化継続値iTendContおよび差分変化継続ステップiTendを得る他、対応するフレーズデータPhaseの鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを生成する。
続いて、ステップSA3では、運指データ生成処理を実行する。後述するように、運指データ生成処理では、最初に現フレーズ区間で手の移動が必要かどうかを判断し、手の移動が必要な場合には、現時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、最初の手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。
最初の手の位置が決ったら、鍵操作する手の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行い、この割当後は、再び次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断し、手の移動が必要になる場合には、次の時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、次の手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。以後、こうした処理操作を全ての時系列データNoteGroupについて繰り返して本処理を完了させる。
(2)時系列データ生成処理の動作
次に、図9を参照して時系列データ生成処理の動作を詳述する。上述したメインルーチンのステップSA1(図8参照)を介して本処理が実行されると、CPU1は図9に図示するステップSB1に進み、ポインタme、ngr、nTmpおよびphTmpをゼロリセットする。ここで、ポインタmeは、図3に図示した楽曲データMidiEventを指定するポインタである。ポインタngrは、図4に図示した時系列データNoteGroupを指定するポインタである。ポインタnTmpは、図5に図示したノートデータNoteを指定するポインタである。ポインタphTmpは、図6に図示したフレーズデータPhaseを指定するポインタである。
そして、ステップSB2以降では、ポインタmeの歩進に応じて指定される楽曲データMidiEventの属性に基づき時系列データNoteGroup、フレーズデータPhaseおよびノートデータNoteを派生させる。
前述したように、時系列データNoteGroupは、楽曲データMidiEventの内から同時発音する音(和音又は非和声音)を検索し、該当する各音を一まとめにし、その発音/消音タイミングや音高関係を表す属性を備えるデータである。ノートデータNoteは、時系列データNoteGroupとして一まとめにされた同時発音する各音のそれぞれに対応する楽曲データMidiEventを表すデータである。フレーズデータPhaseは、鍵操作する動作の切れ目として、楽曲データMidiEventの内から休符で区切られる区間を検出し、その区間の開始/終了時刻などを表すデータである。
先ず、ステップSB2では、ステップSB14にて歩進されるポインタmeで指定される楽曲データMidiEventが終端ENDに達したか、すなわち楽曲データMidiEventを全て読み出し終えたかどうかを判断する。読み出し終えると、判断結果は「YES」になり、本処理を完了させるが、読み出し終えていなければ、判断結果が「NO」になり、ステップSB3に進む。ステップSB3では、ポインタmeで指定される楽曲データMidiEvent中の発音開始時刻ITime(me.ITime)を、レジスタlTprogにストアする。
続いて、ステップSB4では、ポインタmeで指定される楽曲データMidiEventの各属性に基づき時系列データNoteGroupを形成する。すなわち、ポインタngrが指定する時系列データNoteGroup中のノートデータポインタNoteEv(ngr.NoteEv)に、ポインタnTmpをストアする。また、ポインタngrが指定する時系列データNoteGroup中の発音開始時刻lTime(ngr.lTime)に、レジスタlTprogの値(ポインタmeで指定される楽曲データMidiEvent中の発音開始時刻ITime)をストアする。さらに、ポインタngrが指定する時系列データNoteGroup中の消音時刻lTermに、ポインタmeで指定される楽曲データMidiEvent中の発音開始時刻ITime(me.ITime)とポインタmeで指定される楽曲データMidiEvent中の音長lGate(me.lGate)とを加算した時刻をストアする。
また、このステップSB4では、ポインタngrが指定する時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)に最大値を、鍵盤座標最小値iPosmin(ngr.iPosmin)に最小値をそれぞれストアする。さらに、このステップSB4では、ポインタnTmpが指定するノートデータNote中のポインタpEvent(nTmp.pEvent)に、楽曲データMidiEventを指定するポインタmeをストアする。
なお、ここで言う最大値/最小値とは、同時発音する音が複数存在する場合に、その複数音の内、最も高い音高に対応した鍵盤の座標(最大値)と、最も低い音高に対応した鍵盤の座標(最小値)とを指す。したがって、最初の楽曲データMidiEventが読み出された場合には、ngr.iPosMaxおよびngr.iPosminには、その楽曲データMidiEventの音高Pitchに対応した鍵盤の座標が仮設定される。また、鍵盤座標とは、鍵盤上のC4音の白鍵を原点にして白鍵単位で鍵位置を表す座標である。
続いて、ステップSB5〜SB9では、フレーズデータPhaseを作成する。先ず最初のステップSB5では、レジスタlOffProgにストアされる消音時刻と現音の発音開始時刻ITime(me.ITime)との差分時刻が所定値より大きいか、つまり鍵操作する動作の切れ目となる休符の有無を判断する。
1つ目の楽曲データMidiEventを読み出した時点では、レジスタlOffProgには消音時刻がストアされていないので、このステップSB5の判断結果は「NO」になり、ステップSB10に進む。ステップSB10〜SB14では、後述するように、同時発音する音を一つの時系列データNoteGroupにまとめる処理なので、1つ目の楽曲データMidiEventを読み出した時点では、ステップSB10の判断結果は「NO」になり、ステップSB13に進む。
ステップSB13では、ポインタngrが指定する時系列データNoteGroup中の発音開始時刻lTime(ngr.lTime)を、レジスタlOffProgにストアする。続いて、ステップSB14では、次の楽曲データMidiEventから時系列データNoteGroupを生成するため、現在のポインタmeで指定される楽曲データMidiEvent中のポインタpNext(me.pNext)を、次のポインタmeに更新させた後、上述のステップSB2に処理を戻す。
以後、2つの目の楽曲データMidiEventから楽曲データの終端ENDに至るまで上述したステップSB2〜SB16を繰り返す。そして、その過程で鍵操作する動作の切れ目となる休符が見つかると、上述したステップSB5の判断結果が「YES」となり、ステップSB6に進む。ステップSB6では、レジスタlOffProgを、ポインタphTmpが指定するフレーズデータPhase中の開始時刻lTime(phTmp.lTime)としてストアすると共に、現在のポインタmeで指定される楽曲データMidiEvent中の発音開始時刻ITimeを、ポインタphTmpが指定するフレーズデータPhase中の終了時刻lTerm(phTmp.lTerm)としてストアする。
続いて、ステップSB7では、フレーズデータ空き位置を表すポインタ値をポインタphNewにセットする。次いで、ステップSB8では、このポインタphNewを、ポインタphTmpが指定するフレーズデータPhase中のポインタnext(phTmp.next)としてストアすると共に、ポインタphTmpを、ポインタphNewで指定されるフレーズデータPhase中のポインタprevとしてストアする。このように、鍵操作する動作の切れ目となる休符が検出される毎に、その検出された休符で区切られる区間の開始/終了時刻を表すフレーズデータPhaseが生成されるようになっている。
こうして、フレーズデータPhaseを生成し終えると、CPU1はステップSB10に処理を進める。上述したように、ステップSB10〜SB14では、同時発音する音を一つの時系列データNoteGroupにまとめる処理を実行する。
すなわち、ステップSB10では、現在指定されている楽曲データMidiEvent中の発音開始時刻ITime(レジスタlTProgの内容)と次の楽曲データMidiEvent中の発音開始時刻ITime(me.next.lTime)との差分絶対値が所定値より小さいか否か、つまり同時発音する音(和音又は非和声音)であるかどうかを判断する。同時発音する音でなければ、判断結果は「NO」になり、前述のステップSB15に処理を進めるが、同時発音する音であると、判断結果が「YES」になり、ステップSB11に進む。
ステップSB11では、ポインタmeが指定する楽曲データMidiEvent中のポインタpNext(me.pNext)を、ポインタmeHarmにセットし、ノートデータNoteの空き位置を表すポインタ値をポインタnHarmにセットする。次いで、ステップSB12では、同時発音する音を検出したのに伴い、ポインタngrが指定する時系列データNoteGroup中の消音時刻lTerm(ngr.lTerm)、鍵盤座標最大値iPosMax(ngr.iPosMax)、鍵盤座標最小値iPosmin(ngr.iPosmin)を更新する。また、ステップSB12では、ポインタnHarmを、ポインタnTmpが指定するノートデータNote中のポインタnextとしてストアすると共に、ポインタnTmpを、ポインタnHarmが指定するノートデータNote中のポインタprevとしてストアする。
このように、時系列データ生成処理では、ポインタmeの歩進に応じて順次読み出される楽曲データMidiEventの内から同時発音する複数音(和音および非和声音)を検索し、該当する複数音を一まとめにし、その発音/消音タイミングや音高関係を表す属性を備える時系列データNoteGroupと、この時系列データNoteGroupに対応する楽曲データMidiEventを表すノートデータNoteとを生成すると共に、楽曲データMidiEventの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始/終了時刻などを表すフレーズデータPhaseを生成する。
(3)音列解析処理の動作
次に、図10を参照して音列解析処理の動作について説明する。上述したメインルーチンのステップSA2(図8参照)を介して本処理が実行されると、CPU1は図10に図示するステップSC1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmp、フレーズデータPhaseを指定するポインタphTmpおよび検索データ数iTendCntをゼロリセットする。次いで、ステップSC2では、先頭の時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)および鍵盤座標最小値iPosmin(ngr.iPosmin)を、それぞれレジスタiMax,iminにストアする。
続いて、ステップSC3では、ポインタngrで指定される時系列データNoteGroupが「NULL」であるか否か、つまり音列解析が完了したかどうかを判断する。音列解析が完了すると、判断結果は「NO」になり、本処理を完了させるが、そうでなければ、判断結果が「YES」となり、ステップSC4に進む。
ステップSC4では、1つ前の時系列データNoteGroupの有無を判断する。ポインタngrで指定される時系列データNoteGroupが先頭の場合には、1つ前の時系列データNoteGroupは存在しないから、判断結果は「NO」になり、後述のステップSC6に進む。一方、1つ前の時系列データNoteGroupが存在する場合には、判断結果が「YES」になり、ステップSC5に進む。
ステップSC5では、現在指定されている時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)と、1つ前の時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.prev.iPosMax)との差分をレジスタiDHにストアする。以下、レジスタiDHを最大値差分iDHと称す。また、ステップSC5では、現在指定されている時系列データNoteGroup中の鍵盤座標最小値iPosmin(ngr.iPosmin)と、1つ前の時系列データNoteGroup中の鍵盤座標最小値iPosmin(ngr.prev.iPosmin)との差分をレジスタiDLにストアする。以下、レジスタiDLを最小値差分iDLと称す。さらに、ステップSC5では、レジスタiDHおよびレジスタiDLの値に応じて、鍵盤座標値が現在上昇しているか下降しているかを表すフラグifigを設定する。なお、フラグifigは、「1」の場合に上昇を表し、「0」の場合に下降を表す。
そして、ステップSC6〜SC9では、レジスタiMax,iminの内容を更新する。最初のパスでは、先頭の時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)がレジスタiMaxに、先頭の時系列データNoteGroup中の鍵盤座標最小値iPosmin(ngr.iPosmin)がレジスタiminにそれぞれストアされているので、更新されることはないが、次回以降のパスでは、レジスタiMaxの値がngr.iPosMaxより小さければ、ngr.iPosMaxをレジスタiMaxに更新登録する(ステップSC6〜SC7)。また、レジスタiminの値がngr.iPosminより小さければ、ngr.iPosminをレジスタiminに更新登録する(ステップSC8〜SC9)。
次いで、ステップSC10では、検索データ数iTendCntをインクリメントして歩進させる。続いて、ステップSC11では、最大値差分iDHが0以上であって、かつ最小値差分iDLが0以下であるかどうかを判断する。
最初のパスでは、上記ステップSC5にて最大値差分iDHおよび最小値差分iDLは算出されず「0」なので、判断結果は「YES」になり、ステップSC12に進み、現在指定されている時系列データNoteGroup中の座標差分iTend(ngr.iTend)に「0」をストアした後、ステップSC18に進む。
ステップSC18では、近傍データ処理を実行する。近傍データ処理では、後述するように、現在指定されている時系列データNoteGroup中に、近傍の時系列データNoteGroupの鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを、近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminとしてストアする。
続いて、ステップSC19では、ポインタphTmpで指定されるフレーズデータPhase中の開始時刻lTime(phTmp.lTime)が、次の時系列データNoteGroup中の発音開始時刻lTime(ngr.next.lTime)より前であるか否かを判断する。つまり、次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断する。
次の時系列データNoteGroupが鍵操作する動作の切れ目の前であると、上記ステップSC19の判断結果は「NO」となり、ステップSC21(後述する)に進む。
これに対し、次の時系列データNoteGroupが鍵操作する動作の切れ目の後であると、上記ステップSC19の判断結果が「YES」になり、ステップSC20に進む。
ステップSC20では、レジスタiMaxに格納される鍵盤座標最大値iPosMax、すなわち、現在指定されている時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)を、ポインタphTmpで指定されるフレーズデータPhase中の鍵盤座標最大値iPosMaxにストアする。
また、ステップSC20では、レジスタiminに格納される盤座標最小値iPosmin、すなわち、現在指定されている時系列データNoteGroup中の鍵盤座標最大値iPosmin(ngr.iPosmin)を、ポインタphTmpで指定されるフレーズデータPhase中の鍵盤座標最長値iPosminにストアする。
さらに、ステップSC20では、次のフレーズデータPhaseを指定するようポインタphTmpを歩進させる。そして、ステップSC21に進み、次の時系列データNoteGroupを指定するようポインタngrを歩進させた後、上述のステップSC3に処理を戻す。
さて、ポインタngrの歩進に応じて、前後の時系列データNoteGroupに基づき音高差(最大値差分iDHおよび最小値差分iDL)が得られ、しかも得られた最大値差分iDHが0以上であって、かつ最小値差分iDLが0以下でない場合には、上記ステップSC11の判断結果は「NO」となり、ステップSC13に進む。
ステップSC13〜SC16では、上記ステップSC5にて得られる最大値差分iDH、最小値差分iDLおよびフラグifigに基づき鍵盤座標値変化の極大/極小を判断し、極大の場合には、後述する極大/極小値処理にて鍵盤座標の極大値を検出し、一方、極小の場合には、後述する極大/極小値処理にて鍵盤座標の極小値を検出する。
すなわち、ステップSC13では、フラグifigが「0」より大きく、しかも最大値差分iDHが「0」より小さいか、つまり極大であるかどうかを判断する。極大であると、判断結果は「YES」になり、ステップSC14を介して極大/極小値処理(後述する)を実行して極大値を検出した後、ステップSC17に進む。
一方、極大でない場合には、上記ステップSC13の判断結果が「NO」になり、ステップSC15に進む。ステップSC15では、フラグifigが「0」より小さく、しかも最小値差分iDLが「0」より大きいか、つまり極小であるかどうかを判断する。極小であると、判断結果は「YES」になり、ステップSC15を介して極大/極小値処理(後述する)を実行して極大値を検出した後、ステップSC17に進む。極小でない場合には、判断結果が「NO」になり、ステップSC17に進む。ステップSC17では、最大値差分iDHを、現在指定されている時系列データNoteGroup中の座標差分iTendとしてストアする。この後、上述のステップSC18以降を実行する。
このように、音列解析処理では、隣り合う時系列データNoteGroup同士で互いの鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを大小比較し、より大きい方の鍵盤座標最大値iPosMaxをレジスタiMaxに、より小さい方の鍵盤座標最小値iPosminをレジスタiminに保存する一方、隣り合う時系列データNoteGroup間の音高差(最大値差分iDH/最小値差分iDL)およびフラグifigに応じて、音高変化の極大および極小を検出したり、近傍データの最大値/最小値を検出する。
こうした処理操作によって、各時系列データNoteGroupの近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、差分変化継続値iTendContおよび差分変化継続ステップiTendを得る。
また、レジスタiMaxに格納される鍵盤座標最大値iPosMaxと、レジスタiminに格納される鍵盤座標最小値iPosminとが、対応するフレーズデータPhase中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminとして登録されるようになっている。
(4)極大/極小値処理の動作
次に、図11を参照して極大/極小値処理の動作について説明する。上述した音列解析処理のステップSC14又はステップSC16(図10参照)を介して本処理が実行されると、CPU1は図11に図示するステップSD1に進み、検索ポインタiおよび検出ステップiStepsを共にゼロリセットする。次いで、ステップSD2では、ポインタngrで指定される時系列データNoteGroup中のポインタprev(ngr.prev)を、ポインタngにセットする。これにより、ポインタngは、音列解析処理にて指定された時系列データNoteGroupの1つ前の時系列データNoteGroupを指定することになる。
続いて、ステップSD3では、検索ポインタiが検索データ数iTendCntを超えるまで判断結果は「YES」となり、ステップSD4以降を実行させる。ステップSD4では、ポインタngが指定する時系列データNoteGroupの次の時系列データNoteGroup中の鍵盤座標最大値iPosMax(ng.next.iPosMax)と、ポインタngが指定する時系列データNoteGrou中の鍵盤座標最大値iPosMax(ng.iPosMax)とが不一致であるかどうかを判断する。
双方の鍵盤座標最大値iPosMaxが一致する場合には、判断結果は「NO」となり、後述のステップSD6に処理を進める。一方、不一致の場合には、判断結果が「YES」になり、ステップSD5に進み、検出ステップiStepsをインクリメントして歩進させた後、ステップSD6に進む。ステップSD6では、極大検出の場合には、ポインタngで指定される時系列データNoteGroup中の差分変化継続値iTendCont(ng.iTendCont)に、検索ポインタi+1をストアすると共に、差分変化継続ステップiTendSteps(ng.iTendSteps)に、検出ステップiStepsをストアする。
一方、極小検出の場合には、ポインタngで指定される時系列データNoteGroup中の差分変化継続値iTendCont(ng.iTendCont)に、検索ポインタ−i−1をストアすると共に、差分変化継続ステップiTendSteps(ng.iTendSteps)に、検出ステップiStepsをストアする。
次に、ステップSD7では、ポインタngrで指定される時系列データNoteGroup中のポインタprev(ngr.prev)を、ポインタngにセットする。そして、ステップSD8では、検索ポインタiをインクリメントして歩進させた後、上述のステップSD3に処理を戻す。以後、歩進された検索ポインタiが検索データ数iTendCntを超えるまでステップSD3〜SD8を繰り返す。そして、検索ポインタiが検索データ数iTendCntを超えると、ステップSD3の判断結果が「NO」となり、ステップSD9に進み、検索データ数iTendCntをゼロリセットして本処理を完了させる。
このように、上述の音列解析処理において鍵盤座標の極大値が検出された場合に実行される極大/極小値処理では、その極大値を有する時系列データNoteGroup中の差分変化継続値iTendContに「1」を、差分変化継続ステップiTendStepsに検出ステップiStepsをストアし、以後、検索データ数iTendCnt分後続する各時系列データNoteGroupのそれぞれには、検索ポインタiが加算された値の差分変化継続値iTendContと、検出ステップiStepsに対応する値の差分変化継続ステップiTendとをストアするようになっている。
一方、上述の音列解析処理において鍵盤座標の極小値が検出された場合に実行される極大/極小値処理では、その極小値を有する時系列データNoteGroup中の差分変化継続値iTendContに「−1」を、差分変化継続ステップiTendStepsに検出ステップiStepsをストアし、以後、検索データ数iTendCnt分後続する各時系列データNoteGroupのそれぞれには、検索ポインタiが減算された値の差分変化継続値iTendContと、検出ステップiStepsに対応する値の差分変化継続ステップiTendとをストアするようになっている。
(5)近傍データ処理の動作
次に、図12を参照して近傍データ処理の動作について説明する。上述した音列解析処理のステップSC18(図10参照)を介して本処理が実行されると、CPU1は図12に図示するステップSE1に進み、検索ポインタiをゼロリセットする。次いで、ステップSE2では、検索回数MAXNBRを超えず、かつ近傍データが存在するかどうかを判断する。
なお、ここで言う近傍データとは、音列解析処理にてポインタngrが指定する時系列データNoteGroup以降の時系列データNoteGroupを指す。したがって、ステップSE2では、ポインタngrが指定する時系列データNoteGroup以降で、所定数分の時系列データNoteGroupについて後述の最大値/最小値更新処理を行ったかどうかを判断する。
所定数分の時系列データNoteGroupについて最大値/最小値更新処理をし終えてなければ、判断結果は「YES」となり、ステップSE3〜SE7の最大値/最小値更新処理を所定数分の時系列データNoteGroupについて行う。
すなわち、ステップSE3では、近傍データポインタnLast[i]にて指定される時系列データNoteGroup中の鍵盤座標最大値iPosMax(nLast[i].iPosMax)が、音列解析処理にて指定されている時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)より小さいか否かを判断する。
なお、近傍データポインタnLast[i]とは、検索ポインタiに対応して歩進されるポインタであり、ポインタngrが指定する時系列データNoteGroup以降の、時系列データNoteGroupを指定する。
nLast[i].iPosMaxがngr.iPosMaxより大きいと、判断結果は「NO」になり、ステップSE5に処理を進める。一方、nLast[i].iPosMaxがngr.iPosMaxより小さければ、判断結果が「YES」になり、ステップSE4に進み、近傍データポインタnLast[i]にて指定される時系列データNoteGroup中の近傍データ最大値iNPosMax(nLast[i].iNPosMax)に、音列解析処理にて指定されている時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)をストアしてステップSE5に処理を進める。
次いで、ステップSE5では、近傍データポインタnLast[i]にて指定される時系列データNoteGroup中の鍵盤座標最小値iPosmin(nLast[i].iPosmin)が、音列解析処理にて指定されている時系列データNoteGroup中の鍵盤座標最小値iPosmin(ngr.iPosmin)より大きいか否かを判断する。
nLast[i].iPosminがngr.iPosminより小さいと、判断結果は「NO」になり、ステップSE7に処理を進める。一方、nLast[i].iPosMaxがngr.iPosMaxより大きければ、判断結果が「YES」になり、ステップSE6に進み、近傍データポインタnLast[i]にて指定される時系列データNoteGroup中の近傍データ最小値iNPosmin(nLast[i].iNPosmin)に、音列解析処理にて指定されている時系列データNoteGroup中の鍵盤座標最小値iPosmin(ngr.iPosmin)をストアする。
そして、ステップSE7では、検索ポインタiをインクリメントして歩進させた後、上述のステップSE2に処理を戻す。以後、所定数分の時系列データNoteGroupについて最大値/最小値更新処理をし終える迄、上記ステップSE3〜SE7を繰り返す。これにより、時系列データNoteGroupに、自己以降の近傍の時系列データNoteGroupの鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminが、近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminとして登録される。
(6)運指データ生成処理の動作
次に、図13を参照して運指データ生成処理の動作について説明する。前述したメインルーチンのステップSA3(図8参照)を介して本処理が実行されると、CPU1は図13に図示するステップSF1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmpおよびフレーズデータPhaseを指定するポインタphTmpをゼロリセットする。
続いて、ステップSF2では、ポインタphTmpにて指定されるフレーズデータPhase中の鍵盤座標最大値iPosMax(phTmp.iPosMax)から鍵盤座標最小値iPosmin(phTmp.iPosmin)を減算し、現フレーズ区間における鍵盤座標の最大/最小幅を算出してレジスタpRangeにストアする。以下、レジスタpRangeの内容を最大/最小幅pRangeと称す。
次いで、ステップSF3では、最大/最小幅pRangeが所定値NOMOVEより小さいか否かを判断する。所定値NOMOVEとは、手を移動させずに鍵操作できる幅を表す。したがって、このステップSF3では、現フレーズ区間において手の移動が必要かどうかを判断している。
最大/最小幅pRangeが所定値NOMOVEより大きく、手の移動が必要になる場合には、上記ステップSF3の判断結果が「NO」になり、ステップSF4に進む。ステップSF4では、ポインタngrで指定される時系列データNoteGroup中の近傍データ最大値iNPosMax(ngr.iNPosMax)および近傍データ最小値iNPosmin(ngr.iNPosmin)を、それぞれ手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)として登録した後、ステップSF6に進む。
一方、最大/最小幅pRangeが所定値NOMOVEより小さく、手の移動が不必要の場合には、上記ステップSF3の判断結果が「YES」になり、ステップSF5に進む。ステップSF5では、ポインタphTmpで指定されるフレーズデータPhase中の鍵盤座標最大値iPosMax(phTmp.iPosMax)および鍵盤座標最大値iPosmin(phTmp.iPosmin)を、それぞれ手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)として登録した後、ステップSF6に進む。
ステップSF6では、手の移動処理を実行する。手の移動処理では、後述するように、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。こうして、最初の手の位置が定まると、CPU1は、ポインタngrの歩進に応じて時系列データNoteGroupを全て読み出し終えるまでステップSF7〜SF22を繰り返す。
すなわち、先ずステップSF8では、指の状態確認処理を実行する。指の状態確認処理では、後述するように、押鍵中の指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する。次いで、ステップSF9では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)が、ポインタngrで指定される時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)より小さいか、もしくは手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)が、ポインタngrで指定される時系列データNoteGroup中の鍵盤座標最小値iPosmin(ngr.iPosmin)より大きいか否か、すなわち手の移動が必要かどうかを判断する。
手の移動が必要無い場合には、判断結果は「NO」となり、後述のステップSF12に処理を進めるが、手の移動が必要な場合には、判断結果が「YES」になり、ステップSF10に進む。ステップSF10では、ポインタngrで指定される時系列データNoteGroup中の近傍データ最大値iNPosMax(ngr.iNPosMax)および近傍データ最小値iNPosmin(ngr.iNPosmin)を、それぞれ手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする。
この後、ステップSF11を介して手の移動処理を実行し、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)の更新に対応して新たな手の位置座標iPos(Hand.iPos)となる中指座標Hand.fig[2].iPosを設定する。
次に、ステップSF12では、ポインタngrで指定される時系列データNoteGroup中のノートデータポインタNoteEvを、ポインタnTmpにセットする。次いで、ステップSF13〜SF15では、ポインタnTmpで指定されるノートデータNoteが無くなる迄、ポインタnTmpを歩進させながらステップSF14を介して指の割当て処理を実行する。指の割当て処理では、後述するように、割当てポインタidxで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てする。
こうして運指割当てがなされると、ステップSH16に進み、ポインタphTmpで指定されるフレーズデータPhase中の開始時刻lTime(phTmp.lTime)が、次の時系列データNoteGroup中の発音開始時刻lTime(ngr.next.lTime)より前であるか否かを判断する。つまり、次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断する。
ここで、次の時系列データNoteGroupが鍵操作する動作の切れ目の前であると、判断結果は「NO」となり、ステップSF22に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させた後、前述のステップSF7に処理を戻す。
一方、次の時系列データNoteGroupが鍵操作する動作の切れ目の後であれば、上記ステップSF16の判断結果は「YES」となり、ステップSF17に進む。ステップSF17では、ポインタphTmpにて指定されるフレーズデータPhase中の鍵盤座標最大値iPosMax(phTmp.iPosMax)から鍵盤座標最小値iPosmin(phTmp.iPosmin)を減算し、現フレーズ区間における鍵盤座標の最大/最小幅pRangeを算出する。続いて、ステップSF18では、最大/最小幅pRangeが所定値NOMOVEより小さいか否かを判断する。所定値NOMOVEとは、手を移動させずに鍵操作できる幅を表す。したがって、このステップSF18では、現フレーズ区間において手の移動が必要かどうかを判断している。
最大/最小幅pRangeが所定値NOMOVEより大きく、手の移動が必要になる場合には、上記ステップSF18の判断結果が「NO」になり、ステップSF19に進む。ステップSF19では、次の時系列データNoteGroup中の近傍データ最大値iNPosMax(ngr.next.iNPosMax)および近傍データ最小値iNPosmin(ngr.next.iNPosmin)を、それぞれ手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)として登録した後、ステップSF21に進む。
一方、最大/最小幅pRangeが所定値NOMOVEより小さく、手の移動が不必要の場合には、上記ステップSF18の判断結果が「YES」になり、ステップSF20に進む。ステップSF20では、ポインタphTmpで指定されるフレーズデータPhase中の鍵盤座標最大値iPosMax(phTmp.iPosMax)および鍵盤座標最大値iPosmin(phTmp.iPosmin)を、それぞれ手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)として登録した後、ステップSF21に進む。
ステップSF21では、前述のステップSF6と同様、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する手の移動処理(図14参照)を実行する。この後、ステップSF22に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させた後、前述のステップSF7に処理を戻す。以後、ポインタngrの歩進に応じて時系列データNoteGroupを全て読み出し終えるまでステップSF7〜SF22を繰り返し、全て読み出し終えた時点でステップSF7の判断結果が「NO」となり、本処理を終える。
このように、運指データ生成処理では、最初に現フレーズ区間における鍵盤座標の最大/最小幅pRangeを算出し、これに基づき現フレーズ区間で手の移動が必要かどうかを判断し、手の移動が必要な場合には、現時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、最初の手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。
最初の手の位置が決ったら、押鍵中の指の有無を判断し、該当する指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する指の状態確認処理を実行し、その後に、鍵操作する手の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てする。
運指割当を行った後は、再び次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断する。そして、手の移動が必要になる場合には、次の時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。以後、こうした処理操作を全ての時系列データNoteGroupについて繰り返す。
(7)手の移動処理の動作
次に、図14を参照して手の移動処理の動作について説明する。上述した運指データ生成処理のステップSF6、ステップSF11およびステップSF21を介して本処理が実行されると、CPU1は図14に図示するステップSG1に進み、検索ポインタifigをゼロリセットすると共に、手の状態データHand中の親指座標Hand.fig[0].iPosに、手の状態データHand中の鍵盤座標最小値iPosminをストアする。
続いて、ステップSG2では、手の状態データHand中の識別フラグiRL(Hand.iRL)が「1」、つまり左手の鍵操作であるかどうかを判断する。左手の鍵操作であると、判断結果は「YES」となり、ステップSG3に進み、一方、右手の鍵操作ならば、判断結果が「NO」になり、ステップSG4に進む。
ステップSG3では、手の状態データHand中の親指座標Hand.fig[0].iPosに、手の状態データHand中の鍵盤座標最小値iPosMaxをストアする。このように、右手で鍵操作する場合には、手の状態データHand中の鍵盤座標最小値iPosminを親指の位置に割当て、一方、左手で鍵操作する場合には、手の状態データHand中の鍵盤座標最大値iPosMaxを親指の位置に割当てる。
そして、ステップSG4では、指の位置指定処理を実行する。後述するように、指の位置指定処理では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)から得られる手の幅iRangeと、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]とを勘案して人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを設定する。
こうして、ステップSG4にて人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosが設定されると、ステップSG5に進み、設定された各指の座標の内、中指座標Hand.fig[2].iPosを、手の状態データHand中の手の位置座標iPos(Hand.iPos)としてストアする。
このように、手の移動処理では、右手で鍵操作する場合には、手の状態データHand中の鍵盤座標最小値iPosminを親指の位置に割当て、一方、左手で鍵操作する場合には、手の状態データHand中の鍵盤座標最大値iPosMaxを親指の位置に割当てておき、さらに手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)から得られる手の幅iRangeと、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]とを勘案して人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを設定し、その内の中指座標Hand.fig[2].iPosを手の位置座標iPos(Hand.iPos)に設定するようになっている。
(8)指の状態確認処理の動作
次に、図15を参照して指の状態確認処理の動作について説明する。前述した運指データ生成処理のステップSF8(図13参照)を介して本処理が実行されると、CPU1は図15に図示するステップSH1に進み、検索ポインタiをゼロリセットする。続いて、ステップSH2では、検索ポインタiが「5」より小さいか否か、つまり全ての指について状態確認し終えたかどうかを判断する。状態確認し終えていなければ、判断結果は「YES」になり、ステップSH3に進む。ステップSH3では、手の状態データHand中において検索ポインタiで指定される指の前状態フラグstatprev(Hand.fig[i].statprev)をゼロリセットする。
そして、ステップSH4では、手の状態データHand中において検索ポインタiで指定される指が押鍵中のノートデータevent(Hand.fig[i].event)が「NULL」であるか否か、すなわち、検索ポインタiで指定される指が押鍵中であるかどうかを判断する。押鍵中であると、判断結果は「NO」になり、ステップSH7に進み、検索ポインタiをインクリメントして歩進させた後、上述のステップSH2に処理を戻す。
一方、押鍵中でなければ、判断結果は「YES」となり、次のステップSH5に進む。ステップSH5では、検索ポインタiで指定される指が押鍵中の音の消音時間(Hand.fig[i].event.lTerm)が、ポインタngrで指定される時系列データNoteGroup中の開始時刻lTime(ngr.lTime)より小さいか否か、つまり消音時間を超えているかどうかを判断する。
消音時間を超えていなければ、判断結果は「NO」となり、ステップSH7を介して検索ポインタiを歩進させてからステップSH2に処理を戻す。これに対し、消音時間を超えていると、判断結果が「YES」になり、ステップSH6に進む。ステップSH6では、手の状態データHand中において検索ポインタiで指定される指の状態フラグ(Hand.fig[i].status)に、消音状態を表す「0」をセットすると共に、検索ポインタiで指定される指の前状態フラグstatprev(Hand.fig[i].statprev)に「1」をセットする。さらに、検索ポインタiで指定される指が押鍵中のノートデータevent(Hand.fig[i].event)に「NULL」をセットする。
そして、この後、ステップSH7にて検索ポインタiをインクリメントして歩進させた後、上述のステップSH2に処理を戻す。以後、全ての指について状態確認し終えるまで上記ステップSH2〜SH7を繰り返し、全ての指について状態確認し終えと、ステップSH2の判断結果が「NO」となり、本処理を完了させる。
このように、指の状態確認処理では、押鍵中の指があると、その指で押鍵されている音(ポインタngrで指定される時系列データNoteGroupの音)の消音時刻を超えているか否かを確認し、消音時刻を超えていた時にはその指を消音状態に設定するようになっている。
(9)指の割当処理の動作
次に、図16を参照して指の割当処理の動作について説明する。前述した運指データ生成処理のステップSF14(図13参照)を介して本処理が実行されると、CPU1は図16に図示するステップSJ1に進み、検索ポインタiをゼロリセットする。続いて、ステップSH2では、検索ポインタiが「5」より小さいか否か、つまり全ての指について割り振りし終えたかどうかを判断する。割り振りし終えていなければ、判断結果は「YES」になり、ステップSJ3に進む。
ステップSJ3〜SJ5では、鍵操作する手と割当て方向とに応じて割当てポインタidxを初期設定する。すなわち、鍵操作する手が右手でその小指から親指へ順番に割当てて行く場合あるいは鍵操作する手が左手でその小指から親指へ順番に割当てて行く場合のいずれかであると、ステップSJ4の判断結果が「YES」となり、割当てポインタidxに「4−i」がセットされ(ステップSJ5)、それ以外の場合には割当てポインタidxに「i」がセットされる(ステップSJ3)。
次に、ステップSJ6では、手の状態データHand中において割当てポインタidxで指定される指の座標iPos(Hand.fig[idx].iPos)が、ポインタnTmpで指定されるノートデータNote中の鍵盤座標iPos(nTmp.iPos)以下であって、かつ手の状態データHand中において割当てポインタidxで指定される指の状態フラグstatus(Hand.fig[idx].status)が「0」、すなわち消音状態であるかどうかを判断する。
こうした判定条件に合致しなければ、判断結果は「NO」となり、ステップSJ7に進み、検索ポインタiを歩進させた後、上述のステップSJ2に処理を戻す。
一方、割当てポインタidxで指定される指の位置が弾くべき鍵の座標以下であって、しかもその指が押鍵されていなければ、上記ステップSJ6の判断結果は「YES」になり、ステップSJ8に進み、ポインタnTmpを、手の状態データHand中において割当てポインタidxで指定される指のノートデータevent(Hand.fig[idx].event)としてストアする。
次いで、ステップSJ9では、ポインタnTmpで指定されるノートデータNote中の運指番号cfig(nTmp.iPos)に、割当てポインタidxをストアする。これにより、弾くべき指を表す運指番号cfigが決定される。そして、ステップSJ10では、割当てポインタidxをレジスタifigに格納した後、ステップSJ11を介して指の位置指定処理(図17参照)を実行した後、本処理を終える。
このように、指の割当処理では、割当てポインタidxで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てするようになっている。
なお、ステップSJ11を介して実行される指の位置指定処理では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)から得られる手の幅iRangeと、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]とを勘案し、指の割当処理において「運指割当てした指」を基準にして人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを再設定するようになっている。
(10)指の位置指定処理の動作
次に、図17を参照して指の位置指定処理の動作について説明する。前述した手の移動処理のステップSG4(図14参照)を介して本処理が実行されると、CPU1は図17に図示するステップSK1に進み、レジスタiCoefに「1」をストアする。次いで、ステップSK2では、手の状態データHand中の識別フラグiRL(Hand.iRL)が「1」、つまり左手の鍵操作であるかどうかを判断する。左手の鍵操作であると、判断結果は「YES」となり、ステップSK3に進み、レジスタiCoefに「−1」をストアする。これに対し、右手の鍵操作であれば、判断結果が「NO」になり、ステップSK4に進む。このように、右手の鍵操作時にはレジスタiCoefに「1」が、左手の鍵操作時にはレジスタiCoefに「−1」がストアされる。
ステップSK4では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)から鍵盤座標最小値iPosmin(Hand.iPosmin)を減算して手の幅を算出し、これをレジスタiRangeにストアする。以下、レジスタiRangeの内容を手の幅iRangeと称す。続いて、ステップSK5〜SK8では、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]で表現される各指間の離間比率に、手の幅iRangeを乗算して、親指を除く人差し指から小指までの各指の仮の座標位置figtmp[1]〜[4]を生成する。
この後、ステップSK9〜SK13では、前述した手の移動処理(図14参照)にて検索ポインタifigに「0」をセットしている為、この検索ポインタifigが指定する親指を除いた人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを、上述のステップSK5〜SK8にて生成された、親指を除く人差し指から小指までの各指の仮の座標位置figtmp[1]〜[4]を用いて算出する。
例えば、人差し指座標Hand.fig[1].iPosを求めるには、既に設定済みの親指座標Hand.fig[0].iPosに、人差し指の仮の座標位置figtmp[1]を加算し、その加算値にレジスタiCoefの値を乗算する。また、中指座標Hand.fig[2].iPosを求めるには、先に得た人差し指座標Hand.fig[1].iPosに、中指の仮の座標位置figtmp[2]を加算し、その加算値にレジスタiCoefの値を乗算する。
こうして、親指を除く人差し指から小指までの各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを生成し終えると、ステップSK10の判断結果が「NO」となり、本処理を終える。
このように、指の位置指定処理では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)から得られる手の幅iRangeを、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]で表現される各指間の離間比率に乗算して、親指を除く人差し指から小指までの各指の仮の座標位置figtmp[1]〜[4]を生成し、これら仮の座標位置figtmp[1]〜[4]を既に設定済みの親指座標Hand.fig[0].iPosに順次加算して人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを設定するようになっている。
以上説明したように、第1実施形態では、楽曲データMidiEventから同時発音する音を検索し、該当する各音を一まとめにして、その発音/消音タイミングや音高関係を表す属性を備える時系列データNoteGroupを生成する一方、時系列データNoteGroupに対応する楽曲データMidiEventを表すノートデータNoteを生成する他、楽曲データMidiEventの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始/終了時刻などを表すフレーズデータPhaseを生成した後、隣り合う時系列データNoteGroup間の音高差(最大値差分iDH/最小値差分iDL)およびフラグifigに応じて、音高変化の極大および極小を検出したり、近傍データの最大値/最小値を検出する処理操作を行い、これにて各時系列データNoteGroupの近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、差分変化継続値iTendContおよび差分変化継続ステップiTendを得る他、対応するフレーズデータPhaseの鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを生成する。
この後、先ず最初に現フレーズ区間で手の移動が必要かどうかを判断し、手の移動が必要な場合には、現時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、最初の手の位置(中指座標Hand.fig[2].iPos)を設定する。そして、最初の手の位置が決ったら、鍵操作する手の各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行う。
運指割当て後は、再び次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断し、手の移動が必要になる場合には、次の時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、次の手の位置(中指座標Hand.fig[2].iPos)を設定する。この結果、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することが可能になる訳である。
D.第1実施形態の変形例
次に、図18を参照して第1実施形態の変形例による「指の割当処理」の動作を説明する。前述した第1実施形態と同様、運指データ生成処理のステップSF14(図13参照)を介して本処理が実行されると、CPU1は図18に図示するステップSL1に進み、検索ポインタiおよびレジスタifigをゼロリセットすると共に、レジスタiIntに最大値をストアする。ここで言う最大値とは、鍵操作可能な指と鍵の離間距離を表す。
次いで、ステップSL2〜SL4では、鍵操作する手が右手か左手かに応じて運指割り付け指の順番を決める。すなわち、最初にフラグiDestに「0」をセットしておき(ステップSL2)、次に手の状態データHand中の識別フラグiRLが「0」、つまり右手の鍵操作であるかどうかを判断する(ステップSL3)。そして、左手の鍵操作であれば、ステップSL3の判断結果は「NO」になり、フラグiDestは「0」のままになる。これに対し、右手の鍵操作であると、ステップSL3の判断結果が「YES」になり、ステップSL4に進み、フラグiDestは「1」となる。
フラグiDestは運指割り付けの方向を表すフラグであり、「0」の場合に右側からの運指割り付けを表し、「1」の場合に左側からの運指割り付けを表す。したがって、鍵操作する手が右手であると、その親指から小指へ順番に運指割り付けする。一方、鍵操作する手が左手であると、その親指から小指へ順番に運指割り付けする。
そして、ステップSL5では、検索ポインタiが「5」より小さいか否か、つまり全ての指について割り振りし終えたかどうかを判断する。割り振りし終えていなければ、判断結果は「YES」になり、ステップSL6に進む。ステップSL6〜SL8では、鍵操作する手と割当ての方向とに応じて割当てポインタidxを初期設定する。
すなわち、鍵操作する手が右手でその小指から親指へ順番に割当てる場合あるいは鍵操作する手が左手でその小指から親指へ順番に割当てる場合のいずれかであると、ステップSL7の判断結果が「YES」となり、割当てポインタidxに「4−i」がセットされ(ステップSL8)、それ以外の場合には割当てポインタidxに「i」がセットされる(ステップSL6)。
次に、ステップSL9では、手の状態データHand中において割当てポインタidxで指定される指の座標iPos(Hand.fig[idx].iPos)とポインタnTmpで指定されるノートデータNote中の鍵盤座標iPos(nTmp.iPos)との差分絶対値(指と鍵の離間距離)を、レジスタiIntTmpにストアする。続いて、ステップSL10では、レジスタiIntTmpに格納された指と鍵の離間距離が、レジスタiIntに格納される最大値(鍵操作可能な指と鍵の離間距離)より小さいか否か、つまり現在指定されている指で鍵操作可能かどうかを判断する。
現在指定されている指で鍵操作可能であると、判断結果は「YES」になり、ステップSL11に進み、現在指定されている指を表す割当てポインタidxを、レジスタifigにストアすると共に、レジスタiIntTmpに格納された指と鍵の離間距離を新たな最大値としてレジスタiIntに更新登録した後、ステップSL12に進む。
一方、現在指定されている指で鍵操作不可能な場合には、上記ステップSL10の判断結果が「YES」になり、ステップSL12に進み、検索ポインタiをインクリメントして歩進させた後、上述のステップSL5に処理を戻す。以後、全ての指について割り振りし終える迄、上述のステップSL5〜SL12を繰り返す。これにより、鍵との離間距離が最短となる指を表す割当てポインタidxがレジスタifigに格納される一方、ステップSL5の判断結果が「NO」になり、ステップSL13に進む。
ステップSL13では、ポインタnTmpを、手の状態データHand中において割当てポインタidxで指定される指のノートデータevent(Hand.fig[idx].event)としてストアする。次いで、ステップSJ9では、ポインタnTmpで指定されるノートデータNote中の運指番号cfig(nTmp.iPos)に、割当てポインタidxをストアする。これにより、弾くべき指を表す運指番号cfigが決定される。
そして、ステップSL15では、割当てポインタidxをレジスタifigに格納した後、ステップSL16を介して指の位置指定処理(図17参照)を実行する。指の位置指定処理では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)から得られる手の幅iRangeと、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]とを勘案し、指の割当処理において「運指割当てした指」を基準にして人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを再設定した後、本処理を終える。
このように、変形例による指の割当処理では、割当てポインタidxで指定される各指の内、押鍵すべき鍵との離間距離が最短となる指を、弾くべき指として運指割当てするようになっている。
[第2実施形態]
次に、図19〜図25を参照して第2実施形態について説明する。第2実施形態の構成は、上述の第1実施形態と共通するので、その説明については省略する。第2実施形態が上述の第1実施形態と相違する点は、曲演奏に必要な手の移動位置を表す動作データ(後述する)を発生し、この動作データで定義される手の位置とそれに応じた指の位置とを勘案して生成された運指データから「弾き難さ」を評価し、その評価された「弾き難さ」が一定以下の指標値となるよう運指データを調整して弾き易い運指データを得る点にある。以下では、こうした第2実施形態に用いられる動作データの構成と、第2実施形態の動作とを説明する。
(1)動作データの構成
図19は、RAM3のデータエリアに設けられる動作データの構成を示す図である。動作データHandPosは、曲演奏に必要な手の移動位置を表すものであり、開始時刻ITime、終了時刻lTerm、鍵盤座標最大値iPosMax、鍵盤座標最小値iPosmin、ポインタnextおよびポインタprevから構成される。なお、ポインタnextおよびポインタprevは、それぞれ次の動作データおよび前の動作データを指定するポインタである。
(2)メインルーチンの動作
次に、図20を参照して第2実施形態によるメインルーチンの動作について説明する。
入力部4からCPU1にメイルーチンの実行を指示するイベントが供給されると、CPU1は図20に図示するメインルーチンを実行してステップSM1に進み、時系列データ生成処理を実行する。時系列データ生成処理は、前述の第1実施形態と同一であり、楽曲データMidiEventから同時発音する音を検索し、該当する各音を一まとめにして、その発音/消音タイミングや音高関係を表す属性を備える時系列データNoteGroupを生成する一方、時系列データNoteGroupに対応する楽曲データMidiEventを表すノートデータNoteを生成する他、楽曲データMidiEventの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始/終了時刻などを表すフレーズデータPhaseを生成する。
次に、ステップSM2では、音列解析処理を実行する。音列解析処理は、前述の第1実施形態と同一であり、隣り合う時系列データNoteGroup間の音高差(最大値差分iDH/最小値差分iDL)およびフラグifigに応じて、音高変化の極大および極小を検出したり、近傍データの最大値/最小値を検出する処理操作を行い、これにて各時系列データNoteGroupの近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、差分変化継続値iTendContおよび差分変化継続ステップiTendを得る他、対応するフレーズデータPhaseの鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを生成する。
続いて、ステップSM3では、後述する運指データ評価を行う回数を計数するカウンタiRetryをゼロリセットしておく。次に、ステップSM4では、動作データ生成処理を実行する。動作データ生成処理では、後述するように、時系列データNoteGroupを参照して曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間を検索し、該当する区間において、時系列データNoteGroupで定義される鍵盤座標最大値iPosMaxと鍵盤座標最小値iPosminとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
次いで、ステップSM5では、運指データ生成処理を実行する。運指データ生成処理では、後述するように、最初に動作データHandPosを参照して手の位置を定め、その手の位置における各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行い、以後、鍵操作する動作の切れ目になる毎に、動作データHandPosを参照して手の位置を定めて運指割当てする。
そして、ステップSM6では、運指データ評価処理を実行する。運指データ評価処理では、後述するように、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算し、「弾き難さ」を表す値をカウンタiCostにストアする。
次に、ステップSM7では、上記ステップSM6にて運指データ評価を行ったノート数でカウンタiCostの値を除算して得る「弾き難さ」の平均値average(iCost)が、許容範囲値ARROWEDCOSTより小さいか、あるいはカウンタiRetryにて計数される評価回数が、再評価回数最大値MAXRETRYより小さいかを判断する。ここで、いずれかの条件に合致すると、判断結果が「YES」となるが、そうでない場合には、判断結果が「NO」となり、ステップSM8に進む。そして、ステップSM8では、カウンタiRetryにて計数される評価回数をインクリメントして歩進させ、続くステップSM9では、手の幅の半値iHandHalfを乱数変化させてから前述のステップSM4に処理を戻し、乱数変化させた手の幅の半値iHandHalfに基づき、曲演奏に必要な手の移動位置を表す動作データHandPosを再生成させる。
以後、再生成された動作データHandPosで定義される手の位置とそれに応じた指の位置とを勘案して運指データを生成し、さらに生成された運指データの「弾き難さ」を評価する。そして、評価回数が再評価回数最大値MAXRETRYが超えるまで、あるいは評価された「弾き難さ」(平均値average(iCost))が許容範囲値ARROWEDCOSTに収まるまで運指データを調整して弾き易い運指データを得る。
(3)動作データ生成処理の動作
次に、図21を参照して動作データ生成処理の動作について説明する。上述したメインルーチンのステップSM4(図20参照)を介して本処理が実行されると、CPU1は図21に図示するステップSN1に進み、時系列データNoteGroupを指定するポインタngrをゼロリセットする。次いで、ステップSN2では、ポインタngrをレジスタngrStにストアする。続いて、ステップSN3では、ポインタngrで指定される時系列データNoteGroupが「NULL」であるか否か、つまり動作データの生成が完了したかどうかを判断する。動作データの生成が完了すると、判断結果は「NO」になり、本処理を完了させるが、そうでなければ、判断結果が「YES」となり、ステップSN4に進む。
ステップSN4では、ポインタngrで指定される現時系列データNoteGroup中の差分変化継続値iTendCont(ngr.iTendCont)と、次の時系列データNoteGroup中の差分変化継続値iTendCont(ngr.next.iTendCont)との積が「0」以下であるか否か、つまり極値であるかどうかを判断する。現時系列データNoteGroup中の差分変化継続値iTendContおよび次の時系列データNoteGroup中の差分変化継続値iTendContの双方が共に同じ極性であれば、極値ではないから、判断結果は「NO」になり、ステップSN8に進み、ポインタngrを歩進させた後、ステップSN3に処理を戻し、再び極値検出を行う。
こうして、現時系列データNoteGroup中の差分変化継続値iTendContと次の時系列データNoteGroup中の差分変化継続値iTendContとの積に基づき極値判定を進めている時に、一方と他方の極性が異なる極値を検出すると、ステップSN4の判断結果が「YES」になり、ステップSN5に進む。
ステップSN5では、現時系列データNoteGroup中の差分変化継続値iTendCont(ngr.iTendCont)を、次の時系列データNoteGroup中の差分変化継続値iTendContの絶対値(abs(ngr.next.iTendCont)で除した値をレジスタiTendにストアする。ここで、レジスタiTendの値が正ならば「極大」を表し、負ならば「極小」を表す。
次に、ステップSN6を介して移動位置の特定処理を実行する。移動位置の特定処理では、後述するように、曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間において、時系列データNoteGroupで定義される鍵盤座標最大値iPosMaxと鍵盤座標最小値iPosminとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
次いで、ステップSN7では、極点から極点までの区間における最適な手の位置を設定し終えたのに対応して、ポインタngrをレジスタngrStにストアし直し、続くステップSN8では、ポインタngrを歩進させた後、上述のステップSN3に処理を戻す。以後、ポインタngrで指定される時系列データNoteGroupが「NULL」に達するまでステップSN3〜SN8を繰り返して動作データの生成を行う。
このように、動作データ生成処理では、時系列データNoteGroupを参照して曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間を検索し、該当する区間において、時系列データNoteGroupで定義される鍵盤座標最大値iPosMaxと鍵盤座標最小値iPosminとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
(4)移動位置の特定処理の動作
次に、図22を参照して移動位置の特定処理の動作について説明する。上述した動作データ生成処理のステップSN6(図21参照)を介して本処理が実行されると、CPU1は図22に図示するステップSO1に進む。ステップSO1では、手の状態データHand中の識別フラグiRL(Hand.iRL)が「0」であって、かつレジスタiTendの値が正であるか、あるいは手の状態データHand中の識別フラグiRL(Hand.iRL)が「1」であって、かつレジスタiTendの値が負であるかを判断する。つまり、「右手の鍵操作による極大位置」もしくは「左手の鍵操作による極小位置」であるかどうかを判断する。
「右手の鍵操作による極大位置」もしくは「左手の鍵操作による極小位置」であると、判断結果は「YES」になり、ステップSO2に進み、検索フラグidestに「0」をセットする。なお、検索フラグidestは、検索方向を表すフラグであり、「0」の場合に前方検索を表し、「1」の場合に後方検索を表す。また、ステップSO2では、レジスタngrStの値を検索ポインタngrprogにセットすると共に、ポインタngrをレジスタngrtermにストアする。
一方、「右手の鍵操作による極小位置」もしくは「左手の鍵操作による極大位置」の場合には、上記ステップSO1の判断結果が「NO」になり、ステップSO3に進み、後方検索を表すフラグ値「1」を検索フラグidesにセットすると共に、ポインタngrを検索ポインタngrprogにセットし、さらにレジスタngrStの値をレジスタngrtermにストアする。
次いで、ステップSO4では、検索ポインタngrprogを、レジスタngrslsにストアする。次に、ステップSO5では、検索ポインタngrprogで指定される時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngrprog.iPosMax)および鍵盤座標最小値iPosmin(ngrprog.iPosmin)を、レジスタiPosMax、iPosminにそれぞれストアする。また、ステップSO5では、鍵盤座標平均値((ngrprog.iPosMax+ngrprog.iPosmin)/2)と演奏者の手の幅の半値iHandHalfとを加算した初期許容最大幅iRngMaxおよび鍵盤座標平均値((ngrprog.iPosMax+ngrprog.iPosmin)/2)から演奏者の手の幅の半値iHandHalfを減算した初期許容最小幅iRngminを算出する。
次に、ステップSO6では、検索ポインタngrprogの値がレジスタngrtermに一致していないか否か、つまり極点から極点までの区間内で移動位置を特定し終えたかどうかを判断する。移動位置を特定し終えた場合には、判断結果が「NO」となり、本処理を終えるが、そうでなければ、判断結果は「YES」になり、ステップSO7に進む。
ステップSO7〜SO9では、検索フラグidestの値に応じて、検索ポインタngrprogをインクリメント(前方検索時)あるいはデクリメント(後方検索時)する。次いで、ステップSO10では、前方検索(あるいは後方検索)すべく更新された検索ポインタngrprogで指定される時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngrprog.iPosMax)および鍵盤座標最小値iPosmin(ngrprog.iPosmin)を、レジスタitmpPosMax、itmpPosminにそれぞれストアする一方、鍵盤座標平均値((ngrprog.iPosMax+ngrprog.iPosmin)/2)に、演奏者の手の幅の半値iHandHalfを加算した許容最大幅itmpRngMaxと、鍵盤座標平均値((ngrprog.iPosMax+ngrprog.iPosmin)/2)から演奏者の手の幅の半値iHandHalfを減算した許容最小幅itmpRngminとを算出する。
次に、ステップSO11では、初期許容最大幅iRngMaxおよび許容最大幅itmpRngMaxの内で小さい方の値が、レジスタiPosMaxに格納される鍵盤座標最大値iPosMaxより大きいか、あるいは初期許容最小幅iRngminおよび許容最小幅itmpRngminの内で大きい方の値が、レジスタiPosminに格納される鍵盤座標最小値iPosminより小さいかを判断する。つまり、手の移動が必要かどうかを判断する。手の移動が不必要ならば、判断結果は「NO」になり、ステップSO15に進み、レジスタiPosMax、iPosmin、初期許容最大幅iRngMaxおよび初期許容最小幅iRngminを更新する。
すなわち、ステップSO15では、レジスタiPosMaxおよび許容最大幅itmpRngMaxの内で値が大きい方を、レジスタiPosMaxにストアする。また、レジスタiPosminおよび許容最小幅itmpRngminの内で値が小さい方を、レジスタiPosminにストアする。さらに、初期許容最大幅iRngMaxおよび許容最大幅itmpRngMaxの内で値が小さい方を、初期許容最大幅iRngMaxとして登録すると共に、初期許容最小幅iRngminおよび許容最小幅itmpRngminの内で値が大きい方を初期許容最小幅iRngminとして登録する。この後、上述のステップSO6に処理を戻し、極点から極点までの区間内で移動位置を特定し終えたかどうかを再び判断する。
一方、手の移動が必要の場合には、上記ステップSO11の判断結果が「YES」になり、ステップSO12に進み、現在特定されている手の位置を表す動作データHandPosを登録する動作データ挿入処理を実行する。次いで、ステップSO13では、検索ポインタngrprogを、レジスタngrslsにストアする。そして、ステップSO14では、レジスタitmpPosMaxの値をレジスタiPosMaxに、レジスタitmpPosminの値をレジスタiPosminに、許容最大幅itmpRngMaxを初期許容最大幅iRngMaxに、許容最小幅itmpRngminを初期許容最小幅iRngminに、それぞれ更新登録する。この後、上述のステップSO6に処理を戻し、極点から極点までの区間内で移動位置を特定し終えたかどうかを再び判断する。
このように、移動位置の特定処理では、曲の音高変化が「極大から極小」あるいは「極小から極大」に変化する極点から極点までの区間において、時系列データNoteGroupで定義される鍵盤座標最大値iPosMaxと鍵盤座標最小値iPosminとで定まる鍵操作範囲に、演奏者の手の幅で決る鍵操作許容範囲が収まるように最適な手の位置を設定し、その手の移動位置を表す動作データを発生する。
(5)動作データ挿入処理の動作
次に、図23を参照して動作データ挿入処理の動作について説明する。上述した移動位置の特定処理におけるステップSO12(図22参照)を介して本処理が実行されると、CPU1は図23に図示するステップSP1に進み、動作データHandPos(図19参照)の空き位置をポインタhpInsに設定する。続いて、ステップSP2では、ポインタhpInsで指定される動作データHandPos中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminとして、レジスタiPosMax、iPosminの各値をストアする。そして、ステップSP3では、検索フラグidestが「0」、つまり前方検索中であるか否かを判断する。
前方検索中であると、判断結果は「YES」になり、ステップSP4に進み、レジスタngrslsに格納されるポインタ(極点の始りを指定するポインタngr)が指定する時系列データNoteGroup中の発音開始時刻ITime(ngrsls.lTime)を、ポインタhpInsで指定される動作データHandPos中の開始時刻ITimeとして登録し、さらに、検索ポインタngrprogが指定する時系列データの1つ前の時系列データNoteGroup中の発音開始時刻ITime(ngrprog.prev.lTime)を、ポインタhpInsで指定される動作データHandPos中の終了時刻ITermとして登録する。
一方、後方検索中であれば、上記ステップSP3の判断結果が「NO」になり、ステップSP5に進み、検索ポインタngrprogが指定する時系列データの次の時系列データNoteGroup中の発音開始時刻ITime(ngrprog.next.lTime)を、ポインタhpInsで指定される動作データHandPos中の開始時刻ITimeとして登録し、さらにレジスタngrslsに格納されるポインタ(極点の始りを指定するポインタngr)が指定する時系列データNoteGroup中の発音開始時刻ITime(ngrsls.lTime)を、ポインタhpInsで指定される動作データHandPos中の終了時刻ITermとして登録する。
次いで、ステップSP6〜SP9では、検索ポインタhpTmpに、最初の動作データHandPosを指定するポインタ値をセットした後、ポインタhpIns−1に達するまで検索ポインタhpTmpを歩進させる。そして、検索ポインタhpTmpがポインタhpInsの1つ前に達すると、ステップSP8の判断結果が「YES」になり、ステップSP9に進み、検索ポインタhpTmpで指定される動作データHandPos中のポインタnext(hpTmp.next)に、新たに挿入した動作データを指定するポインタhpInsをストアする一方、ポインタhpInsで指定される動作データHandPos中のポインタprev(hpIns.prev)に、検索ポインタhpTmpをストアして本処理を終える。
(6)運指データ生成処理の動作
次に、図24を参照して運指データ生成処理の動作について説明する。上述したメインルーチンのステップSM5(図20参照)を介して本処理が実行されると、CPU1は図24に図示するステップSQ1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmpおよび動作データHandPosを指定するポインタhpTmpをゼロリセットする。
続いて、ステップSQ2では、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最大値iPosMax(hpTmp.iPosMax)を、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)にストアすると共に、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最小値iPosmin(hpTmp.iPosmin)を、手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする
次いで、ステップSQ3を介して図14に図示する手の移動処理を実行する。前述したように、手の移動処理では、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。こうして、最初の手の位置が定まると、ステップSQ4に進み、ポインタhpTmpを歩進させる。そして、ステップSQ5〜SQ15では、ポインタngrの歩進に応じて指の状態確認処理を行う一方、動作データHandPosを参照して手の位置を移動させつつ、ノートデータNoteに基づき運指割当てを行う。
すなわち、先ずステップSQ5では、ポインタngrで指定される時系列データNoteGroupが「NULL」、すなわち運指データを生成し終えたかどうかを判断する。運指データを生成し終える迄、ここでの判断結果は「YES」となり、ステップSQ5〜SQ15を繰り返す。
次に、ステップSQ6では、図15に図示する指の状態確認処理を実行する。前述したように、指の状態確認処理では、押鍵中の指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する。そして、ステップSQ7に進み、ポインタngrで指定される時系列データNoteGroup中のノートデータポインタNoteEvを、ポインタnTmpにセットする。
次いで、ステップSQ8〜SQ10では、ポインタnTmpで指定されるノートデータNoteが無くなる迄、ポインタnTmpを歩進させながらステップSQ9を介して図16に図示する「指の割当処理」を実行する。前述したように、指の割当処理では、割当てポインタidxで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てする。
こうして、運指割当てがなされると、ステップSQ11に進み、ポインタhpTmpで指定される動作データHandPos中の開始時刻lTime(hpTmp.lTime)が、次の時系列データNoteGroup中の発音開始時刻lTime(ngr.next.lTime)より前であるか否かを判断する。つまり、次の時系列データNoteGroupが、鍵操作する動作の切れ目の前か後かを判断する。
ここで、次の時系列データNoteGroupが、鍵操作する動作の切れ目の前であると、判断結果は「NO」となり、ステップSQ15に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させた後、前述のステップSQ5に処理を戻す。
一方、次の時系列データNoteGroupが、鍵操作する動作の切れ目の後であれば、上記ステップSQ11の判断結果は「YES」となり、ステップSQ12に進む。ステップSQ12では、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最大値iPosMax(hpTmp.iPosMax)を、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)にストアすると共に、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最小値iPosmin(hpTmp.iPosmin)を、手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする。
この後、ステップSQ13に進み、ポインタhpTmpを歩進させ、続くステップSQ14では、前述のステップSQ3と同様、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する手の移動処理(図14参照)を実行する。そして、ステップSQ15に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させてから前述のステップSQ5に処理を戻す。
このように、運指データ生成処理では、最初に動作データHandPosを参照して手の位置を定めてから、割当てポインタidxで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てを行い、以後、鍵操作する動作の切れ目になる毎に、動作データHandPosを参照して手の位置を定めて運指割当てして行くようになっている。
(7)運指データ評価処理の動作
次に、図25を参照して運指データ評価処理の動作について説明する。上述したメインルーチンのステップSM6(図20参照)を介して本処理が実行されると、CPU1は図25に図示するステップSR1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmpおよび動作データHandPosを指定するポインタhpTmpをゼロリセットする。
続いて、ステップSR2では、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算するカウンタiCostをゼロリセットする。なお、カウンタiCostの値は、後述するように、運指データに対する「弾き難さ」を表す。つまり、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算した値(差分累算値)が小さければ、指の移動量が少なく弾き易い運指となり、一方、差分累算値が大きいと、指の移動量が多く弾き難い運指となる。
次いで、ステップSR3では、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最大値iPosMax(hpTmp.iPosMax)を、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)にストアすると共に、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最小値iPosmin(hpTmp.iPosmin)を、手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする。この後、ステップSR4を介して図14に図示する手の移動処理を実行し、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。こうして、最初の手の位置が定まると、ステップSR5に進み、ポインタhpTmpを歩進させる。
そして、ステップSR6では、ポインタngrで指定される時系列データNoteGroupが「NULL」、すなわち運指データを評価し終えたかどうかを判断する。運指データを評価し終える迄、ここでの判断結果は「YES」となり、後述するステップSR7〜SR16を繰り返す。
ステップSR7では、ポインタngrで指定される時系列データNoteGroup中のノートデータポインタNoteEvを、ポインタnTmpにセットする。続いて、ステップSR8〜SR11では、ポインタnTmpが「NULL」に達するまで歩進させ、歩進されるポインタnTmpで指定されるノートデータNote中の運指番号cfig(運指データ)をレジスタifigにストアし、レジスタifigにストアされた運指番号cfigに対応した手の状態データHand中の指座標iPos(Hand.fig[ifig].iPos)とポインタnTmpで指定されるノートデータNote中の鍵盤座標iPos(nTmp.iPos)との絶対差分を累算してカウンタiCostにストアする。
こうして、全ての運指データに基づき「弾き難さ」を表す値(差分累算値)がカウンタiCostにストアされると、ステップSR8の判断結果が「NO」になり、ステップSR12に進む。ステップSR12では、ポインタhpTmpで指定される動作データHandPos中の開始時刻lTime(hpTmp.lTime)が、次の時系列データNoteGroup中の発音開始時刻lTime(ngr.next.lTime)より前であるか否かを判断する。つまり、次の時系列データNoteGroupが、鍵操作する動作の切れ目の前か後かを判断する。
ここで、次の時系列データNoteGroupが、鍵操作する動作の切れ目の前であると、判断結果は「NO」となり、ステップSR16に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させた後、前述のステップSR6に処理を戻す。
一方、次の時系列データNoteGroupが、鍵操作する動作の切れ目の後であれば、上記ステップSR12の判断結果は「YES」となり、ステップSR13に進む。ステップSR13では、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最大値iPosMax(hpTmp.iPosMax)を、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)にストアすると共に、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最小値iPosmin(hpTmp.iPosmin)を、手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする。
この後、ステップSR14に進み、ポインタhpTmpを歩進させ、続くステップSR15では、前述のステップSR4と同様、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する手の移動処理(図14参照)を実行する。そして、ステップSR16に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させてから前述のステップSR6に処理を戻す。
このように、運指データ評価処理では、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算し、「弾き難さ」を表す値をカウンタiCostにストアするようになっている。
以上説明したように、第2実施形態では、曲演奏に必要な手の移動位置を表す動作データを生成した後、生成された動作データHandPosで定義される手の位置とそれに応じた指の位置とを勘案して運指データを生成し、さらに生成された運指データの「弾き難さ」を評価する。そして、評価回数が再評価回数最大値MAXRETRYが超えるまで、あるいは評価された「弾き難さ」(平均値average(iCost))が許容範囲値ARROWEDCOSTに収まるまで乱数変化させた手の幅の半値iHandHalfに基づき動作データHandPosを再生成し、それに応じた運指データ生成および評価を繰り返して弾き易い運指データを得るようにしたので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる。
なお、第2実施形態では、動作データHandPosを参照して手の位置を定め、その手の位置における各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てするようにしたが、これに替えて、前述した第1実施形態の変形例を適用し、動作データHandPosを参照して手の位置を定め、その手の位置における各指の内、押鍵すべき鍵との離間距離が最短となる指を、弾くべき指として運指割当てする態様としても構わない。
本発明による第1実施形態の構成を示すブロック図である。 RAM3のワークエリアに設けられるオンバッファデータの構成を示す図である。 RAM3のデータエリアに設けられる楽曲データの構成を示す図である。 RAM3のデータエリアに設けられる時系列データの構成を示す図である。 RAM3のデータエリアに設けられるノートデータの構成を示す図である。 RAM3のデータエリアに設けられるフレーズデータの構成を示す図である。 RAM3のワークエリアに設けられる手の状態データの構成を示す図である。 第1実施形態によるメインルーチンの動作を示すフローチャートである。 第1実施形態による時系列データ生成処理の動作を説明するためのフローチャートである。 第1実施形態による音列解析処理の動作を説明するためのフローチャートである。 第1実施形態による極大/極小値処理の動作を説明するためのフローチャートである。 第1実施形態による近傍データ処理の動作を説明するためのフローチャートである。 第1実施形態による運指データ生成処理の動作を説明するためのフローチャートである。 第1実施形態による手の移動処理の動作を説明するためのフローチャートである。 第1実施形態による指の状態確認処理の動作を説明するためのフローチャートである。 第1実施形態による指の割当処理の動作を説明するためのフローチャートである。 第1実施形態による指の位置指定処理の動作を説明するためのフローチャートである。 第1実施形態の変形例による指の割当処理の動作を説明するためのフローチャートである。 RAM3のワークエリアに設けられる動作データの構成を示す図である。 第2実施形態によるメインルーチンの動作を説明するためのフローチャートである。 第2実施形態による動作データ生成処理の動作を説明するためのフローチャートである。 第2実施形態による移動位置の特定処理の動作を説明するためのフローチャートである。 第2実施形態による動作データ挿入処理の動作を説明するためのフローチャートである。 第2実施形態による運指データ生成処理の動作を説明するためのフローチャートである。 第2実施形態による運指データ評価処理の動作を説明するためのフローチャートである。
符号の説明
1 CPU
2 ROM
3 RAM
4 入力部
5 表示部
6 MIDIインタフェース
7 電子楽器

Claims (2)

  1. 音高及び当該音高の鍵位置を有する音データを複数有する楽曲データから当該楽曲を演奏する際の鍵操作の切れ目を検出して、検出した切れ目で前記楽曲データを区切ることにより複数のフレーズデータに分割する楽曲分割手段と、
    前記楽曲分割手段により分割されたフレーズデータで指定される区間毎に、その区間に含まれる音データが有する音高の鍵位置のうち最も高い音高の鍵位置と最も低い音高の鍵位置を設定する操作範囲設定手段と、
    この操作範囲設定手段にて前記区間毎に設定された最も高い音高の鍵位置と最も低い音高の鍵位置と所定の手の幅の半値とに基づき、演奏すべき手の位置を鍵位置で前記区間順に設定することにより、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
    前記楽曲分割手段により分割されたフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てるとともに当該割り当てられた指の位置を決める運指データを生成する運指データ生成手段と、
    この運指データ生成手段により前記楽曲データに含まれる音高全てに対応する運指データが生成された後、当該楽曲データに含まれる音高毎に、当該音高の鍵位置と、前記運指データにより当該各音高に割り当てられた指の位置との差分を求めるとともに、当該差分を累算する運指評価手段と、
    この運指評価手段により得られた累算差分値が予め設定された値以上の場合に前記手の幅の半値を変更して前記動作データ生成手段に供給して、再度累算差分値を求めるように、前記動作データ生成手段、運指データ生成手段及び運指評価手段を制御する制御手段と、
    を具備することを特徴とする運指情報生成装置。
  2. 音高及び当該音高の鍵位置を有する音データを複数有する楽曲データから当該楽曲を演奏する際の鍵操作の切れ目を検出して、検出した切れ目で前記楽曲データを区切ることにより複数のフレーズデータに分割する楽曲分割処理と、
    前記分割されたフレーズデータで指定される区間毎に、その区間に含まれる音データが有する音高の鍵位置のうち最も高い音高の鍵位置と最も低い音高の鍵位置を設定する操作範囲設定処理と、
    この区間毎に設定された最も高い音高の鍵位置と最も低い音高の鍵位置と所定の手の幅の半値とに基づき、演奏すべき手の位置を鍵位置で前記区間順に設定することにより、前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
    前記分割されたフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てるとともに当該割り当てられた指の位置を決める運指データを生成する運指データ生成処理と、
    前記楽曲データに含まれる音高全てに対応する運指データが生成された後、当該楽曲データに含まれる音高毎に、当該音高の鍵位置と前記運指データにより当該各音高に割り当てられた指の位置との差分を求めるとともに、当該差分を累算する運指評価処理と、
    この累算差分値が予め設定された値以上の場合に前記手の幅の半値を変更して再度累算差分値を求めるように、前記動作データ生成処理、運指データ生成処理及び運指評価処理を制御する制御処理と、
    をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
JP2007177851A 2007-07-06 2007-07-06 運指情報生成装置および運指情報生成処理プログラム Expired - Fee Related JP4508218B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007177851A JP4508218B2 (ja) 2007-07-06 2007-07-06 運指情報生成装置および運指情報生成処理プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007177851A JP4508218B2 (ja) 2007-07-06 2007-07-06 運指情報生成装置および運指情報生成処理プログラム

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2004342776A Division JP4482880B2 (ja) 2004-11-26 2004-11-26 運指情報生成装置および運指情報生成処理プログラム

Publications (2)

Publication Number Publication Date
JP2007304617A JP2007304617A (ja) 2007-11-22
JP4508218B2 true JP4508218B2 (ja) 2010-07-21

Family

ID=38838525

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007177851A Expired - Fee Related JP4508218B2 (ja) 2007-07-06 2007-07-06 運指情報生成装置および運指情報生成処理プログラム

Country Status (1)

Country Link
JP (1) JP4508218B2 (ja)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000322059A (ja) * 1999-03-08 2000-11-24 Yamaha Corp 運指情報生成方法、装置及び記録媒体
JP2001331173A (ja) * 2000-03-14 2001-11-30 Casio Comput Co Ltd 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2526954B2 (ja) * 1987-12-30 1996-08-21 カシオ計算機株式会社 自動運指付け装置
JP2969861B2 (ja) * 1990-08-10 1999-11-02 ヤマハ株式会社 楽音形成装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000322059A (ja) * 1999-03-08 2000-11-24 Yamaha Corp 運指情報生成方法、装置及び記録媒体
JP2001331173A (ja) * 2000-03-14 2001-11-30 Casio Comput Co Ltd 運指情報生成装置、運指情報生成方法、及び運指情報生成プログラムを記憶した記憶媒体

Also Published As

Publication number Publication date
JP2007304617A (ja) 2007-11-22

Similar Documents

Publication Publication Date Title
EP0632427B1 (en) Method and apparatus for inputting musical data
JP5360510B2 (ja) 演奏評価装置およびプログラム
JP6402878B2 (ja) 演奏装置、演奏方法およびプログラム
Baba et al. " VirtualPhilharmony": A Conducting System with Heuristics of Conducting an Orchestra.
JP4742288B2 (ja) 練習手順生成装置および練習手順生成処理プログラム
JP4482880B2 (ja) 運指情報生成装置および運指情報生成処理プログラム
JP4508218B2 (ja) 運指情報生成装置および運指情報生成処理プログラム
JP4189605B2 (ja) 運指情報生成装置および運指情報生成処理プログラム
JP4301126B2 (ja) 運指情報生成装置、及びプログラム
JP4301125B2 (ja) 運指情報生成装置、及びプログラム
JP5557087B2 (ja) 自動伴奏装置およびプログラム
JP4259532B2 (ja) 演奏制御装置、およびプログラム
JP4748395B2 (ja) 楽曲構造分析装置および楽曲構造分析処理プログラム
JPH1069215A (ja) 演奏練習装置及びプログラムを記録した媒体
JP4482889B2 (ja) 運指情報生成装置および運指情報生成処理プログラム
JP6252826B2 (ja) 演奏練習装置、楽譜表示装置、電子楽器、演奏練習方法、楽譜表示方法およびプログラム
JP2011138153A (ja) 楽曲構造分析装置および楽曲構造分析処理プログラム
JP2008151966A (ja) 楽譜表示装置および楽譜表示処理プログラム
JP3567548B2 (ja) 演奏情報編集装置
JP2005049628A (ja) 音楽教習装置および音楽教習プログラム
JP4614131B2 (ja) 波形発生装置および波形発生プログラム
JP2006085090A (ja) 楽曲構造解析装置、及びプログラム
JP4543832B2 (ja) 運指情報修正装置および運指情報修正処理プログラム
JP5029770B2 (ja) 演奏支援情報生成装置および演奏支援情報生成プログラム
JP4816930B2 (ja) 演奏支援情報生成装置および演奏支援情報生成プログラム

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20091119

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100119

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100225

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: 20100413

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: 20100426

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

Free format text: PAYMENT UNTIL: 20130514

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Ref document number: 4508218

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

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

Free format text: PAYMENT UNTIL: 20130514

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees