JP4189605B2 - 運指情報生成装置および運指情報生成処理プログラム - Google Patents
運指情報生成装置および運指情報生成処理プログラム Download PDFInfo
- Publication number
- JP4189605B2 JP4189605B2 JP2007177852A JP2007177852A JP4189605B2 JP 4189605 B2 JP4189605 B2 JP 4189605B2 JP 2007177852 A JP2007177852 A JP 2007177852A JP 2007177852 A JP2007177852 A JP 2007177852A JP 4189605 B2 JP4189605 B2 JP 4189605B2
- Authority
- JP
- Japan
- Prior art keywords
- data
- hand
- fingering
- finger
- pointer
- 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
Links
Images
Landscapes
- Electrophonic Musical Instruments (AREA)
Description
そこで本発明は、このような事情に鑑みてなされたもので、曲進行に応じて移動する手の位置を考慮しつつ、弾き易い指使いの運指情報を生成することができる運指情報生成装置および運指情報生成処理プログラムを提供することを目的としている。
[第1実施形態]
A.構成
図1は、第1実施形態による運指情報生成装置の全体構成を示すブロック図である。運指情報生成装置は、CPU1、ROM2、RAM3、入力部4、表示部5およびMIDIインタフェース6を備える。CPU1は、後述する入力部4からの指示に従い、例えばMIDIインタフェース6を介して電子楽器7よりSMF形式の「楽曲データ」を取込んでRAM3に記憶させた後、時系列データ生成処理および音列解析処理を実行し、「楽曲データ」から「時系列データ」および「フレーズデータ」を派生させる。また、CPU1は運指データ生成処理を実行して「時系列データ」および「フレーズデータ」を参照して、曲進行に応じて移動する手の位置を考慮した、弾き易い指使いの「運指データ」を生成する。これら一連のデータの構成およびそれらが意図するところについては追って詳述する。
次に、RAM3に格納される各種データ(オンバッファデータ、楽曲データ、時系列データ、ノートデータ、フレーズデータおよび手の状態データ)の構成について図2〜図7を参照して説明する。
図2は、RAM3のワークエリアに設けられるオンバッファデータOnBuf[0]〜[N]の構成を示す図である。1つのオンバッファデータOnBufは、楽曲データを再生(自動演奏)する際に、曲進行に応じて読み出される各音を表すデータであり、発音開始時間lTime、消音時間lOffTime、音高Pitch(ノート番号)、および対応する楽曲データを指定するポインタpNoteから構成される。
図3は、RAM3のデータエリアに設けられる楽曲データの構成を示す図である。楽曲データMidiEventは曲を構成する各音を表し、曲終端にはENDデータを備える。楽曲データMidiEventは、発音開始時刻ITime、音長lGate、音高Pitchおよび次の楽曲データMidiEventを指定するポインタpNextから構成される。
図4は、RAM3のデータエリアに設けられる時系列データの構成を示す図である。時系列データNoteGroupとは、楽曲データMidiEventの内から同時発音する音(和音あるいは非和声音)を検索し、該当する音を一まとめにしたデータである。
時系列データNoteGroupでは、同時発音する音の発音/消音タイミングおよび音高関係を表す属性として、発音開始時刻lTime、消音時刻lTerm、鍵盤座標最大値iPosMax、鍵盤座標最小値iPosmin、座標差分iTend、差分変化継続値iTendCont、差分変化継続ステップiTendStep、近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、ポインタNoteEv、ポインタnextおよびポインタprevを有する。
なお、ポインタNoteEvは、本時系列データNoteGroupに対応するノートデータNoteを指定するポインタである。ポインタnextおよびポインタprevは、それぞれ次の時系列データおよび前の時系列データを指定するポインタである。
図5は、RAM3のデータエリアに設けられるノートデータの構成を示す図である。ノートデータNoteは、時系列データNoteGroupとして一まとめにされた、同時発音する各音のそれぞれに対応する楽曲データMidiEventを表すデータであり、ポインタpEvent、鍵盤座標iPos、運指番号cfig(運指データに相当)、ポインタnextおよびポインタprevから構成される。
なお、ポインタpEventは、対応する楽曲データMidiEventを指定するポインタである。ポインタnextは、次のノートデータを指定するポインタである。ポインタprevは、1つ前のノートデータを指定するポインタである。
図6は、RAM3のデータエリアに設けられるフレーズデータの構成を示す図である。フレーズデータPhaseは、鍵操作する動作の切れ目として、楽曲データMidiEventの内から休符で区切られる区間を検出し、その区間の開始/終了時刻などを表すデータであり、開始時刻lTime、終了時刻lTerm、フレーズ中の鍵盤座標最大値iPosMax、フレーズ中の鍵盤座標最小値iPosmin、ポインタNoteEv、ポインタnextおよびポインタprevを有する。
なお、ポインタNoteEvは、本フレーズデータに対応するノートデータNoteを指定するポインタである。ポインタnextおよびポインタprevは、それぞれ次のフレーズデータおよび前のフレーズデータを指定するポインタである。
図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は、押鍵中のノートデータを指定する。
次に、図8〜図17を参照して第1実施形態の動作について説明する。以下では、図3に図示した楽曲データがMIDIインタフェース6を介してRAM3のデータエリアに格納されていることを前提として、メインルーチンの動作を説明する。
入力部4からCPU1にメイルーチンの実行を指示するイベントが供給されると、CPU1は図8に図示するメインルーチンを実行してステップSA1に進み、時系列データ生成処理を実行する。後述するように、時系列データ生成処理では、楽曲データMidiEventから同時発音する音を検索し、該当する各音を一まとめにして、その発音/消音タイミングや音高関係を表す属性を備える時系列データNoteGroupを生成する一方、時系列データNoteGroupに対応する楽曲データMidiEventを表すノートデータNoteを生成する他、楽曲データMidiEventの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始/終了時刻などを表すフレーズデータPhaseを生成する。
次に、図9を参照して時系列データ生成処理の動作を詳述する。上述したメインルーチンのステップSA1(図8参照)を介して本処理が実行されると、CPU1は図9に図示するステップSB1に進み、ポインタme、ngr、nTmpおよびphTmpをゼロリセットする。ここで、ポインタmeは、図3に図示した楽曲データMidiEventを指定するポインタである。ポインタngrは、図4に図示した時系列データNoteGroupを指定するポインタである。ポインタnTmpは、図5に図示したノートデータNoteを指定するポインタである。ポインタphTmpは、図6に図示したフレーズデータPhaseを指定するポインタである。
前述したように、時系列データNoteGroupは、楽曲データMidiEventの内から同時発音する音(和音又は非和声音)を検索し、該当する各音を一まとめにし、その発音/消音タイミングや音高関係を表す属性を備えるデータである。ノートデータNoteは、時系列データNoteGroupとして一まとめにされた同時発音する各音のそれぞれに対応する楽曲データMidiEventを表すデータである。フレーズデータPhaseは、鍵操作する動作の切れ目として、楽曲データMidiEventの内から休符で区切られる区間を検出し、その区間の開始/終了時刻などを表すデータである。
1つ目の楽曲データMidiEventを読み出した時点では、レジスタlOffProgには消音時刻がストアされていないので、このステップSB5の判断結果は「NO」になり、ステップSB10に進む。ステップSB10〜SB14では、後述するように、同時発音する音を一つの時系列データNoteGroupにまとめる処理なので、1つ目の楽曲データMidiEventを読み出した時点では、ステップSB10の判断結果は「NO」になり、ステップSB13に進む。
すなわち、ステップSB10では、現在指定されている楽曲データMidiEvent中の発音開始時刻ITime(レジスタlTProgの内容)と次の楽曲データMidiEvent中の発音開始時刻ITime(me.next.lTime)との差分絶対値が所定値より小さいか否か、つまり同時発音する音(和音又は非和声音)であるかどうかを判断する。同時発音する音でなければ、判断結果は「NO」になり、前述のステップSB15に処理を進めるが、同時発音する音であると、判断結果が「YES」になり、ステップSB11に進む。
次に、図10を参照して音列解析処理の動作について説明する。上述したメインルーチンのステップSA2(図8参照)を介して本処理が実行されると、CPU1は図10に図示するステップSC1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmp、フレーズデータPhaseを指定するポインタphTmpおよび検索データ数iTendCntをゼロリセットする。次いで、ステップSC2では、先頭の時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)および鍵盤座標最小値iPosmin(ngr.iPosmin)を、それぞれレジスタiMax,iminにストアする。
ステップSC4では、1つ前の時系列データNoteGroupの有無を判断する。ポインタngrで指定される時系列データNoteGroupが先頭の場合には、1つ前の時系列データNoteGroupは存在しないから、判断結果は「NO」になり、後述のステップSC6に進む。一方、1つ前の時系列データNoteGroupが存在する場合には、判断結果が「YES」になり、ステップSC5に進む。
最初のパスでは、上記ステップSC5にて最大値差分iDHおよび最小値差分iDLは算出されず「0」なので、判断結果は「YES」になり、ステップSC12に進み、現在指定されている時系列データNoteGroup中の座標差分iTend(ngr.iTend)に「0」をストアした後、ステップSC18に進む。
続いて、ステップSC19では、ポインタphTmpで指定されるフレーズデータPhase中の開始時刻lTime(phTmp.lTime)が、次の時系列データNoteGroup中の発音開始時刻lTime(ngr.next.lTime)より前であるか否かを判断する。つまり、次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断する。
これに対し、次の時系列データNoteGroupが鍵操作する動作の切れ目の後であると、上記ステップSC19の判断結果が「YES」になり、ステップSC20に進む。
また、ステップSC20では、レジスタiminに格納される盤座標最小値iPosmin、すなわち、現在指定されている時系列データNoteGroup中の鍵盤座標最大値iPosmin(ngr.iPosmin)を、ポインタphTmpで指定されるフレーズデータPhase中の鍵盤座標最長値iPosminにストアする。
さらに、ステップSC20では、次のフレーズデータPhaseを指定するようポインタphTmpを歩進させる。そして、ステップSC21に進み、次の時系列データNoteGroupを指定するようポインタngrを歩進させた後、上述のステップSC3に処理を戻す。
ステップSC13〜SC16では、上記ステップSC5にて得られる最大値差分iDH、最小値差分iDLおよびフラグifigに基づき鍵盤座標値変化の極大/極小を判断し、極大の場合には、後述する極大/極小値処理にて鍵盤座標の極大値を検出し、一方、極小の場合には、後述する極大/極小値処理にて鍵盤座標の極小値を検出する。
一方、極大でない場合には、上記ステップSC13の判断結果が「NO」になり、ステップSC15に進む。ステップSC15では、フラグifigが「0」より小さく、しかも最小値差分iDLが「0」より大きいか、つまり極小であるかどうかを判断する。極小であると、判断結果は「YES」になり、ステップSC15を介して極大/極小値処理(後述する)を実行して極大値を検出した後、ステップSC17に進む。極小でない場合には、判断結果が「NO」になり、ステップSC17に進む。ステップSC17では、最大値差分iDHを、現在指定されている時系列データNoteGroup中の座標差分iTendとしてストアする。この後、上述のステップSC18以降を実行する。
こうした処理操作によって、各時系列データNoteGroupの近傍データ最大値iNPosMax、近傍データ最小値iNPosmin、差分変化継続値iTendContおよび差分変化継続ステップiTendを得る。
また、レジスタiMaxに格納される鍵盤座標最大値iPosMaxと、レジスタiminに格納される鍵盤座標最小値iPosminとが、対応するフレーズデータPhase中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminとして登録されるようになっている。
次に、図11を参照して極大/極小値処理の動作について説明する。上述した音列解析処理のステップSC14又はステップSC16(図10参照)を介して本処理が実行されると、CPU1は図11に図示するステップSD1に進み、検索ポインタiおよび検出ステップiStepsを共にゼロリセットする。次いで、ステップSD2では、ポインタngrで指定される時系列データNoteGroup中のポインタprev(ngr.prev)を、ポインタngにセットする。これにより、ポインタngは、音列解析処理にて指定された時系列データNoteGroupの1つ前の時系列データNoteGroupを指定することになる。
一方、極小検出の場合には、ポインタngで指定される時系列データNoteGroup中の差分変化継続値iTendCont(ng.iTendCont)に、検索ポインタ−i−1をストアすると共に、差分変化継続ステップiTendSteps(ng.iTendSteps)に、検出ステップiStepsをストアする。
一方、上述の音列解析処理において鍵盤座標の極小値が検出された場合に実行される極大/極小値処理では、その極小値を有する時系列データNoteGroup中の差分変化継続値iTendContに「−1」を、差分変化継続ステップiTendStepsに検出ステップiStepsをストアし、以後、検索データ数iTendCnt分後続する各時系列データNoteGroupのそれぞれには、検索ポインタiが減算された値の差分変化継続値iTendContと、検出ステップiStepsに対応する値の差分変化継続ステップiTendとをストアするようになっている。
次に、図12を参照して近傍データ処理の動作について説明する。上述した音列解析処理のステップSC18(図10参照)を介して本処理が実行されると、CPU1は図12に図示するステップSE1に進み、検索ポインタiをゼロリセットする。次いで、ステップSE2では、検索回数MAXNBRを超えず、かつ近傍データが存在するかどうかを判断する。
なお、ここで言う近傍データとは、音列解析処理にてポインタngrが指定する時系列データNoteGroup以降の時系列データNoteGroupを指す。したがって、ステップSE2では、ポインタngrが指定する時系列データNoteGroup以降で、所定数分の時系列データNoteGroupについて後述の最大値/最小値更新処理を行ったかどうかを判断する。
すなわち、ステップSE3では、近傍データポインタnLast[i]にて指定される時系列データNoteGroup中の鍵盤座標最大値iPosMax(nLast[i].iPosMax)が、音列解析処理にて指定されている時系列データNoteGroup中の鍵盤座標最大値iPosMax(ngr.iPosMax)より小さいか否かを判断する。
なお、近傍データポインタnLast[i]とは、検索ポインタiに対応して歩進されるポインタであり、ポインタngrが指定する時系列データNoteGroup以降の、時系列データNoteGroupを指定する。
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)をストアする。
次に、図13を参照して運指データ生成処理の動作について説明する。前述したメインルーチンのステップSA3(図8参照)を介して本処理が実行されると、CPU1は図13に図示するステップSF1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmpおよびフレーズデータPhaseを指定するポインタphTmpをゼロリセットする。
続いて、ステップSF2では、ポインタphTmpにて指定されるフレーズデータPhase中の鍵盤座標最大値iPosMax(phTmp.iPosMax)から鍵盤座標最小値iPosmin(phTmp.iPosmin)を減算し、現フレーズ区間における鍵盤座標の最大/最小幅を算出してレジスタpRangeにストアする。以下、レジスタpRangeの内容を最大/最小幅pRangeと称す。
最大/最小幅pRangeが所定値NOMOVEより大きく、手の移動が必要になる場合には、上記ステップSF3の判断結果が「NO」になり、ステップSF4に進む。ステップSF4では、ポインタngrで指定される時系列データNoteGroup中の近傍データ最大値iNPosMax(ngr.iNPosMax)および近傍データ最小値iNPosmin(ngr.iNPosmin)を、それぞれ手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)として登録した後、ステップSF6に進む。
ステップSF6では、手の移動処理を実行する。手の移動処理では、後述するように、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。こうして、最初の手の位置が定まると、CPU1は、ポインタngrの歩進に応じて時系列データNoteGroupを全て読み出し終えるまでステップSF7〜SF22を繰り返す。
この後、ステップSF11を介して手の移動処理を実行し、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)の更新に対応して新たな手の位置座標iPos(Hand.iPos)となる中指座標Hand.fig[2].iPosを設定する。
ここで、次の時系列データNoteGroupが鍵操作する動作の切れ目の前であると、判断結果は「NO」となり、ステップSF22に進み、次の時系列データNoteGroupを指定するようにポインタngrを歩進させた後、前述のステップSF7に処理を戻す。
運指割当を行った後は、再び次の時系列データNoteGroupが鍵操作する動作の切れ目の前か後かを判断し、鍵操作する動作の切れ目の後であれば、手の移動の必要の有無を判断する。そして、手の移動が必要になる場合には、次の時系列データNoteGroup中の近傍データ最大値iNPosMaxおよび近傍データ最小値iNPosminに基づき、手の状態データHand中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminを更新させてから、手の位置座標iPos(Hand.iPos)として中指座標Hand.fig[2].iPosを設定する。以後、こうした処理操作を全ての時系列データNoteGroupについて繰り返す。
次に、図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に進む。
そして、ステップSG4では、指の位置指定処理を実行する。後述するように、指の位置指定処理では、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)および鍵盤座標最小値iPosmin(Hand.iPosmin)から得られる手の幅iRangeと、親指から小指までの各指の離れ具合を表す定数figtmp[0]〜figtmp[4]とを勘案して人差し指から小指の各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを設定する。
次に、図15を参照して指の状態確認処理の動作について説明する。前述した運指データ生成処理のステップSF8(図13参照)を介して本処理が実行されると、CPU1は図15に図示するステップSH1に進み、検索ポインタiをゼロリセットする。続いて、ステップSH2では、検索ポインタiが「5」より小さいか否か、つまり全ての指について状態確認し終えたかどうかを判断する。状態確認し終えていなければ、判断結果は「YES」になり、ステップSH3に進む。ステップSH3では、手の状態データHand中において検索ポインタiで指定される指の前状態フラグstatprev(Hand.fig[i].statprev)をゼロリセットする。
一方、押鍵中でなければ、判断結果は「YES」となり、次のステップSH5に進む。ステップSH5では、検索ポインタiで指定される指が押鍵中の音の消音時間(Hand.fig[i].event.lTerm)が、ポインタngrで指定される時系列データNoteGroup中の開始時刻lTime(ngr.lTime)より小さいか否か、つまり消音時間を超えているかどうかを判断する。
このように、指の状態確認処理では、押鍵中の指があると、その指で押鍵されている音(ポインタngrで指定される時系列データNoteGroupの音)の消音時刻を超えているか否かを確認し、消音時刻を超えていた時にはその指を消音状態に設定するようになっている。
次に、図16を参照して指の割当処理の動作について説明する。前述した運指データ生成処理のステップSF14(図13参照)を介して本処理が実行されると、CPU1は図16に図示するステップSJ1に進み、検索ポインタiをゼロリセットする。続いて、ステップSH2では、検索ポインタiが「5」より小さいか否か、つまり全ての指について割り振りし終えたかどうかを判断する。割り振りし終えていなければ、判断結果は「YES」になり、ステップSJ3に進む。
次に、ステップSJ6では、手の状態データHand中において割当てポインタidxで指定される指の座標iPos(Hand.fig[idx].iPos)が、ポインタnTmpで指定されるノートデータNote中の鍵盤座標iPos(nTmp.iPos)以下であって、かつ手の状態データHand中において割当てポインタidxで指定される指の状態フラグstatus(Hand.fig[idx].status)が「0」、すなわち消音状態であるかどうかを判断する。
一方、割当てポインタidxで指定される指の位置が弾くべき鍵の座標以下であって、しかもその指が押鍵されていなければ、上記ステップSJ6の判断結果は「YES」になり、ステップSJ8に進み、ポインタnTmpを、手の状態データHand中において割当てポインタidxで指定される指のノートデータevent(Hand.fig[idx].event)としてストアする。
このように、指の割当処理では、割当てポインタidxで指定される各指の内、指位置が弾くべき鍵の座標以下であって、しかも押鍵操作されていない指を、弾くべき指として運指割当てするようになっている。
次に、図17を参照して指の位置指定処理の動作について説明する。前述した手の移動処理のステップSG4(図14参照)を介して本処理が実行されると、CPU1は図17に図示するステップSK1に進み、レジスタiCoefに「1」をストアする。次いで、ステップSK2では、手の状態データHand中の識別フラグiRL(Hand.iRL)が「1」、つまり左手の鍵操作であるかどうかを判断する。左手の鍵操作であると、判断結果は「YES」となり、ステップSK3に進み、レジスタiCoefに「−1」をストアする。これに対し、右手の鍵操作であれば、判断結果が「NO」になり、ステップSK4に進む。このように、右手の鍵操作時にはレジスタiCoefに「1」が、左手の鍵操作時にはレジスタiCoefに「−1」がストアされる。
こうして、親指を除く人差し指から小指までの各指の座標Hand.fig[1].iPos〜Hand.fig[4].iPosを生成し終えると、ステップSK10の判断結果が「NO」となり、本処理を終える。
次に、図18を参照して第1実施形態の変形例による「指の割当処理」の動作を説明する。前述した第1実施形態と同様、運指データ生成処理のステップSF14(図13参照)を介して本処理が実行されると、CPU1は図18に図示するステップSL1に進み、検索ポインタiおよびレジスタifigをゼロリセットすると共に、レジスタiIntに最大値をストアする。ここで言う最大値とは、鍵操作可能な指と鍵の離間距離を表す。
フラグiDestは運指割り付けの方向を表すフラグであり、「0」の場合に右側からの運指割り付けを表し、「1」の場合に左側からの運指割り付けを表す。したがって、鍵操作する手が右手であると、その親指から小指へ順番に運指割り付けする。一方、鍵操作する手が左手であると、その親指から小指へ順番に運指割り付けする。
すなわち、鍵操作する手が右手でその小指から親指へ順番に割当てる場合あるいは鍵操作する手が左手でその小指から親指へ順番に割当てる場合のいずれかであると、ステップSL7の判断結果が「YES」となり、割当てポインタidxに「4−i」がセットされ(ステップSL8)、それ以外の場合には割当てポインタidxに「i」がセットされる(ステップSL6)。
一方、現在指定されている指で鍵操作不可能な場合には、上記ステップSL10の判断結果が「YES」になり、ステップSL12に進み、検索ポインタiをインクリメントして歩進させた後、上述のステップSL5に処理を戻す。以後、全ての指について割り振りし終える迄、上述のステップSL5〜SL12を繰り返す。これにより、鍵との離間距離が最短となる指を表す割当てポインタidxがレジスタifigに格納される一方、ステップSL5の判断結果が「NO」になり、ステップSL13に進む。
このように、変形例による指の割当処理では、割当てポインタidxで指定される各指の内、押鍵すべき鍵との離間距離が最短となる指を、弾くべき指として運指割当てするようになっている。
次に、図19〜図25を参照して第2実施形態について説明する。第2実施形態の構成は、上述の第1実施形態と共通するので、その説明については省略する。第2実施形態が上述の第1実施形態と相違する点は、曲演奏に必要な手の移動位置を表す動作データ(後述する)を発生し、この動作データで定義される手の位置とそれに応じた指の位置とを勘案して生成された運指データから「弾き難さ」を評価し、その評価された「弾き難さ」が一定以下の指標値となるよう運指データを調整して弾き易い運指データを得る点にある。以下では、こうした第2実施形態に用いられる動作データの構成と、第2実施形態の動作とを説明する。
図19は、RAM3のデータエリアに設けられる動作データの構成を示す図である。動作データHandPosは、曲演奏に必要な手の移動位置を表すものであり、開始時刻ITime、終了時刻lTerm、鍵盤座標最大値iPosMax、鍵盤座標最小値iPosmin、ポインタnextおよびポインタprevから構成される。なお、ポインタnextおよびポインタprevは、それぞれ次の動作データおよび前の動作データを指定するポインタである。
次に、図20を参照して第2実施形態によるメインルーチンの動作について説明する。
入力部4からCPU1にメイルーチンの実行を指示するイベントが供給されると、CPU1は図20に図示するメインルーチンを実行してステップSM1に進み、時系列データ生成処理を実行する。時系列データ生成処理は、前述の第1実施形態と同一であり、楽曲データMidiEventから同時発音する音を検索し、該当する各音を一まとめにして、その発音/消音タイミングや音高関係を表す属性を備える時系列データNoteGroupを生成する一方、時系列データNoteGroupに対応する楽曲データMidiEventを表すノートデータNoteを生成する他、楽曲データMidiEventの内から鍵操作する動作の切れ目となる休符で区切られる区間の開始/終了時刻などを表すフレーズデータPhaseを生成する。
そして、ステップSM6では、運指データ評価処理を実行する。運指データ評価処理では、後述するように、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算し、「弾き難さ」を表す値をカウンタiCostにストアする。
次に、図21を参照して動作データ生成処理の動作について説明する。上述したメインルーチンのステップSM4(図20参照)を介して本処理が実行されると、CPU1は図21に図示するステップSN1に進み、時系列データNoteGroupを指定するポインタngrをゼロリセットする。次いで、ステップSN2では、ポインタngrをレジスタngrStにストアする。続いて、ステップSN3では、ポインタngrで指定される時系列データNoteGroupが「NULL」であるか否か、つまり動作データの生成が完了したかどうかを判断する。動作データの生成が完了すると、判断結果は「NO」になり、本処理を完了させるが、そうでなければ、判断結果が「YES」となり、ステップSN4に進む。
ステップSN5では、現時系列データNoteGroup中の差分変化継続値iTendCont(ngr.iTendCont)を、次の時系列データNoteGroup中の差分変化継続値iTendContの絶対値(abs(ngr.next.iTendCont)で除した値をレジスタiTendにストアする。ここで、レジスタiTendの値が正ならば「極大」を表し、負ならば「極小」を表す。
次いで、ステップSN7では、極点から極点までの区間における最適な手の位置を設定し終えたのに対応して、ポインタngrをレジスタngrStにストアし直し、続くステップSN8では、ポインタngrを歩進させた後、上述のステップSN3に処理を戻す。以後、ポインタngrで指定される時系列データNoteGroupが「NULL」に達するまでステップSN3〜SN8を繰り返して動作データの生成を行う。
次に、図22を参照して移動位置の特定処理の動作について説明する。上述した動作データ生成処理のステップSN6(図21参照)を介して本処理が実行されると、CPU1は図22に図示するステップSO1に進む。ステップSO1では、手の状態データHand中の識別フラグiRL(Hand.iRL)が「0」であって、かつレジスタiTendの値が正であるか、あるいは手の状態データHand中の識別フラグiRL(Hand.iRL)が「1」であって、かつレジスタiTendの値が負であるかを判断する。つまり、「右手の鍵操作による極大位置」もしくは「左手の鍵操作による極小位置」であるかどうかを判断する。
一方、「右手の鍵操作による極小位置」もしくは「左手の鍵操作による極大位置」の場合には、上記ステップSO1の判断結果が「NO」になり、ステップSO3に進み、後方検索を表すフラグ値「1」を検索フラグidesにセットすると共に、ポインタngrを検索ポインタngrprogにセットし、さらにレジスタngrStの値をレジスタngrtermにストアする。
次に、図23を参照して動作データ挿入処理の動作について説明する。上述した移動位置の特定処理におけるステップSO12(図22参照)を介して本処理が実行されると、CPU1は図23に図示するステップSP1に進み、動作データHandPos(図19参照)の空き位置をポインタhpInsに設定する。続いて、ステップSP2では、ポインタhpInsで指定される動作データHandPos中の鍵盤座標最大値iPosMaxおよび鍵盤座標最小値iPosminとして、レジスタiPosMax、iPosminの各値をストアする。そして、ステップSP3では、検索フラグidestが「0」、つまり前方検索中であるか否かを判断する。
次に、図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)にストアする
次に、ステップSQ6では、図15に図示する指の状態確認処理を実行する。前述したように、指の状態確認処理では、押鍵中の指がある場合に、その指で押鍵されている音の消音時刻を超えていた時にはその指を消音状態に設定する。そして、ステップSQ7に進み、ポインタngrで指定される時系列データNoteGroup中のノートデータポインタNoteEvを、ポインタnTmpにセットする。
こうして、運指割当てがなされると、ステップSQ11に進み、ポインタhpTmpで指定される動作データHandPos中の開始時刻lTime(hpTmp.lTime)が、次の時系列データNoteGroup中の発音開始時刻lTime(ngr.next.lTime)より前であるか否かを判断する。つまり、次の時系列データNoteGroupが、鍵操作する動作の切れ目の前か後かを判断する。
一方、次の時系列データNoteGroupが、鍵操作する動作の切れ目の後であれば、上記ステップSQ11の判断結果は「YES」となり、ステップSQ12に進む。ステップSQ12では、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最大値iPosMax(hpTmp.iPosMax)を、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)にストアすると共に、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最小値iPosmin(hpTmp.iPosmin)を、手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする。
次に、図25を参照して運指データ評価処理の動作について説明する。上述したメインルーチンのステップSM6(図20参照)を介して本処理が実行されると、CPU1は図25に図示するステップSR1に進み、時系列データNoteGroupを指定するポインタngr、ノートデータNoteを指定するポインタnTmpおよび動作データHandPosを指定するポインタhpTmpをゼロリセットする。
続いて、ステップSR2では、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算するカウンタiCostをゼロリセットする。なお、カウンタiCostの値は、後述するように、運指データに対する「弾き難さ」を表す。つまり、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算した値(差分累算値)が小さければ、指の移動量が少なく弾き易い運指となり、一方、差分累算値が大きいと、指の移動量が多く弾き難い運指となる。
ステップ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にストアする。
一方、次の時系列データNoteGroupが、鍵操作する動作の切れ目の後であれば、上記ステップSR12の判断結果は「YES」となり、ステップSR13に進む。ステップSR13では、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最大値iPosMax(hpTmp.iPosMax)を、手の状態データHand中の鍵盤座標最大値iPosMax(Hand.iPosMax)にストアすると共に、ポインタhpTmpにて指定される動作データHandPos中の鍵盤座標最小値iPosmin(hpTmp.iPosmin)を、手の状態データHand中の鍵盤座標最小値iPosmin(Hand.iPosmin)にストアする。
このように、運指データ評価処理では、弾くべき鍵の座標と運指割当てされた指の座標との差分を累算し、「弾き難さ」を表す値をカウンタiCostにストアするようになっている。
2 ROM
3 RAM
4 入力部
5 表示部
6 MIDIインタフェース
7 電子楽器
Claims (4)
- 曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成手段と、
前記運指データ生成手段により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、
前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化手段と
を具備することを特徴とする運指情報生成装置。 - 曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成手段と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成手段と、
前記フレーズデータ生成手段により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成手段と、
前記運指データ生成手段により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、
前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化手段と
を具備することを特徴とする運指情報生成装置。 - 曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、指位置が弾くべき鍵より低音側に位置し、かつ押鍵操作されていない指を弾くべき指に割当てた運指データを生成する運指データ生成処理と、
前記運指データ生成処理により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価処理と、
前記運指評価処理により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。 - 曲を構成する各音を表す楽曲データから鍵操作する動作の切れ目を検出し、検出した切れ目で区切られる各区間を指定するフレーズデータを生成するフレーズデータ生成処理と、
前記楽曲データから曲演奏する手の位置を表す動作データを生成する動作データ生成処理と、
前記フレーズデータ生成処理により生成されるフレーズデータが指定する各区間毎に、その区間に対応する動作データが表す手の位置で鍵操作する各指の内、弾くべき鍵に最も近い指を弾くべき指に割当てた運指データを生成する運指データ生成処理と、
前記運指データ生成処理により生成された運指データにて指定される指と弾くべき鍵との離間距離に応じて、運指の弾き難さを評価する運指評価手段と、
前記運指評価手段により評価された運指の弾き難さが、予め設定される許容範囲に収まるように、前記動作データを最適化する最適化処理と
をコンピュータで実行させることを特徴とする運指情報生成処理プログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007177852A JP4189605B2 (ja) | 2007-07-06 | 2007-07-06 | 運指情報生成装置および運指情報生成処理プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007177852A JP4189605B2 (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 |
---|---|
JP2007310411A JP2007310411A (ja) | 2007-11-29 |
JP4189605B2 true JP4189605B2 (ja) | 2008-12-03 |
Family
ID=38843242
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007177852A Expired - Fee Related JP4189605B2 (ja) | 2007-07-06 | 2007-07-06 | 運指情報生成装置および運指情報生成処理プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP4189605B2 (ja) |
-
2007
- 2007-07-06 JP JP2007177852A patent/JP4189605B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2007310411A (ja) | 2007-11-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP0632427B1 (en) | Method and apparatus for inputting musical data | |
JP5360510B2 (ja) | 演奏評価装置およびプログラム | |
JP6402878B2 (ja) | 演奏装置、演奏方法およびプログラム | |
JP4742288B2 (ja) | 練習手順生成装置および練習手順生成処理プログラム | |
JP4482880B2 (ja) | 運指情報生成装置および運指情報生成処理プログラム | |
JP4189605B2 (ja) | 運指情報生成装置および運指情報生成処理プログラム | |
JP4508218B2 (ja) | 運指情報生成装置および運指情報生成処理プログラム | |
JP5557087B2 (ja) | 自動伴奏装置およびプログラム | |
JP4301126B2 (ja) | 運指情報生成装置、及びプログラム | |
JP4259532B2 (ja) | 演奏制御装置、およびプログラム | |
JP4301125B2 (ja) | 運指情報生成装置、及びプログラム | |
JP4678365B2 (ja) | 楽譜表示装置および楽譜表示処理プログラム | |
JP2007178695A (ja) | 運指表示装置、及びプログラム | |
JP6252826B2 (ja) | 演奏練習装置、楽譜表示装置、電子楽器、演奏練習方法、楽譜表示方法およびプログラム | |
JP4748395B2 (ja) | 楽曲構造分析装置および楽曲構造分析処理プログラム | |
JP4482889B2 (ja) | 運指情報生成装置および運指情報生成処理プログラム | |
JP2011138153A (ja) | 楽曲構造分析装置および楽曲構造分析処理プログラム | |
JP3567548B2 (ja) | 演奏情報編集装置 | |
JP2005049628A (ja) | 音楽教習装置および音楽教習プログラム | |
JP4816930B2 (ja) | 演奏支援情報生成装置および演奏支援情報生成プログラム | |
JP5029770B2 (ja) | 演奏支援情報生成装置および演奏支援情報生成プログラム | |
JP4543832B2 (ja) | 運指情報修正装置および運指情報修正処理プログラム | |
JP4973983B2 (ja) | 自動演奏装置および自動演奏処理プログラム | |
JP4639983B2 (ja) | 演奏練習装置および演奏練習処理のプログラム | |
JP4547719B2 (ja) | 楽譜表示装置および楽譜表示プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20080806 |
|
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: 20080819 |
|
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: 20080901 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110926 Year of fee payment: 3 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 4189605 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: 20120926 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130926 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |